Commit Graph

106 Commits

Author SHA1 Message Date
Mario Zechner c1b62ae7fe fix(ai,coding-agent): omit undefined provider request options closes #3627 2026-04-24 14:18:35 +02:00
Mario Zechner c06750410a fix(ai,coding-agent): expose provider timeout/retry controls closes #3627 2026-04-24 13:33:00 +02:00
Mario Zechner 1e33492525 fix(coding-agent): harden clipboard copy
closes #3639
2026-04-24 12:55:58 +02:00
Mario Zechner c681d35d76 fix(ai): avoid double-counting reasoning tokens
closes #3581
2026-04-23 23:28:16 +02:00
Mario Zechner 01509156b3 fix(ai): coalesce malformed streamed tool calls closes #3576 2026-04-23 16:05:21 +02:00
Mario Zechner 1d488626d9 fix(ai): preserve requiresThinkingAsText replay semantics closes #3387 2026-04-20 19:44:38 +02:00
Mario Zechner 3054fd7a3b fix(ai,coding-agent): support anthropic-style cache control for openai compatibles closes #3392 2026-04-20 17:12:05 +02:00
Mario Zechner 2f4f283cc2 fix(ai,coding-agent): preserve non-vision image placeholders closes #3429 2026-04-20 16:52:27 +02:00
Mario Zechner aa1b587b10 fix(ai): add direct OpenAI completions prompt caching closes #3426 2026-04-20 15:37:29 +02:00
Mario Zechner e3f6912d49 fix(ai): preserve qwen chat-template thinking closes #3325 2026-04-17 16:59:00 +02:00
Mario Zechner d131fcd4ba feat(coding-agent): add after_provider_response hook closes #3128 2026-04-16 20:28:08 +02:00
Armin Ronacher e2b40dfc81 fix(ai): strip partialJson from responses tool calls
Mutate persisted tool-call blocks in place on function_call completion,
remove partialJson, and emit the same reference on toolcall_end.
Add regression coverage for persisted block cleanup and event identity.

