fc5d3ed636
refactor: unify authentication state and improve middleware efficiency
...
- Introduce AuthInfo struct for shared auth state.
- Populate AuthInfo in rate_limit_middleware and store in request extensions.
- Update AuthenticatedClient extractor to use pre-resolved AuthInfo.
- Simplify chat_completions by removing redundant DB lookups.
2026-03-05 18:44:41 +00:00
7411d3dbed
fix(deepseek): preserve reasoning_content in history for R1
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
DeepSeek R1 (deepseek-reasoner) requires that assistant messages in the history
containing tool_calls must also include their reasoning_content field.
2026-03-05 18:24:06 +00:00
e3c1b9fa20
refactor: extract stream parsing helper and enable deepseek error probing
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-05 18:16:56 +00:00
c2bad90a8f
fix(deepseek): add missing StreamExt import
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-05 18:08:20 +00:00
c7b67d5840
fix(deepseek): add more exhaustive sanitation for deepseek-reasoner
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
R1 model does not support presence_penalty, frequency_penalty, logit_bias,
logprobs, or top_logprobs. Added these to the list of stripped parameters.
2026-03-05 17:59:49 +00:00
7efb36029c
fix(deepseek): sanitize requests for deepseek-reasoner
...
deepseek-reasoner (R1) does not support tools, temperature, or top_p.
These fields are now stripped to avoid 400 Bad Request errors.
2026-03-05 17:59:31 +00:00
6440e8cc13
fix(gemini): ensure final finish_reason is 'tool_calls' if any tools were seen
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
Gemini often sends tool calls in one chunk and then 'STOP' in a final chunk.
If we pass the raw 'stop' at the end, clients stop and ignore the previously
received tool calls. We now track if any tools were seen and override the
final 'stop' to 'tool_calls'.
2026-03-05 17:50:25 +00:00
5c5f836eca
fix(gemini): override finish_reason to 'tool_calls' when tools are present
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
Gemini often reports 'STOP' even when tool calls are generated. To remain
OpenAI-compatible and ensure clients execute tools and continue, we must
report 'tool_calls' as the finish_reason when tools are present.
2026-03-05 17:45:55 +00:00
febfcafed4
fix(gemini): resolve 400 errors by strictly adhering to JSON schema
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
- Remove from as it is rejected by the API inside .
- Ensure is always a JSON object (google.protobuf.Struct), wrapping non-object tool results in .
- Update extraction logic to only look for in sibling fields.
2026-03-05 17:39:50 +00:00
811885274b
fix(gemini): handle 'Stream ended' gracefully and improve debug logging
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-05 17:34:40 +00:00
e307ecf11d
fix(gemini): resolve 400 errors and unstable tool IDs in Gemini 3 models
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
- Ensure is preserved in conversation history for Gemini 3 models.
- Support multiple naming conventions (snake_case and camelCase).
- Implement stable tool call ID tracking during streaming using a stateful map.
- Improve extraction from both Gemini parts and function calls.
- Fix incorrect tool call indices during streaming.
2026-03-05 17:29:25 +00:00
eac3781079
fix(gemini): force snake_case naming for thought_signature
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
- Despite struct-wide camelCase policy, Gemini 3 reasoning models strictly require 'thought_signature' in snake_case.
- Explicitly rename the field to resolve the 'missing thought_signature' 400 error.
2026-03-05 17:15:16 +00:00
76bf5b81d4
fix(gemini): rename field to thoughtSignature for native REST API compliance
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
- The native Gemini REST API requires camelCase 'thoughtSignature' as a sibling to functionCall.
- Explicitly rename the field to match this requirement, resolving the 'missing thought_signature' 400 error.
2026-03-05 17:10:54 +00:00
90a3f5d7f8
fix(gemini): correct sibling positioning and snake_case naming of thought_signature
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-05 17:04:36 +00:00
f7f6768333
fix(gemini): final alignment of thought_signature nesting and naming
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-05 16:56:15 +00:00
5bbd5f77b9
fix(gemini): prevent 400 by filtering proxy-generated IDs from thought_signature
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
- Only restore thought_signature if the tool call ID doesn't start with 'call_'.
- This ensures proxy-generated UUIDs are never sent back to Gemini as signatures, which was causing base64 decoding failures.
2026-03-05 16:49:56 +00:00
8a33b147f1
fix(gemini): align thought_signature logic with Gemini API requirements
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
- Extract thought_signature from the Part level during response parsing.
- Provide thought_signature as a sibling to functionCall during request assembly.
- This fully resolves the 'Unknown name thoughtSignature at function_call' error.
2026-03-05 16:45:18 +00:00
154b7b3b77
fix(gemini): resolve 404 by fixing double-beta in API URL
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
- Update get_base_url to only perform replacement if the base_url specifically ends with /v1.
- This prevents malformed URLs like /v1betabeta when the base_url was already configured as v1beta.
2026-03-05 16:33:10 +00:00
3d43948dbe
fix(gemini): improve Gemini 3 stability and diagnostics
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
- Switch Gemini 3 models to v1beta for both streaming and non-streaming (better reasoning support).
- Increase max_output_tokens cap to 65536 for reasoning-heavy models.
- Elevate API URL and chunk tracing to INFO level for easier production debugging.
2026-03-05 16:27:22 +00:00
a75c10bcd8
fix(gemini): resolve compilation errors and enable Gemini 3 reasoning
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-05 16:17:48 +00:00
0dd6212f0a
fix(gemini): resolve 400 errors by refining safety settings and sanitizing stop sequences
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
- Exclude 'HARM_CATEGORY_CIVIC_INTEGRITY' when using v1 endpoint (v1beta only).
- Filter out empty strings from 'stop_sequences' which are rejected by Gemini.
- Update error probe to use non-streaming endpoint for better JSON error diagnostics.
2026-03-05 16:03:07 +00:00
f8598060f9
fix(gemini): resolve compilation errors and final parameter alignment
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-05 15:57:33 +00:00
3086a3b6d9
fix(gemini): sanitize tool parameters to remove unsupported JSON Schema fields
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
- Recursively remove '$schema', 'additionalProperties', 'exclusiveMaximum', and 'exclusiveMinimum' from tool definitions.
- These fields are frequently included by clients like opencode but are rejected by the Gemini API with 400 errors.
2026-03-05 15:48:29 +00:00
fb98f0ebb8
fix(gemini): strictly enforce alternating roles and improve message merging
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
- Merge all consecutive messages with the same role into a single GeminiContent object.
- Ensure the first message is always 'user' by prepending a placeholder if necessary.
- Add final check for empty contents to prevent sending malformed requests.
- This addresses strict role-sequence requirements in Gemini 2.0/3.0 models.
2026-03-05 15:41:36 +00:00
6b7e245827
feat(gemini): implement stream error probing for better diagnostics
2026-03-05 15:40:32 +00:00
6010ec97a8
fix(gemini): resolve 404 by defaulting Gemini 3+ to v1 endpoint
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
- Update get_base_url to prefer v1 for Gemini 3.0+ models even if they contain 'preview'.
- Add tracing::debug logs for the final API URLs used in both streaming and non-streaming requests.
2026-03-05 15:32:53 +00:00
bdf7b63238
fix(gemini): resolve compilation error by moving get_base_url into impl block
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-05 15:26:19 +00:00
be9fdd9a52
fix(gemini): implement dynamic API versioning and support Gemini 3
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
- Switch to v1beta endpoint for 'preview' and 'thinking' models.
- Update model version checks to include gemini-3 as a known version.
- Use get_base_url helper to construct dynamic URLs for both streaming and non-streaming requests.
2026-03-05 15:24:47 +00:00
e89658fd87
fix(gemini): add model mapping fallback and token clamping
...
- Map unknown Gemini model names to the configured default model to prevent 400 errors.
- Clamp max_tokens to a safe limit of 8192 for Gemini models.
- Clean up message filtering and role injection for better client compatibility.
2026-03-05 15:23:26 +00:00
a022bd1272
fix(gemini): resolve 400 stream errors and improve client compatibility
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
- Filter out empty text parts in Gemini requests to avoid 400 errors.
- Inject 'assistant' role into the first streaming chunk for better compatibility with clients like opencode.
- Fallback to tool_call_id for Gemini function responses when name is missing.
2026-03-05 15:16:19 +00:00
b0bd1fd143
fix(gemini): ensure conversation starts with user role and add empty message check
...
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
Gemini API requires the first message to be from the 'user' role.
This commit ensures that:
- If a conversation starts with a 'model' (assistant) role, a placeholder 'user' message is prepended.
- 'tool' results are correctly mapped to 'user' role parts.
- Sequential messages with the same role are merged.
- Empty content requests are prevented in both sync and stream paths.
This fixes 400 Bad Request errors when clients (like opencode) send
message histories that don't match Gemini's strict role requirements.
2026-03-05 08:48:25 -05:00
5b6583301d
fix(providers): add registry routing, OpenAI Responses support and Gemini streaming fallbacks; compile fixes
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-04 14:17:30 -05:00
5a8510bf1e
feat(providers): model-registry routing + Responses API support and streaming fallbacks for OpenAI/Gemini
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-04 13:36:03 -05:00
1453e64d4b
feat(billing): add billing_mode to providers (postpaid support) & UI/migration
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 15:37:19 -05:00
75b68521c8
fix(server): resolve build errors and clean imports
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 15:26:31 -05:00
8d1cbd28a8
style: fix cargo warnings (imports, dead_code)
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 15:22:24 -05:00
c3dda74113
style: fix cargo warnings (unused imports, dead_code)
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 15:21:07 -05:00
756600c2c0
feat: gemini postpaid billing (skip credit_balance deduction)
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 15:18:28 -05:00
beb511291f
fix: deepseek streaming 400 error (remove stream_options.include_usage)
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 15:13:30 -05:00
3116084238
fix(streaming): use async_stream with [DONE] at end
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 13:59:34 -05:00
07f91ec4bb
fix(streaming): collect chunks then stream with explicit [DONE]
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 13:52:18 -05:00
656a6f31ce
fix(streaming): use async_stream to ensure [DONE] is always sent
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 13:40:57 -05:00
e0948a3e7f
fix(streaming): use repeat_with + take for [DONE] marker
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 13:30:37 -05:00
5325068305
fix(streaming): restore SSE with [DONE] chain
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 13:24:25 -05:00
adbaa146fb
docs: update README, deployment guide, and dashboard docs
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 13:06:37 -05:00
2a7a380977
fix(streaming): collect chunks then stream with explicit [DONE]
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 13:02:10 -05:00
2508a745c6
fix(streaming): use iter vec for [DONE] marker
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 12:54:23 -05:00
545664f0dd
fix(streaming): attempt to detect final chunk for [DONE] marker
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 12:47:19 -05:00
99716d97ef
fix(streaming): emit [DONE] using chain on aggregator stream
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 12:41:16 -05:00
2040b068e6
fix: resolve merge conflict in streaming code
CI / Check (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Formatting (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Release Build (push) Has been cancelled
2026-03-03 12:34:39 -05:00