Commit Graph

1202 Commits

Author SHA1 Message Date
Luis Pater
48ad3487b2 feat(executor): add Responses tool_search strip and legacy model helpers 2026-10-11 11:01:28 +08:00
Luis Pater
37fe2608ee feat(usage): propagate access provider and native key metadata to usage records
- Inject API key, access provider, and native key flags into the request context during authentication
- Add `IsNativeKey` and `AccessProvider` fields to usage records, plugin API types, and redis queue payloads
- Provide context helper functions and automatic fallback resolution in the usage manager and reporter

Closes: #6509
2026-10-10 22:16:00 +08:00
Luis Pater
cad1b50347 fix(devin): do not seed input token estimates for claude streams
- Avoid seeding `message_start` with full-input token estimates in Devin streaming
- Rely on authoritative cache-aware token usage reported in response frames

Closes: #6505
2026-10-10 21:48:20 +08:00
Luis Pater
5dbd92a0e0 fix(auth): preserve upstream error cooldown on canceled stream contexts
- Record credential and model cooldowns when stream execution encounters an upstream error despite context cancellation
- Prioritize reading ready stream chunks before handling context cancellation in conductor
- Defer Codex websocket disconnect notifications until error frames are delivered to the stream

Closes: #6503
2026-10-10 20:26:36 +08:00
Luis Pater
be8c35f294 fix(claude): ignore invalid and null cache control entries in executor
- Use `isValidClaudeCacheControl` when inspecting `cache_control` fields across system prompts, tools, and message contents
- Prevent null or non-object cache control entries from counting against limits or interfering with TTL normalization and injection logic

Closes: #6491
2026-10-10 08:01:26 +08:00
Luis Pater
d318bcc3af fix(codex): handle late response interrupts on websocket sessions
- Track terminal response IDs per connection to idempotently handle late interrupts targeting completed turns
- Prevent late interrupts from contaminating subsequent requests or returning false errors on idle retained connections
- Add thread-safe diagnostic logging of sanitized interrupt outcomes in the Responses websocket handler

Closes: #6483
2026-10-09 21:35:40 +08:00
Luis Pater
76c87ce91d fix(xai): reset terminal error on websocket connection configuration
- Clear terminal error state when configuring a replacement xAI websocket connection to prevent stale error propagation

Closes: #6480
2026-10-09 20:26:25 +08:00
Luis Pater
e9c8769a7a fix(executor): normalize and restore non-portable tool call IDs
- Normalize tool use and tool result IDs in Claude message payloads to adhere to character constraints
- Encode non-portable tool call IDs in Devin executor responses and restore original IDs before request construction

Closes: #6478
2026-10-09 19:44:24 +08:00
sususu
f8e4a84074 fix(openai-compat): measure streaming TTFT on effective token frames 2026-10-09 19:00:58 +08:00
Luis Pater
2d8ec73b33 fix(claude): preserve mid-conversation effort directives during system insertion
- Skip directive-only system turns when locating the insertion point for mid-conversation system messages
- Prevent system blocks from being prematurely placed before subsequent user turns when effort directives are present

Closes: #6477
2026-10-09 17:43:09 +08:00
Luis Pater
51bde0ff96 fix(codex): preserve resolved upstream model in direct openai image requests
- Check configured upstream models and aliases before normalizing direct OpenAI image model names
- Support requested model resolution across JSON and multipart image payloads

Closes: #6458
2026-10-09 10:10:50 +08:00
Luis Pater
2bc236d2fc feat(claude): support responses compaction in claude executor
- Handle compaction trigger requests by generating summaries and sealing antigravity compaction capsules
- Expand replayed compaction capsules into message history before translation and filter foreign compaction items
- Preserve tool definitions with `tool_choice: none` or flatten tool blocks when tool definitions are missing
- Support streaming compaction execution and map cache creation and read token usage

Closes: #6466
2026-10-09 03:24:45 +08:00
Luis Pater
8080967991 fix(claude): ignore overage billing resets in unified rate limit parsing
- Ignore unified reset timestamps matching overage reset boundaries to prevent cooling down credentials until monthly billing reset
- Filter candidate rate limit deadlines exceeding the 7-day window limit
- Treat rejected overage claims with absent or healthy shared utilization as model-scoped rejections

