@agentproto/runtime 2.10.0 → 2.10.1
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/catalog-models.d.ts +7 -1
- package/dist/catalog-models.mjs +1 -1
- package/dist/catalog-models.mjs.map +1 -1
- package/dist/index.d.ts +18 -0
- package/dist/index.mjs +78 -57
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
package/dist/index.d.ts
CHANGED
|
@@ -4924,6 +4924,16 @@ interface SessionDescriptor {
|
|
|
4924
4924
|
* may name a gateway route.
|
|
4925
4925
|
*/
|
|
4926
4926
|
adapterProvider?: string;
|
|
4927
|
+
/**
|
|
4928
|
+
* The adapter manifest's `authDescriptor.modelDerivedApiKey` — recorded at
|
|
4929
|
+
* spawn time so a live `setModel` applies the SAME wire normalization the
|
|
4930
|
+
* spawn path used (`normalizeModelForWire`'s `ModelWireOptions.modelDerivedApiKey`
|
|
4931
|
+
* doc): for a `derived-from-model` adapter billed through a gateway/router,
|
|
4932
|
+
* this decides whether the wire model needs the router re-added as a
|
|
4933
|
+
* literal leading segment (opencode/mastracode/jcode/pi/mastra-agent) or
|
|
4934
|
+
* left bare (hermes).
|
|
4935
|
+
*/
|
|
4936
|
+
modelDerivedApiKey?: boolean;
|
|
4927
4937
|
/**
|
|
4928
4938
|
* AIP-45 mode the session was spawned with (`AgentCliStartOptions.config.
|
|
4929
4939
|
* mode` — e.g. claude-code's `plan`/`accept-edits`, a gateway preset mode
|
|
@@ -6240,6 +6250,10 @@ interface SpawnAgentInput {
|
|
|
6240
6250
|
* {@link SessionDescriptor.adapterProvider} so live `setModel` knows when
|
|
6241
6251
|
* to bare a direct `vendor/product` ref; ignored for derived adapters. */
|
|
6242
6252
|
adapterProvider?: string;
|
|
6253
|
+
/** Manifest-declared `authDescriptor.modelDerivedApiKey` — recorded onto
|
|
6254
|
+
* {@link SessionDescriptor.modelDerivedApiKey} so live `setModel` applies
|
|
6255
|
+
* the same router re-prefixing the spawn path used. */
|
|
6256
|
+
modelDerivedApiKey?: boolean;
|
|
6243
6257
|
/** Optional initial prompt to dispatch immediately. The promise
|
|
6244
6258
|
* the registry returns resolves AFTER the spawn — the prompt
|
|
6245
6259
|
* runs in the background, projecting events into the ring
|
|
@@ -8489,6 +8503,10 @@ interface RouteAwareLaunchConfigInput {
|
|
|
8489
8503
|
routeSelection?: "free" | "derived-from-model";
|
|
8490
8504
|
/** Fixed provider for this adapter (e.g. `"anthropic"`), used for wire-model prefix stripping. */
|
|
8491
8505
|
adapterProvider?: string;
|
|
8506
|
+
/** `AdapterAuthDescriptor.modelDerivedApiKey` — see `normalizeModelForWire`'s
|
|
8507
|
+
* `ModelWireOptions.modelDerivedApiKey` doc for why this changes the wire
|
|
8508
|
+
* shape on a gateway-routed `derived-from-model` adapter. */
|
|
8509
|
+
modelDerivedApiKey?: boolean;
|
|
8492
8510
|
/** Skills list folded into `options.skills` per the manifest's declared shape. */
|
|
8493
8511
|
skills?: string[];
|
|
8494
8512
|
/**
|
package/dist/index.mjs
CHANGED
|
@@ -11,7 +11,7 @@ import { EventEmitter } from 'events';
|
|
|
11
11
|
import { listAuthProfiles, eligibleProfiles, getAuthProfile, createAuthProfile, AuthProfileValidationError, deleteAuthProfile, KeychainStore, removeAuthProfile, addAuthProfile, setAuthProfileEnabled, setAuthProfileModels, refreshAuthProfileModels, credentialIdentity } from '@agentproto/auth';
|
|
12
12
|
import { resolveRecipeMethod, resolveSourceSpec } from '@agentproto/secrets/provision/recipe';
|
|
13
13
|
import { getModelProvider, resolveContextWindow, formatTokens, resolvePricing, LLM_PRICING_CATALOG, resolvePricingExact, MODEL_ALIASES } from '@agentproto/model-catalog/llm';
|
|
14
|
-
import { resolveCustomRoute, registerCustomRoute,
|
|
14
|
+
import { resolveCustomRoute, registerCustomRoute, formatModelRef, resolveLlmModelRoute, tryParseModelRef, stripRouteSuffix, stripFixedNativeVendor } from '@agentproto/model-catalog/route-identity';
|
|
15
15
|
import { findAnthropicGatewayPreset, anthropicGatewayPresetList, getAnthropicGatewayPreset } from '@agentproto/provider-presets';
|
|
16
16
|
import * as providers_store_star from '@agentproto/providers-store';
|
|
17
17
|
import { makeAdapterLister, makeAdapterResolver, makeCredsStore, discoverAdapterPackages, makeSetupLedger, makeListTool, makeSetupTool } from '@agentproto/provider-kit';
|
|
@@ -3831,60 +3831,6 @@ function resolveWorktreeIdentity(cwd) {
|
|
|
3831
3831
|
dir = parent;
|
|
3832
3832
|
}
|
|
3833
3833
|
}
|
|
3834
|
-
function normalizeModelForWire(model, opts) {
|
|
3835
|
-
if (opts.routeSelection === "derived-from-model") {
|
|
3836
|
-
return stripRouteSuffix(model);
|
|
3837
|
-
}
|
|
3838
|
-
const nativeVendor = opts.gateway ?? opts.fixedProvider;
|
|
3839
|
-
if (nativeVendor) {
|
|
3840
|
-
return stripFixedNativeVendor(model, nativeVendor);
|
|
3841
|
-
}
|
|
3842
|
-
return stripRouteSuffix(model);
|
|
3843
|
-
}
|
|
3844
|
-
|
|
3845
|
-
// src/launch-config.ts
|
|
3846
|
-
function buildRouteAwareLaunchConfig(input) {
|
|
3847
|
-
const prefix = input.prefix ?? "agent_start";
|
|
3848
|
-
const baseOptions = input.options ?? {};
|
|
3849
|
-
const hasExplicitBaseUrlOption = typeof baseOptions.base_url === "string" && baseOptions.base_url.length > 0;
|
|
3850
|
-
const gatewayResolvedBaseUrl = input.authSpec?.baseUrl;
|
|
3851
|
-
const resolvedBaseUrl = gatewayResolvedBaseUrl ?? input.route?.baseUrl;
|
|
3852
|
-
let routedOptions = baseOptions;
|
|
3853
|
-
if (!hasExplicitBaseUrlOption && typeof resolvedBaseUrl === "string" && resolvedBaseUrl.length > 0) {
|
|
3854
|
-
const declaresBaseUrl = input.declaredOptions?.some((o) => o.id === "base_url") ?? false;
|
|
3855
|
-
const declaredOptionsKnown = input.declaredOptions !== void 0;
|
|
3856
|
-
if (declaresBaseUrl || !declaredOptionsKnown) {
|
|
3857
|
-
routedOptions = { ...baseOptions, base_url: resolvedBaseUrl };
|
|
3858
|
-
} else if (input.routeSelection === "derived-from-model") {
|
|
3859
|
-
routedOptions = baseOptions;
|
|
3860
|
-
} else {
|
|
3861
|
-
throw new Error(
|
|
3862
|
-
`${prefix}: adapter "${input.adapter}" cannot be routed through gateway "${input.route?.gateway ?? "unknown"}" \u2014 it declares no \`base_url\` option and does not derive its route from the model id (routeSelection !== "derived-from-model"), so the resolved gateway endpoint has nowhere to go. Declare a \`base_url\` option on the adapter manifest, or mark it \`routeSelection: "derived-from-model"\` if it already resolves its own gateway from the model prefix.`
|
|
3863
|
-
);
|
|
3864
|
-
}
|
|
3865
|
-
}
|
|
3866
|
-
const effectiveOptions = normalizeSkillsOption(
|
|
3867
|
-
input.skills ?? [],
|
|
3868
|
-
routedOptions,
|
|
3869
|
-
input.declaredOptions
|
|
3870
|
-
);
|
|
3871
|
-
const wireModel = input.model ? normalizeModelForWire(input.model, {
|
|
3872
|
-
routeSelection: input.routeSelection,
|
|
3873
|
-
gateway: input.route?.gateway,
|
|
3874
|
-
fixedProvider: input.adapterProvider
|
|
3875
|
-
}) : void 0;
|
|
3876
|
-
const out = {};
|
|
3877
|
-
if (Object.keys(effectiveOptions).length > 0) {
|
|
3878
|
-
out.options = effectiveOptions;
|
|
3879
|
-
}
|
|
3880
|
-
if (wireModel) {
|
|
3881
|
-
out.wireModel = wireModel;
|
|
3882
|
-
}
|
|
3883
|
-
if (resolvedBaseUrl) {
|
|
3884
|
-
out.resolvedBaseUrl = resolvedBaseUrl;
|
|
3885
|
-
}
|
|
3886
|
-
return out;
|
|
3887
|
-
}
|
|
3888
3834
|
var WIDENING_ROUTES = ["openrouter", "requesty", "huggingface"];
|
|
3889
3835
|
var VENDOR_COMPATIBILITY_ROUTES = {
|
|
3890
3836
|
xai: ["xai", "xai-anthropic"]
|
|
@@ -4279,6 +4225,67 @@ function modelWalletIneligibleMessage(opts) {
|
|
|
4279
4225
|
return `${opts.prefix}: model "${opts.model}" is not serviceable on the resolved ${wallet} (adapter "${opts.adapter}") and would 404 upstream. This model bills route "${primary}"${also} \u2014 re-spawn on it: set route.gateway="${primary}" with an eligible "${primary}" api-key profile (access.profileRef). This guard only rejects; it never switches wallets for you.`;
|
|
4280
4226
|
}
|
|
4281
4227
|
|
|
4228
|
+
// src/model-wire.ts
|
|
4229
|
+
function normalizeModelForWire(model, opts) {
|
|
4230
|
+
if (opts.routeSelection === "derived-from-model") {
|
|
4231
|
+
const bare = stripRouteSuffix(model);
|
|
4232
|
+
if (opts.modelDerivedApiKey && opts.gateway && WIDENING_ROUTES.includes(opts.gateway) && !bare.startsWith(`${opts.gateway}/`)) {
|
|
4233
|
+
return `${opts.gateway}/${bare}`;
|
|
4234
|
+
}
|
|
4235
|
+
return bare;
|
|
4236
|
+
}
|
|
4237
|
+
const nativeVendor = opts.gateway ?? opts.fixedProvider;
|
|
4238
|
+
if (nativeVendor) {
|
|
4239
|
+
return stripFixedNativeVendor(model, nativeVendor);
|
|
4240
|
+
}
|
|
4241
|
+
return stripRouteSuffix(model);
|
|
4242
|
+
}
|
|
4243
|
+
|
|
4244
|
+
// src/launch-config.ts
|
|
4245
|
+
function buildRouteAwareLaunchConfig(input) {
|
|
4246
|
+
const prefix = input.prefix ?? "agent_start";
|
|
4247
|
+
const baseOptions = input.options ?? {};
|
|
4248
|
+
const hasExplicitBaseUrlOption = typeof baseOptions.base_url === "string" && baseOptions.base_url.length > 0;
|
|
4249
|
+
const gatewayResolvedBaseUrl = input.authSpec?.baseUrl;
|
|
4250
|
+
const resolvedBaseUrl = gatewayResolvedBaseUrl ?? input.route?.baseUrl;
|
|
4251
|
+
let routedOptions = baseOptions;
|
|
4252
|
+
if (!hasExplicitBaseUrlOption && typeof resolvedBaseUrl === "string" && resolvedBaseUrl.length > 0) {
|
|
4253
|
+
const declaresBaseUrl = input.declaredOptions?.some((o) => o.id === "base_url") ?? false;
|
|
4254
|
+
const declaredOptionsKnown = input.declaredOptions !== void 0;
|
|
4255
|
+
if (declaresBaseUrl || !declaredOptionsKnown) {
|
|
4256
|
+
routedOptions = { ...baseOptions, base_url: resolvedBaseUrl };
|
|
4257
|
+
} else if (input.routeSelection === "derived-from-model") {
|
|
4258
|
+
routedOptions = baseOptions;
|
|
4259
|
+
} else {
|
|
4260
|
+
throw new Error(
|
|
4261
|
+
`${prefix}: adapter "${input.adapter}" cannot be routed through gateway "${input.route?.gateway ?? "unknown"}" \u2014 it declares no \`base_url\` option and does not derive its route from the model id (routeSelection !== "derived-from-model"), so the resolved gateway endpoint has nowhere to go. Declare a \`base_url\` option on the adapter manifest, or mark it \`routeSelection: "derived-from-model"\` if it already resolves its own gateway from the model prefix.`
|
|
4262
|
+
);
|
|
4263
|
+
}
|
|
4264
|
+
}
|
|
4265
|
+
const effectiveOptions = normalizeSkillsOption(
|
|
4266
|
+
input.skills ?? [],
|
|
4267
|
+
routedOptions,
|
|
4268
|
+
input.declaredOptions
|
|
4269
|
+
);
|
|
4270
|
+
const wireModel = input.model ? normalizeModelForWire(input.model, {
|
|
4271
|
+
routeSelection: input.routeSelection,
|
|
4272
|
+
gateway: input.route?.gateway,
|
|
4273
|
+
fixedProvider: input.adapterProvider,
|
|
4274
|
+
modelDerivedApiKey: input.modelDerivedApiKey
|
|
4275
|
+
}) : void 0;
|
|
4276
|
+
const out = {};
|
|
4277
|
+
if (Object.keys(effectiveOptions).length > 0) {
|
|
4278
|
+
out.options = effectiveOptions;
|
|
4279
|
+
}
|
|
4280
|
+
if (wireModel) {
|
|
4281
|
+
out.wireModel = wireModel;
|
|
4282
|
+
}
|
|
4283
|
+
if (resolvedBaseUrl) {
|
|
4284
|
+
out.resolvedBaseUrl = resolvedBaseUrl;
|
|
4285
|
+
}
|
|
4286
|
+
return out;
|
|
4287
|
+
}
|
|
4288
|
+
|
|
4282
4289
|
// src/context-continuity.ts
|
|
4283
4290
|
var CONTEXT_CONTINUITY_DEFAULTS = {
|
|
4284
4291
|
mode: "ask",
|
|
@@ -6248,6 +6255,7 @@ async function spawnAgentSession(deps2, input) {
|
|
|
6248
6255
|
declaredOptions: resolved?.declaredOptions,
|
|
6249
6256
|
routeSelection: resolved?.routeSelection,
|
|
6250
6257
|
adapterProvider: resolved?.authDescriptor?.provider,
|
|
6258
|
+
modelDerivedApiKey: resolved?.authDescriptor?.modelDerivedApiKey,
|
|
6251
6259
|
skills: spawnDefaults.skills,
|
|
6252
6260
|
prefix: "agent_start"
|
|
6253
6261
|
});
|
|
@@ -6352,6 +6360,7 @@ async function spawnAgentSession(deps2, input) {
|
|
|
6352
6360
|
...worktreeAutoProvisioned ? { worktreeAutoProvisioned: true } : {},
|
|
6353
6361
|
...resolved?.routeSelection !== void 0 ? { routeSelection: resolved.routeSelection } : {},
|
|
6354
6362
|
...resolved?.authDescriptor?.provider !== void 0 ? { adapterProvider: resolved.authDescriptor.provider } : {},
|
|
6363
|
+
...resolved?.authDescriptor?.modelDerivedApiKey !== void 0 ? { modelDerivedApiKey: resolved.authDescriptor.modelDerivedApiKey } : {},
|
|
6355
6364
|
...input.model ? { model: input.model } : defaultModel2 ? { model: defaultModel2 } : {},
|
|
6356
6365
|
...input.mode ? { mode: input.mode } : {},
|
|
6357
6366
|
...input.effort ? { effort: input.effort } : {},
|
|
@@ -6629,6 +6638,7 @@ ${effectivePrompt}`;
|
|
|
6629
6638
|
harness: input.harness ?? input.adapter,
|
|
6630
6639
|
...resolved?.routeSelection !== void 0 ? { routeSelection: resolved.routeSelection } : {},
|
|
6631
6640
|
...resolved?.authDescriptor?.provider !== void 0 ? { adapterProvider: resolved.authDescriptor.provider } : {},
|
|
6641
|
+
...resolved?.authDescriptor?.modelDerivedApiKey !== void 0 ? { modelDerivedApiKey: resolved.authDescriptor.modelDerivedApiKey } : {},
|
|
6632
6642
|
...input.model ? { model: input.model } : defaultModel ? { model: defaultModel } : {},
|
|
6633
6643
|
...input.mode ? { mode: input.mode } : {},
|
|
6634
6644
|
...input.effort ? { effort: input.effort } : {},
|
|
@@ -10151,6 +10161,7 @@ ${message}`;
|
|
|
10151
10161
|
harness: input.harness ?? input.adapterSlug,
|
|
10152
10162
|
...input.routeSelection !== void 0 ? { routeSelection: input.routeSelection } : {},
|
|
10153
10163
|
...input.adapterProvider !== void 0 ? { adapterProvider: input.adapterProvider } : {},
|
|
10164
|
+
...input.modelDerivedApiKey !== void 0 ? { modelDerivedApiKey: input.modelDerivedApiKey } : {},
|
|
10154
10165
|
// ACP-level session id — sticks across daemon restart so
|
|
10155
10166
|
// `agentproto sessions restart <id>` can pass it as
|
|
10156
10167
|
// `resumeSessionId` and the adapter reattaches to the prior
|
|
@@ -10276,6 +10287,7 @@ ${message}`;
|
|
|
10276
10287
|
harness: input.harness ?? input.adapterSlug,
|
|
10277
10288
|
...input.routeSelection !== void 0 ? { routeSelection: input.routeSelection } : {},
|
|
10278
10289
|
...input.adapterProvider !== void 0 ? { adapterProvider: input.adapterProvider } : {},
|
|
10290
|
+
...input.modelDerivedApiKey !== void 0 ? { modelDerivedApiKey: input.modelDerivedApiKey } : {},
|
|
10279
10291
|
...input.label ? { label: input.label } : {},
|
|
10280
10292
|
...input.title ? { title: input.title } : {},
|
|
10281
10293
|
...input.label ? { renamedByUser: false } : {},
|
|
@@ -10812,7 +10824,8 @@ ${message}`;
|
|
|
10812
10824
|
}
|
|
10813
10825
|
let routeSelection = rt.desc.routeSelection;
|
|
10814
10826
|
let adapterProvider = rt.desc.adapterProvider;
|
|
10815
|
-
|
|
10827
|
+
let modelDerivedApiKey = rt.desc.modelDerivedApiKey;
|
|
10828
|
+
const needsAdapterMetadata = routeSelection === void 0 || modelDerivedApiKey === void 0 || routeSelection !== "derived-from-model" && adapterProvider === void 0;
|
|
10816
10829
|
const adapterSlug = rt.desc.adapterSlug ?? rt.adapterSlug;
|
|
10817
10830
|
if (needsAdapterMetadata && resolveAgentAdapter && adapterSlug) {
|
|
10818
10831
|
try {
|
|
@@ -10828,6 +10841,11 @@ ${message}`;
|
|
|
10828
10841
|
rt.desc.adapterProvider = adapterProvider;
|
|
10829
10842
|
hydrated = true;
|
|
10830
10843
|
}
|
|
10844
|
+
if (modelDerivedApiKey === void 0 && resolved?.authDescriptor?.modelDerivedApiKey !== void 0) {
|
|
10845
|
+
modelDerivedApiKey = resolved.authDescriptor.modelDerivedApiKey;
|
|
10846
|
+
rt.desc.modelDerivedApiKey = modelDerivedApiKey;
|
|
10847
|
+
hydrated = true;
|
|
10848
|
+
}
|
|
10831
10849
|
if (hydrated) schedulePersist();
|
|
10832
10850
|
} catch {
|
|
10833
10851
|
}
|
|
@@ -10835,7 +10853,8 @@ ${message}`;
|
|
|
10835
10853
|
const wireModel = normalizeModelForWire(modelId, {
|
|
10836
10854
|
routeSelection,
|
|
10837
10855
|
gateway: rt.desc.route?.gateway,
|
|
10838
|
-
fixedProvider: adapterProvider
|
|
10856
|
+
fixedProvider: adapterProvider,
|
|
10857
|
+
modelDerivedApiKey
|
|
10839
10858
|
});
|
|
10840
10859
|
const result = await rt.agentSession.setModel(wireModel);
|
|
10841
10860
|
if (result.applied) {
|
|
@@ -13989,6 +14008,7 @@ async function restartAgentSession(registry, resolveAgentAdapter, prev, opts = {
|
|
|
13989
14008
|
declaredOptions: resolved.declaredOptions,
|
|
13990
14009
|
routeSelection: resolved.routeSelection,
|
|
13991
14010
|
adapterProvider: resolved.authDescriptor?.provider,
|
|
14011
|
+
modelDerivedApiKey: resolved.authDescriptor?.modelDerivedApiKey,
|
|
13992
14012
|
prefix: "restart"
|
|
13993
14013
|
});
|
|
13994
14014
|
} catch (err) {
|
|
@@ -14031,6 +14051,7 @@ async function restartAgentSession(registry, resolveAgentAdapter, prev, opts = {
|
|
|
14031
14051
|
harness: effHarness,
|
|
14032
14052
|
...resolved.routeSelection !== void 0 ? { routeSelection: resolved.routeSelection } : {},
|
|
14033
14053
|
...resolved.authDescriptor?.provider !== void 0 ? { adapterProvider: resolved.authDescriptor.provider } : {},
|
|
14054
|
+
...resolved.authDescriptor?.modelDerivedApiKey !== void 0 ? { modelDerivedApiKey: resolved.authDescriptor.modelDerivedApiKey } : {},
|
|
14034
14055
|
...prev.label ? { label: prev.label } : {},
|
|
14035
14056
|
...prev.mcpServers ? { mcpServers: prev.mcpServers } : {},
|
|
14036
14057
|
...effModel ? { model: effModel } : {},
|