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"