Closes: #6465
2026-10-08 22:14:59 +08:00
Luis Pater
6331b38bba feat(openai): support response.interrupt in responses websocket handling
- Intercept and process `response.interrupt` control frames immediately on the downstream websocket reader
- Forward interrupts to active upstream Codex websocket sessions without starting a new turn or rewriting payload fields
- Support canceling in-flight HTTP turns via local interrupt handling
- Allow session-staged Home credentials to authorize interrupts

Closes: #6456
2026-10-08 21:32:26 +08:00
Luis Pater
249e9ef976 fix(meta): preserve foreign reasoning encrypted content in responses requests
- Introduce `sanitizeOpenAIResponsesReasoningEncryptedContentKeepForeign` to retain unknown-format reasoning signatures
- Update Meta executor to preserve foreign reasoning encrypted payloads for third-party models like Muse

Closes: #6450
2026-10-08 13:03:21 +08:00
Luis Pater
2d5351b3e5 feat(vertex): add support for native gemini interactions api
- Extract shared Gemini Interactions helpers for payload translation, input sanitization, thinking, and SSE streaming
- Add `interactions` configuration option to Vertex credentials
- Support native non-streaming and streaming Interactions API execution in Gemini Vertex executor

Closes: #6445
2026-10-08 12:39:31 +08:00
Luis Pater
0f96f568e4 refactor(translator): update openai and interactions request converters to return errors
- Update OpenAI and OpenAI Responses to Interactions request converters to return `([]byte, error)`
- Register request converters directly in internal translator registry instead of sdktranslator checked requests
2026-10-08 03:00:04 +08:00
Luis Pater
34e73c75a3 fix(xai): add proxy support and semver validation to Grok CLI updater
- Pass configured proxy URL to the npm registry updater client
- Validate fetched versions against strict semver and minimum server version floor (`1.0.13`)
- Update default fallback client version to `1.0.46`
- Manage background updater lifecycle and context via service lifecycle initialization
2026-10-08 02:39:32 +08:00
Luis Pater
298649f677 Merge pull request #6446 from jellyfish-p/feat/grok-cli-dynamic-version
feat(xai): dynamically fetch latest Grok CLI version from npm registry with fallback
2026-10-08 02:30:27 +08:00
Luis Pater
f51624aa35 fix(translator): report unsendable user turn attachments in openai responses to interactions
- Track dropped attachments and reject emptied user turns during OpenAI Responses to Interactions translation
- Register checked request translator for OpenAI Responses to Interactions format conversion
2026-10-08 02:11:20 +08:00
Luis Pater
7cd8f7bac7 Merge pull request #6441 from soilSpoon/fix/attachment-parts
fix(translator): stop dropping attachments and empty turns
2026-10-08 02:09:31 +08:00
Jellyfish
90654da573 feat(xai): dynamically fetch latest Grok CLI version from npm registry with fallback
- Fetch latest @xai-official/grok client version from npm registry on startup
- Periodically refresh Grok CLI version every 3 hours without multiple retries
- Update hardcoded fallback version to 1.0.50 if npm registry is unreachable
- Dynamically inject active version into x-grok-client-version and User-Agent headers
2026-10-08 00:59:27 +08:00
Luis Pater
e7b22260dd fix(claude): support plain-text and structured response bodies for missing thread errors
- Extend `IsClaudeThreadNotFound` to identify missing thread errors from plain-text error messages in addition to JSON payloads
- Implement `ResponseBody` on executor `claudeThreadNotFoundError` to supply structured JSON error payloads

Closes: #6443
2026-10-07 23:32:21 +08:00
Luis Pater
14dc4e05a0 fix(claude): relocate caller system prompt to messages for OAuth requests
- Relocate caller system prompts into conversation messages when using OAuth to prevent triggering Anthropic's third-party classifier
- Apply the same relocation policy to token counting requests

Closes: #6432
2026-10-07 20:52:17 +08:00
이대희
3b69068e6c fix(translator): stop dropping attachments and empty turns
An attachment a translator could not represent was dropped without a word, and
a turn whose only content was that attachment went upstream as an empty
messages, parts, or input array. The model then answered as if nothing was
attached, or the upstream rejected a request that never named the attachment.

