diff --git a/plugins/copilot/package.json b/plugins/copilot/package.json index d408c57908..d9d7e4d68d 100644 --- a/plugins/copilot/package.json +++ b/plugins/copilot/package.json @@ -9,7 +9,7 @@ "dependencies": { "@affine/component": "workspace:*", "@toeverything/plugin-infra": "workspace:*", - "langchain": "^0.0.102", + "langchain": "^0.0.107", "marked": "^5.1.0", "marked-gfm-heading-id": "^3.0.4", "marked-mangle": "^1.1.0" diff --git a/plugins/copilot/src/core/components/conversation-list/index.tsx b/plugins/copilot/src/core/components/conversation-list/index.tsx index c3bbaa1bb7..e882d1add8 100644 --- a/plugins/copilot/src/core/components/conversation-list/index.tsx +++ b/plugins/copilot/src/core/components/conversation-list/index.tsx @@ -1,10 +1,10 @@ -import type { BaseChatMessage } from 'langchain/schema'; +import type { BaseMessage } from 'langchain/schema'; import { Conversation } from '../conversation'; import { conversationListStyle } from './index.css'; export type ConversationListProps = { - conversations: BaseChatMessage[]; + conversations: BaseMessage[]; }; export const ConversationList = (props: ConversationListProps) => { @@ -13,7 +13,7 @@ export const ConversationList = (props: ConversationListProps) => { {props.conversations.map((conversation, idx) => ( ))} diff --git a/plugins/copilot/src/core/hooks/index.ts b/plugins/copilot/src/core/hooks/index.ts index 8a79ef193a..bd2809a3be 100644 --- a/plugins/copilot/src/core/hooks/index.ts +++ b/plugins/copilot/src/core/hooks/index.ts @@ -6,11 +6,9 @@ import type { WritableAtom } from 'jotai/vanilla'; import type { LLMChain } from 'langchain/chains'; import { type ConversationChain } from 'langchain/chains'; import { type BufferMemory } from 'langchain/memory'; -import { - AIChatMessage, - type BaseChatMessage, - HumanChatMessage, -} from 'langchain/schema'; +import type { BaseMessage } from 'langchain/schema'; +import { AIMessage } from 'langchain/schema'; +import { HumanMessage } from 'langchain/schema'; import { z } from 'zod'; import { createChatAI } from '../chat'; @@ -32,18 +30,18 @@ export const chatAtom = atom(async get => { const conversationWeakMap = new WeakMap< ConversationChain, - WritableAtom> + WritableAtom> >(); const getConversationAtom = (chat: ConversationChain) => { if (conversationWeakMap.has(chat)) { return conversationWeakMap.get(chat) as WritableAtom< - BaseChatMessage[], + BaseMessage[], [string], Promise >; } - const conversationBaseAtom = atom([]); + const conversationBaseAtom = atom([]); conversationBaseAtom.onMount = setAtom => { if (!chat) { throw new Error(); @@ -58,12 +56,12 @@ const getConversationAtom = (chat: ConversationChain) => { console.error(err); }); const llmStart = (): void => { - setAtom(conversations => [...conversations, new AIChatMessage('')]); + setAtom(conversations => [...conversations, new AIMessage('')]); }; const llmNewToken = (event: CustomEvent<{ token: string }>): void => { setAtom(conversations => { - const last = conversations[conversations.length - 1] as AIChatMessage; - last.text += event.detail.token; + const last = conversations[conversations.length - 1] as AIMessage; + last.content += event.detail.token; return [...conversations]; }); }; @@ -75,7 +73,7 @@ const getConversationAtom = (chat: ConversationChain) => { }; }; - const conversationAtom = atom>( + const conversationAtom = atom>( get => get(conversationBaseAtom), async (get, set, input) => { if (!chat) { @@ -84,7 +82,7 @@ const getConversationAtom = (chat: ConversationChain) => { // set dirty value set(conversationBaseAtom, [ ...get(conversationBaseAtom), - new HumanChatMessage(input), + new HumanMessage(input), ]); await chat.call({ input, diff --git a/plugins/copilot/src/core/langchain/message-history.ts b/plugins/copilot/src/core/langchain/message-history.ts index f78aebd804..6bbc946b4a 100644 --- a/plugins/copilot/src/core/langchain/message-history.ts +++ b/plugins/copilot/src/core/langchain/message-history.ts @@ -1,13 +1,13 @@ import type { DBSchema, IDBPDatabase } from 'idb'; import { openDB } from 'idb'; import { ChatMessageHistory } from 'langchain/memory'; +import type { BaseMessage } from 'langchain/schema'; import { - AIChatMessage, - type BaseChatMessage, + AIMessage, ChatMessage, - HumanChatMessage, + HumanMessage, type StoredMessage, - SystemChatMessage, + SystemMessage, } from 'langchain/schema'; interface ChatMessageDBV1 extends DBSchema { @@ -40,7 +40,7 @@ export const conversationHistoryDBName = 'affine-copilot-chat'; export class IndexedDBChatMessageHistory extends ChatMessageHistory { public id: string; - private chatMessages: BaseChatMessage[] = []; + private chatMessages: BaseMessage[] = []; private readonly dbPromise: Promise>; private readonly initPromise: Promise; @@ -74,11 +74,11 @@ export class IndexedDBChatMessageHistory extends ChatMessageHistory { this.chatMessages = chat.messages.map(message => { switch (message.type) { case 'ai': - return new AIChatMessage(message.data.content); + return new AIMessage(message.data.content); case 'human': - return new HumanChatMessage(message.data.content); + return new HumanMessage(message.data.content); case 'system': - return new SystemChatMessage(message.data.content); + return new SystemMessage(message.data.content); default: return new ChatMessage( message.data.content, @@ -115,29 +115,29 @@ export class IndexedDBChatMessageHistory extends ChatMessageHistory { return []; } - override async addMessage(message: BaseChatMessage): Promise { + override async addMessage(message: BaseMessage): Promise { await this.initPromise; this.chatMessages.push(message); const db = await this.dbPromise; const objectStore = db.transaction('chat', 'readwrite').objectStore('chat'); const chat = await objectStore.get(this.id); if (chat != null) { - chat.messages.push(message.toJSON()); + chat.messages.push(message.toDict()); await objectStore.put(chat); } else { await objectStore.add({ id: this.id, - messages: [message.toJSON()], + messages: [message.toDict()], }); } } override async addAIChatMessage(message: string): Promise { - await this.addMessage(new AIChatMessage(message)); + await this.addMessage(new AIMessage(message)); } override async addUserMessage(message: string): Promise { - await this.addMessage(new HumanChatMessage(message)); + await this.addMessage(new HumanMessage(message)); } override async clear(): Promise { @@ -148,7 +148,7 @@ export class IndexedDBChatMessageHistory extends ChatMessageHistory { await objectStore.delete(this.id); } - override async getMessages(): Promise { + override async getMessages(): Promise { return this.initPromise.then(() => this.chatMessages); } } diff --git a/yarn.lock b/yarn.lock index f73f289a3e..0eb8c02a66 100644 --- a/yarn.lock +++ b/yarn.lock @@ -157,7 +157,7 @@ __metadata: "@types/react-dom": ^18.2.6 idb: ^7.1.1 jotai: ^2.2.2 - langchain: ^0.0.102 + langchain: ^0.0.107 marked: ^5.1.0 marked-gfm-heading-id: ^3.0.4 marked-mangle: ^1.1.0 @@ -631,13 +631,21 @@ __metadata: languageName: node linkType: hard -"@anthropic-ai/sdk@npm:^0.4.3": - version: 0.4.4 - resolution: "@anthropic-ai/sdk@npm:0.4.4" +"@anthropic-ai/sdk@npm:^0.5.3": + version: 0.5.4 + resolution: "@anthropic-ai/sdk@npm:0.5.4" dependencies: - "@fortaine/fetch-event-source": ^3.0.6 - cross-fetch: ^3.1.5 - checksum: aaa375dbada0120f7d9b684575b263a5462e8beba82cf0c3b2f6de46e7b35ef6e7251c72aefd4a33b2a96ea21c21541fba4e94171807808993bc09beed496455 + "@types/node": ^18.11.18 + "@types/node-fetch": ^2.6.4 + "@types/qs": ^6.9.7 + abort-controller: ^3.0.0 + agentkeepalive: ^4.2.1 + digest-fetch: ^1.3.0 + form-data-encoder: 1.7.2 + formdata-node: ^4.3.2 + node-fetch: ^2.6.7 + qs: ^6.10.3 + checksum: 2baee795eebd852d13368c67f857d039901f362ac740cd97dc748c8170e0aa19ccccefd57356c2c7b134ace2fb22ff7d95a2d43b6957524056f0803a6610fac8 languageName: node linkType: hard @@ -5036,13 +5044,6 @@ __metadata: languageName: node linkType: hard -"@fortaine/fetch-event-source@npm:^3.0.6": - version: 3.0.6 - resolution: "@fortaine/fetch-event-source@npm:3.0.6" - checksum: 6366ad31762170896417684c48536fcf0c27c5f64e090a2de932df55d67c86bdc3c9744e460b19ef1741eab4e4c69797cad1b72f7cf7a981cd17a66c7b0c4418 - languageName: node - linkType: hard - "@graphql-codegen/add@npm:^5.0.0": version: 5.0.0 resolution: "@graphql-codegen/add@npm:5.0.0" @@ -11922,7 +11923,7 @@ __metadata: languageName: node linkType: hard -"@types/qs@npm:*, @types/qs@npm:^6.9.5": +"@types/qs@npm:*, @types/qs@npm:^6.9.5, @types/qs@npm:^6.9.7": version: 6.9.7 resolution: "@types/qs@npm:6.9.7" checksum: 7fd6f9c25053e9b5bb6bc9f9f76c1d89e6c04f7707a7ba0e44cc01f17ef5284adb82f230f542c2d5557d69407c9a40f0f3515e8319afd14e1e16b5543ac6cdba @@ -14028,6 +14029,13 @@ __metadata: languageName: node linkType: hard +"base-64@npm:^0.1.0": + version: 0.1.0 + resolution: "base-64@npm:0.1.0" + checksum: 5a42938f82372ab5392cbacc85a5a78115cbbd9dbef9f7540fa47d78763a3a8bd7d598475f0d92341f66285afd377509851a9bb5c67bbecb89686e9255d5b3eb + languageName: node + linkType: hard + "base16@npm:^1.0.0": version: 1.0.0 resolution: "base16@npm:1.0.0" @@ -14775,6 +14783,13 @@ __metadata: languageName: node linkType: hard +"charenc@npm:0.0.2": + version: 0.0.2 + resolution: "charenc@npm:0.0.2" + checksum: 81dcadbe57e861d527faf6dd3855dc857395a1c4d6781f4847288ab23cffb7b3ee80d57c15bba7252ffe3e5e8019db767757ee7975663ad2ca0939bb8fcaf2e5 + languageName: node + linkType: hard + "check-error@npm:^1.0.2": version: 1.0.2 resolution: "check-error@npm:1.0.2" @@ -15696,6 +15711,13 @@ __metadata: languageName: node linkType: hard +"crypt@npm:0.0.2": + version: 0.0.2 + resolution: "crypt@npm:0.0.2" + checksum: baf4c7bbe05df656ec230018af8cf7dbe8c14b36b98726939cef008d473f6fe7a4fad906cfea4062c93af516f1550a3f43ceb4d6615329612c6511378ed9fe34 + languageName: node + linkType: hard + "crypto-random-string@npm:^2.0.0": version: 2.0.0 resolution: "crypto-random-string@npm:2.0.0" @@ -16442,6 +16464,16 @@ __metadata: languageName: node linkType: hard +"digest-fetch@npm:^1.3.0": + version: 1.3.0 + resolution: "digest-fetch@npm:1.3.0" + dependencies: + base-64: ^0.1.0 + md5: ^2.3.0 + checksum: 8ebdb4b9ef02b1ac0da532d25c7d08388f2552813dfadabfe7c4630e944bb4a48093b997fc926440a10e1ccf4912f2ce9adcf2d6687b0518dab8480e08f22f9d + languageName: node + linkType: hard + "dir-compare@npm:^3.0.0": version: 3.3.0 resolution: "dir-compare@npm:3.3.0" @@ -18686,6 +18718,13 @@ __metadata: languageName: node linkType: hard +"form-data-encoder@npm:1.7.2": + version: 1.7.2 + resolution: "form-data-encoder@npm:1.7.2" + checksum: aeebd87a1cb009e13cbb5e4e4008e6202ed5f6551eb6d9582ba8a062005178907b90f4887899d3c993de879159b6c0c940af8196725b428b4248cec5af3acf5f + languageName: node + linkType: hard + "form-data@npm:^3.0.0": version: 3.0.1 resolution: "form-data@npm:3.0.1" @@ -18715,6 +18754,16 @@ __metadata: languageName: node linkType: hard +"formdata-node@npm:^4.3.2": + version: 4.4.1 + resolution: "formdata-node@npm:4.4.1" + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + checksum: d91d4f667cfed74827fc281594102c0dabddd03c9f8b426fc97123eedbf73f5060ee43205d89284d6854e2fc5827e030cd352ef68b93beda8decc2d72128c576 + languageName: node + linkType: hard + "formdata-polyfill@npm:^4.0.10": version: 4.0.10 resolution: "formdata-polyfill@npm:4.0.10" @@ -20526,6 +20575,13 @@ __metadata: languageName: node linkType: hard +"is-buffer@npm:~1.1.6": + version: 1.1.6 + resolution: "is-buffer@npm:1.1.6" + checksum: 4a186d995d8bbf9153b4bd9ff9fd04ae75068fe695d29025d25e592d9488911eeece84eefbd8fa41b8ddcc0711058a71d4c466dcf6f1f6e1d83830052d8ca707 + languageName: node + linkType: hard + "is-builtin-module@npm:^3.2.1": version: 3.2.1 resolution: "is-builtin-module@npm:3.2.1" @@ -22346,11 +22402,11 @@ __metadata: languageName: node linkType: hard -"langchain@npm:^0.0.102": - version: 0.0.102 - resolution: "langchain@npm:0.0.102" +"langchain@npm:^0.0.107": + version: 0.0.107 + resolution: "langchain@npm:0.0.107" dependencies: - "@anthropic-ai/sdk": ^0.4.3 + "@anthropic-ai/sdk": ^0.5.3 ansi-styles: ^5.0.0 binary-extensions: ^2.2.0 camelcase: 6 @@ -22360,7 +22416,7 @@ __metadata: js-tiktoken: ^1.0.7 js-yaml: ^4.1.0 jsonpointer: ^5.0.1 - langchainplus-sdk: ^0.0.15 + langchainplus-sdk: ^0.0.19 ml-distance: ^4.0.0 object-hash: ^3.0.0 openai: ^3.3.0 @@ -22399,7 +22455,7 @@ __metadata: apify-client: ^2.7.1 axios: "*" cheerio: ^1.0.0-rc.12 - chromadb: ^1.5.2 + chromadb: ^1.5.3 cohere-ai: ^5.0.2 d3-dsv: ^2.0.0 epub2: ^3.0.1 @@ -22420,6 +22476,7 @@ __metadata: puppeteer: ^19.7.2 redis: ^4.6.4 replicate: ^0.9.0 + sonix-speech-recognition: ^2.1.1 srt-parser-2: ^1.2.2 typeorm: ^0.3.12 typesense: ^1.5.3 @@ -22522,6 +22579,8 @@ __metadata: optional: true replicate: optional: true + sonix-speech-recognition: + optional: true srt-parser-2: optional: true typeorm: @@ -22532,13 +22591,13 @@ __metadata: optional: true weaviate-ts-client: optional: true - checksum: f863ff4e8e1e5e0b7fb46772b1a093b96f40b749a4c20382cb5993e240ce376850c04e7d0ef495a17a8e06de7d0bcac8a76bb93546505dbb20902f3da3c95093 + checksum: d1f01321db83aebae5b619ade2060b2416459e1b55723793c0e3244a9ec8fe57775f8c159f406b85eb58b66761a59705e17e9a2efb522876e81e881056711227 languageName: node linkType: hard -"langchainplus-sdk@npm:^0.0.15": - version: 0.0.15 - resolution: "langchainplus-sdk@npm:0.0.15" +"langchainplus-sdk@npm:^0.0.19": + version: 0.0.19 + resolution: "langchainplus-sdk@npm:0.0.19" dependencies: "@types/uuid": ^9.0.1 commander: ^10.0.1 @@ -22547,7 +22606,7 @@ __metadata: uuid: ^9.0.0 bin: langchain: dist/cli/main.cjs - checksum: 7467364922753a44e2e15f6c54fe20c191105e10b42774cb7ebc4bfbeb2c2fa4ee159eaea52637083673f821beb0bfd155918abf8c2f14cf8151dd74b4bac32f + checksum: f0174c1e248e4bc5034a7dd182f703b895a485b6408aa518c91ff12b3f015febd5546eeb7f821c82b63a9d2b67a7ea903a1a57ad196049743f0934ff1c524ae8 languageName: node linkType: hard @@ -23406,6 +23465,17 @@ __metadata: languageName: node linkType: hard +"md5@npm:^2.3.0": + version: 2.3.0 + resolution: "md5@npm:2.3.0" + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: ~1.1.6 + checksum: a63cacf4018dc9dee08c36e6f924a64ced735b37826116c905717c41cebeb41a522f7a526ba6ad578f9c80f02cb365033ccd67fe186ffbcc1a1faeb75daa9b6e + languageName: node + linkType: hard + "mdast-util-definitions@npm:^4.0.0": version: 4.0.0 resolution: "mdast-util-definitions@npm:4.0.0" @@ -24263,7 +24333,7 @@ __metadata: languageName: node linkType: hard -"node-domexception@npm:^1.0.0": +"node-domexception@npm:1.0.0, node-domexception@npm:^1.0.0": version: 1.0.0 resolution: "node-domexception@npm:1.0.0" checksum: ee1d37dd2a4eb26a8a92cd6b64dfc29caec72bff5e1ed9aba80c294f57a31ba4895a60fd48347cf17dd6e766da0ae87d75657dfd1f384ebfa60462c2283f5c7f @@ -26229,7 +26299,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.10.0, qs@npm:^6.11.0": +"qs@npm:^6.10.0, qs@npm:^6.10.3, qs@npm:^6.11.0": version: 6.11.2 resolution: "qs@npm:6.11.2" dependencies: @@ -30736,6 +30806,13 @@ __metadata: languageName: node linkType: hard +"web-streams-polyfill@npm:4.0.0-beta.3": + version: 4.0.0-beta.3 + resolution: "web-streams-polyfill@npm:4.0.0-beta.3" + checksum: dfec1fbf52b9140e4183a941e380487b6c3d5d3838dd1259be81506c1c9f2abfcf5aeb670aeeecfd9dff4271a6d8fef931b193c7bedfb42542a3b05ff36c0d16 + languageName: node + linkType: hard + "web-streams-polyfill@npm:^3.0.3, web-streams-polyfill@npm:^3.2.1": version: 3.2.1 resolution: "web-streams-polyfill@npm:3.2.1"