Commit Graph

  • 9c119f2086 provider: importing from CC Switch or Alma works on Windows — the database was opened as file://C:/…, which SQLite reads as a host and fails with "out of memory"; it is opened as file:///C:/… now, and the import tests keep USERPROFILE and APPDATA in their sandbox so they never read the machine's own apps yetone 2026-09-25 20:11:28 +08:00
  • 4c67d069d0 sync: magpie's setup kept the same on every computer through WebDAV (坚果云, Nextcloud, a NAS…) — Settings has Sync and backup: the providers with their keys, groups and icons, the settings, the profiles and each agent's models go to the server as one file sealed with a passphrase, so the server never sees them; the magpie serving the gateway looks every three minutes, sends what changed here and brings in what changed elsewhere, a removal too; a part changed on both sides goes to the newer one, and the copy it replaced is kept in the sync folder with a note saying what was replaced; the proxy and the window size stay each computer's own, and a computer set not to send keys never strips them from the server; Export and Import carry the same file by hand (#28) yetone 2026-09-25 19:52:37 +08:00
  • a1e546d4a1 provider: saved accounts are kept signed in — a Claude or ChatGPT account saved in magpie but not the one the agent is on was refreshed only when used or its usage looked at, and smart routing leaves the ones waiting their turn idle for days; the magpie serving the gateway now renews each such sign-in about once a day (hourly check, so a machine that slept catches up), never the agent's own; a refresh the vendor refuses (400/401) marks the account signed out — the account list says to add it again, magpie accounts too — and one that succeeds clears it; magpie accounts refresh renews them all now, for cron or launchd; a switch waits for a refresh in flight, so the agent is never handed a refresh token being spent (#53) yetone 2026-09-25 19:22:37 +08:00
  • ba78ea4218 gui: a profile can be updated to the current setup — its chip has ↻ beside ×, which saves the agents as they are now over it; saving under the same name did the same, but nothing said so yetone 2026-09-25 19:00:10 +08:00
  • 08d1e71aff gui: the window opens at the size it was last given — a resize is kept once it settles, in settings.json, unless the window is maximised, full screen or minimised yetone 2026-09-25 19:00:10 +08:00
  • 4075ccc188 gui: Windows and Linux draw a thin rounded scrollbar, not the classic one with arrows, and the model picker's logo rail no longer shows a scrollbar of its own — it draws its own thumb, and the native one also pushed its logos sideways into a horizontal scroll yetone 2026-09-25 19:00:10 +08:00
  • 47f5a0e1ac provider: Zhipu GLM and Z.ai ask which plan the key is for — a GLM Coding Plan is served at its own OpenAI endpoint (/api/coding/paas/v4), and a plan key sent to the pay-as-you-go one is told it has no balance; the editor offers Pay as you go or Coding Plan, and the base URLs follow yetone 2026-09-25 19:00:10 +08:00
  • 032bcfc8b0 provider: the Grok subscription is called Grok (SuperGrok) — the plan xAI sells, so it reads as the account it signs into; Grok Build stays the name of the agent, the grok CLI the subscription runs through yetone 2026-09-25 18:33:21 +08:00
  • f7112a9e9d agents: Grok Build — xAI's grok CLI — is an agent: its model is set in ~/.grok/config.toml ($GROK_HOME), and a model through magpie adds the catalog there as [model."magpie/…"] tables pointed at the gateway with magpie's own key, so a request never carries the user's xAI sign-in and the catalog joins Grok's own models in /model; its effort is [models] default_reasoning_effort, its requests are known by grok-shell; the Grok subscription is called Grok Build too yetone 2026-09-25 18:26:50 +08:00
  • d4160ad4ae agents: an agent nothing is set on goes under Not set up, even one shown by hand before — showing a hidden one pinned it in view, so clearing what was set on it later left it up among the set ones with nothing to say why. Showing one now only unhides it, and it goes where what is set on it puts it; the pins saved before are no longer read, and are dropped the next time the list is arranged; and one under Not set up can be hidden from its logo's menu yetone 2026-09-25 18:12:41 +08:00
  • 2c7a631221 gui: a Gemini account Google won't serve says why — a personal account, since Gemini Code Assist for individuals ended, or one Google suspended for its terms — instead of "Usage unavailable"; a signed-in account's models are said to be magpie's list until the vendor gives one, not models.dev's; and a new sign-in drops the usage fetched before it yetone 2026-09-25 18:05:35 +08:00
  • 778cf6234f provider: AiHubMix shows its balance — its /dashboard/billing/remain tells a key what is left on it, in dollars; a key with no limit is told a negative amount, so that says the key has no limit and how to give it one to see it here yetone 2026-09-25 18:05:35 +08:00
  • a890311767 provider: a Gemini or Antigravity account's usage shows only the models chosen for it — Google reports a quota for every model the account can reach, and the card listed them all; it keeps the windows of the models the provider exposes (the ones picked, else its preset's), and all of them when none of those has one yetone 2026-09-25 18:05:34 +08:00
  • 41dee15108 provider: the page the browser lands on after a sign-in is signed with magpie's mark — the small magpie from build/icon, drawn in the page's muted colour beside the name at its foot, in light and dark yetone 2026-09-25 18:05:34 +08:00
  • e4bec57d7d agents: only an agent hidden by hand is greyed and has Show — one nothing is set on isn't hidden, it waits under Not set up as it is, and setting something on it brings it up the list yetone 2026-09-25 17:58:20 +08:00
  • e0a4c8e5db agents: a folded agent's Show sits at the end of its name's column, so it comes up in the same place on each row as the pointer goes down them, rather than after each name, wherever that ended yetone 2026-09-25 17:55:36 +08:00
  • 1b309a50f5 agents: a hidden agent says it is hidden, and has its way back beside its name — it was a greyed row among the ones nothing is set on, brought back only from its logo's menu or a right-click, and people took it for broken. The folded agents now sit under a line saying which they are, Hidden or Not set up; hovering one (or tabbing to it) brings up a Show button next to its name; the fold's label counts the hidden ones (Show 6 more (1 hidden)); hiding one says where it went; and the logo's tooltip says a click moves or hides the row yetone 2026-09-25 17:55:04 +08:00
  • f41bd3ba02 library: a skill is downloaded from codeload.github.com, as github.com's own Download ZIP is, rather than the API's /tarball — the API allows 60 requests an hour to an address without a token, so a few installs, or a network shared with others, got "GitHub is limiting requests from here"; and the GitHub links on a skill open in the system browser, where the app's window, which opens no new windows, did nothing when they were clicked yetone 2026-09-25 17:36:48 +08:00
  • bbd7e0475d desktop app: opened from the Finder, the Dock or a login item, magpie takes up the PATH a terminal of the user's has — launchd gives it /usr/bin:/bin and nothing a shell profile adds, so a claude installed under a custom npm prefix (~/.npm-global/bin), or through nvm, bun, volta or asdf, wasn't found and its subscription couldn't be used; the folders those tools use are added at once, and the login shell's own PATH in the background yetone 2026-09-25 17:27:34 +08:00
  • bea2cec91f site: the Routing shot shows four agents — Claude Code, Codex, OpenCode, Crush — sending at once through three routing groups, with Kimi rate-limited and sitting out; in every shot the magpie icon lines up with what's under it, where it had kept the room the Mac window leaves for traffic lights a screenshot doesn't have; and the homepage's Providers shot ends where its list does yetone 2026-09-25 17:21:21 +08:00
  • 17bf6a15ce routing: in Chinese, a provider row's "one key" is "一个 Key", and the caption under the map is said again in the new language when the language changes — it was set as text, so one said before Chinese was applied stayed English ("DeepSeek goes first.") while everything round it was Chinese yetone 2026-09-25 17:20:35 +08:00
  • aedf23abc5 provider: a relay given without its /v1 — one that lists its models at base/v1/models but not at the base — has /v1 added to its chat and responses bases when its models are fetched, since the gateway sends chat to the base as written and its requests 404'd while its models showed; and an Antigravity account Google gave no project says so plainly (with Google's reason, when it gives one) instead of "Usage unavailable" alone yetone 2026-09-25 16:51:26 +08:00
  • 7d0069ab93 site: the import docs come in Chinese too (/docs/zh/import, with its own screenshot of the dialog and the link builder's messages in Chinese), and each page links to its other language; the start docs show what each step looks like — the Add provider sheet, the Agents window, routing groups and Usage — in light and dark, English and Chinese yetone 2026-09-25 16:41:47 +08:00
  • da27f2f0d7 gateway: a Claude Code request that doesn't ask for thinking goes out with thinking off — Anthropic's API assumes that, but DeepSeek's Anthropic endpoint thinks by default, so the session-title requests Claude Code sends without it spent ~100 tokens thinking before a 10-token title; and output_config's effort becomes reasoning_effort on an OpenAI-style upstream only when thinking was asked for yetone 2026-09-25 16:32:40 +08:00
  • e072af501d provider: a subscription used through its vendor's CLI — Devin's, Cursor's, Grok's — installs that CLI when its sign-in starts, if this machine lacks it, rather than leaving the sign-in to fail or, as Devin's did, to say "signed in" and show nothing: Devin's sign-in wrote credentials.toml, but magpie sees the account only through devin auth status, so with no devin CLI no provider ever came and nothing said why. The sign-in is now "installing" while the vendor's own installer runs (curl … | bash, or its PowerShell one on Windows, with magpie's proxy), then opens the vendor's page as before; the window says what it is installing and why, can cancel it, and a failed install says the installer's last line and the command to run by hand. What counts is the CLI being there afterwards — Devin's installer ends in devin setup, whose sign-in gives up without a terminal and fails the script after it installed everything — and on Windows the PATH the installer wrote is taken up so the running app finds it. A Devin sign-in the CLI then can't see fails, where it said done with no one; the tests no longer see this machine's own devin yetone 2026-09-25 16:27:40 +08:00
  • c5a887458f library: Pi is given MCP servers (#58), and the page no longer jumps when it's opened (#59) — Pi has no MCP of its own, and the extensions that give it one (pi-mcp-adapter, pi-mcp-extension) both read the agent folder's mcp.json, so the library writes Pi's servers there, with the transport under both names they read it by (transport, httpTransport) and a lifecycle or anything else the user set there kept; its chips say it reads them through the extension. And the page was drawn anew each time it opened, and on each change, with the fade a tab gets when it's shown, and its text boxes were fitted a frame after they were drawn, so everything under them moved: a tab fades in only when another is picked, and a box is fitted before the page is painted yetone 2026-09-25 16:08:28 +08:00
  • 637b2458ee provider + gateway: Google sign-ins — Gemini CLI's and Antigravity's — are subscriptions of magpie's, so any agent can use their models (#4); Gemini CLI's own login in ~/.gemini is read as it is, or an account is signed in from magpie with Google's OAuth, its token refreshed in memory, and each request goes to Code Assist wrapped as the app wraps it, with the project Code Assist set the account up with; Google now serves Gemini CLI's sign-in only to Code Assist Standard and Enterprise, which need a Cloud project, named with magpie accounts project or GOOGLE_CLOUD_PROJECT in ~/.gemini/.env and said so where the account is shown; Google may suspend an Antigravity account used outside Antigravity, so magpie says that and asks before adding one yetone 2026-09-25 10:44:42 +08:00
  • 14b353ed6c library: a server or skill on no agent no longer blanks the Library — one saved with every agent unticked was listed with its agents as null rather than none, and the page, looking in that list, stopped ("null is not an object (evaluating 'on.includes')"); it's listed with none, and the page takes a missing list for an empty one yetone 2026-09-25 15:43:01 +08:00
  • b5d47ca5e7 gateway: an image sent to a model that can't see is dealt with before it goes out, and one a tool returned no longer ends the chat (#56) herrkaefer 2026-09-25 02:39:56 -05:00
  • 2779d03caa provider: Ollama Cloud is a preset of its own, with Ollama's icon and where to get a key (ollama.com/settings/keys) — its hosted models answer the local server's API at ollama.com with a key: chat at https://ollama.com/v1, Anthropic's messages at https://ollama.com, and the model list from /v1/models, and models.dev's ollama-cloud names them; the import links take it too yetone 2026-09-25 15:00:42 +08:00
  • cedc86db68 agents: the Agents list, in the window and the tray panel, is in the order you put it in and shows only the agents you want — an agent's logo is its handle: drag it to move the row, click it (or right-click the row) for Move up, Move down and Hide, or Alt+↑/↓ from the keyboard; a hidden agent folds away at the bottom under "N hidden" (in the fold with the unused ones, "Show N more"), and Show brings it back, kept in view even while nothing is set on it. The order and who is hidden live in magpie's settings.json (agentOrder, agentsHidden, agentsShown), never in an agent's files; an agent installed later follows the ordered ones in magpie's own order. magpie ls and the TUI keep the order too and list a hidden agent last, dimmed and marked, rather than dropping it, so nothing goes missing from a listing; magpie agents lists them all as before yetone 2026-09-25 15:00:37 +08:00
  • cac0b7f1f2 gui: a picture picked for a provider's icon is kept in the app as in a browser — the app's web view hands its scheme handler no body for a File sent as it is, so every SVG or PNG arrived empty and was refused ("the picture is empty"); the page now sends it as base64 in JSON, and the bytes as they are are still taken yetone 2026-09-25 15:02:14 +08:00
  • d6784bd114 codex: a model a custom provider serves takes the reasoning levels models.dev gives it from the others serving it, so the Codex app offers an effort for it (a Volcengine endpoint's glm-5.3-flash showed 中 with nothing to pick, and magpie's effort control a "none" Codex never used) — levels were only taken from models.dev's entry for the vendor itself, and a vendor it doesn't list (a custom provider, a proxy) had none, so Codex's catalog carried no supported_reasoning_levels; a model models.dev doesn't list for its vendor now takes, by bare id as the context window is found, the levels most of the providers giving any give it (glm-5.3-flash: low, high, max, default high), one no one gives levels for keeps none. Codex's effort is settled on one the model takes when a model is picked and when the catalog is synced, magpie shows the catalog's default where none is set, and the gateway sends a Chat vendor reasoning_effort at the model's nearest level (Codex's medium goes to glm-5.3-flash as high), as asked where the model's are not known yetone 2026-09-25 14:54:21 +08:00
  • ea09310872 site: the getting-started guide says outright that a model two providers serve becomes a group by itself — group/auto-<model>, over every provider serving it, the name matched however each vendor spells it, hidden with magpie group rm — which it said in passing, and someone trying magpie found it out by testing and asked for it to be written down yetone 2026-09-25 14:48:28 +08:00
  • dd7d4875d7 profiles: a saved profile keeps the Library's setup too, and switching to it switches that as well (#29) — which agents get each MCP server and skill, and the instructions (the shared text, the agents it is written to, what each gets besides), so moving from one profile to another left the tools and the instructions as they were and only the models followed. A profile keeps them under "library" beside its agent.field keys; the servers and skills themselves stay in the library, a profile only names them. Applying one sets the models as before, then gives each server and skill to the agents it names and puts the instructions back, written into the agents as any Library change is, their files and the library's own instructions kept aside first; one removed from the library since is skipped and said so, one added since keeps its agents (the profile knows nothing of it, and switching it off would lose it for good). A profile saved before, or while the library was empty, carries none and leaves the library as it is. magpie profiles, the TUI and the panel's chips say what a profile gives out (+ library: 2 servers, 1 skill, instructions) yetone 2026-09-25 14:23:08 +08:00
  • 6418c84b2d library: an agent switched on or off for a server or a skill on the Library page, and the agents picked when one is installed, are the ones kept — the page sends "agents", which the request's embedded instructions change took for its own Agents, so the server's or the skill's was always left empty (a server switched on for Claude Code was taken from every agent, a skill installed for Codex went to none); the request's Agents now answers to "agents" and is handed to the instructions when they are saved yetone 2026-09-25 14:23:08 +08:00
  • 6882ceac7d site: a getting-started guide, in English at /docs/start and in Chinese at /docs/zh/start (/docs and /docs/zh open it) — someone who runs Claude Code, Codex and Paseo every day found magpie confusing at first and the site had only the Add to magpie page for vendors; the guide says what magpie is for and how the setup goes: add the providers you have (subscriptions signed in to in magpie, a vendor's preset and its key, any compatible URL, or Import… from Claude Code and Codex), pick a model for each agent and what that writes into its config, a new session to pick it up, then routing groups when there are several accounts (the Routing view and magpie group), Usage, profiles, the commands and a short FAQ, the Chinese one in the app's own Chinese labels. The home page's Docs link and every docs page's nav and footer lead to it, and on a phone the docs nav keeps the brand, the language, the theme and Download yetone 2026-09-25 14:17:36 +08:00
  • dfc2d7fa93 library: MCP servers, skills and instructions are kept once in magpie and given to any agent from one place, with a market to find and add them (#29). Each agent reads MCP servers and skills from files of its own and in a format of its own, so one server was set up again in Claude Code, Codex, Gemini CLI, OpenCode, Pi, Goose, Cursor, Copilot CLI and Crush. The Library view keeps each once: a server is added (stdio, http or sse, its env and headers) and switched on per agent with its icon, and magpie writes it into each agent's config in that agent's format, leaving what the agent has of its own as it is; a server or skill an agent already has is shown, to bring into the library. A skill is a folder with a SKILL.md, kept in the library from GitHub (owner/repo, or a link to a folder in one; updated from it later) or linked from a folder on this machine, and linked into each agent's skills folder. The instructions every agent reads (CLAUDE.md, AGENTS.md, GEMINI.md…) can be kept as one too. The market offers checked MCP servers first, then the official MCP Registry's, filled in from what the registry says each needs (keys asked for in a form, never guessed), and skills.sh's most installed skills with what each says it is for; each shows its real icon (the vendor's own, else its GitHub owner's), fetched through magpie only for the icons the market or the library gave out, and an added server or skill keeps its icon in the library. What magpie changes in an agent's files is backed up first yetone 2026-09-25 14:11:11 +08:00
  • b3705cbb5a cli: routing groups are made, changed and removed from the terminal too (#55), where only the Routing view could — magpie groups lists them, yours then those magpie found (a removed one named with how to bring it back, a member no provider serves now marked so, the agents set to each); magpie group add <name> models=<m1>,<m2> routing=smart|order|rotate|usage stays=auto|session|turn|off makes one, its id taken from the name and numbered past one taken as the Routing view does; magpie group set <id> k=v… changes name, routing, stays and the models — models= the whole list in order, models+= and models-= one at a time — and changing one magpie found makes it yours; magpie group rm hides one magpie found, for magpie group restore to bring back; magpie group <id> shows one. Each saves through the same code the Routing view's does, so the file holds the same group and agents' model lists follow the change. A model is its provider/model id as magpie models lists it, or a bare model id one provider serves; one no provider serves, or several do, says which it could mean, and a routing or stays value magpie has none of says the ones it has, where the saved group would have quietly gone back to the default yetone 2026-09-25 14:05:15 +08:00
  • e8b3be572c windows: the desktop app no longer opens a console window for every command it runs (#54) — it is linked as a GUI program and has no console, so each console CLI it started (devin auth status and models list, devin acp for every Devin turn, claude, codex, cursor-agent and grok probes and runs, grok login) was given a new console by Windows, and a Windows Terminal window with it, some every few seconds while the app sat idle. Every command magpie runs is now made through internal/proc, which starts it with CREATE_NO_WINDOW when magpie has no console of its own: the child gets a console without a window, and its output, which magpie always pipes back, arrives as before. A magpie run in a terminal (magpie serve, the TUI, the desktop app started from one with a command) has one, and its children share it as they did, so Ctrl+C there still reaches them. The relaunch after an update keeps its DETACHED_PROCESS, added to rather than replacing the flags it was made with, and a test fails on any command made with os/exec directly, so a new one can't bring the windows back yetone 2026-09-25 14:03:51 +08:00
  • 783b22a284 provider: a ChatGPT Team workspace on the email of a personal plan is an account of its own, as a Claude Team seat is — accounts were told apart by email alone, so adding one replaced the other and the two took turns (Team and Plus on one email); an account is now its email within a workspace (chatgpt_account_id), and a workspace's is named with its plan (me@example.com · Team) to switch to and remove; one saved under its bare email before is the same account and takes the new name yetone 2026-09-25 13:59:57 +08:00
  • 09c635cf03 agents: a model through magpie tells Pi, Crush, omp and Codex how much it holds, and a provider added, edited or removed reaches the model lists agents keep in files of their own — the catalog carried no context window, so Pi took every model through magpie for a 128K one (a CLIProxyAPI's gpt-5.5 holds 922K) and Crush for a 200K one; each model now carries models.dev's input limit, else its context, looked up by bare id as most of the providers serving it give it (a proxy's "openai/gpt-5.4", "gpt-5.4(high)", "glm-4.6:free" find it too; a group holds the least of its members'). And those lists were written only when a model was picked: Codex's magpie-models.json, Pi's models.json, OpenCode's, Crush's, Command Code's, omp's and Hermes' provider blocks and dsh's llm-deepseek entry kept the catalog as it was then, so a provider added later never showed. Saving a provider, a vendor's list fetched anew or models.dev synced now rewrites each one magpie wrote, where it differs, and the app does once at start-up; a Codex signed in to ChatGPT, which asks the gateway, kept its cached list under the backend's ETag, which a change of magpie's never changed — the ETag (and a reply's X-Models-Etag) now carries a tag of magpie's models, and a cache from before a change is aged so the next Codex asks again yetone 2026-09-25 12:30:12 +08:00
  • 3b1f8a49c9 gateway: a ChatGPT account's reply that calls a tool says it stopped for one — the backend's completed response lists no output, and whether the turn ended in a call was only looked for there, so an Anthropic client was told end_turn under a tool_use block and one that goes by stop_reason took the call for the answer; a function call seen in the stream now says so yetone 2026-09-25 12:18:39 +08:00
  • 3eed0cdba4 netproxy: an agent's CLI that magpie starts — grok login, cursor-agent, devin, Claude Code, and the runs behind their subscriptions — goes through the proxy magpie's own requests do (#51); the CLIs read only *_PROXY, which an app started from the Dock doesn't have, so a proxy set in magpie or the system alone left grok login trying auth.x.ai directly until it timed out. A proxy set in magpie replaces the environment's, "direct" drops it, the system's is added where the environment names none, and loopback stays direct for the CLIs' calls back to magpie yetone 2026-09-25 12:07:01 +08:00
  • 130a852fe9 copilot: a model Copilot offers with terms of its own is listed, and its terms accepted the first time a request asks for it, as VS Code does when one is first picked — such a model stays disabled until the account enables it, so magpie left it out, where the account may enable it itself (POST /models/{id}/policy); the list asks again after a restart to know whose terms wait. A model no picker offers (an old snapshot, Copilot's own), one the account can't enable (it answers 403) and an Experimental vendor's stay out yetone 2026-09-25 11:43:14 +08:00
  • 95c572e91e gateway: a Claude subscription conversation's next turn goes to the Claude Code that had its last, told only what the user said since, so the conversation Claude Code keeps goes on as it began and its cached prompt is read again — each turn started a new run from the whole history in one message, which shared nothing with the cache but Claude Code's own prompt, so every turn wrote some 5.7K tokens to the cache again where it now writes about 100 (a three-turn conversation went from 37% of its input cached to 79%, one with tool calls from 63% to 87%, about 99% past the first call); a run waits for its conversation up to 20 minutes, six at most, and is found again by what the conversation has been so far, else a new one starts as before; and it is set waiting before the reply's last event, which a quick agent answers at once. Anthropic's usage leaves out what the prompt wrote to the cache, and the OpenAI and Gemini counts magpie gave from it did too, so Codex was told a Claude turn of 26K tokens took 2; and an agent that hangs up once the last event is in (Codex does, before the ChatGPT backend closes its end) had its call logged as canceled, 499, though it was answered in full yetone 2026-09-25 11:42:27 +08:00
  • 2b80641dfc codex: a ChatGPT account's requests are made as Codex CLI makes them, as Alma's Codex plugin does — the backend gates its newest models on a Codex User-Agent (gpt-5.6-luna answered 404 "Model not found" to magpie's), so a request now says it comes from codex_cli_rs, carries the instructions the account's model list gives each model (kept on disk beside the list, for the gateway to find though another process asked, else Codex CLI's copy, else Codex's generic prompt) with the client's own riding first in the input, and is shaped the way Codex sends one: no stored references or item ids, a tool output without its call told as a note, reasoning summaries and encrypted content asked for, tool_choice auto; and a conversation whose client names none gets a prompt_cache_key of its own, the same on every turn, taken from how the conversation starts, so its cached prompt is found again (Claude Code through magpie went from 74% of its input cached to 96%, where requests without one landed on caches that didn't have it) yetone 2026-09-25 11:20:09 +08:00
  • 06e873d9a0 gui: copying goes through magpie to the system clipboard — the app's window loads its page from a scheme where the page's own clipboard API is refused, so every copy button only put the text in the status line; the page asks magpie first and falls back to that API in a browser tab yetone 2026-09-25 09:44:45 +08:00
  • 35ebc94d58 provider: a preset's provider takes request headers of the user's own, and a preset can be added more than once (#50) — which workspace a key that reaches several is for (anthropic-workspace-id), or who the app is to OpenRouter, could only be said by a custom provider, so it meant giving up the preset's endpoints and catalog; the editor now shows headers for presets as well, offering the ones the vendor documents with their values left to fill in, and "Add another" makes one more provider of a preset under an id of its own (anthropic-2) where adding again replaced the first; the same key, host and headers twice is refused as the one already there, and importers keep a preset's headers and its preset when they split an entry off to a free id yetone 2026-09-25 09:36:42 +08:00
  • 00744ca373 codex: subagents can be put on a magpie model of their own — Codex's spawn_agent tool lists only the first five models it knows, its own ahead of magpie's, so signed in a model spawning a subagent never saw a magpie model to pick; Codex gets a subagents field that writes [agents] default_subagent_model, the model a subagent starts on when none is asked for, offered once Codex runs through magpie and taken out again when it steps back to its own models yetone 2026-09-25 09:23:33 +08:00
  • b72985a9cc agent: add Hermes Agent (#49) — magpie adds itself to ~/.hermes/config.yaml ($HERMES_HOME) as the provider "magpie" under providers (the gateway as chat completions, the catalog as its models) and points model.provider at it, with the model in model.default; the provider and model the user had are stashed and put back when they pick one of Hermes's own or go back to the default. Hermes sends its own User-Agent only from a recent release on, so the entry sets it for the gateway's usage view yetone 2026-09-25 09:08:08 +08:00
  • 6b8e125df3 fix(provider): preserve Codex import headers (#46) jimyag 2026-09-25 08:32:29 +08:00
  • c8533f40ff fix(gateway): retain Devin reply channel while awaiting (#48) jimyag 2026-09-25 08:30:46 +08:00
  • 00b173682f provider: Codex is one of the apps magpie imports providers from (#45) jimyagandjimyag 2026-09-25 07:31:30 +08:00
  • cd0eccfa58 agent: add Devin (#43) hanhotfox 2026-09-25 07:16:21 +08:00
  • 626933ff2b codex: a magpie model that takes images says so in the catalog magpie gives Codex, which otherwise drops an attached image before sending — every magpie model was listed as text-only, so a picture pasted into Codex never reached a vision model; whether a model takes images is what its vendor's models.dev entry says, or for one served by a vendor models.dev doesn't list, what most of the providers serving that model say, and a routing group takes them only when every member does yetone 2026-09-25 06:59:45 +08:00
  • bd5bf422ed codex: a ChatGPT account out of allowance gets magpie as a provider of Codex's, and a routing group is named as one in the Codex app's list — signed in through openai_base_url, the Codex app won't send anything once the account has used its allowance up, a magpie model's request too, so magpie is then wired as it is when signed out (model_provider, as the account's own models can't run anyway); and the gateway's model list for the signed-in app named a group after its first member's provider ("z-ai/glm-5.3 · nvidia"), reading as that provider's own model, where it now says routing group, as magpie's other lists do yetone 2026-09-25 06:49:01 +08:00
  • 612e1d6e5c gateway(test): TestUsableOrder starts from an empty home, as the others do — it read this machine's cached Copilot model list, which says where each model is served, and failed wherever Copilot had been listed yetone 2026-09-25 06:25:14 +08:00
  • 293c45677c agent + gui: magpie and curl are clients the gateway knows by name, with their logos, beside the agents — the Usage and Routing views both draw a request's client from the one list, every agent in it whether it is set up here or not, where Routing only knew those found on this machine yetone 2026-09-25 05:55:33 +08:00
  • a9e1a6769a agent + usage: each agent says what its User-Agent begins with, beside its name and icon, and the gateway tells requests apart by that — usage kept a list of its own, which had to be kept in step with the agents by hand and wasn't (DeepSeek Harness, omp and Command Code were missing from it, so they were drawn with no logo); a new agent is now known by its requests as soon as it is described yetone 2026-09-25 05:51:32 +08:00
  • 658d264e14 usage: DeepSeek Harness, omp and Command Code are known by their User-Agent — deepseek-harness/… was kept as it came, not as the agent dsh, so the Routing view and Usage drew it as an unknown agent with no logo; records kept that way are read as the agent's too yetone 2026-09-25 05:47:19 +08:00
  • 5cbfaa6c04 gui(providers): an agent on a routing group shows on each provider one of its members is on, as one on a provider's own model does — its icon in the list, a chip in the editor naming the group, the gateway counting it routed through — and clicking it opens the whole picker, the group first, rather than only that provider's models, which would take it off the group yetone 2026-09-25 05:45:51 +08:00
  • 6648a8a2ec cli: a model typed as another agent spells it is put the way this one does — magpie/copilot/gpt-6 for Codex, which names catalog models copilot/gpt-6, and copilot/gpt-6 for Pi, which names them magpie/copilot/gpt-6 — rather than written as it is, where Codex took it for one of OpenAI's own and asked OpenAI for it; a magpie/… model the catalog doesn't have is refused, and a model the agent's picker doesn't list is still taken as it is yetone 2026-09-25 05:34:44 +08:00
  • 01cee5a268 gui(routing): a key or account its vendor doesn't list the model to isn't drawn among those routed over, nor counted or shown in the activity — it is never asked, and a faded row read as an upstream that failed; why it was left out is still told beneath yetone 2026-09-25 05:33:28 +08:00
  • 8ab5475586 gui(routing): a key left out says what magpie saw — its vendor's list for it has no such model, naming the vendor — rather than that the key isn't given it, which nobody has checked yetone 2026-09-25 05:29:36 +08:00
  • 4c463c6c5f gui(routing): a key left out of a route is said to be one its provider doesn't give the model — relays list each key its own group's models, as 鱼鱼连线 gives GPT to one key and Claude to another — rather than one whose plan lacks it, which is an account's yetone 2026-09-25 05:25:49 +08:00
  • eb4cc3437d gateway: a request an upstream fails is failed over rather than handed back — a model the provider says it doesn't serve (Copilot's "not accessible via the /chat/completions endpoint", "model does not exist" and the like) goes on to the next one, as a 401, 404, 429 or 5xx already did; an error a stream begins with, before any of its content (Anthropic's overloaded error after message_start, a Chat error chunk, Responses' response.failed), is held and failed over as an error status is, while one after content has begun reaches the agent as it came; the last one left, or the only one, is tried again twice after a failure that may pass (408, 5xx, 529, a 429 that says when), a second and then two apart or as Retry-After says; and an agent that goes away mid-request is counted as canceled, resting nobody and asking nobody else. One that answers stops resting. The Routing view tells each of these yetone 2026-09-25 05:24:44 +08:00
  • 6f19f60b08 provider(copilot) + gateway: each request goes straight to an API its model is served on, as the provider's model list says, rather than being learned from a refusal — Copilot's list gives every model its endpoints (GPT-6 and 5.5 on /responses alone, Claude on /v1/messages and /chat/completions, Gemini and Kimi on /chat/completions), they are kept with the cached list, and the gateway picks among them, relaying the agent's own API when it is one and translating otherwise; a refusal is still caught for a provider that doesn't say. Copilot's Anthropic endpoint is used too, so Claude Code reaches Copilot's Claude models without translation; a turn that only returns tool results is counted as the agent's (X-Initiator) in Anthropic's format as in the others, and images in Anthropic and Responses requests are flagged as Copilot asks. The provider test asks each endpoint with a model served there yetone 2026-09-25 05:22:52 +08:00
  • a986ac3855 gateway: a request that must be translated for an OpenAI model on OpenAI's or Copilot's API is spoken as Responses first, the API their newest models are made for (and some are served on alone); every other vendor is still spoken to in Chat Completions first, as all of them serve it alike, and either way a model turned away is sent on to the provider's other endpoint. A request an agent sends in an API the provider serves is still relayed as it is yetone 2026-09-25 05:14:42 +08:00
  • 9c7a00fc07 gateway: a model its provider serves on only some of its endpoints is sent to one that takes it — when the provider answers that the model isn't served on the endpoint asked (Copilot's "not accessible via the /chat/completions endpoint", OpenAI's "use v1/responses", and the like), the request is spoken again as the next protocol the provider has, whether it was being relayed as the client sent it or translated, and the model is remembered there so later turns go straight to it; both ways round, so Pi's chat requests reach Copilot's GPT-6 on /responses and Codex's Responses requests reach its Claude models on /chat/completions. Copilot now lists its /responses endpoint too, and a Responses request's last turn is read for who started it, as a chat one's is yetone 2026-09-25 05:13:33 +08:00
  • 283c71ac78 gui(agents): the effort slider follows the theme and keeps to magpie's black and white — a thin track filled in the text colour up to the level, a small white thumb, a dot at every stop and the two ends named beneath it, on the same popover as every other picker, rather than a dark panel with a purple track and sparkles in light mode too yetone 2026-09-25 05:06:21 +08:00
  • 5d54f20d56 gui(agents): a field left at its default reads in the same size, weight and colour as a chosen one — the icon beside it already says what it is yetone 2026-09-25 05:03:59 +08:00
  • 8bade2eb7a gui(agents): the effort bars follow the slider — moving it changed the level's name on the chip but left the bars at the level it opened with yetone 2026-09-25 05:02:18 +08:00
  • 06997e90eb gateway(routing groups) + gui(picker, gateway, routing) + codex: routing groups come first in the model picker under a routing icon of their own, each shown as its providers' icons stacked, and are listed first in the Gateway view's models too; a model is found to be the same under the ids its vendors give it — claude-opus-5-5 and claude-opus-5.5, dated or not — so the Claude subscription's Opus 5.5 joins its group; keys made for different protocols are pools apart, a request going round the keys that suit it before trying another's; Codex's model list is asked for as the newest Codex on the machine (codex --version) rather than the version its cache last wrote, so models only newer clients are shown — GPT-6 Sol and Luna — are listed; the Routing view keeps its providers in one order rather than reshuffling them per request; mask icons in the picker have a size to fall back on, so OpenRouter's and Copilot's show yetone 2026-09-25 05:01:18 +08:00
  • acb4ca5096 gui(agents): every field on an agent's row leads with an icon — a model left at its default shows the agent's own logo, as the picker's Default row does, and effort or thinking shows four bars filled up to its level (none for the default), so the chips line up down the list yetone 2026-09-25 05:01:06 +08:00
  • ad421374d8 agent(picker): a provider an agent is signed in to on its own is named and shown as itself — "GitHub Copilot" with Copilot's logo in OpenCode's picker rather than "github-copilot" under the first model's Claude logo, "Anthropic" rather than "anthropic" yetone 2026-09-25 04:48:12 +08:00
  • db0b2c6860 gui(agents): the Agents view shows its rows' shape while it first reads the agents — the same shimmering skeleton the Providers, Gateway and Usage views have, an icon, a name and the two setting columns per row, with the profiles held back until the list is in; a reload keeps the rows it has yetone 2026-09-25 04:36:11 +08:00
  • 520a2425fc gateway(routing groups, affinity) + gui(routing): routing groups — several models, from one provider or many, that an agent picks as one (group/<id>), routed over all their members' keys and accounts together, smart, in order, in turn or least used first; a model more than one provider serves is a group magpie finds on its own, and becomes the user's once changed. Affinity keeps a conversation with the key or account that answered it — for the session, within a turn, never, or by default while what the vendor read from its cache is worth keeping and not yet cold — so the prompt cache holds; in turn now spreads turns rather than requests, a turn's tool results staying where it began. The Routing view shows each agent's requests in its own colour, the magpie flying them through the gateway's box rather than jumping across it, groups and why a conversation stayed or moved; and a Hide emails switch blurs the email addresses on the page, for a screenshot to share yetone 2026-09-25 04:07:40 +08:00
  • c3931c91df codex: magpie's models join Codex's own rather than replacing them — signed in (ChatGPT or an API key), Codex keeps its built-in OpenAI provider and sign-in and is pointed at magpie with openai_base_url alone, so its official models still go to OpenAI on the user's own account, its threads (listed per provider) stay together, and the Codex app keeps its model picker; magpie's gateway answers at /backend-api/codex, passing Codex's own models through as they came, serving magpie's (provider/model) itself, and handing out OpenAI's model list with magpie's after it for /model. Compacting a magpie model's conversation is done by that model with Codex's own prompt; Codex's compressed request bodies are read, and usage is counted for both. Not signed in, magpie stays a provider of Codex's as before; a magpie set up that way moves over the next time a magpie model is picked yetone 2026-09-25 02:42:24 +08:00
  • 0281df4d87 gui(routing): Routing is a view of its own, beside Gateway — the Gateway view keeps to connecting and the model list; Routing plays each request with room to spare, every request the gateway keeps is listed (when, the agent and the model it asked for, who answered and with what model, the tries, how long, the tokens) and picking one shows how it was routed, and each account or key those requests weighed says how often it was tried, answered and failed, what it answered with, when last, and whether it rests; the model each account or key is asked for shows on its row and in the story yetone 2026-09-25 02:35:38 +08:00
  • af5889085a gateway(routing, live): the Gateway view plays what routing does with each request as it happens — the site's Model Routing stage, driven by the gateway's own trace: the agent, magpie with the provider's routing, and its accounts or keys in the order routing weighed them, each saying what it was weighed by (how much is used and when it renews, kept for last, not known yet, resting and until when, left out as its plan doesn't list the model); a request travels to the one put first, one that fails shows what it answered and hands it on, and the story beside it says why the first went first, why each other stands where it does, how long a failed one rests and what said so, and what the agent got; recent requests can be picked to see how each was routed, and the counts are the gateway's since it started. Nothing is worked out again in the page: the gateway records each decision where it makes it. A vendor's Retry-After and rate-limit reset headers now come through with its error, so a rate-limited key or account rests as long as the vendor says rather than a minute yetone 2026-09-25 02:28:32 +08:00
  • b225ace50c gui(panel): no dark band at the bottom while the tray panel grows — WebKit draws the page a frame or two after the panel's frame moves and filled the new edge with its own dark background; on the Mac the panel's webview now draws no background of its own and the page's colour is painted in a view under it that the system sizes with the panel, so the new edge comes in the page's colour until the page catches up. It looks as before; a change of theme fades it along; elsewhere, or when the webview won't, the page paints itself as it did yetone 2026-09-25 02:19:32 +08:00
  • 497f2cac6e ci: Windows compiles the tests rather than running them — they fake a home through $HOME, which Windows doesn't read yetone 2026-09-25 02:11:01 +08:00
  • fb258266ee ci: vet and test on Linux, macOS and Windows for every push to main and every pull request, and build the terminal-only magpie yetone 2026-09-25 02:08:26 +08:00
  • 03188b86b2 gateway: routing by reset is thorough — only the windows that count a model do (Opus's own weekly allowance used up leaves the account to Sonnet), the week decides and the five hours in it settle a tie, a window whose reset has passed counts as empty, and Grok's on-demand spending and Copilot's completions don't stop an account; the first requests after magpie starts wait a moment for the allowances rather than going in plain order; Copilot's accounts are each asked for their allowance, which renews on the day GitHub says, and have a Usage card each; a subscription out of its allowance rests until the window it filled renews (or when Claude Code says it resets), and is asked again what it has left; "You've hit your limit · resets …" is known as out of quota yetone 2026-09-25 01:57:27 +08:00
  • db59d15ed4 gui(panel): the tray panel's height glides with the agents' scroll as it unrolls and rolls up, on the same beat and curve, its top edge held under the menu bar — on the Mac the system animates the frame on its own display clock, elsewhere it steps a frame at a time; a fit that doesn't ask to glide still sizes at once, and make dev shells from before still size yetone 2026-09-25 01:53:21 +08:00
  • c83a07d63b gui(agents): Show more unrolls the other agents like a scroll, and Show less rolls them back up — the height opens on a long ease-out while each row fades and settles in a beat after the one above, the moving edge soft; rolling up is quicker, bottom row first. The agents in use stay put above, the chevron turns, and the tray panel makes room before unrolling and gives it back once rolled up yetone 2026-09-25 01:45:37 +08:00
  • 2432d2ca88 gui(agents): fold the agents nothing is set on behind Show N more (#41) elonnzhang 2026-09-25 01:40:07 +08:00
  • 37e8f7c045 header: in a narrow window the name steps aside, leaving the magpie, and Update becomes its arrow; narrower still, the tabs sit in the row instead of over it yetone 2026-09-25 01:35:24 +08:00
  • 90580ca7e1 update: Update updates magpie in place — a click downloads the new version and restarts into it, asking for the password when magpie can't replace itself, instead of opening the release page; only a magpie running from its disk image or a temporary copy is sent to the download page, with why yetone 2026-09-25 01:35:24 +08:00
  • 4091b9dfd5 dsh: switching the model works on dsh 0.1.5 — it reads each profile's cordis.patch.yml (profiles/web, desktop, …) rather than ~/.dsh/config.yaml, so magpie writes there: agent-default-model for the model new sessions start on, and llm-deepseek naming its key as a credential (MAGPIE_API_KEY, in ~/.dsh/.env) since the entry no longer takes one; a model picked inside dsh, saved in its settings, gives way to one picked in magpie; older dsh keeps config.yaml as before; dsh's own deepseek-flash is on the list yetone 2026-09-25 01:34:27 +08:00
  • b498b1fb02 settings: the Community row is a Discord-coloured "Join Discord" button with Discord's mark, quiet until hovered, in place of a plain link and a "Join ↗" yetone 2026-09-25 01:28:08 +08:00
  • d8ee8d1af3 community: magpie has a Discord — the site links it from the header, the footer and a card above the download, Settings has a Community row that opens it, and the README a badge and a Community section yetone 2026-09-25 01:22:16 +08:00
  • c65a1f5187 import from other apps: an app with nothing to bring over no longer breaks the dialog — its list came back null, and the dialog stopped at "null is not an object (evaluating 's.items')"; Claude Code's tab shows Claude Code's mark instead of a missing image yetone 2026-09-25 01:22:16 +08:00
  • ce7c8367a1 header: the magpie flaps its wing, flicks its tail and bobs as the window opens and when the pointer comes over it (not with reduced motion); it sits a little further from the traffic lights, and off the Mac it is left out, since the title bar above already shows the icon and the name yetone 2026-09-25 01:15:28 +08:00
  • 477e8ecc8f window: the tab, and the provider open in the editor, are kept in the address (?view=providers&edit=<id>), so a reload comes back to them yetone 2026-09-25 01:15:22 +08:00
  • a04eabd92e gateway: on Windows the examples are PowerShell — $env: for the variables and the curl.exe that ships with Windows, the body on stdin since Windows PowerShell drops the quotes inside an argument; the snippet's copy button stays in the corner however far a long line scrolls; and with no models the list says so instead of showing a script error yetone 2026-09-25 01:15:15 +08:00
  • deb0d9e5e8 usage: Cursor's allowance shows on the Usage page, and every card names the account it is for; an agent with several Claude or Codex accounts is one card with a section per account, the one it is signed in to first yetone 2026-09-25 01:15:09 +08:00
  • ecaaf888b5 providers: a provider with several keys has its models asked with each key, and each model remembers which keys see it — a relay that hands out a key per group lists each group's models to its key only; requests go to a key that lists the model (every key when none does), and Test signs each endpoint with a key made for it and asks for a model that key sees yetone 2026-09-25 01:15:02 +08:00
  • 9a0078f08c dev: a Go change under make dev rebuilds and restarts only the backend — the API and the gateway — behind windows and a tray that stay up, and the page refreshes what it shows in place, keeping its tab and anything open; a build that fails leaves the running backend be (build/dev.sh) yetone 2026-09-25 01:14:56 +08:00