A base64 document now reaches OpenAI as a file part. A file the target cannot
receive, such as container_upload, an OpenAI file_id, or input_audio sent to
Claude, is reported by name so the route answers 400 instead of forwarding an
empty turn. Text beside it still travels.

One rule, ErrIfNothingLeft, decides when to refuse, and RegisterCheckedRequest
carries the refusal on the request envelope. Every executor that translates
checks it before calling upstream. The exported converters keep their []byte
signature, so no caller or sibling test had to change.
2026-10-07 19:21:32 +09:00
Luis Pater
306c9bd824 fix(routing): restrict speech-only models to speech endpoints and refine xAI error scoping
- Reject speech-only models (such as `grok-tts` and `grok-voice-tts-1.0`) on non-speech entry protocols to prevent invalid chat upstream routing
- Mark upstream 404 errors for xAI speech as request-scoped unless indicating model unavailability, preventing unnecessary credential rotation and model cooldowns
- Align xAI speech payload finalizer protocol with `openai` for consistent payload override rules
2026-10-07 13:46:58 +08:00
Luis Pater
061001f8f8 Merge PR #6418: feat(xai): expose Grok TTS on /v1/audio/speech 2026-10-07 13:12:14 +08:00
Luis Pater
57bde35179 fix(executor): preserve upstream usage on apply patch failures
- Buffer and publish observed upstream usage when apply patch transformation or translation encounters an error in Meta and xAI executors
- Add stream usage buffer helpers to report failure metrics with captured upstream token usage

Closes: #6427
2026-10-07 09:31:03 +08:00
Luis Pater
39632e52a6 fix(claude): keep system prompt at top level for leading user message runs
- Update cloaking check to retain caller system instructions at the top level when a conversation begins with multiple consecutive user messages followed by assistant turns

Closes: #6426
2026-10-07 08:57:39 +08:00
Luis Pater
eca1d11385 fix(claude): keep system prompt at top level for single terminal user turn
- Update terminal user run check in Claude cloaking logic so conversations ending with a single user turn keep caller system instructions at the top level instead of relocating them into mid-conversation messages

Closes: #6423
2026-10-07 08:40:41 +08:00
Luis Pater
dbc4aad9e9 fix(gemini): ignore context cancellation after terminal chunk in Vertex stream
- Detect terminal stream chunks and avoid recording client cancellations as execution failures once completion events have been delivered

Closes: #6421
2026-10-07 08:16:52 +08:00
luohui1
6a853dce05 feat(xai): expose Grok TTS on /v1/audio/speech
Route OpenAI speech requests to the official xAI /tts endpoint and register grok-tts and grok-voice-tts-1.0.
2026-10-06 02:49:21 -07:00
Luis Pater
a2976eb8a3 fix(claude): share OAuth tool alias store across scoped executor copies
- Pre-allocate `oauthToolAliases` in Claude and Kimi executor constructors so request copies created via `ForAPIKey` reuse the same store
- Replace struct-level mutex with package-level mutex for lazy store allocation to prevent copying mutexes by value

Closes: #6401
2026-10-06 05:45:17 +08:00
Luis Pater
d2597a24e4 fix(openai): preserve unknown encrypted content in responses compat mode
- Retain unknown-format `encrypted_content` during reasoning signature sanitization when compatibility mode is enabled
- Continue stripping empty signatures and known foreign provider signatures in compat mode

Closes: #6399
2026-10-06 05:07:50 +08:00
Luis Pater
c7b4d573f9 fix(codex): record reasoning effort after applying payload overrides
- Record reasoning effort from finalized upstream payload after cache helper processing across execution, streaming, compaction, and image requests

Closes: #6388
2026-10-05 17:08:02 +08:00
Luis Pater
0ea4e1dcb4 fix(openai): complete responses stream on clean EOF after finish reason
- Track pending completion state in OpenAI-to-Responses translator when item output is complete and a finish reason is received
- Synthesize terminal `[DONE]` event on clean EOF when response completion is pending instead of failing the stream

Closes: #6381
2026-10-05 15:55:38 +08:00
Luis Pater
3e83083b92 Merge pull request #6386 from router-for-me/logs
Unify model reporting and enhance logging for context hash rejections
2026-10-05 14:34:00 +08:00
Luis Pater
eb6a768d10 feat(claude): support explicit prompt cache options
- Honor `prompt_cache_options.mode = "explicit"` to suppress automatic `cache_control` insertion while preserving client-defined cache breakpoints
- Strip `prompt_cache_options` from request payloads before forwarding upstream and during token counting

