Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@
<img alt="Built in Zig 0.17 dev" src="https://img.shields.io/badge/built%20in-Zig%200.17%20dev-f7a41d?logo=zig&logoColor=white">
</p>

<p align="center">
<a href="https://trendshift.io/repositories/84216?utm_source=repository-badge&utm_medium=badge&utm_campaign=badge-repository-84216" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/repositories/84216" alt="justrach/codegraff | Trendshift" width="250" height="55"></a>
</p>

<p align="center">
<strong>The most token-efficient coding harness we've built so far.</strong><br/>
Prompt-cache max keeps repeated prefixes hot. RLM + spec-ptc turns wide work
Expand Down
5 changes: 3 additions & 2 deletions architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,9 @@ as codex).
### Streaming

Root-agent requests stream on **all three** wire formats. `request()` decides
per call: `live = !sub && out != null && !stream_quiet` (compaction sets
`stream_quiet`; subagents always take the buffered `post()` path). When live,
per call: `live = !sub` (`Agent.usesLiveTransport`). `-p` and compaction set
`out=null` / `stream_quiet` to mute paint, not to leave the stall-watched
path; subagents always take the buffered `postWatched()` path. When live,
`buildBody` adds `stream:true` (openai also gets
`stream_options:{include_usage:true}` so token counts survive — dropped and
retried once if a provider rejects it, same pattern as the soft-strict
Expand Down
4 changes: 2 additions & 2 deletions docs/adr/0045-glm-flash-swe-codegraff.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,6 @@ completed the same model. Do not steal Pi's heap (167M vs 23–90M).
## Consequences

- Fair Codegraff A/B is `--model glm-5.3-flash` with `CODEGRAFF_API_KEY`.
- Next graff cut on this model is finishing inside 300s (fewer / shorter
turns), not a catalog shrink to four tools.
- The next cut is ADR 0046: omit default `reasoning_effort` on flash
and compact lean tool prose. Not a four-tool catalog.
- Rotate any `cg_sk_` pasted into a chat; do not commit it.
107 changes: 107 additions & 0 deletions docs/adr/0046-flash-omits-default-effort.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# 0046. Flash models omit default `reasoning_effort`

Status: accepted 2026-08-29

## Context

ADR 0045 ran Codegraff `glm-5.3-flash` SWE after the `-p` learn skip.
Pi 5/6 in 758s (`first` 0.6s). Graff 3/6 in 1353s (`first` 6.9s) with
three 300s timeouts that never edited. Output on the tasks that
finished was 3.5–7.5k tokens. `validated` was 10 calls / 164s vs Pi
5 / 26s.

Pi's `first` is the JSONL `session` line, not first model work — do
not treat 0.6s as a TUI steal. The real gap is that Pi's
`models.json` sets `reasoning: false` / `supportsReasoningEffort:
false`. Graff's codegraff spec has `takes_effort = true`, so an
uncatalogued flash model inherited **default medium**
`reasoning_effort` on every request.

That is the same footgun Gemini already had: default medium maps to
seconds of thinking (2× wall vs Pi). The Gemini skip was
`startsWith("gemini")` only, so `glm-5.3-flash` still thought.

The lean keep-list is already 8 tools (ADR 0024: an rlm-only catalog
failed). Bash / read / edit / codedb / attempt_completion still shipped
interactive-length essays on every `-p` turn.

## Decision

- Flash / Gemini default `.medium` is sent as **`low`**, not omitted.
Omitting the field still bills `reasoning_tokens` (27 on a `pong`;
SWE dumps 1.9MB `reasoning_content`). `low` bills 0. `none` is a
400. `/effort high` still sends high.
- Catalog `glm-5.3-flash` on codegraff (chat completions, 202752 ctx).
Do not pass `glm-5.3` (that row is zai).
- Compact lean one-shot **descriptions** only (same names and JSON
schemas). Do not drop to four tools. Do not steal Pi's heap.
- Root `-p` uses the streaming transport (`usesLiveTransport` = `!sub`).
`out=null` / `stream_quiet` mute paint only. The 5-minute
`postWatched` deadline is for subagents, not one-shots.

## Consequences

- Flash SWE wall is generation without thinking novels, not Zig vs JS.
- `/effort` remains the only way effort moves (ADR / `effort_route`:
no auto-flip).
- `-p` writes `calling <model>` to stderr at start and drops the
call-2 stdout pulse. Eval `first_out` is no longer "time to model
call 2"; stdout stays the answer.
- Revisit if a named flash model needs default thinking — pin it in
the catalog, do not restore a global medium default.

## Confirm (2026-08-29, after this revision)

`run-20260829-041235.jsonl`, Codegraff `glm-5.3-flash`, `--suite swe
-j 6`. No `reasoning_effort` on the wire. Local boot is 7ms; a
`pong` one-shot is 6.1s / 10 out (gateway TTFT). Pi `first` 0.6s is
still the JSONL `session` line.

| | pass | wall | first | out |
|---|---:|---:|---:|---:|
| ADR 0045 | 3/6 | 1353s | 6.9s | 15k |
| after (thinking off) | 3/6 | 1247s | 6.7s* | 21k |

\*first was the call-2 stdout pulse. `validated` 164s / 46k / 10 →
**57s / 11k / 4**. `json-stream` and `cookie-store` still SIGKILL at
300s after that pulse: the second model call took `postWatched`
(~250s of silence, then `retry` / 5xx) because `-p` gated `live` on
`out != null && !stream_quiet`. Root one-shots now `postLive` so the
30s head-stall fires. `label-sort` finished (174s) but still fails
the hidden check. Do not steal Pi's heap.

## Confirm (2026-08-29, after streaming `-p`)

`run-20260829-043927.jsonl`, Codegraff `glm-5.3-flash`, `--suite swe
-j 6`. Root one-shots `postLive`. Eval `first` is the stderr `calling`
line (~0.03s), not gateway TTFT.

| | pass | wall | notes |
|---|---:|---:|---|
| ADR 0045 | 3/6 | 1353s | thinking on; 3× 300s `postWatched` |
| thinking off | 3/6 | 1247s | still `postWatched` |
| **this cut** | **4/6** | **1311s** | 26 calls / 157k in / 29k out |

`json-stream` **passed** in 280s (was SIGKILL at 300s after a silent
second `postWatched`). `validated` 106s / 6 calls. `map-conflict`
116s. `config-parse` 208s.

`cookie-store` still SIGKILL at 300s: call 2 traced `first_token` at
11.5s then never completed — a live stream, not the 5-minute watched
POST. `label-sort` was mid-turn (call 2 was 219s / 1.9MB SSE) when
the cap hit. Do not steal Pi's heap. Do not shrink the keep-list.

## Confirm (2026-08-29, `reasoning_effort=low`)

`run-20260829-045547.jsonl`. Gateway A/B: omit = 27 reasoning_tokens
on `pong`; `low` = 0; `thinking.disabled` still thinks; `none` is 400.

| | pass | wall (sum) | out | calls |
|---|---:|---:|---:|---:|
| Pi (ADR 0045) | 5/6 | 758s | 27k | 35 |
| graff omit | 4/6 | 1311s | 29k | 26 |
| **graff `low`** | **5/6** | **286s** | **4.7k** | 38 |

Same miss as Pi (`label-sort` hidden check). `cookie-store` 115s
(was 300s SIGKILL; Pi 301s). `json-stream` 36s (was 280s; Pi 117s).
Do not steal Pi's heap. Do not shrink the keep-list.
1 change: 1 addition & 0 deletions docs/adr/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ record only when you need the evidence or the edge cases.
| [0043](0043-pi-swe-same-seat.md) | Pi SWE A/B uses `pi-xai` on the SuperGrok seat; do not steal Pi's catalog or heap from the json-stream pass. |
| [0044](0044-oneshot-skips-learn-auto.md) | `-p` and `--json` skip learn auto-init; the Pi SWE wall gap was a 38s `graff-pinned` copy, not their catalog. |
| [0045](0045-glm-flash-swe-codegraff.md) | Codegraff `glm-5.3-flash` SWE: Pi 5/6 in 758s, graff 3/6 with three 300s timeouts; do not steal Pi's heap. |
| [0046](0046-flash-omits-default-effort.md) | Flash / Gemini send `reasoning_effort=low` (omit still thinks); lean `-p` shortens tool prose; `-p` streams. |

## When to write one

Expand Down
4 changes: 2 additions & 2 deletions examples/edge-worker/src/remote.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

export const HARNESS_VERSION = "0.12";

export type ModelName = "MiniMax-M2.5" | "MiniMax-M2.7" | "MiniMax-M3" | "accounts/fireworks/models/deepseek-v4-flash" | "accounts/fireworks/models/deepseek-v4-pro" | "accounts/fireworks/models/glm-5p2" | "accounts/fireworks/models/gpt-oss-120b" | "accounts/fireworks/models/kimi-k2p6" | "accounts/fireworks/models/kimi-k2p7-code" | "accounts/fireworks/models/minimax-m3" | "accounts/fireworks/models/qwen3p7-plus" | "alibaba/qwen3.8-27b" | "anthropic/claude-sonnet-4.6" | "claude-fable-5" | "claude-haiku-4-5" | "claude-opus-4-5" | "claude-opus-4-6" | "claude-opus-4-7" | "claude-opus-4-8" | "claude-opus-4.8" | "claude-opus-5" | "claude-sonnet-4-5" | "claude-sonnet-4-6" | "claude-sonnet-4.6" | "claude-sonnet-5" | "deepseek-chat" | "deepseek-reasoner" | "deepseek-v4-flash" | "deepseek-v4-pro" | "fugu" | "fugu-ultra" | "fugu-ultra-20260615" | "gemma-4-31b" | "glm-4.5" | "glm-4.7" | "glm-5" | "glm-5-turbo" | "glm-5.2" | "glm-5.3" | "glm-5v-turbo" | "gpt-5-codex" | "gpt-5.2" | "gpt-5.3-codex-spark" | "gpt-5.4" | "gpt-5.4-mini" | "gpt-5.4-pro" | "gpt-5.5" | "gpt-5.6" | "gpt-5.6-luna" | "gpt-5.6-sol" | "gpt-5.6-terra" | "gpt-oss-120b" | "grok-4.3" | "grok-4.6" | "grok-build" | "k3" | "kilo-auto/small" | "kimi-for-coding" | "kimi-for-coding-highspeed" | "kimi-k2.6" | "kimi-latest" | "lmstudio" | "mimo-v2-flash" | "mimo-v2.5" | "mimo-v2.5-pro" | "mimo-v2.5-pro-ultraspeed" | "minimax-m3" | "mistral-medium-latest" | "mlx-community/Qwen3.6-27B-OptiQ-4bit" | "openai/gpt-oss-120b" | (string & {});
export type ModelName = "MiniMax-M2.5" | "MiniMax-M2.7" | "MiniMax-M3" | "accounts/fireworks/models/deepseek-v4-flash" | "accounts/fireworks/models/deepseek-v4-pro" | "accounts/fireworks/models/glm-5p2" | "accounts/fireworks/models/gpt-oss-120b" | "accounts/fireworks/models/kimi-k2p6" | "accounts/fireworks/models/kimi-k2p7-code" | "accounts/fireworks/models/minimax-m3" | "accounts/fireworks/models/qwen3p7-plus" | "alibaba/qwen3.8-27b" | "anthropic/claude-sonnet-4.6" | "claude-fable-5" | "claude-haiku-4-5" | "claude-opus-4-5" | "claude-opus-4-6" | "claude-opus-4-7" | "claude-opus-4-8" | "claude-opus-4.8" | "claude-opus-5" | "claude-sonnet-4-5" | "claude-sonnet-4-6" | "claude-sonnet-4.6" | "claude-sonnet-5" | "deepseek-chat" | "deepseek-reasoner" | "deepseek-v4-flash" | "deepseek-v4-pro" | "fugu" | "fugu-ultra" | "fugu-ultra-20260615" | "gemma-4-31b" | "glm-4.5" | "glm-4.7" | "glm-5" | "glm-5-turbo" | "glm-5.2" | "glm-5.3" | "glm-5.3-flash" | "glm-5v-turbo" | "gpt-5-codex" | "gpt-5.2" | "gpt-5.3-codex-spark" | "gpt-5.4" | "gpt-5.4-mini" | "gpt-5.4-pro" | "gpt-5.5" | "gpt-5.6" | "gpt-5.6-luna" | "gpt-5.6-sol" | "gpt-5.6-terra" | "gpt-oss-120b" | "grok-4.3" | "grok-4.6" | "grok-build" | "k3" | "kilo-auto/small" | "kimi-for-coding" | "kimi-for-coding-highspeed" | "kimi-k2.6" | "kimi-latest" | "lmstudio" | "mimo-v2-flash" | "mimo-v2.5" | "mimo-v2.5-pro" | "mimo-v2.5-pro-ultraspeed" | "minimax-m3" | "mistral-medium-latest" | "mlx-community/Qwen3.6-27B-OptiQ-4bit" | "openai/gpt-oss-120b" | (string & {});
export type ToolName = "bash" | "bash_output" | "bash_kill" | "read_file" | "edit_file" | "write_file" | "webfetch" | "skill" | "codedb" | "read_tool_result" | "todo_write" | "todo_read" | "eval" | "note_constraint" | "ask_user" | "attempt_completion" | "load_tool_schemas" | "mcp_search_tools" | "mcp_select_tool" | "clock_sleep" | "subagent" | "workflow" | "agent_output" | "learn_candidate" | "peer_message" | "workspace" | "imagegen";
export type ProviderId = "anthropic" | "codegraff" | "deepseek" | "openai" | "minimax" | "xiaomi" | "kilo" | "groq" | "cerebras" | "mistral" | "kimi" | "moonshot" | "xai" | "zai" | "vercel" | "openrouter" | "fugu" | "fireworks" | "mlx" | "lmstudio" | "codex";

Expand Down Expand Up @@ -521,5 +521,5 @@ export async function* runAgentRemote(opts: RunAgentRemoteOptions): AsyncGenerat
}
}

