createModelStrategy
SUPPORT · function · Runtime value
Compose runner options in precedence order: budget preset, selected model, declared reasoning, exact budget, then explicit Core fields.
The result is validated through the same Core binding rules but creates no runner and spends no calls.
Import
import { createModelStrategy } from '@jangts/agent-core/support';import { createModelStrategy } from '@jangts/agent-core/support';Other public entry points:@jangts/agent-core/support, @jangts/agent-core/support/model.
Definition
Type parameters
| Type parameter | Constraint | Default type |
|---|---|---|
Options | ModelStrategyOptions | — |
Call
createModelStrategy<const Options extends ModelStrategyOptions>(options: Options): StrategyResult<Options>Compose runner options in precedence order: budget preset, selected model, declared reasoning, exact budget, then explicit Core fields.
The result is validated through the same Core binding rules but creates no runner and spends no calls.
| Type parameter | Constraint | Default type |
|---|---|---|
Options | ModelStrategyOptions<readonly ModelTransportDefinition<unknown>[], ExecutionOptions> | — |
| Parameter | Type | Passing | Description |
|---|---|---|---|
options | Options | Required | — |
Returns: StrategyResult<Options>.
Return value structure
| Field | Type | Required | Description |
|---|---|---|---|
maxOutputTokens | number | undefined | Optional | Default output reservation; invoke can override it for one call. |
maxCalls | number | undefined | Optional | Calls allowed for the whole request, including descendant runners' reservations. |
callTimeoutMs | number | undefined | Optional | Deadline for one provider call, in milliseconds. |
maxOutputChars | number | undefined | Optional | Cap on streamed output characters; exceeding it fails the call. |
usage | boolean | undefined | Optional | Request and record provider usage for each call. |
children | ModelChildPolicy | undefined | Optional | Read-only. See the type definition and usage context. |
maxInputChars | number | undefined | Optional | Character budget for the assembled input. |
maxSchemaChars | number | undefined | Optional | Character allowance for registered capability schemas. |
tokenBudget | ModelTokenBudget | undefined | Optional | See the type definition and usage context. |
provider | ChatProvider | Required | See the type definition and usage context. |
transports | TransportsFrom<Options, TransportsFrom<SelectedReasoning<Options>, TransportsFrom<SelectedModel<Options>, readonly []>>> | undefined | Optional | See the type definition and usage context. |
sink | { output?: ModelRunnerPorts["onOutput"]; } | undefined | Optional | See the type definition and usage context. |
errors | { inputBudget?: ModelRunnerPorts["inputBudgetError"]; outputBudget?: ModelRunnerPorts["outputBudgetError"]; } | undefined | Optional | See the type definition and usage context. |
execution | ExecutionFrom<Options, ExecutionFrom<SelectedReasoning<Options>, ExecutionFrom<SelectedModel<Options>, undefined>>> | undefined | Optional | See the type definition and usage context. |
Examples
- Model strategy: explicit selection and recommended budgets: Select from registered models and reasoning configurations, complete Core settings with local budget tiers, and keep per-field exact overrides.
Use a small budget for a short task and keep the same Core construction as needs grow
Beginner · Node.js
import { AgentCoreEngine, ModelRunner, Support } from '@jangts/agent-core';
const provider = { async *stream() { yield '服务在线。'; } };
const config = Support.createModelStrategy({ model: { provider }, budget: 'small' });
const model = new ModelRunner(config);
console.log((await model.invoke('服务状态?')).value);
const agent = new AgentCoreEngine({ model: config });
console.log(agent.branch.agentId);import { AgentCoreEngine, ModelRunner, Support } from '@jangts/agent-core';
const provider = { async *stream() { yield '服务在线。'; } };
const config = Support.createModelStrategy({ model: { provider }, budget: 'small' });
const model = new ModelRunner(config);
console.log((await model.invoke('服务状态?')).value);
const agent = new AgentCoreEngine({ model: config });
console.log(agent.branch.agentId);Refer to an existing model by ID and register the reasoning scheme explicitly
Configuration · Node.js
The example Providers are fully offline. Reasoning parameters for real providers are implemented through each Provider's explicit configuration.
import { ModelRunner, Support } from '@jangts/agent-core';
const fast = { async *stream() { yield '简短回答'; } };
const reasoned = { async *stream() { yield '经过复核的回答'; } };
const models = { fast: { provider: fast }, thorough: { provider: reasoned } };
const config = Support.createModelStrategy({ model: 'fast', models, budget: 'small',
reasoning: 'high', reasoningOptions: { high: { provider: reasoned } },
maxCalls: 1, maxOutputTokens: 1200,
});
console.log((await new ModelRunner(config).invoke('检查资料')).value);import { ModelRunner, Support } from '@jangts/agent-core';
const fast = { async *stream() { yield '简短回答'; } };
const reasoned = { async *stream() { yield '经过复核的回答'; } };
const models = { fast: { provider: fast }, thorough: { provider: reasoned } };
const config = Support.createModelStrategy({ model: 'fast', models, budget: 'small',
reasoning: 'high', reasoningOptions: { high: { provider: reasoned } },
maxCalls: 1, maxOutputTokens: 1200,
});
console.log((await new ModelRunner(config).invoke('检查资料')).value);Keep custom budgets and native Core ports effective
Extension · Node.js
The counter is for demonstration only. In production inject a counter that matches the actual model; do not use character estimates as real token counts.
import { ModelRunner, Support } from '@jangts/agent-core';
const provider = { async *stream() { yield 'done'; } };
const transport = Support.createTextTransport({ id: 'app:text' });
const config = Support.createModelStrategy({ model: { provider, transports: [transport] },
budget: { maxCalls: 3, maxInputChars: 24000, callTimeoutMs: 20000 },
tokenBudget: { counterId: 'app-counter', contextWindowTokens: 4000,
countTokens({ messages }) { return messages.reduce((sum, message) => sum + message.content.length, 0); } },
});
const result = await new ModelRunner(config).invoke({ input: 'hello', transport });
console.log(result.value);import { ModelRunner, Support } from '@jangts/agent-core';
const provider = { async *stream() { yield 'done'; } };
const transport = Support.createTextTransport({ id: 'app:text' });
const config = Support.createModelStrategy({ model: { provider, transports: [transport] },
budget: { maxCalls: 3, maxInputChars: 24000, callTimeoutMs: 20000 },
tokenBudget: { counterId: 'app-counter', contextWindowTokens: 4000,
countTokens({ messages }) { return messages.reduce((sum, message) => sum + message.content.length, 0); } },
});
const result = await new ModelRunner(config).invoke({ input: 'hello', transport });
console.log(result.value);