@chatcops/core 0.4.0 → 0.6.0
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/agent/chat.d.ts +13 -0
- package/dist/agent/chat.d.ts.map +1 -0
- package/dist/agent/chat.js +42 -0
- package/dist/agent/chat.js.map +1 -0
- package/dist/agent/errors.d.ts +14 -0
- package/dist/agent/errors.d.ts.map +1 -0
- package/dist/agent/errors.js +24 -0
- package/dist/agent/errors.js.map +1 -0
- package/dist/agent/index.d.ts +5 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +5 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/run-turn.d.ts +79 -0
- package/dist/agent/run-turn.d.ts.map +1 -0
- package/dist/agent/run-turn.js +400 -0
- package/dist/agent/run-turn.js.map +1 -0
- package/dist/agent/tool-registry.d.ts +30 -0
- package/dist/agent/tool-registry.d.ts.map +1 -0
- package/dist/agent/tool-registry.js +66 -0
- package/dist/agent/tool-registry.js.map +1 -0
- package/dist/analytics/collector.d.ts +2 -0
- package/dist/analytics/collector.d.ts.map +1 -1
- package/dist/analytics/collector.js +16 -10
- package/dist/analytics/collector.js.map +1 -1
- package/dist/analytics/index.d.ts +2 -0
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +2 -0
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/names.d.ts +21 -0
- package/dist/analytics/names.d.ts.map +1 -0
- package/dist/analytics/names.js +41 -0
- package/dist/analytics/names.js.map +1 -0
- package/dist/analytics/sink.d.ts +27 -0
- package/dist/analytics/sink.d.ts.map +1 -0
- package/dist/analytics/sink.js +109 -0
- package/dist/analytics/sink.js.map +1 -0
- package/dist/conversation/index.d.ts +1 -0
- package/dist/conversation/index.d.ts.map +1 -1
- package/dist/conversation/index.js.map +1 -1
- package/dist/conversation/manager.d.ts +65 -6
- package/dist/conversation/manager.d.ts.map +1 -1
- package/dist/conversation/manager.js +110 -34
- package/dist/conversation/manager.js.map +1 -1
- package/dist/conversation/store.d.ts +6 -5
- package/dist/conversation/store.d.ts.map +1 -1
- package/dist/conversation/store.js +4 -0
- package/dist/conversation/store.js.map +1 -1
- package/dist/index.d.ts +21 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/knowledge/base.d.ts +8 -0
- package/dist/knowledge/base.d.ts.map +1 -1
- package/dist/knowledge/tokenize.d.ts.map +1 -1
- package/dist/knowledge/tokenize.js +4 -4
- package/dist/knowledge/tokenize.js.map +1 -1
- package/dist/limits/budget.d.ts +84 -0
- package/dist/limits/budget.d.ts.map +1 -0
- package/dist/limits/budget.js +114 -0
- package/dist/limits/budget.js.map +1 -0
- package/dist/limits/rate-limit.d.ts +53 -0
- package/dist/limits/rate-limit.d.ts.map +1 -0
- package/dist/limits/rate-limit.js +68 -0
- package/dist/limits/rate-limit.js.map +1 -0
- package/dist/logger.d.ts +36 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +40 -0
- package/dist/logger.js.map +1 -0
- package/dist/parts.d.ts +9 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +17 -0
- package/dist/parts.js.map +1 -0
- package/dist/protocol/ai-sdk.d.ts +27 -0
- package/dist/protocol/ai-sdk.d.ts.map +1 -0
- package/dist/protocol/ai-sdk.js +127 -0
- package/dist/protocol/ai-sdk.js.map +1 -0
- package/dist/protocol/errors.d.ts +10 -0
- package/dist/protocol/errors.d.ts.map +1 -0
- package/dist/protocol/errors.js +42 -0
- package/dist/protocol/errors.js.map +1 -0
- package/dist/protocol/index.d.ts +9 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +6 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/legacy.d.ts +18 -0
- package/dist/protocol/legacy.d.ts.map +1 -0
- package/dist/protocol/legacy.js +41 -0
- package/dist/protocol/legacy.js.map +1 -0
- package/dist/protocol/sse.d.ts +10 -0
- package/dist/protocol/sse.d.ts.map +1 -0
- package/dist/protocol/sse.js +15 -0
- package/dist/protocol/sse.js.map +1 -0
- package/dist/protocol/v1.d.ts +140 -0
- package/dist/protocol/v1.d.ts.map +1 -0
- package/dist/protocol/v1.js +15 -0
- package/dist/protocol/v1.js.map +1 -0
- package/dist/providers/base.d.ts +13 -28
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +36 -47
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/claude.d.ts +41 -6
- package/dist/providers/claude.d.ts.map +1 -1
- package/dist/providers/claude.js +223 -96
- package/dist/providers/claude.js.map +1 -1
- package/dist/providers/gemini.d.ts +18 -3
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +208 -91
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/history.d.ts +52 -0
- package/dist/providers/history.d.ts.map +1 -0
- package/dist/providers/history.js +212 -0
- package/dist/providers/history.js.map +1 -0
- package/dist/providers/index.d.ts +5 -5
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +5 -4
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +28 -6
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +213 -113
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/registry.d.ts +7 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +12 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/schema.d.ts +16 -0
- package/dist/providers/schema.d.ts.map +1 -0
- package/dist/providers/schema.js +80 -0
- package/dist/providers/schema.js.map +1 -0
- package/dist/providers/tool-execution.d.ts +13 -0
- package/dist/providers/tool-execution.d.ts.map +1 -1
- package/dist/providers/tool-execution.js +49 -13
- package/dist/providers/tool-execution.js.map +1 -1
- package/dist/providers/types.d.ts +89 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/retrieval/citations.d.ts +44 -0
- package/dist/retrieval/citations.d.ts.map +1 -0
- package/dist/retrieval/citations.js +97 -0
- package/dist/retrieval/citations.js.map +1 -0
- package/dist/retrieval/cohere-reranker.d.ts +13 -0
- package/dist/retrieval/cohere-reranker.d.ts.map +1 -0
- package/dist/retrieval/cohere-reranker.js +33 -0
- package/dist/retrieval/cohere-reranker.js.map +1 -0
- package/dist/retrieval/gemini-embedder.d.ts +26 -0
- package/dist/retrieval/gemini-embedder.d.ts.map +1 -0
- package/dist/retrieval/gemini-embedder.js +36 -0
- package/dist/retrieval/gemini-embedder.js.map +1 -0
- package/dist/retrieval/http.d.ts +20 -0
- package/dist/retrieval/http.d.ts.map +1 -0
- package/dist/retrieval/http.js +68 -0
- package/dist/retrieval/http.js.map +1 -0
- package/dist/retrieval/index.d.ts +14 -0
- package/dist/retrieval/index.d.ts.map +1 -0
- package/dist/retrieval/index.js +13 -0
- package/dist/retrieval/index.js.map +1 -0
- package/dist/retrieval/knowledge.d.ts +16 -0
- package/dist/retrieval/knowledge.d.ts.map +1 -0
- package/dist/retrieval/knowledge.js +21 -0
- package/dist/retrieval/knowledge.js.map +1 -0
- package/dist/retrieval/openai-embedder.d.ts +25 -0
- package/dist/retrieval/openai-embedder.d.ts.map +1 -0
- package/dist/retrieval/openai-embedder.js +30 -0
- package/dist/retrieval/openai-embedder.js.map +1 -0
- package/dist/retrieval/query.d.ts +8 -0
- package/dist/retrieval/query.d.ts.map +1 -0
- package/dist/retrieval/query.js +19 -0
- package/dist/retrieval/query.js.map +1 -0
- package/dist/retrieval/retrievers.d.ts +30 -0
- package/dist/retrieval/retrievers.d.ts.map +1 -0
- package/dist/retrieval/retrievers.js +89 -0
- package/dist/retrieval/retrievers.js.map +1 -0
- package/dist/retrieval/sources.d.ts +16 -0
- package/dist/retrieval/sources.d.ts.map +1 -0
- package/dist/retrieval/sources.js +37 -0
- package/dist/retrieval/sources.js.map +1 -0
- package/dist/retrieval/types.d.ts +50 -0
- package/dist/retrieval/types.d.ts.map +1 -0
- package/dist/retrieval/types.js +2 -0
- package/dist/retrieval/types.js.map +1 -0
- package/dist/retrieval/voyage-embedder.d.ts +33 -0
- package/dist/retrieval/voyage-embedder.d.ts.map +1 -0
- package/dist/retrieval/voyage-embedder.js +33 -0
- package/dist/retrieval/voyage-embedder.js.map +1 -0
- package/dist/retrieval/voyage-reranker.d.ts +13 -0
- package/dist/retrieval/voyage-reranker.d.ts.map +1 -0
- package/dist/retrieval/voyage-reranker.js +38 -0
- package/dist/retrieval/voyage-reranker.js.map +1 -0
- package/dist/retrieval/workers-ai-embedder.d.ts +21 -0
- package/dist/retrieval/workers-ai-embedder.d.ts.map +1 -0
- package/dist/retrieval/workers-ai-embedder.js +42 -0
- package/dist/retrieval/workers-ai-embedder.js.map +1 -0
- package/dist/retrieval/workers-ai-reranker.d.ts +11 -0
- package/dist/retrieval/workers-ai-reranker.d.ts.map +1 -0
- package/dist/retrieval/workers-ai-reranker.js +54 -0
- package/dist/retrieval/workers-ai-reranker.js.map +1 -0
- package/dist/storage/adapt.d.ts +15 -0
- package/dist/storage/adapt.d.ts.map +1 -0
- package/dist/storage/adapt.js +83 -0
- package/dist/storage/adapt.js.map +1 -0
- package/dist/storage/errors.d.ts +18 -0
- package/dist/storage/errors.d.ts.map +1 -0
- package/dist/storage/errors.js +28 -0
- package/dist/storage/errors.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/memory-vectors.d.ts +22 -0
- package/dist/storage/memory-vectors.d.ts.map +1 -0
- package/dist/storage/memory-vectors.js +140 -0
- package/dist/storage/memory-vectors.js.map +1 -0
- package/dist/storage/memory.d.ts +24 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +265 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/types.d.ts +188 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/testing/conformance.d.ts +30 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +505 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/provider.d.ts +47 -0
- package/dist/testing/provider.d.ts.map +1 -0
- package/dist/testing/provider.js +83 -0
- package/dist/testing/provider.js.map +1 -0
- package/dist/tools/base.d.ts +14 -4
- package/dist/tools/base.d.ts.map +1 -1
- package/dist/tools/base.js +4 -2
- package/dist/tools/base.js.map +1 -1
- package/dist/tools/lead-capture.d.ts +4 -2
- package/dist/tools/lead-capture.d.ts.map +1 -1
- package/dist/tools/lead-capture.js +7 -2
- package/dist/tools/lead-capture.js.map +1 -1
- package/dist/types.d.ts +146 -7
- package/dist/types.d.ts.map +1 -1
- package/package.json +51 -3
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AIProvider } from '../providers/types.js';
|
|
2
|
+
import type { ProviderChatParams } from '../types.js';
|
|
3
|
+
type SteppingProvider = AIProvider & Required<Pick<AIProvider, 'step'>>;
|
|
4
|
+
/**
|
|
5
|
+
* `chat()` for providers that have `step()`: runs a turn and yields its text.
|
|
6
|
+
* Errors throw, as they did before turns existed: a refusal, the tool round
|
|
7
|
+
* limit, a provider error, and an abort.
|
|
8
|
+
*/
|
|
9
|
+
export declare function chatViaTurn(provider: SteppingProvider, params: ProviderChatParams): AsyncGenerator<string>;
|
|
10
|
+
/** `chatSync()` on top of `chat()`: the whole reply as one string. */
|
|
11
|
+
export declare function chatSyncViaTurn(provider: SteppingProvider, params: ProviderChatParams): Promise<string>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/agent/chat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAItD,KAAK,gBAAgB,GAAG,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AAExE;;;;GAIG;AACH,wBAAuB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC,CAyBjH;AAED,sEAAsE;AACtE,wBAAsB,eAAe,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAI7G"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { MAX_TOOL_ROUNDS } from '../providers/tool-execution.js';
|
|
2
|
+
import { runTurn } from './run-turn.js';
|
|
3
|
+
import { executorRegistry } from './tool-registry.js';
|
|
4
|
+
/**
|
|
5
|
+
* `chat()` for providers that have `step()`: runs a turn and yields its text.
|
|
6
|
+
* Errors throw, as they did before turns existed: a refusal, the tool round
|
|
7
|
+
* limit, a provider error, and an abort.
|
|
8
|
+
*/
|
|
9
|
+
export async function* chatViaTurn(provider, params) {
|
|
10
|
+
const turn = runTurn({
|
|
11
|
+
provider,
|
|
12
|
+
messages: params.messages,
|
|
13
|
+
systemPrompt: params.systemPrompt,
|
|
14
|
+
tools: executorRegistry(params.tools, params.toolExecutor),
|
|
15
|
+
conversationId: '',
|
|
16
|
+
maxSteps: MAX_TOOL_ROUNDS + 1,
|
|
17
|
+
toolTimeoutMs: params.toolTimeoutMs,
|
|
18
|
+
maxTokens: params.maxTokens,
|
|
19
|
+
temperature: params.temperature,
|
|
20
|
+
signal: params.signal,
|
|
21
|
+
});
|
|
22
|
+
let next = await turn.next();
|
|
23
|
+
while (!next.done) {
|
|
24
|
+
if (next.value.type === 'text-delta')
|
|
25
|
+
yield next.value.delta;
|
|
26
|
+
next = await turn.next();
|
|
27
|
+
}
|
|
28
|
+
const result = next.value;
|
|
29
|
+
if (result.status === 'aborted') {
|
|
30
|
+
throw params.signal?.reason ?? new DOMException('The operation was aborted.', 'AbortError');
|
|
31
|
+
}
|
|
32
|
+
if (result.error !== undefined)
|
|
33
|
+
throw result.error;
|
|
34
|
+
}
|
|
35
|
+
/** `chatSync()` on top of `chat()`: the whole reply as one string. */
|
|
36
|
+
export async function chatSyncViaTurn(provider, params) {
|
|
37
|
+
let text = '';
|
|
38
|
+
for await (const chunk of chatViaTurn(provider, params))
|
|
39
|
+
text += chunk;
|
|
40
|
+
return text;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/agent/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGjE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAItD;;;;GAIG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,WAAW,CAAC,QAA0B,EAAE,MAA0B;IACvF,MAAM,IAAI,GAAG,OAAO,CAAC;QACnB,QAAQ;QACR,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC;QAC1D,cAAc,EAAE,EAAE;QAClB,QAAQ,EAAE,eAAe,GAAG,CAAC;QAC7B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAC;IAEH,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7D,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,YAAY,CAAC,4BAA4B,EAAE,YAAY,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,MAAM,CAAC,KAAK,CAAC;AACrD,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAA0B,EAAE,MAA0B;IAC1F,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAE,IAAI,IAAI,KAAK,CAAC;IACvE,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** The model declined to answer. */
|
|
2
|
+
export declare class RefusalError extends Error {
|
|
3
|
+
constructor();
|
|
4
|
+
}
|
|
5
|
+
/** The provider's safety filter stopped the reply. */
|
|
6
|
+
export declare class ContentFilterError extends Error {
|
|
7
|
+
constructor();
|
|
8
|
+
}
|
|
9
|
+
/** The model kept asking for tools after the last allowed round. */
|
|
10
|
+
export declare class MaxStepsError extends Error {
|
|
11
|
+
readonly toolRounds: number;
|
|
12
|
+
constructor(toolRounds: number);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/agent/errors.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,qBAAa,YAAa,SAAQ,KAAK;;CAKtC;AAED,sDAAsD;AACtD,qBAAa,kBAAmB,SAAQ,KAAK;;CAK5C;AAED,oEAAoE;AACpE,qBAAa,aAAc,SAAQ,KAAK;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM;CAIxC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** The model declined to answer. */
|
|
2
|
+
export class RefusalError extends Error {
|
|
3
|
+
constructor() {
|
|
4
|
+
super('The model declined to answer this request (refusal).');
|
|
5
|
+
this.name = 'RefusalError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
/** The provider's safety filter stopped the reply. */
|
|
9
|
+
export class ContentFilterError extends Error {
|
|
10
|
+
constructor() {
|
|
11
|
+
super("The provider's content filter stopped the reply.");
|
|
12
|
+
this.name = 'ContentFilterError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** The model kept asking for tools after the last allowed round. */
|
|
16
|
+
export class MaxStepsError extends Error {
|
|
17
|
+
toolRounds;
|
|
18
|
+
constructor(toolRounds) {
|
|
19
|
+
super(`Exceeded maximum tool rounds (${toolRounds}).`);
|
|
20
|
+
this.toolRounds = toolRounds;
|
|
21
|
+
this.name = 'MaxStepsError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/agent/errors.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC;QACE,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,sDAAsD;AACtD,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C;QACE,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,OAAO,aAAc,SAAQ,KAAK;IACjB;IAArB,YAAqB,UAAkB;QACrC,KAAK,CAAC,iCAAiC,UAAU,IAAI,CAAC,CAAC;QADpC,eAAU,GAAV,UAAU,CAAQ;QAErC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { runTurn, DEFAULT_MAX_STEPS, type RunTurnOptions, type TurnResult } from './run-turn.js';
|
|
2
|
+
export { toolRegistry, executorRegistry, toolOutput, MAX_TOOL_OUTPUT_CHARS, type ToolRegistry, type ToolRunContext, } from './tool-registry.js';
|
|
3
|
+
export { RefusalError, ContentFilterError, MaxStepsError } from './errors.js';
|
|
4
|
+
export { chatViaTurn, chatSyncViaTurn } from './chat.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACjG,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { runTurn, DEFAULT_MAX_STEPS } from './run-turn.js';
|
|
2
|
+
export { toolRegistry, executorRegistry, toolOutput, MAX_TOOL_OUTPUT_CHARS, } from './tool-registry.js';
|
|
3
|
+
export { RefusalError, ContentFilterError, MaxStepsError } from './errors.js';
|
|
4
|
+
export { chatViaTurn, chatSyncViaTurn } from './chat.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAwC,MAAM,eAAe,CAAC;AACjG,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,qBAAqB,GAGtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { type Logger } from '../logger.js';
|
|
2
|
+
import { type WireFinishReason, type WirePart } from '../protocol/v1.js';
|
|
3
|
+
import type { AIProvider } from '../providers/types.js';
|
|
4
|
+
import type { ChatMessage, MessagePart, TokenUsage } from '../types.js';
|
|
5
|
+
import { type BudgetContext, type BudgetGuard } from '../limits/budget.js';
|
|
6
|
+
import { type ToolRegistry } from './tool-registry.js';
|
|
7
|
+
import type { RetrievedChunk } from '../retrieval/types.js';
|
|
8
|
+
/** Model requests per turn: five tool rounds and the answer after them, as in 0.5. */
|
|
9
|
+
export declare const DEFAULT_MAX_STEPS = 6;
|
|
10
|
+
export interface RunTurnOptions {
|
|
11
|
+
provider: AIProvider;
|
|
12
|
+
/** The history to send, oldest first, ending with the visitor's message. */
|
|
13
|
+
messages: ChatMessage[];
|
|
14
|
+
systemPrompt: string;
|
|
15
|
+
/** Per-request instructions, sent after the system prompt and outside the cached prefix. */
|
|
16
|
+
systemContext?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Retrieved chunks the reply can cite. Each one the model cites becomes a
|
|
19
|
+
* `source` part, once per page. Providers with native citations get them
|
|
20
|
+
* as content; others get a numbered block in the system context and cite
|
|
21
|
+
* with `[n]`, and numbers that match no source are removed from the text.
|
|
22
|
+
*/
|
|
23
|
+
sources?: RetrievedChunk[];
|
|
24
|
+
tools?: ToolRegistry;
|
|
25
|
+
conversationId: string;
|
|
26
|
+
/** The id to save the reply under. A new one by default. */
|
|
27
|
+
messageId?: string;
|
|
28
|
+
/** Model requests in this turn, counting the final answer. Default 6. */
|
|
29
|
+
maxSteps?: number;
|
|
30
|
+
toolTimeoutMs?: number;
|
|
31
|
+
maxTokens?: number;
|
|
32
|
+
temperature?: number;
|
|
33
|
+
/** Aborts the turn, for example when the visitor disconnects. */
|
|
34
|
+
signal?: AbortSignal;
|
|
35
|
+
/** Adds token usage to the `finish` part. */
|
|
36
|
+
exposeUsage?: boolean;
|
|
37
|
+
/** Where warnings and tool errors go. Default `consoleLogger()`. */
|
|
38
|
+
logger?: Logger;
|
|
39
|
+
/**
|
|
40
|
+
* Checked before each model request and charged after it. A used-up
|
|
41
|
+
* budget ends the reply with `budget_exceeded`, and the reply length is
|
|
42
|
+
* capped to the tokens left.
|
|
43
|
+
*/
|
|
44
|
+
budget?: {
|
|
45
|
+
guard: BudgetGuard;
|
|
46
|
+
context: BudgetContext;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Saves the reply. Called after each tool round with `final: false`, and
|
|
50
|
+
* once at the end with `final: true` and the reply's final status.
|
|
51
|
+
*/
|
|
52
|
+
onPersist?(message: ChatMessage, info: {
|
|
53
|
+
final: boolean;
|
|
54
|
+
}): Promise<void> | void;
|
|
55
|
+
/** Called as each tool call, tool result and emitted part (a captured lead) is added. */
|
|
56
|
+
onPart?(part: MessagePart): void;
|
|
57
|
+
}
|
|
58
|
+
export interface TurnResult {
|
|
59
|
+
/** `complete`, or `incomplete` (an error, the token limit, the step limit), or `aborted`. */
|
|
60
|
+
status: NonNullable<ChatMessage['status']>;
|
|
61
|
+
message: ChatMessage;
|
|
62
|
+
usage: TokenUsage;
|
|
63
|
+
finishReason: WireFinishReason;
|
|
64
|
+
/** What went wrong, for `incomplete` turns that ended in an error. */
|
|
65
|
+
error?: unknown;
|
|
66
|
+
}
|
|
67
|
+
/** One system prompt, for providers that take only one. */
|
|
68
|
+
export declare function joinSystem(systemPrompt: string, systemContext?: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* Runs one reply: model steps, tool calls between them, and saving the reply
|
|
71
|
+
* as it grows. Yields protocol v1 parts, starting with `start` and always
|
|
72
|
+
* ending with `finish`, and returns what happened.
|
|
73
|
+
*
|
|
74
|
+
* Provider errors don't throw: they become an `error` part, a `finish` with
|
|
75
|
+
* reason `error`, and `result.error`. An abort ends with reason `aborted`.
|
|
76
|
+
* Only a failing `onPersist` throws.
|
|
77
|
+
*/
|
|
78
|
+
export declare function runTurn(options: RunTurnOptions): AsyncGenerator<WirePart, TurnResult>;
|
|
79
|
+
//# sourceMappingURL=run-turn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-turn.d.ts","sourceRoot":"","sources":["../../src/agent/run-turn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAwC,KAAK,gBAAgB,EAAE,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC/G,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EAGX,UAAU,EAIX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAuB,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGhG,OAAO,EAAoB,KAAK,YAAY,EAAc,MAAM,oBAAoB,CAAC;AAQrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,sFAAsF;AACtF,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,UAAU,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,CAAC;IACxD;;;OAGG;IACH,SAAS,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACjF,yFAAyF;IACzF,MAAM,CAAC,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,6FAA6F;IAC7F,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,UAAU,CAAC;IAClB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,sEAAsE;IACtE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAID,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/E;AA8DD;;;;;;;;GAQG;AACH,wBAAuB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CA4T5F"}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import { consoleLogger } from '../logger.js';
|
|
2
|
+
import { messageText } from '../parts.js';
|
|
3
|
+
import { PROTOCOL_VERSION } from '../protocol/v1.js';
|
|
4
|
+
import { BudgetExceededError } from '../limits/budget.js';
|
|
5
|
+
import { DEFAULT_MAX_TOKENS } from '../providers/base.js';
|
|
6
|
+
import { ContentFilterError, MaxStepsError, RefusalError } from './errors.js';
|
|
7
|
+
import { executorRegistry, toolOutput } from './tool-registry.js';
|
|
8
|
+
import { CitationParser, NATIVE_SOURCES_INSTRUCTION, parseCitations, sourcesContext, sourcePart, } from '../retrieval/citations.js';
|
|
9
|
+
/** Model requests per turn: five tool rounds and the answer after them, as in 0.5. */
|
|
10
|
+
export const DEFAULT_MAX_STEPS = 6;
|
|
11
|
+
const NO_TOOLS = executorRegistry([]);
|
|
12
|
+
/** One system prompt, for providers that take only one. */
|
|
13
|
+
export function joinSystem(systemPrompt, systemContext) {
|
|
14
|
+
return systemContext ? `${systemPrompt}\n\n${systemContext}` : systemPrompt;
|
|
15
|
+
}
|
|
16
|
+
/** Never ask for fewer output tokens than this, even with little budget left. */
|
|
17
|
+
const MIN_STEP_TOKENS = 256;
|
|
18
|
+
function addUsage(total, step) {
|
|
19
|
+
total.inputTokens += step.inputTokens;
|
|
20
|
+
total.outputTokens += step.outputTokens;
|
|
21
|
+
if (step.cacheReadTokens)
|
|
22
|
+
total.cacheReadTokens = (total.cacheReadTokens ?? 0) + step.cacheReadTokens;
|
|
23
|
+
if (step.cacheWriteTokens)
|
|
24
|
+
total.cacheWriteTokens = (total.cacheWriteTokens ?? 0) + step.cacheWriteTokens;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Signatures only matter within the turn that produced them. Dropping them
|
|
28
|
+
* once the turn is over keeps stored conversations small, and providers
|
|
29
|
+
* accept history without them.
|
|
30
|
+
*/
|
|
31
|
+
function withoutReplayData(parts) {
|
|
32
|
+
const out = [];
|
|
33
|
+
for (const part of parts) {
|
|
34
|
+
if (!('providerMetadata' in part) || !part.providerMetadata) {
|
|
35
|
+
out.push(part);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const { claude: _claude, gemini, ...others } = part.providerMetadata;
|
|
39
|
+
const keptGemini = gemini?.syntheticId ? { gemini: { syntheticId: true } } : {};
|
|
40
|
+
const providerMetadata = { ...others, ...keptGemini };
|
|
41
|
+
const { providerMetadata: _, ...rest } = part;
|
|
42
|
+
if (part.type === 'reasoning' && part.text === '')
|
|
43
|
+
continue;
|
|
44
|
+
if (part.type === 'text' && part.text === '')
|
|
45
|
+
continue;
|
|
46
|
+
out.push(Object.keys(providerMetadata).length ? { ...rest, providerMetadata } : rest);
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
function resultPart(call, result) {
|
|
51
|
+
return {
|
|
52
|
+
type: 'tool-result',
|
|
53
|
+
toolCallId: call.id,
|
|
54
|
+
toolName: call.name,
|
|
55
|
+
output: toolOutput(result),
|
|
56
|
+
...(result.success ? {} : { error: result.message ?? 'The tool failed.' }),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function toWire(part) {
|
|
60
|
+
switch (part.type) {
|
|
61
|
+
case 'tool-call':
|
|
62
|
+
return { type: 'tool-call', toolCallId: part.toolCallId, toolName: part.toolName, input: part.input, executor: part.executor };
|
|
63
|
+
case 'tool-result':
|
|
64
|
+
return { type: 'tool-result', toolCallId: part.toolCallId, output: part.output, ...(part.error ? { error: part.error } : {}) };
|
|
65
|
+
case 'lead-captured':
|
|
66
|
+
return { type: 'lead-captured', lead: part.lead };
|
|
67
|
+
case 'source':
|
|
68
|
+
return { type: 'source', sourceId: part.sourceId, url: part.url, ...(part.title ? { title: part.title } : {}), ...(part.snippet ? { snippet: part.snippet } : {}) };
|
|
69
|
+
default:
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Runs one reply: model steps, tool calls between them, and saving the reply
|
|
75
|
+
* as it grows. Yields protocol v1 parts, starting with `start` and always
|
|
76
|
+
* ending with `finish`, and returns what happened.
|
|
77
|
+
*
|
|
78
|
+
* Provider errors don't throw: they become an `error` part, a `finish` with
|
|
79
|
+
* reason `error`, and `result.error`. An abort ends with reason `aborted`.
|
|
80
|
+
* Only a failing `onPersist` throws.
|
|
81
|
+
*/
|
|
82
|
+
export async function* runTurn(options) {
|
|
83
|
+
const logger = options.logger ?? consoleLogger();
|
|
84
|
+
const { provider, signal } = options;
|
|
85
|
+
const tools = options.tools ?? NO_TOOLS;
|
|
86
|
+
const maxSteps = Math.max(1, options.maxSteps ?? DEFAULT_MAX_STEPS);
|
|
87
|
+
const toolSignal = signal ?? new AbortController().signal;
|
|
88
|
+
const usage = { inputTokens: 0, outputTokens: 0 };
|
|
89
|
+
const message = {
|
|
90
|
+
id: options.messageId ?? crypto.randomUUID(),
|
|
91
|
+
role: 'assistant',
|
|
92
|
+
content: '',
|
|
93
|
+
parts: [],
|
|
94
|
+
timestamp: Date.now(),
|
|
95
|
+
aiGenerated: true,
|
|
96
|
+
};
|
|
97
|
+
const parts = message.parts;
|
|
98
|
+
let textCount = 0;
|
|
99
|
+
const sources = options.sources ?? [];
|
|
100
|
+
const nativeCitations = sources.length > 0 && provider.citations === 'native' && !!provider.step;
|
|
101
|
+
const systemContext = [
|
|
102
|
+
options.systemContext,
|
|
103
|
+
sources.length ? (nativeCitations ? NATIVE_SOURCES_INSTRUCTION : sourcesContext(sources)) : undefined,
|
|
104
|
+
]
|
|
105
|
+
.filter(Boolean)
|
|
106
|
+
.join('\n\n');
|
|
107
|
+
const citedPages = new Set();
|
|
108
|
+
/** `source` parts for newly cited chunks, at most one per page. */
|
|
109
|
+
function* cite(indexes) {
|
|
110
|
+
for (const index of indexes) {
|
|
111
|
+
const chunk = sources[index];
|
|
112
|
+
if (!chunk || citedPages.has(chunk.source.id))
|
|
113
|
+
continue;
|
|
114
|
+
citedPages.add(chunk.source.id);
|
|
115
|
+
const wire = add(sourcePart(chunk));
|
|
116
|
+
if (wire)
|
|
117
|
+
yield wire;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const add = (part) => {
|
|
121
|
+
parts.push(part);
|
|
122
|
+
if (part.type !== 'text' && part.type !== 'reasoning')
|
|
123
|
+
options.onPart?.(part);
|
|
124
|
+
return toWire(part);
|
|
125
|
+
};
|
|
126
|
+
const persist = async (final) => {
|
|
127
|
+
message.content = messageText(parts);
|
|
128
|
+
message.usage = { ...usage };
|
|
129
|
+
if (!final)
|
|
130
|
+
message.status = 'incomplete';
|
|
131
|
+
await options.onPersist?.(message, { final });
|
|
132
|
+
};
|
|
133
|
+
async function* end(status, detail = {}) {
|
|
134
|
+
message.status = status;
|
|
135
|
+
message.parts = withoutReplayData(parts);
|
|
136
|
+
if (detail.errorPart)
|
|
137
|
+
yield { type: 'error', ...detail.errorPart };
|
|
138
|
+
const reason = status === 'aborted' ? 'aborted' : detail.errorPart ? 'error' : (detail.reason ?? 'stop');
|
|
139
|
+
message.content = messageText(message.parts);
|
|
140
|
+
message.usage = { ...usage };
|
|
141
|
+
await options.onPersist?.(message, { final: true });
|
|
142
|
+
yield {
|
|
143
|
+
type: 'finish',
|
|
144
|
+
reason,
|
|
145
|
+
...(options.exposeUsage ? { usage: { inputTokens: usage.inputTokens, outputTokens: usage.outputTokens } } : {}),
|
|
146
|
+
};
|
|
147
|
+
return { status, message, usage, finishReason: reason, ...(detail.error !== undefined ? { error: detail.error } : {}) };
|
|
148
|
+
}
|
|
149
|
+
const failed = (error) => signal?.aborted
|
|
150
|
+
? end('aborted')
|
|
151
|
+
: end('incomplete', {
|
|
152
|
+
error,
|
|
153
|
+
errorPart: { code: 'provider_error', retryable: true },
|
|
154
|
+
});
|
|
155
|
+
/**
|
|
156
|
+
* Checks the budget before a model request. Ends the turn when one is used
|
|
157
|
+
* up; otherwise resolves the reply length, capped to the tokens left.
|
|
158
|
+
*/
|
|
159
|
+
async function* checkBudget(stepNumber) {
|
|
160
|
+
if (!options.budget)
|
|
161
|
+
return { maxTokens: options.maxTokens };
|
|
162
|
+
try {
|
|
163
|
+
const { tokensLeft } = await options.budget.guard.before(options.budget.context, stepNumber);
|
|
164
|
+
if (tokensLeft === undefined)
|
|
165
|
+
return { maxTokens: options.maxTokens };
|
|
166
|
+
const wanted = options.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
167
|
+
return { maxTokens: Math.min(wanted, Math.max(MIN_STEP_TOKENS, tokensLeft)) };
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
if (!(error instanceof BudgetExceededError))
|
|
171
|
+
throw error;
|
|
172
|
+
return {
|
|
173
|
+
ended: yield* end('incomplete', {
|
|
174
|
+
error,
|
|
175
|
+
errorPart: { code: 'budget_exceeded', retryable: false, scope: error.scope },
|
|
176
|
+
}),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
yield { type: 'start', protocol: PROTOCOL_VERSION, conversationId: options.conversationId, messageId: message.id };
|
|
181
|
+
if (!provider.step) {
|
|
182
|
+
return yield* legacyTurn();
|
|
183
|
+
}
|
|
184
|
+
const step = provider.step.bind(provider);
|
|
185
|
+
for (let stepNumber = 1;; stepNumber++) {
|
|
186
|
+
let textId = null;
|
|
187
|
+
let finish;
|
|
188
|
+
const calls = [];
|
|
189
|
+
const parser = sources.length && !nativeCitations ? new CitationParser(sources.length) : null;
|
|
190
|
+
const cited = [];
|
|
191
|
+
const budget = yield* checkBudget(stepNumber);
|
|
192
|
+
if (budget.ended)
|
|
193
|
+
return budget.ended;
|
|
194
|
+
try {
|
|
195
|
+
signal?.throwIfAborted();
|
|
196
|
+
for await (const event of step({
|
|
197
|
+
messages: [...options.messages, message],
|
|
198
|
+
systemPrompt: options.systemPrompt,
|
|
199
|
+
...(systemContext ? { systemContext } : {}),
|
|
200
|
+
...(tools.definitions.length ? { tools: tools.definitions } : {}),
|
|
201
|
+
...(nativeCitations ? { sources } : {}),
|
|
202
|
+
maxTokens: budget.maxTokens,
|
|
203
|
+
temperature: options.temperature,
|
|
204
|
+
signal,
|
|
205
|
+
})) {
|
|
206
|
+
if (event.type === 'text-delta') {
|
|
207
|
+
if (!event.delta)
|
|
208
|
+
continue;
|
|
209
|
+
if (!textId) {
|
|
210
|
+
textId = `${message.id}-${++textCount}`;
|
|
211
|
+
yield { type: 'text-start', id: textId };
|
|
212
|
+
}
|
|
213
|
+
const read = parser ? parser.push(event.delta) : { text: event.delta, cited: [] };
|
|
214
|
+
cited.push(...read.cited);
|
|
215
|
+
if (read.text)
|
|
216
|
+
yield { type: 'text-delta', id: textId, delta: read.text };
|
|
217
|
+
}
|
|
218
|
+
else if (event.type === 'source') {
|
|
219
|
+
cited.push(event.index);
|
|
220
|
+
}
|
|
221
|
+
else if (event.type === 'tool-call') {
|
|
222
|
+
calls.push(event);
|
|
223
|
+
}
|
|
224
|
+
else if (event.type === 'finish') {
|
|
225
|
+
finish = event;
|
|
226
|
+
}
|
|
227
|
+
// Reasoning is kept in the stored parts but never streamed (F01-D5).
|
|
228
|
+
}
|
|
229
|
+
if (!finish)
|
|
230
|
+
throw new Error(`The ${provider.name} step ended without finishing.`);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
if (textId)
|
|
234
|
+
yield { type: 'text-end', id: textId };
|
|
235
|
+
return yield* failed(error);
|
|
236
|
+
}
|
|
237
|
+
if (parser && textId) {
|
|
238
|
+
const rest = parser.flush();
|
|
239
|
+
cited.push(...rest.cited);
|
|
240
|
+
if (rest.text)
|
|
241
|
+
yield { type: 'text-delta', id: textId, delta: rest.text };
|
|
242
|
+
}
|
|
243
|
+
if (textId)
|
|
244
|
+
yield { type: 'text-end', id: textId };
|
|
245
|
+
addUsage(usage, finish.usage);
|
|
246
|
+
await options.budget?.guard.after(options.budget.context, finish.usage);
|
|
247
|
+
// A refused or filtered step isn't kept: there's nothing in it to send back.
|
|
248
|
+
if (finish.reason === 'refusal' || finish.reason === 'content-filter') {
|
|
249
|
+
return yield* end('incomplete', {
|
|
250
|
+
error: finish.reason === 'refusal' ? new RefusalError() : new ContentFilterError(),
|
|
251
|
+
errorPart: { code: 'content_filtered', retryable: false },
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
for (const part of finish.parts) {
|
|
255
|
+
// Stored text gets the same cleanup as the streamed text.
|
|
256
|
+
const stored = parser && part.type === 'text' ? { ...part, text: parseCitations(part.text, sources.length).text } : part;
|
|
257
|
+
const wire = add(stored);
|
|
258
|
+
if (wire)
|
|
259
|
+
yield wire;
|
|
260
|
+
}
|
|
261
|
+
yield* cite(cited);
|
|
262
|
+
if (finish.reason === 'error') {
|
|
263
|
+
return yield* end('incomplete', {
|
|
264
|
+
error: new Error(`The ${provider.name} step stopped with an error.`),
|
|
265
|
+
errorPart: { code: 'provider_error', retryable: true },
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
if (finish.reason === 'length') {
|
|
269
|
+
logger.warn('reply_truncated', 'The reply was cut off at the token limit. Raise `maxTokens` if this keeps happening.');
|
|
270
|
+
return yield* end('incomplete', { reason: 'length' });
|
|
271
|
+
}
|
|
272
|
+
if (finish.reason !== 'tool-calls' || calls.length === 0) {
|
|
273
|
+
return yield* end('complete');
|
|
274
|
+
}
|
|
275
|
+
const callParts = new Map(parts.filter((part) => part.type === 'tool-call').map((part) => [part.toolCallId, part]));
|
|
276
|
+
if (stepNumber >= maxSteps) {
|
|
277
|
+
for (const { call } of calls) {
|
|
278
|
+
const wire = add(resultPart(call, { success: false, message: 'Not run: the reply reached its tool round limit.' }));
|
|
279
|
+
if (wire)
|
|
280
|
+
yield wire;
|
|
281
|
+
}
|
|
282
|
+
return yield* end('incomplete', {
|
|
283
|
+
error: new MaxStepsError(maxSteps - 1),
|
|
284
|
+
errorPart: { code: 'tool_error', retryable: false },
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
// Every call of the step runs at once; results are kept in call order.
|
|
288
|
+
const results = await Promise.all(calls.map(({ call, inputError }) => inputError
|
|
289
|
+
? Promise.resolve({ success: false, message: inputError })
|
|
290
|
+
: tools.run(call, { conversationId: options.conversationId, signal: toolSignal, timeoutMs: options.toolTimeoutMs, logger })));
|
|
291
|
+
for (const [i, { call }] of calls.entries()) {
|
|
292
|
+
const result = results[i];
|
|
293
|
+
const callPart = callParts.get(call.id);
|
|
294
|
+
if (callPart)
|
|
295
|
+
callPart.state = result.success ? 'done' : 'error';
|
|
296
|
+
for (const part of [resultPart(call, result), ...(result.success ? tools.emits(call, result) : [])]) {
|
|
297
|
+
const wire = add(part);
|
|
298
|
+
if (wire)
|
|
299
|
+
yield wire;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (signal?.aborted)
|
|
303
|
+
return yield* end('aborted');
|
|
304
|
+
await persist(false);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* A provider written for 0.4 has `chat()` and runs tools itself. Its tool
|
|
308
|
+
* calls are recorded through the executor it's given, and their parts are
|
|
309
|
+
* streamed before the next text, the way the 0.5 server sent them.
|
|
310
|
+
*/
|
|
311
|
+
async function* legacyTurn() {
|
|
312
|
+
// A 0.4 provider reports no usage, so its replies can only be checked, not charged.
|
|
313
|
+
const budget = yield* checkBudget(1);
|
|
314
|
+
if (budget.ended)
|
|
315
|
+
return budget.ended;
|
|
316
|
+
const queued = [];
|
|
317
|
+
let textId = null;
|
|
318
|
+
let text = null;
|
|
319
|
+
const parser = sources.length ? new CitationParser(sources.length) : null;
|
|
320
|
+
const cited = [];
|
|
321
|
+
const toolExecutor = async (call) => {
|
|
322
|
+
text = null;
|
|
323
|
+
const callPart = {
|
|
324
|
+
type: 'tool-call', toolCallId: call.id, toolName: call.name, input: call.input, executor: 'server', state: 'pending',
|
|
325
|
+
};
|
|
326
|
+
const callWire = add(callPart);
|
|
327
|
+
if (callWire)
|
|
328
|
+
queued.push(callWire);
|
|
329
|
+
const result = await tools.run(call, { conversationId: options.conversationId, signal: toolSignal, timeoutMs: options.toolTimeoutMs, logger });
|
|
330
|
+
callPart.state = result.success ? 'done' : 'error';
|
|
331
|
+
for (const part of [resultPart(call, result), ...(result.success ? tools.emits(call, result) : [])]) {
|
|
332
|
+
const wire = add(part);
|
|
333
|
+
if (wire)
|
|
334
|
+
queued.push(wire);
|
|
335
|
+
}
|
|
336
|
+
return result;
|
|
337
|
+
};
|
|
338
|
+
try {
|
|
339
|
+
for await (const chunk of provider.chat({
|
|
340
|
+
// Providers written for 0.4 read `content` only, so a reply the
|
|
341
|
+
// visitor walked away from would look finished. Leave it out.
|
|
342
|
+
messages: options.messages.filter((m) => m.status !== 'aborted'),
|
|
343
|
+
systemPrompt: joinSystem(options.systemPrompt, systemContext || undefined),
|
|
344
|
+
...(tools.definitions.length ? { tools: tools.definitions } : {}),
|
|
345
|
+
toolExecutor,
|
|
346
|
+
toolTimeoutMs: options.toolTimeoutMs,
|
|
347
|
+
maxTokens: budget.maxTokens,
|
|
348
|
+
temperature: options.temperature,
|
|
349
|
+
signal,
|
|
350
|
+
})) {
|
|
351
|
+
if (signal?.aborted)
|
|
352
|
+
break;
|
|
353
|
+
if (!chunk)
|
|
354
|
+
continue;
|
|
355
|
+
if (queued.length) {
|
|
356
|
+
if (textId) {
|
|
357
|
+
yield { type: 'text-end', id: textId };
|
|
358
|
+
textId = null;
|
|
359
|
+
}
|
|
360
|
+
yield* queued.splice(0);
|
|
361
|
+
}
|
|
362
|
+
if (!textId) {
|
|
363
|
+
textId = `${message.id}-${++textCount}`;
|
|
364
|
+
yield { type: 'text-start', id: textId };
|
|
365
|
+
}
|
|
366
|
+
if (!text) {
|
|
367
|
+
text = { type: 'text', text: '' };
|
|
368
|
+
parts.push(text);
|
|
369
|
+
}
|
|
370
|
+
const read = parser ? parser.push(chunk) : { text: chunk, cited: [] };
|
|
371
|
+
cited.push(...read.cited);
|
|
372
|
+
text.text += read.text;
|
|
373
|
+
if (read.text)
|
|
374
|
+
yield { type: 'text-delta', id: textId, delta: read.text };
|
|
375
|
+
}
|
|
376
|
+
if (parser && textId) {
|
|
377
|
+
const rest = parser.flush();
|
|
378
|
+
cited.push(...rest.cited);
|
|
379
|
+
if (text)
|
|
380
|
+
text.text += rest.text;
|
|
381
|
+
if (rest.text)
|
|
382
|
+
yield { type: 'text-delta', id: textId, delta: rest.text };
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
catch (error) {
|
|
386
|
+
if (textId)
|
|
387
|
+
yield { type: 'text-end', id: textId };
|
|
388
|
+
// Tool parts recorded so far are saved but not streamed, as in 0.5.
|
|
389
|
+
return yield* failed(error);
|
|
390
|
+
}
|
|
391
|
+
if (textId)
|
|
392
|
+
yield { type: 'text-end', id: textId };
|
|
393
|
+
if (signal?.aborted)
|
|
394
|
+
return yield* end('aborted');
|
|
395
|
+
yield* queued.splice(0);
|
|
396
|
+
yield* cite(cited);
|
|
397
|
+
return yield* end('complete');
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=run-turn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-turn.js","sourceRoot":"","sources":["../../src/agent/run-turn.ts"],"names":[],"mappings":"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"}
|