bulkhead-runtime 0.1.0 → 2026.4.5-beta.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/README.md +337 -234
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/config/index.d.ts +28 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +9 -6
- package/dist/config/index.js.map +1 -1
- package/dist/credentials/store.d.ts.map +1 -1
- package/dist/credentials/store.js +39 -15
- package/dist/credentials/store.js.map +1 -1
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -1
- package/dist/index.js.map +1 -1
- package/dist/infra/warning-filter.js +1 -1
- package/dist/infra/warning-filter.js.map +1 -1
- package/dist/logging/subsystem.d.ts +15 -1
- package/dist/logging/subsystem.d.ts.map +1 -1
- package/dist/logging/subsystem.js +310 -45
- package/dist/logging/subsystem.js.map +1 -1
- package/dist/memory/embedding-batch.d.ts +38 -0
- package/dist/memory/embedding-batch.d.ts.map +1 -0
- package/dist/memory/embedding-batch.js +253 -0
- package/dist/memory/embedding-batch.js.map +1 -0
- package/dist/memory/embedding-cache.d.ts +16 -0
- package/dist/memory/embedding-cache.d.ts.map +1 -0
- package/dist/memory/embedding-cache.js +113 -0
- package/dist/memory/embedding-cache.js.map +1 -0
- package/dist/memory/embeddings-debug.js +1 -1
- package/dist/memory/embeddings.d.ts +1 -0
- package/dist/memory/embeddings.d.ts.map +1 -1
- package/dist/memory/embeddings.js +115 -92
- package/dist/memory/embeddings.js.map +1 -1
- package/dist/memory/file-indexer.d.ts +26 -0
- package/dist/memory/file-indexer.d.ts.map +1 -0
- package/dist/memory/file-indexer.js +245 -0
- package/dist/memory/file-indexer.js.map +1 -0
- package/dist/memory/hybrid.d.ts.map +1 -1
- package/dist/memory/hybrid.js +6 -2
- package/dist/memory/hybrid.js.map +1 -1
- package/dist/memory/index.d.ts +5 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +5 -2
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/session-indexer.d.ts +41 -0
- package/dist/memory/session-indexer.d.ts.map +1 -0
- package/dist/memory/session-indexer.js +341 -0
- package/dist/memory/session-indexer.js.map +1 -0
- package/dist/memory/simple-manager.d.ts +6 -0
- package/dist/memory/simple-manager.d.ts.map +1 -1
- package/dist/memory/simple-manager.js +35 -12
- package/dist/memory/simple-manager.js.map +1 -1
- package/dist/memory/ssrf.d.ts +18 -0
- package/dist/memory/ssrf.d.ts.map +1 -0
- package/dist/memory/ssrf.js +316 -0
- package/dist/memory/ssrf.js.map +1 -0
- package/dist/package.json +8 -5
- package/dist/platform/platform.d.ts.map +1 -1
- package/dist/platform/platform.js +30 -7
- package/dist/platform/platform.js.map +1 -1
- package/dist/platform/types.d.ts +2 -0
- package/dist/platform/types.d.ts.map +1 -1
- package/dist/runtime/agent.d.ts +8 -0
- package/dist/runtime/agent.d.ts.map +1 -1
- package/dist/runtime/agent.js +194 -46
- package/dist/runtime/agent.js.map +1 -1
- package/dist/runtime/api-key-rotation.d.ts +26 -0
- package/dist/runtime/api-key-rotation.d.ts.map +1 -0
- package/dist/runtime/api-key-rotation.js +174 -0
- package/dist/runtime/api-key-rotation.js.map +1 -0
- package/dist/runtime/context-guard.d.ts +32 -0
- package/dist/runtime/context-guard.d.ts.map +1 -0
- package/dist/runtime/context-guard.js +61 -0
- package/dist/runtime/context-guard.js.map +1 -0
- package/dist/runtime/failover-error.d.ts +62 -0
- package/dist/runtime/failover-error.d.ts.map +1 -0
- package/dist/runtime/failover-error.js +733 -0
- package/dist/runtime/failover-error.js.map +1 -0
- package/dist/runtime/failover-policy.d.ts +5 -0
- package/dist/runtime/failover-policy.d.ts.map +1 -0
- package/dist/runtime/failover-policy.js +18 -0
- package/dist/runtime/failover-policy.js.map +1 -0
- package/dist/runtime/index.d.ts +11 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +11 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/memory-flush.d.ts +24 -0
- package/dist/runtime/memory-flush.d.ts.map +1 -0
- package/dist/runtime/memory-flush.js +64 -0
- package/dist/runtime/memory-flush.js.map +1 -0
- package/dist/runtime/memory-tools.d.ts +14 -0
- package/dist/runtime/memory-tools.d.ts.map +1 -0
- package/dist/runtime/memory-tools.js +58 -0
- package/dist/runtime/memory-tools.js.map +1 -0
- package/dist/runtime/model-fallback.d.ts +56 -0
- package/dist/runtime/model-fallback.d.ts.map +1 -0
- package/dist/runtime/model-fallback.js +301 -0
- package/dist/runtime/model-fallback.js.map +1 -0
- package/dist/runtime/model-fallback.types.d.ts +14 -0
- package/dist/runtime/model-fallback.types.d.ts.map +1 -0
- package/dist/runtime/model-fallback.types.js +3 -0
- package/dist/runtime/model-fallback.types.js.map +1 -0
- package/dist/runtime/retry.d.ts +24 -0
- package/dist/runtime/retry.d.ts.map +1 -0
- package/dist/runtime/retry.js +102 -0
- package/dist/runtime/retry.js.map +1 -0
- package/dist/runtime/session-pruning.d.ts +22 -0
- package/dist/runtime/session-pruning.d.ts.map +1 -0
- package/dist/runtime/session-pruning.js +118 -0
- package/dist/runtime/session-pruning.js.map +1 -0
- package/dist/runtime/stream-adapters.d.ts +11 -0
- package/dist/runtime/stream-adapters.d.ts.map +1 -0
- package/dist/runtime/stream-adapters.js +46 -0
- package/dist/runtime/stream-adapters.js.map +1 -0
- package/dist/runtime/subagent.d.ts +83 -0
- package/dist/runtime/subagent.d.ts.map +1 -0
- package/dist/runtime/subagent.js +190 -0
- package/dist/runtime/subagent.js.map +1 -0
- package/dist/runtime/tool-result-truncation.d.ts +25 -0
- package/dist/runtime/tool-result-truncation.d.ts.map +1 -0
- package/dist/runtime/tool-result-truncation.js +115 -0
- package/dist/runtime/tool-result-truncation.js.map +1 -0
- package/dist/sandbox/cgroup.d.ts +4 -1
- package/dist/sandbox/cgroup.d.ts.map +1 -1
- package/dist/sandbox/cgroup.js +28 -15
- package/dist/sandbox/cgroup.js.map +1 -1
- package/dist/sandbox/index.d.ts +2 -1
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +2 -1
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/ipc.d.ts +4 -1
- package/dist/sandbox/ipc.d.ts.map +1 -1
- package/dist/sandbox/ipc.js +33 -17
- package/dist/sandbox/ipc.js.map +1 -1
- package/dist/sandbox/manager.d.ts +1 -2
- package/dist/sandbox/manager.d.ts.map +1 -1
- package/dist/sandbox/manager.js +132 -130
- package/dist/sandbox/manager.js.map +1 -1
- package/dist/sandbox/namespace.d.ts +1 -1
- package/dist/sandbox/namespace.d.ts.map +1 -1
- package/dist/sandbox/namespace.js +36 -37
- package/dist/sandbox/namespace.js.map +1 -1
- package/dist/sandbox/rootfs.d.ts +6 -1
- package/dist/sandbox/rootfs.d.ts.map +1 -1
- package/dist/sandbox/rootfs.js +114 -30
- package/dist/sandbox/rootfs.js.map +1 -1
- package/dist/sandbox/seccomp-apply.d.ts +9 -0
- package/dist/sandbox/seccomp-apply.d.ts.map +1 -0
- package/dist/sandbox/seccomp-apply.js +227 -0
- package/dist/sandbox/seccomp-apply.js.map +1 -0
- package/dist/sandbox/seccomp.js +3 -3
- package/dist/sandbox/seccomp.js.map +1 -1
- package/dist/sandbox/types.d.ts +1 -3
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/worker.d.ts +3 -0
- package/dist/sandbox/worker.d.ts.map +1 -1
- package/dist/sandbox/worker.js +84 -17
- package/dist/sandbox/worker.js.map +1 -1
- package/dist/sessions/index.d.ts +1 -0
- package/dist/sessions/index.d.ts.map +1 -1
- package/dist/sessions/index.js +1 -0
- package/dist/sessions/index.js.map +1 -1
- package/dist/sessions/store.d.ts +2 -2
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +49 -27
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/transcript-events.d.ts +11 -0
- package/dist/sessions/transcript-events.d.ts.map +1 -0
- package/dist/sessions/transcript-events.js +40 -0
- package/dist/sessions/transcript-events.js.map +1 -0
- package/dist/shared/agent-session.d.ts +10 -0
- package/dist/shared/agent-session.d.ts.map +1 -0
- package/dist/shared/agent-session.js +33 -0
- package/dist/shared/agent-session.js.map +1 -0
- package/dist/shared/constants.d.ts +6 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +11 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/fs.d.ts +7 -0
- package/dist/shared/fs.d.ts.map +1 -0
- package/dist/shared/fs.js +14 -0
- package/dist/shared/fs.js.map +1 -0
- package/dist/shared/index.d.ts +4 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +4 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/skills/enablement.d.ts.map +1 -1
- package/dist/skills/enablement.js +2 -2
- package/dist/skills/enablement.js.map +1 -1
- package/dist/workspace/runner.d.ts.map +1 -1
- package/dist/workspace/runner.js +353 -106
- package/dist/workspace/runner.js.map +1 -1
- package/dist/workspace/types.d.ts +1 -0
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/workspace.d.ts.map +1 -1
- package/dist/workspace/workspace.js +12 -3
- package/dist/workspace/workspace.js.map +1 -1
- package/package.json +1 -1
package/dist/runtime/agent.js
CHANGED
|
@@ -6,12 +6,32 @@ import { createEmbeddingProvider } from "../memory/embeddings.js";
|
|
|
6
6
|
import { getOrCreateSession, updateSession, } from "../sessions/index.js";
|
|
7
7
|
import { loadWorkspaceSkills } from "../skills/index.js";
|
|
8
8
|
import { loadConfig, resolveStateDir, } from "../config/index.js";
|
|
9
|
+
import { DEFAULT_MODEL, DEFAULT_PROVIDER, LINUX_REQUIRED_MESSAGE, buildProviderEnvKey, resolveSessionManager, extractAssistantResponse, } from "../shared/index.js";
|
|
10
|
+
import { createMemoryTools } from "./memory-tools.js";
|
|
11
|
+
import { runWithModelFallback } from "./model-fallback.js";
|
|
12
|
+
import { resolveContextWindowInfo, evaluateContextWindowGuard, CONTEXT_WINDOW_HARD_MIN_TOKENS, } from "./context-guard.js";
|
|
13
|
+
import { retryAsync } from "./retry.js";
|
|
14
|
+
import { isLikelyContextOverflowError, isTimeoutErrorMessage, isRateLimitErrorMessage } from "./failover-error.js";
|
|
15
|
+
import { executeWithApiKeyRotation, collectProviderApiKeys, } from "./api-key-rotation.js";
|
|
16
|
+
import { createSubagentTool } from "./subagent.js";
|
|
17
|
+
import { shouldRunMemoryFlush, createMemoryFlushState, markMemoryFlushed, MEMORY_FLUSH_PROMPT, MEMORY_FLUSH_SYSTEM_PROMPT, } from "./memory-flush.js";
|
|
18
|
+
import { createSubsystemLogger, configureLogger } from "../logging/subsystem.js";
|
|
9
19
|
import * as path from "node:path";
|
|
10
20
|
import * as fs from "node:fs";
|
|
21
|
+
const log = createSubsystemLogger("runtime");
|
|
22
|
+
function assertLinux() {
|
|
23
|
+
if (process.platform !== "linux") {
|
|
24
|
+
throw new Error(LINUX_REQUIRED_MESSAGE);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
11
27
|
export async function createRuntime(overrides) {
|
|
12
|
-
|
|
28
|
+
assertLinux();
|
|
29
|
+
const fileConfig = loadConfig(overrides?.configPath);
|
|
13
30
|
const config = { ...fileConfig, ...overrides };
|
|
14
31
|
const stateDir = resolveStateDir(config);
|
|
32
|
+
if (config.logging) {
|
|
33
|
+
configureLogger(config.logging);
|
|
34
|
+
}
|
|
15
35
|
const hooks = createHookRunner();
|
|
16
36
|
const memoryDir = config.memory?.dir ?? path.join(stateDir, "memory");
|
|
17
37
|
// Create embedding provider from config if available
|
|
@@ -20,21 +40,20 @@ export async function createRuntime(overrides) {
|
|
|
20
40
|
: undefined;
|
|
21
41
|
const memory = createSimpleMemoryManager({ dbDir: memoryDir, embeddingProvider });
|
|
22
42
|
fs.mkdirSync(stateDir, { recursive: true });
|
|
43
|
+
const memoryFlushState = createMemoryFlushState();
|
|
23
44
|
async function run(options) {
|
|
24
45
|
const sessionId = options.sessionId ?? `session_${Date.now()}`;
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const providerEnvKey = `${provider.toUpperCase().replace(/-/g, "_")}_API_KEY`;
|
|
28
|
-
const apiKey = options.apiKey ?? config.apiKey ?? process.env[providerEnvKey] ?? "";
|
|
46
|
+
const requestedModelId = options.model ?? config.model ?? DEFAULT_MODEL;
|
|
47
|
+
const requestedProvider = (options.provider ?? config.provider ?? DEFAULT_PROVIDER);
|
|
29
48
|
const workspaceDir = options.workspaceDir ?? config.workspaceDir ?? process.cwd();
|
|
30
|
-
const sessionsDir = path.join(stateDir, "sessions");
|
|
49
|
+
const sessionsDir = path.join(stateDir, "sessions", sessionId);
|
|
31
50
|
fs.mkdirSync(sessionsDir, { recursive: true });
|
|
32
|
-
getOrCreateSession(stateDir, sessionId, { model:
|
|
51
|
+
await getOrCreateSession(stateDir, sessionId, { model: requestedModelId });
|
|
33
52
|
await hooks.run("session_start", { sessionId });
|
|
34
53
|
await hooks.run("before_agent_start", {
|
|
35
54
|
sessionId,
|
|
36
55
|
message: options.message,
|
|
37
|
-
model:
|
|
56
|
+
model: requestedModelId,
|
|
38
57
|
});
|
|
39
58
|
let skillsPrompt = "";
|
|
40
59
|
if (config.skills?.enabled !== false) {
|
|
@@ -52,50 +71,179 @@ export async function createRuntime(overrides) {
|
|
|
52
71
|
]
|
|
53
72
|
.filter(Boolean)
|
|
54
73
|
.join("\n\n");
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
74
|
+
async function executeWithModel(provider, modelId) {
|
|
75
|
+
const envKey = buildProviderEnvKey(provider);
|
|
76
|
+
const apiKeys = [];
|
|
77
|
+
if (options.apiKey)
|
|
78
|
+
apiKeys.push(options.apiKey);
|
|
79
|
+
if (options.apiKeys)
|
|
80
|
+
apiKeys.push(...options.apiKeys);
|
|
81
|
+
if (config.apiKey)
|
|
82
|
+
apiKeys.push(config.apiKey);
|
|
83
|
+
apiKeys.push(...collectProviderApiKeys(provider));
|
|
84
|
+
const uniqueKeys = [...new Set(apiKeys.filter((k) => k.length > 0))];
|
|
85
|
+
if (uniqueKeys.length === 0) {
|
|
86
|
+
const envVal = process.env[envKey];
|
|
87
|
+
if (envVal)
|
|
88
|
+
uniqueKeys.push(envVal);
|
|
89
|
+
}
|
|
90
|
+
async function runWithKey(apiKey) {
|
|
91
|
+
const model = getModel(provider, modelId);
|
|
92
|
+
const ctxInfo = resolveContextWindowInfo({
|
|
93
|
+
modelContextWindow: model.contextWindow,
|
|
94
|
+
configContextTokens: options.contextTokens,
|
|
95
|
+
});
|
|
96
|
+
const ctxGuard = evaluateContextWindowGuard({ info: ctxInfo });
|
|
97
|
+
if (ctxGuard.shouldBlock) {
|
|
98
|
+
throw new Error(`Context window too small (${ctxGuard.tokens} tokens). Minimum: ${CONTEXT_WINDOW_HARD_MIN_TOKENS}.`);
|
|
99
|
+
}
|
|
100
|
+
const previousEnvValue = process.env[envKey];
|
|
101
|
+
if (apiKey)
|
|
102
|
+
process.env[envKey] = apiKey;
|
|
103
|
+
try {
|
|
104
|
+
const sessionManager = resolveSessionManager(SessionManager, workspaceDir, sessionsDir);
|
|
105
|
+
const memoryTools = config.memory?.enabled !== false
|
|
106
|
+
? createMemoryTools(memory)
|
|
107
|
+
: [];
|
|
108
|
+
const customTools = [
|
|
109
|
+
...memoryTools,
|
|
110
|
+
...(options.tools ?? []),
|
|
111
|
+
];
|
|
112
|
+
if (options.enableSubagents !== false) {
|
|
113
|
+
const subTool = createSubagentTool({
|
|
114
|
+
runtime: {
|
|
115
|
+
run: (opts) => {
|
|
116
|
+
const subOpts = opts;
|
|
117
|
+
return run({
|
|
118
|
+
...subOpts,
|
|
119
|
+
systemPrompt: subOpts.systemPrompt ?? "You are a helpful sub-agent. Be concise and focused on the task.",
|
|
120
|
+
});
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
customTools.push(subTool);
|
|
125
|
+
}
|
|
126
|
+
const sessionOpts = {
|
|
127
|
+
cwd: workspaceDir,
|
|
128
|
+
model,
|
|
129
|
+
tools: [...codingTools],
|
|
130
|
+
customTools,
|
|
131
|
+
sessionManager,
|
|
132
|
+
};
|
|
133
|
+
return await retryAsync(async () => {
|
|
134
|
+
const { session } = await createAgentSession(sessionOpts);
|
|
135
|
+
const pendingToolArgs = new Map();
|
|
136
|
+
const unsubscribe = session.subscribe((event) => {
|
|
137
|
+
options.onEvent?.(event);
|
|
138
|
+
if (event.type === "tool_execution_start") {
|
|
139
|
+
pendingToolArgs.set(event.toolCallId, event.args ?? {});
|
|
140
|
+
hooks
|
|
141
|
+
.run("before_tool_call", {
|
|
142
|
+
toolName: event.toolName,
|
|
143
|
+
input: event.args ?? {},
|
|
144
|
+
})
|
|
145
|
+
.catch(() => { });
|
|
146
|
+
}
|
|
147
|
+
if (event.type === "tool_execution_end") {
|
|
148
|
+
const input = pendingToolArgs.get(event.toolCallId) ?? {};
|
|
149
|
+
pendingToolArgs.delete(event.toolCallId);
|
|
150
|
+
hooks
|
|
151
|
+
.run("after_tool_call", {
|
|
152
|
+
toolName: event.toolName,
|
|
153
|
+
input,
|
|
154
|
+
result: event.result,
|
|
155
|
+
})
|
|
156
|
+
.catch(() => { });
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
try {
|
|
160
|
+
await session.sendUserMessage(options.message);
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
unsubscribe();
|
|
164
|
+
}
|
|
165
|
+
const responseText = extractAssistantResponse(session.messages);
|
|
166
|
+
return {
|
|
167
|
+
response: responseText,
|
|
168
|
+
sessionId,
|
|
169
|
+
provider,
|
|
170
|
+
model: modelId,
|
|
171
|
+
};
|
|
172
|
+
}, {
|
|
173
|
+
attempts: options.maxRetries ?? 2,
|
|
174
|
+
minDelayMs: 1000,
|
|
175
|
+
maxDelayMs: 10_000,
|
|
176
|
+
shouldRetry: (err) => {
|
|
177
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
178
|
+
if (isLikelyContextOverflowError(msg)) {
|
|
179
|
+
log.warn("context overflow detected");
|
|
180
|
+
if (config.memory?.enabled !== false &&
|
|
181
|
+
shouldRunMemoryFlush({
|
|
182
|
+
estimatedTokens: ctxInfo.tokens,
|
|
183
|
+
contextWindowTokens: ctxInfo.tokens,
|
|
184
|
+
sessionId,
|
|
185
|
+
state: memoryFlushState,
|
|
186
|
+
})) {
|
|
187
|
+
log.info("running pre-compaction memory flush");
|
|
188
|
+
markMemoryFlushed(memoryFlushState, sessionId);
|
|
189
|
+
run({
|
|
190
|
+
message: MEMORY_FLUSH_PROMPT,
|
|
191
|
+
sessionId,
|
|
192
|
+
model: modelId,
|
|
193
|
+
provider,
|
|
194
|
+
apiKey,
|
|
195
|
+
systemPrompt: MEMORY_FLUSH_SYSTEM_PROMPT,
|
|
196
|
+
enableSubagents: false,
|
|
197
|
+
maxRetries: 1,
|
|
198
|
+
}).catch((flushErr) => {
|
|
199
|
+
log.warn(`memory flush failed: ${flushErr instanceof Error ? flushErr.message : String(flushErr)}`);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
return isRateLimitErrorMessage(msg) || isTimeoutErrorMessage(msg);
|
|
205
|
+
},
|
|
206
|
+
onRetry: ({ attempt, err }) => {
|
|
207
|
+
log.warn(`retry attempt ${attempt}: ${err instanceof Error ? err.message : String(err)}`);
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
finally {
|
|
212
|
+
if (previousEnvValue === undefined) {
|
|
213
|
+
delete process.env[envKey];
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
process.env[envKey] = previousEnvValue;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (uniqueKeys.length > 1) {
|
|
221
|
+
return executeWithApiKeyRotation({
|
|
222
|
+
provider,
|
|
223
|
+
apiKeys: uniqueKeys,
|
|
224
|
+
execute: runWithKey,
|
|
225
|
+
});
|
|
90
226
|
}
|
|
227
|
+
return runWithKey(uniqueKeys[0] ?? "");
|
|
91
228
|
}
|
|
229
|
+
const fallbackResult = await runWithModelFallback({
|
|
230
|
+
provider: requestedProvider,
|
|
231
|
+
model: requestedModelId,
|
|
232
|
+
fallbacks: options.fallbacks,
|
|
233
|
+
run: executeWithModel,
|
|
234
|
+
});
|
|
92
235
|
await hooks.run("after_agent_end", {
|
|
93
236
|
sessionId,
|
|
94
|
-
result:
|
|
237
|
+
result: fallbackResult.result.response,
|
|
95
238
|
});
|
|
96
239
|
await hooks.run("session_end", { sessionId });
|
|
97
|
-
updateSession(stateDir, sessionId, {
|
|
98
|
-
|
|
240
|
+
await updateSession(stateDir, sessionId, {
|
|
241
|
+
model: fallbackResult.model,
|
|
242
|
+
});
|
|
243
|
+
return {
|
|
244
|
+
...fallbackResult.result,
|
|
245
|
+
fallbackUsed: fallbackResult.attempts.length > 0,
|
|
246
|
+
};
|
|
99
247
|
}
|
|
100
248
|
return { run, hooks, memory, config };
|
|
101
249
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/runtime/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,WAAW,GAKZ,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAA4B,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAsB,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EACL,UAAU,EACV,eAAe,GAEhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/runtime/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare function collectProviderApiKeys(provider: string): string[];
|
|
2
|
+
export declare function isApiKeyRateLimitError(message: string): boolean;
|
|
3
|
+
export declare function isAnthropicBillingError(message: string): boolean;
|
|
4
|
+
export declare function collectProviderApiKeysForExecution(params: {
|
|
5
|
+
provider: string;
|
|
6
|
+
primaryApiKey?: string;
|
|
7
|
+
}): string[];
|
|
8
|
+
export interface ApiKeyRotationOptions<T> {
|
|
9
|
+
provider: string;
|
|
10
|
+
apiKeys: string[];
|
|
11
|
+
execute: (apiKey: string) => Promise<T>;
|
|
12
|
+
shouldRetry?: (params: {
|
|
13
|
+
apiKey: string;
|
|
14
|
+
error: unknown;
|
|
15
|
+
attempt: number;
|
|
16
|
+
message: string;
|
|
17
|
+
}) => boolean;
|
|
18
|
+
onRetry?: (params: {
|
|
19
|
+
apiKey: string;
|
|
20
|
+
error: unknown;
|
|
21
|
+
attempt: number;
|
|
22
|
+
message: string;
|
|
23
|
+
}) => void;
|
|
24
|
+
}
|
|
25
|
+
export declare function executeWithApiKeyRotation<T>(params: ApiKeyRotationOptions<T>): Promise<T>;
|
|
26
|
+
//# sourceMappingURL=api-key-rotation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-key-rotation.d.ts","sourceRoot":"","sources":["../../src/runtime/api-key-rotation.ts"],"names":[],"mappings":"AAmFA,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAyBjE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAS/D;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAWhE;AAgBD,wBAAgB,kCAAkC,CAAC,MAAM,EAAE;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,EAAE,CAGX;AAOD,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,KAAK,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,KAAK,IAAI,CAAC;CACZ;AAED,wBAAsB,yBAAyB,CAAC,CAAC,EAC/C,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC,CA2BZ"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// Ported from OpenClaw src/agents/api-key-rotation.ts + src/agents/live-auth-keys.ts
|
|
2
|
+
// --- Key collection (from live-auth-keys.ts) ---
|
|
3
|
+
const KEY_SPLIT_RE = /[\s,;]+/g;
|
|
4
|
+
const PROVIDER_PREFIX_OVERRIDES = {
|
|
5
|
+
google: "GEMINI",
|
|
6
|
+
"google-vertex": "GEMINI",
|
|
7
|
+
};
|
|
8
|
+
const PROVIDER_API_KEY_CONFIG = {
|
|
9
|
+
anthropic: {
|
|
10
|
+
liveSingle: "BULKHEAD_LIVE_ANTHROPIC_KEY",
|
|
11
|
+
listVar: "BULKHEAD_LIVE_ANTHROPIC_KEYS",
|
|
12
|
+
primaryVar: "ANTHROPIC_API_KEY",
|
|
13
|
+
prefixedVar: "ANTHROPIC_API_KEY_",
|
|
14
|
+
},
|
|
15
|
+
google: {
|
|
16
|
+
liveSingle: "BULKHEAD_LIVE_GEMINI_KEY",
|
|
17
|
+
listVar: "GEMINI_API_KEYS",
|
|
18
|
+
primaryVar: "GEMINI_API_KEY",
|
|
19
|
+
prefixedVar: "GEMINI_API_KEY_",
|
|
20
|
+
},
|
|
21
|
+
"google-vertex": {
|
|
22
|
+
liveSingle: "BULKHEAD_LIVE_GEMINI_KEY",
|
|
23
|
+
listVar: "GEMINI_API_KEYS",
|
|
24
|
+
primaryVar: "GEMINI_API_KEY",
|
|
25
|
+
prefixedVar: "GEMINI_API_KEY_",
|
|
26
|
+
},
|
|
27
|
+
openai: {
|
|
28
|
+
liveSingle: "BULKHEAD_LIVE_OPENAI_KEY",
|
|
29
|
+
listVar: "OPENAI_API_KEYS",
|
|
30
|
+
primaryVar: "OPENAI_API_KEY",
|
|
31
|
+
prefixedVar: "OPENAI_API_KEY_",
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
function normalizeProviderId(raw) {
|
|
35
|
+
return raw.trim().toLowerCase().replace(/[^a-z0-9-]/g, "");
|
|
36
|
+
}
|
|
37
|
+
function parseKeyList(raw) {
|
|
38
|
+
if (!raw)
|
|
39
|
+
return [];
|
|
40
|
+
return raw.split(KEY_SPLIT_RE).map((v) => v.trim()).filter(Boolean);
|
|
41
|
+
}
|
|
42
|
+
function collectEnvPrefixedKeys(prefix) {
|
|
43
|
+
const keys = [];
|
|
44
|
+
for (const [name, value] of Object.entries(process.env)) {
|
|
45
|
+
if (!name.startsWith(prefix))
|
|
46
|
+
continue;
|
|
47
|
+
const trimmed = value?.trim();
|
|
48
|
+
if (!trimmed)
|
|
49
|
+
continue;
|
|
50
|
+
keys.push(trimmed);
|
|
51
|
+
}
|
|
52
|
+
return keys;
|
|
53
|
+
}
|
|
54
|
+
function resolveProviderApiKeyConfig(provider) {
|
|
55
|
+
const normalized = normalizeProviderId(provider);
|
|
56
|
+
const custom = PROVIDER_API_KEY_CONFIG[normalized];
|
|
57
|
+
const base = PROVIDER_PREFIX_OVERRIDES[normalized] ?? normalized.toUpperCase().replace(/-/g, "_");
|
|
58
|
+
const liveSingle = custom?.liveSingle ?? `BULKHEAD_LIVE_${base}_KEY`;
|
|
59
|
+
const listVar = custom?.listVar ?? `${base}_API_KEYS`;
|
|
60
|
+
const primaryVar = custom?.primaryVar ?? `${base}_API_KEY`;
|
|
61
|
+
const prefixedVar = custom?.prefixedVar ?? `${base}_API_KEY_`;
|
|
62
|
+
if (normalized === "google" || normalized === "google-vertex") {
|
|
63
|
+
return { liveSingle, listVar, primaryVar, prefixedVar, fallbackVars: ["GOOGLE_API_KEY"] };
|
|
64
|
+
}
|
|
65
|
+
return { liveSingle, listVar, primaryVar, prefixedVar, fallbackVars: [] };
|
|
66
|
+
}
|
|
67
|
+
export function collectProviderApiKeys(provider) {
|
|
68
|
+
const config = resolveProviderApiKeyConfig(provider);
|
|
69
|
+
const forcedSingle = config.liveSingle ? process.env[config.liveSingle]?.trim() : undefined;
|
|
70
|
+
if (forcedSingle)
|
|
71
|
+
return [forcedSingle];
|
|
72
|
+
const fromList = parseKeyList(config.listVar ? process.env[config.listVar] : undefined);
|
|
73
|
+
const primary = config.primaryVar ? process.env[config.primaryVar]?.trim() : undefined;
|
|
74
|
+
const fromPrefixed = config.prefixedVar ? collectEnvPrefixedKeys(config.prefixedVar) : [];
|
|
75
|
+
const fallback = config.fallbackVars
|
|
76
|
+
.map((envVar) => process.env[envVar]?.trim())
|
|
77
|
+
.filter(Boolean);
|
|
78
|
+
const seen = new Set();
|
|
79
|
+
const add = (value) => {
|
|
80
|
+
if (!value || seen.has(value))
|
|
81
|
+
return;
|
|
82
|
+
seen.add(value);
|
|
83
|
+
};
|
|
84
|
+
for (const value of fromList)
|
|
85
|
+
add(value);
|
|
86
|
+
add(primary);
|
|
87
|
+
for (const value of fromPrefixed)
|
|
88
|
+
add(value);
|
|
89
|
+
for (const value of fallback)
|
|
90
|
+
add(value);
|
|
91
|
+
return Array.from(seen);
|
|
92
|
+
}
|
|
93
|
+
export function isApiKeyRateLimitError(message) {
|
|
94
|
+
const lower = message.toLowerCase();
|
|
95
|
+
if (lower.includes("rate_limit"))
|
|
96
|
+
return true;
|
|
97
|
+
if (lower.includes("rate limit"))
|
|
98
|
+
return true;
|
|
99
|
+
if (lower.includes("429"))
|
|
100
|
+
return true;
|
|
101
|
+
if (lower.includes("quota exceeded") || lower.includes("quota_exceeded"))
|
|
102
|
+
return true;
|
|
103
|
+
if (lower.includes("resource exhausted") || lower.includes("resource_exhausted"))
|
|
104
|
+
return true;
|
|
105
|
+
if (lower.includes("too many requests"))
|
|
106
|
+
return true;
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
export function isAnthropicBillingError(message) {
|
|
110
|
+
const lower = message.toLowerCase();
|
|
111
|
+
if (lower.includes("credit balance"))
|
|
112
|
+
return true;
|
|
113
|
+
if (lower.includes("insufficient credit"))
|
|
114
|
+
return true;
|
|
115
|
+
if (lower.includes("insufficient credits"))
|
|
116
|
+
return true;
|
|
117
|
+
if (lower.includes("payment required"))
|
|
118
|
+
return true;
|
|
119
|
+
if (lower.includes("billing") && lower.includes("disabled"))
|
|
120
|
+
return true;
|
|
121
|
+
if (/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|\b(?:got|returned|received)\s+(?:a\s+)?402\b|^\s*402\spayment/i.test(lower))
|
|
122
|
+
return true;
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
// --- API key rotation (from api-key-rotation.ts) ---
|
|
126
|
+
function dedupeApiKeys(raw) {
|
|
127
|
+
const seen = new Set();
|
|
128
|
+
const keys = [];
|
|
129
|
+
for (const value of raw) {
|
|
130
|
+
const apiKey = value.trim();
|
|
131
|
+
if (!apiKey || seen.has(apiKey))
|
|
132
|
+
continue;
|
|
133
|
+
seen.add(apiKey);
|
|
134
|
+
keys.push(apiKey);
|
|
135
|
+
}
|
|
136
|
+
return keys;
|
|
137
|
+
}
|
|
138
|
+
export function collectProviderApiKeysForExecution(params) {
|
|
139
|
+
const { primaryApiKey, provider } = params;
|
|
140
|
+
return dedupeApiKeys([primaryApiKey?.trim() ?? "", ...collectProviderApiKeys(provider)]);
|
|
141
|
+
}
|
|
142
|
+
function formatErrorMessage(error) {
|
|
143
|
+
if (error instanceof Error)
|
|
144
|
+
return error.message;
|
|
145
|
+
return String(error);
|
|
146
|
+
}
|
|
147
|
+
export async function executeWithApiKeyRotation(params) {
|
|
148
|
+
const keys = dedupeApiKeys(params.apiKeys);
|
|
149
|
+
if (keys.length === 0) {
|
|
150
|
+
throw new Error(`No API keys configured for provider "${params.provider}".`);
|
|
151
|
+
}
|
|
152
|
+
let lastError;
|
|
153
|
+
for (let attempt = 0; attempt < keys.length; attempt += 1) {
|
|
154
|
+
const apiKey = keys[attempt];
|
|
155
|
+
try {
|
|
156
|
+
return await params.execute(apiKey);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
lastError = error;
|
|
160
|
+
const message = formatErrorMessage(error);
|
|
161
|
+
const retryable = params.shouldRetry
|
|
162
|
+
? params.shouldRetry({ apiKey, error, attempt, message })
|
|
163
|
+
: isApiKeyRateLimitError(message);
|
|
164
|
+
if (!retryable || attempt + 1 >= keys.length)
|
|
165
|
+
break;
|
|
166
|
+
params.onRetry?.({ apiKey, error, attempt, message });
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (lastError === undefined) {
|
|
170
|
+
throw new Error(`Failed to run API request for ${params.provider}.`);
|
|
171
|
+
}
|
|
172
|
+
throw lastError;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=api-key-rotation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-key-rotation.js","sourceRoot":"","sources":["../../src/runtime/api-key-rotation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare const CONTEXT_WINDOW_HARD_MIN_TOKENS = 16000;
|
|
2
|
+
export declare const CONTEXT_WINDOW_WARN_BELOW_TOKENS = 32000;
|
|
3
|
+
export type ContextWindowSource = "model" | "modelsConfig" | "agentContextTokens" | "default";
|
|
4
|
+
export interface ContextWindowInfo {
|
|
5
|
+
tokens: number;
|
|
6
|
+
source: ContextWindowSource;
|
|
7
|
+
}
|
|
8
|
+
export interface ContextWindowGuardResult extends ContextWindowInfo {
|
|
9
|
+
shouldWarn: boolean;
|
|
10
|
+
shouldBlock: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function resolveContextWindowInfo(params: {
|
|
13
|
+
modelContextWindow?: number;
|
|
14
|
+
configContextTokens?: number;
|
|
15
|
+
modelsProviderConfig?: Array<{
|
|
16
|
+
id?: string;
|
|
17
|
+
contextWindow?: number;
|
|
18
|
+
}>;
|
|
19
|
+
modelId?: string;
|
|
20
|
+
defaultTokens?: number;
|
|
21
|
+
}): ContextWindowInfo;
|
|
22
|
+
export declare function evaluateContextWindowGuard(params: {
|
|
23
|
+
info: ContextWindowInfo;
|
|
24
|
+
warnBelowTokens?: number;
|
|
25
|
+
hardMinTokens?: number;
|
|
26
|
+
}): ContextWindowGuardResult;
|
|
27
|
+
export declare function estimateTokens(text: string): number;
|
|
28
|
+
export declare function estimateMessagesTokens(messages: Array<{
|
|
29
|
+
role: string;
|
|
30
|
+
content: string;
|
|
31
|
+
}>): number;
|
|
32
|
+
//# sourceMappingURL=context-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-guard.d.ts","sourceRoot":"","sources":["../../src/runtime/context-guard.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,8BAA8B,QAAS,CAAC;AACrD,eAAO,MAAM,gCAAgC,QAAS,CAAC;AAKvD,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,cAAc,GAAG,oBAAoB,GAAG,SAAS,CAAC;AAE9F,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAyB,SAAQ,iBAAiB;IACjE,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAQD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC/C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,iBAAiB,CAmBpB;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,IAAI,EAAE,iBAAiB,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,wBAAwB,CAyB3B;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACjD,MAAM,CAMR"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Ported from OpenClaw src/agents/context-window-guard.ts
|
|
2
|
+
// Identical thresholds (16K hard min, 32K warn) and resolution logic.
|
|
3
|
+
import { createSubsystemLogger } from "../logging/subsystem.js";
|
|
4
|
+
const log = createSubsystemLogger("context-guard");
|
|
5
|
+
export const CONTEXT_WINDOW_HARD_MIN_TOKENS = 16_000;
|
|
6
|
+
export const CONTEXT_WINDOW_WARN_BELOW_TOKENS = 32_000;
|
|
7
|
+
const DEFAULT_CONTEXT_TOKENS = 128_000;
|
|
8
|
+
const CHARS_PER_TOKEN = 4;
|
|
9
|
+
function normalizePositiveInt(value) {
|
|
10
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
11
|
+
return null;
|
|
12
|
+
const int = Math.floor(value);
|
|
13
|
+
return int > 0 ? int : null;
|
|
14
|
+
}
|
|
15
|
+
export function resolveContextWindowInfo(params) {
|
|
16
|
+
// Check models.providers config first (highest priority override)
|
|
17
|
+
if (params.modelsProviderConfig && params.modelId) {
|
|
18
|
+
const match = params.modelsProviderConfig.find((m) => m?.id === params.modelId);
|
|
19
|
+
const fromConfig = normalizePositiveInt(match?.contextWindow);
|
|
20
|
+
if (fromConfig)
|
|
21
|
+
return { tokens: fromConfig, source: "modelsConfig" };
|
|
22
|
+
}
|
|
23
|
+
const fromModel = normalizePositiveInt(params.modelContextWindow);
|
|
24
|
+
const baseInfo = fromModel
|
|
25
|
+
? { tokens: fromModel, source: "model" }
|
|
26
|
+
: { tokens: Math.floor(params.defaultTokens ?? DEFAULT_CONTEXT_TOKENS), source: "default" };
|
|
27
|
+
const capTokens = normalizePositiveInt(params.configContextTokens);
|
|
28
|
+
if (capTokens && capTokens < baseInfo.tokens) {
|
|
29
|
+
return { tokens: capTokens, source: "agentContextTokens" };
|
|
30
|
+
}
|
|
31
|
+
return baseInfo;
|
|
32
|
+
}
|
|
33
|
+
export function evaluateContextWindowGuard(params) {
|
|
34
|
+
const warnBelow = Math.max(1, Math.floor(params.warnBelowTokens ?? CONTEXT_WINDOW_WARN_BELOW_TOKENS));
|
|
35
|
+
const hardMin = Math.max(1, Math.floor(params.hardMinTokens ?? CONTEXT_WINDOW_HARD_MIN_TOKENS));
|
|
36
|
+
const tokens = Math.max(0, Math.floor(params.info.tokens));
|
|
37
|
+
const result = {
|
|
38
|
+
...params.info,
|
|
39
|
+
tokens,
|
|
40
|
+
shouldWarn: tokens > 0 && tokens < warnBelow,
|
|
41
|
+
shouldBlock: tokens > 0 && tokens < hardMin,
|
|
42
|
+
};
|
|
43
|
+
if (result.shouldBlock) {
|
|
44
|
+
log.error(`context window too small: ${tokens} tokens (minimum: ${hardMin})`);
|
|
45
|
+
}
|
|
46
|
+
else if (result.shouldWarn) {
|
|
47
|
+
log.warn(`context window is small: ${tokens} tokens (recommended: >${warnBelow})`);
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
export function estimateTokens(text) {
|
|
52
|
+
return Math.ceil(text.length / CHARS_PER_TOKEN);
|
|
53
|
+
}
|
|
54
|
+
export function estimateMessagesTokens(messages) {
|
|
55
|
+
let total = 0;
|
|
56
|
+
for (const msg of messages) {
|
|
57
|
+
total += estimateTokens(msg.content ?? "") + 4;
|
|
58
|
+
}
|
|
59
|
+
return total;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=context-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-guard.js","sourceRoot":"","sources":["../../src/runtime/context-guard.ts"],"names":[],"mappings":"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"}
|