Use when the user wants to learn, be taught, be quizzed, or understand an idea across any domain — science, math, philosophy, code, law, politics, psychology, medicine, arts, or history — with active scaffolding.
中文简介正在准备中。当前显示原文说明。
Debug OAuth sign-in failures and add new OAuth providers to Keating (web + CLI). Use when a provider's "Sign in with …" flow fails, when adding a new OAuth provider, or when changing redirect URIs, token exchange, or refresh behavior.
中文简介正在准备中。当前显示原文说明。
实测评分 未实测
查看安装方法安装前可以查看交给 AI 代理的指令内容。
How OAuth sign-in works in this repo, the provider-specific quirks that have already caused bugs, and the checklist for adding a new provider.
The web app uses an authorization-code + PKCE flow, brokered through the Nitro server so tokens are exchanged server-side:
| Piece | File | Role |
|---|---|---|
| Provider registry | web/src/keating/oauth.ts (OAUTH_PROVIDERS) | Client IDs, authorize/token URLs, scopes, redirect URIs, extra authorize params |
| Redirect resolution | web/src/keating/oauth.ts (resolveOAuthRedirectUri) | Prod (keating.help) → https://keating.help/oauth/callback; everywhere else → the provider's CLI loopback URI + manual paste |
| Popup + pending state | web/src/keating/oauth.ts (initiateOAuth) | Saves {verifier, state, redirectUri} to localStorage under keating_oauth_pending, opens the authorize popup |
| Callback page | web/src/pages/OAuthCallback.tsx (route /oauth/callback) | Runs completeOAuthFromInput(location.href), posts keating-oauth-result message to the opener |
| Manual paste input | web/src/components/settings/CloudProviderKeysSection.tsx | Shown while sign-in is pending; accepts a pasted callback URL, code#state, query string, or bare code |
| Token exchange | web/server/api/oauth/token.ts | POSTs to the provider's token URL with the stored verifier |
| Token refresh | web/server/api/oauth/refresh.ts | Auto-refresh 60s before expiry; 401/403 deletes stored credentials |
| Server client config | web/server/api/oauth/config.ts | Client IDs/secrets, env-overridable (OAUTH_<PROVIDER>_CLIENT_ID / _SECRET) |
| Consumption | web/src/lib/provider-models.ts (getProviderApiKey) | OAuth token (or exchanged API key) wins over stored API keys |
| Reference implementation | web/node_modules/@earendil-works/pi-ai/dist/utils/oauth/*.js | The CLI's working flows — check here first when a web flow misbehaves |
Credentials are stored per provider as JSON under the oauth:<id> key in
getAppStorage().providerKeys. Provider-name aliasing (openai →
openai-codex, google → google-gemini-cli) lives in providerToOAuthId.
After editing web/src/keating/oauth.ts, regenerate the sandbox snapshot:
bun scripts/generate-nodepod-boot-files.ts.
Anthropic (client 9d1c250a-e61b-44d9-88ed-5944d1962f5e, Codex Pro/Max):
https://platform.Codex.com/v1/oauth/token only accepts
JSON bodies (Content-Type: application/json), for both code exchange
and refresh. Form-urlencoded fails. This is special-cased in token.ts and
refresh.ts.https://platform.Codex.com/oauth/code/callback) in all environments;
the user copies a code#state string. code=true must be in the authorize
params or the code is never displayed.state must equal the PKCE verifier (not a random value), and must be
sent in the token exchange body.sk-ant-oat-* access tokens are handled downstream by pi-ai
(Bearer + anthropic-beta: oauth-2025-04-20 headers) — pass them through as
the "apiKey"; do not put them in x-api-key yourself.OpenAI Codex (client app_EMoamEEZ73f0CkXaXp7hrann, ChatGPT Plus/Pro):
http://localhost:1455/auth/callback is registered; any web-origin
redirect is rejected at the authorize step (unless keating.help is registered
on the client used — see redirect resolution above).id_token is swapped for a real OpenAI API key via a
token-exchange grant (web/server/api/oauth/openai-codex.ts,
requested_token: openai-api-key).id_token_add_organizations=true,
codex_cli_simplified_flow=true, originator.Google Gemini CLI (client 681255809395-oo8f…, installed app):
web/server/api/oauth/config.ts.access_type=offline&prompt=consent or no refresh token is
returned.[oauth/token] <provider> token exchange failed: <status> <body> for the upstream error.[oauth/refresh] log).node_modules/@earendil-works/pi-ai/dist/utils/oauth/) — encoding (JSON
vs form), authorize params, state semantics, redirect URI. Every web bug so
far has been a divergence from those reference flows.cd web && bun test src/test/oauth.test.ts && bunx tsc --noEmit.OAUTH_PROVIDERS in web/src/keating/oauth.ts (extend
OAuthProviderId). Set redirectUri if the client only accepts a fixed
loopback URI; leave it unset to use the web callback.web/server/api/oauth/config.ts (extend
OAuthServerProviderId), with env overrides. Note the token body encoding
the provider expects — special-case in token.ts/refresh.ts if not
form-urlencoded.providerToOAuthId and
oauthProviderToProviderNames (CloudProviderKeysSection), and add a label
to OAUTH_PROVIDER_LABELS.getProviderApiKey returns something the model
client can use; if the provider needs a secondary exchange (like Codex →
API key), do it server-side after the token response.web/src/test/oauth.test.ts: provider wiring, redirect URI
resolution (prod + dev), and any exchange encoding special case.cd web && bun test && bunx tsc --noEmit.还没有评价。欢迎分享你的使用感受。
无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。
还没有评论。来写第一条吧。
Use when the user wants to learn, be taught, be quizzed, or understand an idea across any domain — science, math, philosophy, code, law, politics, psychology, medicine, arts, or history — with active scaffolding.
中文简介正在准备中。当前显示原文说明。
This skill helps with using the @ax-llm/ax TypeScript library for building LLM applications. Use when the user asks about ax(), ai(), f(), s(), agent(), flow(), AxGen, AxAgent, AxFlow, signatures, streaming, or mentions @ax-llm/ax.
中文简介正在准备中。当前显示原文说明。
This skill helps an LLM generate correct AxAgent code using @ax-llm/ax. Use when the user asks about agent(), child agents, namespaced functions, discovery mode, shared fields, llmQuery(...), RLM code execution, recursionOptions, or agent runtime behavior. For tuning and eval with agent.optimize(...), use ax-agent-optimize.
中文简介正在准备中。当前显示原文说明。
This skill helps an LLM generate correct AxAgent tuning and evaluation code using @ax-llm/ax. Use when the user asks about agent.optimize(...), judgeOptions, eval datasets, optimization targets, saved optimizedProgram artifacts, or recursive optimization guidance.
中文简介正在准备中。当前显示原文说明。
This skill helps an LLM generate correct AI provider setup and configuration code using @ax-llm/ax. Use when the user asks about ai(), providers, models, presets, embeddings, extended thinking, context caching, or mentions OpenAI/Anthropic/Google/Azure/Groq/DeepSeek/Mistral/Cohere/Together/Ollama/HuggingFace/Reka/OpenRouter with @ax-llm/ax.
中文简介正在准备中。当前显示原文说明。
This skill helps an LLM generate correct AxFlow workflow code using @ax-llm/ax. Use when the user asks about flow(), AxFlow, workflow orchestration, parallel execution, DAG workflows, conditional routing, map/reduce patterns, or multi-node AI pipelines.
中文简介正在准备中。当前显示原文说明。