dominds 1.22.0 → 1.23.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/access-control.js +2 -2
- package/dist/dialog-instance-registry.js +3 -4
- package/dist/dialog.d.ts +2 -2
- package/dist/dialog.js +3 -3
- package/dist/docs/dialog-system.md +3 -2
- package/dist/docs/dialog-system.zh.md +3 -2
- package/dist/docs/diligence-push.md +19 -12
- package/dist/docs/diligence-push.zh.md +11 -9
- package/dist/docs/dominds-terminology.md +3 -3
- package/dist/docs/encapsulated-taskdoc.md +11 -2
- package/dist/docs/encapsulated-taskdoc.zh.md +10 -1
- package/dist/docs/llm-provider-isolation.md +1 -1
- package/dist/docs/llm-provider-isolation.zh.md +1 -1
- package/dist/docs/team_mgmt-toolset.md +2 -1
- package/dist/docs/team_mgmt-toolset.zh.md +2 -1
- package/dist/docs/volcengine-coding-plan-openai-compatible.zh.md +11 -10
- package/dist/llm/api-quirks.d.ts +0 -2
- package/dist/llm/api-quirks.js +1 -3
- package/dist/llm/client.d.ts +1 -0
- package/dist/llm/defaults.yaml +45 -6
- package/dist/llm/gen/anthropic.d.ts +0 -6
- package/dist/llm/gen/anthropic.js +21 -468
- package/dist/llm/gen/openai-compatible.d.ts +14 -1
- package/dist/llm/gen/openai-compatible.js +482 -19
- package/dist/llm/gen.d.ts +4 -2
- package/dist/llm/kernel-driver/drive.js +164 -114
- package/dist/llm/kernel-driver/runtime.js +36 -11
- package/dist/llm/kernel-driver/tellask-special.js +12 -9
- package/dist/minds/system-prompt-parts.js +8 -8
- package/dist/persistence.d.ts +2 -3
- package/dist/persistence.js +53 -76
- package/dist/problems.js +2 -1
- package/dist/runtime/driver-messages.js +4 -4
- package/dist/server/websocket-handler.js +17 -3
- package/dist/team.d.ts +2 -1
- package/dist/team.js +11 -1
- package/dist/tools/ctrl.js +48 -11
- package/dist/tools/prompts/control/en/principles.md +3 -3
- package/dist/tools/prompts/control/en/scenarios.md +4 -0
- package/dist/tools/prompts/control/en/tools.md +6 -3
- package/dist/tools/prompts/control/zh/principles.md +3 -3
- package/dist/tools/prompts/control/zh/scenarios.md +4 -0
- package/dist/tools/prompts/control/zh/tools.md +6 -3
- package/dist/tools/team_mgmt-manual.js +4 -4
- package/dist/tools/team_mgmt.js +15 -5
- package/dist/utils/task-package.d.ts +16 -0
- package/dist/utils/task-package.js +132 -55
- package/dist/utils/taskdoc.js +21 -16
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-BYnYcdaa.js → _basePickBy-CGhMqD96.js} +3 -3
- package/webapp/dist/assets/{_basePickBy-BYnYcdaa.js.map → _basePickBy-CGhMqD96.js.map} +1 -1
- package/webapp/dist/assets/{_baseUniq-CHLBB955.js → _baseUniq-XCMW7z1Y.js} +2 -2
- package/webapp/dist/assets/{_baseUniq-CHLBB955.js.map → _baseUniq-XCMW7z1Y.js.map} +1 -1
- package/webapp/dist/assets/{arc-DQXtgZdO.js → arc-B6fzk0T5.js} +2 -2
- package/webapp/dist/assets/{arc-DQXtgZdO.js.map → arc-B6fzk0T5.js.map} +1 -1
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CzP5Yf9x.js → architectureDiagram-2XIMDMQ5-DmSI_GUt.js} +7 -7
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CzP5Yf9x.js.map → architectureDiagram-2XIMDMQ5-DmSI_GUt.js.map} +1 -1
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-sOx5Byq8.js → blockDiagram-WCTKOSBZ-Bp0nb8IZ.js} +7 -7
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-sOx5Byq8.js.map → blockDiagram-WCTKOSBZ-Bp0nb8IZ.js.map} +1 -1
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-D8-GiS6c.js → c4Diagram-IC4MRINW-gYpylqGb.js} +3 -3
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-D8-GiS6c.js.map → c4Diagram-IC4MRINW-gYpylqGb.js.map} +1 -1
- package/webapp/dist/assets/{channel-Bvke0iMP.js → channel-BmQ3YyUn.js} +2 -2
- package/webapp/dist/assets/{channel-Bvke0iMP.js.map → channel-BmQ3YyUn.js.map} +1 -1
- package/webapp/dist/assets/{chunk-4BX2VUAB-C9pln2M7.js → chunk-4BX2VUAB-B5pwFRwA.js} +2 -2
- package/webapp/dist/assets/{chunk-4BX2VUAB-C9pln2M7.js.map → chunk-4BX2VUAB-B5pwFRwA.js.map} +1 -1
- package/webapp/dist/assets/{chunk-55IACEB6-BLDXNtAM.js → chunk-55IACEB6-CZf6oMWM.js} +2 -2
- package/webapp/dist/assets/{chunk-55IACEB6-BLDXNtAM.js.map → chunk-55IACEB6-CZf6oMWM.js.map} +1 -1
- package/webapp/dist/assets/{chunk-FMBD7UC4-dYd3QdHa.js → chunk-FMBD7UC4-yZWCDzVz.js} +2 -2
- package/webapp/dist/assets/{chunk-FMBD7UC4-dYd3QdHa.js.map → chunk-FMBD7UC4-yZWCDzVz.js.map} +1 -1
- package/webapp/dist/assets/{chunk-JSJVCQXG-SqHEmHHd.js → chunk-JSJVCQXG-Cg1ST73M.js} +2 -2
- package/webapp/dist/assets/{chunk-JSJVCQXG-SqHEmHHd.js.map → chunk-JSJVCQXG-Cg1ST73M.js.map} +1 -1
- package/webapp/dist/assets/{chunk-KX2RTZJC-CRXgzI2d.js → chunk-KX2RTZJC-ByGtlX9q.js} +2 -2
- package/webapp/dist/assets/{chunk-KX2RTZJC-CRXgzI2d.js.map → chunk-KX2RTZJC-ByGtlX9q.js.map} +1 -1
- package/webapp/dist/assets/{chunk-NQ4KR5QH-IMA2JZhH.js → chunk-NQ4KR5QH-DoXvfhSY.js} +4 -4
- package/webapp/dist/assets/{chunk-NQ4KR5QH-IMA2JZhH.js.map → chunk-NQ4KR5QH-DoXvfhSY.js.map} +1 -1
- package/webapp/dist/assets/{chunk-QZHKN3VN-DBaGWjY3.js → chunk-QZHKN3VN-2gX2qsHB.js} +2 -2
- package/webapp/dist/assets/{chunk-QZHKN3VN-DBaGWjY3.js.map → chunk-QZHKN3VN-2gX2qsHB.js.map} +1 -1
- package/webapp/dist/assets/{chunk-WL4C6EOR-QLmsLbcS.js → chunk-WL4C6EOR-L-9bPNxS.js} +6 -6
- package/webapp/dist/assets/{chunk-WL4C6EOR-QLmsLbcS.js.map → chunk-WL4C6EOR-L-9bPNxS.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-jN4lhUtx.js → classDiagram-VBA2DB6C-B79Oe3Df.js} +7 -7
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-jN4lhUtx.js.map → classDiagram-VBA2DB6C-B79Oe3Df.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-jN4lhUtx.js → classDiagram-v2-RAHNMMFH-B79Oe3Df.js} +7 -7
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-jN4lhUtx.js.map → classDiagram-v2-RAHNMMFH-B79Oe3Df.js.map} +1 -1
- package/webapp/dist/assets/{clone-DPC4Vt09.js → clone-DvlY9Sdn.js} +2 -2
- package/webapp/dist/assets/{clone-DPC4Vt09.js.map → clone-DvlY9Sdn.js.map} +1 -1
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BtVgObsc.js → cose-bilkent-S5V4N54A-CtkGd0W6.js} +2 -2
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BtVgObsc.js.map → cose-bilkent-S5V4N54A-CtkGd0W6.js.map} +1 -1
- package/webapp/dist/assets/{dagre-KLK3FWXG-Bv6mn-UV.js → dagre-KLK3FWXG-B3W6QTXQ.js} +7 -7
- package/webapp/dist/assets/{dagre-KLK3FWXG-Bv6mn-UV.js.map → dagre-KLK3FWXG-B3W6QTXQ.js.map} +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-D2OPgDkq.js → diagram-E7M64L7V-B6-J_E5Q.js} +8 -8
- package/webapp/dist/assets/{diagram-E7M64L7V-D2OPgDkq.js.map → diagram-E7M64L7V-B6-J_E5Q.js.map} +1 -1
- package/webapp/dist/assets/{diagram-IFDJBPK2-CZpDu-e5.js → diagram-IFDJBPK2-C-PH_Yx3.js} +7 -7
- package/webapp/dist/assets/{diagram-IFDJBPK2-CZpDu-e5.js.map → diagram-IFDJBPK2-C-PH_Yx3.js.map} +1 -1
- package/webapp/dist/assets/{diagram-P4PSJMXO-BkMbbW0p.js → diagram-P4PSJMXO-CB5xXDup.js} +7 -7
- package/webapp/dist/assets/{diagram-P4PSJMXO-BkMbbW0p.js.map → diagram-P4PSJMXO-CB5xXDup.js.map} +1 -1
- package/webapp/dist/assets/{erDiagram-INFDFZHY-Kf17ek1z.js → erDiagram-INFDFZHY-CuAhTGVU.js} +5 -5
- package/webapp/dist/assets/{erDiagram-INFDFZHY-Kf17ek1z.js.map → erDiagram-INFDFZHY-CuAhTGVU.js.map} +1 -1
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-Cort4hNL.js → flowDiagram-PKNHOUZH-D3cIOfGj.js} +7 -7
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-Cort4hNL.js.map → flowDiagram-PKNHOUZH-D3cIOfGj.js.map} +1 -1
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DcXFKB1Y.js → ganttDiagram-A5KZAMGK-CSFhVYXV.js} +3 -3
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DcXFKB1Y.js.map → ganttDiagram-A5KZAMGK-CSFhVYXV.js.map} +1 -1
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-BORnqZ0-.js → gitGraphDiagram-K3NZZRJ6-CiEaxACG.js} +8 -8
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-BORnqZ0-.js.map → gitGraphDiagram-K3NZZRJ6-CiEaxACG.js.map} +1 -1
- package/webapp/dist/assets/{graph-D4Uth-MK.js → graph-CYGALRuy.js} +3 -3
- package/webapp/dist/assets/{graph-D4Uth-MK.js.map → graph-CYGALRuy.js.map} +1 -1
- package/webapp/dist/assets/{index-YBIJr7jH.js → index-BTazqQrV.js} +186 -58
- package/webapp/dist/assets/index-BTazqQrV.js.map +1 -0
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-DDjsEPg3.js → infoDiagram-LFFYTUFH-CiWJjQyU.js} +6 -6
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-DDjsEPg3.js.map → infoDiagram-LFFYTUFH-CiWJjQyU.js.map} +1 -1
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Bb2sPnCX.js → ishikawaDiagram-PHBUUO56-MlIIUO7o.js} +2 -2
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Bb2sPnCX.js.map → ishikawaDiagram-PHBUUO56-MlIIUO7o.js.map} +1 -1
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BtRY6eBa.js → journeyDiagram-4ABVD52K-BBqwkA3d.js} +5 -5
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BtRY6eBa.js.map → journeyDiagram-4ABVD52K-BBqwkA3d.js.map} +1 -1
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-aGmxT2H9.js → kanban-definition-K7BYSVSG-BS4GzDbo.js} +3 -3
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-aGmxT2H9.js.map → kanban-definition-K7BYSVSG-BS4GzDbo.js.map} +1 -1
- package/webapp/dist/assets/{layout-BuLicmwh.js → layout-DaJO-1DW.js} +5 -5
- package/webapp/dist/assets/{layout-BuLicmwh.js.map → layout-DaJO-1DW.js.map} +1 -1
- package/webapp/dist/assets/{linear-DIPh96mp.js → linear-SWy2Cl7G.js} +2 -2
- package/webapp/dist/assets/{linear-DIPh96mp.js.map → linear-SWy2Cl7G.js.map} +1 -1
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-ofWsysn9.js → mindmap-definition-YRQLILUH-B_gNrT3l.js} +4 -4
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-ofWsysn9.js.map → mindmap-definition-YRQLILUH-B_gNrT3l.js.map} +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DQqCTITO.js → pieDiagram-SKSYHLDU-CVh3lLBA.js} +8 -8
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DQqCTITO.js.map → pieDiagram-SKSYHLDU-CVh3lLBA.js.map} +1 -1
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DxWc0avu.js → quadrantDiagram-337W2JSQ-D0zAkVD7.js} +3 -3
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DxWc0avu.js.map → quadrantDiagram-337W2JSQ-D0zAkVD7.js.map} +1 -1
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DHgYfzwt.js → requirementDiagram-Z7DCOOCP--CTFD60w.js} +4 -4
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DHgYfzwt.js.map → requirementDiagram-Z7DCOOCP--CTFD60w.js.map} +1 -1
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Cuhwe80W.js → sankeyDiagram-WA2Y5GQK-XZnViaAX.js} +2 -2
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Cuhwe80W.js.map → sankeyDiagram-WA2Y5GQK-XZnViaAX.js.map} +1 -1
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DqSNoro8.js → sequenceDiagram-2WXFIKYE-BWAMhn_x.js} +4 -4
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DqSNoro8.js.map → sequenceDiagram-2WXFIKYE-BWAMhn_x.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-D1mvuJi6.js → stateDiagram-RAJIS63D--jsLD0Dg.js} +9 -9
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-D1mvuJi6.js.map → stateDiagram-RAJIS63D--jsLD0Dg.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BCYX5Gy-.js → stateDiagram-v2-FVOUBMTO-DUG9vyI5.js} +5 -5
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BCYX5Gy-.js.map → stateDiagram-v2-FVOUBMTO-DUG9vyI5.js.map} +1 -1
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-DDLYGao7.js → timeline-definition-YZTLITO2-BROLp1hL.js} +3 -3
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-DDLYGao7.js.map → timeline-definition-YZTLITO2-BROLp1hL.js.map} +1 -1
- package/webapp/dist/assets/{treemap-KZPCXAKY-DXkv1e6y.js → treemap-KZPCXAKY-BXuIlbYo.js} +5 -5
- package/webapp/dist/assets/{treemap-KZPCXAKY-DXkv1e6y.js.map → treemap-KZPCXAKY-BXuIlbYo.js.map} +1 -1
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DMxsg9P0.js → vennDiagram-LZ73GAT5-BXWd8gBB.js} +2 -2
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DMxsg9P0.js.map → vennDiagram-LZ73GAT5-BXWd8gBB.js.map} +1 -1
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BJ2qipzT.js → xychartDiagram-JWTSCODW-DR5z9o6h.js} +3 -3
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BJ2qipzT.js.map → xychartDiagram-JWTSCODW-DR5z9o6h.js.map} +1 -1
- package/webapp/dist/index.html +1 -1
- package/webapp/dist/assets/index-YBIJr7jH.js.map +0 -1
|
@@ -9,7 +9,6 @@ exports.consumeAnthropicStream = consumeAnthropicStream;
|
|
|
9
9
|
exports.reconstructAnthropicContextWrapper = reconstructAnthropicContextWrapper;
|
|
10
10
|
exports.reconstructAnthropicContextWrapperAsync = reconstructAnthropicContextWrapperAsync;
|
|
11
11
|
const sdk_1 = require("@anthropic-ai/sdk");
|
|
12
|
-
const crypto_1 = require("crypto");
|
|
13
12
|
const events_1 = require("events");
|
|
14
13
|
const fs_1 = require("fs");
|
|
15
14
|
const promises_1 = __importDefault(require("fs/promises"));
|
|
@@ -17,7 +16,6 @@ const path_1 = __importDefault(require("path"));
|
|
|
17
16
|
const log_1 = require("../../log");
|
|
18
17
|
const i18n_text_1 = require("../../runtime/i18n-text");
|
|
19
18
|
const work_language_1 = require("../../runtime/work-language");
|
|
20
|
-
const api_quirks_1 = require("../api-quirks");
|
|
21
19
|
const artifacts_1 = require("./artifacts");
|
|
22
20
|
const failure_classifier_1 = require("./failure-classifier");
|
|
23
21
|
const tool_call_context_1 = require("./tool-call-context");
|
|
@@ -28,13 +26,6 @@ const ANTHROPIC_JSON_RESPONSE_TOOL_NAME = 'dominds_json_response';
|
|
|
28
26
|
const ANTHROPIC_JSON_RESPONSE_TOOL_DESCRIPTION = 'Return the final answer as a JSON object. Do not include any non-JSON text.';
|
|
29
27
|
const ANTHROPIC_COMPAT_CAPTURE_SSE_ENV = 'DOMINDS_ANTHROPIC_COMPAT_CAPTURE_SSE';
|
|
30
28
|
const ANTHROPIC_COMPAT_CAPTURE_DIR_ENV = 'DOMINDS_ANTHROPIC_COMPAT_CAPTURE_DIR';
|
|
31
|
-
const VOLCANO_TEXT_TOOL_USE_PATTERN = new RegExp(String.raw `(?:Function call emitted by the assistant\.\r?\n|^|\r?\n)` +
|
|
32
|
-
String.raw `Tool name:\s*([A-Za-z_][A-Za-z0-9_.:-]*)\r?\n` +
|
|
33
|
-
String.raw `Call ID:\s*(call_[A-Za-z0-9_-]+)\r?\n` +
|
|
34
|
-
String.raw `Raw arguments, verbatim:\r?\n` +
|
|
35
|
-
String.raw `<raw_arguments>(?:\r?\n)?([\s\S]*?)(?:\r?\n)?</raw_arguments>`, 'g');
|
|
36
|
-
const VOLCANO_SEED_TOOL_CALL_PATTERN = /<seed:tool_call>\s*<function\s+name="([A-Za-z_][A-Za-z0-9_.:-]*)">\s*([\s\S]*?)<\/function>\s*<\/seed:tool_call>/g;
|
|
37
|
-
const VOLCANO_SEED_TOOL_PARAMETER_PATTERN = /<parameter\s+name="([^"]+)"\s+string="(true|false)">([\s\S]*?)<\/parameter>/g;
|
|
38
29
|
const ANTHROPIC_JSON_RESPONSE_TOOL_INPUT_SCHEMA = {
|
|
39
30
|
type: 'object',
|
|
40
31
|
additionalProperties: true,
|
|
@@ -463,13 +454,6 @@ function createAnthropicClient(args) {
|
|
|
463
454
|
}
|
|
464
455
|
return new sdk_1.Anthropic(options);
|
|
465
456
|
}
|
|
466
|
-
function resolveAnthropicStreamConsumeQuirks(providerConfig) {
|
|
467
|
-
const apiQuirks = (0, api_quirks_1.normalizeProviderApiQuirks)(providerConfig);
|
|
468
|
-
return {
|
|
469
|
-
normalizeLoneClosingBraceEmptyToolInputDelta: apiQuirks.has(api_quirks_1.GLM_VIA_VOLCANO_API_QUIRK),
|
|
470
|
-
convertVolcanoTextToolUseBlocks: apiQuirks.has(api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK),
|
|
471
|
-
};
|
|
472
|
-
}
|
|
473
457
|
function buildAnthropicCompatibleMessagesUrl(providerConfig) {
|
|
474
458
|
if (!providerConfig.baseUrl) {
|
|
475
459
|
throw new Error(`Provider '${providerConfig.name}' is missing baseUrl.`);
|
|
@@ -1295,24 +1279,11 @@ function stringifyToolUseInitialInput(input) {
|
|
|
1295
1279
|
const stringified = JSON.stringify(input);
|
|
1296
1280
|
return typeof stringified === 'string' && stringified.length > 0 ? stringified : '{}';
|
|
1297
1281
|
}
|
|
1298
|
-
function
|
|
1299
|
-
return isNonArrayRecord(value) && Object.keys(value).length === 0;
|
|
1300
|
-
}
|
|
1301
|
-
function resolveToolUseArgumentsJson(state, quirks) {
|
|
1282
|
+
function resolveToolUseArgumentsJson(state) {
|
|
1302
1283
|
const trimmed = state.inputJson.trim();
|
|
1303
1284
|
if (trimmed.length === 0) {
|
|
1304
1285
|
return stringifyToolUseInitialInput(state.initialInput);
|
|
1305
1286
|
}
|
|
1306
|
-
if (quirks.normalizeLoneClosingBraceEmptyToolInputDelta &&
|
|
1307
|
-
trimmed === '}' &&
|
|
1308
|
-
isEmptyJsonObject(state.initialInput)) {
|
|
1309
|
-
log.warn('ANTH quirk normalized lone closing-brace tool input delta to empty object', undefined, {
|
|
1310
|
-
quirk: api_quirks_1.GLM_VIA_VOLCANO_API_QUIRK,
|
|
1311
|
-
callId: state.id,
|
|
1312
|
-
toolName: state.name,
|
|
1313
|
-
});
|
|
1314
|
-
return '{}';
|
|
1315
|
-
}
|
|
1316
1287
|
try {
|
|
1317
1288
|
JSON.parse(trimmed);
|
|
1318
1289
|
return state.inputJson;
|
|
@@ -1328,60 +1299,6 @@ function resolveToolUseArgumentsJson(state, quirks) {
|
|
|
1328
1299
|
return state.inputJson;
|
|
1329
1300
|
}
|
|
1330
1301
|
}
|
|
1331
|
-
function createVolcanoToolCallIdRegistry(knownFunctionCallIds) {
|
|
1332
|
-
return {
|
|
1333
|
-
used: new Set(knownFunctionCallIds ?? []),
|
|
1334
|
-
nextSuffixByCallId: new Map(),
|
|
1335
|
-
};
|
|
1336
|
-
}
|
|
1337
|
-
function decodeVolcanoSeedXmlText(text) {
|
|
1338
|
-
return text
|
|
1339
|
-
.replace(/"/g, '"')
|
|
1340
|
-
.replace(/'/g, "'")
|
|
1341
|
-
.replace(/</g, '<')
|
|
1342
|
-
.replace(/>/g, '>')
|
|
1343
|
-
.replace(/&/g, '&');
|
|
1344
|
-
}
|
|
1345
|
-
function createVolcanoSeedToolCallId(args) {
|
|
1346
|
-
const hash = (0, crypto_1.createHash)('sha256')
|
|
1347
|
-
.update(args.name)
|
|
1348
|
-
.update('\0')
|
|
1349
|
-
.update(args.rawParametersText)
|
|
1350
|
-
.update('\0')
|
|
1351
|
-
.update(String(args.textIndex))
|
|
1352
|
-
.update('\0')
|
|
1353
|
-
.update(args.blockIndex === undefined ? '' : String(args.blockIndex))
|
|
1354
|
-
.digest('hex')
|
|
1355
|
-
.slice(0, 24);
|
|
1356
|
-
if (args.genseq !== undefined) {
|
|
1357
|
-
return `call_volcano_seed_g${String(args.genseq)}_${hash}`;
|
|
1358
|
-
}
|
|
1359
|
-
return `call_volcano_seed_${hash}`;
|
|
1360
|
-
}
|
|
1361
|
-
function uniquifyVolcanoTextToolCallId(args) {
|
|
1362
|
-
const trimmed = args.callId.trim();
|
|
1363
|
-
if (trimmed.length === 0 || args.idRegistry === undefined)
|
|
1364
|
-
return args.callId;
|
|
1365
|
-
if (!args.idRegistry.used.has(trimmed)) {
|
|
1366
|
-
args.idRegistry.used.add(trimmed);
|
|
1367
|
-
return trimmed;
|
|
1368
|
-
}
|
|
1369
|
-
for (;;) {
|
|
1370
|
-
const nextSuffix = (args.idRegistry.nextSuffixByCallId.get(trimmed) ?? 0) + 1;
|
|
1371
|
-
args.idRegistry.nextSuffixByCallId.set(trimmed, nextSuffix);
|
|
1372
|
-
const candidate = `${trimmed}_v${String(nextSuffix)}`;
|
|
1373
|
-
if (args.idRegistry.used.has(candidate))
|
|
1374
|
-
continue;
|
|
1375
|
-
args.idRegistry.used.add(candidate);
|
|
1376
|
-
log.warn('ANTH volcano-tool-use quirk rewrote duplicate function call id', undefined, {
|
|
1377
|
-
quirk: api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK,
|
|
1378
|
-
originalCallId: trimmed,
|
|
1379
|
-
callId: candidate,
|
|
1380
|
-
toolName: args.toolName,
|
|
1381
|
-
});
|
|
1382
|
-
return candidate;
|
|
1383
|
-
}
|
|
1384
|
-
}
|
|
1385
1302
|
function assertValidAnthropicStreamGenseq(genseq) {
|
|
1386
1303
|
if (genseq === undefined)
|
|
1387
1304
|
return;
|
|
@@ -1389,259 +1306,6 @@ function assertValidAnthropicStreamGenseq(genseq) {
|
|
|
1389
1306
|
throw new Error(`Invalid Anthropic stream genseq for tool-call correlation: ${String(genseq)}`);
|
|
1390
1307
|
}
|
|
1391
1308
|
}
|
|
1392
|
-
function parseVolcanoSeedParameterValue(args) {
|
|
1393
|
-
const decoded = decodeVolcanoSeedXmlText(args.rawValueText);
|
|
1394
|
-
if (args.stringFlag === 'true')
|
|
1395
|
-
return decoded;
|
|
1396
|
-
try {
|
|
1397
|
-
return JSON.parse(decoded);
|
|
1398
|
-
}
|
|
1399
|
-
catch (error) {
|
|
1400
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
1401
|
-
throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} seed tool_call parameter JSON for ${args.name}: ${message}`);
|
|
1402
|
-
}
|
|
1403
|
-
}
|
|
1404
|
-
function parseVolcanoSeedToolArgumentsJson(rawParametersText) {
|
|
1405
|
-
const parameters = {};
|
|
1406
|
-
let cursor = 0;
|
|
1407
|
-
VOLCANO_SEED_TOOL_PARAMETER_PATTERN.lastIndex = 0;
|
|
1408
|
-
for (;;) {
|
|
1409
|
-
const match = VOLCANO_SEED_TOOL_PARAMETER_PATTERN.exec(rawParametersText);
|
|
1410
|
-
if (!match)
|
|
1411
|
-
break;
|
|
1412
|
-
if (rawParametersText.slice(cursor, match.index).trim().length > 0) {
|
|
1413
|
-
throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} seed tool_call: unexpected text between parameters`);
|
|
1414
|
-
}
|
|
1415
|
-
const rawName = match[1];
|
|
1416
|
-
const stringFlag = match[2];
|
|
1417
|
-
const rawValueText = match[3];
|
|
1418
|
-
if (rawName === undefined || stringFlag === undefined || rawValueText === undefined) {
|
|
1419
|
-
throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} seed tool_call parameter`);
|
|
1420
|
-
}
|
|
1421
|
-
if (stringFlag !== 'true' && stringFlag !== 'false') {
|
|
1422
|
-
throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} seed tool_call string flag`);
|
|
1423
|
-
}
|
|
1424
|
-
const name = decodeVolcanoSeedXmlText(rawName);
|
|
1425
|
-
if (Object.prototype.hasOwnProperty.call(parameters, name)) {
|
|
1426
|
-
throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} seed tool_call: duplicate parameter ${name}`);
|
|
1427
|
-
}
|
|
1428
|
-
parameters[name] = parseVolcanoSeedParameterValue({
|
|
1429
|
-
name,
|
|
1430
|
-
stringFlag,
|
|
1431
|
-
rawValueText,
|
|
1432
|
-
});
|
|
1433
|
-
cursor = VOLCANO_SEED_TOOL_PARAMETER_PATTERN.lastIndex;
|
|
1434
|
-
}
|
|
1435
|
-
if (cursor === 0 && rawParametersText.trim().length > 0) {
|
|
1436
|
-
throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} seed tool_call parameters`);
|
|
1437
|
-
}
|
|
1438
|
-
if (rawParametersText.slice(cursor).trim().length > 0) {
|
|
1439
|
-
throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} seed tool_call: unexpected trailing parameter text`);
|
|
1440
|
-
}
|
|
1441
|
-
return JSON.stringify(parameters);
|
|
1442
|
-
}
|
|
1443
|
-
function splitVolcanoTextToolUseParts(args) {
|
|
1444
|
-
const parts = [];
|
|
1445
|
-
const matches = [];
|
|
1446
|
-
VOLCANO_TEXT_TOOL_USE_PATTERN.lastIndex = 0;
|
|
1447
|
-
for (;;) {
|
|
1448
|
-
const match = VOLCANO_TEXT_TOOL_USE_PATTERN.exec(args.text);
|
|
1449
|
-
if (!match)
|
|
1450
|
-
break;
|
|
1451
|
-
const name = match[1];
|
|
1452
|
-
const id = match[2];
|
|
1453
|
-
const rawArguments = match[3];
|
|
1454
|
-
if (name === undefined || id === undefined || rawArguments === undefined) {
|
|
1455
|
-
continue;
|
|
1456
|
-
}
|
|
1457
|
-
matches.push({
|
|
1458
|
-
index: match.index,
|
|
1459
|
-
endIndex: VOLCANO_TEXT_TOOL_USE_PATTERN.lastIndex,
|
|
1460
|
-
id,
|
|
1461
|
-
name,
|
|
1462
|
-
rawArgumentsText: rawArguments,
|
|
1463
|
-
});
|
|
1464
|
-
}
|
|
1465
|
-
VOLCANO_SEED_TOOL_CALL_PATTERN.lastIndex = 0;
|
|
1466
|
-
for (;;) {
|
|
1467
|
-
const match = VOLCANO_SEED_TOOL_CALL_PATTERN.exec(args.text);
|
|
1468
|
-
if (!match)
|
|
1469
|
-
break;
|
|
1470
|
-
const name = match[1];
|
|
1471
|
-
const rawParametersText = match[2];
|
|
1472
|
-
if (name === undefined || rawParametersText === undefined) {
|
|
1473
|
-
continue;
|
|
1474
|
-
}
|
|
1475
|
-
matches.push({
|
|
1476
|
-
index: match.index,
|
|
1477
|
-
endIndex: VOLCANO_SEED_TOOL_CALL_PATTERN.lastIndex,
|
|
1478
|
-
id: createVolcanoSeedToolCallId({
|
|
1479
|
-
name,
|
|
1480
|
-
rawParametersText,
|
|
1481
|
-
textIndex: match.index,
|
|
1482
|
-
blockIndex: args.blockIndex,
|
|
1483
|
-
genseq: args.genseq,
|
|
1484
|
-
}),
|
|
1485
|
-
name,
|
|
1486
|
-
rawArgumentsText: parseVolcanoSeedToolArgumentsJson(rawParametersText),
|
|
1487
|
-
});
|
|
1488
|
-
}
|
|
1489
|
-
matches.sort((a, b) => a.index - b.index);
|
|
1490
|
-
let cursor = 0;
|
|
1491
|
-
for (const match of matches) {
|
|
1492
|
-
if (match.index < cursor) {
|
|
1493
|
-
throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} text tool_call: overlapping blocks`);
|
|
1494
|
-
}
|
|
1495
|
-
if (match.index > cursor) {
|
|
1496
|
-
parts.push({ kind: 'text', text: args.text.slice(cursor, match.index) });
|
|
1497
|
-
}
|
|
1498
|
-
parts.push({
|
|
1499
|
-
kind: 'tool_use',
|
|
1500
|
-
id: uniquifyVolcanoTextToolCallId({
|
|
1501
|
-
callId: match.id,
|
|
1502
|
-
toolName: match.name,
|
|
1503
|
-
idRegistry: args.idRegistry,
|
|
1504
|
-
}),
|
|
1505
|
-
name: match.name,
|
|
1506
|
-
rawArgumentsText: match.rawArgumentsText,
|
|
1507
|
-
});
|
|
1508
|
-
cursor = match.endIndex;
|
|
1509
|
-
}
|
|
1510
|
-
if (cursor === 0)
|
|
1511
|
-
return [{ kind: 'text', text: args.text }];
|
|
1512
|
-
if (cursor < args.text.length) {
|
|
1513
|
-
parts.push({ kind: 'text', text: args.text.slice(cursor) });
|
|
1514
|
-
}
|
|
1515
|
-
return parts;
|
|
1516
|
-
}
|
|
1517
|
-
async function emitTextWithVolcanoToolUseQuirk(args) {
|
|
1518
|
-
let sayingStarted = args.sayingStarted;
|
|
1519
|
-
let thinkingStarted = args.thinkingStarted;
|
|
1520
|
-
const parts = args.quirks.convertVolcanoTextToolUseBlocks
|
|
1521
|
-
? splitVolcanoTextToolUseParts({
|
|
1522
|
-
text: args.text,
|
|
1523
|
-
genseq: args.genseq,
|
|
1524
|
-
blockIndex: args.blockIndex,
|
|
1525
|
-
idRegistry: args.idRegistry,
|
|
1526
|
-
})
|
|
1527
|
-
: [{ kind: 'text', text: args.text }];
|
|
1528
|
-
for (const part of parts) {
|
|
1529
|
-
if (part.kind === 'text') {
|
|
1530
|
-
if (part.text.length === 0)
|
|
1531
|
-
continue;
|
|
1532
|
-
if (thinkingStarted) {
|
|
1533
|
-
log.error('ANTH stream ordering violation: received text_delta while thinking stream still active', new Error('anthropic_stream_order_violation'));
|
|
1534
|
-
await args.receiver.thinkingFinish();
|
|
1535
|
-
thinkingStarted = false;
|
|
1536
|
-
}
|
|
1537
|
-
if (!sayingStarted) {
|
|
1538
|
-
sayingStarted = true;
|
|
1539
|
-
await args.receiver.sayingStart();
|
|
1540
|
-
}
|
|
1541
|
-
await args.receiver.sayingChunk(part.text);
|
|
1542
|
-
continue;
|
|
1543
|
-
}
|
|
1544
|
-
if (sayingStarted) {
|
|
1545
|
-
await args.receiver.sayingFinish();
|
|
1546
|
-
sayingStarted = false;
|
|
1547
|
-
}
|
|
1548
|
-
log.warn('ANTH quirk converted text-rendered tool use to function call', undefined, {
|
|
1549
|
-
quirk: api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK,
|
|
1550
|
-
callId: part.id,
|
|
1551
|
-
toolName: part.name,
|
|
1552
|
-
});
|
|
1553
|
-
await args.receiver.funcCall(part.id, part.name, part.rawArgumentsText);
|
|
1554
|
-
}
|
|
1555
|
-
return { sayingStarted, thinkingStarted };
|
|
1556
|
-
}
|
|
1557
|
-
async function emitThinkingWithVolcanoToolUseQuirk(args) {
|
|
1558
|
-
let sayingStarted = args.sayingStarted;
|
|
1559
|
-
let thinkingStarted = args.thinkingStarted;
|
|
1560
|
-
const parts = args.quirks.convertVolcanoTextToolUseBlocks
|
|
1561
|
-
? splitVolcanoTextToolUseParts({
|
|
1562
|
-
text: args.text,
|
|
1563
|
-
genseq: args.genseq,
|
|
1564
|
-
blockIndex: args.blockIndex,
|
|
1565
|
-
idRegistry: args.idRegistry,
|
|
1566
|
-
})
|
|
1567
|
-
: [{ kind: 'text', text: args.text }];
|
|
1568
|
-
for (const part of parts) {
|
|
1569
|
-
if (part.kind === 'text') {
|
|
1570
|
-
if (part.text.length === 0)
|
|
1571
|
-
continue;
|
|
1572
|
-
if (sayingStarted) {
|
|
1573
|
-
log.error('ANTH stream ordering violation: received thinking_delta while saying stream still active', new Error('anthropic_stream_order_violation'));
|
|
1574
|
-
await args.receiver.sayingFinish();
|
|
1575
|
-
sayingStarted = false;
|
|
1576
|
-
}
|
|
1577
|
-
if (!thinkingStarted) {
|
|
1578
|
-
thinkingStarted = true;
|
|
1579
|
-
await args.receiver.thinkingStart();
|
|
1580
|
-
}
|
|
1581
|
-
await args.receiver.thinkingChunk(part.text);
|
|
1582
|
-
continue;
|
|
1583
|
-
}
|
|
1584
|
-
if (thinkingStarted) {
|
|
1585
|
-
await args.receiver.thinkingFinish();
|
|
1586
|
-
thinkingStarted = false;
|
|
1587
|
-
}
|
|
1588
|
-
log.warn('ANTH quirk converted thinking-rendered tool use to function call', undefined, {
|
|
1589
|
-
quirk: api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK,
|
|
1590
|
-
callId: part.id,
|
|
1591
|
-
toolName: part.name,
|
|
1592
|
-
});
|
|
1593
|
-
await args.receiver.funcCall(part.id, part.name, part.rawArgumentsText);
|
|
1594
|
-
}
|
|
1595
|
-
return { sayingStarted, thinkingStarted };
|
|
1596
|
-
}
|
|
1597
|
-
async function flushPendingVolcanoToolUseBlocks(args) {
|
|
1598
|
-
let sayingStarted = args.sayingStarted;
|
|
1599
|
-
let thinkingStarted = args.thinkingStarted;
|
|
1600
|
-
const blockIndexes = new Set([...args.textBlocks.keys(), ...args.thinkingBlocks.keys()]);
|
|
1601
|
-
for (const blockIndex of [...blockIndexes].sort((a, b) => a - b)) {
|
|
1602
|
-
const pendingText = args.textBlocks.get(blockIndex);
|
|
1603
|
-
const pendingThinking = args.thinkingBlocks.get(blockIndex);
|
|
1604
|
-
if (pendingText !== undefined && pendingThinking !== undefined) {
|
|
1605
|
-
throw new Error(`ANTH invariant violation: block ${String(blockIndex)} has both pending text and thinking`);
|
|
1606
|
-
}
|
|
1607
|
-
if (pendingText === undefined && pendingThinking === undefined) {
|
|
1608
|
-
throw new Error(`ANTH invariant violation: block ${String(blockIndex)} has no pending text or thinking`);
|
|
1609
|
-
}
|
|
1610
|
-
let updated;
|
|
1611
|
-
if (pendingText !== undefined) {
|
|
1612
|
-
updated = await emitTextWithVolcanoToolUseQuirk({
|
|
1613
|
-
text: pendingText,
|
|
1614
|
-
receiver: args.receiver,
|
|
1615
|
-
quirks: args.quirks,
|
|
1616
|
-
sayingStarted,
|
|
1617
|
-
thinkingStarted,
|
|
1618
|
-
genseq: args.genseq,
|
|
1619
|
-
blockIndex,
|
|
1620
|
-
idRegistry: args.idRegistry,
|
|
1621
|
-
});
|
|
1622
|
-
}
|
|
1623
|
-
else {
|
|
1624
|
-
if (pendingThinking === undefined) {
|
|
1625
|
-
throw new Error(`ANTH invariant violation: block ${String(blockIndex)} has no pending thinking`);
|
|
1626
|
-
}
|
|
1627
|
-
updated = await emitThinkingWithVolcanoToolUseQuirk({
|
|
1628
|
-
text: pendingThinking,
|
|
1629
|
-
receiver: args.receiver,
|
|
1630
|
-
quirks: args.quirks,
|
|
1631
|
-
sayingStarted,
|
|
1632
|
-
thinkingStarted,
|
|
1633
|
-
genseq: args.genseq,
|
|
1634
|
-
blockIndex,
|
|
1635
|
-
idRegistry: args.idRegistry,
|
|
1636
|
-
});
|
|
1637
|
-
}
|
|
1638
|
-
sayingStarted = updated.sayingStarted;
|
|
1639
|
-
thinkingStarted = updated.thinkingStarted;
|
|
1640
|
-
}
|
|
1641
|
-
args.textBlocks.clear();
|
|
1642
|
-
args.thinkingBlocks.clear();
|
|
1643
|
-
return { sayingStarted, thinkingStarted };
|
|
1644
|
-
}
|
|
1645
1309
|
/**
|
|
1646
1310
|
* Convert a single ChatMessage to content blocks for Anthropic SDK.
|
|
1647
1311
|
* Returns array of content blocks (may contain multiple for complex messages).
|
|
@@ -1706,7 +1370,7 @@ function chatMessageToAnthropic(chatMsg) {
|
|
|
1706
1370
|
content: contentBlocks.length === 1 ? contentBlocks : contentBlocks,
|
|
1707
1371
|
};
|
|
1708
1372
|
}
|
|
1709
|
-
function anthropicToChatMessages(message, genseq, forcedJsonToolName
|
|
1373
|
+
function anthropicToChatMessages(message, genseq, forcedJsonToolName) {
|
|
1710
1374
|
const results = [];
|
|
1711
1375
|
if (!isRecord(message)) {
|
|
1712
1376
|
throw new Error('Invalid Anthropic message: expected object');
|
|
@@ -1750,37 +1414,9 @@ function anthropicToChatMessages(message, genseq, forcedJsonToolName, quirks, kn
|
|
|
1750
1414
|
});
|
|
1751
1415
|
};
|
|
1752
1416
|
if (role === 'assistant') {
|
|
1753
|
-
const volcanoToolCallIdRegistry = quirks?.convertVolcanoTextToolUseBlocks === true
|
|
1754
|
-
? createVolcanoToolCallIdRegistry(knownFunctionCallIds)
|
|
1755
|
-
: undefined;
|
|
1756
1417
|
for (const block of blocks) {
|
|
1757
1418
|
if (isRecord(block) && block.type === 'text' && typeof block.text === 'string') {
|
|
1758
|
-
|
|
1759
|
-
? splitVolcanoTextToolUseParts({
|
|
1760
|
-
text: block.text,
|
|
1761
|
-
genseq,
|
|
1762
|
-
idRegistry: volcanoToolCallIdRegistry,
|
|
1763
|
-
})
|
|
1764
|
-
: [{ kind: 'text', text: block.text }];
|
|
1765
|
-
for (const part of parts) {
|
|
1766
|
-
if (part.kind === 'text') {
|
|
1767
|
-
pushAssistantSaying(part.text);
|
|
1768
|
-
continue;
|
|
1769
|
-
}
|
|
1770
|
-
log.warn('ANTH quirk converted batch text-rendered tool use to function call', undefined, {
|
|
1771
|
-
quirk: api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK,
|
|
1772
|
-
callId: part.id,
|
|
1773
|
-
toolName: part.name,
|
|
1774
|
-
});
|
|
1775
|
-
results.push({
|
|
1776
|
-
type: 'func_call_msg',
|
|
1777
|
-
id: part.id,
|
|
1778
|
-
name: part.name,
|
|
1779
|
-
arguments: part.rawArgumentsText,
|
|
1780
|
-
role: 'assistant',
|
|
1781
|
-
genseq,
|
|
1782
|
-
});
|
|
1783
|
-
}
|
|
1419
|
+
pushAssistantSaying(block.text);
|
|
1784
1420
|
continue;
|
|
1785
1421
|
}
|
|
1786
1422
|
if (isToolUseBlock(block)) {
|
|
@@ -1885,20 +1521,11 @@ function validateReconstructedContext(messages) {
|
|
|
1885
1521
|
}
|
|
1886
1522
|
}
|
|
1887
1523
|
async function consumeAnthropicStream(stream, receiver, options = {}) {
|
|
1888
|
-
const quirks = options.quirks ?? {
|
|
1889
|
-
normalizeLoneClosingBraceEmptyToolInputDelta: false,
|
|
1890
|
-
convertVolcanoTextToolUseBlocks: false,
|
|
1891
|
-
};
|
|
1892
1524
|
const { abortSignal, forcedJsonToolName, genseq } = options;
|
|
1893
1525
|
assertValidAnthropicStreamGenseq(genseq);
|
|
1894
|
-
const volcanoToolCallIdRegistry = quirks.convertVolcanoTextToolUseBlocks
|
|
1895
|
-
? createVolcanoToolCallIdRegistry(options.knownFunctionCallIds)
|
|
1896
|
-
: undefined;
|
|
1897
1526
|
// Stream lifecycle management using SDK start/stop events
|
|
1898
1527
|
const activeContentBlocks = new Map();
|
|
1899
1528
|
const activeToolUses = new Map();
|
|
1900
|
-
const pendingVolcanoTextToolUseBlocks = new Map();
|
|
1901
|
-
const pendingVolcanoThinkingToolUseBlocks = new Map();
|
|
1902
1529
|
let sayingStarted = false;
|
|
1903
1530
|
let thinkingStarted = false;
|
|
1904
1531
|
let messageStarted = false;
|
|
@@ -1921,8 +1548,6 @@ async function consumeAnthropicStream(stream, receiver, options = {}) {
|
|
|
1921
1548
|
nextType: contentBlock.type,
|
|
1922
1549
|
});
|
|
1923
1550
|
activeToolUses.delete(blockIndex);
|
|
1924
|
-
pendingVolcanoTextToolUseBlocks.delete(blockIndex);
|
|
1925
|
-
pendingVolcanoThinkingToolUseBlocks.delete(blockIndex);
|
|
1926
1551
|
}
|
|
1927
1552
|
activeContentBlocks.set(blockIndex, contentBlock);
|
|
1928
1553
|
// Track tool use so we can emit function calls once JSON is complete
|
|
@@ -1934,12 +1559,6 @@ async function consumeAnthropicStream(stream, receiver, options = {}) {
|
|
|
1934
1559
|
initialInput: contentBlock.input,
|
|
1935
1560
|
});
|
|
1936
1561
|
}
|
|
1937
|
-
else if (contentBlock.type === 'text' && quirks.convertVolcanoTextToolUseBlocks) {
|
|
1938
|
-
pendingVolcanoTextToolUseBlocks.set(blockIndex, contentBlock.text ?? '');
|
|
1939
|
-
}
|
|
1940
|
-
else if (contentBlock.type === 'thinking' && quirks.convertVolcanoTextToolUseBlocks) {
|
|
1941
|
-
pendingVolcanoThinkingToolUseBlocks.set(blockIndex, contentBlock.thinking ?? '');
|
|
1942
|
-
}
|
|
1943
1562
|
break;
|
|
1944
1563
|
}
|
|
1945
1564
|
case 'content_block_delta': {
|
|
@@ -1958,47 +1577,31 @@ async function consumeAnthropicStream(stream, receiver, options = {}) {
|
|
|
1958
1577
|
if (delta.type === 'text_delta') {
|
|
1959
1578
|
const textDelta = delta.text ?? '';
|
|
1960
1579
|
if (textDelta) {
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1580
|
+
if (thinkingStarted) {
|
|
1581
|
+
log.error('ANTH stream ordering violation: received text_delta while thinking stream still active', new Error('anthropic_stream_order_violation'));
|
|
1582
|
+
await receiver.thinkingFinish();
|
|
1583
|
+
thinkingStarted = false;
|
|
1964
1584
|
}
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
receiver,
|
|
1969
|
-
quirks,
|
|
1970
|
-
sayingStarted,
|
|
1971
|
-
thinkingStarted,
|
|
1972
|
-
genseq,
|
|
1973
|
-
blockIndex,
|
|
1974
|
-
idRegistry: volcanoToolCallIdRegistry,
|
|
1975
|
-
});
|
|
1976
|
-
sayingStarted = updated.sayingStarted;
|
|
1977
|
-
thinkingStarted = updated.thinkingStarted;
|
|
1585
|
+
if (!sayingStarted) {
|
|
1586
|
+
sayingStarted = true;
|
|
1587
|
+
await receiver.sayingStart();
|
|
1978
1588
|
}
|
|
1589
|
+
await receiver.sayingChunk(textDelta);
|
|
1979
1590
|
}
|
|
1980
1591
|
}
|
|
1981
1592
|
else if (delta.type === 'thinking_delta') {
|
|
1982
1593
|
const thinkingDelta = delta.thinking ?? '';
|
|
1983
1594
|
if (thinkingDelta) {
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1595
|
+
if (sayingStarted) {
|
|
1596
|
+
log.error('ANTH stream ordering violation: received thinking_delta while saying stream still active', new Error('anthropic_stream_order_violation'));
|
|
1597
|
+
await receiver.sayingFinish();
|
|
1598
|
+
sayingStarted = false;
|
|
1987
1599
|
}
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
receiver,
|
|
1992
|
-
quirks,
|
|
1993
|
-
sayingStarted,
|
|
1994
|
-
thinkingStarted,
|
|
1995
|
-
genseq,
|
|
1996
|
-
blockIndex,
|
|
1997
|
-
idRegistry: volcanoToolCallIdRegistry,
|
|
1998
|
-
});
|
|
1999
|
-
sayingStarted = updated.sayingStarted;
|
|
2000
|
-
thinkingStarted = updated.thinkingStarted;
|
|
1600
|
+
if (!thinkingStarted) {
|
|
1601
|
+
thinkingStarted = true;
|
|
1602
|
+
await receiver.thinkingStart();
|
|
2001
1603
|
}
|
|
1604
|
+
await receiver.thinkingChunk(thinkingDelta);
|
|
2002
1605
|
}
|
|
2003
1606
|
}
|
|
2004
1607
|
else if (delta.type === 'citations_delta') {
|
|
@@ -2052,47 +1655,13 @@ async function consumeAnthropicStream(stream, receiver, options = {}) {
|
|
|
2052
1655
|
sayingStarted = false;
|
|
2053
1656
|
}
|
|
2054
1657
|
else {
|
|
2055
|
-
const argsJson = resolveToolUseArgumentsJson(activeToolUse
|
|
1658
|
+
const argsJson = resolveToolUseArgumentsJson(activeToolUse);
|
|
2056
1659
|
await receiver.funcCall(activeToolUse.id, activeToolUse.name, argsJson);
|
|
2057
1660
|
}
|
|
2058
1661
|
}
|
|
2059
1662
|
activeToolUses.delete(blockIndex);
|
|
2060
1663
|
}
|
|
2061
|
-
else if (activeContentBlock.type === 'text') {
|
|
2062
|
-
const pendingText = pendingVolcanoTextToolUseBlocks.get(blockIndex);
|
|
2063
|
-
if (pendingText !== undefined) {
|
|
2064
|
-
const updated = await emitTextWithVolcanoToolUseQuirk({
|
|
2065
|
-
text: pendingText,
|
|
2066
|
-
receiver,
|
|
2067
|
-
quirks,
|
|
2068
|
-
sayingStarted,
|
|
2069
|
-
thinkingStarted,
|
|
2070
|
-
genseq,
|
|
2071
|
-
blockIndex,
|
|
2072
|
-
idRegistry: volcanoToolCallIdRegistry,
|
|
2073
|
-
});
|
|
2074
|
-
sayingStarted = updated.sayingStarted;
|
|
2075
|
-
thinkingStarted = updated.thinkingStarted;
|
|
2076
|
-
pendingVolcanoTextToolUseBlocks.delete(blockIndex);
|
|
2077
|
-
}
|
|
2078
|
-
}
|
|
2079
1664
|
else if (activeContentBlock.type === 'thinking') {
|
|
2080
|
-
const pendingThinking = pendingVolcanoThinkingToolUseBlocks.get(blockIndex);
|
|
2081
|
-
if (pendingThinking !== undefined) {
|
|
2082
|
-
const updated = await emitThinkingWithVolcanoToolUseQuirk({
|
|
2083
|
-
text: pendingThinking,
|
|
2084
|
-
receiver,
|
|
2085
|
-
quirks,
|
|
2086
|
-
sayingStarted,
|
|
2087
|
-
thinkingStarted,
|
|
2088
|
-
genseq,
|
|
2089
|
-
blockIndex,
|
|
2090
|
-
idRegistry: volcanoToolCallIdRegistry,
|
|
2091
|
-
});
|
|
2092
|
-
sayingStarted = updated.sayingStarted;
|
|
2093
|
-
thinkingStarted = updated.thinkingStarted;
|
|
2094
|
-
pendingVolcanoThinkingToolUseBlocks.delete(blockIndex);
|
|
2095
|
-
}
|
|
2096
1665
|
if (thinkingStarted) {
|
|
2097
1666
|
await receiver.thinkingFinish();
|
|
2098
1667
|
thinkingStarted = false;
|
|
@@ -2157,18 +1726,6 @@ async function consumeAnthropicStream(stream, receiver, options = {}) {
|
|
|
2157
1726
|
}
|
|
2158
1727
|
case 'message_stop': {
|
|
2159
1728
|
messageStopped = true;
|
|
2160
|
-
const updated = await flushPendingVolcanoToolUseBlocks({
|
|
2161
|
-
textBlocks: pendingVolcanoTextToolUseBlocks,
|
|
2162
|
-
thinkingBlocks: pendingVolcanoThinkingToolUseBlocks,
|
|
2163
|
-
receiver,
|
|
2164
|
-
quirks,
|
|
2165
|
-
sayingStarted,
|
|
2166
|
-
thinkingStarted,
|
|
2167
|
-
genseq,
|
|
2168
|
-
idRegistry: volcanoToolCallIdRegistry,
|
|
2169
|
-
});
|
|
2170
|
-
sayingStarted = updated.sayingStarted;
|
|
2171
|
-
thinkingStarted = updated.thinkingStarted;
|
|
2172
1729
|
activeContentBlocks.clear();
|
|
2173
1730
|
activeToolUses.clear();
|
|
2174
1731
|
if (thinkingStarted) {
|
|
@@ -2196,8 +1753,6 @@ async function consumeAnthropicStream(stream, receiver, options = {}) {
|
|
|
2196
1753
|
if ((messageStarted && !messageStopped) ||
|
|
2197
1754
|
activeContentBlocks.size > 0 ||
|
|
2198
1755
|
activeToolUses.size > 0 ||
|
|
2199
|
-
pendingVolcanoTextToolUseBlocks.size > 0 ||
|
|
2200
|
-
pendingVolcanoThinkingToolUseBlocks.size > 0 ||
|
|
2201
1756
|
thinkingStarted ||
|
|
2202
1757
|
sayingStarted) {
|
|
2203
1758
|
const detail = 'ANTH incomplete stream: provider event stream ended before a complete message lifecycle ' +
|
|
@@ -2325,9 +1880,7 @@ class AnthropicGen {
|
|
|
2325
1880
|
return consumeAnthropicStream(stream, receiver, {
|
|
2326
1881
|
abortSignal,
|
|
2327
1882
|
forcedJsonToolName: forceJsonResponse ? ANTHROPIC_JSON_RESPONSE_TOOL_NAME : undefined,
|
|
2328
|
-
quirks: resolveAnthropicStreamConsumeQuirks(providerConfig),
|
|
2329
1883
|
genseq,
|
|
2330
|
-
knownFunctionCallIds: requestContext.knownFunctionCallIds,
|
|
2331
1884
|
});
|
|
2332
1885
|
}
|
|
2333
1886
|
async genMoreMessages(providerConfig, agent, systemPrompt, funcTools, requestContext, context, genseq, abortSignal) {
|
|
@@ -2403,7 +1956,7 @@ class AnthropicGen {
|
|
|
2403
1956
|
totalTokens: promptTokens + completionTokens,
|
|
2404
1957
|
};
|
|
2405
1958
|
return {
|
|
2406
|
-
messages: anthropicToChatMessages(response, genseq, forceJsonResponse ? ANTHROPIC_JSON_RESPONSE_TOOL_NAME : undefined
|
|
1959
|
+
messages: anthropicToChatMessages(response, genseq, forceJsonResponse ? ANTHROPIC_JSON_RESPONSE_TOOL_NAME : undefined),
|
|
2407
1960
|
...(outputs.length > 0 ? { outputs } : {}),
|
|
2408
1961
|
usage,
|
|
2409
1962
|
llmGenModel: returnedModel,
|
|
@@ -13,16 +13,29 @@
|
|
|
13
13
|
import type { ChatCompletion, ChatCompletionChunk, ChatCompletionMessageParam } from 'openai/resources/chat/completions';
|
|
14
14
|
import type { Team } from '../../team';
|
|
15
15
|
import type { FuncTool } from '../../tool';
|
|
16
|
-
import type { ChatMessage, ProviderConfig } from '../client';
|
|
16
|
+
import type { ChatMessage, ModelInfo, ProviderConfig } from '../client';
|
|
17
17
|
import { type LlmBatchResult, type LlmFailureDisposition, type LlmGenerator, type LlmRequestContext, type LlmStreamReceiver, type LlmStreamResult } from '../gen';
|
|
18
18
|
type OpenAiCompatibleChatExtraParams = {
|
|
19
19
|
thinking?: boolean | Record<string, unknown>;
|
|
20
20
|
reasoning_effort?: NonNullable<Team.ModelParams['openai-compatible']>['reasoning_effort'];
|
|
21
|
+
prompt_cache_key?: string;
|
|
21
22
|
};
|
|
23
|
+
export declare function resolveOpenAiCompatibleToolChoice(funcTools: readonly FuncTool[], requestContext: LlmRequestContext, modelInfo?: ModelInfo): 'none' | 'auto' | 'required' | undefined;
|
|
22
24
|
export declare function buildOpenAiCompatibleExtraParamsForTest(args: {
|
|
25
|
+
providerConfig?: ProviderConfig;
|
|
23
26
|
agent: Team.Member;
|
|
24
27
|
openAiParams: NonNullable<Team.ModelParams['openai-compatible']>;
|
|
28
|
+
requestContext?: LlmRequestContext;
|
|
25
29
|
}): OpenAiCompatibleChatExtraParams;
|
|
30
|
+
export declare function wrapOpenAiCompatibleRejectedRequestErrorForTest(args: {
|
|
31
|
+
error: unknown;
|
|
32
|
+
providerConfig: ProviderConfig;
|
|
33
|
+
agent: Team.Member;
|
|
34
|
+
requestContext: LlmRequestContext;
|
|
35
|
+
genseq: number;
|
|
36
|
+
requestKind: 'stream' | 'batch';
|
|
37
|
+
payload: unknown;
|
|
38
|
+
}): Promise<unknown>;
|
|
26
39
|
export declare function buildOpenAiCompatibleRequestMessagesWrapper(systemPrompt: string, context: ChatMessage[], requestContextOrOptions?: LlmRequestContext | {
|
|
27
40
|
providerConfig?: ProviderConfig;
|
|
28
41
|
}, optionsMaybe?: {
|