Closes: #6380
2026-10-05 14:16:37 +08:00
hkfires
40f4df07b7 feat(antigravity): enhance context hash rejection logging and batch retry logic 2026-10-05 13:24:20 +08:00
hkfires
17dc1b81c2 feat(antigravity): enhance context hash rejection logging and introduce replay phases 2026-10-05 11:41:11 +08:00
hkfires
611ebba415 refactor(executor): unify model reporting and replay logs
Replace Codex-specific response model APIs with shared model observation and remove redundant substitution warning throttling. Consolidate repeated Antigravity context-hash rejection messages into a single request-level log while preserving rejection details across index rebuilds.
2026-10-05 11:10:54 +08:00
Luis Pater
a4acc9f752 fix(antigravity): treat client disconnect after terminal stream chunk as success
- Track terminal chunks including finish reasons, stop messages, and completion events during streaming
- Commit replay settlements and publish observed usage instead of reporting stream failure when the client disconnects after a terminal chunk

Closes: #6376
2026-10-05 06:25:53 +08:00
Luis Pater
4e4dede481 fix(antigravity): surface backend errors and support multi-line stream payloads
- Buffer and assemble multi-line or split JSON chunks until a valid JSON payload is formed
- Intercept upstream backend error objects during streaming and surface them as terminal errors with appropriate status codes

Closes: #6357
2026-10-05 04:32:35 +08:00
Luis Pater
d31b61cb87 fix(websockets): propagate upstream disconnect errors during session activation
- Track terminal connection errors on websocket session when upstream read loops fail or receive unexpected binary payloads
- Return recorded terminal errors immediately during session activation to prevent callers from blocking indefinitely after upstream disconnects
- Reset terminal error state when configuring new connections

Closes: #6354
2026-10-05 04:05:41 +08:00
Luis Pater
678a92578c feat(claude): preserve OAuth tool aliases across thread continuations
- Add bounded in-memory store to retain Claude OAuth tool alias mappings keyed by message ID
- Restore alias mappings for thread continuation requests omitting tool declarations, returning a request-scoped not found error when state is missing
- Record tool aliases on execution and streaming response completion

Closes: #6346
2026-10-04 23:18:38 +08:00
Luis Pater
26e5efbbdf fix(claude): reserve cache breakpoint for thread continuation
- Decrement `maxBlocks` when a `thread` field is present in payload to reserve a cache breakpoint for Anthropic thread continuation

Closes: #6338
2026-10-04 21:00:20 +08:00
Luis Pater
5d890405b5 fix(claude): keep system messages top level for terminal user turns
- Add `claudeMidConversationSystemMessagesAtEnd` to detect consecutive user messages ending the message array
- Append forwarded system blocks to top-level `system` payload instead of inserting mid-conversation message turns when trailing user turns are present

Closes: #6336
2026-10-04 20:32:07 +08:00
Luis Pater
c997cbb58a feat(httpwire): introduce error-aware response flushing helper
- Add `FlushResponse` to prefer error-aware flushing and unwrap wrapped response writers
- Bypass Gin's void `Flush` while maintaining header accounting via `WriteHeaderNow` to keep transport errors observable

Closes: #6332
2026-10-04 17:33:19 +08:00
Luis Pater
cbc4cd5532 feat(interactions): support antigravity session continuation and model detail lookup
- Add `InteractionsSessionCache` to preserve Antigravity interaction continuations across tool call rounds
- Automatically restore and inject `previous_interaction_id` and `environment_id` in Gemini interactions executor
- Normalize Antigravity tool identity mappings in OpenAI responses translator
- Add `/v1/models/*model` endpoint to support retrieving individual model details

Closes: #5190
2026-10-04 04:23:31 +08:00
Luis Pater
868e137f6c feat(payload): introduce payload finalizer for protobuf and multipart requests
- Add `PayloadFinalizer` to apply configuration rules at the final serialization barrier
- Support decoding, modifying, and re-encoding Devin protobuf business fields
- Add multipart form-data payload normalization to JSON for media payload rules

Closes: #5067
2026-10-04 03:01:34 +08:00