ai.controller.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. const util = require('../utils/util');
  2. const { model: openaiModel } = require('../service/ai/openai.service');
  3. const { getSystemPrompt } = require('../service/ai/prompt.service');
  4. const { streamText } = require('ai');
  5. function formatMessages(messages) {
  6. return messages.map((message) => ({
  7. ...message,
  8. content: Array.isArray(message.content)
  9. ? message.content.map((content) => ({
  10. ...content,
  11. ...(content.type === 'image_url' && {
  12. type: 'image',
  13. image: content.image_url.url.replace(/^data:image\/\w+;base64,/, ''),
  14. }),
  15. }))
  16. : message.content,
  17. }));
  18. }
  19. module.exports = {
  20. async chatStream(ctx) {
  21. try {
  22. const { messages } = ctx.request.body;
  23. const lastMessage = messages[messages.length - 1];
  24. // 处理最后一条消息
  25. const lastMessageContent = Array.isArray(lastMessage.content)
  26. ? lastMessage.content
  27. .filter((c) => c.type === 'text')
  28. .map((c) => c.text)
  29. .join('')
  30. : lastMessage.content;
  31. // 获取相关上下文
  32. // const relevantContent = await findRelevantContent(lastMessageContent);
  33. const systemPrompt = getSystemPrompt(lastMessageContent);
  34. const { textStream } = streamText({
  35. model: openaiModel,
  36. system: systemPrompt,
  37. messages: formatMessages(messages),
  38. });
  39. ctx.set('Access-Control-Allow-Origin', '*');
  40. ctx.set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
  41. ctx.set('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With');
  42. ctx.status = 200;
  43. for await (const textPart of textStream) {
  44. // 返回消息
  45. ctx.res.write(textPart);
  46. }
  47. ctx.res.end();
  48. util.success(ctx, '对话结束');
  49. } catch (error) {
  50. ctx.status = 500;
  51. console.error('Chat stream error:', error);
  52. ctx.body = { error: error.message || 'Internal Server Error' };
  53. }
  54. },
  55. };