Commit Graph

130 Commits

Author SHA1 Message Date
弎水
51df39b9b9 feat(ai): add ZAI Coding Plan China provider 2026-06-02 23:39:56 +08:00
Mario Zechner
25a4a8ed1e Add Ant Ling provider 2026-06-02 16:37:44 +02:00
Mario Zechner
2125221bfc Fix OpenRouter Kimi reasoning compat
closes #5309
2026-06-02 15:36:52 +02:00
Mario Zechner
6014801229 Add NVIDIA NIM provider 2026-06-02 15:09:36 +02:00
PriNova
b55fe1bbd4 Fix OpenRouter reasoning instruction role 2026-05-30 11:15:30 +02:00
Mario Zechner
7921ae499a Require explicit provider API keys 2026-05-29 22:36:05 +02:00
Armin Ronacher
4faac05419 fix(ai): handle OpenCode reasoning params 2026-05-29 12:21:37 +02:00
Mario Zechner
97ef317389 Fix Kimi and Xiaomi model metadata
Closes #5075, closes #5078. Refs #5087.
2026-05-28 22:19:47 +02:00
Armin Ronacher
8fb1e877cd fix(ai): disable hidden provider 429 retries (#4991) 2026-05-26 23:41:58 +02:00
Armin Ronacher
ae9450dc51 chore(ts): use source import extensions 2026-05-20 00:04:03 +02:00
Mario Zechner
7be75baded fix(ai): clamp OpenAI prompt cache keys
closes #4720
2026-05-19 10:51:11 +02:00
Mario Zechner
21d80deda2 fix(ai): normalize opencode go reasoning replay
closes #4251
2026-05-18 01:11:23 +02:00
Mario Zechner
0412f62f9e Merge pull request #4558 from earendil-works/fix/openai-completions-throw-on-missing-finish_reason
fix(ai): openai-completions - throw error on missing finish-reason
2026-05-16 22:54:42 +02:00
Armin Ronacher
87881ca686 fix(ai): preserve OpenRouter cached token semantics 2026-05-16 11:55:16 +02:00
Ramiz Wachtler
98ffad0437 fix(ai): openai-completions - throw error on missing finish-reason
- require \ before treating \ streams as successful
- add regression coverage for truncated streams without \
- closes #4345
2026-05-15 15:26:57 +02:00
Mario Zechner
7adb8e7634 feat(ai): add Together AI provider 2026-05-08 16:44:18 +02:00
Armin Ronacher
6b271842e2 fix(ai): handle mixed chat completion deltas
Fixes #4228
2026-05-07 00:12:19 +02:00
Mario Zechner
80f06d3636 feat: add model thinking level metadata
closes #3208
2026-05-02 01:21:06 +02:00
Mario Zechner
a45577bd00 fix(ai): finalize cloudflare gateway provider support 2026-05-01 00:56:05 +02:00
Armin Ronacher
7dc1bed478 feat(ai): add Moonshot AI provider model support 2026-04-30 17:21:03 +02:00
Alejandro
e354c521f4 feat(ai): expose routed model on openai-completions (#3968)
Adds `AssistantMessage.responseModel` on the openai-completions path:
surfaces the concrete `chunk.model` when it differs from the requested
id (e.g. OpenRouter `auto` -> `anthropic/...`).
2026-04-30 00:16:12 +02:00
Mario Zechner
fc3cbedc6c fix(ai): track DeepSeek prompt cache hits
closes #3880
2026-04-29 16:37:39 +02:00
MC
d6e08b3da0 feat(ai): add Cloudflare Workers AI as a provider (#3851)
* feat(ai): add Cloudflare Workers AI as a provider

Cloudflare Workers AI hosts open-weight LLMs (Kimi K2.6, GPT-OSS,
GLM-4.7, Llama 4, Gemma 4, Nemotron 3) on Cloudflare's GPU network with
an OpenAI-compatible endpoint. Reuses the openai-completions API
protocol; the per-account URL contains a {CLOUDFLARE_ACCOUNT_ID}
placeholder resolved at request time by a small helper.

Pi automatically sets x-session-affinity for prefix caching:
https://developers.cloudflare.com/workers-ai/features/prompt-caching/

Auth: CLOUDFLARE_API_KEY (matches pi's *_API_KEY convention) +
CLOUDFLARE_ACCOUNT_ID. The User-Agent identifies traffic as
'pi-coding-agent' in Cloudflare analytics.

Verified end-to-end against a real Cloudflare account: 17 e2e tests
pass across stream/empty/tokens/unicode/tool-call-without-result/
total-tokens against @cf/moonshotai/kimi-k2.6.

Cloudflare AI Gateway is a separate, larger change (it requires routing
through provider-specific subpaths with the matching API protocol per
upstream) and will land in a follow-up PR.

* refactor(ai): move Cloudflare User-Agent and session-affinity flag to per-model metadata

Instead of conditionally setting them in openai-completions.ts based on
provider detection, declare them as model-level fields in the catalog
(headers + compat). This is consistent with how the github-copilot and
kimi-coding entries already declare their static headers.

  packages/ai/scripts/generate-models.ts: emit headers and compat fields
  on each cloudflare-workers-ai entry (CLOUDFLARE_STATIC_HEADERS).
  packages/ai/src/providers/openai-completions.ts: drop the
  isCloudflareProvider conditional that injected User-Agent and the
  isCloudflareWorkersAI override of sendSessionAffinityHeaders.
  packages/ai/src/models.generated.ts: re-spliced 8 cloudflare-workers-ai
  entries with headers + compat.

Behavior is unchanged - verified via fetch interceptor that User-Agent
and x-session-affinity / session_id / x-client-request-id are still sent
on outbound requests. 5/5 e2e tests pass.
2026-04-27 23:41:54 +02:00
HQidea
3e0ee69b5e fix(ai): omit tools field instead of sending empty array (#3650)
DashScope / Aliyun Qwen (OpenAI-compatible) rejects `tools: []`
with HTTP 400 `"[] is too short - 'tools'"`. Five providers used
a truthy check (`if (context.tools)`) that treated an empty array
as "send tools", so `pi --no-tools` produced `tools: []` in the
request body. Matching the Google provider's pattern, we now
guard on `context.tools.length > 0`:

- openai-completions.ts
- openai-responses.ts
- openai-codex-responses.ts
- azure-openai-responses.ts
- anthropic.ts

The openai-completions fallback that emits `tools: []` when the
conversation has tool history (required by LiteLLM / Anthropic
proxies) is preserved via the existing `else if (hasToolHistory)`
branch.

closes #3649

Co-authored-by: 槐聚 <huaiju@zbyte-inc.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
2026-04-24 14:24:31 +02:00
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