Commit Graph
439 Commits
Author SHA1 Message Date
yetone 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 2026-09-25 15:53:33 +08:00
yetone 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 2026-09-25 15:43:01 +08:00
herrkaefer 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)
A model's image input is taken from models.dev and the provider's own list, and a group's from its members: only a model known to be text-only is refused an image — one whose support is unknown still gets it, and Codex, OpenCode and Pi are told which models take images. An image the user attaches for a text-only model answers 400 in the client's own format before the upstream is asked; an image earlier in the chat, or one a tool returned (Claude Code's Read, Codex's view_image, a Chat tool message), becomes a short text note, so a chat that met a picture carries on after a switch to a text-only model. Thanks @herrkaefer.
2026-09-25 15:39:56 +08:00
yetone 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 2026-09-25 15:02:31 +08:00
yetone 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 2026-09-25 15:02:31 +08:00
yetone 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 2026-09-25 15:02:14 +08:00
yetone 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 2026-09-25 14:54:47 +08:00
yetone 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 2026-09-25 14:48:28 +08:00
yetone 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) 2026-09-25 14:23:56 +08:00
yetone 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 2026-09-25 14:23:56 +08:00
yetone 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 2026-09-25 14:18:13 +08:00
yetone 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 2026-09-25 14:11:17 +08:00
yetone 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 2026-09-25 14:06:15 +08:00
yetone 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 2026-09-25 14:04:44 +08:00
yetone 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 2026-09-25 14:00:14 +08:00
yetone 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 2026-09-25 12:32:14 +08:00
yetone 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 2026-09-25 12:20:50 +08:00
yetone 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 2026-09-25 12:07:01 +08:00
yetone 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 2026-09-25 11:44:18 +08:00
yetone 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 2026-09-25 11:44:17 +08:00
yetone 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) 2026-09-25 11:44:17 +08:00
yetone 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 2026-09-25 09:44:45 +08:00
yetone 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 2026-09-25 09:36:42 +08:00
yetone 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 2026-09-25 09:23:33 +08:00
yetone 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 2026-09-25 09:08:08 +08:00
jimyag 6b8e125df3 fix(provider): preserve Codex import headers (#46)
* fix(provider): preserve Codex import headers

Copy fixed Codex provider headers into imported providers, including entries that match a preset. Compare headers when detecting duplicates or merging keys so reimports and distinct relay accounts retain their request configuration.

Signed-off-by: jimyag <git@jimyag.com>

* fix(provider): keep Codex preset identity on import

Import fixed headers only for custom providers, matching the existing Alma importer and preset request-shape rule. Cover a preset-host Codex entry so its preset and header behavior remain explicit.

Signed-off-by: jimyag <git@jimyag.com>

* fix(provider): normalize headers before import comparison

Compare headers as they are stored so importing a Codex provider again does not report a duplicate when source values contain surrounding whitespace.

Signed-off-by: jimyag <git@jimyag.com>

* fix(gateway): retain Devin reply channel while awaiting

The response reader can delete a pending call before its caller looks up the channel, causing intermittent no such call errors. Return the reply channel from send so await can receive even after the reader removes the pending entry.

Signed-off-by: jimyag <git@jimyag.com>

* Revert "fix(gateway): retain Devin reply channel while awaiting"

This reverts commit 6278c793b9b4f45dc09106168269915007abffe5.

Signed-off-by: jimyag <git@jimyag.com>

---------

Signed-off-by: jimyag <git@jimyag.com>
2026-09-25 08:32:29 +08:00
jimyag c8533f40ff fix(gateway): retain Devin reply channel while awaiting (#48)
The response reader can delete a pending call before its caller looks up the channel, causing intermittent no such call errors. Return the reply channel from send so await can receive even after the reader removes the pending entry.


(cherry picked from commit 6278c793b9b4f45dc09106168269915007abffe5)

Signed-off-by: jimyag <git@jimyag.com>
2026-09-25 08:30:46 +08:00
jimyagandjimyag 00b173682f provider: Codex is one of the apps magpie imports providers from (#45)
Each [model_providers.<id>] table in ~/.codex/config.toml (or $CODEX_HOME) becomes a provider — its base_url, wire_api and bearer token, with the models the top level and the profiles pick for it and their model catalogs; magpie's own table and catalog are left out, as are sub-tables such as http_headers. Claude Code's settings are read from $CLAUDE_CONFIG_DIR when it is set.

Co-authored-by: jimyag <jimyag@users.noreply.github.com>
2026-09-25 07:31:30 +08:00
hanhotfox cd0eccfa58 agent: add Devin (#43)
* agent: add Devin — model via agent.model in config.json, subscription via devin acp over ACP

* gateway: surface devin acp read errors to waiters

* providers: fix devin sign-in exchange; account editor and picker fixes

* gateway: scope the devin deny rules and copy credentials when a link can't be made

* gateway: note devin never rewrites credentials.toml during a session
2026-09-25 07:16:21 +08:00
yetone 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 2026-09-25 06:59:45 +08:00
yetone 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 2026-09-25 06:49:01 +08:00
yetone 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 2026-09-25 06:25:14 +08:00
yetone 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 2026-09-25 05:55:33 +08:00
yetone 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 2026-09-25 05:51:32 +08:00
yetone 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 2026-09-25 05:47:19 +08:00
yetone 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 2026-09-25 05:45:51 +08:00
yetone 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 2026-09-25 05:34:44 +08:00
yetone 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 2026-09-25 05:33:28 +08:00
yetone 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 2026-09-25 05:29:36 +08:00
yetone 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 2026-09-25 05:25:49 +08:00
yetone 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 2026-09-25 05:24:44 +08:00
yetone 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 2026-09-25 05:22:52 +08:00
yetone 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 2026-09-25 05:14:42 +08:00
yetone 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 2026-09-25 05:13:33 +08:00
yetone 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 2026-09-25 05:06:21 +08:00
yetone 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 2026-09-25 05:03:59 +08:00
yetone 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 2026-09-25 05:02:18 +08:00
yetone 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 2026-09-25 05:01:18 +08:00
yetone 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 2026-09-25 05:01:06 +08:00
yetone 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" 2026-09-25 04:48:12 +08:00