ea3aae9b528773aac254d68fcd94b92e0df2604e
The API Type picker named three vendors — OpenAI, Anthropic, Google — for four wire protocols, so `.openAI` carried a Responses toggle to express the fourth. Each kind also carried a default base URL, which the editor printed as the Base URL placeholder, so `api.openai.com` was on screen for anyone who had added a provider and typed nothing, and a provider with a key but no address quietly resolved to a vendor endpoint nobody had named. The picker now names the protocol: Automatic, Chat Completions, Responses, Messages, generateContent. Automatic reads the protocol off the URL's own suffix and falls back to Chat Completions when nothing matches, which is what an endpoint that does not name itself is almost always serving. Base URL and API Path collapse into one field. Splitting them made "does the base URL include /v1" a question the user had to answer, and it is the question every client of this shape gets wrong. Paste whatever the gateway's documentation printed, at whatever depth it printed it; the two captions underneath say what that produced — Full URL is read from the same value the request is built from, and the line under it names the body shape, which is how Automatic explains its own answer and how an explicit pick that disagrees with the URL stops being a silent surprise. An explicit pick moves the format, never the address: the person who pasted it keeps it. Vertex AI goes with the vendor names. It stays in AgentKit, which is an independent package and does not carry this app's constraints, but nothing here drives it any more — the editor's project, location and service-account import are gone, along with five persisted columns and their Keychain path. `ProviderEndpoint` holds the two things the editor owns, the typed URL and the picked type, because neither survives a round trip through the composed result: a URL ending in /messages looks the same whether it was typed or appended, and Automatic looks the same as picking the format it resolved to. `AIConfigurationModel.setEndpoint` is the only writer of the derived `inferenceURL`, `baseURL` and `apiFormat`. Old rows fold back to the address they used to resolve to rather than to Automatic, so a provider that worked before the change points at the same place after it. That fold needs the pre-V12 columns, which is why `kind`, `baseURL`, `apiPath` and `usesResponsesAPI` are still declared, and it needs V11 frozen: every VersionedSchema in the plan points at live model types, so editing a persisted model rewrites what the old version *means* and leaves an installed store recording a version the plan no longer contains. That is a refusal to open, not a migration. `TermindSchemaV11Models` is what gives V11 to V12 two sides — any future attribute change needs the same freeze. Requires AgentKit 0.5.0, where `ModelAPIFormat` replaces `ModelProviderKind` and a provider carries `inferenceURL` and `baseURL` instead of a kind, a base and a path. Verified with the full test suite (994 tests, including the new ProviderEndpointTests), swift-format lint --strict, Scripts/check-zh-localization.sh, npm run build, and a launch of the app against an existing V11 store. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Description
AI-driven remote workspace for Mac, iPhone, and iPad.
https://termind.akinokaede.com
23 MiB
0 Stars
1 Watchers
0 Forks
Languages
Swift
98.9%
Python
0.8%
Ruby
0.3%