cantian-ai 0.0.27 → 0.0.29
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/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +3 -3
- package/dist/mcp.js.map +1 -1
- package/dist/models/BaseModel.d.ts +15 -17
- package/dist/models/BaseModel.js +98 -3
- package/dist/models/BaseModel.js.map +1 -1
- package/dist/models/DeepseekModel.d.ts +16 -4
- package/dist/models/DeepseekModel.js +17 -11
- package/dist/models/DeepseekModel.js.map +1 -1
- package/dist/tokenUsage.d.ts +3 -0
- package/dist/tokenUsage.js +38 -0
- package/dist/tokenUsage.js.map +1 -0
- package/dist/type.d.ts +12 -2
- package/dist/util.d.ts +7 -0
- package/dist/util.js +36 -0
- package/dist/util.js.map +1 -0
- package/package.json +3 -1
- package/dist/Agent.d.ts +0 -32
- package/dist/Agent.js +0 -127
- package/dist/Agent.js.map +0 -1
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC"}
|
package/dist/mcp.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Client } from '@modelcontextprotocol/sdk/client';
|
|
2
|
-
import {
|
|
2
|
+
import { Tool } from './type.js';
|
|
3
3
|
export declare const createMcpClient: (options: {
|
|
4
4
|
url: string;
|
|
5
5
|
authorization: string;
|
|
@@ -62,7 +62,7 @@ export declare const listTools: (client: Client) => Promise<{
|
|
|
62
62
|
openWorldHint?: boolean | undefined;
|
|
63
63
|
} | undefined;
|
|
64
64
|
execution?: {
|
|
65
|
-
taskSupport?: "
|
|
65
|
+
taskSupport?: "optional" | "required" | "forbidden" | undefined;
|
|
66
66
|
} | undefined;
|
|
67
67
|
_meta?: Record<string, unknown> | undefined;
|
|
68
68
|
icons?: {
|
|
@@ -167,4 +167,4 @@ export declare const callTool: (client: Client, name: string, args: any) => Prom
|
|
|
167
167
|
export declare const listAgentTools: (options: {
|
|
168
168
|
url: string;
|
|
169
169
|
authorization: string;
|
|
170
|
-
}) => Promise<
|
|
170
|
+
}) => Promise<Tool[]>;
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC1D,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAGjG,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,OAA+C,EAAE,EAAE;IACvF,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;KACnB,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE;QAChE,WAAW,EAAE;YACX,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,aAAa,EAAE;aACzC;SACF;KACF,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;IAChD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC;QACE,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,EAAE;KACX,EACD,qBAAqB,CACtB,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,IAAY,EAAE,IAAS,EAAE,EAAE;IACxE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC;QACE,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE;YACN,IAAI;YACJ,SAAS,EAAE,IAAI;SAChB;KACF,EACD,oBAAoB,CACrB,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,OAA+C,EAAE,EAAE;IACtF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;IAChC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC1D,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAGjG,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,OAA+C,EAAE,EAAE;IACvF,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;KACnB,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE;QAChE,WAAW,EAAE;YACX,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,aAAa,EAAE;aACzC;SACF;KACF,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;IAChD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC;QACE,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,EAAE;KACX,EACD,qBAAqB,CACtB,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,IAAY,EAAE,IAAS,EAAE,EAAE;IACxE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC;QACE,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE;YACN,IAAI;YACJ,SAAS,EAAE,IAAI;SAChB;KACF,EACD,oBAAoB,CACrB,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,OAA+C,EAAE,EAAE;IACtF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;IAChC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,MAAM,KAAK,GAAW,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,UAAU,EAAE,CAAC,CAAC,WAAW;QACzB,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO;YACzB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACtD,MAAM,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;YAChC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxC,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAClC,CAAC;YACD,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC1B,CAAC;KACF,CAAC,CAAC,CAAC;IACJ,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
|
|
@@ -1,28 +1,26 @@
|
|
|
1
1
|
import { Semaphore } from 'async-mutex';
|
|
2
|
-
import {
|
|
3
|
-
import { InputItem, ModelChunk, ToolDefinition } from '../type.js';
|
|
2
|
+
import { AgentChunk, InputItem, ModelChunk, Tool, UsageChunk } from '../type.js';
|
|
4
3
|
export type Options = {
|
|
5
|
-
|
|
6
|
-
type: 'enabled' | 'disabled' | 'auto';
|
|
7
|
-
};
|
|
8
|
-
reasoning?: {
|
|
9
|
-
effort: 'minimal' | 'low' | 'medium' | 'high';
|
|
10
|
-
};
|
|
11
|
-
temperature?: number;
|
|
12
|
-
tools?: ToolDefinition[];
|
|
4
|
+
tools?: Record<string, Tool>;
|
|
13
5
|
signal?: AbortSignal;
|
|
14
|
-
|
|
6
|
+
finalRound?: boolean;
|
|
7
|
+
logMeta?: any;
|
|
15
8
|
};
|
|
16
|
-
export declare class BaseModel {
|
|
9
|
+
export declare class BaseModel<T extends Options = Options> {
|
|
17
10
|
url: string;
|
|
18
11
|
apiKey: string;
|
|
19
12
|
model: string;
|
|
20
|
-
options?: Options | undefined;
|
|
21
13
|
semaphore: Semaphore;
|
|
22
|
-
constructor(url: string, apiKey: string, model: string
|
|
23
|
-
stream(messages: InputItem[], options?:
|
|
24
|
-
invoke(messages: InputItem[], options?:
|
|
14
|
+
constructor(url: string, apiKey: string, model: string);
|
|
15
|
+
stream(messages: InputItem[], options?: T): AsyncGenerator<ModelChunk>;
|
|
16
|
+
invoke(messages: InputItem[], options?: T): Promise<{
|
|
25
17
|
message: string;
|
|
26
|
-
usage
|
|
18
|
+
usage?: UsageChunk;
|
|
27
19
|
}>;
|
|
20
|
+
agenticStream(messages: any[], modelOptions: Omit<T, 'signal' | 'logMeta'>, options?: {
|
|
21
|
+
signal?: AbortSignal;
|
|
22
|
+
maxRounds?: number;
|
|
23
|
+
context?: any;
|
|
24
|
+
logMeta?: any;
|
|
25
|
+
}): AsyncGenerator<AgentChunk>;
|
|
28
26
|
}
|
package/dist/models/BaseModel.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { Semaphore } from 'async-mutex';
|
|
2
|
+
import { saveAgentUsage } from '../tokenUsage.js';
|
|
3
|
+
import { executeTool, isAsyncGenerator } from '../util.js';
|
|
4
|
+
const DEFAULT_MAX_ROUNDS = 10;
|
|
2
5
|
export class BaseModel {
|
|
3
6
|
url;
|
|
4
7
|
apiKey;
|
|
5
8
|
model;
|
|
6
|
-
options;
|
|
7
9
|
semaphore;
|
|
8
|
-
constructor(url, apiKey, model
|
|
10
|
+
constructor(url, apiKey, model) {
|
|
9
11
|
this.url = url;
|
|
10
12
|
this.apiKey = apiKey;
|
|
11
13
|
this.model = model;
|
|
12
|
-
this.options = options;
|
|
13
14
|
this.semaphore = new Semaphore(10);
|
|
14
15
|
}
|
|
15
16
|
async *stream(messages, options) {
|
|
@@ -18,5 +19,99 @@ export class BaseModel {
|
|
|
18
19
|
async invoke(messages, options) {
|
|
19
20
|
throw new Error('Method not implemented.');
|
|
20
21
|
}
|
|
22
|
+
async *agenticStream(messages, modelOptions, options) {
|
|
23
|
+
const input = [...messages];
|
|
24
|
+
let roundIndex = 0;
|
|
25
|
+
let toolCalls;
|
|
26
|
+
const maxRounds = options?.maxRounds || DEFAULT_MAX_ROUNDS;
|
|
27
|
+
const agentUsage = {
|
|
28
|
+
type: 'AGENT_USAGE',
|
|
29
|
+
model: this.model,
|
|
30
|
+
totalTokens: 0,
|
|
31
|
+
inputUsage: {
|
|
32
|
+
inputTokens: 0,
|
|
33
|
+
cachedTokens: 0,
|
|
34
|
+
},
|
|
35
|
+
outputUsage: {
|
|
36
|
+
outputTokens: 0,
|
|
37
|
+
reasoningTokens: 0,
|
|
38
|
+
},
|
|
39
|
+
firstTokenCostMs: 0,
|
|
40
|
+
totalCostMs: 0,
|
|
41
|
+
estimatedCost: 0,
|
|
42
|
+
rounds: [],
|
|
43
|
+
};
|
|
44
|
+
const startedTimestamp = Date.now();
|
|
45
|
+
do {
|
|
46
|
+
const response = this.stream(input, {
|
|
47
|
+
...modelOptions,
|
|
48
|
+
finalRound: roundIndex === maxRounds - 1,
|
|
49
|
+
signal: options?.signal,
|
|
50
|
+
});
|
|
51
|
+
toolCalls = [];
|
|
52
|
+
for await (const chunk of response) {
|
|
53
|
+
switch (chunk.type) {
|
|
54
|
+
case 'TOKEN':
|
|
55
|
+
case 'MESSAGE':
|
|
56
|
+
case 'MODEL_CALLING':
|
|
57
|
+
yield chunk;
|
|
58
|
+
break;
|
|
59
|
+
case 'USAGE':
|
|
60
|
+
agentUsage.totalTokens += chunk.totalTokens || 0;
|
|
61
|
+
agentUsage.inputUsage.inputTokens += chunk.inputUsage.inputTokens || 0;
|
|
62
|
+
agentUsage.inputUsage.cachedTokens += chunk.inputUsage.cachedTokens || 0;
|
|
63
|
+
agentUsage.outputUsage.outputTokens += chunk.outputUsage.outputTokens || 0;
|
|
64
|
+
agentUsage.outputUsage.reasoningTokens += chunk.outputUsage.reasoningTokens || 0;
|
|
65
|
+
agentUsage.firstTokenCostMs = agentUsage.firstTokenCostMs || chunk.firstTokenCostMs;
|
|
66
|
+
agentUsage.estimatedCost += chunk.estimatedCost;
|
|
67
|
+
agentUsage.rounds.push({ input: chunk.input, output: chunk.output });
|
|
68
|
+
yield chunk;
|
|
69
|
+
break;
|
|
70
|
+
case 'TOOL_CALL':
|
|
71
|
+
toolCalls.push(chunk);
|
|
72
|
+
input.push(chunk);
|
|
73
|
+
yield chunk;
|
|
74
|
+
break;
|
|
75
|
+
default:
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
let hasStreaming = false;
|
|
80
|
+
if (toolCalls.length) {
|
|
81
|
+
for (const toolCall of toolCalls) {
|
|
82
|
+
yield { ...toolCall, type: 'TOOL_CALLING' };
|
|
83
|
+
const { error, result, aiText } = await executeTool(toolCall, modelOptions.tools, options?.context);
|
|
84
|
+
if (isAsyncGenerator(result)) {
|
|
85
|
+
for await (const chunk of result) {
|
|
86
|
+
yield { type: 'AGENTIC_TOOL_TOKEN', data: chunk };
|
|
87
|
+
}
|
|
88
|
+
hasStreaming = true;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
const toolCallOutputChunk = {
|
|
92
|
+
type: 'TOOL_CALL_OUTPUT',
|
|
93
|
+
name: toolCall.name,
|
|
94
|
+
callId: toolCall.callId,
|
|
95
|
+
error,
|
|
96
|
+
result: result,
|
|
97
|
+
aiText,
|
|
98
|
+
};
|
|
99
|
+
input.push(toolCallOutputChunk);
|
|
100
|
+
yield toolCallOutputChunk;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
roundIndex++;
|
|
105
|
+
// streaming的时候会正常推AI token给客户端展示,不应该再把结果返回给agent,会导致消息错乱
|
|
106
|
+
if (hasStreaming) {
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
} while (toolCalls.length && roundIndex < maxRounds && !options?.signal?.aborted);
|
|
110
|
+
agentUsage.totalCostMs = Date.now() - startedTimestamp;
|
|
111
|
+
if (options?.logMeta) {
|
|
112
|
+
saveAgentUsage(agentUsage, options.logMeta);
|
|
113
|
+
}
|
|
114
|
+
yield agentUsage;
|
|
115
|
+
}
|
|
21
116
|
}
|
|
22
117
|
//# sourceMappingURL=BaseModel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseModel.js","sourceRoot":"","sources":["../../src/models/BaseModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"BaseModel.js","sourceRoot":"","sources":["../../src/models/BaseModel.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,23 @@
|
|
|
1
|
+
import { JSONSchema } from 'json-schema-to-ts';
|
|
1
2
|
import { InputItem, MessageChunk, ModelChunk, UsageChunk } from '../type.js';
|
|
2
3
|
import { BaseModel, Options } from './BaseModel.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
type DeepseekModelOptions = {
|
|
5
|
+
thinking?: {
|
|
6
|
+
type: 'enabled' | 'disabled' | 'auto';
|
|
7
|
+
};
|
|
8
|
+
reasoning?: {
|
|
9
|
+
effort: 'minimal' | 'low' | 'medium' | 'high';
|
|
10
|
+
};
|
|
11
|
+
temperature?: number;
|
|
12
|
+
textSchema?: JSONSchema;
|
|
13
|
+
} & Options;
|
|
14
|
+
export declare class DeepseekModel extends BaseModel<DeepseekModelOptions> {
|
|
15
|
+
stream(messages: InputItem[], options?: DeepseekModelOptions): AsyncGenerator<ModelChunk>;
|
|
16
|
+
invoke(input: MessageChunk[], options?: DeepseekModelOptions): Promise<{
|
|
6
17
|
message: string;
|
|
7
18
|
usage: UsageChunk | undefined;
|
|
8
19
|
}>;
|
|
9
|
-
protected buildResponseRequestParams(messages: InputItem[], options?:
|
|
20
|
+
protected buildResponseRequestParams(messages: InputItem[], options?: DeepseekModelOptions): [string, RequestInit];
|
|
10
21
|
parseInputMessage: (message: InputItem) => MessageChunk | {
|
|
11
22
|
type: string;
|
|
12
23
|
call_id: string;
|
|
@@ -23,3 +34,4 @@ export declare class DeepseekModel extends BaseModel {
|
|
|
23
34
|
output: any;
|
|
24
35
|
};
|
|
25
36
|
}
|
|
37
|
+
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { sse } from 'cantian-request';
|
|
2
|
+
import { saveModelUsage } from '../tokenUsage.js';
|
|
2
3
|
import { BaseModel } from './BaseModel.js';
|
|
3
4
|
const COST_DOLLAR_PER_M = 0.6;
|
|
4
5
|
export class DeepseekModel extends BaseModel {
|
|
@@ -65,6 +66,9 @@ export class DeepseekModel extends BaseModel {
|
|
|
65
66
|
}
|
|
66
67
|
usageContent.totalCostMs = Date.now() - startedAt;
|
|
67
68
|
usageContent.estimatedCost = (COST_DOLLAR_PER_M * (usageContent.totalTokens || 0)) / 1000000;
|
|
69
|
+
if (options?.logMeta) {
|
|
70
|
+
saveModelUsage(usageContent, options.logMeta);
|
|
71
|
+
}
|
|
68
72
|
yield usageContent;
|
|
69
73
|
}
|
|
70
74
|
finally {
|
|
@@ -88,8 +92,8 @@ export class DeepseekModel extends BaseModel {
|
|
|
88
92
|
return { message, usage };
|
|
89
93
|
}
|
|
90
94
|
buildResponseRequestParams(messages, options) {
|
|
91
|
-
let tools = options?.tools
|
|
92
|
-
if (!tools?.
|
|
95
|
+
let tools = options?.tools;
|
|
96
|
+
if (!tools || !Object.keys(tools).length || options?.finalRound) {
|
|
93
97
|
tools = undefined;
|
|
94
98
|
}
|
|
95
99
|
return [
|
|
@@ -105,15 +109,17 @@ export class DeepseekModel extends BaseModel {
|
|
|
105
109
|
model: this.model,
|
|
106
110
|
input: messages.map(this.parseInputMessage),
|
|
107
111
|
stream: true,
|
|
108
|
-
thinking: options?.thinking
|
|
109
|
-
reasoning: options?.reasoning
|
|
110
|
-
temperature: options?.temperature
|
|
111
|
-
tools: tools
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
112
|
+
thinking: options?.thinking,
|
|
113
|
+
reasoning: options?.reasoning,
|
|
114
|
+
temperature: options?.temperature,
|
|
115
|
+
tools: tools
|
|
116
|
+
? Object.values(tools).map((tool) => ({
|
|
117
|
+
type: 'function',
|
|
118
|
+
name: tool.name,
|
|
119
|
+
description: tool.description,
|
|
120
|
+
parameters: tool.parameters,
|
|
121
|
+
}))
|
|
122
|
+
: undefined,
|
|
117
123
|
text: options?.textSchema && {
|
|
118
124
|
format: {
|
|
119
125
|
type: 'json_schema',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeepseekModel.js","sourceRoot":"","sources":["../../src/models/DeepseekModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAW,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"DeepseekModel.js","sourceRoot":"","sources":["../../src/models/DeepseekModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,SAAS,EAAW,MAAM,gBAAgB,CAAC;AAWpD,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,MAAM,OAAO,aAAc,SAAQ,SAA+B;IAChE,KAAK,CAAC,CAAC,MAAM,CAAC,QAAqB,EAAE,OAA8B;QACjE,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACvE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAChC,IAAI,YAAY,GAAwB,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAc,CAAC,EAAE,CAAC;YAClG,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,IAAI,EAA8B,CAAC;YACvE,MAAM,IAAI,GAAU,EAAE,CAAC;YACvB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBACnC,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACjB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC5B,MAAM;oBACR,CAAC;oBAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACpC,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;wBACpB,KAAK,4BAA4B;4BAC/B,IAAI,YAAY,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gCAChD,YAAY,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;4BACzD,CAAC;4BACD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAuB,CAAC;4BAChE,MAAM;wBACR,KAAK,2BAA2B;4BAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;4BAChC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gCAC3B,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oCACzB,MAAM;wCACJ,IAAI,EAAE,SAAS;wCACf,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;wCACpB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;qCACZ,CAAC;gCAC3B,CAAC;4BACH,CAAC;iCAAM,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;gCACxC,MAAM;oCACJ,IAAI,EAAE,WAAW;oCACjB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;oCACzB,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;oCAC9B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;iCACG,CAAC;4BAC5B,CAAC;4BACD,MAAM;wBACR,KAAK,oBAAoB;4BACvB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;4BAClC,YAAY,CAAC,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC;4BAC9C,YAAY,CAAC,UAAU,GAAG;gCACxB,WAAW,EAAE,KAAK,CAAC,YAAY;gCAC/B,YAAY,EAAE,KAAK,CAAC,oBAAoB,CAAC,aAAa;6BACvD,CAAC;4BACF,YAAY,CAAC,WAAW,GAAG;gCACzB,YAAY,EAAE,KAAK,CAAC,aAAa;gCACjC,eAAe,EAAE,KAAK,CAAC,qBAAqB,CAAC,gBAAgB;6BAC9D,CAAC;4BACF,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;4BAC3C,MAAM;wBACR;4BACE,MAAM;oBACV,CAAC;gBACH,CAAC;YACH,CAAC;YACD,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAClD,YAAY,CAAC,aAAa,GAAG,CAAC,iBAAiB,GAAG,CAAC,YAAY,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;YAC7F,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;gBACrB,cAAc,CAAC,YAA0B,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,YAA0B,CAAC;QACnC,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,KAAK,CAAC,MAAM,CAAC,KAAqB,EAAE,OAA8B;QAChE,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,KAA6B,CAAC;QAClC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;YACtD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,SAAS;oBACZ,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;oBACzB,MAAM;gBACR,KAAK,OAAO;oBACV,KAAK,GAAG,KAAK,CAAC;oBACd,MAAM;YACV,CAAC;QACH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAES,0BAA0B,CAAC,QAAqB,EAAE,OAA8B;QACxF,IAAI,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;QAC3B,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;YAChE,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC;QACD,OAAO;YACL,IAAI,CAAC,GAAG;YACR;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;oBACtC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,MAAM,EAAE,OAAO,EAAE,MAAM;gBACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC;oBAC3C,MAAM,EAAE,IAAI;oBACZ,QAAQ,EAAE,OAAO,EAAE,QAAQ;oBAC3B,SAAS,EAAE,OAAO,EAAE,SAAS;oBAC7B,WAAW,EAAE,OAAO,EAAE,WAAW;oBACjC,KAAK,EAAE,KAAK;wBACV,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;4BAClC,IAAI,EAAE,UAAU;4BAChB,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,WAAW,EAAE,IAAI,CAAC,WAAW;4BAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;yBAC5B,CAAC,CAAC;wBACL,CAAC,CAAC,SAAS;oBACb,IAAI,EAAE,OAAO,EAAE,UAAU,IAAI;wBAC3B,MAAM,EAAE;4BACN,IAAI,EAAE,aAAa;4BACnB,IAAI,EAAE,QAAQ;4BACd,MAAM,EAAE,OAAO,CAAC,UAAU;yBAC3B;qBACF;iBACF,CAAC;aACH;SACuB,CAAC;IAC7B,CAAC;IAED,iBAAiB,GAAG,CAAC,OAAkB,EAAE,EAAE;QACzC,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;YACtB,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,SAAS;oBACZ,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC1D,KAAK,WAAW;oBACd,OAAO;wBACL,IAAI,EAAE,eAAe;wBACrB,OAAO,EAAE,OAAO,CAAC,MAAM;wBACvB,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;qBACnB,CAAC;gBACJ,KAAK,kBAAkB;oBACrB,OAAO,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;gBACtG;oBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,oBAAoB,GAAG,CAAC,MAAc,EAAE,MAAW,EAAE,EAAE;QACrD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,YAAY,MAAM,CAAC,EAAE,CAAC;YAC9D,IAAI,MAAM,YAAY,KAAK,EAAE,CAAC;gBAC5B,MAAM,GAAG,UAAU,MAAM,CAAC,OAAO,EAAE,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACnE,CAAC,CAAC;CACH"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { mongoClient } from 'cantian-mongodb';
|
|
2
|
+
const db = mongoClient.db('agent-service');
|
|
3
|
+
const collection = db.collection('tokenUsages');
|
|
4
|
+
export const saveModelUsage = async (usageChunk, meta) => {
|
|
5
|
+
const now = new Date().toISOString();
|
|
6
|
+
const tokenUsage = {
|
|
7
|
+
...meta,
|
|
8
|
+
model: usageChunk.model,
|
|
9
|
+
totalTokens: usageChunk.totalTokens,
|
|
10
|
+
totalCostMs: usageChunk.totalCostMs,
|
|
11
|
+
rounds: [{ input: usageChunk.input, output: usageChunk.output }],
|
|
12
|
+
estimatedCost: usageChunk.estimatedCost,
|
|
13
|
+
inputUsage: usageChunk.inputUsage,
|
|
14
|
+
outputUsage: usageChunk.outputUsage,
|
|
15
|
+
createdAt: now,
|
|
16
|
+
updatedAt: now,
|
|
17
|
+
};
|
|
18
|
+
await collection.insertOne(tokenUsage);
|
|
19
|
+
console.log('Log done!');
|
|
20
|
+
};
|
|
21
|
+
export const saveAgentUsage = async (agentUsageChunk, meta) => {
|
|
22
|
+
const now = new Date().toISOString();
|
|
23
|
+
const tokenUsage = {
|
|
24
|
+
...meta,
|
|
25
|
+
model: agentUsageChunk.model,
|
|
26
|
+
totalTokens: agentUsageChunk.totalTokens,
|
|
27
|
+
totalCostMs: agentUsageChunk.totalCostMs,
|
|
28
|
+
rounds: agentUsageChunk.rounds,
|
|
29
|
+
estimatedCost: agentUsageChunk.estimatedCost,
|
|
30
|
+
inputUsage: agentUsageChunk.inputUsage,
|
|
31
|
+
outputUsage: agentUsageChunk.outputUsage,
|
|
32
|
+
createdAt: now,
|
|
33
|
+
updatedAt: now,
|
|
34
|
+
};
|
|
35
|
+
await collection.insertOne(tokenUsage);
|
|
36
|
+
console.log('Log done!');
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=tokenUsage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenUsage.js","sourceRoot":"","sources":["../src/tokenUsage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAwB9C,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;AAC3C,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAa,aAAa,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,UAAsB,EAAE,IAAS,EAAE,EAAE;IACxE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,UAAU,GAAe;QAC7B,GAAG,IAAI;QACP,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;QAChE,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,CAAC;IACF,MAAM,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,eAAgC,EAAE,IAAS,EAAE,EAAE;IAClF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,UAAU,GAAe;QAC7B,GAAG,IAAI;QACP,KAAK,EAAE,eAAe,CAAC,KAAK;QAC5B,WAAW,EAAE,eAAe,CAAC,WAAW;QACxC,WAAW,EAAE,eAAe,CAAC,WAAW;QACxC,MAAM,EAAE,eAAe,CAAC,MAAM;QAC9B,aAAa,EAAE,eAAe,CAAC,aAAa;QAC5C,UAAU,EAAE,eAAe,CAAC,UAAU;QACtC,WAAW,EAAE,eAAe,CAAC,WAAW;QACxC,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,CAAC;IACF,MAAM,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC3B,CAAC,CAAC"}
|
package/dist/type.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ValidateFunction } from 'ajv';
|
|
1
2
|
import { JSONSchema } from 'json-schema-to-ts';
|
|
2
3
|
export type Role = 'user' | 'assistant' | 'system' | 'developer';
|
|
3
4
|
export type MessageChunk = {
|
|
@@ -35,8 +36,13 @@ export type TokenChunk = {
|
|
|
35
36
|
type: 'TOKEN';
|
|
36
37
|
delta: string;
|
|
37
38
|
};
|
|
39
|
+
export type AgenticToolToken = {
|
|
40
|
+
type: 'AGENTIC_TOOL_TOKEN';
|
|
41
|
+
data: any;
|
|
42
|
+
};
|
|
38
43
|
export type UsageChunk = {
|
|
39
44
|
type: 'USAGE';
|
|
45
|
+
model: string;
|
|
40
46
|
totalTokens: number;
|
|
41
47
|
inputUsage: {
|
|
42
48
|
inputTokens: number;
|
|
@@ -55,6 +61,7 @@ export type UsageChunk = {
|
|
|
55
61
|
export type AgentUsageChunk = {
|
|
56
62
|
type: 'AGENT_USAGE';
|
|
57
63
|
totalTokens: number;
|
|
64
|
+
model: string;
|
|
58
65
|
inputUsage: {
|
|
59
66
|
inputTokens: number;
|
|
60
67
|
cachedTokens: number;
|
|
@@ -71,11 +78,14 @@ export type AgentUsageChunk = {
|
|
|
71
78
|
output: any;
|
|
72
79
|
}[];
|
|
73
80
|
};
|
|
74
|
-
export type
|
|
81
|
+
export type Tool<Context = any, Result = any> = {
|
|
75
82
|
name: string;
|
|
76
83
|
description?: string;
|
|
77
84
|
parameters: JSONSchema;
|
|
85
|
+
handler: (args: any, context: Context) => Result | Promise<Result> | AsyncGenerator<AgenticToolToken>;
|
|
86
|
+
validate?: ValidateFunction;
|
|
87
|
+
toAiText?: (result: any, context: Context, args: any) => string | Promise<string>;
|
|
78
88
|
};
|
|
79
89
|
export type ModelChunk = ModelCallingChunk | TokenChunk | MessageChunk | ToolCallChunk | UsageChunk;
|
|
80
|
-
export type AgentChunk = ModelChunk | ToolCallingChunk | ToolCallOutputChunk | AgentUsageChunk;
|
|
90
|
+
export type AgentChunk = ModelChunk | AgenticToolToken | ToolCallingChunk | ToolCallOutputChunk | AgentUsageChunk;
|
|
81
91
|
export {};
|
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Tool, ToolCallChunk } from './type.js';
|
|
2
|
+
export declare const executeTool: (toolCall: ToolCallChunk, tools: Record<string, Tool>, context: any) => Promise<{
|
|
3
|
+
error?: any;
|
|
4
|
+
result?: any;
|
|
5
|
+
aiText?: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare function isAsyncGenerator(value: any): any;
|
package/dist/util.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export const executeTool = async (toolCall, tools, context) => {
|
|
2
|
+
const tool = tools[toolCall.name];
|
|
3
|
+
if (!tool) {
|
|
4
|
+
return { error: new Error('The tool name does not exist.') };
|
|
5
|
+
}
|
|
6
|
+
let json;
|
|
7
|
+
try {
|
|
8
|
+
json = JSON.parse(toolCall.arguments);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
return { error: new Error('The given <arguments> is an invalid JSON string.') };
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
if (tool.validate) {
|
|
15
|
+
const valid = tool.validate(json);
|
|
16
|
+
if (!valid) {
|
|
17
|
+
return { error: new Error(`Invalid arguments: ${tool.validate.errors?.[0].message}`) };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const handlerResult = tool.handler(json, context);
|
|
21
|
+
const isAsyncGen = isAsyncGenerator(handlerResult);
|
|
22
|
+
if (isAsyncGen) {
|
|
23
|
+
return { result: handlerResult };
|
|
24
|
+
}
|
|
25
|
+
const result = await handlerResult;
|
|
26
|
+
const aiText = tool.toAiText ? await tool.toAiText(result, context, json) : undefined;
|
|
27
|
+
return { result, aiText };
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
return { error };
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
export function isAsyncGenerator(value) {
|
|
34
|
+
return value && typeof value[Symbol.asyncIterator] === 'function';
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,QAAuB,EACvB,KAA2B,EAC3B,OAAY,EAC6C,EAAE;IAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,+BAA+B,CAAC,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,kDAAkD,CAAC,EAAE,CAAC;IAClF,CAAC;IAED,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACzF,CAAC;QACH,CAAC;QACD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACnD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QACnC,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,KAAK;IACpC,OAAO,KAAK,IAAI,OAAO,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,UAAU,CAAC;AACpE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cantian-ai",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.29",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dist/index.js"
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
"@modelcontextprotocol/sdk": "^1.25.1",
|
|
16
16
|
"ajv": "^8.17.1",
|
|
17
17
|
"async-mutex": "^0.5.0",
|
|
18
|
+
"cantian-als": "*",
|
|
19
|
+
"cantian-mongodb": "*",
|
|
18
20
|
"cantian-request": "*"
|
|
19
21
|
},
|
|
20
22
|
"devDependencies": {
|
package/dist/Agent.d.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { ValidateFunction } from 'ajv';
|
|
2
|
-
import { JSONSchema } from 'json-schema-to-ts';
|
|
3
|
-
import { BaseModel } from './models/BaseModel.js';
|
|
4
|
-
import { AgentChunk, ToolCallChunk } from './type.js';
|
|
5
|
-
export type AgentTool<Context = any, Result = any> = {
|
|
6
|
-
name: string;
|
|
7
|
-
description?: string;
|
|
8
|
-
parameters: JSONSchema;
|
|
9
|
-
handler: (args: any, context: Context) => Result | Promise<Result>;
|
|
10
|
-
toAiText?: (result: any, context: Context, args: any) => string | Promise<string>;
|
|
11
|
-
};
|
|
12
|
-
export declare class Agent {
|
|
13
|
-
toolMap: Record<string, AgentTool & {
|
|
14
|
-
validate: ValidateFunction;
|
|
15
|
-
}>;
|
|
16
|
-
model: BaseModel;
|
|
17
|
-
constructor(options: {
|
|
18
|
-
model: BaseModel;
|
|
19
|
-
tools: AgentTool[];
|
|
20
|
-
});
|
|
21
|
-
stream(messages: any[], options?: {
|
|
22
|
-
signal?: AbortSignal;
|
|
23
|
-
maxRounds?: number;
|
|
24
|
-
context?: any;
|
|
25
|
-
temperature?: number;
|
|
26
|
-
}): AsyncGenerator<AgentChunk>;
|
|
27
|
-
executeTool(toolCall: ToolCallChunk, context: any): Promise<{
|
|
28
|
-
error?: any;
|
|
29
|
-
result?: any;
|
|
30
|
-
aiText?: string;
|
|
31
|
-
}>;
|
|
32
|
-
}
|
package/dist/Agent.js
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import Ajv from 'ajv';
|
|
2
|
-
const ajv = new Ajv.default({ removeAdditional: true, useDefaults: true });
|
|
3
|
-
const DEFAULT_MAX_ROUNDS = 5;
|
|
4
|
-
export class Agent {
|
|
5
|
-
toolMap = {};
|
|
6
|
-
model;
|
|
7
|
-
constructor(options) {
|
|
8
|
-
this.model = options.model;
|
|
9
|
-
for (const tool of options.tools) {
|
|
10
|
-
this.toolMap[tool.name] = {
|
|
11
|
-
...tool,
|
|
12
|
-
validate: ajv.compile(tool.parameters),
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
async *stream(messages, options) {
|
|
17
|
-
const input = [...messages];
|
|
18
|
-
let roundIndex = 0;
|
|
19
|
-
let toolCalls;
|
|
20
|
-
const toolDefinitions = Object.values(this.toolMap).map((t) => ({
|
|
21
|
-
name: t.name,
|
|
22
|
-
description: t.description,
|
|
23
|
-
parameters: t.parameters,
|
|
24
|
-
}));
|
|
25
|
-
const maxRounds = options?.maxRounds || DEFAULT_MAX_ROUNDS;
|
|
26
|
-
const agentUsage = {
|
|
27
|
-
type: 'AGENT_USAGE',
|
|
28
|
-
totalTokens: 0,
|
|
29
|
-
inputUsage: {
|
|
30
|
-
inputTokens: 0,
|
|
31
|
-
cachedTokens: 0,
|
|
32
|
-
},
|
|
33
|
-
outputUsage: {
|
|
34
|
-
outputTokens: 0,
|
|
35
|
-
reasoningTokens: 0,
|
|
36
|
-
},
|
|
37
|
-
firstTokenCostMs: 0,
|
|
38
|
-
totalCostMs: 0,
|
|
39
|
-
estimatedCost: 0,
|
|
40
|
-
rounds: [],
|
|
41
|
-
};
|
|
42
|
-
const startedTimestamp = Date.now();
|
|
43
|
-
do {
|
|
44
|
-
const response = this.model.stream(input, {
|
|
45
|
-
tools: roundIndex < maxRounds - 1 ? toolDefinitions : undefined,
|
|
46
|
-
signal: options?.signal,
|
|
47
|
-
temperature: options?.temperature,
|
|
48
|
-
});
|
|
49
|
-
toolCalls = [];
|
|
50
|
-
for await (const chunk of response) {
|
|
51
|
-
switch (chunk.type) {
|
|
52
|
-
case 'TOKEN':
|
|
53
|
-
case 'MESSAGE':
|
|
54
|
-
case 'MODEL_CALLING':
|
|
55
|
-
yield chunk;
|
|
56
|
-
break;
|
|
57
|
-
case 'USAGE':
|
|
58
|
-
agentUsage.totalTokens += chunk.totalTokens || 0;
|
|
59
|
-
agentUsage.inputUsage.inputTokens += chunk.inputUsage.inputTokens || 0;
|
|
60
|
-
agentUsage.inputUsage.cachedTokens += chunk.inputUsage.cachedTokens || 0;
|
|
61
|
-
agentUsage.outputUsage.outputTokens += chunk.outputUsage.outputTokens || 0;
|
|
62
|
-
agentUsage.outputUsage.reasoningTokens += chunk.outputUsage.reasoningTokens || 0;
|
|
63
|
-
agentUsage.firstTokenCostMs = agentUsage.firstTokenCostMs || chunk.firstTokenCostMs;
|
|
64
|
-
agentUsage.estimatedCost += chunk.estimatedCost;
|
|
65
|
-
agentUsage.rounds.push({ input: chunk.input, output: chunk.output });
|
|
66
|
-
yield chunk;
|
|
67
|
-
break;
|
|
68
|
-
case 'TOOL_CALL':
|
|
69
|
-
toolCalls.push(chunk);
|
|
70
|
-
input.push(chunk);
|
|
71
|
-
yield chunk;
|
|
72
|
-
break;
|
|
73
|
-
default:
|
|
74
|
-
break;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (toolCalls.length) {
|
|
78
|
-
for (const toolCall of toolCalls) {
|
|
79
|
-
yield { ...toolCall, type: 'TOOL_CALLING' };
|
|
80
|
-
const { error, result, aiText } = await this.executeTool(toolCall, options?.context);
|
|
81
|
-
const toolCallOutputChunk = {
|
|
82
|
-
type: 'TOOL_CALL_OUTPUT',
|
|
83
|
-
name: toolCall.name,
|
|
84
|
-
callId: toolCall.callId,
|
|
85
|
-
error,
|
|
86
|
-
result: result,
|
|
87
|
-
aiText,
|
|
88
|
-
};
|
|
89
|
-
input.push(toolCallOutputChunk);
|
|
90
|
-
yield toolCallOutputChunk;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
roundIndex++;
|
|
94
|
-
} while (toolCalls.length && roundIndex < maxRounds && !options?.signal?.aborted);
|
|
95
|
-
agentUsage.totalCostMs = Date.now() - startedTimestamp;
|
|
96
|
-
yield agentUsage;
|
|
97
|
-
}
|
|
98
|
-
async executeTool(toolCall, context) {
|
|
99
|
-
const tool = this.toolMap[toolCall.name];
|
|
100
|
-
if (!tool) {
|
|
101
|
-
return { error: new Error('The tool name does not exist.') };
|
|
102
|
-
}
|
|
103
|
-
let json;
|
|
104
|
-
try {
|
|
105
|
-
json = JSON.parse(toolCall.arguments);
|
|
106
|
-
}
|
|
107
|
-
catch (error) {
|
|
108
|
-
return { error: new Error('The given <arguments> is an invalid JSON string.') };
|
|
109
|
-
}
|
|
110
|
-
try {
|
|
111
|
-
const valid = tool.validate(json);
|
|
112
|
-
if (!valid) {
|
|
113
|
-
return { error: new Error(`Invalid arguments: ${tool.validate.errors?.[0].message}`) };
|
|
114
|
-
}
|
|
115
|
-
const result = await tool.handler(json, context);
|
|
116
|
-
let aiText;
|
|
117
|
-
if (tool.toAiText) {
|
|
118
|
-
aiText = await tool.toAiText(result, context, json);
|
|
119
|
-
}
|
|
120
|
-
return { result, aiText };
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
return { error };
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
//# sourceMappingURL=Agent.js.map
|
package/dist/Agent.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Agent.js","sourceRoot":"","sources":["../src/Agent.ts"],"names":[],"mappings":"AAAA,OAAO,GAAyB,MAAM,KAAK,CAAC;AAa5C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;AAE3E,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,MAAM,OAAO,KAAK;IACT,OAAO,GAA+D,EAAE,CAAC;IACzE,KAAK,CAAY;IAExB,YAAY,OAAiD;QAC3D,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBACxB,GAAG,IAAI;gBACP,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;aACvC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CACX,QAAe,EACf,OAA2F;QAE3F,MAAM,KAAK,GAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC;QACzC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,SAA0B,CAAC;QAC/B,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9D,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB,CAAC,CAAC,CAAC;QACJ,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,kBAAkB,CAAC;QAC3D,MAAM,UAAU,GAAG;YACjB,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,CAAC;YACd,UAAU,EAAE;gBACV,WAAW,EAAE,CAAC;gBACd,YAAY,EAAE,CAAC;aAChB;YACD,WAAW,EAAE;gBACX,YAAY,EAAE,CAAC;gBACf,eAAe,EAAE,CAAC;aACnB;YACD,gBAAgB,EAAE,CAAC;YACnB,WAAW,EAAE,CAAC;YACd,aAAa,EAAE,CAAC;YAChB,MAAM,EAAE,EAAE;SACkC,CAAC;QAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,GAAG,CAAC;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE;gBACxC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;gBAC/D,MAAM,EAAE,OAAO,EAAE,MAAM;gBACvB,WAAW,EAAE,OAAO,EAAE,WAAW;aAClC,CAAC,CAAC;YACH,SAAS,GAAG,EAAE,CAAC;YACf,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBACnC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;oBACnB,KAAK,OAAO,CAAC;oBACb,KAAK,SAAS,CAAC;oBACf,KAAK,eAAe;wBAClB,MAAM,KAAK,CAAC;wBACZ,MAAM;oBACR,KAAK,OAAO;wBACV,UAAU,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;wBACjD,UAAU,CAAC,UAAU,CAAC,WAAW,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC;wBACvE,UAAU,CAAC,UAAU,CAAC,YAAY,IAAI,KAAK,CAAC,UAAU,CAAC,YAAY,IAAI,CAAC,CAAC;wBACzE,UAAU,CAAC,WAAW,CAAC,YAAY,IAAI,KAAK,CAAC,WAAW,CAAC,YAAY,IAAI,CAAC,CAAC;wBAC3E,UAAU,CAAC,WAAW,CAAC,eAAe,IAAI,KAAK,CAAC,WAAW,CAAC,eAAe,IAAI,CAAC,CAAC;wBACjF,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,IAAI,KAAK,CAAC,gBAAgB,CAAC;wBACpF,UAAU,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,CAAC;wBAChD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;wBACrE,MAAM,KAAK,CAAC;wBACZ,MAAM;oBACR,KAAK,WAAW;wBACd,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAClB,MAAM,KAAK,CAAC;wBACZ,MAAM;oBACR;wBACE,MAAM;gBACV,CAAC;YACH,CAAC;YACD,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACrB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,MAAM,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,cAAc,EAA6B,CAAC;oBACvE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;oBACrF,MAAM,mBAAmB,GAAwB;wBAC/C,IAAI,EAAE,kBAAkB;wBACxB,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,KAAK;wBACL,MAAM,EAAE,MAAM;wBACd,MAAM;qBACP,CAAC;oBACF,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;oBAChC,MAAM,mBAAmB,CAAC;gBAC5B,CAAC;YACH,CAAC;YACD,UAAU,EAAE,CAAC;QACf,CAAC,QAAQ,SAAS,CAAC,MAAM,IAAI,UAAU,GAAG,SAAS,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAClF,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC;QACvD,MAAM,UAAU,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAuB,EAAE,OAAY;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,+BAA+B,CAAC,EAAE,CAAC;QAC/D,CAAC;QACD,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,kDAAkD,CAAC,EAAE,CAAC;QAClF,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACzF,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjD,IAAI,MAA0B,CAAC;YAC/B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;CACF"}
|