123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- const util = require('../utils/util');
- const { model: openaiModel } = require('../service/ai/openai.service');
- const { getSystemPrompt } = require('../service/ai/prompt.service');
- const { streamText } = require('ai');
- function formatMessages(messages) {
- return messages.map((message) => ({
- ...message,
- content: Array.isArray(message.content)
- ? message.content.map((content) => ({
- ...content,
- ...(content.type === 'image_url' && {
- type: 'image',
- image: content.image_url.url.replace(/^data:image\/\w+;base64,/, ''),
- }),
- }))
- : message.content,
- }));
- }
- module.exports = {
- async chatStream(ctx) {
- try {
- const { messages } = ctx.request.body;
- const lastMessage = messages[messages.length - 1];
- // 处理最后一条消息
- const lastMessageContent = Array.isArray(lastMessage.content)
- ? lastMessage.content
- .filter((c) => c.type === 'text')
- .map((c) => c.text)
- .join('')
- : lastMessage.content;
- // 获取相关上下文
- // const relevantContent = await findRelevantContent(lastMessageContent);
- const systemPrompt = getSystemPrompt(lastMessageContent);
- const { textStream } = streamText({
- model: openaiModel,
- system: systemPrompt,
- messages: formatMessages(messages),
- });
- ctx.set('Access-Control-Allow-Origin', '*');
- ctx.set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
- ctx.set('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With');
- ctx.status = 200;
- for await (const textPart of textStream) {
- // 返回消息
- ctx.res.write(textPart);
- }
- ctx.res.end();
- util.success(ctx, '对话结束');
- } catch (error) {
- ctx.status = 500;
- console.error('Chat stream error:', error);
- ctx.body = { error: error.message || 'Internal Server Error' };
- }
- },
- };
|