pi-mono/packages/ai/test
David Brailovsky 32850ef7c5
fix(coding-agent): resume after context-limited length stops (#7540)
* fix(coding-agent): resume after context-limited length stops

Treat length stops as context overflow when prompt usage is within 1% of
Pi's configured context window. Include cache-write tokens in that usage
and allow non-zero output because OpenAI may emit reasoning tokens before
returning an incomplete response.

After compaction, remove any retryable error or truncated-length assistant
message restored from persisted session history so the interrupted agent
turn can continue.

This is specifically for handling this case for openai models:
https://developers.openai.com/api/docs/guides/reasoning

> If the generated tokens reach the context window limit or the max_output_tokens value you’ve set, you’ll receive a response with a status of incomplete and incomplete_details with reason set to max_output_tokens. This might occur before any visible output tokens are produced, meaning you could incur costs for input and reasoning tokens without receiving a visible response.

This detection currently assumes the reported prompt usage is within 1% of
the context window configured in Pi. Its reliability therefore depends on
Pi's model contextWindow metadata matching the provider's effective limit.

Maybe we should consider treating OpenAI incomplete responses as requiring compaction
regardless of the local context-window estimate?

fixes #7020

* fix(coding-agent): recover truncated responses after compaction

Classify length stops by comparing provider-reported output usage with the model's intended output limit. Compact and retry once when generation ends below that limit, avoiding unreliable context-window estimates while preserving genuine max-output stops.

Normalize OpenAI Responses incomplete reasons so only max_output_tokens is treated as a length stop. Preserve qualified provider reasons for diagnostics, surface other reasons as errors, and use neutral truncation wording in the TUI.
2026-08-03 18:07:53 +02:00
..
data feat(ai): Add image input tests for vision-capable models 2025-08-30 18:37:17 +02:00
abort.test.ts feat(ai): add Baseten provider 2026-08-03 14:33:21 +02:00
anthropic-adaptive-thinking-models.test.ts fix tests 2026-07-24 19:05:08 +00:00
anthropic-auth-token.test.ts fix(ai): support Anthropic bearer token env (#6148) 2026-07-24 15:13:22 +02:00
anthropic-cache-write-1h-cost.test.ts Merge main into model-registry 2026-06-22 14:00:18 +02:00
anthropic-eager-tool-input-compat.test.ts feat(ai): support constrained sampling (#6341) 2026-07-23 23:48:40 +02:00
anthropic-eager-tool-input-e2e.test.ts fix(ai): type Anthropic probes by catalog providers 2026-07-14 12:29:38 +02:00
anthropic-empty-thinking-signature-compat.test.ts buildfix: fix tests referencing old models 2026-07-17 13:24:11 +00:00
anthropic-force-adaptive-thinking.test.ts kimi: add low,high to k3 and remove k2p7 references 2026-07-20 09:00:15 +00:00
anthropic-long-cache-retention-e2e.test.ts fix(ai): type Anthropic probes by catalog providers 2026-07-14 12:29:38 +02:00
anthropic-oauth.test.ts feat(coding-agent): replace model registry with model runtime 2026-07-14 17:48:45 +02:00
anthropic-opus-4-8-smoke.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00
anthropic-sse-parsing.test.ts fix(ai): preserve Anthropic initial stream block content (#7358) 2026-07-31 10:39:38 +02:00
anthropic-temperature-compat.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00
anthropic-thinking-disable.test.ts fix(ai): update generated model catalogue 2026-06-30 22:12:48 +02:00
anthropic-tool-name-normalization.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00
azure-openai-base-url.test.ts feat(ai): support constrained sampling (#6341) 2026-07-23 23:48:40 +02:00
azure-openai-responses-reasoning-replay.test.ts feat(ai): expose pending stop reason while streaming (#7151) 2026-07-27 11:56:15 +02:00
azure-utils.ts add Azure deployment name map and refresh generated models 2026-01-24 12:04:34 +01:00
baseten-models.test.ts feat(ai): add Baseten provider 2026-08-03 14:33:21 +02:00
bedrock-convert-messages.test.ts feat(ai): support constrained sampling (#6341) 2026-07-23 23:48:40 +02:00
bedrock-credentials.test.ts fix(ai): prefer configured Bedrock profile over ambient AWS keys (#7176) 2026-07-28 08:38:35 +02:00
bedrock-custom-headers.test.ts feat(ai): compat entrypoint, core-only root barrel (phase 5) 2026-06-10 21:17:12 +02:00
bedrock-endpoint-resolution.test.ts fix(ai): filter ambient auth markers in compat dispatch 2026-07-11 13:38:48 +02:00
bedrock-error-metadata.test.ts feat(ai): preserve structured metadata for Bedrock provider errors (#7286) 2026-07-30 22:32:20 +02:00
bedrock-models.test.ts feat(ai): support Claude Opus 5 on Bedrock (#7081) 2026-07-25 08:25:23 +02:00
bedrock-raw-stop-reason.test.ts update error messages copy to be more generic 2026-07-29 16:29:37 +00:00
bedrock-thinking-payload.test.ts feat(ai): support Claude Opus 5 on Bedrock (#7081) 2026-07-25 08:25:23 +02:00
bedrock-utils.ts feat(ai): Add Amazon Bedrock provider (#494) 2026-01-13 00:32:59 +01:00
cache-retention.test.ts fix(agent,ai): don't cache write compaction or branch summaries (#6618) 2026-07-23 23:03:23 +02:00
cloudflare-stream.test.ts feat(coding-agent): replace model registry with model runtime 2026-07-14 17:48:45 +02:00
cloudflare-utils.ts fix(ai): finalize cloudflare gateway provider support 2026-05-01 00:56:05 +02:00
codex-websocket-cached-probe.ts feat(coding-agent): replace model registry with model runtime 2026-07-14 17:48:45 +02:00
compat-env.test.ts feat(ai): complete models runtime migration 2026-06-23 15:29:46 +02:00
constrained-sampling.test.ts feat(ai): expose pending stop reason while streaming (#7151) 2026-07-27 11:56:15 +02:00
context-estimate.test.ts fix(ai): ignore stale usage after compaction 2026-07-09 21:44:53 +02:00
context-overflow.test.ts fix(ai): avoid stale Copilot model in overflow test 2026-08-03 17:20:49 +02:00
cross-provider-handoff.test.ts feat(ai): add Baseten provider 2026-08-03 14:33:21 +02:00
deferred-tools.test.ts feat(ai): add Baseten provider 2026-08-03 14:33:21 +02:00
empty.test.ts feat(ai): add Baseten provider 2026-08-03 14:33:21 +02:00
env-api-keys.test.ts fix(ai): support Anthropic bearer token env (#6148) 2026-07-24 15:13:22 +02:00
error-body.test.ts fix(ai): treat only plain objects as provider error bodies (#7205) 2026-07-31 09:38:54 +02:00
faux-provider.test.ts feat(ai): expose pending stop reason while streaming (#7151) 2026-07-27 11:56:15 +02:00
fetch-option.test.ts feat(ai): add per-request fetch injection 2026-07-28 18:51:44 +02:00
fireworks-models.test.ts fix(ai): route Fireworks Kimi K3 through OpenAI compatibility 2026-07-31 12:47:07 +02:00
github-copilot-anthropic.test.ts feat(ai): add GitHub Copilot Claude Opus 5 support (#7158) 2026-07-27 11:52:19 +02:00
github-copilot-oauth.test.ts feat(coding-agent): replace model registry with model runtime 2026-07-14 17:48:45 +02:00
google-raw-stop-reason.test.ts update error messages copy to be more generic 2026-07-29 16:29:37 +00:00
google-shared-convert-tools.test.ts feat(ai): support constrained sampling (#6341) 2026-07-23 23:48:40 +02:00
google-shared-gemini3-unsigned-tool-call.test.ts fix(ai): preserve Gemini 3 tool call IDs (#7494) 2026-08-03 13:45:01 +02:00
google-shared-image-tool-result-routing.test.ts feat(ai): move API implementations to src/api with lazy wrappers (phase 2) 2026-06-10 20:08:59 +02:00
google-shared-retry.test.ts fix(ai): retry transient provider errors in Google adapters (#7471) 2026-08-03 12:45:45 +02:00
google-shared-signed-empty-blocks.test.ts fix(ai): keep signed empty text/thinking blocks in google history (#7362) 2026-07-31 10:30:38 +02:00
google-thinking-disable.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00
google-thinking-signature.test.ts feat(ai): move API implementations to src/api with lazy wrappers (phase 2) 2026-06-10 20:08:59 +02:00
google-vertex-api-key-resolution.test.ts feat(ai): compat entrypoint, core-only root barrel (phase 5) 2026-06-10 21:17:12 +02:00
image-model-data.test.ts fix(ai): validate generated model data before builds 2026-07-20 22:29:06 +02:00
image-tool-result.test.ts feat(ai): add Baseten provider 2026-08-03 14:33:21 +02:00
images-models.test.ts feat(coding-agent): replace model registry with model runtime 2026-07-14 17:48:45 +02:00
images.test.ts chore: pin dependencies and use native TypeScript 2026-05-20 12:46:17 +02:00
interleaved-thinking.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00
kimi-coding-oauth.test.ts feat(ai): add Kimi Code subscription OAuth login (#6935) 2026-07-22 08:35:03 +02:00
lax-message-content.test.ts fix(ai,agent,coding-agent): normalize null message content at ingestion boundaries (#6343) 2026-07-06 20:47:08 +02:00
lazy-module-load.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00
max-thinking.test.ts feat(ai): add max thinking level 2026-07-09 22:30:53 +02:00
mistral-raw-stop-reason.test.ts update error messages copy to be more generic 2026-07-29 16:29:37 +00:00
mistral-reasoning-mode.test.ts Merge main into model-registry 2026-06-22 14:00:18 +02:00
mistral-tool-schema.test.ts feat(ai): support constrained sampling (#6341) 2026-07-23 23:48:40 +02:00
model-catalog-types.test.ts feat(ai): derive generated model types from JSON 2026-07-22 13:13:36 +02:00
model-data-validation.test.ts fix bundled models generation time 2026-07-23 13:34:51 +00:00
models-runtime.test.ts feat: auth print (#7168) 2026-07-27 16:13:06 +02:00
node-http-proxy.test.ts feat: add provider-scoped environment overrides (#5807) 2026-06-16 17:19:08 +02:00
oauth-auth.test.ts feat: auth print (#7168) 2026-07-27 16:13:06 +02:00
oauth-device-code.test.ts feat(coding-agent): replace model registry with model runtime 2026-07-14 17:48:45 +02:00
oauth.ts feat(coding-agent): replace model registry with model runtime 2026-07-14 17:48:45 +02:00
openai-codex-cache-affinity-e2e.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00
openai-codex-oauth.test.ts feat(coding-agent): replace model registry with model runtime 2026-07-14 17:48:45 +02:00
openai-codex-stream.test.ts fix(ai): scope Codex sockets to accounts 2026-07-31 12:58:56 +03:00
openai-completions-cache-control-format.test.ts fix(ai): cache OpenRouter tool results 2026-07-22 11:48:33 +02:00
openai-completions-empty-tools.test.ts fix(ai): clamp streamSimple max tokens 2026-06-25 14:10:28 +02:00
openai-completions-prompt-cache.test.ts fix(ai): support OpenRouter session affinity (#6496) 2026-07-13 09:57:53 +02:00
openai-completions-raw-stop-reason.test.ts fix(ai): preserve raw OpenAI completion stop reasons 2026-07-29 13:52:14 +02:00
openai-completions-reasoning-details.test.ts Merge main into model-registry 2026-06-22 14:00:18 +02:00
openai-completions-response-model.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00
openai-completions-retry.test.ts fix(ai): make provider retries abortable (#6980) 2026-07-23 12:25:37 +02:00
openai-completions-thinking-as-text.test.ts feat(ai): add Baseten provider 2026-08-03 14:33:21 +02:00
openai-completions-tool-choice.test.ts feat(ai): add Baseten provider 2026-08-03 14:33:21 +02:00
openai-completions-tool-result-images.test.ts feat(ai): add Baseten provider 2026-08-03 14:33:21 +02:00
openai-responses-cache-affinity-e2e.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00
openai-responses-compat.test.ts don't send session-id header to opencode openai-responses models (#6645) 2026-07-14 15:57:01 +02:00
openai-responses-empty-tool-result.test.ts fix(ai): use "(no tool output)" placeholder for empty tool results without images (#6290) 2026-07-06 21:42:56 +02:00
openai-responses-foreign-toolcall-id.test.ts feat(ai): compat entrypoint, core-only root barrel (phase 5) 2026-06-10 21:17:12 +02:00
openai-responses-message-id.test.ts feat(ai): compat entrypoint, core-only root barrel (phase 5) 2026-06-10 21:17:12 +02:00
openai-responses-partial-json-cleanup.test.ts feat(ai): expose pending stop reason while streaming (#7151) 2026-07-27 11:56:15 +02:00
openai-responses-reasoning-replay-e2e.test.ts fix tests: use updated models 2026-07-24 18:52:56 +00:00
openai-responses-terminal-event.test.ts fix(coding-agent): resume after context-limited length stops (#7540) 2026-08-03 18:07:53 +02:00
openai-responses-tool-result-images.test.ts fix: remove redundant record guards 2026-07-05 18:55:09 +02:00
openrouter-cache-control-models.test.ts fix(ai): enable cache control for OpenRouter aliases 2026-07-22 11:46:21 +02:00
openrouter-cache-write-repro.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00
openrouter-images.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00
openrouter-oauth.test.ts feat(ai): add manual redirect URL fallback to OpenRouter OAuth login (#7114) 2026-07-27 11:58:04 +02:00
overflow.test.ts fix(coding-agent): resume after context-limited length stops (#7540) 2026-08-03 18:07:53 +02:00
pi-messages.test.ts feat(ai): expose pending stop reason while streaming (#7151) 2026-07-27 11:56:15 +02:00
provider-error-body-passthrough.test.ts fix(ai): surface provider HTTP error body instead of opaque SDK message 2026-06-25 12:07:51 +02:00
provider-error-body-regression.test.ts feat(ai): support Claude Opus 5 on Bedrock (#7081) 2026-07-25 08:25:23 +02:00
provider-retry.test.ts fix(ai): make provider retries abortable (#6980) 2026-07-23 12:25:37 +02:00
providers.test.ts fix(ai): support Anthropic bearer token env (#6148) 2026-07-24 15:13:22 +02:00
qwen-token-plan-models.test.ts fix(ai): use Qwen thinking controls for token plan reasoning models 2026-07-29 14:58:48 +00:00
radius-oauth.test.ts fix(ai): route Radius OAuth through gateway 2026-07-24 16:12:44 +02:00
reasoning-options.test.ts generate-models: use reasoning options from models.dev (#6928) 2026-07-22 08:33:34 +02:00
responseid.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00
retry.test.ts fix(ai): retry DNS transport failures (#6946) 2026-07-22 11:26:19 +02:00
scratch.ts feat(coding-agent): replace model registry with model runtime 2026-07-14 17:48:45 +02:00
stream.test.ts feat(ai): add Baseten provider 2026-08-03 14:33:21 +02:00
supports-xhigh.test.ts feat(ai): support Claude Opus 5 on Bedrock (#7081) 2026-07-25 08:25:23 +02:00
text.test.ts feat(ai): add shared contentText utility (#6840) 2026-07-20 01:50:36 +02:00
together-models.test.ts generate-models: use reasoning options from models.dev (#6928) 2026-07-22 08:33:34 +02:00
tokens.test.ts feat(ai): add Baseten provider 2026-08-03 14:33:21 +02:00
tool-call-id-normalization.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00
tool-call-without-result.test.ts feat(ai): add Baseten provider 2026-08-03 14:33:21 +02:00
total-tokens.test.ts feat(ai): add Baseten provider 2026-08-03 14:33:21 +02:00
transform-messages-copilot-openai-to-anthropic.test.ts feat(ai): move API implementations to src/api with lazy wrappers (phase 2) 2026-06-10 20:08:59 +02:00
unicode-surrogate.test.ts feat(ai): add Baseten provider 2026-08-03 14:33:21 +02:00
uuid.test.ts fix(ai,agent,coding-agent): share UUIDv7 and use for Codex (#6834) 2026-07-20 01:23:47 +02:00
validation.test.ts fix: validateToolArguments() coerces nullable union (#7373) 2026-08-03 13:58:51 +02:00
xai-oauth.test.ts feat(xai): prefilled OAuth device link, SuperGrok login label, trimmed model list (#6734) 2026-07-16 18:59:54 +02:00
xai-responses.test.ts fix(ai): prevent removed xAI models regenerating, closes #6736 2026-07-16 20:07:36 +02:00
xhigh.test.ts fix tests: use updated models 2026-07-24 18:52:56 +00:00
xiaomi-models.test.ts fix(ai): refresh Xiaomi token plan model catalogs 2026-07-08 10:17:48 +02:00
xiaomi-token-plan-ams-anthropic-empty-signature-smoke.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00
zen.test.ts fix(ai): revert selective pi-ai base entrypoints 2026-06-22 12:54:32 +02:00