Repository navigation
·
1549 commits
to main
since this release
Added
- Custom providers and models. A
[providers.<id>]table withapi,
base_url,api_key_env/api_key/api_key_secret, optional
auth = "none",headers,discovery = "openai" | "ollama"and
[[providers.<id>.models]]defines an OpenAI-, Anthropic- or
Google-compatible endpoint (ompmodels.ymlparity). Its models resolve as
<id>:<model>/<id>/<model>for the default model,/model, model roles,
task/compaction selectors and fallback providers, appear in the/model
picker andlemon providers status, and are checked by
lemon config validate. On built-in providers,headersare sent with every
request andmodelsentries add or replace catalog models. See
Custom Providers and Models. - More provider sign-ins in
lemon model.lemon model openai-codex --auth devicesigns in to ChatGPT with a device code (headless, also
--non-interactive).openrouteradds browser sign-in that mints an API key,
xaiadds SuperGrok / X Premium+ device sign-in,kimi_coding(kimi-code)
adds Kimi Code device sign-in, andzaiadds GLM Coding Plan sign-in that
provisions an API key. xAI and Kimi logins refresh automatically;
--status/--logoutcover all of them. See
CLI. - API-key sign-in for every catalog provider.
lemon modelnow offers
Google Gemini API, Groq, Cerebras, DeepSeek, Mistral, Hugging Face, Qwen
(DashScope), Vercel AI Gateway, OpenCode Zen/Go, MiniMax China and every
hosted OpenAI-compatible preset (model choice lists the endpoint's models);
the key is stored encrypted and referenced asapi_key_secret. - OAuth logins can be force-refreshed after the provider rejects an unexpired
token (Credentials.refresh_provider_api_key/4, used by 401 recovery). - Local and open-model provider presets. Ollama, LM Studio, llama.cpp,
vLLM and LiteLLM work without an API key (ollama:qwen3:32b), with omp's
default endpoints andOLLAMA_HOST/*_BASE_URLoverrides; hosted presets
cover Ollama Cloud, Together, DeepInfra, NVIDIA, Novita, Baseten, Venice,
Synthetic, NanoGPT, ZenMux, AIML API, SiliconFlow, GMI Cloud, Qianfan, ai&,
Wafer and Kilo.lemon models --provider <id> --discoverlists an endpoint's
models, and the/modelpicker includes discovered models for configured
presets. See OpenAI-Compatible Endpoints.
Fixed
- Session context queries fall back to saved accounting when the live owner
retires during the read, instead of exiting on a stale registry PID. Timeouts
and unexpected owner crashes still surface. - Background process launches no longer bypass admission after queue failures.
Fixed, owner-bound launch identities reconcile lost acknowledgements and
reject conflicting retries instead of risking duplicate external effects. - Background execution now holds a validated live-process capacity limit until
confirmed termination, bounds pending admission and waiting, prevents canceled
or expired queued commands from starting, and retains unknown capacity through
restart. Yielded launches remain owner-scoped and inspectable; cancellation
receipts no longer claim termination before it is confirmed. - Local Unix background capacity now stays held when the root shell exits but
descendants survive. Owned process groups are bound before command execution;
live members are retained before forwarding stdin that can end the root, so
verified cancellation still works after natural root exit. Groups reconcile
until confirmed empty; stale ownership and unsupported workload witnesses
remain unknown rather than freeing slots or signaling recycled PIDs.
Repeated cancellation also requires the backend-aware workload witness:
an empty host wrapper group cannot release SSH, container or PTY capacity.
TUI tool cards and compact shelves also preserve queued and outcome-unknown
receipts instead of presenting them as started or failed. - Unknown Bash launch outcomes now preserve their structured process identity
through the actual agent event and TUI render path. Late or reopened durable
storage restores retained capacity and owner monitors before new admission.
Pre-execution startup rejections retain the real failure reason. - Unix process admission now uses a portable POSIX stdin gate, including dash
on Linux, preserving subsequent command input and refusing an unreleased gate.
Verified group signals use fixed argv with an OS-owned kill executable. - JSONL storage rejects unreadable or corrupt journals rather than publishing
empty state. Failed loads remain recoverable after repair; rejected writes
return bounded errors before cache mutation without crashing the Store. - Stored OAuth refreshes bind persistence to the selected login's opaque
revision. Atomic saves cannot overwrite a concurrent login, logout, or
delete/recreate; stale or failed saves cannot return the rotated credential.
Persistence callbacks take(name, encoded, expected_revision)and require
revision-bearing reloads and explicit success acknowledgements. Transient
fallback reselects authoritative storage; non-persisting refresh stays ephemeral. - Copilot token-endpoint HTTP 401/403 requires a fresh sign-in rather than
returning a cached token, including near-expiry refreshes. - Provider header defaults no longer override per-model headers on the wire.
OpenAI Completions/Responses, Anthropic and Google compatible endpoints merge
header names case-insensitively: provider defaults, then model overrides,
then explicit caller overrides, without duplicate mixed-case headers. - Provider CI checks use the existing OAuth decode branching convention without
changing refresh locking, and Codex CLI import regressions check rejection
and non-mutation rather than incidental error wording. - OAuth callback parsing and xAI endpoint validation reject malformed URL
authorities and ports before extracting codes or exchanging credentials. - Provider sign-in failures no longer print credential payloads or arbitrary
token-endpoint response strings. Token grants and model discovery do not
follow redirects; Z.AI callbacks require the returned state, and device-code
deadlines include callback and HTTP time. - Copilot, Gemini CLI and Antigravity refreshes serialize by stored login,
reload after waiting, and fail closed on deleted/replaced logins or expired
access tokens. Googleinvalid_grantrequires a fresh sign-in. - Named
lemon model --status/--logout --secret-name NAMEtargets that account
without deleting another login or clearing its selected provider settings. - Discovery cache metadata is isolated by endpoint, protocol, credential and
headers, rather than the last listing for a provider id. Custom Google
endpoints no longer inherit Google account options; explicitly keyless
custom Anthropic and Google endpoints omit generated credential headers. - Unknown provider ids in
default_model/default_providerand custom
provider option keys no longer create atoms from config input. lemon model github_copilot --status/--logoutno longer crash once a
Copilot login is stored.- With
auth_source = "oauth", a provider's API-key env var (for example
GOOGLE_GEMINI_CLI_API_KEY) no longer overrides the stored sign-in. - Concurrent ChatGPT (Codex) token refreshes no longer replay a rotated refresh
token: refresh is single-flight per stored login and re-reads the secret. - OpenAI-compatible providers no longer fall back to
OPENAI_API_KEY: a
DeepSeek, Together or other non-OpenAI request without its own key fails
instead of sending the OpenAI key to that endpoint. Groq, xAI, Cerebras,
DeepSeek, Mistral, Hugging Face, Qwen and Vercel AI Gateway now resolve their
key environment variables and defaultllm_<id>_api_keysecrets.