gsd-pi 2.82.0-dev.9d5798940 → 2.82.0-dev.dfbc5f58f
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 +2 -2
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +7 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
- package/dist/resources/extensions/gsd/auto/loop.js +5 -5
- package/dist/resources/extensions/gsd/auto/orchestrator.js +11 -0
- package/dist/resources/extensions/gsd/auto/phases.js +8 -1
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
- package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
- package/dist/resources/extensions/gsd/auto-start.js +78 -9
- package/dist/resources/extensions/gsd/auto-worktree.js +15 -1
- package/dist/resources/extensions/gsd/auto.js +30 -3
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +9 -8
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +5 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +31 -5
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +1 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -2
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor.js +2 -28
- package/dist/resources/extensions/gsd/git-service.js +39 -1
- package/dist/resources/extensions/gsd/gsd-db.js +1 -0
- package/dist/resources/extensions/gsd/guided-flow.js +6 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +40 -9
- package/dist/resources/extensions/gsd/post-execution-checks.js +73 -2
- package/dist/resources/extensions/gsd/pre-execution-checks.js +28 -1
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/status-guards.js +4 -0
- package/dist/resources/extensions/gsd/templates/plan.md +8 -5
- package/dist/resources/extensions/gsd/templates/task-plan.md +4 -2
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
- package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +88 -14
- package/dist/resources/extensions/gsd/validation.js +23 -1
- package/dist/resources/extensions/gsd/verification-gate.js +68 -7
- package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +5 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools.test.ts +1 -1
- package/packages/native/tsconfig.json +2 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +5 -6
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
- package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
- package/packages/pi-ai/src/providers/simple-options.ts +5 -6
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/src/resources/GSD-WORKFLOW.md +7 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +14 -6
- package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
- package/src/resources/extensions/gsd/auto/loop.ts +8 -5
- package/src/resources/extensions/gsd/auto/orchestrator.ts +11 -0
- package/src/resources/extensions/gsd/auto/phases.ts +7 -1
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
- package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
- package/src/resources/extensions/gsd/auto-start.ts +85 -6
- package/src/resources/extensions/gsd/auto-worktree.ts +15 -1
- package/src/resources/extensions/gsd/auto.ts +32 -3
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +9 -8
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +3 -1
- package/src/resources/extensions/gsd/crash-recovery.ts +30 -4
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +1 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -2
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor.ts +2 -27
- package/src/resources/extensions/gsd/git-service.ts +45 -1
- package/src/resources/extensions/gsd/gsd-db.ts +3 -0
- package/src/resources/extensions/gsd/guided-flow.ts +6 -0
- package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +46 -9
- package/src/resources/extensions/gsd/post-execution-checks.ts +87 -2
- package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/status-guards.ts +5 -0
- package/src/resources/extensions/gsd/templates/plan.md +8 -5
- package/src/resources/extensions/gsd/templates/task-plan.md +4 -2
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +80 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +43 -2
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +103 -1
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +200 -1
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +26 -2
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +110 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +7 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
- package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
- package/src/resources/extensions/gsd/tools/plan-slice.ts +96 -12
- package/src/resources/extensions/gsd/types.ts +1 -1
- package/src/resources/extensions/gsd/validation.ts +23 -1
- package/src/resources/extensions/gsd/verification-gate.ts +78 -6
- package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -1
- /package/dist/web/standalone/.next/static/{BdZQhe8yKl6bdKLiXVEzh → q0WYuDVbHeFFYbdd-fei2}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{BdZQhe8yKl6bdKLiXVEzh → q0WYuDVbHeFFYbdd-fei2}/_ssgManifest.js +0 -0
|
@@ -89,6 +89,94 @@ function isRetryableError(status: number, errorText: string): boolean {
|
|
|
89
89
|
return /rate.?limit|overloaded|service.?unavailable|upstream.?connect|connection.?refused/i.test(errorText);
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
+
function extractRetryDelay(errorText: string, response?: Response | Headers): number | undefined {
|
|
93
|
+
const normalizeDelay = (ms: number): number | undefined => (ms > 0 ? Math.ceil(ms) : undefined);
|
|
94
|
+
|
|
95
|
+
const headers = response instanceof Headers ? response : response?.headers;
|
|
96
|
+
if (headers) {
|
|
97
|
+
const retryAfter = headers.get("retry-after");
|
|
98
|
+
if (retryAfter) {
|
|
99
|
+
const retryAfterSeconds = Number(retryAfter);
|
|
100
|
+
if (Number.isFinite(retryAfterSeconds)) {
|
|
101
|
+
const delay = normalizeDelay(retryAfterSeconds * 1000);
|
|
102
|
+
if (delay !== undefined) {
|
|
103
|
+
return delay;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const retryAfterDate = new Date(retryAfter).getTime();
|
|
108
|
+
if (!Number.isNaN(retryAfterDate)) {
|
|
109
|
+
const delay = normalizeDelay(retryAfterDate - Date.now());
|
|
110
|
+
if (delay !== undefined) {
|
|
111
|
+
return delay;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const rateLimitReset = headers.get("x-ratelimit-reset");
|
|
117
|
+
if (rateLimitReset) {
|
|
118
|
+
const resetSeconds = Number.parseInt(rateLimitReset, 10);
|
|
119
|
+
if (!Number.isNaN(resetSeconds)) {
|
|
120
|
+
const delay = normalizeDelay(resetSeconds * 1000 - Date.now());
|
|
121
|
+
if (delay !== undefined) {
|
|
122
|
+
return delay;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const rateLimitResetAfter = headers.get("x-ratelimit-reset-after");
|
|
128
|
+
if (rateLimitResetAfter) {
|
|
129
|
+
const resetAfterSeconds = Number(rateLimitResetAfter);
|
|
130
|
+
if (Number.isFinite(resetAfterSeconds)) {
|
|
131
|
+
const delay = normalizeDelay(resetAfterSeconds * 1000);
|
|
132
|
+
if (delay !== undefined) {
|
|
133
|
+
return delay;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const durationMatch = errorText.match(/reset after (?:(\d+)h)?(?:(\d+)m)?(\d+(?:\.\d+)?)s/i);
|
|
140
|
+
if (durationMatch) {
|
|
141
|
+
const hours = durationMatch[1] ? parseInt(durationMatch[1], 10) : 0;
|
|
142
|
+
const minutes = durationMatch[2] ? parseInt(durationMatch[2], 10) : 0;
|
|
143
|
+
const seconds = parseFloat(durationMatch[3]);
|
|
144
|
+
if (!Number.isNaN(seconds)) {
|
|
145
|
+
const totalMs = ((hours * 60 + minutes) * 60 + seconds) * 1000;
|
|
146
|
+
const delay = normalizeDelay(totalMs);
|
|
147
|
+
if (delay !== undefined) {
|
|
148
|
+
return delay;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const retryInMatch = errorText.match(/Please retry in ([0-9.]+)(ms|s)/i);
|
|
154
|
+
if (retryInMatch?.[1]) {
|
|
155
|
+
const value = parseFloat(retryInMatch[1]);
|
|
156
|
+
if (!Number.isNaN(value) && value > 0) {
|
|
157
|
+
const ms = retryInMatch[2].toLowerCase() === "ms" ? value : value * 1000;
|
|
158
|
+
const delay = normalizeDelay(ms);
|
|
159
|
+
if (delay !== undefined) {
|
|
160
|
+
return delay;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const retryDelayMatch = errorText.match(/"retryDelay":\s*"([0-9.]+)(ms|s)"/i);
|
|
166
|
+
if (retryDelayMatch?.[1]) {
|
|
167
|
+
const value = parseFloat(retryDelayMatch[1]);
|
|
168
|
+
if (!Number.isNaN(value) && value > 0) {
|
|
169
|
+
const ms = retryDelayMatch[2].toLowerCase() === "ms" ? value : value * 1000;
|
|
170
|
+
const delay = normalizeDelay(ms);
|
|
171
|
+
if (delay !== undefined) {
|
|
172
|
+
return delay;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
|
|
92
180
|
function sleep(ms: number, signal?: AbortSignal): Promise<void> {
|
|
93
181
|
return new Promise((resolve, reject) => {
|
|
94
182
|
if (signal?.aborted) {
|
|
@@ -205,7 +293,9 @@ export const streamOpenAICodexResponses: StreamFunction<"openai-codex-responses"
|
|
|
205
293
|
|
|
206
294
|
const errorText = await response.text();
|
|
207
295
|
if (attempt < MAX_RETRIES && isRetryableError(response.status, errorText)) {
|
|
208
|
-
const
|
|
296
|
+
const backoffMs = BASE_DELAY_MS * 2 ** attempt;
|
|
297
|
+
const serverDelayMs = extractRetryDelay(errorText, response);
|
|
298
|
+
const delayMs = Math.max(backoffMs, serverDelayMs ?? 0);
|
|
209
299
|
await sleep(delayMs, options?.signal);
|
|
210
300
|
continue;
|
|
211
301
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describe, test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
|
|
4
|
+
import { buildBaseOptions, defaultMaxTokens } from "./simple-options.js";
|
|
5
|
+
import type { Api, Model } from "../types.js";
|
|
6
|
+
|
|
7
|
+
function makeModel(overrides: Partial<Model<Api>> = {}): Model<Api> {
|
|
8
|
+
return {
|
|
9
|
+
id: "test-model",
|
|
10
|
+
name: "Test Model",
|
|
11
|
+
api: "bedrock-converse-stream",
|
|
12
|
+
provider: "amazon-bedrock",
|
|
13
|
+
baseUrl: "",
|
|
14
|
+
reasoning: false,
|
|
15
|
+
input: ["text"],
|
|
16
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
17
|
+
contextWindow: 16384,
|
|
18
|
+
maxTokens: 16384,
|
|
19
|
+
...overrides,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
describe("defaultMaxTokens", () => {
|
|
24
|
+
test("leaves prompt room when a non-Anthropic model declares output equal to context", () => {
|
|
25
|
+
const model = makeModel({
|
|
26
|
+
id: "qwen.qwen3-32b-v1:0",
|
|
27
|
+
contextWindow: 16384,
|
|
28
|
+
maxTokens: 16384,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
assert.equal(defaultMaxTokens(model), 8192);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("preserves smaller declared output windows", () => {
|
|
35
|
+
const model = makeModel({
|
|
36
|
+
contextWindow: 32000,
|
|
37
|
+
maxTokens: 8192,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
assert.equal(defaultMaxTokens(model), 8192);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test("keeps the native Anthropic 32k ceiling within the context cap", () => {
|
|
44
|
+
const model = makeModel({
|
|
45
|
+
api: "anthropic-messages",
|
|
46
|
+
provider: "anthropic",
|
|
47
|
+
contextWindow: 200000,
|
|
48
|
+
maxTokens: 64000,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
assert.equal(defaultMaxTokens(model), 32000);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("honors explicit maxTokens", () => {
|
|
55
|
+
const model = makeModel();
|
|
56
|
+
const options = buildBaseOptions(model, { maxTokens: 12000 });
|
|
57
|
+
|
|
58
|
+
assert.equal(options.maxTokens, 12000);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
@@ -4,16 +4,15 @@ import type { Api, Model, SimpleStreamOptions, StreamOptions, ThinkingBudgets, T
|
|
|
4
4
|
* Compute the default maxTokens for a model when no explicit value is provided.
|
|
5
5
|
*
|
|
6
6
|
* The 32 k cap is retained only for native Anthropic models (api === "anthropic-messages")
|
|
7
|
-
* where the Anthropic API historically rejected higher values.
|
|
8
|
-
*
|
|
9
|
-
* declared model.maxTokens directly so that providers with larger output windows
|
|
10
|
-
* (131 072 tokens, etc.) are not silently capped.
|
|
7
|
+
* where the Anthropic API historically rejected higher values. Defaults also
|
|
8
|
+
* leave at least half the context window available for prompts.
|
|
11
9
|
*/
|
|
12
10
|
export function defaultMaxTokens(model: Model<Api>): number {
|
|
11
|
+
const contextCappedMaxTokens = Math.max(1, Math.floor(model.contextWindow / 2));
|
|
13
12
|
if (model.api === "anthropic-messages") {
|
|
14
|
-
return Math.min(model.maxTokens, 32000);
|
|
13
|
+
return Math.min(model.maxTokens, 32000, contextCappedMaxTokens);
|
|
15
14
|
}
|
|
16
|
-
return model.maxTokens;
|
|
15
|
+
return Math.min(model.maxTokens, contextCappedMaxTokens);
|
|
17
16
|
}
|
|
18
17
|
|
|
19
18
|
export function buildBaseOptions(model: Model<Api>, options?: SimpleStreamOptions, apiKey?: string): StreamOptions {
|