File size: 1,777 Bytes
e4e0e54
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { ChatCompletionRequestMessage } from "openai"

import { openai } from "./openai.mts"
import { streamCompletion } from "./stream.mts"
import { getTextPrompt } from "./getTextPrompt.mts"

export const createChatCompletionStream = async (
  messages: ChatCompletionRequestMessage[],
  model: string,
  onMessage: (message: string) => Promise<void>,
  onEnd = () => Promise<void>
) => {
  try {
    const rawPrompt = getTextPrompt(messages)

    const tokenLimit = 4096 // 8000

    const maxTokens = Math.round(tokenLimit - rawPrompt.length / 1.9)

    const completion = await openai.createCompletion({
      model,
      prompt: messages,
      temperature: 0.7,
      max_tokens: Math.min(30, maxTokens),
      stream: true,
    })

    for await (const message of streamCompletion(completion as any)) {
      try {
        const parsed = JSON.parse(message)
        const { text } = parsed.choices[0]

        try {
          await onMessage(text)
        } catch (err) {
          console.error(
            'Could not process stream message (callback failed)',
            message,
            err
          )
        }
      } catch (error) {
        console.error('Could not JSON parse stream message', message, error)
      }
    }
    try {
      await onEnd()
    } catch (err) {
      console.error('onEnd callback failed', err)
    }
  } catch (error: any) {
    if (error.code) {
      try {
        const parsed = JSON.parse(error.body)
        console.error('An error occurred during OpenAI request: ', parsed)
      } catch (error) {
        console.error(
          'An error occurred during OpenAI request (invalid json): ',
          error
        )
      }
    } else {
      console.error('An error occurred during OpenAI request', error)
    }
  }
}