@code-yeongyu/senpi 2026.8.27 → 2026.8.28-2
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/CHANGELOG.md +83 -0
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +4 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +2 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +5 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +1 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -0
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +3 -0
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/credential-accounts.d.ts +31 -0
- package/dist/core/credential-accounts.d.ts.map +1 -0
- package/dist/core/credential-accounts.js +135 -0
- package/dist/core/credential-accounts.js.map +1 -0
- package/dist/core/credential-pool/classify.d.ts +6 -1
- package/dist/core/credential-pool/classify.d.ts.map +1 -1
- package/dist/core/credential-pool/classify.js +22 -5
- package/dist/core/credential-pool/classify.js.map +1 -1
- package/dist/core/credential-pool/failover.d.ts +8 -0
- package/dist/core/credential-pool/failover.d.ts.map +1 -1
- package/dist/core/credential-pool/failover.js +24 -6
- package/dist/core/credential-pool/failover.js.map +1 -1
- package/dist/core/credential-pool/rotation-stream.d.ts +13 -2
- package/dist/core/credential-pool/rotation-stream.d.ts.map +1 -1
- package/dist/core/credential-pool/rotation-stream.js +97 -10
- package/dist/core/credential-pool/rotation-stream.js.map +1 -1
- package/dist/core/extensions/builtin/account/index.d.ts +9 -0
- package/dist/core/extensions/builtin/account/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/account/index.js +69 -0
- package/dist/core/extensions/builtin/account/index.js.map +1 -0
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +7 -0
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/imagegen/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/imagegen/index.js +10 -3
- package/dist/core/extensions/builtin/imagegen/index.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +4 -0
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
- package/dist/core/extensions/builtin/service-tier.js +13 -0
- package/dist/core/extensions/builtin/service-tier.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.js +4 -2
- package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
- package/dist/core/model-config-schema.d.ts +4 -4
- package/dist/core/model-runtime.d.ts +2 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +74 -37
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/retry-fallback/chains.d.ts +23 -1
- package/dist/core/retry-fallback/chains.d.ts.map +1 -1
- package/dist/core/retry-fallback/chains.js +59 -3
- package/dist/core/retry-fallback/chains.js.map +1 -1
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/controller.js +9 -2
- package/dist/core/retry-fallback/controller.js.map +1 -1
- package/dist/core/retry-fallback/settings.d.ts.map +1 -1
- package/dist/core/retry-fallback/settings.js +9 -0
- package/dist/core/retry-fallback/settings.js.map +1 -1
- package/dist/core/retry-fallback/validate.js +1 -1
- package/dist/core/retry-fallback/validate.js.map +1 -1
- package/dist/core/sdk.js +1 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +9 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +31 -0
- package/dist/core/session-manager.js.map +1 -1
- package/dist/main.d.ts +7 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +22 -2
- package/dist/main.js.map +1 -1
- package/dist/modes/app-server/server/account.d.ts.map +1 -1
- package/dist/modes/app-server/server/account.js +5 -5
- package/dist/modes/app-server/server/account.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +11 -3
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +31 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/grok/chrome.d.ts +4 -4
- package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
- package/dist/modes/interactive/grok/chrome.js.map +1 -1
- package/dist/modes/interactive/grok/footer.d.ts +3 -3
- package/dist/modes/interactive/grok/footer.d.ts.map +1 -1
- package/dist/modes/interactive/grok/footer.js.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.d.ts +16 -1
- package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-host-runtime.js +321 -36
- package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +295 -250
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +144 -29
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +14 -4
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +90 -8
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +118 -23
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +3 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +3 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +164 -2
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts +22 -0
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +153 -14
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-event-writer.d.ts +2 -0
- package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-writer.js +4 -0
- package/dist/modes/rpc/session-event-writer.js.map +1 -1
- package/dist/modes/rpc/session-registry.d.ts +16 -0
- package/dist/modes/rpc/session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/session-registry.js +40 -3
- package/dist/modes/rpc/session-registry.js.map +1 -1
- package/docs/providers.md +48 -0
- package/docs/rpc.md +43 -4
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +26 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +13 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker.ts +15 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +14 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.js +20 -4
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.d.ts +21 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.js +27 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.d.ts +24 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.js +7 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +3 -2
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan-cn.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
|
@@ -1674,10 +1674,10 @@ export declare const validateModelsConfig: import("typebox/compile").Validator<{
|
|
|
1674
1674
|
env?: string | undefined;
|
|
1675
1675
|
value?: string | undefined;
|
|
1676
1676
|
}> | undefined;
|
|
1677
|
-
rotation?: boolean | undefined;
|
|
1678
|
-
affinity?: boolean | undefined;
|
|
1679
1677
|
cooldownBaseMs?: number | undefined;
|
|
1680
1678
|
cooldownCapMs?: number | undefined;
|
|
1679
|
+
affinity?: boolean | undefined;
|
|
1680
|
+
rotation?: boolean | undefined;
|
|
1681
1681
|
} | undefined;
|
|
1682
1682
|
}>;
|
|
1683
1683
|
}, {
|
|
@@ -2028,10 +2028,10 @@ export declare const validateModelsConfig: import("typebox/compile").Validator<{
|
|
|
2028
2028
|
env?: string | undefined;
|
|
2029
2029
|
value?: string | undefined;
|
|
2030
2030
|
}> | undefined;
|
|
2031
|
-
rotation?: boolean | undefined;
|
|
2032
|
-
affinity?: boolean | undefined;
|
|
2033
2031
|
cooldownBaseMs?: number | undefined;
|
|
2034
2032
|
cooldownCapMs?: number | undefined;
|
|
2033
|
+
affinity?: boolean | undefined;
|
|
2034
|
+
rotation?: boolean | undefined;
|
|
2035
2035
|
} | undefined;
|
|
2036
2036
|
}>;
|
|
2037
2037
|
}>;
|
|
@@ -4,6 +4,7 @@ export interface CreateModelRuntimeOptions {
|
|
|
4
4
|
/** Credential storage. Defaults to the file at authPath. */
|
|
5
5
|
credentials?: CredentialStore;
|
|
6
6
|
authPath?: string;
|
|
7
|
+
agentDir?: string;
|
|
7
8
|
modelsPath?: string | null;
|
|
8
9
|
modelsStore?: ModelsStore;
|
|
9
10
|
modelsStorePath?: string;
|
|
@@ -68,6 +69,7 @@ export declare class ModelRuntime implements Models {
|
|
|
68
69
|
* validator - and its module-level global registry - into every consumer of
|
|
69
70
|
* ModelRuntime, which the import-graph guard forbids.
|
|
70
71
|
*/
|
|
72
|
+
private readonly poolStatePath;
|
|
71
73
|
private credentialPoolModules;
|
|
72
74
|
private constructor();
|
|
73
75
|
static create(options?: CreateModelRuntimeOptions): Promise<ModelRuntime>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-runtime.d.ts","sourceRoot":"","sources":["../../src/core/model-runtime.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,GAAG,EAER,KAAK,gBAAgB,EACrB,KAAK,2BAA2B,EAChC,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,EAIpB,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"model-runtime.d.ts","sourceRoot":"","sources":["../../src/core/model-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { dirname, join } from "node:path";
|
|
2
|
-
import { createModels,
|
|
2
|
+
import { createModels, lazyStream, ModelsError, setWireIdentity, wrapStreamWithModelRecovery, } from "@earendil-works/pi-ai";
|
|
3
3
|
import * as builtinProviderCatalog from "@earendil-works/pi-ai/providers/all";
|
|
4
4
|
import { APP_NAME, BRAND, getAgentDir } from "../config.js";
|
|
5
5
|
import { operationSignal, raceWithAbortSignal } from "../utils/abort.js";
|
|
6
6
|
import { AuthStorage as DefaultAuthStorage } from "./auth-storage.js";
|
|
7
7
|
import { envValue } from "./brand.js";
|
|
8
|
+
import { discoverEnvSlots } from "./credential-pool/env-slots.js";
|
|
8
9
|
import { ModelConfig } from "./model-config.js";
|
|
9
10
|
import { FileModelsStore, InMemoryCodingAgentModelsStore } from "./models-store.js";
|
|
10
11
|
import { composeModelProvider, configuredRequestAuthStatus, resolveCompatibilityRequestConfig, resolveConfiguredModelHeaders, validateExtensionProvider, } from "./provider-composer.js";
|
|
@@ -13,30 +14,12 @@ import { RuntimeCredentials } from "./runtime-credentials.js";
|
|
|
13
14
|
// The product's identity must ride outgoing requests. This lives here because the AI package
|
|
14
15
|
// is already part of this module's graph; the CLI bootstrap deliberately does not import it.
|
|
15
16
|
setWireIdentity(BRAND?.userAgent ?? APP_NAME);
|
|
16
|
-
|
|
17
|
-
* Cheap pre-check answering "could this provider hold more than one credential
|
|
18
|
-
* at all?" without loading the credential pool. A stored entry pools only
|
|
19
|
-
* through `accounts`; env slots participate only when nothing is stored, and a
|
|
20
|
-
* lone primary variable is still a single credential.
|
|
21
|
-
*/
|
|
22
|
-
function mightHoldEnvCredentialPool(providerId, env) {
|
|
23
|
-
const envVars = getApiKeyEnvVars(providerId);
|
|
24
|
-
const primary = envVars?.find((name) => name.endsWith("_API_KEY")) ?? envVars?.[0];
|
|
25
|
-
if (primary === undefined)
|
|
26
|
-
return false;
|
|
27
|
-
let found = env(primary) ? 1 : 0;
|
|
28
|
-
for (let index = 2; index <= 16 && found < 2; index++) {
|
|
29
|
-
if (env(`${primary}_${index}`))
|
|
30
|
-
found++;
|
|
31
|
-
}
|
|
32
|
-
return found > 1;
|
|
33
|
-
}
|
|
34
|
-
function mightHoldCredentialPool(providerId, credential, env) {
|
|
17
|
+
function mightHoldCredentialPool(providerId, credential, env, policySlots) {
|
|
35
18
|
if (credential) {
|
|
36
19
|
const accounts = Object.entries(credential).find(([key]) => key === "accounts")?.[1];
|
|
37
|
-
return Array.isArray(accounts) && accounts.length > 1;
|
|
20
|
+
return (Array.isArray(accounts) && accounts.length > 1) || Object.keys(policySlots ?? {}).length > 0;
|
|
38
21
|
}
|
|
39
|
-
return
|
|
22
|
+
return discoverEnvSlots(providerId, env).length + Object.keys(policySlots ?? {}).length > 1;
|
|
40
23
|
}
|
|
41
24
|
/** Credentials changed successfully, but the local model/auth snapshot could not be synchronized. */
|
|
42
25
|
export class CredentialSynchronizationError extends Error {
|
|
@@ -68,12 +51,15 @@ function withPayloadRequestMetadata(options, model) {
|
|
|
68
51
|
const onPayload = options.onPayload;
|
|
69
52
|
return {
|
|
70
53
|
...options,
|
|
71
|
-
onPayload: async (payload, providerModel) => await onPayload(payload, providerModel, {
|
|
54
|
+
onPayload: async (payload, providerModel) => await onPayload(payload, providerModel, {
|
|
55
|
+
model,
|
|
56
|
+
headers: options.headers ?? {},
|
|
57
|
+
}),
|
|
72
58
|
};
|
|
73
59
|
}
|
|
74
60
|
/** Configured pi-ai Models collection used by coding-agent and SDK consumers. */
|
|
75
61
|
export class ModelRuntime {
|
|
76
|
-
constructor(credentials, config, modelsPath, modelsStore, providers, modelNetworkEnabled, modelRefreshTimeoutMs) {
|
|
62
|
+
constructor(credentials, config, modelsPath, modelsStore, providers, modelNetworkEnabled, modelRefreshTimeoutMs, poolStatePath) {
|
|
77
63
|
this.builtins = new Map();
|
|
78
64
|
this.nativeExtensionProviders = new Map();
|
|
79
65
|
this.extensionProviders = new Map();
|
|
@@ -91,6 +77,7 @@ export class ModelRuntime {
|
|
|
91
77
|
this.providerAvailabilitySeq = new Map();
|
|
92
78
|
this.credentialOperations = new Map();
|
|
93
79
|
this.credentials = credentials;
|
|
80
|
+
this.poolStatePath = poolStatePath;
|
|
94
81
|
this.config = config;
|
|
95
82
|
this.modelsPath = modelsPath;
|
|
96
83
|
this.modelNetworkEnabled = modelNetworkEnabled;
|
|
@@ -115,7 +102,11 @@ export class ModelRuntime {
|
|
|
115
102
|
.map((provider) => provider.refreshModels || !remoteCatalogServesProvider(provider.id, options.catalogBaseUrl)
|
|
116
103
|
? provider
|
|
117
104
|
: withRemoteCatalog(provider, options.catalogBaseUrl, builtinModelDataGeneratedAt));
|
|
118
|
-
const runtime = new ModelRuntime(credentials, config, modelsPath, modelsStore, providers, envValue("OFFLINE") === undefined && options.allowModelNetwork === true, options.modelRefreshTimeoutMs ?? 15_000
|
|
105
|
+
const runtime = new ModelRuntime(credentials, config, modelsPath, modelsStore, providers, envValue("OFFLINE") === undefined && options.allowModelNetwork === true, options.modelRefreshTimeoutMs ?? 15_000, options.agentDir
|
|
106
|
+
? join(options.agentDir, "credential-pool-state.json")
|
|
107
|
+
: options.authPath
|
|
108
|
+
? join(dirname(options.authPath), "credential-pool-state.json")
|
|
109
|
+
: undefined);
|
|
119
110
|
runtime.rebuildProviders();
|
|
120
111
|
const refreshFromNetwork = runtime.modelNetworkEnabled && options.allowModelNetwork === true;
|
|
121
112
|
const controller = refreshFromNetwork && options.modelRefreshTimeoutMs !== undefined ? new AbortController() : undefined;
|
|
@@ -150,7 +141,11 @@ export class ModelRuntime {
|
|
|
150
141
|
.map((provider) => provider.refreshModels || !remoteCatalogServesProvider(provider.id, options.catalogBaseUrl)
|
|
151
142
|
? provider
|
|
152
143
|
: withRemoteCatalog(provider, options.catalogBaseUrl));
|
|
153
|
-
const runtime = new ModelRuntime(credentials, config, modelsPath, modelsStore, providers, options.allowModelNetwork ?? false, options.modelRefreshTimeoutMs ?? 15_000
|
|
144
|
+
const runtime = new ModelRuntime(credentials, config, modelsPath, modelsStore, providers, options.allowModelNetwork ?? false, options.modelRefreshTimeoutMs ?? 15_000, options.agentDir
|
|
145
|
+
? join(options.agentDir, "credential-pool-state.json")
|
|
146
|
+
: options.authPath
|
|
147
|
+
? join(dirname(options.authPath), "credential-pool-state.json")
|
|
148
|
+
: undefined);
|
|
154
149
|
runtime.rebuildProviders();
|
|
155
150
|
return runtime;
|
|
156
151
|
}
|
|
@@ -440,7 +435,11 @@ export class ModelRuntime {
|
|
|
440
435
|
const compositionError = this.compositionErrors.get(providerId);
|
|
441
436
|
if (compositionError)
|
|
442
437
|
throw new Error(compositionError);
|
|
443
|
-
const result = await this.models.refresh({
|
|
438
|
+
const result = await this.models.refresh({
|
|
439
|
+
allowNetwork: false,
|
|
440
|
+
providers: [providerId],
|
|
441
|
+
signal,
|
|
442
|
+
});
|
|
444
443
|
if (result.aborted)
|
|
445
444
|
signal.throwIfAborted();
|
|
446
445
|
const refreshError = result.errors.get(providerId);
|
|
@@ -537,7 +536,10 @@ export class ModelRuntime {
|
|
|
537
536
|
import("./credential-pool/rotation-stream.js"),
|
|
538
537
|
import("./credential-pool/state-store.js"),
|
|
539
538
|
]);
|
|
540
|
-
return {
|
|
539
|
+
return {
|
|
540
|
+
rotation,
|
|
541
|
+
repository: new stateStore.CredentialSlotRepository(this.poolStatePath),
|
|
542
|
+
};
|
|
541
543
|
})();
|
|
542
544
|
return this.credentialPoolModules;
|
|
543
545
|
}
|
|
@@ -557,12 +559,16 @@ export class ModelRuntime {
|
|
|
557
559
|
const env = (name) => options?.env?.[name] ?? process.env[name];
|
|
558
560
|
if (this.snapshot.storedProviders.has(model.provider))
|
|
559
561
|
return true;
|
|
560
|
-
|
|
562
|
+
const policySlots = this.config.getProvider(model.provider)?.credentials?.slots;
|
|
563
|
+
return discoverEnvSlots(model.provider, env).length + Object.keys(policySlots ?? {}).length > 1;
|
|
561
564
|
}
|
|
562
565
|
async credentialRotationSources(model, options) {
|
|
563
566
|
const env = (name) => options?.env?.[name] ?? process.env[name];
|
|
564
|
-
const credential = await this.credentials.read(model.provider, {
|
|
565
|
-
|
|
567
|
+
const credential = await this.credentials.read(model.provider, {
|
|
568
|
+
signal: options?.signal,
|
|
569
|
+
});
|
|
570
|
+
const policy = this.config.getProvider(model.provider)?.credentials;
|
|
571
|
+
if (!mightHoldCredentialPool(model.provider, credential, env, policy?.slots))
|
|
566
572
|
return undefined;
|
|
567
573
|
const pool = await this.loadCredentialPool();
|
|
568
574
|
const sources = {
|
|
@@ -570,8 +576,9 @@ export class ModelRuntime {
|
|
|
570
576
|
credential,
|
|
571
577
|
env,
|
|
572
578
|
repository: pool.repository,
|
|
579
|
+
policy,
|
|
573
580
|
};
|
|
574
|
-
const slots = await pool.rotation.listRotationSlots(sources);
|
|
581
|
+
const slots = await pool.rotation.listRotationSlots(sources, { acquireLeases: false });
|
|
575
582
|
return slots.length > 1 ? sources : undefined;
|
|
576
583
|
}
|
|
577
584
|
stream(model, context, options) {
|
|
@@ -584,10 +591,16 @@ export class ModelRuntime {
|
|
|
584
591
|
const { rotation } = await this.loadCredentialPool();
|
|
585
592
|
return rotation.streamWithCredentialRotation({
|
|
586
593
|
sources,
|
|
587
|
-
...(streamOptions?.affinityKey
|
|
594
|
+
...(streamOptions?.affinityKey !== undefined
|
|
595
|
+
? { affinityKey: streamOptions.affinityKey }
|
|
596
|
+
: streamOptions?.sessionId !== undefined
|
|
597
|
+
? { affinityKey: streamOptions.sessionId }
|
|
598
|
+
: {}),
|
|
588
599
|
runAttempt: async (slot) => {
|
|
589
600
|
const prepared = await this.prepareRequest(model, streamOptions, slot.lane === "env"
|
|
590
|
-
? {
|
|
601
|
+
? {
|
|
602
|
+
...(slot.envKey === undefined ? {} : { apiKey: slot.envKey }),
|
|
603
|
+
}
|
|
591
604
|
: { slotName: slot.name });
|
|
592
605
|
const attempt = prepared.provider.stream(prepared.model, context, withPayloadRequestMetadata(prepared.options, prepared.model));
|
|
593
606
|
return wrapStreamWithModelRecovery(attempt, model, context.tools ?? []);
|
|
@@ -604,6 +617,21 @@ export class ModelRuntime {
|
|
|
604
617
|
}
|
|
605
618
|
streamSimple(model, context, options) {
|
|
606
619
|
return lazyStream(model, async () => {
|
|
620
|
+
const streamOptions = options;
|
|
621
|
+
const sources = this.couldRotateCredentials(model, streamOptions)
|
|
622
|
+
? await this.credentialRotationSources(model, streamOptions)
|
|
623
|
+
: undefined;
|
|
624
|
+
if (sources) {
|
|
625
|
+
const { rotation } = await this.loadCredentialPool();
|
|
626
|
+
return rotation.streamWithCredentialRotation({
|
|
627
|
+
sources,
|
|
628
|
+
...(streamOptions?.sessionId === undefined ? {} : { affinityKey: streamOptions.sessionId }),
|
|
629
|
+
runAttempt: async (slot) => {
|
|
630
|
+
const prepared = await this.prepareRequest(model, streamOptions, slot.lane === "env" ? { apiKey: slot.envKey } : { slotName: slot.name });
|
|
631
|
+
return wrapStreamWithModelRecovery(prepared.provider.streamSimple(prepared.model, context, withPayloadRequestMetadata(prepared.options, prepared.model)), model, context.tools ?? []);
|
|
632
|
+
},
|
|
633
|
+
});
|
|
634
|
+
}
|
|
607
635
|
const prepared = await this.prepareRequest(model, options);
|
|
608
636
|
const inner = prepared.provider.streamSimple(prepared.model, context, withPayloadRequestMetadata(prepared.options, prepared.model));
|
|
609
637
|
return wrapStreamWithModelRecovery(inner, model, context.tools ?? []);
|
|
@@ -631,7 +659,10 @@ export class ModelRuntime {
|
|
|
631
659
|
login(providerId, type, interaction) {
|
|
632
660
|
const signal = operationSignal(interaction.signal);
|
|
633
661
|
return this.enqueueCredentialOperation(providerId, signal, async () => {
|
|
634
|
-
const credential = await this.models.login(providerId, type, {
|
|
662
|
+
const credential = await this.models.login(providerId, type, {
|
|
663
|
+
...interaction,
|
|
664
|
+
signal,
|
|
665
|
+
});
|
|
635
666
|
await this.synchronizeCredentialState(providerId, "login", credential, signal);
|
|
636
667
|
return credential;
|
|
637
668
|
});
|
|
@@ -688,7 +719,10 @@ export class ModelRuntime {
|
|
|
688
719
|
// Availability errors are recorded by the latest pass; refreshed models remain usable.
|
|
689
720
|
}
|
|
690
721
|
}
|
|
691
|
-
return {
|
|
722
|
+
return {
|
|
723
|
+
aborted: result.aborted || (options.signal?.aborted ?? false),
|
|
724
|
+
errors,
|
|
725
|
+
};
|
|
692
726
|
}
|
|
693
727
|
/**
|
|
694
728
|
* Providers registered after startup missed the create() refresh. Load their catalogs
|
|
@@ -705,7 +739,10 @@ export class ModelRuntime {
|
|
|
705
739
|
return this.refresh({ allowNetwork: false });
|
|
706
740
|
const controller = new AbortController();
|
|
707
741
|
const timeout = setTimeout(() => controller.abort(), this.modelRefreshTimeoutMs);
|
|
708
|
-
return this.refresh({
|
|
742
|
+
return this.refresh({
|
|
743
|
+
allowNetwork: true,
|
|
744
|
+
signal: controller.signal,
|
|
745
|
+
}).finally(() => clearTimeout(timeout));
|
|
709
746
|
}
|
|
710
747
|
registerNativeProvider(provider, options) {
|
|
711
748
|
if (!provider.id.trim())
|