@cloudbase/agent-adapter-langchain 1.0.1-alpha.7 → 1.0.1-alpha.9
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 +28 -0
- package/README.md +97 -0
- package/dist/index.d.mts +4 -40
- package/dist/index.d.ts +4 -40
- package/dist/index.js +13 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# @cloudbase/agent-adapter-langchain
|
|
2
2
|
|
|
3
|
+
## 1.0.1-alpha.8
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- alpha release 0.1.2-alpha.1
|
|
8
|
+
- Update all public packages to version 0.1.2-alpha.1
|
|
9
|
+
- Trigger automated alpha release workflow
|
|
10
|
+
- Includes latest features and improvements
|
|
11
|
+
|
|
12
|
+
- Updated dependencies
|
|
13
|
+
- @cloudbase/agent-tools@1.0.1-alpha.8
|
|
14
|
+
- @cloudbase/agent-agents@1.0.1-alpha.8
|
|
15
|
+
- @cloudbase/agent-adapter-langgraph@1.0.1-alpha.8
|
|
16
|
+
|
|
17
|
+
## 1.0.1-alpha.7
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- alpha release 0.1.2-alpha.1
|
|
22
|
+
- Update all public packages to version 0.1.2-alpha.1
|
|
23
|
+
- Trigger automated alpha release workflow
|
|
24
|
+
- Includes latest features and improvements
|
|
25
|
+
|
|
26
|
+
- Updated dependencies
|
|
27
|
+
- @cloudbase/agent-tools@1.0.1-alpha.7
|
|
28
|
+
- @cloudbase/agent-agents@1.0.1-alpha.7
|
|
29
|
+
- @cloudbase/agent-adapter-langgraph@1.0.1-alpha.7
|
|
30
|
+
|
|
3
31
|
## 1.0.1-alpha.6
|
|
4
32
|
|
|
5
33
|
### Patch Changes
|
package/README.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# @cloudbase/agent-adapter-langchain
|
|
2
|
+
|
|
3
|
+
将 LangChain Agent 转换为符合 [AG-UI 协议](https://docs.ag-ui.com) 的 Agent。
|
|
4
|
+
|
|
5
|
+
## 功能
|
|
6
|
+
|
|
7
|
+
- **LangchainAgent**:将 LangChain 的 `createAgent()` 创建的 Agent 包装为 AG-UI 兼容的 Agent
|
|
8
|
+
- **clientTools()**:中间件,让客户端可以动态注入工具到 Agent 调用中
|
|
9
|
+
|
|
10
|
+
## 安装
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install @cloudbase/agent-adapter-langchain
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## 快速开始
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import { run } from "@cloudbase/agent-server";
|
|
20
|
+
import { createAgent as createLangchainAgent } from "langchain";
|
|
21
|
+
import { MemorySaver } from "@langchain/langgraph";
|
|
22
|
+
import { ChatOpenAI } from "@langchain/openai";
|
|
23
|
+
import { LangchainAgent, clientTools } from "@cloudbase/agent-adapter-langchain";
|
|
24
|
+
|
|
25
|
+
const checkpointer = new MemorySaver();
|
|
26
|
+
|
|
27
|
+
const model = new ChatOpenAI({
|
|
28
|
+
model: process.env.OPENAI_MODEL!,
|
|
29
|
+
apiKey: process.env.OPENAI_API_KEY!,
|
|
30
|
+
configuration: {
|
|
31
|
+
baseURL: process.env.OPENAI_BASE_URL,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// 创建 LangChain Agent,使用 clientTools 中间件支持客户端工具
|
|
36
|
+
const lcAgent = createLangchainAgent({
|
|
37
|
+
model,
|
|
38
|
+
checkpointer,
|
|
39
|
+
middleware: [clientTools()],
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// 部署为 HTTP 服务
|
|
43
|
+
run({
|
|
44
|
+
createAgent: () => ({
|
|
45
|
+
agent: new LangchainAgent({ agent: lcAgent }),
|
|
46
|
+
}),
|
|
47
|
+
port: 9000,
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## API 参考
|
|
52
|
+
|
|
53
|
+
### LangchainAgent
|
|
54
|
+
|
|
55
|
+
将 LangChain Agent 包装为 AG-UI 兼容的 Agent。
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
type LangchainAgentConfig = AgentConfig & {
|
|
59
|
+
agent: ReturnType<typeof createAgent>; // LangChain 的 createAgent() 返回值
|
|
60
|
+
logger?: Logger; // 可选,日志实例
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const agent = new LangchainAgent(config);
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
- `AgentConfig`:来自 [AG-UI 协议](https://docs.ag-ui.com)
|
|
67
|
+
- `Logger`:日志接口,详见 [@cloudbase/agent-server 文档](https://www.npmjs.com/package/@cloudbase/agent-server)
|
|
68
|
+
|
|
69
|
+
### clientTools()
|
|
70
|
+
|
|
71
|
+
创建一个中间件,让客户端可以动态注入工具到 Agent 调用中。
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
const agent = createAgent({
|
|
75
|
+
model,
|
|
76
|
+
checkpointer,
|
|
77
|
+
middleware: [clientTools()],
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
客户端定义的工具会与服务端工具合并使用。
|
|
82
|
+
|
|
83
|
+
## 依赖
|
|
84
|
+
|
|
85
|
+
- `langchain`:LangChain Agent 框架
|
|
86
|
+
- `@langchain/langgraph`:Agent 会话记忆(MemorySaver)
|
|
87
|
+
- `@langchain/openai`:OpenAI 兼容模型接入
|
|
88
|
+
|
|
89
|
+
## 文档
|
|
90
|
+
|
|
91
|
+
📚 完整文档请参阅 [云开发 Agent 开发指南](https://docs.cloudbase.net/ai/agent-development/)
|
|
92
|
+
|
|
93
|
+
## 相关资源
|
|
94
|
+
|
|
95
|
+
- [AG-UI 协议](https://docs.ag-ui.com)
|
|
96
|
+
- [LangChain 官方文档](https://js.langchain.com/)
|
|
97
|
+
|
package/dist/index.d.mts
CHANGED
|
@@ -5,7 +5,7 @@ import { BaseTool } from '@cloudbase/agent-tools';
|
|
|
5
5
|
import * as langchain from 'langchain';
|
|
6
6
|
import { createAgent } from 'langchain';
|
|
7
7
|
import { StructuredTool } from '@langchain/core/tools';
|
|
8
|
-
import { z } from 'zod/
|
|
8
|
+
import { z } from 'zod/v4';
|
|
9
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';
|
|
@@ -154,45 +154,9 @@ declare function clientTools(): langchain.AgentMiddleware<z.ZodObject<{
|
|
|
154
154
|
name: z.ZodString;
|
|
155
155
|
description: z.ZodString;
|
|
156
156
|
schema: z.ZodAny;
|
|
157
|
-
},
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
schema?: any;
|
|
161
|
-
}, {
|
|
162
|
-
name: string;
|
|
163
|
-
description: string;
|
|
164
|
-
schema?: any;
|
|
165
|
-
}>, "many">;
|
|
166
|
-
}, "strip", z.ZodTypeAny, {
|
|
167
|
-
tools: {
|
|
168
|
-
name: string;
|
|
169
|
-
description: string;
|
|
170
|
-
schema?: any;
|
|
171
|
-
}[];
|
|
172
|
-
}, {
|
|
173
|
-
tools: {
|
|
174
|
-
name: string;
|
|
175
|
-
description: string;
|
|
176
|
-
schema?: any;
|
|
177
|
-
}[];
|
|
178
|
-
}>;
|
|
179
|
-
}, "strip", z.ZodTypeAny, {
|
|
180
|
-
client: {
|
|
181
|
-
tools: {
|
|
182
|
-
name: string;
|
|
183
|
-
description: string;
|
|
184
|
-
schema?: any;
|
|
185
|
-
}[];
|
|
186
|
-
};
|
|
187
|
-
}, {
|
|
188
|
-
client: {
|
|
189
|
-
tools: {
|
|
190
|
-
name: string;
|
|
191
|
-
description: string;
|
|
192
|
-
schema?: any;
|
|
193
|
-
}[];
|
|
194
|
-
};
|
|
195
|
-
}>, undefined, any>;
|
|
157
|
+
}, z.core.$strip>>;
|
|
158
|
+
}, z.core.$strip>;
|
|
159
|
+
}, z.core.$strip>, undefined, any>;
|
|
196
160
|
|
|
197
161
|
declare class TDAIChatHistory extends BaseListChatMessageHistory {
|
|
198
162
|
lc_namespace: string[];
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { BaseTool } from '@cloudbase/agent-tools';
|
|
|
5
5
|
import * as langchain from 'langchain';
|
|
6
6
|
import { createAgent } from 'langchain';
|
|
7
7
|
import { StructuredTool } from '@langchain/core/tools';
|
|
8
|
-
import { z } from 'zod/
|
|
8
|
+
import { z } from 'zod/v4';
|
|
9
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';
|
|
@@ -154,45 +154,9 @@ declare function clientTools(): langchain.AgentMiddleware<z.ZodObject<{
|
|
|
154
154
|
name: z.ZodString;
|
|
155
155
|
description: z.ZodString;
|
|
156
156
|
schema: z.ZodAny;
|
|
157
|
-
},
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
schema?: any;
|
|
161
|
-
}, {
|
|
162
|
-
name: string;
|
|
163
|
-
description: string;
|
|
164
|
-
schema?: any;
|
|
165
|
-
}>, "many">;
|
|
166
|
-
}, "strip", z.ZodTypeAny, {
|
|
167
|
-
tools: {
|
|
168
|
-
name: string;
|
|
169
|
-
description: string;
|
|
170
|
-
schema?: any;
|
|
171
|
-
}[];
|
|
172
|
-
}, {
|
|
173
|
-
tools: {
|
|
174
|
-
name: string;
|
|
175
|
-
description: string;
|
|
176
|
-
schema?: any;
|
|
177
|
-
}[];
|
|
178
|
-
}>;
|
|
179
|
-
}, "strip", z.ZodTypeAny, {
|
|
180
|
-
client: {
|
|
181
|
-
tools: {
|
|
182
|
-
name: string;
|
|
183
|
-
description: string;
|
|
184
|
-
schema?: any;
|
|
185
|
-
}[];
|
|
186
|
-
};
|
|
187
|
-
}, {
|
|
188
|
-
client: {
|
|
189
|
-
tools: {
|
|
190
|
-
name: string;
|
|
191
|
-
description: string;
|
|
192
|
-
schema?: any;
|
|
193
|
-
}[];
|
|
194
|
-
};
|
|
195
|
-
}>, undefined, any>;
|
|
157
|
+
}, z.core.$strip>>;
|
|
158
|
+
}, z.core.$strip>;
|
|
159
|
+
}, z.core.$strip>, undefined, any>;
|
|
196
160
|
|
|
197
161
|
declare class TDAIChatHistory extends BaseListChatMessageHistory {
|
|
198
162
|
lc_namespace: string[];
|
package/dist/index.js
CHANGED
|
@@ -317,26 +317,30 @@ function convertLangChain2AGKit(langchainTool) {
|
|
|
317
317
|
}
|
|
318
318
|
|
|
319
319
|
// src/agent.ts
|
|
320
|
-
var
|
|
320
|
+
var import_v42 = require("zod/v4");
|
|
321
321
|
var import_agent_adapter_langgraph = require("@cloudbase/agent-adapter-langgraph");
|
|
322
322
|
var import_langchain = require("langchain");
|
|
323
323
|
var import_messages = require("@langchain/core/messages");
|
|
324
324
|
var import_langgraph = require("@langchain/langgraph");
|
|
325
325
|
var LangchainAgent = class extends import_agent_adapter_langgraph.LanggraphAgent {
|
|
326
326
|
constructor(config) {
|
|
327
|
-
super({
|
|
327
|
+
super({
|
|
328
|
+
...config,
|
|
329
|
+
compiledWorkflow: config.agent,
|
|
330
|
+
adapterName: "LangChain"
|
|
331
|
+
});
|
|
328
332
|
}
|
|
329
333
|
};
|
|
330
334
|
function clientTools() {
|
|
331
335
|
return (0, import_langchain.createMiddleware)({
|
|
332
336
|
name: "ClientTools",
|
|
333
|
-
stateSchema:
|
|
334
|
-
client:
|
|
335
|
-
tools:
|
|
336
|
-
|
|
337
|
-
name:
|
|
338
|
-
description:
|
|
339
|
-
schema:
|
|
337
|
+
stateSchema: import_v42.z.object({
|
|
338
|
+
client: import_v42.z.object({
|
|
339
|
+
tools: import_v42.z.array(
|
|
340
|
+
import_v42.z.object({
|
|
341
|
+
name: import_v42.z.string(),
|
|
342
|
+
description: import_v42.z.string(),
|
|
343
|
+
schema: import_v42.z.any()
|
|
340
344
|
})
|
|
341
345
|
)
|
|
342
346
|
})
|
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 \"@ag-ui/client\";\nimport { LanggraphAgent } from \"@cloudbase/agent-adapter-langgraph\";\nimport { createAgent, createMiddleware, DynamicTool } from \"langchain\";\nimport { AIMessage } from \"@langchain/core/messages\";\nimport { END } from \"@langchain/langgraph\";\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\n // Add frontend tools to LLM's tool list\n wrapModelCall: (request, handler) => {\n const clientToolsList = (\n (request.state.client?.tools || []) as DynamicTool[]\n ).map((tool) => {\n const { name, description, schema } = tool;\n return { name, description, schema };\n });\n\n return handler({\n ...request,\n tools: [...(request.tools || []), ...clientToolsList],\n });\n },\n\n // After model: check if all tool calls are frontend actions\n // If so, skip ToolNode by jumping to END\n // Note: #createAfterModelRouter does direct comparison (jumpTo === END),\n // NOT using parseJumpToTarget(), so we must use the actual END constant.\n // Using \"as any\" to bypass TypeScript type mismatch (bug in langchain types).\n afterModel: {\n canJumpTo: [END as any],\n hook: (state) => {\n const messages = state.messages || [];\n const lastMessage = messages.at(-1);\n\n // Check if last message is AIMessage with tool calls\n if (!AIMessage.isInstance(lastMessage)) return;\n if (!lastMessage.tool_calls || lastMessage.tool_calls.length === 0)\n return;\n\n // Get frontend tool names\n const clientToolNames = new Set(\n ((state.client?.tools || []) as DynamicTool[]).map((t) => t.name)\n );\n\n // If no frontend tools defined, let it go to ToolNode normally\n if (clientToolNames.size === 0) return;\n\n // Check if ANY tool call is a frontend action\n const anyClientTool = lastMessage.tool_calls.some((call) =>\n clientToolNames.has(call.name)\n );\n\n if (anyClientTool) {\n // Has frontend action, skip ToolNode and let frontend handle it\n return { jumpTo: END as any };\n }\n\n // All are server-side tools, let ToolNode handle them\n return;\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","import_messages"]}
|
|
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/v4\";\nimport { AgentConfig } from \"@ag-ui/client\";\nimport { LanggraphAgent } from \"@cloudbase/agent-adapter-langgraph\";\nimport { createAgent, createMiddleware, DynamicTool } from \"langchain\";\nimport { AIMessage } from \"@langchain/core/messages\";\nimport { END } from \"@langchain/langgraph\";\n\nexport class LangchainAgent extends LanggraphAgent {\n constructor(\n config: AgentConfig & {\n agent: ReturnType<typeof createAgent>;\n }\n ) {\n super({\n ...config,\n compiledWorkflow: config.agent,\n adapterName: \"LangChain\",\n } as any);\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\n // Add frontend tools to LLM's tool list\n wrapModelCall: (request, handler) => {\n const clientToolsList = (\n (request.state.client?.tools || []) as DynamicTool[]\n ).map((tool) => {\n const { name, description, schema } = tool;\n return { name, description, schema };\n });\n\n return handler({\n ...request,\n tools: [...(request.tools || []), ...clientToolsList],\n });\n },\n\n // After model: check if all tool calls are frontend actions\n // If so, skip ToolNode by jumping to END\n // Note: #createAfterModelRouter does direct comparison (jumpTo === END),\n // NOT using parseJumpToTarget(), so we must use the actual END constant.\n // Using \"as any\" to bypass TypeScript type mismatch (bug in langchain types).\n afterModel: {\n canJumpTo: [END as any],\n hook: (state) => {\n const messages = state.messages || [];\n const lastMessage = messages.at(-1);\n\n // Check if last message is AIMessage with tool calls\n if (!AIMessage.isInstance(lastMessage)) return;\n if (!lastMessage.tool_calls || lastMessage.tool_calls.length === 0)\n return;\n\n // Get frontend tool names\n const clientToolNames = new Set(\n ((state.client?.tools || []) as DynamicTool[]).map((t) => t.name)\n );\n\n // If no frontend tools defined, let it go to ToolNode normally\n if (clientToolNames.size === 0) return;\n\n // Check if ANY tool call is a frontend action\n const anyClientTool = lastMessage.tool_calls.some((call) =>\n clientToolNames.has(call.name)\n );\n\n if (anyClientTool) {\n // Has frontend action, skip ToolNode and let frontend handle it\n return { jumpTo: END as any };\n }\n\n // All are server-side tools, let ToolNode handle them\n return;\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","import_v4","import_messages"]}
|
package/dist/index.mjs
CHANGED
|
@@ -289,14 +289,18 @@ function convertLangChain2AGKit(langchainTool) {
|
|
|
289
289
|
}
|
|
290
290
|
|
|
291
291
|
// src/agent.ts
|
|
292
|
-
import { z as z2 } from "zod/
|
|
292
|
+
import { z as z2 } from "zod/v4";
|
|
293
293
|
import { LanggraphAgent } from "@cloudbase/agent-adapter-langgraph";
|
|
294
294
|
import { createMiddleware } from "langchain";
|
|
295
295
|
import { AIMessage } from "@langchain/core/messages";
|
|
296
296
|
import { END } from "@langchain/langgraph";
|
|
297
297
|
var LangchainAgent = class extends LanggraphAgent {
|
|
298
298
|
constructor(config) {
|
|
299
|
-
super({
|
|
299
|
+
super({
|
|
300
|
+
...config,
|
|
301
|
+
compiledWorkflow: config.agent,
|
|
302
|
+
adapterName: "LangChain"
|
|
303
|
+
});
|
|
300
304
|
}
|
|
301
305
|
};
|
|
302
306
|
function clientTools() {
|
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 \"@ag-ui/client\";\nimport { LanggraphAgent } from \"@cloudbase/agent-adapter-langgraph\";\nimport { createAgent, createMiddleware, DynamicTool } from \"langchain\";\nimport { AIMessage } from \"@langchain/core/messages\";\nimport { END } from \"@langchain/langgraph\";\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\n // Add frontend tools to LLM's tool list\n wrapModelCall: (request, handler) => {\n const clientToolsList = (\n (request.state.client?.tools || []) as DynamicTool[]\n ).map((tool) => {\n const { name, description, schema } = tool;\n return { name, description, schema };\n });\n\n return handler({\n ...request,\n tools: [...(request.tools || []), ...clientToolsList],\n });\n },\n\n // After model: check if all tool calls are frontend actions\n // If so, skip ToolNode by jumping to END\n // Note: #createAfterModelRouter does direct comparison (jumpTo === END),\n // NOT using parseJumpToTarget(), so we must use the actual END constant.\n // Using \"as any\" to bypass TypeScript type mismatch (bug in langchain types).\n afterModel: {\n canJumpTo: [END as any],\n hook: (state) => {\n const messages = state.messages || [];\n const lastMessage = messages.at(-1);\n\n // Check if last message is AIMessage with tool calls\n if (!AIMessage.isInstance(lastMessage)) return;\n if (!lastMessage.tool_calls || lastMessage.tool_calls.length === 0)\n return;\n\n // Get frontend tool names\n const clientToolNames = new Set(\n ((state.client?.tools || []) as DynamicTool[]).map((t) => t.name)\n );\n\n // If no frontend tools defined, let it go to ToolNode normally\n if (clientToolNames.size === 0) return;\n\n // Check if ANY tool call is a frontend action\n const anyClientTool = lastMessage.tool_calls.some((call) =>\n clientToolNames.has(call.name)\n );\n\n if (anyClientTool) {\n // Has frontend action, skip ToolNode and let frontend handle it\n return { jumpTo: END as any };\n }\n\n // All are server-side tools, let ToolNode handle them\n return;\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/v4\";\nimport { AgentConfig } from \"@ag-ui/client\";\nimport { LanggraphAgent } from \"@cloudbase/agent-adapter-langgraph\";\nimport { createAgent, createMiddleware, DynamicTool } from \"langchain\";\nimport { AIMessage } from \"@langchain/core/messages\";\nimport { END } from \"@langchain/langgraph\";\n\nexport class LangchainAgent extends LanggraphAgent {\n constructor(\n config: AgentConfig & {\n agent: ReturnType<typeof createAgent>;\n }\n ) {\n super({\n ...config,\n compiledWorkflow: config.agent,\n adapterName: \"LangChain\",\n } as any);\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\n // Add frontend tools to LLM's tool list\n wrapModelCall: (request, handler) => {\n const clientToolsList = (\n (request.state.client?.tools || []) as DynamicTool[]\n ).map((tool) => {\n const { name, description, schema } = tool;\n return { name, description, schema };\n });\n\n return handler({\n ...request,\n tools: [...(request.tools || []), ...clientToolsList],\n });\n },\n\n // After model: check if all tool calls are frontend actions\n // If so, skip ToolNode by jumping to END\n // Note: #createAfterModelRouter does direct comparison (jumpTo === END),\n // NOT using parseJumpToTarget(), so we must use the actual END constant.\n // Using \"as any\" to bypass TypeScript type mismatch (bug in langchain types).\n afterModel: {\n canJumpTo: [END as any],\n hook: (state) => {\n const messages = state.messages || [];\n const lastMessage = messages.at(-1);\n\n // Check if last message is AIMessage with tool calls\n if (!AIMessage.isInstance(lastMessage)) return;\n if (!lastMessage.tool_calls || lastMessage.tool_calls.length === 0)\n return;\n\n // Get frontend tool names\n const clientToolNames = new Set(\n ((state.client?.tools || []) as DynamicTool[]).map((t) => t.name)\n );\n\n // If no frontend tools defined, let it go to ToolNode normally\n if (clientToolNames.size === 0) return;\n\n // Check if ANY tool call is a frontend action\n const anyClientTool = lastMessage.tool_calls.some((call) =>\n clientToolNames.has(call.name)\n );\n\n if (anyClientTool) {\n // Has frontend action, skip ToolNode and let frontend handle it\n return { jumpTo: END as any };\n }\n\n // All are server-side tools, let ToolNode handle them\n return;\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudbase/agent-adapter-langchain",
|
|
3
|
-
"version": "1.0.1-alpha.
|
|
3
|
+
"version": "1.0.1-alpha.9",
|
|
4
4
|
"description": "LangChain adapter for AG-Kit agents",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/",
|
|
@@ -33,22 +33,22 @@
|
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@types/node": "^20.0.0",
|
|
35
35
|
"tsup": "^8.5.0",
|
|
36
|
-
"typescript": "^5.0.0"
|
|
36
|
+
"typescript": "^5.0.0",
|
|
37
|
+
"zod": "^4.0.0"
|
|
37
38
|
},
|
|
38
39
|
"dependencies": {
|
|
39
40
|
"@ag-ui/client": "0.0.42",
|
|
40
41
|
"@langchain/core": "^1.0.2",
|
|
41
42
|
"@langchain/langgraph": "^1.0.7",
|
|
42
43
|
"langchain": "^1.0.2",
|
|
43
|
-
"
|
|
44
|
-
"@cloudbase/agent-
|
|
45
|
-
"@cloudbase/agent-
|
|
46
|
-
"@cloudbase/agent-tools": "1.0.1-alpha.7"
|
|
44
|
+
"@cloudbase/agent-agents": "1.0.1-alpha.9",
|
|
45
|
+
"@cloudbase/agent-adapter-langgraph": "1.0.1-alpha.9",
|
|
46
|
+
"@cloudbase/agent-tools": "1.0.1-alpha.9"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
49
|
"zod": "^3.25.0 || ^4.0.0",
|
|
50
|
-
"@cloudbase/agent-adapter-langgraph": "1.0.1-alpha.
|
|
51
|
-
"@cloudbase/agent-agents": "1.0.1-alpha.
|
|
50
|
+
"@cloudbase/agent-adapter-langgraph": "1.0.1-alpha.9",
|
|
51
|
+
"@cloudbase/agent-agents": "1.0.1-alpha.9"
|
|
52
52
|
},
|
|
53
53
|
"scripts": {
|
|
54
54
|
"test": "echo \"Error: no test specified\" && exit 1",
|