Commit Graph
439 Commits
Author SHA1 Message Date
Charan RathoreandCharan Rathore 70a37c63f1 fix: count unlisted group members when routing long turns (#86)
Co-authored-by: Charan Rathore <charan-rathore@users.noreply.github.com>
2026-09-26 17:52:49 +08:00
yetone f0bd9fac87 cursor: its models have a context window — 1M for the ones Cursor names 1M, else 200K (less where the model's own is smaller), so Codex, Pi, OpenCode, Crush and the rest no longer take them for a small or unknown window; and Claude Code is given a 1M model as <id>[1m], its mark for one, so it no longer compacts at 200K (it drops the mark before asking, and magpie takes a value with it too). Asked on X 2026-09-26 17:49:06 +08:00
yetone 7b69b22a76 quota: what is left of every subscription, plan and key balance, for scripts and agents — magpie quota [<provider>] [--json] prints each window's use and remaining percent and when it starts again, and each key's balance; the gateway answers the same at GET /v1/magpie/quotas (only to this machine, as it names the accounts), so an agent can pick where to send its work (#85) 2026-09-26 17:22:00 +08:00
yetone c0e6d985de library: ZCode gets the library — its instructions go to ~/.zcode/AGENTS.md, its skills to ~/.zcode/skills and its MCP servers to ~/.zcode/cli/config.json's mcp.servers, where ZCode's own MCP settings keep them (a server of the user's there, and the file's other keys, stay as they are). magpie library … agents no longer takes an agent it has no place in for that: an unknown one, or one without MCP (omp) or instructions (Cursor), is refused with why, instead of recorded and given nothing (asked on Discord) 2026-09-26 16:18:56 +08:00
yetone ef26a21da9 tui: providers, groups and usage have pages in magpie tui — 1–4 (or [ ]) goes between agents, providers, groups and usage. Providers: ↵ turns its models on and off, e its key, a adds one of the presets, f its family, u unlisted, t tests it, b its balance, d removes it. Groups: ↵ opens one to add (a), move (J/K) and take out (d) its models, o its routing, f its family; n makes a new one, d removes it. Usage: today, 7 days, 30 days or all time (←→ t w m A), its tokens, calls, cost and errors, a bar a day, and by agent and by model. Asked for on Discord 2026-09-26 16:15:46 +08:00
yetone 73be42eca8 models: each agent can be shown only some of them — a provider or group gets a family (magpie provider set relay-x family=relay), and magpie visible zcode relay shows zcode only that family's models (or named providers and groups): in the files magpie writes for it and in what /v1/models answers it, told apart by its User-Agent; magpie models zcode lists what it is shown and what is kept from it, and magpie visible zcode all shows it everything again. A model kept from an agent is still served when asked for by name. Asked for on Discord 2026-09-26 16:02:29 +08:00
yetone 99fc679e38 sync: a passphrase that is the WebDAV password is refused — the server is sent the password, so with it the server could open the file it is only meant to hold sealed; pick a passphrase of its own 2026-09-26 15:54:16 +08:00
yetone 1c960ac62e claude: a turn in which Claude answered with two tool calls no longer gets stuck — Claude Code makes its MCP calls one after another, so the second was made only once the first had its result, while the agent ran both and sent both results back at once; the second result, for a call not made yet, was dropped, and Claude waited for it while the agent waited for Claude. A result sent before its call is now kept and handed over as the call is made, and only the results sent since the last answer are looked at (#84) 2026-09-26 15:51:13 +08:00
yetone 189c8949ed codex: one of Codex's own models picked while Codex is signed in with an API key OpenAI refuses (one a relay issued, left in ~/.codex/auth.json) failed with OpenAI's bare 401 "Incorrect API key provided" on every turn; the refusal now says it is Codex's own sign-in that was refused and to pick one of magpie's models in Codex or sign Codex in again 2026-09-26 15:14:33 +08:00
yetone c83e03d5c7 provider: how long a request a model takes can be set — magpie provider set <id> context=272k (all its models) or context.<model>=1m, and magpie group set <id> context=… for a group, which otherwise takes its shortest model's; agents are told it (Pi's contextWindow, ZCode, Codex's catalog, Grok, omp, dsh) over what the vendor or models.dev says, and the Providers and Routing views keep it when saved. An empty value clears it 2026-09-26 14:39:55 +08:00
yetone 0f9d60db07 library: the MCP servers an agent's app writes into its config itself (Codex's node_repl and cua_repl, run from inside its install) are told apart — not offered to bring in, shown as the agent's own and left as they are; magpie library lists what agents have that the library doesn't 2026-09-26 14:34:53 +08:00
yetone 5f839eae99 provider: saved Claude or Codex accounts that are not offered say why — under a HOME where the agent is not signed in (a magpie serve with its own HOME, no ~/.codex/auth.json or ~/.claude/.credentials.json there) they went missing without a word; magpie serve, magpie providers and the Providers view now tell 2026-09-26 14:32:48 +08:00
yetone cb609d2cb4 update: after an update on Windows one magpie is left, not two — a magpie running when another updated the binary (it runs on from magpie.exe.old) no longer downloads the update again to magpie.exe.new and swaps it in when it quits; it says a restart is all that is left. A magpie.exe.new that is magpie.exe over again is removed at start. The tray that found the gateway taken serves it once the magpie that had it is gone, checked every 15 s 2026-09-26 14:30:16 +08:00
yetone 6b39a69bf4 provider: a balance field can be a sum — paths into the reply and numbers with + - * / and brackets, "(1 - credits.monthlyCredits / 70) %" for what is left of a plan, a "%" after it showing a percent of 1; "data.total / 500000" and "$data.x" read as before 2026-09-26 14:26:28 +08:00
yetone 6bc43d5dab gui: on Windows, Open folder finds Explorer where Windows keeps it — it was looked for on PATH, and a magpie started without the Windows folder on its PATH said exec: "explorer.exe": executable file not found in %PATH%; now %SystemRoot%\explorer.exe. A PATH taken up from the registry after an install had %SystemRoot%\system32 made C:\Windows$\system32; it is expanded as Windows does 2026-09-26 14:22:47 +08:00
yetone 67c539d5da gateway: secrets can stay on the machine — with Settings › Privacy › Mask secrets on, API keys, private keys, tokens, JWTs and the passwords of connection strings and assignments in what an agent sends go to the vendor as placeholders like {{API_KEY_k3v9x2mq}}, and what the vendor answers has them back, streams included (a placeholder split between two events is put back whole, a tool call's arguments get the value escaped); personal data (emails, phone numbers, ID and bank card numbers, checksum-checked) and the user's own words can be masked too. A placeholder is the same for the same value every time, so a conversation's history and what the vendor cached of it stay the same turn after turn, and the request log shows what the vendor saw. Suggested on X as maskit's idea; written from scratch 2026-09-26 14:21:14 +08:00
yetone cdd1e8e7a4 group: a group's id can change — a group magpie found is group/auto-<model>, and agents could only pick it by that; now its id (any group's) is changed in the editor or with magpie group set auto-gpt-6-astra id=gpt-6-astra: the found one stays removed under the old id, the groups that have it in them and their rules follow, and an agent set to the old id is told it needs setting again (#83). magpie groups no longer says a group in a group is not served 2026-09-26 14:14:26 +08:00
yetone 0849cce8a1 gui: on Linux the window has no system title bar over its own header — GNOME drew one (the name and a ×) stacked on the tabs; the window now keeps GNOME's shadow and resize edges but shows no bar, and the page's header is the title bar: the icon and name, dragged to move, double-clicked to maximise, and a round × that hides the window to the tray. Reproduced and checked on Fedora 44 GNOME 50 (Wayland) 2026-09-26 14:06:45 +08:00
yetone fa9f018a93 gui: on Windows, Open folder starts Explorer and leaves it to open — Wails' way ran it on the thread the windows are drawn on, waited for it and killed it after ten seconds, and the buttons did nothing there; a folder that can't be opened now says why instead of nothing happening 2026-09-26 13:59:02 +08:00
yetone 67056512e0 codex: back on one of Codex's own models after another vendor's, the conversation goes on — another vendor's reasoning (an rs_… id with nothing sealed in it, as Volcengine writes it) went on to OpenAI, which keeps nothing (store is false), looked the id up and answered 404 "Item with id 'rs_…' not found" on every turn and compaction; it now stays out, and an item OpenAI still refuses (sealed content it can't verify, an id it doesn't have) is taken out and the rest asked again instead of the session stuck on it 2026-09-26 13:59:01 +08:00
Zhizhen HeandClaude Code f3d567e07e agent: TOML tables magpie edits end where the parser says — a table no longer swallows the [[skills.config]] blocks that follow it. A write that would leave an invalid config is refused with its file, line and column
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-26 13:46:03 +08:00
yetone d4135b55e1 group: a routing group's models can be another group — group/<id> as a member, routed in its place by its own routing and rules, so Coder can be deepseek-v4-pro then Fast, a Coder rule can send a turn to group/fast and Fast's own rules pick within it; a group can't be in itself directly or through another (refused on save, left out of the picker), groups go at most 8 deep, and one can't be removed while another has it. The Routing tab shows a group in a group as a heading with its models under it, the packet going through it, and the log says what each group's rules and classifier decided 2026-09-26 13:41:17 +08:00
yetone 90ed57f077 docs: intent routing shows a real request in the Routing tab — a message asking for tests, told "writing or fixing tests" by deepseek-flash in 964 ms, goes to glm-5.3 by rule 2; light and dark, English and Chinese 2026-09-26 13:08:47 +08:00
yetone 4aea9a30cc gui: a subscription's quota says it is used — the card showed 47% where Codex shows 53% left of the same window, and it read as the two disagreeing (#81); it is now "47% used" (已用 47%) 2026-09-26 12:43:12 +08:00
yetone 7174df1932 dsh: each magpie model says its context window, longest reply and whether it takes images — dsh otherwise takes a million tokens of context, 256K out and text only for every model, so a 128K model overflowed and a vision model was sent no images (#81); the longest reply comes from the catalog's output limit, a group's is its members' least; older dsh ignores the fields it doesn't know 2026-09-26 12:42:11 +08:00
yetone f64d2fbaf0 intent: a reasoning classifier answered nothing now and then, and the turn after it wasn't classified — tested for real (20 coding messages, real models through magpie), deepseek-flash spent its 512 tokens thinking and answered "", and that 30 s rest skipped the next turn too; the classifier is now asked for its least reasoning (none, else its lowest level) with 2048 tokens, and an answer that isn't a number no longer rests it. DeepSeek V4 Flash, GLM-5.3 Flash and MiMo v2.6 Flash now get 20/20. The site's routing demo opens on By intent: a turn is classified once, goes to its rule's model, and its tool rounds stay there 2026-09-26 12:34:55 +08:00
yetone dc3f69163a gui: the top tabs are the panel's most-used switch and were 24px tall with 12.5px text — now 30px, 13.5px, with more room each side (10px when the header is cramped) 2026-09-26 11:58:26 +08:00
Erick Guan f399af82d1 gateway: /v1/models says whether a model reasons and at which levels (#80)
The OpenAI-compatible model serializer omitted catalog efforts, so endpoint consumers saw reasoning models as incapable. Include reasoning support and effective effort levels for both individual models and routing groups.
2026-09-26 11:54:05 +08:00
yetone d9ff79ae44 docs: Intent routing, in English and Chinese — when the classifier is asked and when not, the exact prompt and what of the message it sees, how its answer is read, what happens when it fails or is slow, the rest of the turn (held, failover, outgrown, waits, subagents), reading the trace, latency/cost/privacy, writing intents, the numbers, and a FAQ; with screenshots of the rules and the trace 2026-09-26 11:30:09 +08:00
yetone 9d092087a1 routing: two of a group's models on one provider are two rows — they go over the same keys, so the diagram told tries apart by key alone and showed the wrong model as answered; a try now carries the model it was for, and the trace names the agent (Claude Code, not claude) when the view opens before the app's state has come 2026-09-26 11:30:08 +08:00
yetone bc720c8d87 group: a rule can be for a kind of message — intent="writing or fixing tests": as a user's turn begins, the group's classifier (any model magpie has, best a small fast one) is asked once which of the intents that may match the message is, and the turn stays with the answer through its tool rounds; it isn't asked when no intent rule could decide, the same message isn't asked about twice, and when it fails or is slow (8s) no intent matches and it rests 30s. The trace says what it was asked and said; Routing's rule editor has "asks for" and the classifier picker, and magpie group rule add … intent=… classifier=… / magpie group rule classifier from the terminal. A sub-millisecond reply no longer shows as NaN s in the trace 2026-09-26 11:09:13 +08:00
yetone b9b412bb0e gateway: a Claude subscription run with no bridge ends without panicking — finish called removeRun on a nil bridge when the idle timer fired for a run made outside one, which crashed the gateway tests under -race 2026-09-26 11:09:05 +08:00
yetone 696c8e70e7 group: rules send a kind of turn to a chosen model — a group's Rules (Routing view, or magpie group rule add|rm|mv) put one of its models first for a turn that is long (tokens ≥ N), carries an image, asks for reasoning (on or at least a level) or comes from certain agents; the first that matches decides as the turn begins and the turn stays there through its tool rounds, moving only if it outgrows its model's context, the others staying behind it for failover; a subagent keeps a place of its own so a rule can send it elsewhere while its agent stays; the trace says which rule sent a turn where. Turn affinity also now sees past the system message Claude Code puts after tool results, which made each of its tool rounds look like a new turn 2026-09-26 03:53:33 +08:00
yetone 31fbf611e7 docs: what an import link's catalog gives — besides names, context sizes and reasoning levels it is the model list when the provider's /models can't be read and the prices behind the Usage page's USD estimate, and several ids may be given 2026-09-26 02:47:19 +08:00
yetone 6da20f50f6 gateway: an agent's run that fails mid-reply ends on the error — Claude Code, Cursor, Grok and Devin runs still wrote message_stop / response.completed / [DONE] after the error event, so a client could take the half reply as complete; the same fix #78 made for translated streams 2026-09-26 02:15:23 +08:00
Charan Rathore fa25a50936 gateway: a reply translated from a dying stream no longer reads complete (#78)
translate ignored readSSE's return, so an upstream that severed mid-reply left a buffered client holding the partial text under finish_reason "stop" and a streaming client with a synthetic stop chunk, final usage and [DONE]; the buffered path now answers 502 and the streamed path emits the client protocol's error event and skips the normal completion, covered by tests that hijack an httptest upstream and close it mid-stream plus a control that a properly finished stream still translates end to end
2026-09-26 02:14:52 +08:00
Charan Rathore f298bb4feb test: keep smart routing reset fixture within one hour (#77) 2026-09-26 01:40:57 +08:00
yetone c25cc6a5fd gui: the profile chips are a target to hit — 25px tall with 12px text under the agents, easy to miss for what the panel is most opened for; now 30px, 13px, with more room between them and bigger ↻ and × 2026-09-26 01:38:38 +08:00
yetone 257b6fa80e group: a removed found group is said to be removed wherever it is — once its model was down to one provider, magpie no longer found it, so magpie group rm said no group "auto-…" and magpie groups didn't list it though its record was still in providers.json; both now know it, restore takes the record out, and group help and groups say that the {"hidden": true} record is what keeps a found group removed 2026-09-26 01:38:38 +08:00
yetone 530734ff46 library: magpie library from the command line, and the app writes the library into the agents when it starts — there was no library command (status, sync, instructions get/set/agents, mcp add/agents/rm, skill agents/rm now), and Sync ran only from the page's button, so an agent installed or a file edited since kept what it had until the Library page was visited 2026-09-26 01:38:37 +08:00
yetone 7c3fa7d19e update: on Windows an update goes in while what the last one moved aside still runs — a magpie serve started before an update runs from magpie.exe.old, which then can't be removed, and moving the running exe onto it failed with "Access is denied"; it now goes beside it (magpie.exe.old-2…), the leftovers are removed once free, the download is kept for another try, and the Update button says Update failed (the error in its tooltip) instead of seeming to do nothing. Reproduced on Windows 11 with a running .old: the old swap fails, the new one passes 2026-09-26 01:38:37 +08:00
yetone 40812f1d2b gateway: a vendor saying the conversation is too long is said the client's way, so the agent compacts and retries — Volcengine's "Input exceeds the context limit (1048568 tokens)" reached Claude Code and Codex as a plain error they stop on; a 4xx that says the input is past the model's context (context_length_exceeded, maximum context length, prompt is too long, exceeds the context limit, 超过上下文…) now answers 400 with Anthropic's "prompt is too long: …" on /v1/messages and code context_length_exceeded on chat and Responses; one about max_tokens is left alone 2026-09-26 01:38:37 +08:00
yetone c330e20231 provider: an account's "only through routing groups" holds, and one removed stays removed — All() merged a signed-in account's picks without Unlisted, so provider listed claude no saved but claude/* stayed in /v1/models; and any save of an account rebuilt its entry without Hidden, so a removed one came back; a save now keeps it removed, and Add it back (and magpie provider add <account>, which made claude-2) goes through ShowAccount, keeping its picks; and magpie provider set <id> k=v… changes a provider with add's pairs (the v0.1.77 notes named it, it didn't exist) 2026-09-26 01:38:37 +08:00
yetone ac352a7755 provider(zcode): a ZCode subscription — Z.ai's GLM Coding Plan, as ZCode uses it: ZCode's own account is read from its credential store (~/.zcode/v2/credentials.json, decrypted as ZCode does, never written), and more are added from magpie with ZCode's own sign-in (zcode.z.ai's polling flow, then the account's zcode-api-key, made if missing), kept in logins.json beside it; requests go to the plan's Anthropic endpoint with the key, the models are ZCode's coding-plan list (GLM-5.3, -Flash, 5.2, 5-Turbo), and usage shows the five-hour and weekly credits. A phone sign-in is named by its number 2026-09-26 01:37:01 +08:00
yetone 1de4bbc715 agent(zcode): magpie's models reach ZCode 3.14 — it moved its providers to ~/.zcode/v2/provider_config.json and reads config.json's only once, to import them, so a magpie provider set up since never showed in its picker; magpie now writes its provider rule (standard-personal, api-key access, anthropic-messages at the gateway) and a model rule per model (context window, images) there too, keeps every other rule and a model the user set by hand in ZCode, and leaves a provider turned off in ZCode off. Checked against ZCode's own schemas 2026-09-26 01:27:54 +08:00
yetone a9aeb4d45f agent(codex): a Codex that couldn't reach magpie says so — the Codex app writes no history.jsonl, so a Codex it started while magpie wasn't running (the gateway refused it, and it built its model list without magpie's) or before magpie set it up (its requests still went to chatgpt.com or an old port) looked fine; magpie now reads the newest model request Codex logged since it was set (logs_*.sqlite, read-only, a day at most) and shows Apply again with the time and why, and to quit and reopen Codex 2026-09-26 01:16:27 +08:00
yetone c8aeff4cea gui: a picker opened upward sits on its button — with no room below, it was placed the most it could be tall (420px for a model picker) above the button, so a short list, like ZCode's two, hung a few rows up over another agent's row; opened upward, its bottom edge is held to the button now 2026-09-26 01:13:06 +08:00
yetone 1b5d1f87db agent: every agent on a magpie model says when it was taken off magpie behind its back, not only Codex — each checks what magpie wired into it to reach the gateway (Claude Code's env base URL and token, and a managed-settings base URL that wins over them; Gemini CLI's .env and its auth type; OpenCode, Pi, Crush, Command Code, Hermes, omp and Grok Build's magpie provider; DeepSeek Harness's llm-deepseek entry and its key in .env), and one pointed elsewhere or gone shows Apply again with what is off in its tooltip; Claude Code, like Codex, is also said to be bypassed when it was used and nothing of it reached the gateway (its history.jsonl), and slash commands no longer count as use. A test takes every such agent off the gateway and back 2026-09-26 01:10:40 +08:00
yetone 31aabbce43 provider: a key added or turned on has its models asked for at once - which models a key sees is known only from its own list, and since #76 an off key's isn't asked, so a key turned back on (or a new one) waited for the next Refresh: a relay that hands out a key per group sent it nothing, or every model; and a Codex reasoning item whose content is null is kept for OpenAI like one without content (#75 dropped it as malformed) 2026-09-26 01:07:47 +08:00
herrkaefer fa38ca4a96 codex: omit incompatible reasoning before OpenAI replay (#75) 2026-09-26 01:06:41 +08:00