fixes #3078
2026-04-14 18:56:53 +02:00
Mario Zechner 6044cabb15 fix(ai): preserve cache_write_tokens in completions stream usage closes #2802 2026-04-04 21:39:11 +02:00
Kao Félix 758ede4da0 Enable tool streaming for newer Z.ai models (#2732) 2026-03-31 14:28:24 +02:00
Mario Zechner d1613e3f53 fix(ai): handle explicit thinking off across providers closes #2490 2026-03-22 20:27:44 +01:00
Cheng-Zi-Qing 7e2689ac18 packages/ai: ignore null chunks in openai-completions streams (#2466) 2026-03-20 20:01:28 +01:00
PriNova f704ee7255 fix(ai): use OpenRouter reasoning payload (#2298)
* fix(ai): use OpenRouter reasoning payload

* fix(coding-agent): stop updating packages on startup closes #1963

* fix(ai): add openrouter thinkingFormat compat

---------

Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
2026-03-18 11:23:27 +01:00
Mario Zechner d914d1c199 fix(coding-agent): handle z.ai network_error closes #2313 2026-03-17 22:34:49 +01:00
Mario Zechner dd53eb56ee fix(ai): expose provider response ids on assistant messages fixes #2245 2026-03-17 17:11:38 +01:00
Mario Zechner 03ad7ecee7 fix(ai): add qwen-chat-template compat mode closes #2020 2026-03-14 05:20:27 +01:00
Mario Zechner a79ca41190 fix(ai): handle unknown finish_reason in openai-completions gracefully
Map unknown finish_reason values (e.g. "end" from Ollama/LM Studio) to
"stop" instead of throwing, since assistant content is already produced.

fixes #2142
2026-03-14 04:01:22 +01:00
Mario Zechner 4535415300 fix(ai): capture usage from choice.usage for non-standard OpenAI-compatible providers
Some OpenAI-compatible providers (e.g., Moonshot/Kimi) return usage
data in chunk.choices[0].usage instead of the standard chunk.usage.
Extract usage parsing into a helper and check choice.usage as fallback.

closes #2017
2026-03-10 16:28:39 +01:00
Geraldo Dutra Neto 23109b113d fix: send assistant content as string in openai-completions provider (#2008)
The OpenAI Chat Completions API standard format for assistant message
content is a plain string. Sending it as an array of
{type:"text", text:"..."} objects causes some models (notably DeepSeek
V3.2 via NVIDIA NIM) to mirror the content-block structure literally
in their output. This produces recursive nesting where each turn wraps
the previous content blocks deeper:

  [{'type':'text','text':'[{\'type\':\'text\',\'text\':...}]'}]

The fix unifies the assistant content serialization to always use a
joined string — the same approach already used for the github-copilot
provider — for all openai-completions backends.

Affected models observed: deepseek-ai/deepseek-v3.2 (nvidia provider).
Models like GLM-5, GPT-4, Claude were unaffected as they tolerate
array content, but sending a standard string is safer for all.

Co-authored-by: geraldoaax <geraldoaax@users.noreply.github.com>
2026-03-10 16:04:11 +01:00
Mario Zechner a3f05423d9 feat(coding-agent): add provider payload hook 2026-03-07 14:34:28 +01:00
Abdeslam Yassine Agmar eb9f1183ad refactor(ai): migrate mistral provider to conversations sdk 2026-03-03 17:25:50 +00:00
Mario Zechner 7b96041068 fix(ai): map groq qwen3 reasoning effort values closes #1745 2026-03-03 16:44:42 +01:00
Mario Zechner afe9ae06e8 Closes #1671, switch to GLM-5 for tests 2026-02-27 21:35:40 +01:00
Yoshiaki Okuyama 22b3be834e fix(ai): use enable_thinking for Z.ai instead of thinking param (#1674)
Z.ai uses the same enable_thinking: boolean parameter as Qwen to control reasoning, not thinking: { type: "enabled" | "disabled" }.

The wrong parameter name means Z.ai ignores the disable request and always runs with thinking enabled, wasting tokens and adding latency.

Merge the Z.ai and Qwen branches since they use the same format.

PR by @okuyam2y
2026-02-27 21:33:14 +01:00
Mario Zechner ed0cfcbda2 fix(ai): tolerate malformed trailing tool-call JSON in OpenAI streams closes #1424 2026-02-12 21:09:42 +01:00
Nate Smyth 2419412483 refactor(ai): fix inconsistencies, trim ai code+replace tests, remove unnceccessary tool_result check 2026-02-12 18:41:12 +01:00
Nate Smyth 0a132a30a1 feat(ai): route copilot claude via anthropic messages api 2026-02-12 18:41:12 +01:00
Mario Zechner ff0eb3ecd4 fix(ai): omit strict for unsupported openai completions 2026-02-02 00:44:55 +01:00
4h9fbZ 993c45a059 feat(coding-agent): add Qwen CLI OAuth provider 2026-02-01 01:51:55 +01:00
Ben Vargas e045a9f142 feat(ai): add Vercel AI Gateway routing support (#1051)
* feat(ai): add Vercel AI Gateway routing support

Add vercelGatewayRouting to OpenAICompletionsCompat, parallel to
openRouterRouting. When a model targets ai-gateway.vercel.sh and has
vercelGatewayRouting configured, the openai-completions provider passes
providerOptions.gateway with only/order in the request body.

Changes:
- types.ts: VercelGatewayRouting interface + field on OpenAICompletionsCompat
- openai-completions.ts: buildParams passes providerOptions.gateway,
  detectCompat/getCompat include the new field
- model-registry.ts: VercelGatewayRoutingSchema for models.json validation
- test: updated Required<OpenAICompletionsCompat> in test fixture

* docs(coding-agent): add vercelGatewayRouting to custom models documentation
2026-01-30 01:44:51 +01:00
Mario Zechner 605f6f494b fix(ai): normalize pipe-separated tool call IDs for cross-provider handoff
- Handle pipe-separated IDs from OpenAI Responses API in openai-completions provider
- Strip trailing underscores after truncation in openai-responses-shared (OpenAI Codex rejects them)
- Add regression tests for tool call ID normalization

fixes #1022
2026-01-29 01:28:12 +01:00
Mario Zechner 4f9deddd47 fix(ai): detect DeepSeek URLs and disable unsupported developer role
fixes #1048
2026-01-28 23:55:54 +01:00
williamtwomey 41d2c7ff38 OpenAI completions toolChoice fix (#998)
* openai completions tools fix

* Reset generated file

---------

Co-authored-by: williamtwomey <ai@shadylawn.net>
2026-01-28 03:03:15 +01:00
Mario Zechner 9b903656ae fix(ai): correct provider error message typo (closes #958) 2026-01-26 15:37:57 +01:00
jake dac7474da2 feat(ai): add OpenRouter provider routing support
Allows custom models to specify which upstream providers OpenRouter
should route requests to via the `openRouterRouting` field in model
definitions.

Supported fields:
- `only`: list of provider slugs to exclusively use
- `order`: list of provider slugs to try in order
2026-01-25 03:34:49 +01:00
Mario Zechner c725135a76 refactor(ai): register api providers 2026-01-24 23:15:11 +01:00
Michael Renner 6289c144bf fix(ai): batch tool-result images after consecutive tool results (#902)
Fixes 400 errors when reading multiple images via GitHub Copilot's
Claude models. Claude requires tool_use -> tool_result adjacency with
no user messages interleaved.

Before: assistant(tool_calls) -> tool -> user(images) -> tool -> user(images)
After:  assistant(tool_calls) -> tool -> tool -> user(all images)
2026-01-22 13:10:10 +01:00
Mario Zechner d2be6486a4 feat(ai): add headers option to StreamOptions for custom HTTP headers
- Added headers field to base StreamOptions interface
- Updated all providers to merge options.headers with defaults
- Forward headers and onPayload through streamSimple/completeSimple
- Bedrock not supported (uses AWS SDK auth)
2026-01-20 01:08:31 +01:00
Mario Zechner 2c7c23b865 fix(ai): normalize tool call ids and handoff tests fixes #821 2026-01-19 00:10:49 +01:00
Mario Zechner d43930c818 feat(ai): add strictResponsesPairing for Azure OpenAI Responses API
Split OpenAICompat into OpenAICompletionsCompat and OpenAIResponsesCompat
for type-safe API-specific compat settings. Added strictResponsesPairing
option to suppress orphaned reasoning/tool calls on incomplete turns,
fixing 400 errors on Azure's Responses API which requires strict pairing.

Closes #768
2026-01-18 20:15:33 +01:00
Mario Zechner f900eb591d Fix provider feature detection to use model.provider, not just URL
Previously, OpenAI-compatible provider settings (like developer role support)
were detected only from the baseUrl. When using custom URLs (e.g., proxies),
detection failed. Now checks model.provider first, then falls back to URL.

Fixes #774
2026-01-16 12:41:23 +01:00
Melih Mucuk cceb5908d9 fix: opencode provider uses system role instead of developer (#755)
* fix: opencode provider uses system role instead of developer for /v1 endpoint

* changelog updated
2026-01-15 21:26:31 +01:00
Mario Zechner 09d409cc92 Fix z.ai thinking/reasoning params, fixes #688
Z.ai uses thinking: { type: "enabled" | "disabled" } instead of
OpenAI's reasoning_effort. Added thinkingFormat compat flag to handle
this. Thinking is now explicitly enabled/disabled based on user setting.
2026-01-13 18:34:07 +01:00
nathyong 7b2c627079 Insert cache point on openrouter+anthropic completions (#584)
Co-authored-by: nathyong <nathyong@noreply.github.com>
2026-01-12 23:29:33 +01:00
Danila Poyarkov 934e7e470b Avoid cross-provider thought signatures (#654)
* Avoid cross-provider thought signatures

* Fix Google thought signature replay

Filter thought signatures to same provider with base64 validation and rename the transform helper for clarity.
2026-01-12 16:38:53 +01:00
Mario Zechner 14be8efba8 Merge PR #596: Add supportsUsageInStreaming compat flag 2026-01-10 00:34:29 +01:00