@cloudbase/agent-adapter-langchain 0.0.2 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +74 -0
- package/dist/index.d.mts +11 -11
- package/dist/index.d.ts +11 -11
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,79 @@
|
|
|
1
1
|
# @cloudbase/agent-adapter-langchain
|
|
2
2
|
|
|
3
|
+
## 0.0.11-alpha.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- alpha release 0.0.10-alpha.2
|
|
8
|
+
- Update all public packages to version 0.0.10-alpha.2
|
|
9
|
+
- Trigger automated alpha release workflow
|
|
10
|
+
- Includes latest features and improvements
|
|
11
|
+
|
|
12
|
+
- Updated dependencies
|
|
13
|
+
- @cloudbase/agent-tools@0.0.11-alpha.3
|
|
14
|
+
- @cloudbase/agent-agents@0.0.11-alpha.3
|
|
15
|
+
- @cloudbase/agent-adapter-langgraph@0.0.11-alpha.3
|
|
16
|
+
|
|
17
|
+
## 0.0.11-alpha.2
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- alpha release 0.0.10-alpha.2
|
|
22
|
+
- Update all public packages to version 0.0.10-alpha.2
|
|
23
|
+
- Trigger automated alpha release workflow
|
|
24
|
+
- Includes latest features and improvements
|
|
25
|
+
|
|
26
|
+
- Updated dependencies
|
|
27
|
+
- @cloudbase/agent-tools@0.0.11-alpha.2
|
|
28
|
+
- @cloudbase/agent-agents@0.0.11-alpha.2
|
|
29
|
+
- @cloudbase/agent-adapter-langgraph@0.0.11-alpha.2
|
|
30
|
+
|
|
31
|
+
## 0.0.11-alpha.1
|
|
32
|
+
|
|
33
|
+
### Patch Changes
|
|
34
|
+
|
|
35
|
+
- alpha release 0.0.10-alpha.2
|
|
36
|
+
- Update all public packages to version 0.0.10-alpha.2
|
|
37
|
+
- Trigger automated alpha release workflow
|
|
38
|
+
- Includes latest features and improvements
|
|
39
|
+
|
|
40
|
+
- Updated dependencies
|
|
41
|
+
- @cloudbase/agent-tools@0.0.11-alpha.1
|
|
42
|
+
- @cloudbase/agent-agents@0.0.11-alpha.1
|
|
43
|
+
- @cloudbase/agent-adapter-langgraph@0.0.11-alpha.1
|
|
44
|
+
|
|
45
|
+
## 0.0.11-alpha.0
|
|
46
|
+
|
|
47
|
+
### Patch Changes
|
|
48
|
+
|
|
49
|
+
- 97b2740: alpha release 0.0.10-alpha.2
|
|
50
|
+
- Update all public packages to version 0.0.10-alpha.2
|
|
51
|
+
- Trigger automated alpha release workflow
|
|
52
|
+
- Includes latest features and improvements
|
|
53
|
+
|
|
54
|
+
- fd4c62a: alpha release 0.0.10-alpha.2
|
|
55
|
+
- Update all public packages to version 0.0.10-alpha.2
|
|
56
|
+
- Trigger automated alpha release workflow
|
|
57
|
+
- Includes latest features and improvements
|
|
58
|
+
|
|
59
|
+
- da3388c: alpha release 0.0.10-alpha.2
|
|
60
|
+
- Update all public packages to version 0.0.10-alpha.2
|
|
61
|
+
- Trigger automated alpha release workflow
|
|
62
|
+
- Includes latest features and improvements
|
|
63
|
+
|
|
64
|
+
- alpha release 0.0.10-alpha.2
|
|
65
|
+
- Update all public packages to version 0.0.10-alpha.2
|
|
66
|
+
- Trigger automated alpha release workflow
|
|
67
|
+
- Includes latest features and improvements
|
|
68
|
+
|
|
69
|
+
- Updated dependencies [97b2740]
|
|
70
|
+
- Updated dependencies [fd4c62a]
|
|
71
|
+
- Updated dependencies [da3388c]
|
|
72
|
+
- Updated dependencies
|
|
73
|
+
- @cloudbase/agent-tools@0.0.11-alpha.0
|
|
74
|
+
- @cloudbase/agent-agents@0.0.11-alpha.0
|
|
75
|
+
- @cloudbase/agent-adapter-langgraph@0.0.11-alpha.0
|
|
76
|
+
|
|
3
77
|
## 0.0.10
|
|
4
78
|
|
|
5
79
|
### Patch Changes
|
package/dist/index.d.mts
CHANGED
|
@@ -6,7 +6,7 @@ import * as langchain from 'langchain';
|
|
|
6
6
|
import { createAgent } from 'langchain';
|
|
7
7
|
import { StructuredTool } from '@langchain/core/tools';
|
|
8
8
|
import { z } from 'zod/v3';
|
|
9
|
-
import { AgentConfig } from '@
|
|
9
|
+
import { AgentConfig } from '@ag-ui/client';
|
|
10
10
|
import { LanggraphAgent } from '@cloudbase/agent-adapter-langgraph';
|
|
11
11
|
import { BaseListChatMessageHistory } from '@langchain/core/chat_history';
|
|
12
12
|
import { BaseMessage } from '@langchain/core/messages';
|
|
@@ -148,9 +148,9 @@ declare class LangchainAgent extends LanggraphAgent {
|
|
|
148
148
|
agent: ReturnType<typeof createAgent>;
|
|
149
149
|
});
|
|
150
150
|
}
|
|
151
|
-
declare function
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
declare function clientTools(): langchain.AgentMiddleware<z.ZodObject<{
|
|
152
|
+
client: z.ZodObject<{
|
|
153
|
+
tools: z.ZodArray<z.ZodObject<{
|
|
154
154
|
name: z.ZodString;
|
|
155
155
|
description: z.ZodString;
|
|
156
156
|
schema: z.ZodAny;
|
|
@@ -164,29 +164,29 @@ declare function agKitClientTools(): langchain.AgentMiddleware<z.ZodObject<{
|
|
|
164
164
|
schema?: any;
|
|
165
165
|
}>, "many">;
|
|
166
166
|
}, "strip", z.ZodTypeAny, {
|
|
167
|
-
|
|
167
|
+
tools: {
|
|
168
168
|
name: string;
|
|
169
169
|
description: string;
|
|
170
170
|
schema?: any;
|
|
171
171
|
}[];
|
|
172
172
|
}, {
|
|
173
|
-
|
|
173
|
+
tools: {
|
|
174
174
|
name: string;
|
|
175
175
|
description: string;
|
|
176
176
|
schema?: any;
|
|
177
177
|
}[];
|
|
178
178
|
}>;
|
|
179
179
|
}, "strip", z.ZodTypeAny, {
|
|
180
|
-
|
|
181
|
-
|
|
180
|
+
client: {
|
|
181
|
+
tools: {
|
|
182
182
|
name: string;
|
|
183
183
|
description: string;
|
|
184
184
|
schema?: any;
|
|
185
185
|
}[];
|
|
186
186
|
};
|
|
187
187
|
}, {
|
|
188
|
-
|
|
189
|
-
|
|
188
|
+
client: {
|
|
189
|
+
tools: {
|
|
190
190
|
name: string;
|
|
191
191
|
description: string;
|
|
192
192
|
schema?: any;
|
|
@@ -216,4 +216,4 @@ declare class TDAIChatHistory extends BaseListChatMessageHistory {
|
|
|
216
216
|
clear(): Promise<void>;
|
|
217
217
|
}
|
|
218
218
|
|
|
219
|
-
export { LangchainAgent, TDAIChatHistory, TDAIStore, type TDAIStoreInput,
|
|
219
|
+
export { LangchainAgent, TDAIChatHistory, TDAIStore, type TDAIStoreInput, clientTools, convert2LangChain, convertLangChain2AGKit };
|
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import * as langchain from 'langchain';
|
|
|
6
6
|
import { createAgent } from 'langchain';
|
|
7
7
|
import { StructuredTool } from '@langchain/core/tools';
|
|
8
8
|
import { z } from 'zod/v3';
|
|
9
|
-
import { AgentConfig } from '@
|
|
9
|
+
import { AgentConfig } from '@ag-ui/client';
|
|
10
10
|
import { LanggraphAgent } from '@cloudbase/agent-adapter-langgraph';
|
|
11
11
|
import { BaseListChatMessageHistory } from '@langchain/core/chat_history';
|
|
12
12
|
import { BaseMessage } from '@langchain/core/messages';
|
|
@@ -148,9 +148,9 @@ declare class LangchainAgent extends LanggraphAgent {
|
|
|
148
148
|
agent: ReturnType<typeof createAgent>;
|
|
149
149
|
});
|
|
150
150
|
}
|
|
151
|
-
declare function
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
declare function clientTools(): langchain.AgentMiddleware<z.ZodObject<{
|
|
152
|
+
client: z.ZodObject<{
|
|
153
|
+
tools: z.ZodArray<z.ZodObject<{
|
|
154
154
|
name: z.ZodString;
|
|
155
155
|
description: z.ZodString;
|
|
156
156
|
schema: z.ZodAny;
|
|
@@ -164,29 +164,29 @@ declare function agKitClientTools(): langchain.AgentMiddleware<z.ZodObject<{
|
|
|
164
164
|
schema?: any;
|
|
165
165
|
}>, "many">;
|
|
166
166
|
}, "strip", z.ZodTypeAny, {
|
|
167
|
-
|
|
167
|
+
tools: {
|
|
168
168
|
name: string;
|
|
169
169
|
description: string;
|
|
170
170
|
schema?: any;
|
|
171
171
|
}[];
|
|
172
172
|
}, {
|
|
173
|
-
|
|
173
|
+
tools: {
|
|
174
174
|
name: string;
|
|
175
175
|
description: string;
|
|
176
176
|
schema?: any;
|
|
177
177
|
}[];
|
|
178
178
|
}>;
|
|
179
179
|
}, "strip", z.ZodTypeAny, {
|
|
180
|
-
|
|
181
|
-
|
|
180
|
+
client: {
|
|
181
|
+
tools: {
|
|
182
182
|
name: string;
|
|
183
183
|
description: string;
|
|
184
184
|
schema?: any;
|
|
185
185
|
}[];
|
|
186
186
|
};
|
|
187
187
|
}, {
|
|
188
|
-
|
|
189
|
-
|
|
188
|
+
client: {
|
|
189
|
+
tools: {
|
|
190
190
|
name: string;
|
|
191
191
|
description: string;
|
|
192
192
|
schema?: any;
|
|
@@ -216,4 +216,4 @@ declare class TDAIChatHistory extends BaseListChatMessageHistory {
|
|
|
216
216
|
clear(): Promise<void>;
|
|
217
217
|
}
|
|
218
218
|
|
|
219
|
-
export { LangchainAgent, TDAIChatHistory, TDAIStore, type TDAIStoreInput,
|
|
219
|
+
export { LangchainAgent, TDAIChatHistory, TDAIStore, type TDAIStoreInput, clientTools, convert2LangChain, convertLangChain2AGKit };
|
package/dist/index.js
CHANGED
|
@@ -23,7 +23,7 @@ __export(index_exports, {
|
|
|
23
23
|
LangchainAgent: () => LangchainAgent,
|
|
24
24
|
TDAIChatHistory: () => TDAIChatHistory,
|
|
25
25
|
TDAIStore: () => TDAIStore,
|
|
26
|
-
|
|
26
|
+
clientTools: () => clientTools,
|
|
27
27
|
convert2LangChain: () => convert2LangChain,
|
|
28
28
|
convertLangChain2AGKit: () => convertLangChain2AGKit
|
|
29
29
|
});
|
|
@@ -325,12 +325,12 @@ var LangchainAgent = class extends import_agent_adapter_langgraph.LanggraphAgent
|
|
|
325
325
|
super({ ...config, compiledWorkflow: config.agent });
|
|
326
326
|
}
|
|
327
327
|
};
|
|
328
|
-
function
|
|
328
|
+
function clientTools() {
|
|
329
329
|
return (0, import_langchain.createMiddleware)({
|
|
330
|
-
name: "
|
|
330
|
+
name: "ClientTools",
|
|
331
331
|
stateSchema: import_v3.z.object({
|
|
332
|
-
|
|
333
|
-
|
|
332
|
+
client: import_v3.z.object({
|
|
333
|
+
tools: import_v3.z.array(
|
|
334
334
|
import_v3.z.object({
|
|
335
335
|
name: import_v3.z.string(),
|
|
336
336
|
description: import_v3.z.string(),
|
|
@@ -341,7 +341,7 @@ function agKitClientTools() {
|
|
|
341
341
|
}),
|
|
342
342
|
beforeModel: (state) => state,
|
|
343
343
|
wrapModelCall: (request, hanlder) => {
|
|
344
|
-
const
|
|
344
|
+
const clientTools2 = (request.state.client.tools || []).map((tool) => {
|
|
345
345
|
const { name, description, schema } = tool;
|
|
346
346
|
return {
|
|
347
347
|
name,
|
|
@@ -351,7 +351,7 @@ function agKitClientTools() {
|
|
|
351
351
|
});
|
|
352
352
|
return hanlder({
|
|
353
353
|
...request,
|
|
354
|
-
tools: [...request.tools || [], ...
|
|
354
|
+
tools: [...request.tools || [], ...clientTools2]
|
|
355
355
|
});
|
|
356
356
|
}
|
|
357
357
|
});
|
|
@@ -425,7 +425,7 @@ var TDAIChatHistory = class extends import_chat_history.BaseListChatMessageHisto
|
|
|
425
425
|
LangchainAgent,
|
|
426
426
|
TDAIChatHistory,
|
|
427
427
|
TDAIStore,
|
|
428
|
-
|
|
428
|
+
clientTools,
|
|
429
429
|
convert2LangChain,
|
|
430
430
|
convertLangChain2AGKit
|
|
431
431
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/store/tdai.ts","../src/tool.ts","../src/agent.ts","../src/chat_history.ts"],"sourcesContent":["export * from \"./store/index\";\nexport * from \"./tool\";\nexport * from \"./agent\";\nexport { TDAIChatHistory } from \"./chat_history\";\n\n","import { MemoryClient } from \"@cloudbase/agent-agents\";\nimport { BaseStore } from \"@langchain/core/stores\";\n\n/**\n * Configuration options for TDAIStore\n */\nexport interface TDAIStoreInput {\n /**\n * The TDAI Memory Client instance\n */\n client: MemoryClient;\n\n /**\n * The amount of keys to retrieve per batch when yielding keys.\n * @default 1000\n */\n yieldKeysScanBatchSize?: number;\n\n /**\n * The namespace to use for the keys in the database.\n */\n namespace?: string;\n\n /**\n * Default session ID for storing records\n */\n defaultSessionId?: string;\n\n /**\n * Default strategy for storing records\n */\n defaultStrategy?: string;\n\n /**\n * TTL for records in seconds\n */\n ttlSeconds?: number;\n}\n\n/**\n * TDAI implementation of the BaseStore for key-value caching.\n * Uses TDAI Memory Client for persistent storage.\n *\n * @example\n * ```typescript\n * const client = new MemoryClient({\n * endpoint: \"https://memory.tdai.tencentyun.com\",\n * apiKey: \"your-api-key\",\n * memoryId: \"your-memory-id\",\n * });\n *\n * const store = new TDAIStore({\n * client,\n * namespace: \"cache\",\n * });\n *\n * const encoder = new TextEncoder();\n * await store.mset([\n * [\"key1\", encoder.encode(\"value1\")],\n * [\"key2\", encoder.encode(\"value2\")],\n * ]);\n *\n * const values = await store.mget([\"key1\", \"key2\"]);\n * ```\n */\nexport class TDAIStore extends BaseStore<string, Uint8Array> {\n lc_namespace = [\"langchain\", \"storage\", \"tdai\"];\n\n protected client: MemoryClient;\n protected namespace?: string;\n protected yieldKeysScanBatchSize = 1000;\n protected defaultSessionId: string;\n protected defaultStrategy: string;\n protected ttlSeconds?: number;\n private sessionCache?: string;\n\n constructor(fields: TDAIStoreInput) {\n super();\n this.client = fields.client;\n this.namespace = fields.namespace;\n this.yieldKeysScanBatchSize =\n fields.yieldKeysScanBatchSize ?? this.yieldKeysScanBatchSize;\n this.defaultSessionId =\n fields.defaultSessionId ?? \"langchain_store_session\";\n this.defaultStrategy = fields.defaultStrategy ?? \"kv_cache\";\n this.ttlSeconds = fields.ttlSeconds;\n }\n\n /**\n * Get prefixed key with namespace\n */\n private _getPrefixedKey(key: string): string {\n if (this.namespace) {\n const delimiter = \"/\";\n return `${this.namespace}${delimiter}${key}`;\n }\n return key;\n }\n\n /**\n * Remove prefix from key\n */\n private _getDeprefixedKey(key: string): string {\n if (this.namespace) {\n const delimiter = \"/\";\n return key.slice(this.namespace.length + delimiter.length);\n }\n return key;\n }\n\n /**\n * Get or create session for the store\n */\n private async _getSession(): Promise<string> {\n if (this.sessionCache) {\n return this.sessionCache;\n }\n\n try {\n // Try to find existing session\n const sessions = await this.client.querySessions({\n limit: 1,\n });\n\n if (sessions.sessions && sessions.sessions.length > 0) {\n this.sessionCache = sessions.sessions[0].sessionId;\n } else {\n // Create new session\n const result = await this.client.createSession({\n name: `langchain_store_${this.namespace || \"default\"}`,\n });\n this.sessionCache = result.sessionId;\n }\n\n return this.sessionCache!;\n } catch (error) {\n // Fallback to default session\n return this.defaultSessionId;\n }\n }\n\n /**\n * Create record content for storage\n */\n private _createRecordContent(key: string, value: Uint8Array): string {\n const decoder = new TextDecoder();\n const content = {\n key: this._getPrefixedKey(key),\n value: decoder.decode(value),\n timestamp: Date.now(),\n ttl: this.ttlSeconds,\n };\n return JSON.stringify(content);\n }\n\n /**\n * Parse record content from storage\n */\n private _parseRecordContent(\n content: string\n ): {\n key: string;\n value: Uint8Array;\n timestamp: number;\n ttl?: number;\n } | null {\n try {\n const data = JSON.parse(content);\n const encoder = new TextEncoder();\n\n // Check TTL if present\n if (data.ttl && data.timestamp) {\n const now = Date.now();\n if (now > data.timestamp + data.ttl * 1000) {\n return null; // Expired\n }\n }\n\n return {\n key: data.key,\n value: encoder.encode(data.value),\n timestamp: data.timestamp,\n ttl: data.ttl,\n };\n } catch (error) {\n return null;\n }\n }\n\n /**\n * Gets multiple keys from the TDAI store.\n * @param keys Array of keys to be retrieved.\n * @returns An array of retrieved values.\n */\n async mget(keys: string[]): Promise<(Uint8Array | undefined)[]> {\n if (keys.length === 0) {\n return [];\n }\n\n try {\n const sessionId = await this._getSession();\n const results: (Uint8Array | undefined)[] = new Array(keys.length);\n\n // Search for each key individually due to TDAI API limitations\n for (let i = 0; i < keys.length; i++) {\n const prefixedKey = this._getPrefixedKey(keys[i]);\n\n try {\n const searchResult = await this.client.searchRecords({\n content: prefixedKey,\n sessionId,\n strategies: [this.defaultStrategy],\n limit: 1,\n });\n\n if (searchResult.records && searchResult.records.length > 0) {\n const record = searchResult.records[0];\n const parsed = this._parseRecordContent(record.record_content);\n\n if (parsed && parsed.key === prefixedKey) {\n results[i] = parsed.value;\n } else {\n results[i] = undefined;\n }\n } else {\n results[i] = undefined;\n }\n } catch (error) {\n results[i] = undefined;\n }\n }\n\n return results;\n } catch (error) {\n // Return array of undefined values on error\n return new Array(keys.length).fill(undefined);\n }\n }\n\n /**\n * Sets multiple keys in the TDAI store.\n * @param keyValuePairs Array of key-value pairs to be set.\n * @returns Promise that resolves when all keys have been set.\n */\n async mset(keyValuePairs: [string, Uint8Array][]): Promise<void> {\n if (keyValuePairs.length === 0) {\n return;\n }\n\n try {\n const sessionId = await this._getSession();\n\n // Set each key-value pair\n for (const [key, value] of keyValuePairs) {\n const content = this._createRecordContent(key, value);\n\n try {\n await this.client.appendRecord({\n sessionId,\n content,\n strategy: this.defaultStrategy,\n });\n } catch (error) {\n console.warn(`Failed to set key ${key}:`, error);\n }\n }\n } catch (error) {\n throw new Error(`Failed to set keys: ${error}`);\n }\n }\n\n /**\n * Deletes multiple keys from the TDAI store.\n * @param keys Array of keys to be deleted.\n * @returns Promise that resolves when all keys have been deleted.\n */\n async mdelete(keys: string[]): Promise<void> {\n if (keys.length === 0) {\n return;\n }\n\n try {\n const sessionId = await this._getSession();\n\n // Delete each key individually\n for (const key of keys) {\n const prefixedKey = this._getPrefixedKey(key);\n\n try {\n // First find the record\n const searchResult = await this.client.searchRecords({\n content: prefixedKey,\n sessionId,\n strategies: [this.defaultStrategy],\n limit: 1,\n });\n\n if (searchResult.records && searchResult.records.length > 0) {\n const record = searchResult.records[0];\n await this.client.deleteRecord({\n sessionId,\n recordId: record.record_id,\n });\n }\n } catch (error) {\n console.warn(`Failed to delete key ${key}:`, error);\n }\n }\n } catch (error) {\n throw new Error(`Failed to delete keys: ${error}`);\n }\n }\n\n /**\n * Yields keys from the TDAI store.\n * @param prefix Optional prefix to filter the keys.\n * @returns An AsyncGenerator that yields keys from the TDAI store.\n */\n async *yieldKeys(prefix?: string): AsyncGenerator<string> {\n try {\n const sessionId = await this._getSession();\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n try {\n const result = await this.client.queryRecords({\n sessionId,\n strategies: [this.defaultStrategy],\n limit: this.yieldKeysScanBatchSize,\n offset,\n });\n\n if (!result.records || result.records.length === 0) {\n hasMore = false;\n break;\n }\n\n for (const record of result.records) {\n const parsed = this._parseRecordContent(record.record_content);\n if (parsed) {\n const deprefixedKey = this._getDeprefixedKey(parsed.key);\n\n if (!prefix || deprefixedKey.startsWith(prefix)) {\n yield deprefixedKey;\n }\n }\n }\n\n offset += result.records.length;\n\n // If we got fewer records than requested, we've reached the end\n if (result.records.length < this.yieldKeysScanBatchSize) {\n hasMore = false;\n }\n } catch (error) {\n console.warn(`Error yielding keys at offset ${offset}:`, error);\n hasMore = false;\n }\n }\n } catch (error) {\n console.warn(\"Error yielding keys:\", error);\n }\n }\n\n /**\n * Close the TDAI client connection\n */\n close(): void {\n this.client.close();\n }\n}\n\n","/**\n * AG-Kit BaseTool to LangChain Tool Converter and Vice Versa\n */\nimport { tool as langChainTool, StructuredTool } from \"@langchain/core/tools\";\nimport {\n BaseTool,\n tool as agKitTool,\n ToolResult,\n ToolExecutionContext,\n} from \"@cloudbase/agent-tools\";\nimport { z } from \"zod/v4\";\n\n/**\n * Convert AG-Kit BaseTool to LangChain DynamicStructuredTool\n *\n * @param agkitTool - AG-Kit BaseTool instance\n * @param implFunc - Optional custom implementation function\n * @returns LangChain DynamicStructuredTool instance\n */\nexport function convert2LangChain(\n agkitTool: BaseTool,\n implFunc?: (tool: BaseTool) => Function\n) {\n const func =\n implFunc ||\n (async (input: any) => {\n const result = await agkitTool.invoke(input);\n return result;\n });\n\n return langChainTool(func as any, {\n name: agkitTool.name,\n description: agkitTool.description || agkitTool.name,\n schema: (agkitTool as any).schema || z.object({}),\n });\n}\n\n/**\n * Convert LangChain Tool to AG-Kit DynamicTool\n *\n * @param langchainTool - LangChain tool instance (DynamicStructuredTool or StructuredTool)\n * @returns AG-Kit DynamicTool instance\n */\nexport function convertLangChain2AGKit(langchainTool: StructuredTool) {\n const func: any = async (\n input: Record<string, any>,\n context?: ToolExecutionContext\n ) => {\n try {\n // Call the LangChain tool\n const result = await langchainTool.invoke(input);\n\n // Return successful result\n return new ToolResult({\n success: true,\n data: result,\n });\n } catch (error) {\n // Handle errors and return ToolResult with error\n return new ToolResult({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n error_type: \"execution\",\n });\n }\n };\n\n return agKitTool(func, {\n name: langchainTool.name,\n description: langchainTool.description || langchainTool.name,\n schema: (langchainTool as any).schema || (z.object({}) as z.ZodObject<any>),\n });\n}\n\n","import { z } from \"zod/v3\";\nimport { AgentConfig } from \"@cloudbase/agent-agents/abstract\";\nimport { LanggraphAgent } from \"@cloudbase/agent-adapter-langgraph\";\nimport { createAgent, createMiddleware, DynamicTool } from \"langchain\";\n\nexport class LangchainAgent extends LanggraphAgent {\n constructor(\n config: AgentConfig & {\n agent: ReturnType<typeof createAgent>;\n }\n ) {\n super({ ...config, compiledWorkflow: config.agent });\n }\n}\n\nexport function agKitClientTools() {\n return createMiddleware({\n name: \"AGKitClientTools\",\n stateSchema: z.object({\n agKit: z.object({\n actions: z.array(\n z.object({\n name: z.string(),\n description: z.string(),\n schema: z.any(),\n })\n ),\n }),\n }),\n beforeModel: (state) => state,\n wrapModelCall: (request, hanlder) => {\n const clientTools = (\n (request.state.agKit.actions || []) as DynamicTool[]\n ).map((tool) => {\n const { name, description, schema } = tool;\n return {\n name,\n description,\n schema,\n };\n });\n\n return hanlder({\n ...request,\n tools: [...(request.tools || []), ...clientTools],\n });\n },\n });\n}\n\n","import { BaseListChatMessageHistory } from \"@langchain/core/chat_history\";\nimport {\n BaseMessage,\n mapStoredMessagesToChatMessages,\n mapChatMessagesToStoredMessages,\n StoredMessage,\n} from \"@langchain/core/messages\";\nimport { IMemoryClientOptions, MemoryClient } from \"@cloudbase/agent-agents\";\n\nexport class TDAIChatHistory extends BaseListChatMessageHistory {\n lc_namespace = [\"langchain\", \"stores\", \"message\", \"tdai\"];\n\n public client: MemoryClient;\n\n private sessionId: string;\n\n constructor(options: IMemoryClientOptions & { sessionId: string }) {\n super();\n const { sessionId, ...clientOptions } = options;\n this.client = new MemoryClient({\n ...clientOptions,\n });\n this.sessionId = options.sessionId;\n }\n\n async getMessages(): Promise<BaseMessage[]> {\n const { events = [] } = await this.client.queryEvents({\n sessionId: this.sessionId,\n });\n\n return mapStoredMessagesToChatMessages(\n events.map((event) => {\n return {\n type: event.type,\n data: event.data,\n };\n })\n );\n }\n\n /**\n * Method to add a new message to the Firestore collection. The message is\n * passed as a BaseMessage object.\n * @param message The message to be added as a BaseMessage object.\n */\n public async addMessage(message: BaseMessage) {\n const messages = mapChatMessagesToStoredMessages([message]);\n await this.appendMessage(messages[0]);\n }\n\n private async appendMessage(message: StoredMessage): Promise<void> {\n await this.client.appendEvent({\n sessionId: this.sessionId,\n messages: message,\n });\n }\n\n /**\n * Method to delete all messages from the Firestore collection associated\n * with the current session.\n */\n public async clear(): Promise<void> {\n const eventIds = await this.client\n .queryEvents({\n sessionId: this.sessionId,\n })\n .then(({ events = [] }) => events.map((event: any) => event.event_id));\n\n await Promise.all(\n eventIds.map((id: string) => {\n return this.client.deleteEvent({\n sessionId: this.sessionId,\n eventId: id,\n });\n })\n );\n\n await this.client.deleteSession({\n sessionId: this.sessionId,\n });\n }\n}\n\n"],"mappings":"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","names":["langChainTool","agKitTool"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/store/tdai.ts","../src/tool.ts","../src/agent.ts","../src/chat_history.ts"],"sourcesContent":["export * from \"./store/index\";\nexport * from \"./tool\";\nexport * from \"./agent\";\nexport { TDAIChatHistory } from \"./chat_history\";\n\n","import { MemoryClient } from \"@cloudbase/agent-agents\";\nimport { BaseStore } from \"@langchain/core/stores\";\n\n/**\n * Configuration options for TDAIStore\n */\nexport interface TDAIStoreInput {\n /**\n * The TDAI Memory Client instance\n */\n client: MemoryClient;\n\n /**\n * The amount of keys to retrieve per batch when yielding keys.\n * @default 1000\n */\n yieldKeysScanBatchSize?: number;\n\n /**\n * The namespace to use for the keys in the database.\n */\n namespace?: string;\n\n /**\n * Default session ID for storing records\n */\n defaultSessionId?: string;\n\n /**\n * Default strategy for storing records\n */\n defaultStrategy?: string;\n\n /**\n * TTL for records in seconds\n */\n ttlSeconds?: number;\n}\n\n/**\n * TDAI implementation of the BaseStore for key-value caching.\n * Uses TDAI Memory Client for persistent storage.\n *\n * @example\n * ```typescript\n * const client = new MemoryClient({\n * endpoint: \"https://memory.tdai.tencentyun.com\",\n * apiKey: \"your-api-key\",\n * memoryId: \"your-memory-id\",\n * });\n *\n * const store = new TDAIStore({\n * client,\n * namespace: \"cache\",\n * });\n *\n * const encoder = new TextEncoder();\n * await store.mset([\n * [\"key1\", encoder.encode(\"value1\")],\n * [\"key2\", encoder.encode(\"value2\")],\n * ]);\n *\n * const values = await store.mget([\"key1\", \"key2\"]);\n * ```\n */\nexport class TDAIStore extends BaseStore<string, Uint8Array> {\n lc_namespace = [\"langchain\", \"storage\", \"tdai\"];\n\n protected client: MemoryClient;\n protected namespace?: string;\n protected yieldKeysScanBatchSize = 1000;\n protected defaultSessionId: string;\n protected defaultStrategy: string;\n protected ttlSeconds?: number;\n private sessionCache?: string;\n\n constructor(fields: TDAIStoreInput) {\n super();\n this.client = fields.client;\n this.namespace = fields.namespace;\n this.yieldKeysScanBatchSize =\n fields.yieldKeysScanBatchSize ?? this.yieldKeysScanBatchSize;\n this.defaultSessionId =\n fields.defaultSessionId ?? \"langchain_store_session\";\n this.defaultStrategy = fields.defaultStrategy ?? \"kv_cache\";\n this.ttlSeconds = fields.ttlSeconds;\n }\n\n /**\n * Get prefixed key with namespace\n */\n private _getPrefixedKey(key: string): string {\n if (this.namespace) {\n const delimiter = \"/\";\n return `${this.namespace}${delimiter}${key}`;\n }\n return key;\n }\n\n /**\n * Remove prefix from key\n */\n private _getDeprefixedKey(key: string): string {\n if (this.namespace) {\n const delimiter = \"/\";\n return key.slice(this.namespace.length + delimiter.length);\n }\n return key;\n }\n\n /**\n * Get or create session for the store\n */\n private async _getSession(): Promise<string> {\n if (this.sessionCache) {\n return this.sessionCache;\n }\n\n try {\n // Try to find existing session\n const sessions = await this.client.querySessions({\n limit: 1,\n });\n\n if (sessions.sessions && sessions.sessions.length > 0) {\n this.sessionCache = sessions.sessions[0].sessionId;\n } else {\n // Create new session\n const result = await this.client.createSession({\n name: `langchain_store_${this.namespace || \"default\"}`,\n });\n this.sessionCache = result.sessionId;\n }\n\n return this.sessionCache!;\n } catch (error) {\n // Fallback to default session\n return this.defaultSessionId;\n }\n }\n\n /**\n * Create record content for storage\n */\n private _createRecordContent(key: string, value: Uint8Array): string {\n const decoder = new TextDecoder();\n const content = {\n key: this._getPrefixedKey(key),\n value: decoder.decode(value),\n timestamp: Date.now(),\n ttl: this.ttlSeconds,\n };\n return JSON.stringify(content);\n }\n\n /**\n * Parse record content from storage\n */\n private _parseRecordContent(\n content: string\n ): {\n key: string;\n value: Uint8Array;\n timestamp: number;\n ttl?: number;\n } | null {\n try {\n const data = JSON.parse(content);\n const encoder = new TextEncoder();\n\n // Check TTL if present\n if (data.ttl && data.timestamp) {\n const now = Date.now();\n if (now > data.timestamp + data.ttl * 1000) {\n return null; // Expired\n }\n }\n\n return {\n key: data.key,\n value: encoder.encode(data.value),\n timestamp: data.timestamp,\n ttl: data.ttl,\n };\n } catch (error) {\n return null;\n }\n }\n\n /**\n * Gets multiple keys from the TDAI store.\n * @param keys Array of keys to be retrieved.\n * @returns An array of retrieved values.\n */\n async mget(keys: string[]): Promise<(Uint8Array | undefined)[]> {\n if (keys.length === 0) {\n return [];\n }\n\n try {\n const sessionId = await this._getSession();\n const results: (Uint8Array | undefined)[] = new Array(keys.length);\n\n // Search for each key individually due to TDAI API limitations\n for (let i = 0; i < keys.length; i++) {\n const prefixedKey = this._getPrefixedKey(keys[i]);\n\n try {\n const searchResult = await this.client.searchRecords({\n content: prefixedKey,\n sessionId,\n strategies: [this.defaultStrategy],\n limit: 1,\n });\n\n if (searchResult.records && searchResult.records.length > 0) {\n const record = searchResult.records[0];\n const parsed = this._parseRecordContent(record.record_content);\n\n if (parsed && parsed.key === prefixedKey) {\n results[i] = parsed.value;\n } else {\n results[i] = undefined;\n }\n } else {\n results[i] = undefined;\n }\n } catch (error) {\n results[i] = undefined;\n }\n }\n\n return results;\n } catch (error) {\n // Return array of undefined values on error\n return new Array(keys.length).fill(undefined);\n }\n }\n\n /**\n * Sets multiple keys in the TDAI store.\n * @param keyValuePairs Array of key-value pairs to be set.\n * @returns Promise that resolves when all keys have been set.\n */\n async mset(keyValuePairs: [string, Uint8Array][]): Promise<void> {\n if (keyValuePairs.length === 0) {\n return;\n }\n\n try {\n const sessionId = await this._getSession();\n\n // Set each key-value pair\n for (const [key, value] of keyValuePairs) {\n const content = this._createRecordContent(key, value);\n\n try {\n await this.client.appendRecord({\n sessionId,\n content,\n strategy: this.defaultStrategy,\n });\n } catch (error) {\n console.warn(`Failed to set key ${key}:`, error);\n }\n }\n } catch (error) {\n throw new Error(`Failed to set keys: ${error}`);\n }\n }\n\n /**\n * Deletes multiple keys from the TDAI store.\n * @param keys Array of keys to be deleted.\n * @returns Promise that resolves when all keys have been deleted.\n */\n async mdelete(keys: string[]): Promise<void> {\n if (keys.length === 0) {\n return;\n }\n\n try {\n const sessionId = await this._getSession();\n\n // Delete each key individually\n for (const key of keys) {\n const prefixedKey = this._getPrefixedKey(key);\n\n try {\n // First find the record\n const searchResult = await this.client.searchRecords({\n content: prefixedKey,\n sessionId,\n strategies: [this.defaultStrategy],\n limit: 1,\n });\n\n if (searchResult.records && searchResult.records.length > 0) {\n const record = searchResult.records[0];\n await this.client.deleteRecord({\n sessionId,\n recordId: record.record_id,\n });\n }\n } catch (error) {\n console.warn(`Failed to delete key ${key}:`, error);\n }\n }\n } catch (error) {\n throw new Error(`Failed to delete keys: ${error}`);\n }\n }\n\n /**\n * Yields keys from the TDAI store.\n * @param prefix Optional prefix to filter the keys.\n * @returns An AsyncGenerator that yields keys from the TDAI store.\n */\n async *yieldKeys(prefix?: string): AsyncGenerator<string> {\n try {\n const sessionId = await this._getSession();\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n try {\n const result = await this.client.queryRecords({\n sessionId,\n strategies: [this.defaultStrategy],\n limit: this.yieldKeysScanBatchSize,\n offset,\n });\n\n if (!result.records || result.records.length === 0) {\n hasMore = false;\n break;\n }\n\n for (const record of result.records) {\n const parsed = this._parseRecordContent(record.record_content);\n if (parsed) {\n const deprefixedKey = this._getDeprefixedKey(parsed.key);\n\n if (!prefix || deprefixedKey.startsWith(prefix)) {\n yield deprefixedKey;\n }\n }\n }\n\n offset += result.records.length;\n\n // If we got fewer records than requested, we've reached the end\n if (result.records.length < this.yieldKeysScanBatchSize) {\n hasMore = false;\n }\n } catch (error) {\n console.warn(`Error yielding keys at offset ${offset}:`, error);\n hasMore = false;\n }\n }\n } catch (error) {\n console.warn(\"Error yielding keys:\", error);\n }\n }\n\n /**\n * Close the TDAI client connection\n */\n close(): void {\n this.client.close();\n }\n}\n\n","/**\n * AG-Kit BaseTool to LangChain Tool Converter and Vice Versa\n */\nimport { tool as langChainTool, StructuredTool } from \"@langchain/core/tools\";\nimport {\n BaseTool,\n tool as agKitTool,\n ToolResult,\n ToolExecutionContext,\n} from \"@cloudbase/agent-tools\";\nimport { z } from \"zod/v4\";\n\n/**\n * Convert AG-Kit BaseTool to LangChain DynamicStructuredTool\n *\n * @param agkitTool - AG-Kit BaseTool instance\n * @param implFunc - Optional custom implementation function\n * @returns LangChain DynamicStructuredTool instance\n */\nexport function convert2LangChain(\n agkitTool: BaseTool,\n implFunc?: (tool: BaseTool) => Function\n) {\n const func =\n implFunc ||\n (async (input: any) => {\n const result = await agkitTool.invoke(input);\n return result;\n });\n\n return langChainTool(func as any, {\n name: agkitTool.name,\n description: agkitTool.description || agkitTool.name,\n schema: (agkitTool as any).schema || z.object({}),\n });\n}\n\n/**\n * Convert LangChain Tool to AG-Kit DynamicTool\n *\n * @param langchainTool - LangChain tool instance (DynamicStructuredTool or StructuredTool)\n * @returns AG-Kit DynamicTool instance\n */\nexport function convertLangChain2AGKit(langchainTool: StructuredTool) {\n const func: any = async (\n input: Record<string, any>,\n context?: ToolExecutionContext\n ) => {\n try {\n // Call the LangChain tool\n const result = await langchainTool.invoke(input);\n\n // Return successful result\n return new ToolResult({\n success: true,\n data: result,\n });\n } catch (error) {\n // Handle errors and return ToolResult with error\n return new ToolResult({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n error_type: \"execution\",\n });\n }\n };\n\n return agKitTool(func, {\n name: langchainTool.name,\n description: langchainTool.description || langchainTool.name,\n schema: (langchainTool as any).schema || (z.object({}) as z.ZodObject<any>),\n });\n}\n\n","import { z } from \"zod/v3\";\nimport { AgentConfig } from \"@ag-ui/client\";\nimport { LanggraphAgent } from \"@cloudbase/agent-adapter-langgraph\";\nimport { createAgent, createMiddleware, DynamicTool } from \"langchain\";\n\nexport class LangchainAgent extends LanggraphAgent {\n constructor(\n config: AgentConfig & {\n agent: ReturnType<typeof createAgent>;\n }\n ) {\n super({ ...config, compiledWorkflow: config.agent });\n }\n}\n\nexport function clientTools() {\n return createMiddleware({\n name: \"ClientTools\",\n stateSchema: z.object({\n client: z.object({\n tools: z.array(\n z.object({\n name: z.string(),\n description: z.string(),\n schema: z.any(),\n })\n ),\n }),\n }),\n beforeModel: (state) => state,\n wrapModelCall: (request, hanlder) => {\n const clientTools = (\n (request.state.client.tools || []) as DynamicTool[]\n ).map((tool) => {\n const { name, description, schema } = tool;\n return {\n name,\n description,\n schema,\n };\n });\n\n return hanlder({\n ...request,\n tools: [...(request.tools || []), ...clientTools],\n });\n },\n });\n}\n","import { BaseListChatMessageHistory } from \"@langchain/core/chat_history\";\nimport {\n BaseMessage,\n mapStoredMessagesToChatMessages,\n mapChatMessagesToStoredMessages,\n StoredMessage,\n} from \"@langchain/core/messages\";\nimport { IMemoryClientOptions, MemoryClient } from \"@cloudbase/agent-agents\";\n\nexport class TDAIChatHistory extends BaseListChatMessageHistory {\n lc_namespace = [\"langchain\", \"stores\", \"message\", \"tdai\"];\n\n public client: MemoryClient;\n\n private sessionId: string;\n\n constructor(options: IMemoryClientOptions & { sessionId: string }) {\n super();\n const { sessionId, ...clientOptions } = options;\n this.client = new MemoryClient({\n ...clientOptions,\n });\n this.sessionId = options.sessionId;\n }\n\n async getMessages(): Promise<BaseMessage[]> {\n const { events = [] } = await this.client.queryEvents({\n sessionId: this.sessionId,\n });\n\n return mapStoredMessagesToChatMessages(\n events.map((event) => {\n return {\n type: event.type,\n data: event.data,\n };\n })\n );\n }\n\n /**\n * Method to add a new message to the Firestore collection. The message is\n * passed as a BaseMessage object.\n * @param message The message to be added as a BaseMessage object.\n */\n public async addMessage(message: BaseMessage) {\n const messages = mapChatMessagesToStoredMessages([message]);\n await this.appendMessage(messages[0]);\n }\n\n private async appendMessage(message: StoredMessage): Promise<void> {\n await this.client.appendEvent({\n sessionId: this.sessionId,\n messages: message,\n });\n }\n\n /**\n * Method to delete all messages from the Firestore collection associated\n * with the current session.\n */\n public async clear(): Promise<void> {\n const eventIds = await this.client\n .queryEvents({\n sessionId: this.sessionId,\n })\n .then(({ events = [] }) => events.map((event: any) => event.event_id));\n\n await Promise.all(\n eventIds.map((id: string) => {\n return this.client.deleteEvent({\n sessionId: this.sessionId,\n eventId: id,\n });\n })\n );\n\n await this.client.deleteSession({\n sessionId: this.sessionId,\n });\n }\n}\n\n"],"mappings":"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","names":["langChainTool","agKitTool","clientTools"]}
|
package/dist/index.mjs
CHANGED
|
@@ -297,12 +297,12 @@ var LangchainAgent = class extends LanggraphAgent {
|
|
|
297
297
|
super({ ...config, compiledWorkflow: config.agent });
|
|
298
298
|
}
|
|
299
299
|
};
|
|
300
|
-
function
|
|
300
|
+
function clientTools() {
|
|
301
301
|
return createMiddleware({
|
|
302
|
-
name: "
|
|
302
|
+
name: "ClientTools",
|
|
303
303
|
stateSchema: z2.object({
|
|
304
|
-
|
|
305
|
-
|
|
304
|
+
client: z2.object({
|
|
305
|
+
tools: z2.array(
|
|
306
306
|
z2.object({
|
|
307
307
|
name: z2.string(),
|
|
308
308
|
description: z2.string(),
|
|
@@ -313,7 +313,7 @@ function agKitClientTools() {
|
|
|
313
313
|
}),
|
|
314
314
|
beforeModel: (state) => state,
|
|
315
315
|
wrapModelCall: (request, hanlder) => {
|
|
316
|
-
const
|
|
316
|
+
const clientTools2 = (request.state.client.tools || []).map((tool) => {
|
|
317
317
|
const { name, description, schema } = tool;
|
|
318
318
|
return {
|
|
319
319
|
name,
|
|
@@ -323,7 +323,7 @@ function agKitClientTools() {
|
|
|
323
323
|
});
|
|
324
324
|
return hanlder({
|
|
325
325
|
...request,
|
|
326
|
-
tools: [...request.tools || [], ...
|
|
326
|
+
tools: [...request.tools || [], ...clientTools2]
|
|
327
327
|
});
|
|
328
328
|
}
|
|
329
329
|
});
|
|
@@ -399,7 +399,7 @@ export {
|
|
|
399
399
|
LangchainAgent,
|
|
400
400
|
TDAIChatHistory,
|
|
401
401
|
TDAIStore,
|
|
402
|
-
|
|
402
|
+
clientTools,
|
|
403
403
|
convert2LangChain,
|
|
404
404
|
convertLangChain2AGKit
|
|
405
405
|
};
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/store/tdai.ts","../src/tool.ts","../src/agent.ts","../src/chat_history.ts"],"sourcesContent":["import { MemoryClient } from \"@cloudbase/agent-agents\";\nimport { BaseStore } from \"@langchain/core/stores\";\n\n/**\n * Configuration options for TDAIStore\n */\nexport interface TDAIStoreInput {\n /**\n * The TDAI Memory Client instance\n */\n client: MemoryClient;\n\n /**\n * The amount of keys to retrieve per batch when yielding keys.\n * @default 1000\n */\n yieldKeysScanBatchSize?: number;\n\n /**\n * The namespace to use for the keys in the database.\n */\n namespace?: string;\n\n /**\n * Default session ID for storing records\n */\n defaultSessionId?: string;\n\n /**\n * Default strategy for storing records\n */\n defaultStrategy?: string;\n\n /**\n * TTL for records in seconds\n */\n ttlSeconds?: number;\n}\n\n/**\n * TDAI implementation of the BaseStore for key-value caching.\n * Uses TDAI Memory Client for persistent storage.\n *\n * @example\n * ```typescript\n * const client = new MemoryClient({\n * endpoint: \"https://memory.tdai.tencentyun.com\",\n * apiKey: \"your-api-key\",\n * memoryId: \"your-memory-id\",\n * });\n *\n * const store = new TDAIStore({\n * client,\n * namespace: \"cache\",\n * });\n *\n * const encoder = new TextEncoder();\n * await store.mset([\n * [\"key1\", encoder.encode(\"value1\")],\n * [\"key2\", encoder.encode(\"value2\")],\n * ]);\n *\n * const values = await store.mget([\"key1\", \"key2\"]);\n * ```\n */\nexport class TDAIStore extends BaseStore<string, Uint8Array> {\n lc_namespace = [\"langchain\", \"storage\", \"tdai\"];\n\n protected client: MemoryClient;\n protected namespace?: string;\n protected yieldKeysScanBatchSize = 1000;\n protected defaultSessionId: string;\n protected defaultStrategy: string;\n protected ttlSeconds?: number;\n private sessionCache?: string;\n\n constructor(fields: TDAIStoreInput) {\n super();\n this.client = fields.client;\n this.namespace = fields.namespace;\n this.yieldKeysScanBatchSize =\n fields.yieldKeysScanBatchSize ?? this.yieldKeysScanBatchSize;\n this.defaultSessionId =\n fields.defaultSessionId ?? \"langchain_store_session\";\n this.defaultStrategy = fields.defaultStrategy ?? \"kv_cache\";\n this.ttlSeconds = fields.ttlSeconds;\n }\n\n /**\n * Get prefixed key with namespace\n */\n private _getPrefixedKey(key: string): string {\n if (this.namespace) {\n const delimiter = \"/\";\n return `${this.namespace}${delimiter}${key}`;\n }\n return key;\n }\n\n /**\n * Remove prefix from key\n */\n private _getDeprefixedKey(key: string): string {\n if (this.namespace) {\n const delimiter = \"/\";\n return key.slice(this.namespace.length + delimiter.length);\n }\n return key;\n }\n\n /**\n * Get or create session for the store\n */\n private async _getSession(): Promise<string> {\n if (this.sessionCache) {\n return this.sessionCache;\n }\n\n try {\n // Try to find existing session\n const sessions = await this.client.querySessions({\n limit: 1,\n });\n\n if (sessions.sessions && sessions.sessions.length > 0) {\n this.sessionCache = sessions.sessions[0].sessionId;\n } else {\n // Create new session\n const result = await this.client.createSession({\n name: `langchain_store_${this.namespace || \"default\"}`,\n });\n this.sessionCache = result.sessionId;\n }\n\n return this.sessionCache!;\n } catch (error) {\n // Fallback to default session\n return this.defaultSessionId;\n }\n }\n\n /**\n * Create record content for storage\n */\n private _createRecordContent(key: string, value: Uint8Array): string {\n const decoder = new TextDecoder();\n const content = {\n key: this._getPrefixedKey(key),\n value: decoder.decode(value),\n timestamp: Date.now(),\n ttl: this.ttlSeconds,\n };\n return JSON.stringify(content);\n }\n\n /**\n * Parse record content from storage\n */\n private _parseRecordContent(\n content: string\n ): {\n key: string;\n value: Uint8Array;\n timestamp: number;\n ttl?: number;\n } | null {\n try {\n const data = JSON.parse(content);\n const encoder = new TextEncoder();\n\n // Check TTL if present\n if (data.ttl && data.timestamp) {\n const now = Date.now();\n if (now > data.timestamp + data.ttl * 1000) {\n return null; // Expired\n }\n }\n\n return {\n key: data.key,\n value: encoder.encode(data.value),\n timestamp: data.timestamp,\n ttl: data.ttl,\n };\n } catch (error) {\n return null;\n }\n }\n\n /**\n * Gets multiple keys from the TDAI store.\n * @param keys Array of keys to be retrieved.\n * @returns An array of retrieved values.\n */\n async mget(keys: string[]): Promise<(Uint8Array | undefined)[]> {\n if (keys.length === 0) {\n return [];\n }\n\n try {\n const sessionId = await this._getSession();\n const results: (Uint8Array | undefined)[] = new Array(keys.length);\n\n // Search for each key individually due to TDAI API limitations\n for (let i = 0; i < keys.length; i++) {\n const prefixedKey = this._getPrefixedKey(keys[i]);\n\n try {\n const searchResult = await this.client.searchRecords({\n content: prefixedKey,\n sessionId,\n strategies: [this.defaultStrategy],\n limit: 1,\n });\n\n if (searchResult.records && searchResult.records.length > 0) {\n const record = searchResult.records[0];\n const parsed = this._parseRecordContent(record.record_content);\n\n if (parsed && parsed.key === prefixedKey) {\n results[i] = parsed.value;\n } else {\n results[i] = undefined;\n }\n } else {\n results[i] = undefined;\n }\n } catch (error) {\n results[i] = undefined;\n }\n }\n\n return results;\n } catch (error) {\n // Return array of undefined values on error\n return new Array(keys.length).fill(undefined);\n }\n }\n\n /**\n * Sets multiple keys in the TDAI store.\n * @param keyValuePairs Array of key-value pairs to be set.\n * @returns Promise that resolves when all keys have been set.\n */\n async mset(keyValuePairs: [string, Uint8Array][]): Promise<void> {\n if (keyValuePairs.length === 0) {\n return;\n }\n\n try {\n const sessionId = await this._getSession();\n\n // Set each key-value pair\n for (const [key, value] of keyValuePairs) {\n const content = this._createRecordContent(key, value);\n\n try {\n await this.client.appendRecord({\n sessionId,\n content,\n strategy: this.defaultStrategy,\n });\n } catch (error) {\n console.warn(`Failed to set key ${key}:`, error);\n }\n }\n } catch (error) {\n throw new Error(`Failed to set keys: ${error}`);\n }\n }\n\n /**\n * Deletes multiple keys from the TDAI store.\n * @param keys Array of keys to be deleted.\n * @returns Promise that resolves when all keys have been deleted.\n */\n async mdelete(keys: string[]): Promise<void> {\n if (keys.length === 0) {\n return;\n }\n\n try {\n const sessionId = await this._getSession();\n\n // Delete each key individually\n for (const key of keys) {\n const prefixedKey = this._getPrefixedKey(key);\n\n try {\n // First find the record\n const searchResult = await this.client.searchRecords({\n content: prefixedKey,\n sessionId,\n strategies: [this.defaultStrategy],\n limit: 1,\n });\n\n if (searchResult.records && searchResult.records.length > 0) {\n const record = searchResult.records[0];\n await this.client.deleteRecord({\n sessionId,\n recordId: record.record_id,\n });\n }\n } catch (error) {\n console.warn(`Failed to delete key ${key}:`, error);\n }\n }\n } catch (error) {\n throw new Error(`Failed to delete keys: ${error}`);\n }\n }\n\n /**\n * Yields keys from the TDAI store.\n * @param prefix Optional prefix to filter the keys.\n * @returns An AsyncGenerator that yields keys from the TDAI store.\n */\n async *yieldKeys(prefix?: string): AsyncGenerator<string> {\n try {\n const sessionId = await this._getSession();\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n try {\n const result = await this.client.queryRecords({\n sessionId,\n strategies: [this.defaultStrategy],\n limit: this.yieldKeysScanBatchSize,\n offset,\n });\n\n if (!result.records || result.records.length === 0) {\n hasMore = false;\n break;\n }\n\n for (const record of result.records) {\n const parsed = this._parseRecordContent(record.record_content);\n if (parsed) {\n const deprefixedKey = this._getDeprefixedKey(parsed.key);\n\n if (!prefix || deprefixedKey.startsWith(prefix)) {\n yield deprefixedKey;\n }\n }\n }\n\n offset += result.records.length;\n\n // If we got fewer records than requested, we've reached the end\n if (result.records.length < this.yieldKeysScanBatchSize) {\n hasMore = false;\n }\n } catch (error) {\n console.warn(`Error yielding keys at offset ${offset}:`, error);\n hasMore = false;\n }\n }\n } catch (error) {\n console.warn(\"Error yielding keys:\", error);\n }\n }\n\n /**\n * Close the TDAI client connection\n */\n close(): void {\n this.client.close();\n }\n}\n\n","/**\n * AG-Kit BaseTool to LangChain Tool Converter and Vice Versa\n */\nimport { tool as langChainTool, StructuredTool } from \"@langchain/core/tools\";\nimport {\n BaseTool,\n tool as agKitTool,\n ToolResult,\n ToolExecutionContext,\n} from \"@cloudbase/agent-tools\";\nimport { z } from \"zod/v4\";\n\n/**\n * Convert AG-Kit BaseTool to LangChain DynamicStructuredTool\n *\n * @param agkitTool - AG-Kit BaseTool instance\n * @param implFunc - Optional custom implementation function\n * @returns LangChain DynamicStructuredTool instance\n */\nexport function convert2LangChain(\n agkitTool: BaseTool,\n implFunc?: (tool: BaseTool) => Function\n) {\n const func =\n implFunc ||\n (async (input: any) => {\n const result = await agkitTool.invoke(input);\n return result;\n });\n\n return langChainTool(func as any, {\n name: agkitTool.name,\n description: agkitTool.description || agkitTool.name,\n schema: (agkitTool as any).schema || z.object({}),\n });\n}\n\n/**\n * Convert LangChain Tool to AG-Kit DynamicTool\n *\n * @param langchainTool - LangChain tool instance (DynamicStructuredTool or StructuredTool)\n * @returns AG-Kit DynamicTool instance\n */\nexport function convertLangChain2AGKit(langchainTool: StructuredTool) {\n const func: any = async (\n input: Record<string, any>,\n context?: ToolExecutionContext\n ) => {\n try {\n // Call the LangChain tool\n const result = await langchainTool.invoke(input);\n\n // Return successful result\n return new ToolResult({\n success: true,\n data: result,\n });\n } catch (error) {\n // Handle errors and return ToolResult with error\n return new ToolResult({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n error_type: \"execution\",\n });\n }\n };\n\n return agKitTool(func, {\n name: langchainTool.name,\n description: langchainTool.description || langchainTool.name,\n schema: (langchainTool as any).schema || (z.object({}) as z.ZodObject<any>),\n });\n}\n\n","import { z } from \"zod/v3\";\nimport { AgentConfig } from \"@cloudbase/agent-agents/abstract\";\nimport { LanggraphAgent } from \"@cloudbase/agent-adapter-langgraph\";\nimport { createAgent, createMiddleware, DynamicTool } from \"langchain\";\n\nexport class LangchainAgent extends LanggraphAgent {\n constructor(\n config: AgentConfig & {\n agent: ReturnType<typeof createAgent>;\n }\n ) {\n super({ ...config, compiledWorkflow: config.agent });\n }\n}\n\nexport function agKitClientTools() {\n return createMiddleware({\n name: \"AGKitClientTools\",\n stateSchema: z.object({\n agKit: z.object({\n actions: z.array(\n z.object({\n name: z.string(),\n description: z.string(),\n schema: z.any(),\n })\n ),\n }),\n }),\n beforeModel: (state) => state,\n wrapModelCall: (request, hanlder) => {\n const clientTools = (\n (request.state.agKit.actions || []) as DynamicTool[]\n ).map((tool) => {\n const { name, description, schema } = tool;\n return {\n name,\n description,\n schema,\n };\n });\n\n return hanlder({\n ...request,\n tools: [...(request.tools || []), ...clientTools],\n });\n },\n });\n}\n\n","import { BaseListChatMessageHistory } from \"@langchain/core/chat_history\";\nimport {\n BaseMessage,\n mapStoredMessagesToChatMessages,\n mapChatMessagesToStoredMessages,\n StoredMessage,\n} from \"@langchain/core/messages\";\nimport { IMemoryClientOptions, MemoryClient } from \"@cloudbase/agent-agents\";\n\nexport class TDAIChatHistory extends BaseListChatMessageHistory {\n lc_namespace = [\"langchain\", \"stores\", \"message\", \"tdai\"];\n\n public client: MemoryClient;\n\n private sessionId: string;\n\n constructor(options: IMemoryClientOptions & { sessionId: string }) {\n super();\n const { sessionId, ...clientOptions } = options;\n this.client = new MemoryClient({\n ...clientOptions,\n });\n this.sessionId = options.sessionId;\n }\n\n async getMessages(): Promise<BaseMessage[]> {\n const { events = [] } = await this.client.queryEvents({\n sessionId: this.sessionId,\n });\n\n return mapStoredMessagesToChatMessages(\n events.map((event) => {\n return {\n type: event.type,\n data: event.data,\n };\n })\n );\n }\n\n /**\n * Method to add a new message to the Firestore collection. The message is\n * passed as a BaseMessage object.\n * @param message The message to be added as a BaseMessage object.\n */\n public async addMessage(message: BaseMessage) {\n const messages = mapChatMessagesToStoredMessages([message]);\n await this.appendMessage(messages[0]);\n }\n\n private async appendMessage(message: StoredMessage): Promise<void> {\n await this.client.appendEvent({\n sessionId: this.sessionId,\n messages: message,\n });\n }\n\n /**\n * Method to delete all messages from the Firestore collection associated\n * with the current session.\n */\n public async clear(): Promise<void> {\n const eventIds = await this.client\n .queryEvents({\n sessionId: this.sessionId,\n })\n .then(({ events = [] }) => events.map((event: any) => event.event_id));\n\n await Promise.all(\n eventIds.map((id: string) => {\n return this.client.deleteEvent({\n sessionId: this.sessionId,\n eventId: id,\n });\n })\n );\n\n await this.client.deleteSession({\n sessionId: this.sessionId,\n });\n }\n}\n\n"],"mappings":"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","names":["z"]}
|
|
1
|
+
{"version":3,"sources":["../src/store/tdai.ts","../src/tool.ts","../src/agent.ts","../src/chat_history.ts"],"sourcesContent":["import { MemoryClient } from \"@cloudbase/agent-agents\";\nimport { BaseStore } from \"@langchain/core/stores\";\n\n/**\n * Configuration options for TDAIStore\n */\nexport interface TDAIStoreInput {\n /**\n * The TDAI Memory Client instance\n */\n client: MemoryClient;\n\n /**\n * The amount of keys to retrieve per batch when yielding keys.\n * @default 1000\n */\n yieldKeysScanBatchSize?: number;\n\n /**\n * The namespace to use for the keys in the database.\n */\n namespace?: string;\n\n /**\n * Default session ID for storing records\n */\n defaultSessionId?: string;\n\n /**\n * Default strategy for storing records\n */\n defaultStrategy?: string;\n\n /**\n * TTL for records in seconds\n */\n ttlSeconds?: number;\n}\n\n/**\n * TDAI implementation of the BaseStore for key-value caching.\n * Uses TDAI Memory Client for persistent storage.\n *\n * @example\n * ```typescript\n * const client = new MemoryClient({\n * endpoint: \"https://memory.tdai.tencentyun.com\",\n * apiKey: \"your-api-key\",\n * memoryId: \"your-memory-id\",\n * });\n *\n * const store = new TDAIStore({\n * client,\n * namespace: \"cache\",\n * });\n *\n * const encoder = new TextEncoder();\n * await store.mset([\n * [\"key1\", encoder.encode(\"value1\")],\n * [\"key2\", encoder.encode(\"value2\")],\n * ]);\n *\n * const values = await store.mget([\"key1\", \"key2\"]);\n * ```\n */\nexport class TDAIStore extends BaseStore<string, Uint8Array> {\n lc_namespace = [\"langchain\", \"storage\", \"tdai\"];\n\n protected client: MemoryClient;\n protected namespace?: string;\n protected yieldKeysScanBatchSize = 1000;\n protected defaultSessionId: string;\n protected defaultStrategy: string;\n protected ttlSeconds?: number;\n private sessionCache?: string;\n\n constructor(fields: TDAIStoreInput) {\n super();\n this.client = fields.client;\n this.namespace = fields.namespace;\n this.yieldKeysScanBatchSize =\n fields.yieldKeysScanBatchSize ?? this.yieldKeysScanBatchSize;\n this.defaultSessionId =\n fields.defaultSessionId ?? \"langchain_store_session\";\n this.defaultStrategy = fields.defaultStrategy ?? \"kv_cache\";\n this.ttlSeconds = fields.ttlSeconds;\n }\n\n /**\n * Get prefixed key with namespace\n */\n private _getPrefixedKey(key: string): string {\n if (this.namespace) {\n const delimiter = \"/\";\n return `${this.namespace}${delimiter}${key}`;\n }\n return key;\n }\n\n /**\n * Remove prefix from key\n */\n private _getDeprefixedKey(key: string): string {\n if (this.namespace) {\n const delimiter = \"/\";\n return key.slice(this.namespace.length + delimiter.length);\n }\n return key;\n }\n\n /**\n * Get or create session for the store\n */\n private async _getSession(): Promise<string> {\n if (this.sessionCache) {\n return this.sessionCache;\n }\n\n try {\n // Try to find existing session\n const sessions = await this.client.querySessions({\n limit: 1,\n });\n\n if (sessions.sessions && sessions.sessions.length > 0) {\n this.sessionCache = sessions.sessions[0].sessionId;\n } else {\n // Create new session\n const result = await this.client.createSession({\n name: `langchain_store_${this.namespace || \"default\"}`,\n });\n this.sessionCache = result.sessionId;\n }\n\n return this.sessionCache!;\n } catch (error) {\n // Fallback to default session\n return this.defaultSessionId;\n }\n }\n\n /**\n * Create record content for storage\n */\n private _createRecordContent(key: string, value: Uint8Array): string {\n const decoder = new TextDecoder();\n const content = {\n key: this._getPrefixedKey(key),\n value: decoder.decode(value),\n timestamp: Date.now(),\n ttl: this.ttlSeconds,\n };\n return JSON.stringify(content);\n }\n\n /**\n * Parse record content from storage\n */\n private _parseRecordContent(\n content: string\n ): {\n key: string;\n value: Uint8Array;\n timestamp: number;\n ttl?: number;\n } | null {\n try {\n const data = JSON.parse(content);\n const encoder = new TextEncoder();\n\n // Check TTL if present\n if (data.ttl && data.timestamp) {\n const now = Date.now();\n if (now > data.timestamp + data.ttl * 1000) {\n return null; // Expired\n }\n }\n\n return {\n key: data.key,\n value: encoder.encode(data.value),\n timestamp: data.timestamp,\n ttl: data.ttl,\n };\n } catch (error) {\n return null;\n }\n }\n\n /**\n * Gets multiple keys from the TDAI store.\n * @param keys Array of keys to be retrieved.\n * @returns An array of retrieved values.\n */\n async mget(keys: string[]): Promise<(Uint8Array | undefined)[]> {\n if (keys.length === 0) {\n return [];\n }\n\n try {\n const sessionId = await this._getSession();\n const results: (Uint8Array | undefined)[] = new Array(keys.length);\n\n // Search for each key individually due to TDAI API limitations\n for (let i = 0; i < keys.length; i++) {\n const prefixedKey = this._getPrefixedKey(keys[i]);\n\n try {\n const searchResult = await this.client.searchRecords({\n content: prefixedKey,\n sessionId,\n strategies: [this.defaultStrategy],\n limit: 1,\n });\n\n if (searchResult.records && searchResult.records.length > 0) {\n const record = searchResult.records[0];\n const parsed = this._parseRecordContent(record.record_content);\n\n if (parsed && parsed.key === prefixedKey) {\n results[i] = parsed.value;\n } else {\n results[i] = undefined;\n }\n } else {\n results[i] = undefined;\n }\n } catch (error) {\n results[i] = undefined;\n }\n }\n\n return results;\n } catch (error) {\n // Return array of undefined values on error\n return new Array(keys.length).fill(undefined);\n }\n }\n\n /**\n * Sets multiple keys in the TDAI store.\n * @param keyValuePairs Array of key-value pairs to be set.\n * @returns Promise that resolves when all keys have been set.\n */\n async mset(keyValuePairs: [string, Uint8Array][]): Promise<void> {\n if (keyValuePairs.length === 0) {\n return;\n }\n\n try {\n const sessionId = await this._getSession();\n\n // Set each key-value pair\n for (const [key, value] of keyValuePairs) {\n const content = this._createRecordContent(key, value);\n\n try {\n await this.client.appendRecord({\n sessionId,\n content,\n strategy: this.defaultStrategy,\n });\n } catch (error) {\n console.warn(`Failed to set key ${key}:`, error);\n }\n }\n } catch (error) {\n throw new Error(`Failed to set keys: ${error}`);\n }\n }\n\n /**\n * Deletes multiple keys from the TDAI store.\n * @param keys Array of keys to be deleted.\n * @returns Promise that resolves when all keys have been deleted.\n */\n async mdelete(keys: string[]): Promise<void> {\n if (keys.length === 0) {\n return;\n }\n\n try {\n const sessionId = await this._getSession();\n\n // Delete each key individually\n for (const key of keys) {\n const prefixedKey = this._getPrefixedKey(key);\n\n try {\n // First find the record\n const searchResult = await this.client.searchRecords({\n content: prefixedKey,\n sessionId,\n strategies: [this.defaultStrategy],\n limit: 1,\n });\n\n if (searchResult.records && searchResult.records.length > 0) {\n const record = searchResult.records[0];\n await this.client.deleteRecord({\n sessionId,\n recordId: record.record_id,\n });\n }\n } catch (error) {\n console.warn(`Failed to delete key ${key}:`, error);\n }\n }\n } catch (error) {\n throw new Error(`Failed to delete keys: ${error}`);\n }\n }\n\n /**\n * Yields keys from the TDAI store.\n * @param prefix Optional prefix to filter the keys.\n * @returns An AsyncGenerator that yields keys from the TDAI store.\n */\n async *yieldKeys(prefix?: string): AsyncGenerator<string> {\n try {\n const sessionId = await this._getSession();\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n try {\n const result = await this.client.queryRecords({\n sessionId,\n strategies: [this.defaultStrategy],\n limit: this.yieldKeysScanBatchSize,\n offset,\n });\n\n if (!result.records || result.records.length === 0) {\n hasMore = false;\n break;\n }\n\n for (const record of result.records) {\n const parsed = this._parseRecordContent(record.record_content);\n if (parsed) {\n const deprefixedKey = this._getDeprefixedKey(parsed.key);\n\n if (!prefix || deprefixedKey.startsWith(prefix)) {\n yield deprefixedKey;\n }\n }\n }\n\n offset += result.records.length;\n\n // If we got fewer records than requested, we've reached the end\n if (result.records.length < this.yieldKeysScanBatchSize) {\n hasMore = false;\n }\n } catch (error) {\n console.warn(`Error yielding keys at offset ${offset}:`, error);\n hasMore = false;\n }\n }\n } catch (error) {\n console.warn(\"Error yielding keys:\", error);\n }\n }\n\n /**\n * Close the TDAI client connection\n */\n close(): void {\n this.client.close();\n }\n}\n\n","/**\n * AG-Kit BaseTool to LangChain Tool Converter and Vice Versa\n */\nimport { tool as langChainTool, StructuredTool } from \"@langchain/core/tools\";\nimport {\n BaseTool,\n tool as agKitTool,\n ToolResult,\n ToolExecutionContext,\n} from \"@cloudbase/agent-tools\";\nimport { z } from \"zod/v4\";\n\n/**\n * Convert AG-Kit BaseTool to LangChain DynamicStructuredTool\n *\n * @param agkitTool - AG-Kit BaseTool instance\n * @param implFunc - Optional custom implementation function\n * @returns LangChain DynamicStructuredTool instance\n */\nexport function convert2LangChain(\n agkitTool: BaseTool,\n implFunc?: (tool: BaseTool) => Function\n) {\n const func =\n implFunc ||\n (async (input: any) => {\n const result = await agkitTool.invoke(input);\n return result;\n });\n\n return langChainTool(func as any, {\n name: agkitTool.name,\n description: agkitTool.description || agkitTool.name,\n schema: (agkitTool as any).schema || z.object({}),\n });\n}\n\n/**\n * Convert LangChain Tool to AG-Kit DynamicTool\n *\n * @param langchainTool - LangChain tool instance (DynamicStructuredTool or StructuredTool)\n * @returns AG-Kit DynamicTool instance\n */\nexport function convertLangChain2AGKit(langchainTool: StructuredTool) {\n const func: any = async (\n input: Record<string, any>,\n context?: ToolExecutionContext\n ) => {\n try {\n // Call the LangChain tool\n const result = await langchainTool.invoke(input);\n\n // Return successful result\n return new ToolResult({\n success: true,\n data: result,\n });\n } catch (error) {\n // Handle errors and return ToolResult with error\n return new ToolResult({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n error_type: \"execution\",\n });\n }\n };\n\n return agKitTool(func, {\n name: langchainTool.name,\n description: langchainTool.description || langchainTool.name,\n schema: (langchainTool as any).schema || (z.object({}) as z.ZodObject<any>),\n });\n}\n\n","import { z } from \"zod/v3\";\nimport { AgentConfig } from \"@ag-ui/client\";\nimport { LanggraphAgent } from \"@cloudbase/agent-adapter-langgraph\";\nimport { createAgent, createMiddleware, DynamicTool } from \"langchain\";\n\nexport class LangchainAgent extends LanggraphAgent {\n constructor(\n config: AgentConfig & {\n agent: ReturnType<typeof createAgent>;\n }\n ) {\n super({ ...config, compiledWorkflow: config.agent });\n }\n}\n\nexport function clientTools() {\n return createMiddleware({\n name: \"ClientTools\",\n stateSchema: z.object({\n client: z.object({\n tools: z.array(\n z.object({\n name: z.string(),\n description: z.string(),\n schema: z.any(),\n })\n ),\n }),\n }),\n beforeModel: (state) => state,\n wrapModelCall: (request, hanlder) => {\n const clientTools = (\n (request.state.client.tools || []) as DynamicTool[]\n ).map((tool) => {\n const { name, description, schema } = tool;\n return {\n name,\n description,\n schema,\n };\n });\n\n return hanlder({\n ...request,\n tools: [...(request.tools || []), ...clientTools],\n });\n },\n });\n}\n","import { BaseListChatMessageHistory } from \"@langchain/core/chat_history\";\nimport {\n BaseMessage,\n mapStoredMessagesToChatMessages,\n mapChatMessagesToStoredMessages,\n StoredMessage,\n} from \"@langchain/core/messages\";\nimport { IMemoryClientOptions, MemoryClient } from \"@cloudbase/agent-agents\";\n\nexport class TDAIChatHistory extends BaseListChatMessageHistory {\n lc_namespace = [\"langchain\", \"stores\", \"message\", \"tdai\"];\n\n public client: MemoryClient;\n\n private sessionId: string;\n\n constructor(options: IMemoryClientOptions & { sessionId: string }) {\n super();\n const { sessionId, ...clientOptions } = options;\n this.client = new MemoryClient({\n ...clientOptions,\n });\n this.sessionId = options.sessionId;\n }\n\n async getMessages(): Promise<BaseMessage[]> {\n const { events = [] } = await this.client.queryEvents({\n sessionId: this.sessionId,\n });\n\n return mapStoredMessagesToChatMessages(\n events.map((event) => {\n return {\n type: event.type,\n data: event.data,\n };\n })\n );\n }\n\n /**\n * Method to add a new message to the Firestore collection. The message is\n * passed as a BaseMessage object.\n * @param message The message to be added as a BaseMessage object.\n */\n public async addMessage(message: BaseMessage) {\n const messages = mapChatMessagesToStoredMessages([message]);\n await this.appendMessage(messages[0]);\n }\n\n private async appendMessage(message: StoredMessage): Promise<void> {\n await this.client.appendEvent({\n sessionId: this.sessionId,\n messages: message,\n });\n }\n\n /**\n * Method to delete all messages from the Firestore collection associated\n * with the current session.\n */\n public async clear(): Promise<void> {\n const eventIds = await this.client\n .queryEvents({\n sessionId: this.sessionId,\n })\n .then(({ events = [] }) => events.map((event: any) => event.event_id));\n\n await Promise.all(\n eventIds.map((id: string) => {\n return this.client.deleteEvent({\n sessionId: this.sessionId,\n eventId: id,\n });\n })\n );\n\n await this.client.deleteSession({\n sessionId: this.sessionId,\n });\n }\n}\n\n"],"mappings":"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","names":["z","clientTools"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudbase/agent-adapter-langchain",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"description": "LangChain adapter for AG-Kit agents",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/",
|
|
@@ -36,17 +36,18 @@
|
|
|
36
36
|
"typescript": "^5.0.0"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
+
"@ag-ui/client": "0.0.42",
|
|
39
40
|
"@langchain/core": "^1.0.2",
|
|
40
41
|
"langchain": "^1.0.2",
|
|
41
42
|
"zod": "^3.25.0 || ^4.0.0",
|
|
42
|
-
"@cloudbase/agent-adapter-langgraph": "0.0.
|
|
43
|
-
"@cloudbase/agent-
|
|
44
|
-
"@cloudbase/agent-
|
|
43
|
+
"@cloudbase/agent-adapter-langgraph": "0.0.6",
|
|
44
|
+
"@cloudbase/agent-agents": "0.0.6",
|
|
45
|
+
"@cloudbase/agent-tools": "0.0.6"
|
|
45
46
|
},
|
|
46
47
|
"peerDependencies": {
|
|
47
48
|
"zod": "^3.25.0 || ^4.0.0",
|
|
48
|
-
"@cloudbase/agent-agents": "0.0.
|
|
49
|
-
"@cloudbase/agent-adapter-langgraph": "0.0.
|
|
49
|
+
"@cloudbase/agent-agents": "0.0.6",
|
|
50
|
+
"@cloudbase/agent-adapter-langgraph": "0.0.6"
|
|
50
51
|
},
|
|
51
52
|
"scripts": {
|
|
52
53
|
"test": "echo \"Error: no test specified\" && exit 1",
|