@ai-sdk/code-mode 1.0.58 → 1.0.60
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/code-mode-tool.js +26 -7
- package/dist/code-mode-tool.js.map +1 -1
- package/dist/index.d.ts +18 -2
- package/dist/index.js.map +1 -1
- package/dist/tool-prompt.js +42 -14
- package/dist/tool-prompt.js.map +1 -1
- package/package.json +3 -3
- package/src/code-mode-tool.ts +38 -9
- package/src/index.ts +1 -0
- package/src/tool-prompt.ts +59 -17
- package/src/types.ts +17 -0
package/dist/code-mode-tool.js
CHANGED
|
@@ -4,16 +4,22 @@ import {
|
|
|
4
4
|
tool
|
|
5
5
|
} from "ai";
|
|
6
6
|
import { runCodeMode } from "./run-code-mode.js";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
buildCodeModeToolCatalogMessage,
|
|
9
|
+
buildCodeModeToolDescription
|
|
10
|
+
} from "./tool-prompt.js";
|
|
8
11
|
function createCodeModeTool(tools, options = {}) {
|
|
12
|
+
return createCodeModeToolWithDiscovery(tools, options, "description");
|
|
13
|
+
}
|
|
14
|
+
function createCodeModeToolWithDiscovery(tools, options, toolDiscovery) {
|
|
9
15
|
return tool({
|
|
10
|
-
description: buildCodeModeToolDescription(tools),
|
|
16
|
+
description: buildCodeModeToolDescription(tools, toolDiscovery),
|
|
11
17
|
inputSchema: jsonSchema({
|
|
12
18
|
type: "object",
|
|
13
19
|
properties: {
|
|
14
20
|
js: {
|
|
15
21
|
type: "string",
|
|
16
|
-
description: "Code-mode TypeScript source to execute. The
|
|
22
|
+
description: "Code-mode TypeScript source to execute. The code-mode context lists the available global `tools` API, input types, and call examples."
|
|
17
23
|
}
|
|
18
24
|
},
|
|
19
25
|
required: ["js"],
|
|
@@ -28,10 +34,23 @@ function createCodeModeTool(tools, options = {}) {
|
|
|
28
34
|
});
|
|
29
35
|
}
|
|
30
36
|
function codeModeTool(options = {}) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
37
|
+
const { toolDiscovery = "description", ...codeModeOptions } = options;
|
|
38
|
+
return experimental_toolCaller(
|
|
39
|
+
createCodeModeToolWithDiscovery({}, codeModeOptions, toolDiscovery),
|
|
40
|
+
{
|
|
41
|
+
type: "local",
|
|
42
|
+
bind: (tools) => createCodeModeToolWithDiscovery(
|
|
43
|
+
tools,
|
|
44
|
+
codeModeOptions,
|
|
45
|
+
toolDiscovery
|
|
46
|
+
),
|
|
47
|
+
...toolDiscovery === "conversation" ? {
|
|
48
|
+
prepareModelMessage: (tools) => buildCodeModeToolCatalogMessage(
|
|
49
|
+
tools
|
|
50
|
+
)
|
|
51
|
+
} : {}
|
|
52
|
+
}
|
|
53
|
+
);
|
|
35
54
|
}
|
|
36
55
|
export {
|
|
37
56
|
codeModeTool,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/code-mode-tool.ts"],"sourcesContent":["import {\n experimental_toolCaller,\n jsonSchema,\n tool,\n type Experimental_ToolCallerTool,\n} from 'ai';\nimport { runCodeMode } from './run-code-mode.js';\nimport {
|
|
1
|
+
{"version":3,"sources":["../src/code-mode-tool.ts"],"sourcesContent":["import {\n experimental_toolCaller,\n jsonSchema,\n tool,\n type Experimental_ToolCallerTool,\n} from 'ai';\nimport { runCodeMode } from './run-code-mode.js';\nimport {\n buildCodeModeToolCatalogMessage,\n buildCodeModeToolDescription,\n} from './tool-prompt.js';\nimport type {\n CodeModeOptions,\n CodeModeTool,\n CodeModeToolInput,\n CodeModeToolOptions,\n CodeModeToolSet,\n} from './types.js';\n\n/**\n * Creates an AI SDK tool that executes code-mode TypeScript in an isolated\n * sandbox.\n */\nexport function createCodeModeTool(\n tools: CodeModeToolSet,\n options: CodeModeOptions = {},\n): CodeModeTool {\n return createCodeModeToolWithDiscovery(tools, options, 'description');\n}\n\nfunction createCodeModeToolWithDiscovery(\n tools: CodeModeToolSet,\n options: CodeModeOptions,\n toolDiscovery: 'description' | 'conversation',\n): CodeModeTool {\n return tool<CodeModeToolInput, unknown, Record<string, unknown>>({\n description: buildCodeModeToolDescription(tools, toolDiscovery),\n inputSchema: jsonSchema<CodeModeToolInput>({\n type: 'object',\n properties: {\n js: {\n type: 'string',\n description:\n 'Code-mode TypeScript source to execute. The code-mode context lists the available global `tools` API, input types, and call examples.',\n },\n },\n required: ['js'],\n additionalProperties: false,\n }),\n execute: async (input, executionOptions) =>\n await runCodeMode({\n js: input.js,\n tools,\n toolExecutionOptions: executionOptions,\n options,\n }),\n }) as CodeModeTool;\n}\n\n/**\n * Creates a code-mode caller whose host tools are bound by the surrounding\n * AI SDK generation call.\n */\nexport function codeModeTool(\n options: CodeModeToolOptions = {},\n): Experimental_ToolCallerTool<CodeModeTool> {\n const { toolDiscovery = 'description', ...codeModeOptions } = options;\n\n return experimental_toolCaller(\n createCodeModeToolWithDiscovery({}, codeModeOptions, toolDiscovery),\n {\n type: 'local',\n bind: tools =>\n createCodeModeToolWithDiscovery(\n tools as unknown as CodeModeToolSet,\n codeModeOptions,\n toolDiscovery,\n ),\n ...(toolDiscovery === 'conversation'\n ? {\n prepareModelMessage: tools =>\n buildCodeModeToolCatalogMessage(\n tools as unknown as CodeModeToolSet,\n ),\n }\n : {}),\n },\n );\n}\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAaA,SAAS,mBACd,OACA,UAA2B,CAAC,GACd;AACd,SAAO,gCAAgC,OAAO,SAAS,aAAa;AACtE;AAEA,SAAS,gCACP,OACA,SACA,eACc;AACd,SAAO,KAA0D;AAAA,IAC/D,aAAa,6BAA6B,OAAO,aAAa;AAAA,IAC9D,aAAa,WAA8B;AAAA,MACzC,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI;AAAA,UACF,MAAM;AAAA,UACN,aACE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,UAAU,CAAC,IAAI;AAAA,MACf,sBAAsB;AAAA,IACxB,CAAC;AAAA,IACD,SAAS,OAAO,OAAO,qBACrB,MAAM,YAAY;AAAA,MAChB,IAAI,MAAM;AAAA,MACV;AAAA,MACA,sBAAsB;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACL,CAAC;AACH;AAMO,SAAS,aACd,UAA+B,CAAC,GACW;AAC3C,QAAM,EAAE,gBAAgB,eAAe,GAAG,gBAAgB,IAAI;AAE9D,SAAO;AAAA,IACL,gCAAgC,CAAC,GAAG,iBAAiB,aAAa;AAAA,IAClE;AAAA,MACE,MAAM;AAAA,MACN,MAAM,WACJ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACF,GAAI,kBAAkB,iBAClB;AAAA,QACE,qBAAqB,WACnB;AAAA,UACE;AAAA,QACF;AAAA,MACJ,IACA,CAAC;AAAA,IACP;AAAA,EACF;AACF;","names":[]}
|
package/dist/index.d.ts
CHANGED
|
@@ -152,6 +152,22 @@ interface CodeModeOptions {
|
|
|
152
152
|
onApprovalRequired?: (request: CodeModeApprovalRequest) => Promise<ApprovalDecision> | ApprovalDecision;
|
|
153
153
|
};
|
|
154
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* Options for the code-mode tool caller used with `experimental_toolCallers`.
|
|
157
|
+
*/
|
|
158
|
+
interface CodeModeToolOptions extends CodeModeOptions {
|
|
159
|
+
/**
|
|
160
|
+
* Controls how host tools are presented to the model.
|
|
161
|
+
*
|
|
162
|
+
* - `'description'`: include host-tool signatures in the provider-visible
|
|
163
|
+
* code-mode tool description.
|
|
164
|
+
* - `'conversation'`: keep the code-mode tool definition stable and announce
|
|
165
|
+
* the current host-tool catalog in a user message.
|
|
166
|
+
*
|
|
167
|
+
* @defaultValue `'description'`
|
|
168
|
+
*/
|
|
169
|
+
toolDiscovery?: 'description' | 'conversation';
|
|
170
|
+
}
|
|
155
171
|
interface CodeModeContinuationSecurityOptions {
|
|
156
172
|
signingKey?: string | Uint8Array;
|
|
157
173
|
/**
|
|
@@ -180,7 +196,7 @@ declare function createCodeModeTool(tools: CodeModeToolSet, options?: CodeModeOp
|
|
|
180
196
|
* Creates a code-mode caller whose host tools are bound by the surrounding
|
|
181
197
|
* AI SDK generation call.
|
|
182
198
|
*/
|
|
183
|
-
declare function codeModeTool(options?:
|
|
199
|
+
declare function codeModeTool(options?: CodeModeToolOptions): Experimental_ToolCallerTool<CodeModeTool>;
|
|
184
200
|
|
|
185
201
|
declare function isCodeModeApprovalInterrupt(value: unknown, continuationSecurity?: CodeModeContinuationSecurityOptions): value is CodeModeApprovalInterrupt;
|
|
186
202
|
declare function continueCodeModeApproval({ interrupt, approvalResponse, tools, options, toolExecutionOptions, }: {
|
|
@@ -297,4 +313,4 @@ declare function setCodeModeContinuationSigningKey(key?: string | Uint8Array, op
|
|
|
297
313
|
maxAgeMs?: number;
|
|
298
314
|
}): void;
|
|
299
315
|
|
|
300
|
-
export { type ApprovalDecision, CodeModeAbortedError, type CodeModeApprovalInterrupt, type CodeModeApprovalRequest, type CodeModeApprovalResponse, CodeModeBridgeLimitError, CodeModeConcurrencyError, type CodeModeContinuation, type CodeModeContinuationSecurityOptions, CodeModeDetachedBridgeRequestError, CodeModeError, type CodeModeExecutionPolicy, type CodeModeInterrupt, type CodeModeInterruptExecutionContext, type CodeModeInterruptPayload, type CodeModeInterruptResolution, type CodeModeOptions, CodeModeProtocolError, CodeModeSourceTooLargeError, CodeModeTimeoutError, type CodeModeTool, CodeModeToolApprovalDeniedError, CodeModeToolApprovalRequiredError, CodeModeToolError, type CodeModeToolExecutionOptions, type CodeModeToolInput, type CodeModeToolSet, type CodeModeUnwrappedResult, DIRECT_TOOL_CALL, type RunCodeModeInput, codeModeTool as experimental_codeModeTool, continueCodeModeApproval as experimental_continueCodeModeApproval, continueCodeModeInterrupt as experimental_continueCodeModeInterrupt, createCodeModeTool as experimental_createCodeModeTool, getCodeModeApprovalResponse as experimental_getCodeModeApprovalResponse, getCodeModeInterrupt as experimental_getCodeModeInterrupt, isCodeModeApprovalInterrupt as experimental_isCodeModeApprovalInterrupt, isCodeModeInterrupt as experimental_isCodeModeInterrupt, requestCodeModeInterrupt as experimental_requestCodeModeInterrupt, runCodeMode as experimental_runCodeMode, setCodeModeContinuationSigningKey as experimental_setCodeModeContinuationSigningKey, toCodeModeApprovalMessages as experimental_toCodeModeApprovalMessages, unwrapCodeModeResult as experimental_unwrapCodeModeResult };
|
|
316
|
+
export { type ApprovalDecision, CodeModeAbortedError, type CodeModeApprovalInterrupt, type CodeModeApprovalRequest, type CodeModeApprovalResponse, CodeModeBridgeLimitError, CodeModeConcurrencyError, type CodeModeContinuation, type CodeModeContinuationSecurityOptions, CodeModeDetachedBridgeRequestError, CodeModeError, type CodeModeExecutionPolicy, type CodeModeInterrupt, type CodeModeInterruptExecutionContext, type CodeModeInterruptPayload, type CodeModeInterruptResolution, type CodeModeOptions, CodeModeProtocolError, CodeModeSourceTooLargeError, CodeModeTimeoutError, type CodeModeTool, CodeModeToolApprovalDeniedError, CodeModeToolApprovalRequiredError, CodeModeToolError, type CodeModeToolExecutionOptions, type CodeModeToolInput, type CodeModeToolOptions, type CodeModeToolSet, type CodeModeUnwrappedResult, DIRECT_TOOL_CALL, type RunCodeModeInput, codeModeTool as experimental_codeModeTool, continueCodeModeApproval as experimental_continueCodeModeApproval, continueCodeModeInterrupt as experimental_continueCodeModeInterrupt, createCodeModeTool as experimental_createCodeModeTool, getCodeModeApprovalResponse as experimental_getCodeModeApprovalResponse, getCodeModeInterrupt as experimental_getCodeModeInterrupt, isCodeModeApprovalInterrupt as experimental_isCodeModeApprovalInterrupt, isCodeModeInterrupt as experimental_isCodeModeInterrupt, requestCodeModeInterrupt as experimental_requestCodeModeInterrupt, runCodeMode as experimental_runCodeMode, setCodeModeContinuationSigningKey as experimental_setCodeModeContinuationSigningKey, toCodeModeApprovalMessages as experimental_toCodeModeApprovalMessages, unwrapCodeModeResult as experimental_unwrapCodeModeResult };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { DIRECT_TOOL_CALL } from './direct-tool-call.js';\nexport {\n codeModeTool as experimental_codeModeTool,\n createCodeModeTool as experimental_createCodeModeTool,\n} from './code-mode-tool.js';\nexport {\n continueCodeModeApproval as experimental_continueCodeModeApproval,\n getCodeModeApprovalResponse as experimental_getCodeModeApprovalResponse,\n isCodeModeApprovalInterrupt as experimental_isCodeModeApprovalInterrupt,\n toCodeModeApprovalMessages as experimental_toCodeModeApprovalMessages,\n} from './approval-continuation.js';\nexport {\n CodeModeAbortedError,\n CodeModeBridgeLimitError,\n CodeModeConcurrencyError,\n CodeModeDetachedBridgeRequestError,\n CodeModeError,\n CodeModeProtocolError,\n CodeModeSourceTooLargeError,\n CodeModeTimeoutError,\n CodeModeToolApprovalDeniedError,\n CodeModeToolApprovalRequiredError,\n CodeModeToolError,\n} from './errors.js';\nexport { requestCodeModeInterrupt as experimental_requestCodeModeInterrupt } from './host-interrupt.js';\nexport {\n continueCodeModeInterrupt as experimental_continueCodeModeInterrupt,\n getCodeModeInterrupt as experimental_getCodeModeInterrupt,\n isCodeModeInterrupt as experimental_isCodeModeInterrupt,\n unwrapCodeModeResult as experimental_unwrapCodeModeResult,\n} from './interrupt-continuation.js';\nexport { runCodeMode as experimental_runCodeMode } from './run-code-mode.js';\nexport { setCodeModeContinuationSigningKey as experimental_setCodeModeContinuationSigningKey } from './continuation-capability.js';\nexport { setMaxWorkers as experimental_setMaxWorkers } from 'run';\nexport type {\n ApprovalDecision,\n CodeModeApprovalInterrupt,\n CodeModeApprovalRequest,\n CodeModeApprovalResponse,\n CodeModeContinuation,\n CodeModeContinuationSecurityOptions,\n CodeModeExecutionPolicy,\n CodeModeInterrupt,\n CodeModeInterruptExecutionContext,\n CodeModeInterruptPayload,\n CodeModeInterruptResolution,\n CodeModeOptions,\n CodeModeTool,\n CodeModeToolExecutionOptions,\n CodeModeToolInput,\n CodeModeToolSet,\n CodeModeUnwrappedResult,\n RunCodeModeInput,\n} from './types.js';\n"],"mappings":"AAAA,SAAS,wBAAwB;AACjC;AAAA,EACkB;AAAA,EACM;AAAA,OACjB;AACP;AAAA,EAC8B;AAAA,EACG;AAAA,EACA;AAAA,EACD;AAAA,OACzB;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAqC,gCAA6C;AAClF;AAAA,EAC+B;AAAA,EACL;AAAA,EACD;AAAA,EACC;AAAA,OACnB;AACP,SAAwB,mBAAgC;AACxD,SAA8C,yCAAsD;AACpG,SAA0B,qBAAkC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { DIRECT_TOOL_CALL } from './direct-tool-call.js';\nexport {\n codeModeTool as experimental_codeModeTool,\n createCodeModeTool as experimental_createCodeModeTool,\n} from './code-mode-tool.js';\nexport {\n continueCodeModeApproval as experimental_continueCodeModeApproval,\n getCodeModeApprovalResponse as experimental_getCodeModeApprovalResponse,\n isCodeModeApprovalInterrupt as experimental_isCodeModeApprovalInterrupt,\n toCodeModeApprovalMessages as experimental_toCodeModeApprovalMessages,\n} from './approval-continuation.js';\nexport {\n CodeModeAbortedError,\n CodeModeBridgeLimitError,\n CodeModeConcurrencyError,\n CodeModeDetachedBridgeRequestError,\n CodeModeError,\n CodeModeProtocolError,\n CodeModeSourceTooLargeError,\n CodeModeTimeoutError,\n CodeModeToolApprovalDeniedError,\n CodeModeToolApprovalRequiredError,\n CodeModeToolError,\n} from './errors.js';\nexport { requestCodeModeInterrupt as experimental_requestCodeModeInterrupt } from './host-interrupt.js';\nexport {\n continueCodeModeInterrupt as experimental_continueCodeModeInterrupt,\n getCodeModeInterrupt as experimental_getCodeModeInterrupt,\n isCodeModeInterrupt as experimental_isCodeModeInterrupt,\n unwrapCodeModeResult as experimental_unwrapCodeModeResult,\n} from './interrupt-continuation.js';\nexport { runCodeMode as experimental_runCodeMode } from './run-code-mode.js';\nexport { setCodeModeContinuationSigningKey as experimental_setCodeModeContinuationSigningKey } from './continuation-capability.js';\nexport { setMaxWorkers as experimental_setMaxWorkers } from 'run';\nexport type {\n ApprovalDecision,\n CodeModeApprovalInterrupt,\n CodeModeApprovalRequest,\n CodeModeApprovalResponse,\n CodeModeContinuation,\n CodeModeContinuationSecurityOptions,\n CodeModeExecutionPolicy,\n CodeModeInterrupt,\n CodeModeInterruptExecutionContext,\n CodeModeInterruptPayload,\n CodeModeInterruptResolution,\n CodeModeOptions,\n CodeModeTool,\n CodeModeToolExecutionOptions,\n CodeModeToolInput,\n CodeModeToolOptions,\n CodeModeToolSet,\n CodeModeUnwrappedResult,\n RunCodeModeInput,\n} from './types.js';\n"],"mappings":"AAAA,SAAS,wBAAwB;AACjC;AAAA,EACkB;AAAA,EACM;AAAA,OACjB;AACP;AAAA,EAC8B;AAAA,EACG;AAAA,EACA;AAAA,EACD;AAAA,OACzB;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAqC,gCAA6C;AAClF;AAAA,EAC+B;AAAA,EACL;AAAA,EACD;AAAA,EACC;AAAA,OACnB;AACP,SAAwB,mBAAgC;AACxD,SAA8C,yCAAsD;AACpG,SAA0B,qBAAkC;","names":[]}
|
package/dist/tool-prompt.js
CHANGED
|
@@ -1,7 +1,46 @@
|
|
|
1
1
|
import { asSchema } from "ai";
|
|
2
2
|
const MAX_SCHEMA_DEPTH = 8;
|
|
3
3
|
const MAX_COMPACT_OBJECT_TYPE_LENGTH = 120;
|
|
4
|
-
function buildCodeModeToolDescription(tools) {
|
|
4
|
+
function buildCodeModeToolDescription(tools, toolDiscovery = "description") {
|
|
5
|
+
const sections = [
|
|
6
|
+
"Execute code-mode TypeScript in an isolated sandbox.",
|
|
7
|
+
"",
|
|
8
|
+
"Put the full program in `js`; top-level `await`/`return` work. Return a JSON-serializable result.",
|
|
9
|
+
"Call host tools only as async `tools.name(input)`; await each or use `Promise.all` for independent calls.",
|
|
10
|
+
toolDiscovery === "description" ? "Use exact names/types below. `JSON.parse`/`JSON.stringify` are available." : "Use exact names/types from the latest capability update. `JSON.parse`/`JSON.stringify` are available.",
|
|
11
|
+
"Fetch: `fetch` is not available."
|
|
12
|
+
];
|
|
13
|
+
if (toolDiscovery === "conversation") {
|
|
14
|
+
sections.push(
|
|
15
|
+
"",
|
|
16
|
+
"Tools:",
|
|
17
|
+
'The current host-tool API is provided in "Code mode capability update" user messages. Follow the latest catalog and ignore earlier catalogs.'
|
|
18
|
+
);
|
|
19
|
+
return sections.join("\n");
|
|
20
|
+
}
|
|
21
|
+
const { typeBlock, exampleBlock } = renderToolCatalog(tools);
|
|
22
|
+
sections.push("", "Tools:", typeBlock);
|
|
23
|
+
if (exampleBlock.length > 0) {
|
|
24
|
+
sections.push(exampleBlock);
|
|
25
|
+
}
|
|
26
|
+
return sections.join("\n");
|
|
27
|
+
}
|
|
28
|
+
function buildCodeModeToolCatalogMessage(tools) {
|
|
29
|
+
const { typeBlock, exampleBlock } = renderToolCatalog(tools);
|
|
30
|
+
const sections = [
|
|
31
|
+
"Code mode capability update.",
|
|
32
|
+
"",
|
|
33
|
+
"This catalog replaces all previous code mode capability catalogs. Only the tools listed below are currently available through `tools`.",
|
|
34
|
+
"",
|
|
35
|
+
"Tools:",
|
|
36
|
+
typeBlock
|
|
37
|
+
];
|
|
38
|
+
if (exampleBlock.length > 0) {
|
|
39
|
+
sections.push(exampleBlock);
|
|
40
|
+
}
|
|
41
|
+
return sections.join("\n");
|
|
42
|
+
}
|
|
43
|
+
function renderToolCatalog(tools) {
|
|
5
44
|
const toolEntries = Object.entries(tools);
|
|
6
45
|
const typeBlock = toolEntries.length === 0 ? "No host tools. Do not call `tools.*`." : [
|
|
7
46
|
"```ts",
|
|
@@ -17,19 +56,7 @@ function buildCodeModeToolDescription(tools) {
|
|
|
17
56
|
...renderToolExamples(toolEntries),
|
|
18
57
|
"```"
|
|
19
58
|
].join("\n");
|
|
20
|
-
|
|
21
|
-
"Execute code-mode TypeScript in an isolated sandbox.",
|
|
22
|
-
"",
|
|
23
|
-
"Put the full program in `js`; top-level `await`/`return` work. Return a JSON-serializable result.",
|
|
24
|
-
"Call host tools only as async `tools.name(input)`; await each or use `Promise.all` for independent calls.",
|
|
25
|
-
"Use exact names/types below. `JSON.parse`/`JSON.stringify` are available.",
|
|
26
|
-
"Fetch: `fetch` is not available."
|
|
27
|
-
];
|
|
28
|
-
sections.push("", "Tools:", typeBlock);
|
|
29
|
-
if (exampleBlock.length > 0) {
|
|
30
|
-
sections.push(exampleBlock);
|
|
31
|
-
}
|
|
32
|
-
return sections.join("\n");
|
|
59
|
+
return { typeBlock, exampleBlock };
|
|
33
60
|
}
|
|
34
61
|
function renderToolType([toolName, tool]) {
|
|
35
62
|
const schema = resolveInputSchema(tool);
|
|
@@ -435,6 +462,7 @@ function isPromiseLike(value) {
|
|
|
435
462
|
return isRecord(value) && typeof value.then === "function";
|
|
436
463
|
}
|
|
437
464
|
export {
|
|
465
|
+
buildCodeModeToolCatalogMessage,
|
|
438
466
|
buildCodeModeToolDescription
|
|
439
467
|
};
|
|
440
468
|
//# sourceMappingURL=tool-prompt.js.map
|
package/dist/tool-prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tool-prompt.ts"],"sourcesContent":["import { asSchema } from 'ai';\nimport type { CodeModeToolSet } from './types.js';\n\ntype JsonSchema = Record<string, unknown>;\n\ninterface SchemaContext {\n root: JsonSchema;\n seenRefs: Set<string>;\n depth: number;\n}\n\nconst MAX_SCHEMA_DEPTH = 8;\nconst MAX_COMPACT_OBJECT_TYPE_LENGTH = 120;\n\nexport function buildCodeModeToolDescription(tools: CodeModeToolSet): string {\n const toolEntries = Object.entries(tools);\n const typeBlock =\n toolEntries.length === 0\n ? 'No host tools. Do not call `tools.*`.'\n : [\n '```ts',\n 'declare const tools: {',\n ...toolEntries.flatMap(renderToolType),\n '};',\n '```',\n ].join('\\n');\n\n const exampleBlock =\n toolEntries.length === 0\n ? ''\n : [\n '',\n 'Tool call examples:',\n '```ts',\n ...renderToolExamples(toolEntries),\n '```',\n ].join('\\n');\n\n const sections = [\n 'Execute code-mode TypeScript in an isolated sandbox.',\n '',\n 'Put the full program in `js`; top-level `await`/`return` work. Return a JSON-serializable result.',\n 'Call host tools only as async `tools.name(input)`; await each or use `Promise.all` for independent calls.',\n 'Use exact names/types below. `JSON.parse`/`JSON.stringify` are available.',\n 'Fetch: `fetch` is not available.',\n ];\n\n sections.push('', 'Tools:', typeBlock);\n\n if (exampleBlock.length > 0) {\n sections.push(exampleBlock);\n }\n\n return sections.join('\\n');\n}\n\nfunction renderToolType([toolName, tool]: [\n string,\n CodeModeToolSet[string],\n]): string[] {\n const schema = resolveInputSchema(tool);\n const inputType =\n schema === undefined ? 'unknown' : schemaToType(schema, schema);\n const outputSchema = resolveOutputSchema(tool);\n const outputType =\n outputSchema === undefined\n ? 'unknown'\n : schemaToType(outputSchema, outputSchema);\n const description = firstString(tool.description, tool.title);\n const lines: string[] = [];\n\n if (description !== undefined) {\n lines.push(` /** ${toComment(description)} */`);\n }\n\n lines.push(\n ` ${formatObjectKey(toolName)}: (input: ${indentType(inputType, 2)}) => Promise<${indentType(outputType, 2)}>;`,\n );\n return lines;\n}\n\nfunction renderToolExamples(\n toolEntries: Array<[string, CodeModeToolSet[string]]>,\n): string[] {\n if (toolEntries.length === 1) {\n const toolEntry = toolEntries[0]!;\n const projection = renderToolProjection('result', toolEntry[1]);\n return [\n `const result = await ${renderToolExampleCall(toolEntry)};`,\n `return ${projection};`,\n ];\n }\n\n const variableNames = uniqueToolVariableNames(\n toolEntries.map(([toolName]) => toolName),\n );\n const calls = toolEntries.map(\n toolEntry => ` ${renderToolExampleCall(toolEntry)},`,\n );\n return [\n `const [${variableNames.join(', ')}] = await Promise.all([`,\n ...calls,\n ']);',\n 'return {',\n ...toolEntries.map(([toolName, tool], index) => {\n const projection = renderToolProjection(variableNames[index]!, tool);\n return ` ${formatObjectKey(toolName)}: ${projection},`;\n }),\n '};',\n ];\n}\n\nfunction renderToolExampleCall([toolName, tool]: [\n string,\n CodeModeToolSet[string],\n]): string {\n const schema = resolveInputSchema(tool);\n const input =\n firstInputExample(tool) ??\n (schema === undefined ? {} : sampleFromSchema(schema, schema));\n return `tools${formatPropertyAccess(toolName)}(${JSON.stringify(input)})`;\n}\n\nfunction renderToolProjection(\n variableName: string,\n tool: CodeModeToolSet[string],\n): string {\n const field = firstObjectProperty(resolveOutputSchema(tool));\n if (field === undefined) {\n return variableName;\n }\n return `{ ${formatObjectKey(field)}: ${variableName}${formatPropertyAccess(field)} }`;\n}\n\nfunction firstObjectProperty(\n schema: JsonSchema | undefined,\n): string | undefined {\n if (schema === undefined || !isRecord(schema.properties)) {\n return undefined;\n }\n return Object.entries(schema.properties).find(entry =>\n isRecord(entry[1]),\n )?.[0];\n}\n\nfunction resolveInputSchema(\n tool: CodeModeToolSet[string],\n): JsonSchema | undefined {\n try {\n const jsonSchema = asSchema(tool.inputSchema).jsonSchema;\n if (isPromiseLike(jsonSchema) || !isRecord(jsonSchema)) {\n return undefined;\n }\n return jsonSchema;\n } catch {\n return undefined;\n }\n}\n\nfunction resolveOutputSchema(\n tool: CodeModeToolSet[string],\n): JsonSchema | undefined {\n try {\n const outputSchema = tool.outputSchema;\n if (outputSchema === undefined) {\n return undefined;\n }\n const jsonSchema = asSchema(outputSchema).jsonSchema;\n if (isPromiseLike(jsonSchema) || !isRecord(jsonSchema)) {\n return undefined;\n }\n return jsonSchema;\n } catch {\n return undefined;\n }\n}\n\nfunction schemaToType(schema: JsonSchema, root: JsonSchema): string {\n return schemaToTypeInner(schema, {\n root,\n seenRefs: new Set(),\n depth: 0,\n });\n}\n\nfunction schemaToTypeInner(schema: JsonSchema, context: SchemaContext): string {\n if (context.depth > MAX_SCHEMA_DEPTH) {\n return 'unknown';\n }\n\n const ref = firstString(schema.$ref);\n if (ref !== undefined) {\n const resolved = resolveRef(ref, context.root, context.seenRefs);\n return resolved === undefined\n ? 'unknown'\n : schemaToTypeInner(resolved, nextContext(context));\n }\n\n const constValue = schema.const;\n if (constValue !== undefined) {\n return literalType(constValue);\n }\n\n const enumValues = asArray(schema.enum);\n if (enumValues !== undefined) {\n return union(enumValues.map(literalType));\n }\n\n const oneOf = schemaArray(schema.oneOf);\n if (oneOf !== undefined) {\n return union(\n oneOf.map(part => schemaToTypeInner(part, nextContext(context))),\n );\n }\n\n const anyOf = schemaArray(schema.anyOf);\n if (anyOf !== undefined) {\n return union(\n anyOf.map(part => schemaToTypeInner(part, nextContext(context))),\n );\n }\n\n const allOf = schemaArray(schema.allOf);\n if (allOf !== undefined) {\n return allOf\n .map(part => schemaToTypeInner(part, nextContext(context)))\n .join(' & ');\n }\n\n const type = schema.type;\n if (Array.isArray(type)) {\n return union(\n type.map(part => schemaToTypeInner({ ...schema, type: part }, context)),\n );\n }\n\n if (type === 'object' || isRecord(schema.properties)) {\n return objectType(schema, context);\n }\n\n if (type === 'array' || schema.items !== undefined) {\n return arrayType(schema, context);\n }\n\n if (type === 'string') {\n return 'string';\n }\n\n if (type === 'number' || type === 'integer') {\n return 'number';\n }\n\n if (type === 'boolean') {\n return 'boolean';\n }\n\n if (type === 'null') {\n return 'null';\n }\n\n return 'unknown';\n}\n\nfunction objectType(schema: JsonSchema, context: SchemaContext): string {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = new Set(asArray(schema.required)?.filter(isString) ?? []);\n const entries = Object.entries(properties).filter(\n (entry): entry is [string, JsonSchema] => isRecord(entry[1]),\n );\n\n if (entries.length === 0) {\n const additionalProperties = schema.additionalProperties;\n if (isRecord(additionalProperties)) {\n return `Record<string, ${schemaToTypeInner(additionalProperties, nextContext(context))}>`;\n }\n if (additionalProperties === true) {\n return 'Record<string, unknown>';\n }\n return '{}';\n }\n\n const lines = entries.flatMap(([name, value]) => {\n const propertyLines: string[] = [];\n const description = firstString(value.description);\n if (description !== undefined) {\n propertyLines.push(` /** ${toComment(description)} */`);\n }\n propertyLines.push(\n ` ${formatObjectKey(name)}${required.has(name) ? '' : '?'}: ${indentType(\n schemaToTypeInner(value, nextContext(context)),\n 2,\n )};`,\n );\n return propertyLines;\n });\n\n const additionalProperties = schema.additionalProperties;\n if (isRecord(additionalProperties)) {\n lines.push(\n ` [key: string]: ${schemaToTypeInner(additionalProperties, nextContext(context))};`,\n );\n } else if (additionalProperties === true) {\n lines.push(' [key: string]: unknown;');\n }\n\n const compact = compactObjectType(lines);\n if (compact !== undefined) {\n return compact;\n }\n\n return `{\\n${lines.join('\\n')}\\n}`;\n}\n\nfunction arrayType(schema: JsonSchema, context: SchemaContext): string {\n const items = schema.items;\n if (Array.isArray(items)) {\n return `[${items\n .map(item =>\n isRecord(item)\n ? schemaToTypeInner(item, nextContext(context))\n : 'unknown',\n )\n .join(', ')}]`;\n }\n if (isRecord(items)) {\n const itemType = schemaToTypeInner(items, nextContext(context));\n return needsParentheses(itemType) || itemType.includes('\\n')\n ? `Array<${itemType}>`\n : `${itemType}[]`;\n }\n return 'unknown[]';\n}\n\nfunction sampleFromSchema(schema: JsonSchema, root: JsonSchema): unknown {\n return sampleFromSchemaInner(schema, {\n root,\n seenRefs: new Set(),\n depth: 0,\n });\n}\n\nfunction sampleFromSchemaInner(\n schema: JsonSchema,\n context: SchemaContext,\n): unknown {\n if (context.depth > MAX_SCHEMA_DEPTH) {\n return null;\n }\n\n if (schema.default !== undefined) {\n return schema.default;\n }\n\n const ref = firstString(schema.$ref);\n if (ref !== undefined) {\n const resolved = resolveRef(ref, context.root, context.seenRefs);\n return resolved === undefined\n ? null\n : sampleFromSchemaInner(resolved, nextContext(context));\n }\n\n if (schema.const !== undefined) {\n return schema.const;\n }\n\n const enumValues = asArray(schema.enum);\n if (enumValues !== undefined) {\n return enumValues[0] ?? null;\n }\n\n const oneOf = schemaArray(schema.oneOf);\n if (oneOf !== undefined) {\n return sampleFromSchemaInner(oneOf[0] ?? {}, nextContext(context));\n }\n\n const anyOf = schemaArray(schema.anyOf);\n if (anyOf !== undefined) {\n return sampleFromSchemaInner(anyOf[0] ?? {}, nextContext(context));\n }\n\n const type = schema.type;\n if (Array.isArray(type)) {\n return sampleFromSchemaInner(\n { ...schema, type: type.find(part => part !== 'null') ?? type[0] },\n context,\n );\n }\n\n if (type === 'object' || isRecord(schema.properties)) {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n return Object.fromEntries(\n Object.entries(properties)\n .filter((entry): entry is [string, JsonSchema] => isRecord(entry[1]))\n .map(([name, value]) => [\n name,\n sampleFromSchemaInner(value, nextContext(context)),\n ]),\n );\n }\n\n if (type === 'array' || schema.items !== undefined) {\n const items = Array.isArray(schema.items) ? schema.items[0] : schema.items;\n return [\n isRecord(items)\n ? sampleFromSchemaInner(items, nextContext(context))\n : null,\n ];\n }\n\n if (type === 'number' || type === 'integer') {\n return 1;\n }\n\n if (type === 'boolean') {\n return true;\n }\n\n if (type === 'null') {\n return null;\n }\n\n if (type === 'string' || type === undefined) {\n const examples = asArray(schema.examples);\n if (examples?.[0] !== undefined) {\n return examples[0];\n }\n const format = firstString(schema.format);\n if (format === 'uri' || format === 'url') {\n return 'https://example.com';\n }\n if (format === 'date-time') {\n return '2026-01-01T00:00:00.000Z';\n }\n if (format === 'date') {\n return '2026-01-01';\n }\n return 'string';\n }\n\n return null;\n}\n\nfunction firstInputExample(tool: CodeModeToolSet[string]): unknown {\n const examples = asArray(tool.inputExamples);\n const first = examples?.[0];\n return isRecord(first) && 'input' in first ? first.input : undefined;\n}\n\nfunction resolveRef(\n ref: string,\n root: JsonSchema,\n seenRefs: Set<string>,\n): JsonSchema | undefined {\n if (!ref.startsWith('#/') || seenRefs.has(ref)) {\n return undefined;\n }\n\n seenRefs.add(ref);\n const value = ref\n .slice(2)\n .split('/')\n .map(part => part.replace(/~1/g, '/').replace(/~0/g, '~'))\n .reduce<unknown>((current, part) => {\n if (!isRecord(current)) {\n return undefined;\n }\n return current[part];\n }, root);\n\n return isRecord(value) ? value : undefined;\n}\n\nfunction nextContext(context: SchemaContext): SchemaContext {\n return {\n ...context,\n depth: context.depth + 1,\n };\n}\n\nfunction union(types: string[]): string {\n const unique = [...new Set(types)];\n return unique.length === 0 ? 'unknown' : unique.join(' | ');\n}\n\nfunction literalType(value: unknown): string {\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n ) {\n return String(value);\n }\n return 'unknown';\n}\n\nfunction indentType(type: string, spaces: number): string {\n if (!type.includes('\\n')) {\n return type;\n }\n\n const padding = ' '.repeat(spaces);\n return type.replaceAll('\\n', `\\n${padding}`);\n}\n\nfunction needsParentheses(type: string): boolean {\n return type.includes(' | ') || type.includes(' & ');\n}\n\nfunction formatObjectKey(key: string): string {\n return isIdentifier(key) ? key : JSON.stringify(key);\n}\n\nfunction formatPropertyAccess(key: string): string {\n return isIdentifier(key) ? `.${key}` : `[${JSON.stringify(key)}]`;\n}\n\nfunction uniqueToolVariableNames(toolNames: string[]): string[] {\n const seen = new Map<string, number>();\n return toolNames.map(toolName => {\n const base = toIdentifier(toolName);\n const count = seen.get(base) ?? 0;\n seen.set(base, count + 1);\n return count === 0 ? base : `${base}${count + 1}`;\n });\n}\n\nfunction toIdentifier(value: string): string {\n const identifier = value\n .replace(/[^A-Za-z0-9_$]/g, '_')\n .replace(/^[^A-Za-z_$]+/, '');\n return identifier.length === 0 ? 'tool' : identifier;\n}\n\nfunction isIdentifier(value: string): boolean {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value);\n}\n\nfunction compactObjectType(lines: string[]): string | undefined {\n if (lines.length === 0 || lines.some(line => line.includes('/**'))) {\n return undefined;\n }\n\n const fields = lines.map(line => line.trim());\n if (fields.some(field => field.includes('\\n'))) {\n return undefined;\n }\n\n const compact = `{ ${fields.join(' ')} }`;\n return compact.length <= MAX_COMPACT_OBJECT_TYPE_LENGTH ? compact : undefined;\n}\n\nfunction toComment(value: string): string {\n return value.replaceAll('*/', '* /').replace(/\\s+/g, ' ').trim();\n}\n\nfunction firstString(...values: unknown[]): string | undefined {\n return values.find(isString);\n}\n\nfunction schemaArray(value: unknown): JsonSchema[] | undefined {\n const values = asArray(value);\n if (values === undefined || !values.every(isRecord)) {\n return undefined;\n }\n return values;\n}\n\nfunction asArray(value: unknown): unknown[] | undefined {\n return Array.isArray(value) ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is JsonSchema {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return isRecord(value) && typeof value.then === 'function';\n}\n"],"mappings":"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","names":["additionalProperties"]}
|
|
1
|
+
{"version":3,"sources":["../src/tool-prompt.ts"],"sourcesContent":["import { asSchema } from 'ai';\nimport type { CodeModeToolSet } from './types.js';\n\ntype JsonSchema = Record<string, unknown>;\n\ninterface SchemaContext {\n root: JsonSchema;\n seenRefs: Set<string>;\n depth: number;\n}\n\nconst MAX_SCHEMA_DEPTH = 8;\nconst MAX_COMPACT_OBJECT_TYPE_LENGTH = 120;\n\nexport function buildCodeModeToolDescription(\n tools: CodeModeToolSet,\n toolDiscovery: 'description' | 'conversation' = 'description',\n): string {\n const sections = [\n 'Execute code-mode TypeScript in an isolated sandbox.',\n '',\n 'Put the full program in `js`; top-level `await`/`return` work. Return a JSON-serializable result.',\n 'Call host tools only as async `tools.name(input)`; await each or use `Promise.all` for independent calls.',\n toolDiscovery === 'description'\n ? 'Use exact names/types below. `JSON.parse`/`JSON.stringify` are available.'\n : 'Use exact names/types from the latest capability update. `JSON.parse`/`JSON.stringify` are available.',\n 'Fetch: `fetch` is not available.',\n ];\n\n if (toolDiscovery === 'conversation') {\n sections.push(\n '',\n 'Tools:',\n 'The current host-tool API is provided in \"Code mode capability update\" user messages. Follow the latest catalog and ignore earlier catalogs.',\n );\n return sections.join('\\n');\n }\n\n const { typeBlock, exampleBlock } = renderToolCatalog(tools);\n sections.push('', 'Tools:', typeBlock);\n\n if (exampleBlock.length > 0) {\n sections.push(exampleBlock);\n }\n\n return sections.join('\\n');\n}\n\nexport function buildCodeModeToolCatalogMessage(\n tools: CodeModeToolSet,\n): string {\n const { typeBlock, exampleBlock } = renderToolCatalog(tools);\n const sections = [\n 'Code mode capability update.',\n '',\n 'This catalog replaces all previous code mode capability catalogs. Only the tools listed below are currently available through `tools`.',\n '',\n 'Tools:',\n typeBlock,\n ];\n\n if (exampleBlock.length > 0) {\n sections.push(exampleBlock);\n }\n\n return sections.join('\\n');\n}\n\nfunction renderToolCatalog(tools: CodeModeToolSet): {\n typeBlock: string;\n exampleBlock: string;\n} {\n const toolEntries = Object.entries(tools);\n const typeBlock =\n toolEntries.length === 0\n ? 'No host tools. Do not call `tools.*`.'\n : [\n '```ts',\n 'declare const tools: {',\n ...toolEntries.flatMap(renderToolType),\n '};',\n '```',\n ].join('\\n');\n\n const exampleBlock =\n toolEntries.length === 0\n ? ''\n : [\n '',\n 'Tool call examples:',\n '```ts',\n ...renderToolExamples(toolEntries),\n '```',\n ].join('\\n');\n\n return { typeBlock, exampleBlock };\n}\n\nfunction renderToolType([toolName, tool]: [\n string,\n CodeModeToolSet[string],\n]): string[] {\n const schema = resolveInputSchema(tool);\n const inputType =\n schema === undefined ? 'unknown' : schemaToType(schema, schema);\n const outputSchema = resolveOutputSchema(tool);\n const outputType =\n outputSchema === undefined\n ? 'unknown'\n : schemaToType(outputSchema, outputSchema);\n const description = firstString(tool.description, tool.title);\n const lines: string[] = [];\n\n if (description !== undefined) {\n lines.push(` /** ${toComment(description)} */`);\n }\n\n lines.push(\n ` ${formatObjectKey(toolName)}: (input: ${indentType(inputType, 2)}) => Promise<${indentType(outputType, 2)}>;`,\n );\n return lines;\n}\n\nfunction renderToolExamples(\n toolEntries: Array<[string, CodeModeToolSet[string]]>,\n): string[] {\n if (toolEntries.length === 1) {\n const toolEntry = toolEntries[0]!;\n const projection = renderToolProjection('result', toolEntry[1]);\n return [\n `const result = await ${renderToolExampleCall(toolEntry)};`,\n `return ${projection};`,\n ];\n }\n\n const variableNames = uniqueToolVariableNames(\n toolEntries.map(([toolName]) => toolName),\n );\n const calls = toolEntries.map(\n toolEntry => ` ${renderToolExampleCall(toolEntry)},`,\n );\n return [\n `const [${variableNames.join(', ')}] = await Promise.all([`,\n ...calls,\n ']);',\n 'return {',\n ...toolEntries.map(([toolName, tool], index) => {\n const projection = renderToolProjection(variableNames[index]!, tool);\n return ` ${formatObjectKey(toolName)}: ${projection},`;\n }),\n '};',\n ];\n}\n\nfunction renderToolExampleCall([toolName, tool]: [\n string,\n CodeModeToolSet[string],\n]): string {\n const schema = resolveInputSchema(tool);\n const input =\n firstInputExample(tool) ??\n (schema === undefined ? {} : sampleFromSchema(schema, schema));\n return `tools${formatPropertyAccess(toolName)}(${JSON.stringify(input)})`;\n}\n\nfunction renderToolProjection(\n variableName: string,\n tool: CodeModeToolSet[string],\n): string {\n const field = firstObjectProperty(resolveOutputSchema(tool));\n if (field === undefined) {\n return variableName;\n }\n return `{ ${formatObjectKey(field)}: ${variableName}${formatPropertyAccess(field)} }`;\n}\n\nfunction firstObjectProperty(\n schema: JsonSchema | undefined,\n): string | undefined {\n if (schema === undefined || !isRecord(schema.properties)) {\n return undefined;\n }\n return Object.entries(schema.properties).find(entry =>\n isRecord(entry[1]),\n )?.[0];\n}\n\nfunction resolveInputSchema(\n tool: CodeModeToolSet[string],\n): JsonSchema | undefined {\n try {\n const jsonSchema = asSchema(tool.inputSchema).jsonSchema;\n if (isPromiseLike(jsonSchema) || !isRecord(jsonSchema)) {\n return undefined;\n }\n return jsonSchema;\n } catch {\n return undefined;\n }\n}\n\nfunction resolveOutputSchema(\n tool: CodeModeToolSet[string],\n): JsonSchema | undefined {\n try {\n const outputSchema = tool.outputSchema;\n if (outputSchema === undefined) {\n return undefined;\n }\n const jsonSchema = asSchema(outputSchema).jsonSchema;\n if (isPromiseLike(jsonSchema) || !isRecord(jsonSchema)) {\n return undefined;\n }\n return jsonSchema;\n } catch {\n return undefined;\n }\n}\n\nfunction schemaToType(schema: JsonSchema, root: JsonSchema): string {\n return schemaToTypeInner(schema, {\n root,\n seenRefs: new Set(),\n depth: 0,\n });\n}\n\nfunction schemaToTypeInner(schema: JsonSchema, context: SchemaContext): string {\n if (context.depth > MAX_SCHEMA_DEPTH) {\n return 'unknown';\n }\n\n const ref = firstString(schema.$ref);\n if (ref !== undefined) {\n const resolved = resolveRef(ref, context.root, context.seenRefs);\n return resolved === undefined\n ? 'unknown'\n : schemaToTypeInner(resolved, nextContext(context));\n }\n\n const constValue = schema.const;\n if (constValue !== undefined) {\n return literalType(constValue);\n }\n\n const enumValues = asArray(schema.enum);\n if (enumValues !== undefined) {\n return union(enumValues.map(literalType));\n }\n\n const oneOf = schemaArray(schema.oneOf);\n if (oneOf !== undefined) {\n return union(\n oneOf.map(part => schemaToTypeInner(part, nextContext(context))),\n );\n }\n\n const anyOf = schemaArray(schema.anyOf);\n if (anyOf !== undefined) {\n return union(\n anyOf.map(part => schemaToTypeInner(part, nextContext(context))),\n );\n }\n\n const allOf = schemaArray(schema.allOf);\n if (allOf !== undefined) {\n return allOf\n .map(part => schemaToTypeInner(part, nextContext(context)))\n .join(' & ');\n }\n\n const type = schema.type;\n if (Array.isArray(type)) {\n return union(\n type.map(part => schemaToTypeInner({ ...schema, type: part }, context)),\n );\n }\n\n if (type === 'object' || isRecord(schema.properties)) {\n return objectType(schema, context);\n }\n\n if (type === 'array' || schema.items !== undefined) {\n return arrayType(schema, context);\n }\n\n if (type === 'string') {\n return 'string';\n }\n\n if (type === 'number' || type === 'integer') {\n return 'number';\n }\n\n if (type === 'boolean') {\n return 'boolean';\n }\n\n if (type === 'null') {\n return 'null';\n }\n\n return 'unknown';\n}\n\nfunction objectType(schema: JsonSchema, context: SchemaContext): string {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = new Set(asArray(schema.required)?.filter(isString) ?? []);\n const entries = Object.entries(properties).filter(\n (entry): entry is [string, JsonSchema] => isRecord(entry[1]),\n );\n\n if (entries.length === 0) {\n const additionalProperties = schema.additionalProperties;\n if (isRecord(additionalProperties)) {\n return `Record<string, ${schemaToTypeInner(additionalProperties, nextContext(context))}>`;\n }\n if (additionalProperties === true) {\n return 'Record<string, unknown>';\n }\n return '{}';\n }\n\n const lines = entries.flatMap(([name, value]) => {\n const propertyLines: string[] = [];\n const description = firstString(value.description);\n if (description !== undefined) {\n propertyLines.push(` /** ${toComment(description)} */`);\n }\n propertyLines.push(\n ` ${formatObjectKey(name)}${required.has(name) ? '' : '?'}: ${indentType(\n schemaToTypeInner(value, nextContext(context)),\n 2,\n )};`,\n );\n return propertyLines;\n });\n\n const additionalProperties = schema.additionalProperties;\n if (isRecord(additionalProperties)) {\n lines.push(\n ` [key: string]: ${schemaToTypeInner(additionalProperties, nextContext(context))};`,\n );\n } else if (additionalProperties === true) {\n lines.push(' [key: string]: unknown;');\n }\n\n const compact = compactObjectType(lines);\n if (compact !== undefined) {\n return compact;\n }\n\n return `{\\n${lines.join('\\n')}\\n}`;\n}\n\nfunction arrayType(schema: JsonSchema, context: SchemaContext): string {\n const items = schema.items;\n if (Array.isArray(items)) {\n return `[${items\n .map(item =>\n isRecord(item)\n ? schemaToTypeInner(item, nextContext(context))\n : 'unknown',\n )\n .join(', ')}]`;\n }\n if (isRecord(items)) {\n const itemType = schemaToTypeInner(items, nextContext(context));\n return needsParentheses(itemType) || itemType.includes('\\n')\n ? `Array<${itemType}>`\n : `${itemType}[]`;\n }\n return 'unknown[]';\n}\n\nfunction sampleFromSchema(schema: JsonSchema, root: JsonSchema): unknown {\n return sampleFromSchemaInner(schema, {\n root,\n seenRefs: new Set(),\n depth: 0,\n });\n}\n\nfunction sampleFromSchemaInner(\n schema: JsonSchema,\n context: SchemaContext,\n): unknown {\n if (context.depth > MAX_SCHEMA_DEPTH) {\n return null;\n }\n\n if (schema.default !== undefined) {\n return schema.default;\n }\n\n const ref = firstString(schema.$ref);\n if (ref !== undefined) {\n const resolved = resolveRef(ref, context.root, context.seenRefs);\n return resolved === undefined\n ? null\n : sampleFromSchemaInner(resolved, nextContext(context));\n }\n\n if (schema.const !== undefined) {\n return schema.const;\n }\n\n const enumValues = asArray(schema.enum);\n if (enumValues !== undefined) {\n return enumValues[0] ?? null;\n }\n\n const oneOf = schemaArray(schema.oneOf);\n if (oneOf !== undefined) {\n return sampleFromSchemaInner(oneOf[0] ?? {}, nextContext(context));\n }\n\n const anyOf = schemaArray(schema.anyOf);\n if (anyOf !== undefined) {\n return sampleFromSchemaInner(anyOf[0] ?? {}, nextContext(context));\n }\n\n const type = schema.type;\n if (Array.isArray(type)) {\n return sampleFromSchemaInner(\n { ...schema, type: type.find(part => part !== 'null') ?? type[0] },\n context,\n );\n }\n\n if (type === 'object' || isRecord(schema.properties)) {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n return Object.fromEntries(\n Object.entries(properties)\n .filter((entry): entry is [string, JsonSchema] => isRecord(entry[1]))\n .map(([name, value]) => [\n name,\n sampleFromSchemaInner(value, nextContext(context)),\n ]),\n );\n }\n\n if (type === 'array' || schema.items !== undefined) {\n const items = Array.isArray(schema.items) ? schema.items[0] : schema.items;\n return [\n isRecord(items)\n ? sampleFromSchemaInner(items, nextContext(context))\n : null,\n ];\n }\n\n if (type === 'number' || type === 'integer') {\n return 1;\n }\n\n if (type === 'boolean') {\n return true;\n }\n\n if (type === 'null') {\n return null;\n }\n\n if (type === 'string' || type === undefined) {\n const examples = asArray(schema.examples);\n if (examples?.[0] !== undefined) {\n return examples[0];\n }\n const format = firstString(schema.format);\n if (format === 'uri' || format === 'url') {\n return 'https://example.com';\n }\n if (format === 'date-time') {\n return '2026-01-01T00:00:00.000Z';\n }\n if (format === 'date') {\n return '2026-01-01';\n }\n return 'string';\n }\n\n return null;\n}\n\nfunction firstInputExample(tool: CodeModeToolSet[string]): unknown {\n const examples = asArray(tool.inputExamples);\n const first = examples?.[0];\n return isRecord(first) && 'input' in first ? first.input : undefined;\n}\n\nfunction resolveRef(\n ref: string,\n root: JsonSchema,\n seenRefs: Set<string>,\n): JsonSchema | undefined {\n if (!ref.startsWith('#/') || seenRefs.has(ref)) {\n return undefined;\n }\n\n seenRefs.add(ref);\n const value = ref\n .slice(2)\n .split('/')\n .map(part => part.replace(/~1/g, '/').replace(/~0/g, '~'))\n .reduce<unknown>((current, part) => {\n if (!isRecord(current)) {\n return undefined;\n }\n return current[part];\n }, root);\n\n return isRecord(value) ? value : undefined;\n}\n\nfunction nextContext(context: SchemaContext): SchemaContext {\n return {\n ...context,\n depth: context.depth + 1,\n };\n}\n\nfunction union(types: string[]): string {\n const unique = [...new Set(types)];\n return unique.length === 0 ? 'unknown' : unique.join(' | ');\n}\n\nfunction literalType(value: unknown): string {\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n ) {\n return String(value);\n }\n return 'unknown';\n}\n\nfunction indentType(type: string, spaces: number): string {\n if (!type.includes('\\n')) {\n return type;\n }\n\n const padding = ' '.repeat(spaces);\n return type.replaceAll('\\n', `\\n${padding}`);\n}\n\nfunction needsParentheses(type: string): boolean {\n return type.includes(' | ') || type.includes(' & ');\n}\n\nfunction formatObjectKey(key: string): string {\n return isIdentifier(key) ? key : JSON.stringify(key);\n}\n\nfunction formatPropertyAccess(key: string): string {\n return isIdentifier(key) ? `.${key}` : `[${JSON.stringify(key)}]`;\n}\n\nfunction uniqueToolVariableNames(toolNames: string[]): string[] {\n const seen = new Map<string, number>();\n return toolNames.map(toolName => {\n const base = toIdentifier(toolName);\n const count = seen.get(base) ?? 0;\n seen.set(base, count + 1);\n return count === 0 ? base : `${base}${count + 1}`;\n });\n}\n\nfunction toIdentifier(value: string): string {\n const identifier = value\n .replace(/[^A-Za-z0-9_$]/g, '_')\n .replace(/^[^A-Za-z_$]+/, '');\n return identifier.length === 0 ? 'tool' : identifier;\n}\n\nfunction isIdentifier(value: string): boolean {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value);\n}\n\nfunction compactObjectType(lines: string[]): string | undefined {\n if (lines.length === 0 || lines.some(line => line.includes('/**'))) {\n return undefined;\n }\n\n const fields = lines.map(line => line.trim());\n if (fields.some(field => field.includes('\\n'))) {\n return undefined;\n }\n\n const compact = `{ ${fields.join(' ')} }`;\n return compact.length <= MAX_COMPACT_OBJECT_TYPE_LENGTH ? compact : undefined;\n}\n\nfunction toComment(value: string): string {\n return value.replaceAll('*/', '* /').replace(/\\s+/g, ' ').trim();\n}\n\nfunction firstString(...values: unknown[]): string | undefined {\n return values.find(isString);\n}\n\nfunction schemaArray(value: unknown): JsonSchema[] | undefined {\n const values = asArray(value);\n if (values === undefined || !values.every(isRecord)) {\n return undefined;\n }\n return values;\n}\n\nfunction asArray(value: unknown): unknown[] | undefined {\n return Array.isArray(value) ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is JsonSchema {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return isRecord(value) && typeof value.then === 'function';\n}\n"],"mappings":"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","names":["additionalProperties"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/code-mode",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.60",
|
|
4
4
|
"description": "QuickJS-backed code mode tool for AI SDK",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -37,12 +37,12 @@
|
|
|
37
37
|
"README.md"
|
|
38
38
|
],
|
|
39
39
|
"peerDependencies": {
|
|
40
|
-
"ai": "7.0.
|
|
40
|
+
"ai": "7.0.103"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/node": "22.19.19",
|
|
44
44
|
"@vercel/ai-tsconfig": "0.0.0",
|
|
45
|
-
"ai": "7.0.
|
|
45
|
+
"ai": "7.0.103",
|
|
46
46
|
"tsup": "^8.5.1",
|
|
47
47
|
"typescript": "5.8.3",
|
|
48
48
|
"zod": "3.25.76"
|
package/src/code-mode-tool.ts
CHANGED
|
@@ -5,11 +5,15 @@ import {
|
|
|
5
5
|
type Experimental_ToolCallerTool,
|
|
6
6
|
} from 'ai';
|
|
7
7
|
import { runCodeMode } from './run-code-mode.js';
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
buildCodeModeToolCatalogMessage,
|
|
10
|
+
buildCodeModeToolDescription,
|
|
11
|
+
} from './tool-prompt.js';
|
|
9
12
|
import type {
|
|
10
13
|
CodeModeOptions,
|
|
11
14
|
CodeModeTool,
|
|
12
15
|
CodeModeToolInput,
|
|
16
|
+
CodeModeToolOptions,
|
|
13
17
|
CodeModeToolSet,
|
|
14
18
|
} from './types.js';
|
|
15
19
|
|
|
@@ -20,16 +24,24 @@ import type {
|
|
|
20
24
|
export function createCodeModeTool(
|
|
21
25
|
tools: CodeModeToolSet,
|
|
22
26
|
options: CodeModeOptions = {},
|
|
27
|
+
): CodeModeTool {
|
|
28
|
+
return createCodeModeToolWithDiscovery(tools, options, 'description');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function createCodeModeToolWithDiscovery(
|
|
32
|
+
tools: CodeModeToolSet,
|
|
33
|
+
options: CodeModeOptions,
|
|
34
|
+
toolDiscovery: 'description' | 'conversation',
|
|
23
35
|
): CodeModeTool {
|
|
24
36
|
return tool<CodeModeToolInput, unknown, Record<string, unknown>>({
|
|
25
|
-
description: buildCodeModeToolDescription(tools),
|
|
37
|
+
description: buildCodeModeToolDescription(tools, toolDiscovery),
|
|
26
38
|
inputSchema: jsonSchema<CodeModeToolInput>({
|
|
27
39
|
type: 'object',
|
|
28
40
|
properties: {
|
|
29
41
|
js: {
|
|
30
42
|
type: 'string',
|
|
31
43
|
description:
|
|
32
|
-
'Code-mode TypeScript source to execute. The
|
|
44
|
+
'Code-mode TypeScript source to execute. The code-mode context lists the available global `tools` API, input types, and call examples.',
|
|
33
45
|
},
|
|
34
46
|
},
|
|
35
47
|
required: ['js'],
|
|
@@ -50,11 +62,28 @@ export function createCodeModeTool(
|
|
|
50
62
|
* AI SDK generation call.
|
|
51
63
|
*/
|
|
52
64
|
export function codeModeTool(
|
|
53
|
-
options:
|
|
65
|
+
options: CodeModeToolOptions = {},
|
|
54
66
|
): Experimental_ToolCallerTool<CodeModeTool> {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
67
|
+
const { toolDiscovery = 'description', ...codeModeOptions } = options;
|
|
68
|
+
|
|
69
|
+
return experimental_toolCaller(
|
|
70
|
+
createCodeModeToolWithDiscovery({}, codeModeOptions, toolDiscovery),
|
|
71
|
+
{
|
|
72
|
+
type: 'local',
|
|
73
|
+
bind: tools =>
|
|
74
|
+
createCodeModeToolWithDiscovery(
|
|
75
|
+
tools as unknown as CodeModeToolSet,
|
|
76
|
+
codeModeOptions,
|
|
77
|
+
toolDiscovery,
|
|
78
|
+
),
|
|
79
|
+
...(toolDiscovery === 'conversation'
|
|
80
|
+
? {
|
|
81
|
+
prepareModelMessage: tools =>
|
|
82
|
+
buildCodeModeToolCatalogMessage(
|
|
83
|
+
tools as unknown as CodeModeToolSet,
|
|
84
|
+
),
|
|
85
|
+
}
|
|
86
|
+
: {}),
|
|
87
|
+
},
|
|
88
|
+
);
|
|
60
89
|
}
|
package/src/index.ts
CHANGED
package/src/tool-prompt.ts
CHANGED
|
@@ -12,7 +12,64 @@ interface SchemaContext {
|
|
|
12
12
|
const MAX_SCHEMA_DEPTH = 8;
|
|
13
13
|
const MAX_COMPACT_OBJECT_TYPE_LENGTH = 120;
|
|
14
14
|
|
|
15
|
-
export function buildCodeModeToolDescription(
|
|
15
|
+
export function buildCodeModeToolDescription(
|
|
16
|
+
tools: CodeModeToolSet,
|
|
17
|
+
toolDiscovery: 'description' | 'conversation' = 'description',
|
|
18
|
+
): string {
|
|
19
|
+
const sections = [
|
|
20
|
+
'Execute code-mode TypeScript in an isolated sandbox.',
|
|
21
|
+
'',
|
|
22
|
+
'Put the full program in `js`; top-level `await`/`return` work. Return a JSON-serializable result.',
|
|
23
|
+
'Call host tools only as async `tools.name(input)`; await each or use `Promise.all` for independent calls.',
|
|
24
|
+
toolDiscovery === 'description'
|
|
25
|
+
? 'Use exact names/types below. `JSON.parse`/`JSON.stringify` are available.'
|
|
26
|
+
: 'Use exact names/types from the latest capability update. `JSON.parse`/`JSON.stringify` are available.',
|
|
27
|
+
'Fetch: `fetch` is not available.',
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
if (toolDiscovery === 'conversation') {
|
|
31
|
+
sections.push(
|
|
32
|
+
'',
|
|
33
|
+
'Tools:',
|
|
34
|
+
'The current host-tool API is provided in "Code mode capability update" user messages. Follow the latest catalog and ignore earlier catalogs.',
|
|
35
|
+
);
|
|
36
|
+
return sections.join('\n');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const { typeBlock, exampleBlock } = renderToolCatalog(tools);
|
|
40
|
+
sections.push('', 'Tools:', typeBlock);
|
|
41
|
+
|
|
42
|
+
if (exampleBlock.length > 0) {
|
|
43
|
+
sections.push(exampleBlock);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return sections.join('\n');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function buildCodeModeToolCatalogMessage(
|
|
50
|
+
tools: CodeModeToolSet,
|
|
51
|
+
): string {
|
|
52
|
+
const { typeBlock, exampleBlock } = renderToolCatalog(tools);
|
|
53
|
+
const sections = [
|
|
54
|
+
'Code mode capability update.',
|
|
55
|
+
'',
|
|
56
|
+
'This catalog replaces all previous code mode capability catalogs. Only the tools listed below are currently available through `tools`.',
|
|
57
|
+
'',
|
|
58
|
+
'Tools:',
|
|
59
|
+
typeBlock,
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
if (exampleBlock.length > 0) {
|
|
63
|
+
sections.push(exampleBlock);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return sections.join('\n');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function renderToolCatalog(tools: CodeModeToolSet): {
|
|
70
|
+
typeBlock: string;
|
|
71
|
+
exampleBlock: string;
|
|
72
|
+
} {
|
|
16
73
|
const toolEntries = Object.entries(tools);
|
|
17
74
|
const typeBlock =
|
|
18
75
|
toolEntries.length === 0
|
|
@@ -36,22 +93,7 @@ export function buildCodeModeToolDescription(tools: CodeModeToolSet): string {
|
|
|
36
93
|
'```',
|
|
37
94
|
].join('\n');
|
|
38
95
|
|
|
39
|
-
|
|
40
|
-
'Execute code-mode TypeScript in an isolated sandbox.',
|
|
41
|
-
'',
|
|
42
|
-
'Put the full program in `js`; top-level `await`/`return` work. Return a JSON-serializable result.',
|
|
43
|
-
'Call host tools only as async `tools.name(input)`; await each or use `Promise.all` for independent calls.',
|
|
44
|
-
'Use exact names/types below. `JSON.parse`/`JSON.stringify` are available.',
|
|
45
|
-
'Fetch: `fetch` is not available.',
|
|
46
|
-
];
|
|
47
|
-
|
|
48
|
-
sections.push('', 'Tools:', typeBlock);
|
|
49
|
-
|
|
50
|
-
if (exampleBlock.length > 0) {
|
|
51
|
-
sections.push(exampleBlock);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return sections.join('\n');
|
|
96
|
+
return { typeBlock, exampleBlock };
|
|
55
97
|
}
|
|
56
98
|
|
|
57
99
|
function renderToolType([toolName, tool]: [
|
package/src/types.ts
CHANGED
|
@@ -199,6 +199,23 @@ export interface CodeModeOptions {
|
|
|
199
199
|
};
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
+
/**
|
|
203
|
+
* Options for the code-mode tool caller used with `experimental_toolCallers`.
|
|
204
|
+
*/
|
|
205
|
+
export interface CodeModeToolOptions extends CodeModeOptions {
|
|
206
|
+
/**
|
|
207
|
+
* Controls how host tools are presented to the model.
|
|
208
|
+
*
|
|
209
|
+
* - `'description'`: include host-tool signatures in the provider-visible
|
|
210
|
+
* code-mode tool description.
|
|
211
|
+
* - `'conversation'`: keep the code-mode tool definition stable and announce
|
|
212
|
+
* the current host-tool catalog in a user message.
|
|
213
|
+
*
|
|
214
|
+
* @defaultValue `'description'`
|
|
215
|
+
*/
|
|
216
|
+
toolDiscovery?: 'description' | 'conversation';
|
|
217
|
+
}
|
|
218
|
+
|
|
202
219
|
export interface CodeModeContinuationSecurityOptions {
|
|
203
220
|
signingKey?: string | Uint8Array;
|
|
204
221
|
/**
|