Messages.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { ArrayUtils } from "@imengyu/imengyu-utils";
  2. import { ChatMessage as ChatMessageModel } from "../model/Message";
  3. import { reactive, type Ref } from "vue";
  4. import type OpenAI from "openai";
  5. export function useMessages(messages: Ref<ChatMessageModel[]>) {
  6. function addMessage(message: ChatMessageModel) {
  7. const wrappedMessage = reactive(message);
  8. messages.value.push(wrappedMessage as ChatMessageModel);
  9. return wrappedMessage as ChatMessageModel;
  10. }
  11. function removeMessage(message: ChatMessageModel) {
  12. ArrayUtils.removeAt(messages.value, messages.value.findIndex(m => m.id === message.id));
  13. }
  14. function findMessage(id: number) {
  15. return messages.value.find((m) => m.id === id) as ChatMessageModel | undefined;
  16. }
  17. function updateMessage(id: number, update: (message: ChatMessageModel) => void) {
  18. const message = findMessage(id);
  19. if (message) {
  20. update(message);
  21. } else {
  22. console.warn(`Message with id ${id} not found`);
  23. }
  24. }
  25. function clearMessages() {
  26. messages.value = [];
  27. }
  28. return {
  29. addMessage,
  30. removeMessage,
  31. findMessage,
  32. updateMessage,
  33. clearMessages,
  34. messages,
  35. }
  36. }
  37. export type ChatMessagesManager = ReturnType<typeof useMessages>;
  38. export const LocalMessageIdPool = {
  39. id: 0,
  40. getNextId: () => {
  41. LocalMessageIdPool.id--;
  42. return LocalMessageIdPool.id;
  43. },
  44. }
  45. export function mergeSystemMessages(messages: OpenAI.Chat.ChatCompletionSystemMessageParam[]) {
  46. if (!messages || messages.length === 0) return [];
  47. // 将所有内容合并成一条消息,使用换行分隔
  48. const combinedContent = messages
  49. .map(msg => {
  50. if (typeof msg.content === 'string')
  51. return msg.content?.trim()
  52. return msg.content.map(part => part.text).join('\n\n');
  53. })
  54. .filter(Boolean)
  55. .join('\n\n');
  56. if (!combinedContent)
  57. return [];
  58. return [
  59. {
  60. role: 'system',
  61. content: combinedContent,
  62. } as OpenAI.Chat.ChatCompletionSystemMessageParam
  63. ];
  64. }