@yagr/agent 0.2.11 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.d.ts +16 -12
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +40 -33
- package/dist/agent.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +109 -17
- package/dist/cli.js.map +1 -1
- package/dist/config/n8n-config-service.d.ts +16 -0
- package/dist/config/n8n-config-service.d.ts.map +1 -1
- package/dist/config/n8n-config-service.js +32 -1
- package/dist/config/n8n-config-service.js.map +1 -1
- package/dist/config/yagr-config-service.d.ts +16 -0
- package/dist/config/yagr-config-service.d.ts.map +1 -1
- package/dist/config/yagr-config-service.js.map +1 -1
- package/dist/engine/engine.d.ts +15 -1
- package/dist/engine/engine.d.ts.map +1 -1
- package/dist/gateway/cli.d.ts +2 -2
- package/dist/gateway/cli.d.ts.map +1 -1
- package/dist/gateway/cli.js +6 -3
- package/dist/gateway/cli.js.map +1 -1
- package/dist/gateway/format-message.d.ts +8 -4
- package/dist/gateway/format-message.d.ts.map +1 -1
- package/dist/gateway/format-message.js +10 -5
- package/dist/gateway/format-message.js.map +1 -1
- package/dist/gateway/interactive-ui.d.ts +2 -2
- package/dist/gateway/interactive-ui.d.ts.map +1 -1
- package/dist/gateway/interactive-ui.js +87 -82
- package/dist/gateway/interactive-ui.js.map +1 -1
- package/dist/gateway/manager.d.ts +6 -6
- package/dist/gateway/manager.d.ts.map +1 -1
- package/dist/gateway/manager.js.map +1 -1
- package/dist/gateway/telegram.d.ts +5 -5
- package/dist/gateway/telegram.d.ts.map +1 -1
- package/dist/gateway/telegram.js +100 -101
- package/dist/gateway/telegram.js.map +1 -1
- package/dist/gateway/webui.d.ts +52 -5
- package/dist/gateway/webui.d.ts.map +1 -1
- package/dist/gateway/webui.js +109 -237
- package/dist/gateway/webui.js.map +1 -1
- package/dist/gateway/workflow-diagram.d.ts +19 -0
- package/dist/gateway/workflow-diagram.d.ts.map +1 -0
- package/dist/gateway/workflow-diagram.js +124 -0
- package/dist/gateway/workflow-diagram.js.map +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/anthropic-account.d.ts +2 -1
- package/dist/llm/anthropic-account.d.ts.map +1 -1
- package/dist/llm/anthropic-account.js +1 -1
- package/dist/llm/anthropic-account.js.map +1 -1
- package/dist/llm/capability-resolver.d.ts +10 -0
- package/dist/llm/capability-resolver.d.ts.map +1 -0
- package/dist/llm/capability-resolver.js +93 -0
- package/dist/llm/capability-resolver.js.map +1 -0
- package/dist/llm/copilot-account.d.ts +2 -1
- package/dist/llm/copilot-account.d.ts.map +1 -1
- package/dist/llm/copilot-account.js +323 -32
- package/dist/llm/copilot-account.js.map +1 -1
- package/dist/llm/create-language-model.d.ts.map +1 -1
- package/dist/llm/create-language-model.js +12 -171
- package/dist/llm/create-language-model.js.map +1 -1
- package/dist/llm/model-capabilities.d.ts +32 -0
- package/dist/llm/model-capabilities.d.ts.map +1 -0
- package/dist/llm/model-capabilities.js +144 -0
- package/dist/llm/model-capabilities.js.map +1 -0
- package/dist/llm/openai-account.d.ts +2 -1
- package/dist/llm/openai-account.d.ts.map +1 -1
- package/dist/llm/openai-account.js +29 -17
- package/dist/llm/openai-account.js.map +1 -1
- package/dist/llm/provider-discovery.d.ts +1 -1
- package/dist/llm/provider-discovery.d.ts.map +1 -1
- package/dist/llm/provider-discovery.js +3 -34
- package/dist/llm/provider-discovery.js.map +1 -1
- package/dist/llm/provider-metadata.d.ts +27 -0
- package/dist/llm/provider-metadata.d.ts.map +1 -0
- package/dist/llm/provider-metadata.js +327 -0
- package/dist/llm/provider-metadata.js.map +1 -0
- package/dist/llm/provider-plugin.d.ts +41 -0
- package/dist/llm/provider-plugin.d.ts.map +1 -0
- package/dist/llm/provider-plugin.js +429 -0
- package/dist/llm/provider-plugin.js.map +1 -0
- package/dist/llm/provider-registry.d.ts +5 -1
- package/dist/llm/provider-registry.d.ts.map +1 -1
- package/dist/llm/provider-registry.js +7 -24
- package/dist/llm/provider-registry.js.map +1 -1
- package/dist/llm/proxy-runtime.d.ts.map +1 -1
- package/dist/llm/proxy-runtime.js +16 -63
- package/dist/llm/proxy-runtime.js.map +1 -1
- package/dist/llm/test-model-policy.d.ts.map +1 -1
- package/dist/llm/test-model-policy.js +8 -10
- package/dist/llm/test-model-policy.js.map +1 -1
- package/dist/llm/tool-schema.d.ts +4 -0
- package/dist/llm/tool-schema.d.ts.map +1 -0
- package/dist/llm/tool-schema.js +80 -0
- package/dist/llm/tool-schema.js.map +1 -0
- package/dist/prompt/build-system-prompt.d.ts +3 -3
- package/dist/prompt/build-system-prompt.d.ts.map +1 -1
- package/dist/prompt/build-system-prompt.js +2 -0
- package/dist/prompt/build-system-prompt.js.map +1 -1
- package/dist/runtime/completion-gate.d.ts +4 -0
- package/dist/runtime/completion-gate.d.ts.map +1 -1
- package/dist/runtime/completion-gate.js +13 -2
- package/dist/runtime/completion-gate.js.map +1 -1
- package/dist/runtime/context-compaction.d.ts.map +1 -1
- package/dist/runtime/context-compaction.js +6 -5
- package/dist/runtime/context-compaction.js.map +1 -1
- package/dist/runtime/outcome.d.ts +3 -0
- package/dist/runtime/outcome.d.ts.map +1 -1
- package/dist/runtime/outcome.js +40 -3
- package/dist/runtime/outcome.js.map +1 -1
- package/dist/runtime/policy-hooks.d.ts +4 -0
- package/dist/runtime/policy-hooks.d.ts.map +1 -1
- package/dist/runtime/policy-hooks.js +137 -0
- package/dist/runtime/policy-hooks.js.map +1 -1
- package/dist/runtime/required-actions.d.ts +5 -0
- package/dist/runtime/required-actions.d.ts.map +1 -1
- package/dist/runtime/required-actions.js +22 -4
- package/dist/runtime/required-actions.js.map +1 -1
- package/dist/runtime/run-engine.d.ts +6 -3
- package/dist/runtime/run-engine.d.ts.map +1 -1
- package/dist/runtime/run-engine.js +699 -97
- package/dist/runtime/run-engine.js.map +1 -1
- package/dist/runtime/tool-runtime-strategy.d.ts +29 -0
- package/dist/runtime/tool-runtime-strategy.d.ts.map +1 -0
- package/dist/runtime/tool-runtime-strategy.js +102 -0
- package/dist/runtime/tool-runtime-strategy.js.map +1 -0
- package/dist/runtime/user-visible-updates.d.ts +12 -0
- package/dist/runtime/user-visible-updates.d.ts.map +1 -0
- package/dist/runtime/user-visible-updates.js +93 -0
- package/dist/runtime/user-visible-updates.js.map +1 -0
- package/dist/setup/application-services.d.ts +199 -0
- package/dist/setup/application-services.d.ts.map +1 -0
- package/dist/setup/application-services.js +468 -0
- package/dist/setup/application-services.js.map +1 -0
- package/dist/setup/setup-wizard.d.ts +1 -0
- package/dist/setup/setup-wizard.d.ts.map +1 -1
- package/dist/setup/setup-wizard.js +16 -18
- package/dist/setup/setup-wizard.js.map +1 -1
- package/dist/setup/status.d.ts +21 -0
- package/dist/setup/status.d.ts.map +1 -0
- package/dist/setup/status.js +47 -0
- package/dist/setup/status.js.map +1 -0
- package/dist/setup.d.ts +3 -14
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +30 -256
- package/dist/setup.js.map +1 -1
- package/dist/tools/build-tools.d.ts +160 -18
- package/dist/tools/build-tools.d.ts.map +1 -1
- package/dist/tools/build-tools.js +11 -1
- package/dist/tools/build-tools.js.map +1 -1
- package/dist/tools/deploy.d.ts +2 -2
- package/dist/tools/deploy.d.ts.map +1 -1
- package/dist/tools/deploy.js.map +1 -1
- package/dist/tools/generate-workflow.d.ts +9 -9
- package/dist/tools/generate-workflow.d.ts.map +1 -1
- package/dist/tools/generate-workflow.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-workflows.d.ts +2 -2
- package/dist/tools/list-workflows.d.ts.map +1 -1
- package/dist/tools/list-workflows.js.map +1 -1
- package/dist/tools/manage-workflow.d.ts +2 -2
- package/dist/tools/manage-workflow.d.ts.map +1 -1
- package/dist/tools/manage-workflow.js.map +1 -1
- package/dist/tools/n8nac.d.ts +121 -4
- package/dist/tools/n8nac.d.ts.map +1 -1
- package/dist/tools/n8nac.js +183 -38
- package/dist/tools/n8nac.js.map +1 -1
- package/dist/tools/node-info.d.ts +2 -2
- package/dist/tools/node-info.d.ts.map +1 -1
- package/dist/tools/node-info.js.map +1 -1
- package/dist/tools/observer.d.ts +6 -35
- package/dist/tools/observer.d.ts.map +1 -1
- package/dist/tools/observer.js +18 -0
- package/dist/tools/observer.js.map +1 -1
- package/dist/tools/present-workflow-result.d.ts +1 -0
- package/dist/tools/present-workflow-result.d.ts.map +1 -1
- package/dist/tools/present-workflow-result.js +24 -5
- package/dist/tools/present-workflow-result.js.map +1 -1
- package/dist/tools/request-required-action.d.ts +7 -3
- package/dist/tools/request-required-action.d.ts.map +1 -1
- package/dist/tools/request-required-action.js +5 -3
- package/dist/tools/request-required-action.js.map +1 -1
- package/dist/tools/search-nodes.d.ts +2 -2
- package/dist/tools/search-nodes.d.ts.map +1 -1
- package/dist/tools/search-nodes.js.map +1 -1
- package/dist/tools/search-templates.d.ts +2 -2
- package/dist/tools/search-templates.d.ts.map +1 -1
- package/dist/tools/search-templates.js.map +1 -1
- package/dist/tools/toolsets.d.ts +11 -0
- package/dist/tools/toolsets.d.ts.map +1 -0
- package/dist/tools/toolsets.js +49 -0
- package/dist/tools/toolsets.js.map +1 -0
- package/dist/tools/validate.d.ts +2 -2
- package/dist/tools/validate.d.ts.map +1 -1
- package/dist/tools/validate.js.map +1 -1
- package/dist/tools/write-workspace-file.d.ts +25 -9
- package/dist/tools/write-workspace-file.d.ts.map +1 -1
- package/dist/tools/write-workspace-file.js +27 -4
- package/dist/tools/write-workspace-file.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/webui/app.js +97 -101
- package/dist/webui/app.js.map +4 -4
- package/package.json +6 -5
- package/dist/llm/google-account.d.ts +0 -31
- package/dist/llm/google-account.d.ts.map +0 -1
- package/dist/llm/google-account.js +0 -851
- package/dist/llm/google-account.js.map +0 -1
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import { createAnthropic } from '@ai-sdk/anthropic';
|
|
2
|
-
import { createOpenAI } from '@ai-sdk/openai';
|
|
3
1
|
import { YagrConfigService } from '../config/yagr-config-service.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { createOpenAiAccountLanguageModel, getOpenAiAccountSession } from './openai-account.js';
|
|
8
|
-
import { getDefaultBaseUrlForProvider, getDefaultModelForProvider, getProviderDefinition, YAGR_MODEL_PROVIDERS, } from './provider-registry.js';
|
|
2
|
+
import { resolveModelCapabilityProfile } from './model-capabilities.js';
|
|
3
|
+
import { getDefaultBaseUrlForProvider, getDefaultModelForProvider, YAGR_MODEL_PROVIDERS, } from './provider-registry.js';
|
|
4
|
+
import { getProviderPlugin } from './provider-plugin.js';
|
|
9
5
|
const DEFAULT_ANTHROPIC_MODEL = 'claude-3-5-sonnet-latest';
|
|
10
6
|
const DEFAULT_OPENAI_MODEL = 'gpt-4o';
|
|
11
7
|
const DEFAULT_RESERVED_OUTPUT_TOKENS = 8_192;
|
|
@@ -26,10 +22,10 @@ function inferContextWindowTokens(provider, modelName) {
|
|
|
26
22
|
}
|
|
27
23
|
return 128_000;
|
|
28
24
|
}
|
|
29
|
-
if (provider === 'google'
|
|
25
|
+
if (provider === 'google') {
|
|
30
26
|
return 1_000_000;
|
|
31
27
|
}
|
|
32
|
-
if (provider === '
|
|
28
|
+
if (provider === 'mistral' || provider === 'copilot-proxy') {
|
|
33
29
|
return 128_000;
|
|
34
30
|
}
|
|
35
31
|
return 128_000;
|
|
@@ -85,168 +81,14 @@ export function resolveLanguageModelConfig(config = {}, configStore = new YagrCo
|
|
|
85
81
|
export function createLanguageModel(config = {}) {
|
|
86
82
|
const resolvedConfig = resolveLanguageModelConfig(config);
|
|
87
83
|
const { provider, model: modelName, apiKey, baseUrl: baseURL } = resolvedConfig;
|
|
88
|
-
const
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
baseURL,
|
|
96
|
-
})(modelName);
|
|
97
|
-
}
|
|
98
|
-
if (provider === 'openai') {
|
|
99
|
-
const openaiProvider = createOpenAI({
|
|
100
|
-
apiKey: resolvedApiKey,
|
|
101
|
-
baseURL: baseURL || definition.defaultBaseUrl,
|
|
102
|
-
headers,
|
|
103
|
-
name: provider,
|
|
104
|
-
compatibility: 'compatible',
|
|
105
|
-
});
|
|
106
|
-
// SSOT for direct OpenAI API-key provider:
|
|
107
|
-
// route all text generation through the Responses API.
|
|
108
|
-
return openaiProvider.responses(modelName);
|
|
109
|
-
}
|
|
110
|
-
if (provider === 'openai-proxy') {
|
|
111
|
-
if (!resolvedApiKey) {
|
|
112
|
-
throw new Error('OpenAI account session not found. Run `yagr setup` again.');
|
|
113
|
-
}
|
|
114
|
-
return createOpenAiAccountLanguageModel(modelName);
|
|
115
|
-
}
|
|
116
|
-
if (provider === 'anthropic-proxy') {
|
|
117
|
-
return createAnthropicAccountLanguageModel(modelName, resolvedApiKey);
|
|
118
|
-
}
|
|
119
|
-
if (provider === 'google-proxy') {
|
|
120
|
-
return createGeminiAccountLanguageModel(modelName);
|
|
121
|
-
}
|
|
122
|
-
if (provider === 'copilot-proxy') {
|
|
123
|
-
return createGitHubCopilotLanguageModel(modelName);
|
|
124
|
-
}
|
|
125
|
-
if (definition.usesOpenAiCompatibleApi) {
|
|
126
|
-
const providerClient = createOpenAI({
|
|
127
|
-
apiKey: resolvedApiKey,
|
|
128
|
-
baseURL: baseURL || definition.defaultBaseUrl,
|
|
129
|
-
headers,
|
|
130
|
-
name: provider,
|
|
131
|
-
compatibility: getOpenAiCompatibilityMode(provider),
|
|
132
|
-
fetch: getOpenAiFetchOverride(provider),
|
|
133
|
-
});
|
|
134
|
-
const providerSettings = getOpenAiCompatibleProviderSettings(provider);
|
|
135
|
-
return providerSettings
|
|
136
|
-
? providerClient(modelName, providerSettings)
|
|
137
|
-
: providerClient(modelName);
|
|
138
|
-
}
|
|
139
|
-
throw new Error(`Provider ${provider} is not yet fully implemented in createLanguageModel`);
|
|
140
|
-
}
|
|
141
|
-
function getOpenAiCompatibilityMode(provider) {
|
|
142
|
-
return 'compatible';
|
|
143
|
-
}
|
|
144
|
-
function getOpenAiFetchOverride(provider) {
|
|
145
|
-
if (provider !== 'mistral') {
|
|
146
|
-
return undefined;
|
|
147
|
-
}
|
|
148
|
-
return async (input, init) => {
|
|
149
|
-
const response = await fetch(input, init);
|
|
150
|
-
const contentType = response.headers.get('content-type')?.toLowerCase() || '';
|
|
151
|
-
if (contentType.includes('text/event-stream')) {
|
|
152
|
-
return response;
|
|
153
|
-
}
|
|
154
|
-
const payload = await response.clone().text().catch(() => '');
|
|
155
|
-
if (response.ok) {
|
|
156
|
-
if (payload.trim()) {
|
|
157
|
-
let parsed;
|
|
158
|
-
try {
|
|
159
|
-
parsed = JSON.parse(payload);
|
|
160
|
-
}
|
|
161
|
-
catch {
|
|
162
|
-
throw new Error(`Mistral API returned non-JSON payload: ${truncateForError(payload.replace(/\s+/g, ' ').trim(), 280)}`);
|
|
163
|
-
}
|
|
164
|
-
const normalized = normalizeMistralToolCalls(parsed);
|
|
165
|
-
if (normalized !== parsed) {
|
|
166
|
-
return new Response(JSON.stringify(normalized), {
|
|
167
|
-
status: response.status,
|
|
168
|
-
statusText: response.statusText,
|
|
169
|
-
headers: response.headers,
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
return response;
|
|
174
|
-
}
|
|
175
|
-
const compact = payload.replace(/\s+/g, ' ').trim();
|
|
176
|
-
throw new Error(`Mistral API error ${response.status}: ${truncateForError(compact, 280)}`);
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
function truncateForError(value, maxLength) {
|
|
180
|
-
if (value.length <= maxLength) {
|
|
181
|
-
return value;
|
|
182
|
-
}
|
|
183
|
-
return `${value.slice(0, maxLength - 1)}…`;
|
|
184
|
-
}
|
|
185
|
-
function normalizeMistralToolCalls(payload) {
|
|
186
|
-
if (!payload || typeof payload !== 'object') {
|
|
187
|
-
return payload;
|
|
188
|
-
}
|
|
189
|
-
const root = payload;
|
|
190
|
-
if (!Array.isArray(root.choices) || root.choices.length === 0) {
|
|
191
|
-
return payload;
|
|
192
|
-
}
|
|
193
|
-
let mutated = false;
|
|
194
|
-
const choices = root.choices.map((choice) => {
|
|
195
|
-
if (!choice || typeof choice !== 'object') {
|
|
196
|
-
return choice;
|
|
197
|
-
}
|
|
198
|
-
const record = choice;
|
|
199
|
-
const toolCalls = record.message?.tool_calls;
|
|
200
|
-
if (!Array.isArray(toolCalls) || toolCalls.length === 0) {
|
|
201
|
-
return choice;
|
|
202
|
-
}
|
|
203
|
-
let choiceMutated = false;
|
|
204
|
-
const normalizedToolCalls = toolCalls.map((toolCall) => {
|
|
205
|
-
if (!toolCall || typeof toolCall !== 'object') {
|
|
206
|
-
return toolCall;
|
|
207
|
-
}
|
|
208
|
-
const callRecord = toolCall;
|
|
209
|
-
if (typeof callRecord.type === 'string' && callRecord.type.length > 0) {
|
|
210
|
-
return toolCall;
|
|
211
|
-
}
|
|
212
|
-
choiceMutated = true;
|
|
213
|
-
return {
|
|
214
|
-
...callRecord,
|
|
215
|
-
type: 'function',
|
|
216
|
-
};
|
|
217
|
-
});
|
|
218
|
-
if (!choiceMutated) {
|
|
219
|
-
return choice;
|
|
220
|
-
}
|
|
221
|
-
mutated = true;
|
|
222
|
-
return {
|
|
223
|
-
...choice,
|
|
224
|
-
message: {
|
|
225
|
-
...record.message,
|
|
226
|
-
tool_calls: normalizedToolCalls,
|
|
227
|
-
},
|
|
228
|
-
};
|
|
84
|
+
const capabilityProfile = resolveModelCapabilityProfile({ provider, model: modelName });
|
|
85
|
+
const plugin = getProviderPlugin(provider);
|
|
86
|
+
return plugin.factory.createLanguageModel({
|
|
87
|
+
model: modelName,
|
|
88
|
+
apiKey,
|
|
89
|
+
baseUrl: baseURL,
|
|
90
|
+
capabilityProfile,
|
|
229
91
|
});
|
|
230
|
-
if (!mutated) {
|
|
231
|
-
return payload;
|
|
232
|
-
}
|
|
233
|
-
return {
|
|
234
|
-
...payload,
|
|
235
|
-
choices,
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
function getOpenAiCompatibleProviderSettings(provider) {
|
|
239
|
-
if (provider === 'mistral') {
|
|
240
|
-
return {
|
|
241
|
-
// Reduce tool-call surface complexity for better compatibility.
|
|
242
|
-
parallelToolCalls: false,
|
|
243
|
-
// Mistral OpenAI-compatible endpoints can emit non-JSON fragments during tool
|
|
244
|
-
// argument generation; disabling strict structured parsing avoids hard failures.
|
|
245
|
-
structuredOutputs: false,
|
|
246
|
-
simulateStreaming: true,
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
return undefined;
|
|
250
92
|
}
|
|
251
93
|
function getApiKeyForProvider(provider, configStore) {
|
|
252
94
|
const configured = configStore.getApiKey(provider);
|
|
@@ -257,7 +99,6 @@ function getApiKeyForProvider(provider, configStore) {
|
|
|
257
99
|
openai: ['OPENAI_LLM_API_KEY', 'OPENAI_API_KEY'],
|
|
258
100
|
anthropic: ['ANTHROPIC_LLM_API_KEY', 'ANTHROPIC_API_KEY'],
|
|
259
101
|
google: ['GOOGLE_GENERATIVE_AI_API_KEY', 'GEMINI_API_KEY', 'GOOGLE_API_KEY', 'GEMINI_LLM_API_KEY', 'GOOGLE_LLM_API_KEY'],
|
|
260
|
-
groq: ['GROQ_API_KEY', 'GROQ_LLM_API_KEY'],
|
|
261
102
|
mistral: ['MISTRAL_API_KEY', 'MISTRAL_LLM_API_KEY'],
|
|
262
103
|
openrouter: ['OPENROUTER_API_KEY', 'OPENROUTER_LLM_API_KEY'],
|
|
263
104
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-language-model.js","sourceRoot":"","sources":["../../src/llm/create-language-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"create-language-model.js","sourceRoot":"","sources":["../../src/llm/create-language-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { LanguageModelV1FunctionTool, LanguageModelV1ToolChoice } from '@ai-sdk/provider';
|
|
2
|
+
import type { YagrModelProvider } from './provider-registry.js';
|
|
3
|
+
export type YagrToolCallingCapability = 'native' | 'compatible' | 'none';
|
|
4
|
+
export interface YagrModelCapabilityProfile {
|
|
5
|
+
provider: YagrModelProvider;
|
|
6
|
+
model: string;
|
|
7
|
+
toolCalling: YagrToolCallingCapability;
|
|
8
|
+
supportsParallelToolCalls: boolean;
|
|
9
|
+
supportsStructuredOutputs: boolean;
|
|
10
|
+
supportsStreamingToolCalls: boolean;
|
|
11
|
+
supportsForcedToolChoice: boolean;
|
|
12
|
+
prefersStrictToolSchemas: boolean;
|
|
13
|
+
}
|
|
14
|
+
export type CapabilityFlags = Omit<YagrModelCapabilityProfile, 'provider' | 'model' | 'toolCalling'>;
|
|
15
|
+
export declare const CAPABILITY_FLAGS: Record<YagrToolCallingCapability, CapabilityFlags>;
|
|
16
|
+
export declare function resolveModelCapabilityProfile(input: {
|
|
17
|
+
provider: YagrModelProvider;
|
|
18
|
+
model: string;
|
|
19
|
+
}): YagrModelCapabilityProfile;
|
|
20
|
+
export declare function getProviderOptionsForCapability(profile: YagrModelCapabilityProfile): {
|
|
21
|
+
openai?: {
|
|
22
|
+
strictSchemas: boolean;
|
|
23
|
+
};
|
|
24
|
+
} | undefined;
|
|
25
|
+
export declare function getOpenAiCompatibleProviderSettingsForCapability(profile: YagrModelCapabilityProfile): {
|
|
26
|
+
parallelToolCalls?: boolean;
|
|
27
|
+
structuredOutputs?: boolean;
|
|
28
|
+
simulateStreaming?: boolean;
|
|
29
|
+
} | undefined;
|
|
30
|
+
export declare function filterFunctionToolsForCapability(tools: LanguageModelV1FunctionTool[], profile: YagrModelCapabilityProfile): LanguageModelV1FunctionTool[];
|
|
31
|
+
export declare function normalizeToolChoiceForCapability(toolChoice: LanguageModelV1ToolChoice | undefined, profile: YagrModelCapabilityProfile): LanguageModelV1ToolChoice | undefined;
|
|
32
|
+
//# sourceMappingURL=model-capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-capabilities.d.ts","sourceRoot":"","sources":["../../src/llm/model-capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAE/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,YAAY,GAAG,MAAM,CAAC;AAEzE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,yBAAyB,CAAC;IACvC,yBAAyB,EAAE,OAAO,CAAC;IACnC,yBAAyB,EAAE,OAAO,CAAC;IACnC,0BAA0B,EAAE,OAAO,CAAC;IACpC,wBAAwB,EAAE,OAAO,CAAC;IAClC,wBAAwB,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,EAAE,UAAU,GAAG,OAAO,GAAG,aAAa,CAAC,CAAC;AAErG,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,yBAAyB,EAAE,eAAe,CAsB/E,CAAC;AA0CF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,0BAA0B,CAkD7B;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,0BAA0B,GAAG;IAAE,MAAM,CAAC,EAAE;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,GAAG,SAAS,CAMxI;AAED,wBAAgB,gDAAgD,CAC9D,OAAO,EAAE,0BAA0B,GAClC;IACD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,SAAS,CAiBZ;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,2BAA2B,EAAE,EACpC,OAAO,EAAE,0BAA0B,GAClC,2BAA2B,EAAE,CAM/B;AAED,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,yBAAyB,GAAG,SAAS,EACjD,OAAO,EAAE,0BAA0B,GAClC,yBAAyB,GAAG,SAAS,CAcvC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { resolveCapabilityProfileFromMetadata } from './capability-resolver.js';
|
|
2
|
+
export const CAPABILITY_FLAGS = {
|
|
3
|
+
native: {
|
|
4
|
+
supportsParallelToolCalls: true,
|
|
5
|
+
supportsStructuredOutputs: true,
|
|
6
|
+
supportsStreamingToolCalls: true,
|
|
7
|
+
supportsForcedToolChoice: true,
|
|
8
|
+
prefersStrictToolSchemas: false,
|
|
9
|
+
},
|
|
10
|
+
compatible: {
|
|
11
|
+
supportsParallelToolCalls: false,
|
|
12
|
+
supportsStructuredOutputs: false,
|
|
13
|
+
supportsStreamingToolCalls: true,
|
|
14
|
+
supportsForcedToolChoice: true,
|
|
15
|
+
prefersStrictToolSchemas: false,
|
|
16
|
+
},
|
|
17
|
+
none: {
|
|
18
|
+
supportsParallelToolCalls: false,
|
|
19
|
+
supportsStructuredOutputs: false,
|
|
20
|
+
supportsStreamingToolCalls: false,
|
|
21
|
+
supportsForcedToolChoice: false,
|
|
22
|
+
prefersStrictToolSchemas: false,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
function buildProfile(provider, model, toolCalling, overrides = {}) {
|
|
26
|
+
return {
|
|
27
|
+
provider,
|
|
28
|
+
model,
|
|
29
|
+
toolCalling,
|
|
30
|
+
...CAPABILITY_FLAGS[toolCalling],
|
|
31
|
+
...overrides,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function classifyOpenRouterModel(model) {
|
|
35
|
+
const normalized = model.toLowerCase();
|
|
36
|
+
// Semantic-purpose exclusions: these identifiers describe non-LLM endpoint
|
|
37
|
+
// types (embeddings, rerankers, speech, moderation) that definitionally do
|
|
38
|
+
// not support tool calling. This is not a heuristic — the endpoint type is
|
|
39
|
+
// encoded in the model ID by OpenRouter convention.
|
|
40
|
+
if (normalized.includes('embed')
|
|
41
|
+
|| normalized.includes('embedding')
|
|
42
|
+
|| normalized.includes('rerank')
|
|
43
|
+
|| normalized.includes('whisper')
|
|
44
|
+
|| normalized.includes('tts')
|
|
45
|
+
|| normalized.includes('moderation')) {
|
|
46
|
+
return 'none';
|
|
47
|
+
}
|
|
48
|
+
// When metadata is unavailable, default to compatible: tool calling is sent
|
|
49
|
+
// sequentially without parallel calls or structured outputs. The metadata
|
|
50
|
+
// path (classifyMetadataCapability) provides precise per-model classification
|
|
51
|
+
// whenever primeModelMetadata has been called successfully.
|
|
52
|
+
return 'compatible';
|
|
53
|
+
}
|
|
54
|
+
export function resolveModelCapabilityProfile(input) {
|
|
55
|
+
const provider = input.provider;
|
|
56
|
+
const model = String(input.model || '').trim();
|
|
57
|
+
const resolvedFromMetadata = resolveCapabilityProfileFromMetadata({ provider, model });
|
|
58
|
+
if (resolvedFromMetadata) {
|
|
59
|
+
// Apply provider-level constraints that metadata cannot determine.
|
|
60
|
+
// copilot-proxy uses a simulated (non-streaming) completion wrapper, so
|
|
61
|
+
// streaming tool calls are never truly supported regardless of model tier.
|
|
62
|
+
if (provider === 'copilot-proxy') {
|
|
63
|
+
return { ...resolvedFromMetadata, supportsStreamingToolCalls: false };
|
|
64
|
+
}
|
|
65
|
+
return resolvedFromMetadata;
|
|
66
|
+
}
|
|
67
|
+
switch (provider) {
|
|
68
|
+
case 'openai':
|
|
69
|
+
case 'anthropic':
|
|
70
|
+
return buildProfile(provider, model, 'native');
|
|
71
|
+
case 'openai-proxy':
|
|
72
|
+
return buildProfile(provider, model, 'compatible', {
|
|
73
|
+
supportsStreamingToolCalls: false,
|
|
74
|
+
});
|
|
75
|
+
case 'copilot-proxy':
|
|
76
|
+
return buildProfile(provider, model, 'compatible', {
|
|
77
|
+
supportsStructuredOutputs: false,
|
|
78
|
+
supportsStreamingToolCalls: false,
|
|
79
|
+
});
|
|
80
|
+
case 'google':
|
|
81
|
+
// Gemini models support native tool calling but their streaming API
|
|
82
|
+
// has a known behaviour where the model produces empty completions when
|
|
83
|
+
// invoked after a long multi-step inspect conversation. Using
|
|
84
|
+
// non-streaming (generateText) for the execute phase avoids this.
|
|
85
|
+
return buildProfile(provider, model, 'native', {
|
|
86
|
+
supportsStreamingToolCalls: false,
|
|
87
|
+
});
|
|
88
|
+
case 'mistral':
|
|
89
|
+
// Mistral models support function calling natively (sequential, no
|
|
90
|
+
// parallel calls, no structured outputs). The AI SDK Mistral provider
|
|
91
|
+
// requires simulateStreaming which is forced in provider-plugin.ts,
|
|
92
|
+
// so we keep supportsStreamingToolCalls false here.
|
|
93
|
+
return buildProfile(provider, model, 'compatible', {
|
|
94
|
+
supportsStreamingToolCalls: false,
|
|
95
|
+
});
|
|
96
|
+
case 'openrouter':
|
|
97
|
+
return buildProfile(provider, model, classifyOpenRouterModel(model));
|
|
98
|
+
case 'anthropic-proxy':
|
|
99
|
+
return buildProfile(provider, model, 'native');
|
|
100
|
+
default:
|
|
101
|
+
return buildProfile(provider, model, 'compatible');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export function getProviderOptionsForCapability(profile) {
|
|
105
|
+
if (!profile.prefersStrictToolSchemas) {
|
|
106
|
+
return { openai: { strictSchemas: false } };
|
|
107
|
+
}
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
export function getOpenAiCompatibleProviderSettingsForCapability(profile) {
|
|
111
|
+
if (profile.toolCalling === 'none') {
|
|
112
|
+
return {
|
|
113
|
+
simulateStreaming: true,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (profile.toolCalling === 'native') {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
// compatible
|
|
120
|
+
return {
|
|
121
|
+
parallelToolCalls: profile.supportsParallelToolCalls,
|
|
122
|
+
structuredOutputs: profile.supportsStructuredOutputs,
|
|
123
|
+
simulateStreaming: !profile.supportsStreamingToolCalls,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export function filterFunctionToolsForCapability(tools, profile) {
|
|
127
|
+
if (profile.toolCalling === 'none') {
|
|
128
|
+
return [];
|
|
129
|
+
}
|
|
130
|
+
return tools;
|
|
131
|
+
}
|
|
132
|
+
export function normalizeToolChoiceForCapability(toolChoice, profile) {
|
|
133
|
+
if (!toolChoice) {
|
|
134
|
+
return toolChoice;
|
|
135
|
+
}
|
|
136
|
+
if (!profile.supportsForcedToolChoice && toolChoice.type !== 'auto') {
|
|
137
|
+
return { type: 'auto' };
|
|
138
|
+
}
|
|
139
|
+
if (profile.toolCalling === 'none') {
|
|
140
|
+
return { type: 'auto' };
|
|
141
|
+
}
|
|
142
|
+
return toolChoice;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=model-capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-capabilities.js","sourceRoot":"","sources":["../../src/llm/model-capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { LanguageModelV1 } from '@ai-sdk/provider';
|
|
2
|
+
import { type YagrModelCapabilityProfile } from './model-capabilities.js';
|
|
2
3
|
export declare const OPENAI_ACCOUNT_BASE_URL = "https://chatgpt.com/backend-api";
|
|
3
4
|
export declare const OPENAI_ACCOUNT_DEFAULT_MODEL = "gpt-5.1-codex-mini";
|
|
4
5
|
/** Known models served by the ChatGPT Codex backend (chatgpt.com/backend-api). */
|
|
@@ -29,5 +30,5 @@ export declare function validateOpenAiAccountRuntime(modelId?: string): Promise<
|
|
|
29
30
|
text?: string;
|
|
30
31
|
error?: string;
|
|
31
32
|
}>;
|
|
32
|
-
export declare function createOpenAiAccountLanguageModel(modelId: string): LanguageModelV1;
|
|
33
|
+
export declare function createOpenAiAccountLanguageModel(modelId: string, capabilityProfile?: YagrModelCapabilityProfile): LanguageModelV1;
|
|
33
34
|
//# sourceMappingURL=openai-account.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-account.d.ts","sourceRoot":"","sources":["../../src/llm/openai-account.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,eAAe,EAQhB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-account.d.ts","sourceRoot":"","sources":["../../src/llm/openai-account.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,eAAe,EAQhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,yBAAyB,CAAC;AAGjC,eAAO,MAAM,uBAAuB,oCAAoC,CAAC;AACzE,eAAO,MAAM,4BAA4B,uBAAuB,CAAC;AAQjE,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,UAS9B,CAAC;AAWF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAmFD,wBAAsB,cAAc,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAiBlE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAwDvE;AAcD,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,MAAM,EAAE,OAAO,CAAC;CACjB;AAID,qFAAqF;AACrF,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AA4BD,wBAAgB,uBAAuB,IAAI,oBAAoB,GAAG,SAAS,CAE1E;AAED,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAE5F;AAID;;qCAEqC;AAErC,wBAAsB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEtF;AAID,wBAAsB,4BAA4B,CAAC,OAAO,SAA+B,GAAG,OAAO,CAAC;IAClG,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CA2BD;AAID,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,MAAM,EACf,iBAAiB,CAAC,EAAE,0BAA0B,GAC7C,eAAe,CAoDjB"}
|
|
@@ -3,6 +3,8 @@ import http from 'node:http';
|
|
|
3
3
|
import os from 'node:os';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { createHash, randomBytes } from 'node:crypto';
|
|
6
|
+
import { filterFunctionToolsForCapability, normalizeToolChoiceForCapability, } from './model-capabilities.js';
|
|
7
|
+
import { normalizeFunctionToolParametersSchema } from './tool-schema.js';
|
|
6
8
|
export const OPENAI_ACCOUNT_BASE_URL = 'https://chatgpt.com/backend-api';
|
|
7
9
|
export const OPENAI_ACCOUNT_DEFAULT_MODEL = 'gpt-5.1-codex-mini';
|
|
8
10
|
/** Endpoint path for Codex responses on the ChatGPT backend. */
|
|
@@ -220,16 +222,17 @@ export async function validateOpenAiAccountRuntime(modelId = OPENAI_ACCOUNT_DEFA
|
|
|
220
222
|
}
|
|
221
223
|
}
|
|
222
224
|
// ─── Language model ────────────────────────────────────────────────────────────
|
|
223
|
-
export function createOpenAiAccountLanguageModel(modelId) {
|
|
225
|
+
export function createOpenAiAccountLanguageModel(modelId, capabilityProfile) {
|
|
226
|
+
const profile = capabilityProfile;
|
|
224
227
|
return {
|
|
225
228
|
specificationVersion: 'v1',
|
|
226
229
|
provider: 'openai-proxy.account',
|
|
227
230
|
modelId,
|
|
228
231
|
defaultObjectGenerationMode: undefined,
|
|
229
232
|
supportsImageUrls: false,
|
|
230
|
-
supportsStructuredOutputs:
|
|
233
|
+
supportsStructuredOutputs: Boolean(profile?.supportsStructuredOutputs),
|
|
231
234
|
async doGenerate(options) {
|
|
232
|
-
const execution = await runOpenAiAccountCompletion(modelId, options);
|
|
235
|
+
const execution = await runOpenAiAccountCompletion(modelId, options, profile);
|
|
233
236
|
return {
|
|
234
237
|
text: execution.text,
|
|
235
238
|
finishReason: execution.finishReason,
|
|
@@ -247,7 +250,7 @@ export function createOpenAiAccountLanguageModel(modelId) {
|
|
|
247
250
|
};
|
|
248
251
|
},
|
|
249
252
|
async doStream(options) {
|
|
250
|
-
const execution = await runOpenAiAccountCompletion(modelId, options);
|
|
253
|
+
const execution = await runOpenAiAccountCompletion(modelId, options, profile);
|
|
251
254
|
const stream = new ReadableStream({
|
|
252
255
|
start(controller) {
|
|
253
256
|
if (execution.text) {
|
|
@@ -273,13 +276,13 @@ export function createOpenAiAccountLanguageModel(modelId) {
|
|
|
273
276
|
};
|
|
274
277
|
}
|
|
275
278
|
// ─── Inference (Codex Responses API via chatgpt.com/backend-api) ──────────────
|
|
276
|
-
async function runOpenAiAccountCompletion(modelId, options) {
|
|
279
|
+
async function runOpenAiAccountCompletion(modelId, options, capabilityProfile) {
|
|
277
280
|
const session = await ensureOpenAiAccountSession();
|
|
278
281
|
if (!session) {
|
|
279
282
|
throw new Error('OpenAI account session not found. Run `codex --login` to sign in.');
|
|
280
283
|
}
|
|
281
284
|
const regularMode = options.mode.type === 'regular' ? options.mode : undefined;
|
|
282
|
-
const tools = getFunctionTools(options.mode);
|
|
285
|
+
const tools = getFunctionTools(options.mode, capabilityProfile);
|
|
283
286
|
const warnings = buildCodexWarnings(options, tools);
|
|
284
287
|
const accountId = extractChatGptAccountId(session.accessToken);
|
|
285
288
|
const { instructions, input } = convertPromptToCodexInput(options.prompt);
|
|
@@ -291,8 +294,8 @@ async function runOpenAiAccountCompletion(modelId, options) {
|
|
|
291
294
|
instructions: instructions || 'You are a helpful assistant.',
|
|
292
295
|
input,
|
|
293
296
|
text: { verbosity: 'medium' },
|
|
294
|
-
...(tools.length > 0 ? { tools: toCodexTools(tools), tool_choice: toCodexToolChoice(regularMode?.toolChoice) } : { tool_choice: 'auto' }),
|
|
295
|
-
parallel_tool_calls:
|
|
297
|
+
...(tools.length > 0 ? { tools: toCodexTools(tools), tool_choice: toCodexToolChoice(regularMode?.toolChoice, capabilityProfile) } : { tool_choice: 'auto' }),
|
|
298
|
+
parallel_tool_calls: capabilityProfile?.supportsParallelToolCalls ?? false,
|
|
296
299
|
};
|
|
297
300
|
const response = await fetch(`${OPENAI_ACCOUNT_BASE_URL}${CODEX_RESPONSES_PATH}`, {
|
|
298
301
|
method: 'POST',
|
|
@@ -498,31 +501,40 @@ function buildCodexWarnings(options, functionTools) {
|
|
|
498
501
|
details: 'openai-proxy currently supports only function tools on the Codex backend.',
|
|
499
502
|
}));
|
|
500
503
|
}
|
|
501
|
-
function getFunctionTools(mode) {
|
|
504
|
+
function getFunctionTools(mode, capabilityProfile) {
|
|
502
505
|
if (mode.type !== 'regular' || !Array.isArray(mode.tools) || mode.tools.length === 0) {
|
|
503
506
|
return [];
|
|
504
507
|
}
|
|
505
|
-
|
|
508
|
+
const tools = mode.tools.filter((tool) => tool.type === 'function');
|
|
509
|
+
return capabilityProfile ? filterFunctionToolsForCapability(tools, capabilityProfile) : tools;
|
|
506
510
|
}
|
|
507
511
|
function toCodexTools(tools) {
|
|
508
512
|
return tools.map((tool) => ({
|
|
509
513
|
type: 'function',
|
|
510
514
|
name: tool.name,
|
|
511
515
|
...(tool.description ? { description: tool.description } : {}),
|
|
512
|
-
parameters: tool.parameters,
|
|
516
|
+
parameters: normalizeFunctionToolParametersSchema(tool.parameters, {
|
|
517
|
+
forceRequiredObjectProperties: true,
|
|
518
|
+
}),
|
|
513
519
|
}));
|
|
514
520
|
}
|
|
515
|
-
function toCodexToolChoice(toolChoice) {
|
|
516
|
-
|
|
521
|
+
function toCodexToolChoice(toolChoice, capabilityProfile) {
|
|
522
|
+
const normalizedToolChoice = capabilityProfile
|
|
523
|
+
? normalizeToolChoiceForCapability(toolChoice, capabilityProfile)
|
|
524
|
+
: toolChoice;
|
|
525
|
+
if (capabilityProfile && !capabilityProfile.supportsForcedToolChoice) {
|
|
517
526
|
return 'auto';
|
|
518
527
|
}
|
|
519
|
-
if (
|
|
520
|
-
return
|
|
528
|
+
if (!normalizedToolChoice || normalizedToolChoice.type === 'auto') {
|
|
529
|
+
return 'auto';
|
|
530
|
+
}
|
|
531
|
+
if (normalizedToolChoice.type === 'none' || normalizedToolChoice.type === 'required') {
|
|
532
|
+
return normalizedToolChoice.type;
|
|
521
533
|
}
|
|
522
|
-
if (
|
|
534
|
+
if (normalizedToolChoice.type === 'tool') {
|
|
523
535
|
return {
|
|
524
536
|
type: 'function',
|
|
525
|
-
name:
|
|
537
|
+
name: normalizedToolChoice.toolName,
|
|
526
538
|
};
|
|
527
539
|
}
|
|
528
540
|
return 'auto';
|