export const MODELS: ModelName[] = ["MiniMax-M2.5", "MiniMax-M2.7", "MiniMax-M3", "accounts/fireworks/models/deepseek-v4-flash", "accounts/fireworks/models/deepseek-v4-pro", "accounts/fireworks/models/glm-5p2", "accounts/fireworks/models/gpt-oss-120b", "accounts/fireworks/models/kimi-k2p6", "accounts/fireworks/models/kimi-k2p7-code", "accounts/fireworks/models/minimax-m3", "accounts/fireworks/models/qwen3p7-plus", "alibaba/qwen3.8-27b", "anthropic/claude-sonnet-4.6", "claude-fable-5", "claude-haiku-4-5", "claude-opus-4-5", "claude-opus-4-6", "claude-opus-4-7", "claude-opus-4-8", "claude-opus-4.8", "claude-opus-5", "claude-sonnet-4-5", "claude-sonnet-4-6", "claude-sonnet-4.6", "claude-sonnet-5", "deepseek-chat", "deepseek-reasoner", "deepseek-v4-flash", "deepseek-v4-pro", "fugu", "fugu-ultra", "fugu-ultra-20260615", "gemma-4-31b", "glm-4.5", "glm-4.7", "glm-5", "glm-5-turbo", "glm-5.2", "glm-5.3", "glm-5v-turbo", "gpt-5-codex", "gpt-5.2", "gpt-5.3-codex-spark", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-pro", "gpt-5.5", "gpt-5.6", "gpt-5.6-luna", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-oss-120b", "grok-4.3", "grok-4.6", "grok-build", "k3", "kilo-auto/small", "kimi-for-coding", "kimi-for-coding-highspeed", "kimi-k2.6", "kimi-latest", "lmstudio", "mimo-v2-flash", "mimo-v2.5", "mimo-v2.5-pro", "mimo-v2.5-pro-ultraspeed", "minimax-m3", "mistral-medium-latest", "mlx-community/Qwen3.6-27B-OptiQ-4bit", "openai/gpt-oss-120b"];
export const MODELS: ModelName[] = ["MiniMax-M2.5", "MiniMax-M2.7", "MiniMax-M3", "accounts/fireworks/models/deepseek-v4-flash", "accounts/fireworks/models/deepseek-v4-pro", "accounts/fireworks/models/glm-5p2", "accounts/fireworks/models/gpt-oss-120b", "accounts/fireworks/models/kimi-k2p6", "accounts/fireworks/models/kimi-k2p7-code", "accounts/fireworks/models/minimax-m3", "accounts/fireworks/models/qwen3p7-plus", "alibaba/qwen3.8-27b", "anthropic/claude-sonnet-4.6", "claude-fable-5", "claude-haiku-4-5", "claude-opus-4-5", "claude-opus-4-6", "claude-opus-4-7", "claude-opus-4-8", "claude-opus-4.8", "claude-opus-5", "claude-sonnet-4-5", "claude-sonnet-4-6", "claude-sonnet-4.6", "claude-sonnet-5", "deepseek-chat", "deepseek-reasoner", "deepseek-v4-flash", "deepseek-v4-pro", "fugu", "fugu-ultra", "fugu-ultra-20260615", "gemma-4-31b", "glm-4.5", "glm-4.7", "glm-5", "glm-5-turbo", "glm-5.2", "glm-5.3", "glm-5.3-flash", "glm-5v-turbo", "gpt-5-codex", "gpt-5.2", "gpt-5.3-codex-spark", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-pro", "gpt-5.5", "gpt-5.6", "gpt-5.6-luna", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-oss-120b", "grok-4.3", "grok-4.6", "grok-build", "k3", "kilo-auto/small", "kimi-for-coding", "kimi-for-coding-highspeed", "kimi-k2.6", "kimi-latest", "lmstudio", "mimo-v2-flash", "mimo-v2.5", "mimo-v2.5-pro", "mimo-v2.5-pro-ultraspeed", "minimax-m3", "mistral-medium-latest", "mlx-community/Qwen3.6-27B-OptiQ-4bit", "openai/gpt-oss-120b"];
export const TOOLS: ToolName[] = ["bash", "bash_output", "bash_kill", "read_file", "edit_file", "write_file", "webfetch", "skill", "codedb", "read_tool_result", "todo_write", "todo_read", "eval", "note_constraint", "ask_user", "attempt_completion", "load_tool_schemas", "mcp_search_tools", "mcp_select_tool", "clock_sleep", "subagent", "workflow", "agent_output", "learn_candidate", "peer_message", "workspace", "imagegen"];
1 change: 1 addition & 0 deletions graff-evals/harnesses.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"usage": "graff-stderr",
"capabilities": ["output-schema"],
"schema_args": ["--output-schema", "{schema}"],
"env": {"GRAFF_POST_DEADLINE_SECS": "90"},
"default_model": "grok-4.6"
},
"graff-dev-rlm": {
Expand Down
2 changes: 1 addition & 1 deletion sdk/py/harness_sdk.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import urllib.request
from typing import Iterator, List, Literal, Optional, TypedDict, Union

MODELS = ["MiniMax-M2.5", "MiniMax-M2.7", "MiniMax-M3", "accounts/fireworks/models/deepseek-v4-flash", "accounts/fireworks/models/deepseek-v4-pro", "accounts/fireworks/models/glm-5p2", "accounts/fireworks/models/gpt-oss-120b", "accounts/fireworks/models/kimi-k2p6", "accounts/fireworks/models/kimi-k2p7-code", "accounts/fireworks/models/minimax-m3", "accounts/fireworks/models/qwen3p7-plus", "alibaba/qwen3.8-27b", "anthropic/claude-sonnet-4.6", "claude-fable-5", "claude-haiku-4-5", "claude-opus-4-5", "claude-opus-4-6", "claude-opus-4-7", "claude-opus-4-8", "claude-opus-4.8", "claude-opus-5", "claude-sonnet-4-5", "claude-sonnet-4-6", "claude-sonnet-4.6", "claude-sonnet-5", "deepseek-chat", "deepseek-reasoner", "deepseek-v4-flash", "deepseek-v4-pro", "fugu", "fugu-ultra", "fugu-ultra-20260615", "gemma-4-31b", "glm-4.5", "glm-4.7", "glm-5", "glm-5-turbo", "glm-5.2", "glm-5.3", "glm-5v-turbo", "gpt-5-codex", "gpt-5.2", "gpt-5.3-codex-spark", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-pro", "gpt-5.5", "gpt-5.6", "gpt-5.6-luna", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-oss-120b", "grok-4.3", "grok-4.6", "grok-build", "k3", "kilo-auto/small", "kimi-for-coding", "kimi-for-coding-highspeed", "kimi-k2.6", "kimi-latest", "lmstudio", "mimo-v2-flash", "mimo-v2.5", "mimo-v2.5-pro", "mimo-v2.5-pro-ultraspeed", "minimax-m3", "mistral-medium-latest", "mlx-community/Qwen3.6-27B-OptiQ-4bit", "openai/gpt-oss-120b"]
MODELS = ["MiniMax-M2.5", "MiniMax-M2.7", "MiniMax-M3", "accounts/fireworks/models/deepseek-v4-flash", "accounts/fireworks/models/deepseek-v4-pro", "accounts/fireworks/models/glm-5p2", "accounts/fireworks/models/gpt-oss-120b", "accounts/fireworks/models/kimi-k2p6", "accounts/fireworks/models/kimi-k2p7-code", "accounts/fireworks/models/minimax-m3", "accounts/fireworks/models/qwen3p7-plus", "alibaba/qwen3.8-27b", "anthropic/claude-sonnet-4.6", "claude-fable-5", "claude-haiku-4-5", "claude-opus-4-5", "claude-opus-4-6", "claude-opus-4-7", "claude-opus-4-8", "claude-opus-4.8", "claude-opus-5", "claude-sonnet-4-5", "claude-sonnet-4-6", "claude-sonnet-4.6", "claude-sonnet-5", "deepseek-chat", "deepseek-reasoner", "deepseek-v4-flash", "deepseek-v4-pro", "fugu", "fugu-ultra", "fugu-ultra-20260615", "gemma-4-31b", "glm-4.5", "glm-4.7", "glm-5", "glm-5-turbo", "glm-5.2", "glm-5.3", "glm-5.3-flash", "glm-5v-turbo", "gpt-5-codex", "gpt-5.2", "gpt-5.3-codex-spark", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-pro", "gpt-5.5", "gpt-5.6", "gpt-5.6-luna", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-oss-120b", "grok-4.3", "grok-4.6", "grok-build", "k3", "kilo-auto/small", "kimi-for-coding", "kimi-for-coding-highspeed", "kimi-k2.6", "kimi-latest", "lmstudio", "mimo-v2-flash", "mimo-v2.5", "mimo-v2.5-pro", "mimo-v2.5-pro-ultraspeed", "minimax-m3", "mistral-medium-latest", "mlx-community/Qwen3.6-27B-OptiQ-4bit", "openai/gpt-oss-120b"]
TOOLS = ["bash", "bash_output", "bash_kill", "read_file", "edit_file", "write_file", "webfetch", "skill", "codedb", "read_tool_result", "todo_write", "todo_read", "eval", "note_constraint", "ask_user", "attempt_completion", "load_tool_schemas", "mcp_search_tools", "mcp_select_tool", "clock_sleep", "subagent", "workflow", "agent_output", "learn_candidate", "peer_message", "workspace", "imagegen"]
PROVIDERS = ["anthropic", "codegraff", "deepseek", "openai", "minimax", "xiaomi", "kilo", "groq", "cerebras", "mistral", "kimi", "moonshot", "xai", "zai", "vercel", "openrouter", "fugu", "fireworks", "mlx", "lmstudio", "codex"]

Expand Down
Loading