cherry-studio/src/renderer/src/services/api.ts
2024-07-03 13:44:05 +08:00

71 lines
2.0 KiB
TypeScript

import { Assistant, Message, Topic } from '@renderer/types'
import { openaiProvider } from './provider'
import { uuid } from '@renderer/utils'
import { EVENT_NAMES, EventEmitter } from './event'
import { ChatCompletionMessageParam, ChatCompletionSystemMessageParam } from 'openai/resources'
interface FetchChatCompletionParams {
message: Message
assistant: Assistant
topic: Topic
onResponse: (message: Message) => void
}
export async function fetchChatCompletion({ message, assistant, topic, onResponse }: FetchChatCompletionParams) {
const stream = await openaiProvider.chat.completions.create({
model: 'Qwen/Qwen2-7B-Instruct',
messages: [
{ role: 'system', content: assistant.prompt },
{ role: 'user', content: message.content }
],
stream: true
})
const _message: Message = {
id: uuid(),
role: 'assistant',
content: '',
assistantId: assistant.id,
topicId: topic.id,
createdAt: 'now'
}
let content = ''
for await (const chunk of stream) {
content = content + (chunk.choices[0]?.delta?.content || '')
onResponse({ ..._message, content })
}
_message.content = content
EventEmitter.emit(EVENT_NAMES.AI_CHAT_COMPLETION, _message)
return _message
}
interface FetchConversationSummaryParams {
messages: Message[]
}
export async function fetchConversationSummary({ messages }: FetchConversationSummaryParams) {
const userMessages: ChatCompletionMessageParam[] = messages.map((message) => ({
role: 'user',
content: message.content
}))
const systemMessage: ChatCompletionSystemMessageParam = {
role: 'system',
content:
'你是一名擅长会话的助理,你需要将用户的会话总结为 10 个字以内的标题,回复内容不需要用引号引起来,不需要在结尾加上句号。'
}
const response = await openaiProvider.chat.completions.create({
model: 'Qwen/Qwen2-7B-Instruct',
messages: [systemMessage, ...userMessages],
stream: false
})
return response.choices[0].message?.content
}