dominds 0.1.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/LICENSE +157 -0
- package/README.md +250 -0
- package/README.zh.md +161 -0
- package/dist/access-control.js +253 -0
- package/dist/cli/create.js +263 -0
- package/dist/cli/read.js +84 -0
- package/dist/cli/tui.js +199 -0
- package/dist/cli/webui.js +169 -0
- package/dist/cli.js +227 -0
- package/dist/dialog-factory.js +53 -0
- package/dist/dialog-global-registry.js +68 -0
- package/dist/dialog-instance-registry.js +78 -0
- package/dist/dialog-run-state.js +198 -0
- package/dist/dialog.js +1024 -0
- package/dist/evt-registry.js +103 -0
- package/dist/index.js +8 -0
- package/dist/llm/client.js +69 -0
- package/dist/llm/defaults.yaml +386 -0
- package/dist/llm/driver.js +3214 -0
- package/dist/llm/gen/anthropic.js +611 -0
- package/dist/llm/gen/codex.js +375 -0
- package/dist/llm/gen/mock.js +326 -0
- package/dist/llm/gen/openai.js +470 -0
- package/dist/llm/gen/registry.js +26 -0
- package/dist/llm/gen.js +2 -0
- package/dist/llm/tools-projection.js +37 -0
- package/dist/log.js +228 -0
- package/dist/mcp/config.js +230 -0
- package/dist/mcp/sdk-client.js +129 -0
- package/dist/mcp/server-runtime.js +57 -0
- package/dist/mcp/stdio-client.js +280 -0
- package/dist/mcp/supervisor.js +979 -0
- package/dist/mcp/tool-names.js +109 -0
- package/dist/minds/builtin/cmdr/persona.md +3 -0
- package/dist/minds/builtin/dijiang/knowledge.md +287 -0
- package/dist/minds/builtin/dijiang/persona.md +7 -0
- package/dist/minds/builtin/fuxi/persona.en.md +59 -0
- package/dist/minds/builtin/fuxi/persona.zh.md +49 -0
- package/dist/minds/builtin/pangu/persona.en.md +78 -0
- package/dist/minds/builtin/pangu/persona.zh.md +71 -0
- package/dist/minds/load.js +617 -0
- package/dist/minds/minds-i18n.js +131 -0
- package/dist/minds/system-prompt.js +281 -0
- package/dist/persistence.js +3128 -0
- package/dist/problems.js +109 -0
- package/dist/server/api-routes.js +1031 -0
- package/dist/server/auth.js +180 -0
- package/dist/server/mime-types.js +32 -0
- package/dist/server/prompts-routes.js +543 -0
- package/dist/server/server-core.js +235 -0
- package/dist/server/setup-routes.js +697 -0
- package/dist/server/static-server.js +132 -0
- package/dist/server/websocket-handler.js +1011 -0
- package/dist/server.js +164 -0
- package/dist/shared/async-fifo-mutex.js +36 -0
- package/dist/shared/diligence.js +20 -0
- package/dist/shared/dotenv.js +144 -0
- package/dist/shared/evt.js +195 -0
- package/dist/shared/i18n/driver-messages.js +267 -0
- package/dist/shared/i18n/text.js +9 -0
- package/dist/shared/i18n/tool-result-messages.js +51 -0
- package/dist/shared/rtws-cli.js +73 -0
- package/dist/shared/runtime-language.js +47 -0
- package/dist/shared/team-mgmt-manual.js +116 -0
- package/dist/shared/types/context-health.js +2 -0
- package/dist/shared/types/dialog.js +11 -0
- package/dist/shared/types/i18n.js +2 -0
- package/dist/shared/types/index.js +26 -0
- package/dist/shared/types/language.js +40 -0
- package/dist/shared/types/problems.js +2 -0
- package/dist/shared/types/prompts.js +2 -0
- package/dist/shared/types/q4h.js +7 -0
- package/dist/shared/types/run-state.js +8 -0
- package/dist/shared/types/setup.js +2 -0
- package/dist/shared/types/storage.js +10 -0
- package/dist/shared/types/tellask.js +8 -0
- package/dist/shared/types/tools-registry.js +2 -0
- package/dist/shared/types/wire.js +12 -0
- package/dist/shared/utils/fmt.js +9 -0
- package/dist/shared/utils/html.js +20 -0
- package/dist/shared/utils/id.js +18 -0
- package/dist/shared/utils/inter-dialog-format.js +101 -0
- package/dist/shared/utils/time.js +13 -0
- package/dist/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/static/assets/_baseUniq-Crfl3d5Y.js +661 -0
- package/dist/static/assets/_baseUniq-Crfl3d5Y.js.map +1 -0
- package/dist/static/assets/arc-CbA_x9GD.js +132 -0
- package/dist/static/assets/arc-CbA_x9GD.js.map +1 -0
- package/dist/static/assets/architectureDiagram-VXUJARFQ-lcFS8ZQJ.js +8685 -0
- package/dist/static/assets/architectureDiagram-VXUJARFQ-lcFS8ZQJ.js.map +1 -0
- package/dist/static/assets/blockDiagram-VD42YOAC-B3Q36qRc.js +3608 -0
- package/dist/static/assets/blockDiagram-VD42YOAC-B3Q36qRc.js.map +1 -0
- package/dist/static/assets/c4Diagram-YG6GDRKO-Mt-aq3VH.js +2482 -0
- package/dist/static/assets/c4Diagram-YG6GDRKO-Mt-aq3VH.js.map +1 -0
- package/dist/static/assets/channel-BVr1Yke-.js +8 -0
- package/dist/static/assets/channel-BVr1Yke-.js.map +1 -0
- package/dist/static/assets/chunk-4BX2VUAB-qCIn5Iic.js +17 -0
- package/dist/static/assets/chunk-4BX2VUAB-qCIn5Iic.js.map +1 -0
- package/dist/static/assets/chunk-55IACEB6-q172NeCV.js +14 -0
- package/dist/static/assets/chunk-55IACEB6-q172NeCV.js.map +1 -0
- package/dist/static/assets/chunk-B4BG7PRW-CMJmtYzq.js +1827 -0
- package/dist/static/assets/chunk-B4BG7PRW-CMJmtYzq.js.map +1 -0
- package/dist/static/assets/chunk-DI55MBZ5-DiuwwZPL.js +1916 -0
- package/dist/static/assets/chunk-DI55MBZ5-DiuwwZPL.js.map +1 -0
- package/dist/static/assets/chunk-FMBD7UC4-06sqZTTn.js +20 -0
- package/dist/static/assets/chunk-FMBD7UC4-06sqZTTn.js.map +1 -0
- package/dist/static/assets/chunk-QN33PNHL-CnpBNkpP.js +25 -0
- package/dist/static/assets/chunk-QN33PNHL-CnpBNkpP.js.map +1 -0
- package/dist/static/assets/chunk-QZHKN3VN-CNgjMR-e.js +18 -0
- package/dist/static/assets/chunk-QZHKN3VN-CNgjMR-e.js.map +1 -0
- package/dist/static/assets/chunk-TZMSLE5B-BxtzW6--.js +109 -0
- package/dist/static/assets/chunk-TZMSLE5B-BxtzW6--.js.map +1 -0
- package/dist/static/assets/classDiagram-2ON5EDUG-29huvmn-.js +23 -0
- package/dist/static/assets/classDiagram-2ON5EDUG-29huvmn-.js.map +1 -0
- package/dist/static/assets/classDiagram-v2-WZHVMYZB-29huvmn-.js +23 -0
- package/dist/static/assets/classDiagram-v2-WZHVMYZB-29huvmn-.js.map +1 -0
- package/dist/static/assets/clone-D2OgLSSn.js +9 -0
- package/dist/static/assets/clone-D2OgLSSn.js.map +1 -0
- package/dist/static/assets/cose-bilkent-S5V4N54A-BNegDCxl.js +4943 -0
- package/dist/static/assets/cose-bilkent-S5V4N54A-BNegDCxl.js.map +1 -0
- package/dist/static/assets/cytoscape.esm-Bm8DJGmZ.js +30240 -0
- package/dist/static/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -0
- package/dist/static/assets/dagre-6UL2VRFP-f1XrTRSn.js +695 -0
- package/dist/static/assets/dagre-6UL2VRFP-f1XrTRSn.js.map +1 -0
- package/dist/static/assets/defaultLocale-DVr69WTU.js +207 -0
- package/dist/static/assets/defaultLocale-DVr69WTU.js.map +1 -0
- package/dist/static/assets/diagram-PSM6KHXK-8w1WbeDi.js +849 -0
- package/dist/static/assets/diagram-PSM6KHXK-8w1WbeDi.js.map +1 -0
- package/dist/static/assets/diagram-QEK2KX5R-CF4wtMmR.js +303 -0
- package/dist/static/assets/diagram-QEK2KX5R-CF4wtMmR.js.map +1 -0
- package/dist/static/assets/diagram-S2PKOQOG-8p3Avgn2.js +213 -0
- package/dist/static/assets/diagram-S2PKOQOG-8p3Avgn2.js.map +1 -0
- package/dist/static/assets/erDiagram-Q2GNP2WA-BMKLxlM9.js +1159 -0
- package/dist/static/assets/erDiagram-Q2GNP2WA-BMKLxlM9.js.map +1 -0
- package/dist/static/assets/favicon-Cmg5RbCj.svg +8 -0
- package/dist/static/assets/flowDiagram-NV44I4VS-CgEuPNK2.js +2332 -0
- package/dist/static/assets/flowDiagram-NV44I4VS-CgEuPNK2.js.map +1 -0
- package/dist/static/assets/ganttDiagram-JELNMOA3-bJkDCf-9.js +3681 -0
- package/dist/static/assets/ganttDiagram-JELNMOA3-bJkDCf-9.js.map +1 -0
- package/dist/static/assets/gitGraphDiagram-NY62KEGX-4QE9kesp.js +1206 -0
- package/dist/static/assets/gitGraphDiagram-NY62KEGX-4QE9kesp.js.map +1 -0
- package/dist/static/assets/graph-CS0Pmm7c.js +597 -0
- package/dist/static/assets/graph-CS0Pmm7c.js.map +1 -0
- package/dist/static/assets/index-BS6HnGzC.js +112303 -0
- package/dist/static/assets/index-BS6HnGzC.js.map +1 -0
- package/dist/static/assets/index-DaIsSzC_.css +483 -0
- package/dist/static/assets/infoDiagram-WHAUD3N6-ypBcKfUs.js +34 -0
- package/dist/static/assets/infoDiagram-WHAUD3N6-ypBcKfUs.js.map +1 -0
- package/dist/static/assets/init-ZxktEp_H.js +17 -0
- package/dist/static/assets/init-ZxktEp_H.js.map +1 -0
- package/dist/static/assets/journeyDiagram-XKPGCS4Q-QnrxDowJ.js +1255 -0
- package/dist/static/assets/journeyDiagram-XKPGCS4Q-QnrxDowJ.js.map +1 -0
- package/dist/static/assets/kanban-definition-3W4ZIXB7-CfvEc4z5.js +1048 -0
- package/dist/static/assets/kanban-definition-3W4ZIXB7-CfvEc4z5.js.map +1 -0
- package/dist/static/assets/layout-8TGxpm23.js +2218 -0
- package/dist/static/assets/layout-8TGxpm23.js.map +1 -0
- package/dist/static/assets/linear-BATBPQQv.js +341 -0
- package/dist/static/assets/linear-BATBPQQv.js.map +1 -0
- package/dist/static/assets/min-B3oVH3AC.js +42 -0
- package/dist/static/assets/min-B3oVH3AC.js.map +1 -0
- package/dist/static/assets/mindmap-definition-VGOIOE7T-L7VLwwF8.js +1127 -0
- package/dist/static/assets/mindmap-definition-VGOIOE7T-L7VLwwF8.js.map +1 -0
- package/dist/static/assets/ordinal-CxptdPJm.js +77 -0
- package/dist/static/assets/ordinal-CxptdPJm.js.map +1 -0
- package/dist/static/assets/pieDiagram-ADFJNKIX-CFW3zIhM.js +241 -0
- package/dist/static/assets/pieDiagram-ADFJNKIX-CFW3zIhM.js.map +1 -0
- package/dist/static/assets/quadrantDiagram-AYHSOK5B-B7ssen3E.js +1338 -0
- package/dist/static/assets/quadrantDiagram-AYHSOK5B-B7ssen3E.js.map +1 -0
- package/dist/static/assets/requirementDiagram-UZGBJVZJ-D0v5BArv.js +1162 -0
- package/dist/static/assets/requirementDiagram-UZGBJVZJ-D0v5BArv.js.map +1 -0
- package/dist/static/assets/sankeyDiagram-TZEHDZUN-B7slncJe.js +1195 -0
- package/dist/static/assets/sankeyDiagram-TZEHDZUN-B7slncJe.js.map +1 -0
- package/dist/static/assets/sequenceDiagram-WL72ISMW-oXU2lRh_.js +3875 -0
- package/dist/static/assets/sequenceDiagram-WL72ISMW-oXU2lRh_.js.map +1 -0
- package/dist/static/assets/stateDiagram-FKZM4ZOC-CFYsEd0x.js +452 -0
- package/dist/static/assets/stateDiagram-FKZM4ZOC-CFYsEd0x.js.map +1 -0
- package/dist/static/assets/stateDiagram-v2-4FDKWEC3-C0UWaNA7.js +22 -0
- package/dist/static/assets/stateDiagram-v2-4FDKWEC3-C0UWaNA7.js.map +1 -0
- package/dist/static/assets/timeline-definition-IT6M3QCI-C3KODUrh.js +1223 -0
- package/dist/static/assets/timeline-definition-IT6M3QCI-C3KODUrh.js.map +1 -0
- package/dist/static/assets/treemap-KMMF4GRG-DAGDLhj2.js +18753 -0
- package/dist/static/assets/treemap-KMMF4GRG-DAGDLhj2.js.map +1 -0
- package/dist/static/assets/xychartDiagram-PRI3JC2R-C0J9iwTO.js +1888 -0
- package/dist/static/assets/xychartDiagram-PRI3JC2R-C0J9iwTO.js.map +1 -0
- package/dist/static/index.html +71 -0
- package/dist/static/testing/dom-observation-utils.js +425 -0
- package/dist/static/testing/e2e-test-helper.js +3119 -0
- package/dist/team.js +1160 -0
- package/dist/tellask.js +431 -0
- package/dist/tool.js +150 -0
- package/dist/tools/apply-patch.js +542 -0
- package/dist/tools/builtins.js +196 -0
- package/dist/tools/context-health.js +177 -0
- package/dist/tools/ctrl.js +478 -0
- package/dist/tools/diag.js +583 -0
- package/dist/tools/env.js +184 -0
- package/dist/tools/fs.js +818 -0
- package/dist/tools/mcp.js +138 -0
- package/dist/tools/mem.js +349 -0
- package/dist/tools/os.js +751 -0
- package/dist/tools/prompts/team_mgmt.en.md +70 -0
- package/dist/tools/prompts/team_mgmt.zh.md +70 -0
- package/dist/tools/prompts/ws_mod.en.md +86 -0
- package/dist/tools/prompts/ws_mod.zh.md +87 -0
- package/dist/tools/registry-snapshot.js +31 -0
- package/dist/tools/registry.js +121 -0
- package/dist/tools/ripgrep.js +678 -0
- package/dist/tools/team-mgmt.js +3300 -0
- package/dist/tools/txt.js +3178 -0
- package/dist/utils/id.js +72 -0
- package/dist/utils/task-doc.js +236 -0
- package/dist/utils/task-package.js +522 -0
- package/dist/utils/taskdoc-search.js +280 -0
- package/dist/utils/taskdoc.js +400 -0
- package/package.json +69 -0
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Module: llm/gen/openai
|
|
4
|
+
*
|
|
5
|
+
* OpenAI-compatible Responses API integration implementing streaming and batch generation.
|
|
6
|
+
*/
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.OpenAiGen = void 0;
|
|
12
|
+
const openai_1 = __importDefault(require("openai"));
|
|
13
|
+
const log_1 = require("../../log");
|
|
14
|
+
const text_1 = require("../../shared/i18n/text");
|
|
15
|
+
const runtime_language_1 = require("../../shared/runtime-language");
|
|
16
|
+
const log = (0, log_1.createLogger)('llm/openai');
|
|
17
|
+
function isRecord(value) {
|
|
18
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
19
|
+
}
|
|
20
|
+
function tryExtractApiReturnedModel(value) {
|
|
21
|
+
// NOTE: External API payload; a runtime check is unavoidable.
|
|
22
|
+
if (!isRecord(value))
|
|
23
|
+
return undefined;
|
|
24
|
+
if (!('model' in value))
|
|
25
|
+
return undefined;
|
|
26
|
+
const model = value.model;
|
|
27
|
+
if (typeof model !== 'string')
|
|
28
|
+
return undefined;
|
|
29
|
+
const trimmed = model.trim();
|
|
30
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
31
|
+
}
|
|
32
|
+
function tryExtractResponseErrorMessage(value) {
|
|
33
|
+
// NOTE: External API payload; a runtime check is unavoidable.
|
|
34
|
+
if (!isRecord(value))
|
|
35
|
+
return null;
|
|
36
|
+
if (!('error' in value))
|
|
37
|
+
return null;
|
|
38
|
+
const error = value.error;
|
|
39
|
+
if (!isRecord(error))
|
|
40
|
+
return null;
|
|
41
|
+
if (!('message' in error))
|
|
42
|
+
return null;
|
|
43
|
+
const message = error.message;
|
|
44
|
+
return typeof message === 'string' && message.trim().length > 0 ? message.trim() : null;
|
|
45
|
+
}
|
|
46
|
+
function funcToolToOpenAiTool(funcTool) {
|
|
47
|
+
// MCP schemas are passed through to providers. OpenAI Responses types expect a narrower schema
|
|
48
|
+
// shape; runtime compatibility is handled by provider validation + the driver stop policy.
|
|
49
|
+
const parameters = funcTool.parameters;
|
|
50
|
+
const description = (0, text_1.getTextForLanguage)({ i18n: funcTool.descriptionI18n, fallback: funcTool.description }, (0, runtime_language_1.getWorkLanguage)());
|
|
51
|
+
const tool = {
|
|
52
|
+
type: 'function',
|
|
53
|
+
name: funcTool.name,
|
|
54
|
+
description,
|
|
55
|
+
parameters,
|
|
56
|
+
strict: false,
|
|
57
|
+
};
|
|
58
|
+
return tool;
|
|
59
|
+
}
|
|
60
|
+
function chatMessageToOpenAiInputItem(msg) {
|
|
61
|
+
switch (msg.type) {
|
|
62
|
+
case 'environment_msg':
|
|
63
|
+
case 'prompting_msg':
|
|
64
|
+
return {
|
|
65
|
+
type: 'message',
|
|
66
|
+
role: 'user',
|
|
67
|
+
content: msg.content,
|
|
68
|
+
};
|
|
69
|
+
case 'transient_guide_msg':
|
|
70
|
+
case 'saying_msg':
|
|
71
|
+
case 'thinking_msg':
|
|
72
|
+
return {
|
|
73
|
+
type: 'message',
|
|
74
|
+
role: 'assistant',
|
|
75
|
+
content: msg.content,
|
|
76
|
+
};
|
|
77
|
+
case 'call_result_msg':
|
|
78
|
+
return {
|
|
79
|
+
type: 'message',
|
|
80
|
+
role: 'user',
|
|
81
|
+
content: msg.content,
|
|
82
|
+
};
|
|
83
|
+
case 'func_call_msg':
|
|
84
|
+
return {
|
|
85
|
+
type: 'function_call',
|
|
86
|
+
call_id: msg.id,
|
|
87
|
+
name: msg.name,
|
|
88
|
+
arguments: msg.arguments,
|
|
89
|
+
};
|
|
90
|
+
case 'func_result_msg':
|
|
91
|
+
return {
|
|
92
|
+
type: 'function_call_output',
|
|
93
|
+
call_id: msg.id,
|
|
94
|
+
output: msg.content,
|
|
95
|
+
};
|
|
96
|
+
default: {
|
|
97
|
+
const _exhaustive = msg;
|
|
98
|
+
return _exhaustive;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function parseOpenAiUsage(usage) {
|
|
103
|
+
// NOTE: External API payload; a runtime check is unavoidable.
|
|
104
|
+
if (!isRecord(usage))
|
|
105
|
+
return { kind: 'unavailable' };
|
|
106
|
+
const inputTokens = usage.input_tokens;
|
|
107
|
+
const outputTokens = usage.output_tokens;
|
|
108
|
+
const totalTokens = usage.total_tokens;
|
|
109
|
+
if (typeof inputTokens !== 'number' || typeof outputTokens !== 'number') {
|
|
110
|
+
return { kind: 'unavailable' };
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
kind: 'available',
|
|
114
|
+
promptTokens: inputTokens,
|
|
115
|
+
completionTokens: outputTokens,
|
|
116
|
+
totalTokens: typeof totalTokens === 'number' ? totalTokens : inputTokens + outputTokens,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function extractOutputMessageText(item) {
|
|
120
|
+
if (!isRecord(item) || item.type !== 'message')
|
|
121
|
+
return '';
|
|
122
|
+
const content = item.content;
|
|
123
|
+
if (!Array.isArray(content))
|
|
124
|
+
return '';
|
|
125
|
+
let text = '';
|
|
126
|
+
for (const part of content) {
|
|
127
|
+
if (!isRecord(part) || typeof part.type !== 'string')
|
|
128
|
+
continue;
|
|
129
|
+
if (part.type === 'output_text' && typeof part.text === 'string') {
|
|
130
|
+
text += part.text;
|
|
131
|
+
}
|
|
132
|
+
if (part.type === 'refusal' && typeof part.refusal === 'string') {
|
|
133
|
+
text += part.refusal;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return text;
|
|
137
|
+
}
|
|
138
|
+
function extractReasoningText(item) {
|
|
139
|
+
if (!isRecord(item) || item.type !== 'reasoning')
|
|
140
|
+
return '';
|
|
141
|
+
let text = '';
|
|
142
|
+
const summary = item.summary;
|
|
143
|
+
if (Array.isArray(summary)) {
|
|
144
|
+
for (const part of summary) {
|
|
145
|
+
if (!isRecord(part) || part.type !== 'summary_text')
|
|
146
|
+
continue;
|
|
147
|
+
if (typeof part.text === 'string' && part.text.length > 0) {
|
|
148
|
+
text += part.text;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const content = item.content;
|
|
153
|
+
if (Array.isArray(content)) {
|
|
154
|
+
for (const part of content) {
|
|
155
|
+
if (!isRecord(part) || part.type !== 'reasoning_text')
|
|
156
|
+
continue;
|
|
157
|
+
if (typeof part.text === 'string' && part.text.length > 0) {
|
|
158
|
+
text += part.text;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return text;
|
|
163
|
+
}
|
|
164
|
+
function openAiResponseToChatMessages(response, genseq) {
|
|
165
|
+
const messages = [];
|
|
166
|
+
const output = response.output;
|
|
167
|
+
if (!Array.isArray(output))
|
|
168
|
+
return messages;
|
|
169
|
+
for (const item of output) {
|
|
170
|
+
if (!isRecord(item) || typeof item.type !== 'string')
|
|
171
|
+
continue;
|
|
172
|
+
if (item.type === 'reasoning') {
|
|
173
|
+
const content = extractReasoningText(item);
|
|
174
|
+
if (content.length > 0) {
|
|
175
|
+
messages.push({
|
|
176
|
+
type: 'thinking_msg',
|
|
177
|
+
role: 'assistant',
|
|
178
|
+
genseq,
|
|
179
|
+
content,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (item.type === 'message') {
|
|
185
|
+
const content = extractOutputMessageText(item);
|
|
186
|
+
if (content.length > 0) {
|
|
187
|
+
messages.push({
|
|
188
|
+
type: 'saying_msg',
|
|
189
|
+
role: 'assistant',
|
|
190
|
+
genseq,
|
|
191
|
+
content,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (item.type === 'function_call') {
|
|
197
|
+
const callId = typeof item.call_id === 'string' ? item.call_id : '';
|
|
198
|
+
const name = typeof item.name === 'string' ? item.name : '';
|
|
199
|
+
const args = typeof item.arguments === 'string' ? item.arguments : '';
|
|
200
|
+
if (callId.length > 0 && name.length > 0) {
|
|
201
|
+
messages.push({
|
|
202
|
+
type: 'func_call_msg',
|
|
203
|
+
role: 'assistant',
|
|
204
|
+
genseq,
|
|
205
|
+
id: callId,
|
|
206
|
+
name,
|
|
207
|
+
arguments: args,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return messages;
|
|
214
|
+
}
|
|
215
|
+
class OpenAiGen {
|
|
216
|
+
get apiType() {
|
|
217
|
+
return 'openai';
|
|
218
|
+
}
|
|
219
|
+
async genToReceiver(providerConfig, agent, systemPrompt, funcTools, context, receiver, _genseq, abortSignal) {
|
|
220
|
+
const apiKey = process.env[providerConfig.apiKeyEnvVar];
|
|
221
|
+
if (!apiKey)
|
|
222
|
+
throw new Error(`Missing API key env var ${providerConfig.apiKeyEnvVar}`);
|
|
223
|
+
if (!agent.model) {
|
|
224
|
+
throw new Error(`Internal error: Model is undefined for agent '${agent.id}'`);
|
|
225
|
+
}
|
|
226
|
+
const client = new openai_1.default({ apiKey, baseURL: providerConfig.baseUrl });
|
|
227
|
+
const requestInput = context.map(chatMessageToOpenAiInputItem);
|
|
228
|
+
const openAiParams = agent.model_params?.openai || {};
|
|
229
|
+
const maxTokens = agent.model_params?.max_tokens;
|
|
230
|
+
const modelInfo = providerConfig.models[agent.model];
|
|
231
|
+
const outputLength = modelInfo?.output_length;
|
|
232
|
+
const maxOutputTokens = maxTokens ?? openAiParams.max_tokens ?? outputLength ?? 1024;
|
|
233
|
+
const parallelToolCalls = openAiParams.parallel_tool_calls ?? true;
|
|
234
|
+
const payload = {
|
|
235
|
+
model: agent.model,
|
|
236
|
+
input: requestInput,
|
|
237
|
+
instructions: systemPrompt.trim().length > 0 ? systemPrompt : undefined,
|
|
238
|
+
max_output_tokens: maxOutputTokens,
|
|
239
|
+
parallel_tool_calls: parallelToolCalls,
|
|
240
|
+
store: false,
|
|
241
|
+
stream: true,
|
|
242
|
+
...(openAiParams.temperature !== undefined && { temperature: openAiParams.temperature }),
|
|
243
|
+
...(openAiParams.top_p !== undefined && { top_p: openAiParams.top_p }),
|
|
244
|
+
...(openAiParams.reasoning_effort !== undefined && {
|
|
245
|
+
reasoning: { effort: openAiParams.reasoning_effort },
|
|
246
|
+
}),
|
|
247
|
+
...(openAiParams.verbosity !== undefined && { text: { verbosity: openAiParams.verbosity } }),
|
|
248
|
+
...(funcTools.length > 0 && { tools: funcTools.map(funcToolToOpenAiTool) }),
|
|
249
|
+
tool_choice: 'auto',
|
|
250
|
+
};
|
|
251
|
+
let sayingStarted = false;
|
|
252
|
+
let thinkingStarted = false;
|
|
253
|
+
let sawOutputText = false;
|
|
254
|
+
let usage = { kind: 'unavailable' };
|
|
255
|
+
let returnedModel;
|
|
256
|
+
try {
|
|
257
|
+
const stream = await client.responses.create(payload, {
|
|
258
|
+
...(abortSignal ? { signal: abortSignal } : {}),
|
|
259
|
+
});
|
|
260
|
+
for await (const event of stream) {
|
|
261
|
+
if (abortSignal?.aborted) {
|
|
262
|
+
throw new Error('AbortError');
|
|
263
|
+
}
|
|
264
|
+
switch (event.type) {
|
|
265
|
+
case 'response.created':
|
|
266
|
+
case 'response.in_progress':
|
|
267
|
+
case 'response.queued':
|
|
268
|
+
case 'response.completed': {
|
|
269
|
+
if (returnedModel === undefined) {
|
|
270
|
+
returnedModel = tryExtractApiReturnedModel(event.response);
|
|
271
|
+
}
|
|
272
|
+
if (event.type === 'response.completed') {
|
|
273
|
+
if (sayingStarted) {
|
|
274
|
+
await receiver.sayingFinish();
|
|
275
|
+
sayingStarted = false;
|
|
276
|
+
}
|
|
277
|
+
if (thinkingStarted) {
|
|
278
|
+
await receiver.thinkingFinish();
|
|
279
|
+
thinkingStarted = false;
|
|
280
|
+
}
|
|
281
|
+
usage = parseOpenAiUsage(event.response.usage);
|
|
282
|
+
}
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
case 'response.incomplete': {
|
|
286
|
+
if (returnedModel === undefined) {
|
|
287
|
+
returnedModel = tryExtractApiReturnedModel(event.response);
|
|
288
|
+
}
|
|
289
|
+
if (sayingStarted) {
|
|
290
|
+
await receiver.sayingFinish();
|
|
291
|
+
sayingStarted = false;
|
|
292
|
+
}
|
|
293
|
+
if (thinkingStarted) {
|
|
294
|
+
await receiver.thinkingFinish();
|
|
295
|
+
thinkingStarted = false;
|
|
296
|
+
}
|
|
297
|
+
usage = parseOpenAiUsage(event.response.usage);
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
case 'response.failed': {
|
|
301
|
+
const message = tryExtractResponseErrorMessage(event.response) ?? 'OpenAI response failed.';
|
|
302
|
+
throw new Error(message);
|
|
303
|
+
}
|
|
304
|
+
case 'error': {
|
|
305
|
+
const message = typeof event.message === 'string' && event.message.trim().length > 0
|
|
306
|
+
? event.message.trim()
|
|
307
|
+
: 'OpenAI response error.';
|
|
308
|
+
throw new Error(message);
|
|
309
|
+
}
|
|
310
|
+
case 'response.output_text.delta': {
|
|
311
|
+
const delta = event.delta;
|
|
312
|
+
if (delta.length > 0) {
|
|
313
|
+
if (!sayingStarted) {
|
|
314
|
+
sayingStarted = true;
|
|
315
|
+
await receiver.sayingStart();
|
|
316
|
+
}
|
|
317
|
+
await receiver.sayingChunk(delta);
|
|
318
|
+
sawOutputText = true;
|
|
319
|
+
}
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
case 'response.output_text.done': {
|
|
323
|
+
if (!sawOutputText && event.text.length > 0) {
|
|
324
|
+
if (!sayingStarted) {
|
|
325
|
+
sayingStarted = true;
|
|
326
|
+
await receiver.sayingStart();
|
|
327
|
+
}
|
|
328
|
+
await receiver.sayingChunk(event.text);
|
|
329
|
+
sawOutputText = true;
|
|
330
|
+
}
|
|
331
|
+
if (sayingStarted) {
|
|
332
|
+
await receiver.sayingFinish();
|
|
333
|
+
sayingStarted = false;
|
|
334
|
+
}
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
case 'response.reasoning_text.delta':
|
|
338
|
+
case 'response.reasoning_summary_text.delta': {
|
|
339
|
+
const delta = event.delta;
|
|
340
|
+
if (delta.length > 0) {
|
|
341
|
+
if (!thinkingStarted) {
|
|
342
|
+
thinkingStarted = true;
|
|
343
|
+
await receiver.thinkingStart();
|
|
344
|
+
}
|
|
345
|
+
await receiver.thinkingChunk(delta);
|
|
346
|
+
}
|
|
347
|
+
break;
|
|
348
|
+
}
|
|
349
|
+
case 'response.reasoning_summary_part.added': {
|
|
350
|
+
if (!thinkingStarted) {
|
|
351
|
+
thinkingStarted = true;
|
|
352
|
+
await receiver.thinkingStart();
|
|
353
|
+
}
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
case 'response.output_item.done': {
|
|
357
|
+
const item = event.item;
|
|
358
|
+
if (isRecord(item) && item.type === 'function_call') {
|
|
359
|
+
const callId = typeof item.call_id === 'string' ? item.call_id : '';
|
|
360
|
+
const name = typeof item.name === 'string' ? item.name : '';
|
|
361
|
+
const args = typeof item.arguments === 'string' ? item.arguments : '';
|
|
362
|
+
if (callId.length > 0 && name.length > 0) {
|
|
363
|
+
await receiver.funcCall(callId, name, args);
|
|
364
|
+
}
|
|
365
|
+
break;
|
|
366
|
+
}
|
|
367
|
+
if (isRecord(item) && item.type === 'message' && !sawOutputText) {
|
|
368
|
+
const text = extractOutputMessageText(item);
|
|
369
|
+
if (text.length > 0) {
|
|
370
|
+
if (!sayingStarted) {
|
|
371
|
+
sayingStarted = true;
|
|
372
|
+
await receiver.sayingStart();
|
|
373
|
+
}
|
|
374
|
+
await receiver.sayingChunk(text);
|
|
375
|
+
await receiver.sayingFinish();
|
|
376
|
+
sayingStarted = false;
|
|
377
|
+
sawOutputText = true;
|
|
378
|
+
}
|
|
379
|
+
break;
|
|
380
|
+
}
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
// Ignored events (kept explicit for future debugging)
|
|
384
|
+
case 'response.output_item.added':
|
|
385
|
+
case 'response.content_part.added':
|
|
386
|
+
case 'response.content_part.done':
|
|
387
|
+
case 'response.function_call_arguments.delta':
|
|
388
|
+
case 'response.function_call_arguments.done':
|
|
389
|
+
case 'response.refusal.delta':
|
|
390
|
+
case 'response.refusal.done':
|
|
391
|
+
case 'response.output_text.annotation.added':
|
|
392
|
+
case 'response.reasoning_summary_text.done':
|
|
393
|
+
case 'response.reasoning_text.done':
|
|
394
|
+
case 'response.reasoning_summary_part.done':
|
|
395
|
+
break;
|
|
396
|
+
default: {
|
|
397
|
+
const unknownEvent = event;
|
|
398
|
+
const eventType = isRecord(unknownEvent) && typeof unknownEvent.type === 'string'
|
|
399
|
+
? unknownEvent.type
|
|
400
|
+
: 'unknown';
|
|
401
|
+
log.warn('OPENAI unexpected llm event', new Error('Unknown event type'), {
|
|
402
|
+
eventType,
|
|
403
|
+
});
|
|
404
|
+
break;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
catch (error) {
|
|
410
|
+
log.warn('OPENAI streaming error', error);
|
|
411
|
+
throw error;
|
|
412
|
+
}
|
|
413
|
+
finally {
|
|
414
|
+
if (sayingStarted) {
|
|
415
|
+
await receiver.sayingFinish();
|
|
416
|
+
}
|
|
417
|
+
if (thinkingStarted) {
|
|
418
|
+
await receiver.thinkingFinish();
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
return { usage, llmGenModel: returnedModel };
|
|
422
|
+
}
|
|
423
|
+
async genMoreMessages(providerConfig, agent, systemPrompt, funcTools, context, genseq, abortSignal) {
|
|
424
|
+
const apiKey = process.env[providerConfig.apiKeyEnvVar];
|
|
425
|
+
if (!apiKey)
|
|
426
|
+
throw new Error(`Missing API key env var ${providerConfig.apiKeyEnvVar}`);
|
|
427
|
+
if (!agent.model) {
|
|
428
|
+
throw new Error(`Internal error: Model is undefined for agent '${agent.id}'`);
|
|
429
|
+
}
|
|
430
|
+
const client = new openai_1.default({ apiKey, baseURL: providerConfig.baseUrl });
|
|
431
|
+
const requestInput = context.map(chatMessageToOpenAiInputItem);
|
|
432
|
+
const openAiParams = agent.model_params?.openai || {};
|
|
433
|
+
const maxTokens = agent.model_params?.max_tokens;
|
|
434
|
+
const modelInfo = providerConfig.models[agent.model];
|
|
435
|
+
const outputLength = modelInfo?.output_length;
|
|
436
|
+
const maxOutputTokens = maxTokens ?? openAiParams.max_tokens ?? outputLength ?? 1024;
|
|
437
|
+
const parallelToolCalls = openAiParams.parallel_tool_calls ?? true;
|
|
438
|
+
const payload = {
|
|
439
|
+
model: agent.model,
|
|
440
|
+
input: requestInput,
|
|
441
|
+
instructions: systemPrompt.trim().length > 0 ? systemPrompt : undefined,
|
|
442
|
+
max_output_tokens: maxOutputTokens,
|
|
443
|
+
parallel_tool_calls: parallelToolCalls,
|
|
444
|
+
store: false,
|
|
445
|
+
stream: false,
|
|
446
|
+
...(openAiParams.temperature !== undefined && { temperature: openAiParams.temperature }),
|
|
447
|
+
...(openAiParams.top_p !== undefined && { top_p: openAiParams.top_p }),
|
|
448
|
+
...(openAiParams.reasoning_effort !== undefined && {
|
|
449
|
+
reasoning: { effort: openAiParams.reasoning_effort },
|
|
450
|
+
}),
|
|
451
|
+
...(openAiParams.verbosity !== undefined && { text: { verbosity: openAiParams.verbosity } }),
|
|
452
|
+
...(funcTools.length > 0 && { tools: funcTools.map(funcToolToOpenAiTool) }),
|
|
453
|
+
tool_choice: 'auto',
|
|
454
|
+
};
|
|
455
|
+
const response = await client.responses.create(payload, {
|
|
456
|
+
...(abortSignal ? { signal: abortSignal } : {}),
|
|
457
|
+
});
|
|
458
|
+
if (!response) {
|
|
459
|
+
throw new Error('No response from OpenAI API');
|
|
460
|
+
}
|
|
461
|
+
const returnedModel = typeof response.model === 'string' ? response.model : undefined;
|
|
462
|
+
const usage = parseOpenAiUsage(response.usage);
|
|
463
|
+
return {
|
|
464
|
+
messages: openAiResponseToChatMessages(response, genseq),
|
|
465
|
+
usage,
|
|
466
|
+
llmGenModel: returnedModel,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
exports.OpenAiGen = OpenAiGen;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generatorsRegistry = void 0;
|
|
4
|
+
exports.registerLlmGenerator = registerLlmGenerator;
|
|
5
|
+
exports.unregisterLlmGenerator = unregisterLlmGenerator;
|
|
6
|
+
exports.getLlmGenerator = getLlmGenerator;
|
|
7
|
+
const anthropic_1 = require("./anthropic");
|
|
8
|
+
const codex_1 = require("./codex");
|
|
9
|
+
const mock_1 = require("./mock");
|
|
10
|
+
const openai_1 = require("./openai");
|
|
11
|
+
exports.generatorsRegistry = new Map();
|
|
12
|
+
function registerLlmGenerator(gen) {
|
|
13
|
+
exports.generatorsRegistry.set(gen.apiType, gen);
|
|
14
|
+
}
|
|
15
|
+
function unregisterLlmGenerator(apiType) {
|
|
16
|
+
exports.generatorsRegistry.delete(apiType);
|
|
17
|
+
}
|
|
18
|
+
function getLlmGenerator(apiType) {
|
|
19
|
+
return exports.generatorsRegistry.get(apiType);
|
|
20
|
+
}
|
|
21
|
+
(function initializeBuiltins() {
|
|
22
|
+
registerLlmGenerator(new anthropic_1.AnthropicGen());
|
|
23
|
+
registerLlmGenerator(new codex_1.CodexGen());
|
|
24
|
+
registerLlmGenerator(new mock_1.MockGen());
|
|
25
|
+
registerLlmGenerator(new openai_1.OpenAiGen());
|
|
26
|
+
})();
|
package/dist/llm/gen.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.projectFuncToolsForProvider = projectFuncToolsForProvider;
|
|
4
|
+
function isRecord(value) {
|
|
5
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
6
|
+
}
|
|
7
|
+
function requireAllObjectProperties(schema) {
|
|
8
|
+
if (!isRecord(schema))
|
|
9
|
+
return schema;
|
|
10
|
+
const schemaType = 'type' in schema ? schema.type : undefined;
|
|
11
|
+
if (schemaType !== undefined && schemaType !== 'object')
|
|
12
|
+
return schema;
|
|
13
|
+
const props = 'properties' in schema ? schema.properties : undefined;
|
|
14
|
+
if (!isRecord(props))
|
|
15
|
+
return schema;
|
|
16
|
+
const required = Object.keys(props);
|
|
17
|
+
return { ...schema, required };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Provider-specific "safe" projection of tools.
|
|
21
|
+
*
|
|
22
|
+
* For now, Dominds passes MCP JSON Schema through to providers as-is, and relies on the
|
|
23
|
+
* shared tool-name validity rule to avoid name rejections across providers.
|
|
24
|
+
*/
|
|
25
|
+
function projectFuncToolsForProvider(apiType, funcTools) {
|
|
26
|
+
// Codex requires function tool schemas to mark all parameters as required (no optional fields).
|
|
27
|
+
// Optional semantics must be represented via sentinel values (e.g., '' / 0 / false) and handled
|
|
28
|
+
// in tool implementations and docs.
|
|
29
|
+
if (apiType === 'codex') {
|
|
30
|
+
const tools = funcTools.map((tool) => ({
|
|
31
|
+
...tool,
|
|
32
|
+
parameters: requireAllObjectProperties(tool.parameters),
|
|
33
|
+
}));
|
|
34
|
+
return { tools, problems: [] };
|
|
35
|
+
}
|
|
36
|
+
return { tools: funcTools, problems: [] };
|
|
37
|
+
}
|