@selesai/code 0.9.5 → 0.9.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cli/credential-print.js +4 -4
  3. package/dist/cli.js +0 -0
  4. package/dist/core/agent-session-runtime.js +1 -4
  5. package/dist/core/agent-session.d.ts +2 -0
  6. package/dist/core/agent-session.js +26 -0
  7. package/dist/core/compaction/branch-summarization.js +30 -30
  8. package/dist/core/compaction/compaction.js +81 -81
  9. package/dist/core/compaction/utils.js +2 -2
  10. package/dist/core/export-html/template.css +1066 -1066
  11. package/dist/core/export-html/template.html +55 -55
  12. package/dist/core/export-html/template.js +1864 -1864
  13. package/dist/core/export-html/vendor/highlight.min.js +1212 -1212
  14. package/dist/core/export-html/vendor/marked.min.js +78 -78
  15. package/dist/core/handoff.d.ts +11 -0
  16. package/dist/core/handoff.js +49 -0
  17. package/dist/core/messages.js +7 -7
  18. package/dist/extensions/context-compaction-reminder.test.ts +82 -82
  19. package/dist/extensions/context-compaction-reminder.ts +28 -28
  20. package/dist/extensions/handoff-new.ts +14 -75
  21. package/dist/extensions/pi-intercom/LICENSE +21 -21
  22. package/dist/extensions/pi-intercom/broker/client.test.ts +83 -83
  23. package/dist/extensions/pi-intercom/broker/extension.test.ts +387 -387
  24. package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -114
  25. package/dist/extensions/pi-intercom/broker/paths.test.ts +153 -153
  26. package/dist/extensions/pi-intercom/broker/paths.ts +134 -134
  27. package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -34
  28. package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -21
  29. package/dist/extensions/pi-intercom/cwd.test.ts +40 -40
  30. package/dist/extensions/pi-intercom/cwd.ts +31 -31
  31. package/dist/extensions/pi-intercom/extension-api.ts +44 -44
  32. package/dist/extensions/pi-intercom/format-context.test.ts +31 -31
  33. package/dist/extensions/pi-intercom/format-context.ts +32 -32
  34. package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -66
  35. package/dist/extensions/pi-intercom/ui/compose.ts +143 -143
  36. package/dist/extensions/pi-intercom/ui/session-list.ts +166 -166
  37. package/dist/extensions/pi-powerline-footer/bash-mode/shell-session.ts +286 -286
  38. package/dist/extensions/pi-powerline-footer/bash-mode/transcript.ts +108 -108
  39. package/dist/extensions/pi-powerline-footer/separators.ts +57 -57
  40. package/dist/extensions/pi-powerline-footer/tests/session-usage.test.ts +47 -47
  41. package/dist/extensions/pi-powerline-footer/tests/tps.test.ts +39 -39
  42. package/dist/extensions/pi-powerline-footer/theme.example.json +24 -24
  43. package/dist/extensions/pi-powerline-footer/theme.json +12 -12
  44. package/dist/extensions/pi-powerline-footer/tps.ts +345 -345
  45. package/dist/extensions/pi-rewind-hook/README.md +245 -245
  46. package/dist/extensions/pi-rewind-hook/index.ts +1445 -1445
  47. package/dist/extensions/pi-rewind-hook/package.json +29 -29
  48. package/dist/extensions/pi-subagents/install.mjs +0 -0
  49. package/dist/extensions/pi-web-agent/package.json +31 -31
  50. package/dist/extensions/pi-web-agent/src/backends/config.ts +205 -205
  51. package/dist/extensions/pi-web-agent/src/backends/doctor.ts +136 -136
  52. package/dist/extensions/pi-web-agent/src/backends/factory.ts +152 -152
  53. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +25 -25
  54. package/dist/extensions/pi-web-agent/src/cache/ttl-cache.ts +28 -28
  55. package/dist/extensions/pi-web-agent/src/changelog-notice.ts +136 -136
  56. package/dist/extensions/pi-web-agent/src/commands/web-agent-config.ts +946 -946
  57. package/dist/extensions/pi-web-agent/src/extension.ts +126 -126
  58. package/dist/extensions/pi-web-agent/src/extract/readability.ts +118 -118
  59. package/dist/extensions/pi-web-agent/src/fetch/browser-resolution.ts +199 -199
  60. package/dist/extensions/pi-web-agent/src/fetch/firecrawl-fetch.ts +100 -100
  61. package/dist/extensions/pi-web-agent/src/fetch/headless-fetch.ts +117 -117
  62. package/dist/extensions/pi-web-agent/src/fetch/http-fetch.ts +67 -67
  63. package/dist/extensions/pi-web-agent/src/orchestration/answer-synthesizer.ts +60 -60
  64. package/dist/extensions/pi-web-agent/src/orchestration/candidate-selector.ts +50 -50
  65. package/dist/extensions/pi-web-agent/src/orchestration/direct-url.ts +52 -52
  66. package/dist/extensions/pi-web-agent/src/orchestration/evidence-quality.ts +105 -105
  67. package/dist/extensions/pi-web-agent/src/orchestration/evidence-ranker.ts +45 -45
  68. package/dist/extensions/pi-web-agent/src/orchestration/index.ts +28 -28
  69. package/dist/extensions/pi-web-agent/src/orchestration/query-planner.ts +47 -47
  70. package/dist/extensions/pi-web-agent/src/orchestration/research-orchestrator.ts +376 -376
  71. package/dist/extensions/pi-web-agent/src/orchestration/research-types.ts +64 -64
  72. package/dist/extensions/pi-web-agent/src/orchestration/research-worker.ts +181 -181
  73. package/dist/extensions/pi-web-agent/src/orchestration/source-profile.ts +101 -101
  74. package/dist/extensions/pi-web-agent/src/orchestration/stop-decider.ts +81 -81
  75. package/dist/extensions/pi-web-agent/src/presentation/config-store.ts +210 -210
  76. package/dist/extensions/pi-web-agent/src/presentation/config.ts +75 -75
  77. package/dist/extensions/pi-web-agent/src/presentation/explore-presentation.ts +61 -61
  78. package/dist/extensions/pi-web-agent/src/presentation/fetch-presentation.ts +54 -54
  79. package/dist/extensions/pi-web-agent/src/presentation/search-presentation.ts +41 -41
  80. package/dist/extensions/pi-web-agent/src/presentation/select-view.ts +20 -20
  81. package/dist/extensions/pi-web-agent/src/presentation/types.ts +63 -63
  82. package/dist/extensions/pi-web-agent/src/search/brave.ts +114 -114
  83. package/dist/extensions/pi-web-agent/src/search/duckduckgo.ts +72 -72
  84. package/dist/extensions/pi-web-agent/src/search/searxng.ts +96 -96
  85. package/dist/extensions/pi-web-agent/src/tools/web-explore.ts +71 -71
  86. package/dist/extensions/pi-web-agent/src/tools/web-fetch-headless.ts +31 -31
  87. package/dist/extensions/pi-web-agent/src/tools/web-fetch.ts +31 -31
  88. package/dist/extensions/pi-web-agent/src/tools/web-search.ts +157 -157
  89. package/dist/extensions/pi-web-agent/src/types.ts +88 -88
  90. package/dist/extensions/ponytail/package.json +8 -8
  91. package/dist/extensions/question/batch.ts +103 -103
  92. package/dist/extensions/question/constants.ts +30 -30
  93. package/dist/extensions/question/helpers.ts +58 -58
  94. package/dist/extensions/question/navigation.ts +14 -14
  95. package/dist/extensions/question/package.json +19 -19
  96. package/dist/extensions/question/schemas.ts +43 -43
  97. package/dist/extensions/question/selection-mode.ts +46 -46
  98. package/dist/extensions/question/shortcuts.ts +44 -44
  99. package/dist/extensions/question/types.ts +132 -132
  100. package/dist/extensions/test-resolve-hook-impl.mjs +6 -6
  101. package/dist/extensions/test-resolve-hook.mjs +6 -6
  102. package/dist/extensions/web-agent-onboarding.ts +222 -222
  103. package/dist/extensions/workflow/package.json +17 -17
  104. package/dist/modes/interactive/components/model-selector.d.ts +1 -0
  105. package/dist/modes/interactive/components/model-selector.js +8 -4
  106. package/dist/modes/interactive/interactive-mode.js +9 -5
  107. package/dist/modes/rpc/rpc-mode.js +24 -0
  108. package/dist/modes/rpc/rpc-types.d.ts +19 -0
  109. package/dist/package-manager-cli.js +71 -71
  110. package/dist/rpc-entry.js +0 -0
  111. package/dist/skills/agent-browser/SKILL.md +52 -52
  112. package/dist/skills/batch-grill-me/SKILL.md +19 -19
  113. package/dist/skills/grill-me/SKILL.md +10 -10
  114. package/dist/skills/handoff/SKILL.md +16 -16
  115. package/dist/skills/handoff-text/SKILL.md +14 -14
  116. package/dist/skills/implanger/SKILL.md +69 -69
  117. package/dist/skills/improve-codebase/REFERENCE.md +78 -78
  118. package/dist/skills/improve-codebase/SKILL.md +178 -178
  119. package/dist/skills/planger/SKILL.md +166 -166
  120. package/dist/skills/ponytail/SKILL.md +116 -116
  121. package/dist/skills/ponytail-audit/SKILL.md +42 -42
  122. package/dist/skills/ponytail-debt/SKILL.md +45 -45
  123. package/dist/skills/ponytail-gain/SKILL.md +51 -51
  124. package/dist/skills/ponytail-help/SKILL.md +70 -70
  125. package/dist/skills/ponytail-review/SKILL.md +58 -58
  126. package/dist/skills/selesai-handoff/SKILL.md +20 -20
  127. package/dist/skills/workflow-creation/SKILL.md +73 -73
  128. package/dist/themes/powerline-footer/theme.json +33 -33
  129. package/docs/compaction.md +396 -396
  130. package/docs/containerization.md +111 -111
  131. package/docs/development.md +71 -71
  132. package/docs/docs.json +164 -164
  133. package/docs/environment-variables.md +86 -86
  134. package/docs/index.md +83 -83
  135. package/docs/json.md +82 -82
  136. package/docs/models.md +502 -502
  137. package/docs/packages.md +227 -227
  138. package/docs/plans/subagent-delegation/phase-0-correctness.md +264 -264
  139. package/docs/plans/subagent-delegation/phase-1-behavioral-contract.md +485 -485
  140. package/docs/plans/subagent-delegation/phase-2-context-controls.md +281 -281
  141. package/docs/plans/subagent-delegation/phase-3-advisory-routing.md +361 -361
  142. package/docs/plans/subagent-delegation/phase-4-optional-enforcement.md +380 -380
  143. package/docs/prompt-templates.md +95 -95
  144. package/docs/providers.md +293 -293
  145. package/docs/sdk.md +1143 -1143
  146. package/docs/security.md +59 -59
  147. package/docs/session-format.md +414 -414
  148. package/docs/sessions.md +145 -145
  149. package/docs/shared-host-extensions.md +109 -109
  150. package/docs/shell-aliases.md +13 -13
  151. package/docs/skills.md +231 -231
  152. package/docs/terminal-setup.md +142 -142
  153. package/docs/termux.md +127 -127
  154. package/docs/themes.md +295 -295
  155. package/docs/tmux.md +63 -63
  156. package/docs/tui.md +927 -927
  157. package/docs/windows.md +17 -17
  158. package/examples/README.md +25 -25
  159. package/examples/extensions/README.md +211 -211
  160. package/examples/extensions/auto-commit-on-exit.ts +49 -49
  161. package/examples/extensions/bash-spawn-hook.ts +30 -30
  162. package/examples/extensions/bookmark.ts +50 -50
  163. package/examples/extensions/border-status-editor.ts +150 -150
  164. package/examples/extensions/built-in-tool-renderer.ts +249 -249
  165. package/examples/extensions/claude-rules.ts +86 -86
  166. package/examples/extensions/commands.ts +72 -72
  167. package/examples/extensions/confirm-destructive.ts +59 -59
  168. package/examples/extensions/custom-compaction.ts +130 -130
  169. package/examples/extensions/custom-footer.ts +64 -64
  170. package/examples/extensions/custom-header.ts +73 -73
  171. package/examples/extensions/custom-provider-anthropic/index.ts +610 -610
  172. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -24
  173. package/examples/extensions/custom-provider-anthropic/package.json +19 -19
  174. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -404
  175. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -16
  176. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -82
  177. package/examples/extensions/dirty-repo-guard.ts +56 -56
  178. package/examples/extensions/doom-overlay/README.md +46 -46
  179. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -21
  180. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  181. package/examples/extensions/doom-overlay/doom/build.sh +152 -152
  182. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -72
  183. package/examples/extensions/doom-overlay/doom-component.ts +132 -132
  184. package/examples/extensions/doom-overlay/doom-engine.ts +173 -173
  185. package/examples/extensions/doom-overlay/doom-keys.ts +104 -104
  186. package/examples/extensions/doom-overlay/index.ts +74 -74
  187. package/examples/extensions/doom-overlay/wad-finder.ts +51 -51
  188. package/examples/extensions/dynamic-resources/SKILL.md +8 -8
  189. package/examples/extensions/dynamic-resources/dynamic.json +79 -79
  190. package/examples/extensions/dynamic-resources/dynamic.md +5 -5
  191. package/examples/extensions/dynamic-resources/index.ts +15 -15
  192. package/examples/extensions/dynamic-tools.ts +74 -74
  193. package/examples/extensions/event-bus.ts +43 -43
  194. package/examples/extensions/file-trigger.ts +41 -41
  195. package/examples/extensions/git-checkpoint.ts +53 -53
  196. package/examples/extensions/git-merge-and-resolve.ts +115 -115
  197. package/examples/extensions/github-issue-autocomplete.ts +185 -185
  198. package/examples/extensions/gondolin/index.ts +531 -531
  199. package/examples/extensions/gondolin/package-lock.json +185 -185
  200. package/examples/extensions/gondolin/package.json +19 -19
  201. package/examples/extensions/handoff.ts +199 -199
  202. package/examples/extensions/hello.ts +26 -26
  203. package/examples/extensions/hidden-thinking-label.ts +53 -53
  204. package/examples/extensions/inline-bash.ts +94 -94
  205. package/examples/extensions/input-transform-streaming.ts +39 -39
  206. package/examples/extensions/input-transform.ts +43 -43
  207. package/examples/extensions/interactive-shell.ts +196 -196
  208. package/examples/extensions/mac-system-theme.ts +47 -47
  209. package/examples/extensions/message-renderer.ts +59 -59
  210. package/examples/extensions/minimal-mode.ts +426 -426
  211. package/examples/extensions/modal-editor.ts +85 -85
  212. package/examples/extensions/model-status.ts +31 -31
  213. package/examples/extensions/notify.ts +55 -55
  214. package/examples/extensions/overlay-qa-tests.ts +1450 -1450
  215. package/examples/extensions/overlay-test.ts +153 -153
  216. package/examples/extensions/permission-gate.ts +34 -34
  217. package/examples/extensions/pirate.ts +47 -47
  218. package/examples/extensions/plan-mode/README.md +66 -66
  219. package/examples/extensions/plan-mode/index.ts +390 -390
  220. package/examples/extensions/plan-mode/utils.ts +168 -168
  221. package/examples/extensions/preset.ts +436 -436
  222. package/examples/extensions/project-trust.ts +64 -64
  223. package/examples/extensions/prompt-customizer.ts +97 -97
  224. package/examples/extensions/protected-paths.ts +30 -30
  225. package/examples/extensions/provider-payload.ts +18 -18
  226. package/examples/extensions/qna.ts +122 -122
  227. package/examples/extensions/question.ts +285 -285
  228. package/examples/extensions/questionnaire.ts +448 -448
  229. package/examples/extensions/rainbow-editor.ts +88 -88
  230. package/examples/extensions/reload-runtime.ts +37 -37
  231. package/examples/extensions/rpc-demo.ts +118 -118
  232. package/examples/extensions/sandbox/index.ts +321 -321
  233. package/examples/extensions/sandbox/package-lock.json +92 -92
  234. package/examples/extensions/sandbox/package.json +19 -19
  235. package/examples/extensions/send-user-message.ts +97 -97
  236. package/examples/extensions/session-name.ts +27 -27
  237. package/examples/extensions/shutdown-command.ts +63 -63
  238. package/examples/extensions/snake.ts +343 -343
  239. package/examples/extensions/space-invaders.ts +560 -560
  240. package/examples/extensions/ssh.ts +220 -220
  241. package/examples/extensions/status-line.ts +32 -32
  242. package/examples/extensions/structured-output.ts +65 -65
  243. package/examples/extensions/subagent/README.md +175 -175
  244. package/examples/extensions/subagent/agents/planner.md +37 -37
  245. package/examples/extensions/subagent/agents/reviewer.md +35 -35
  246. package/examples/extensions/subagent/agents/scout.md +50 -50
  247. package/examples/extensions/subagent/agents/worker.md +24 -24
  248. package/examples/extensions/subagent/agents.ts +126 -126
  249. package/examples/extensions/subagent/index.ts +1015 -1015
  250. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -10
  251. package/examples/extensions/subagent/prompts/implement.md +10 -10
  252. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -9
  253. package/examples/extensions/summarize.ts +209 -209
  254. package/examples/extensions/system-prompt-header.ts +17 -17
  255. package/examples/extensions/tic-tac-toe.ts +1008 -1008
  256. package/examples/extensions/timed-confirm.ts +70 -70
  257. package/examples/extensions/titlebar-spinner.ts +58 -58
  258. package/examples/extensions/todo.ts +297 -297
  259. package/examples/extensions/tool-override.ts +144 -144
  260. package/examples/extensions/tools.ts +146 -146
  261. package/examples/extensions/trigger-compact.ts +50 -50
  262. package/examples/extensions/truncated-tool.ts +195 -195
  263. package/examples/extensions/widget-placement.ts +9 -9
  264. package/examples/extensions/with-deps/index.ts +32 -32
  265. package/examples/extensions/with-deps/package-lock.json +31 -31
  266. package/examples/extensions/with-deps/package.json +22 -22
  267. package/examples/extensions/working-indicator.ts +123 -123
  268. package/examples/extensions/working-message-test.ts +25 -25
  269. package/examples/rpc-extension-ui.ts +632 -632
  270. package/examples/sdk/01-minimal.ts +26 -26
  271. package/examples/sdk/02-custom-model.ts +53 -53
  272. package/examples/sdk/03-custom-prompt.ts +75 -75
  273. package/examples/sdk/04-skills.ts +55 -55
  274. package/examples/sdk/05-tools.ts +48 -48
  275. package/examples/sdk/06-extensions.ts +99 -99
  276. package/examples/sdk/07-context-files.ts +47 -47
  277. package/examples/sdk/08-prompt-templates.ts +51 -51
  278. package/examples/sdk/09-api-keys-and-oauth.ts +52 -52
  279. package/examples/sdk/10-settings.ts +53 -53
  280. package/examples/sdk/11-sessions.ts +52 -52
  281. package/examples/sdk/12-full-control.ts +79 -79
  282. package/examples/sdk/13-session-runtime.ts +67 -67
  283. package/examples/sdk/README.md +144 -144
  284. package/package.json +1 -1
package/docs/providers.md CHANGED
@@ -1,293 +1,293 @@
1
- # Providers
2
-
3
- Pi supports subscription-based providers via OAuth and API key providers via environment variables or auth file. For each provider, pi knows all available models. The list is updated with every pi release.
4
-
5
- ## Table of Contents
6
-
7
- - [Subscriptions](#subscriptions)
8
- - [API Keys](#api-keys)
9
- - [Auth File](#auth-file)
10
- - [Cloud Providers](#cloud-providers)
11
- - [Custom Providers](#custom-providers)
12
- - [Resolution Order](#resolution-order)
13
-
14
- ## Subscriptions
15
-
16
- Use `/login` in interactive mode, then select a provider:
17
-
18
- - ChatGPT Plus/Pro (Codex)
19
- - Claude Pro/Max
20
- - GitHub Copilot
21
- - xAI (Grok/X subscription)
22
- - OpenRouter (OAuth-minted API key billed from OpenRouter credits)
23
- - Radius
24
-
25
- Use `/logout` to clear credentials. Tokens are stored in `~/.selesai/agent/auth.json` and auto-refresh when expired. OpenRouter instead mints a user-controlled API key that does not expire automatically.
26
-
27
- ### OpenAI Codex
28
-
29
- - Requires ChatGPT Plus or Pro subscription
30
- - Officially endorsed by OpenAI: [Codex for OSS](https://developers.openai.com/community/codex-for-oss)
31
-
32
- ### Claude Pro/Max
33
-
34
- Anthropic subscription auth is active for Claude Pro/Max accounts. Third-party harness usage draws from [extra usage](https://claude.ai/settings/usage) and is billed per token, not against Claude plan limits.
35
-
36
- ### GitHub Copilot
37
-
38
- - Press Enter for github.com, or enter your GitHub Enterprise Server domain
39
- - If you get "model not supported", enable it in VS Code: Copilot Chat → model selector → select model → "Enable"
40
-
41
- ### xAI (Grok/X subscription)
42
-
43
- - Run `/login xai`, then select **Use a subscription**
44
- - `XAI_API_KEY` remains available through **Use an API key**
45
-
46
- ### OpenRouter
47
-
48
- - Run `/login openrouter`, then select **Sign in with OpenRouter** to open the OpenRouter PKCE authorization flow
49
- - The authorization creates a user-controlled OpenRouter API key billed from your OpenRouter credits
50
- - On remote/headless machines (e.g. over SSH) the browser cannot reach the loopback callback; paste the final redirect URL (or the authorization code) into the login prompt instead
51
- - `OPENROUTER_API_KEY` remains available through **Use an API key**
52
-
53
- ### Radius
54
-
55
- Radius is a dynamic `pi-messages` gateway. `/login radius` stores OAuth tokens in `auth.json`; the gateway catalog is refreshed independently and cached in `models-store.json`. Custom Radius gateways can be declared in `models.json` with `"oauth": "radius"` and a gateway `baseUrl`.
56
-
57
- ## API Keys
58
-
59
- ### Environment Variables or Auth File
60
-
61
- Use `/login` in interactive mode and select a provider to store an API key in `auth.json`, or set credentials via environment variable:
62
-
63
- ```bash
64
- export ANTHROPIC_API_KEY=sk-ant-...
65
- pi
66
- ```
67
-
68
- | Provider | Environment Variable | `auth.json` key |
69
- |----------|----------------------|------------------|
70
- | Anthropic | `ANTHROPIC_API_KEY` | `anthropic` |
71
- | Ant Ling | `ANT_LING_API_KEY` | `ant-ling` |
72
- | Azure OpenAI Responses | `AZURE_OPENAI_API_KEY` | `azure-openai-responses` |
73
- | OpenAI | `OPENAI_API_KEY` | `openai` |
74
- | DeepSeek | `DEEPSEEK_API_KEY` | `deepseek` |
75
- | NVIDIA NIM | `NVIDIA_API_KEY` | `nvidia` |
76
- | Google Gemini | `GEMINI_API_KEY` | `google` |
77
- | Mistral | `MISTRAL_API_KEY` | `mistral` |
78
- | Groq | `GROQ_API_KEY` | `groq` |
79
- | Cerebras | `CEREBRAS_API_KEY` | `cerebras` |
80
- | Cloudflare AI Gateway | `CLOUDFLARE_API_KEY` (+ `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_GATEWAY_ID`) | `cloudflare-ai-gateway` |
81
- | Cloudflare Workers AI | `CLOUDFLARE_API_KEY` (+ `CLOUDFLARE_ACCOUNT_ID`) | `cloudflare-workers-ai` |
82
- | xAI | `XAI_API_KEY` | `xai` |
83
- | OpenRouter | `OPENROUTER_API_KEY` | `openrouter` |
84
- | Vercel AI Gateway | `AI_GATEWAY_API_KEY` | `vercel-ai-gateway` |
85
- | ZAI Coding Plan (Global) | `ZAI_API_KEY` | `zai` |
86
- | ZAI Coding Plan (China) | `ZAI_CODING_CN_API_KEY` | `zai-coding-cn` |
87
- | OpenCode Zen | `OPENCODE_API_KEY` | `opencode` |
88
- | OpenCode Go | `OPENCODE_API_KEY` | `opencode-go` |
89
- | Hugging Face | `HF_TOKEN` | `huggingface` |
90
- | Fireworks | `FIREWORKS_API_KEY` | `fireworks` |
91
- | Together AI | `TOGETHER_API_KEY` | `together` |
92
- | Kimi For Coding | `KIMI_API_KEY` | `kimi-coding` |
93
- | MiniMax | `MINIMAX_API_KEY` | `minimax` |
94
- | MiniMax (China) | `MINIMAX_CN_API_KEY` | `minimax-cn` |
95
- | Xiaomi MiMo | `XIAOMI_API_KEY` | `xiaomi` |
96
- | Xiaomi MiMo Token Plan (China) | `XIAOMI_TOKEN_PLAN_CN_API_KEY` | `xiaomi-token-plan-cn` |
97
- | Xiaomi MiMo Token Plan (Amsterdam) | `XIAOMI_TOKEN_PLAN_AMS_API_KEY` | `xiaomi-token-plan-ams` |
98
- | Xiaomi MiMo Token Plan (Singapore) | `XIAOMI_TOKEN_PLAN_SGP_API_KEY` | `xiaomi-token-plan-sgp` |
99
-
100
- Reference for environment variables and `auth.json` keys: [`const envMap`](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/env-api-keys.ts) in [`packages/ai/src/env-api-keys.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/env-api-keys.ts).
101
-
102
- #### Auth File
103
-
104
- Store credentials in `~/.selesai/agent/auth.json`:
105
-
106
- ```json
107
- {
108
- "anthropic": { "type": "api_key", "key": "sk-ant-..." },
109
- "ant-ling": { "type": "api_key", "key": "..." },
110
- "openai": { "type": "api_key", "key": "sk-..." },
111
- "deepseek": { "type": "api_key", "key": "sk-..." },
112
- "nvidia": { "type": "api_key", "key": "nvapi-..." },
113
- "google": { "type": "api_key", "key": "..." },
114
- "opencode": { "type": "api_key", "key": "..." },
115
- "opencode-go": { "type": "api_key", "key": "..." },
116
- "together": { "type": "api_key", "key": "..." },
117
- "xiaomi": { "type": "api_key", "key": "..." },
118
- "xiaomi-token-plan-cn": { "type": "api_key", "key": "..." },
119
- "xiaomi-token-plan-ams": { "type": "api_key", "key": "..." },
120
- "xiaomi-token-plan-sgp": { "type": "api_key", "key": "..." }
121
- }
122
- ```
123
-
124
- The file is created with `0600` permissions (user read/write only). Auth file credentials take priority over environment variables.
125
-
126
- API key credentials can also include provider-scoped environment values. These values are used before process environment variables when resolving the credential key, provider/model headers, and provider configuration such as Cloudflare account IDs, Azure OpenAI settings, Vertex project/location, Bedrock settings, `PI_CACHE_RETENTION`, and `HTTP_PROXY`/`HTTPS_PROXY`.
127
-
128
- ```json
129
- {
130
- "cloudflare-ai-gateway": {
131
- "type": "api_key",
132
- "key": "$CLOUDFLARE_API_KEY",
133
- "env": {
134
- "CLOUDFLARE_API_KEY": "...",
135
- "CLOUDFLARE_ACCOUNT_ID": "account-id",
136
- "CLOUDFLARE_GATEWAY_ID": "gateway-id"
137
- }
138
- }
139
- }
140
- ```
141
-
142
- Use this when pi should use different provider settings than the project shell environment.
143
-
144
- ### Key Resolution
145
-
146
- The `key` field supports command execution, environment interpolation, and literals:
147
-
148
- - **Shell command:** `"!command"` at the start executes the whole value as a command and uses stdout (cached for process lifetime)
149
- ```json
150
- { "type": "api_key", "key": "!security find-generic-password -ws 'anthropic'" }
151
- { "type": "api_key", "key": "!op read 'op://vault/item/credential'" }
152
- ```
153
- - **Environment interpolation:** `"$ENV_VAR"` or `"${ENV_VAR}"` uses the value of the named variable. Interpolation works inside larger literals.
154
- ```json
155
- { "type": "api_key", "key": "$MY_ANTHROPIC_KEY" }
156
- { "type": "api_key", "key": "${KEY_PREFIX}_${KEY_SUFFIX}" }
157
- ```
158
- `$FOO_BAR` is the variable `FOO_BAR`; use `${FOO}_BAR` when `BAR` is literal text. Missing environment variables make the value unresolved.
159
- - **Escapes:** `"$$"` emits a literal `"$"`; `"$!"` emits a literal `"!"` without triggering command execution.
160
- ```json
161
- { "type": "api_key", "key": "$$literal-dollar-prefix" }
162
- { "type": "api_key", "key": "$!literal-bang-prefix" }
163
- ```
164
- - **Literal value:** Used directly. Plain uppercase strings such as `MY_API_KEY` are literals; use `$MY_API_KEY` for environment variables.
165
- ```json
166
- { "type": "api_key", "key": "sk-ant-..." }
167
- { "type": "api_key", "key": "public" }
168
- ```
169
-
170
- OAuth credentials are also stored here after `/login` and managed automatically.
171
-
172
- ## Cloud Providers
173
-
174
- ### Azure OpenAI
175
-
176
- ```bash
177
- export AZURE_OPENAI_API_KEY=...
178
- export AZURE_OPENAI_BASE_URL=https://your-resource.openai.azure.com
179
- # also supported: https://your-resource.cognitiveservices.azure.com
180
- # root endpoints are auto-normalized to /openai/v1
181
- # or use resource name instead of base URL
182
- export AZURE_OPENAI_RESOURCE_NAME=your-resource
183
-
184
- # Optional
185
- export AZURE_OPENAI_API_VERSION=2024-02-01
186
- export AZURE_OPENAI_DEPLOYMENT_NAME_MAP=gpt-4=my-gpt4,gpt-4o=my-gpt4o
187
- ```
188
-
189
- ### Amazon Bedrock
190
-
191
- ```bash
192
- # Option 1: AWS Profile
193
- export AWS_PROFILE=your-profile
194
-
195
- # Option 2: IAM Keys
196
- export AWS_ACCESS_KEY_ID=AKIA...
197
- export AWS_SECRET_ACCESS_KEY=...
198
-
199
- # Option 3: Bearer Token
200
- export AWS_BEARER_TOKEN_BEDROCK=...
201
-
202
- # Optional region (defaults to us-east-1)
203
- export AWS_REGION=us-west-2
204
- ```
205
-
206
- Also supports ECS task roles (`AWS_CONTAINER_CREDENTIALS_*`) and IRSA (`AWS_WEB_IDENTITY_TOKEN_FILE`).
207
-
208
- ```bash
209
- pi --provider amazon-bedrock --model us.anthropic.claude-sonnet-4-20250514-v1:0
210
- ```
211
-
212
- Prompt caching is enabled automatically for Claude models whose ID contains a recognizable model name (base models and system-defined inference profiles). For application inference profiles (whose ARNs don't contain the model name), set `AWS_BEDROCK_FORCE_CACHE=1` to enable cache points:
213
-
214
- ```bash
215
- export AWS_BEDROCK_FORCE_CACHE=1
216
- pi --provider amazon-bedrock --model arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123
217
- ```
218
-
219
- If you are connecting to a Bedrock API proxy, the following environment variables can be used:
220
-
221
- ```bash
222
- # Set the URL for the Bedrock proxy (standard AWS SDK env var)
223
- export AWS_ENDPOINT_URL_BEDROCK_RUNTIME=https://my.corp.proxy/bedrock
224
-
225
- # Set if your proxy does not require authentication
226
- export AWS_BEDROCK_SKIP_AUTH=1
227
-
228
- # Set if your proxy only supports HTTP/1.1
229
- export AWS_BEDROCK_FORCE_HTTP1=1
230
- ```
231
-
232
- ### Cloudflare AI Gateway
233
-
234
- `CLOUDFLARE_API_KEY` can be set via `/login`. The account ID and gateway slug can be set as environment variables or in the API key credential's `env` object in `auth.json`.
235
-
236
- ```bash
237
- export CLOUDFLARE_API_KEY=... # or use /login
238
- export CLOUDFLARE_ACCOUNT_ID=...
239
- export CLOUDFLARE_GATEWAY_ID=... # create at dash.cloudflare.com → AI → AI Gateway
240
- pi --provider cloudflare-ai-gateway --model "claude-sonnet-4-5"
241
- ```
242
-
243
- Routes to OpenAI, Anthropic, and Workers AI through Cloudflare AI Gateway. Workers AI uses the Unified API (`/compat`) and prefixed model IDs (`workers-ai/@cf/...`). OpenAI uses the OpenAI passthrough route (`/openai`) with native OpenAI model IDs such as `gpt-5.1`. Anthropic uses the Anthropic passthrough route (`/anthropic`) with native Anthropic model IDs such as `claude-sonnet-4-5`.
244
-
245
- AI Gateway authentication uses `CLOUDFLARE_API_KEY` as `cf-aig-authorization`. Upstream authentication can be one of:
246
-
247
- | Mode | Request auth | Upstream auth |
248
- |------|--------------|---------------|
249
- | Workers AI | Cloudflare token only | Cloudflare-native |
250
- | Unified billing | Cloudflare token only | Cloudflare handles upstream auth and deducts credits |
251
- | Stored BYOK | Cloudflare token only | Cloudflare injects provider keys stored in the AI Gateway dashboard |
252
- | Inline BYOK | Cloudflare token plus upstream `Authorization` header | The request supplies the upstream provider key |
253
-
254
- For normal pi usage, prefer unified billing or stored BYOK. Inline BYOK requires configuring an additional upstream `Authorization` header for the Cloudflare AI Gateway provider, for example via a `models.json` provider/model override.
255
-
256
- ### Cloudflare Workers AI
257
-
258
- `CLOUDFLARE_API_KEY` can be set via `/login`. `CLOUDFLARE_ACCOUNT_ID` can be set as an environment variable or in the API key credential's `env` object in `auth.json`.
259
-
260
- ```bash
261
- export CLOUDFLARE_API_KEY=... # or use /login
262
- export CLOUDFLARE_ACCOUNT_ID=...
263
- pi --provider cloudflare-workers-ai --model "@cf/moonshotai/kimi-k2.6"
264
- ```
265
-
266
- Pi automatically sets `x-session-affinity` for [prefix caching](https://developers.cloudflare.com/workers-ai/features/prompt-caching/) discounts.
267
-
268
- ### Google Vertex AI
269
-
270
- Uses Application Default Credentials:
271
-
272
- ```bash
273
- gcloud auth application-default login
274
- export GOOGLE_CLOUD_PROJECT=your-project
275
- export GOOGLE_CLOUD_LOCATION=us-central1
276
- ```
277
-
278
- Or set `GOOGLE_APPLICATION_CREDENTIALS` to a service account key file.
279
-
280
- ## Custom Providers
281
-
282
- **Via models.json:** Add Ollama, LM Studio, vLLM, or any provider that speaks a supported API (OpenAI Completions, OpenAI Responses, Anthropic Messages, Google Generative AI). See [models.md](models.md).
283
-
284
- **Via extensions:** For providers that need custom API implementations or OAuth flows, create an extension. See [custom-provider.md](custom-provider.md) and [examples/extensions/custom-provider-gitlab-duo](../examples/extensions/custom-provider-gitlab-duo/).
285
-
286
- ## Resolution Order
287
-
288
- When resolving credentials for a provider:
289
-
290
- 1. CLI `--api-key` flag
291
- 2. `auth.json` entry (API key or OAuth token)
292
- 3. Environment variable
293
- 4. Custom provider keys from `models.json`
1
+ # Providers
2
+
3
+ Pi supports subscription-based providers via OAuth and API key providers via environment variables or auth file. For each provider, pi knows all available models. The list is updated with every pi release.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Subscriptions](#subscriptions)
8
+ - [API Keys](#api-keys)
9
+ - [Auth File](#auth-file)
10
+ - [Cloud Providers](#cloud-providers)
11
+ - [Custom Providers](#custom-providers)
12
+ - [Resolution Order](#resolution-order)
13
+
14
+ ## Subscriptions
15
+
16
+ Use `/login` in interactive mode, then select a provider:
17
+
18
+ - ChatGPT Plus/Pro (Codex)
19
+ - Claude Pro/Max
20
+ - GitHub Copilot
21
+ - xAI (Grok/X subscription)
22
+ - OpenRouter (OAuth-minted API key billed from OpenRouter credits)
23
+ - Radius
24
+
25
+ Use `/logout` to clear credentials. Tokens are stored in `~/.selesai/agent/auth.json` and auto-refresh when expired. OpenRouter instead mints a user-controlled API key that does not expire automatically.
26
+
27
+ ### OpenAI Codex
28
+
29
+ - Requires ChatGPT Plus or Pro subscription
30
+ - Officially endorsed by OpenAI: [Codex for OSS](https://developers.openai.com/community/codex-for-oss)
31
+
32
+ ### Claude Pro/Max
33
+
34
+ Anthropic subscription auth is active for Claude Pro/Max accounts. Third-party harness usage draws from [extra usage](https://claude.ai/settings/usage) and is billed per token, not against Claude plan limits.
35
+
36
+ ### GitHub Copilot
37
+
38
+ - Press Enter for github.com, or enter your GitHub Enterprise Server domain
39
+ - If you get "model not supported", enable it in VS Code: Copilot Chat → model selector → select model → "Enable"
40
+
41
+ ### xAI (Grok/X subscription)
42
+
43
+ - Run `/login xai`, then select **Use a subscription**
44
+ - `XAI_API_KEY` remains available through **Use an API key**
45
+
46
+ ### OpenRouter
47
+
48
+ - Run `/login openrouter`, then select **Sign in with OpenRouter** to open the OpenRouter PKCE authorization flow
49
+ - The authorization creates a user-controlled OpenRouter API key billed from your OpenRouter credits
50
+ - On remote/headless machines (e.g. over SSH) the browser cannot reach the loopback callback; paste the final redirect URL (or the authorization code) into the login prompt instead
51
+ - `OPENROUTER_API_KEY` remains available through **Use an API key**
52
+
53
+ ### Radius
54
+
55
+ Radius is a dynamic `pi-messages` gateway. `/login radius` stores OAuth tokens in `auth.json`; the gateway catalog is refreshed independently and cached in `models-store.json`. Custom Radius gateways can be declared in `models.json` with `"oauth": "radius"` and a gateway `baseUrl`.
56
+
57
+ ## API Keys
58
+
59
+ ### Environment Variables or Auth File
60
+
61
+ Use `/login` in interactive mode and select a provider to store an API key in `auth.json`, or set credentials via environment variable:
62
+
63
+ ```bash
64
+ export ANTHROPIC_API_KEY=sk-ant-...
65
+ pi
66
+ ```
67
+
68
+ | Provider | Environment Variable | `auth.json` key |
69
+ |----------|----------------------|------------------|
70
+ | Anthropic | `ANTHROPIC_API_KEY` | `anthropic` |
71
+ | Ant Ling | `ANT_LING_API_KEY` | `ant-ling` |
72
+ | Azure OpenAI Responses | `AZURE_OPENAI_API_KEY` | `azure-openai-responses` |
73
+ | OpenAI | `OPENAI_API_KEY` | `openai` |
74
+ | DeepSeek | `DEEPSEEK_API_KEY` | `deepseek` |
75
+ | NVIDIA NIM | `NVIDIA_API_KEY` | `nvidia` |
76
+ | Google Gemini | `GEMINI_API_KEY` | `google` |
77
+ | Mistral | `MISTRAL_API_KEY` | `mistral` |
78
+ | Groq | `GROQ_API_KEY` | `groq` |
79
+ | Cerebras | `CEREBRAS_API_KEY` | `cerebras` |
80
+ | Cloudflare AI Gateway | `CLOUDFLARE_API_KEY` (+ `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_GATEWAY_ID`) | `cloudflare-ai-gateway` |
81
+ | Cloudflare Workers AI | `CLOUDFLARE_API_KEY` (+ `CLOUDFLARE_ACCOUNT_ID`) | `cloudflare-workers-ai` |
82
+ | xAI | `XAI_API_KEY` | `xai` |
83
+ | OpenRouter | `OPENROUTER_API_KEY` | `openrouter` |
84
+ | Vercel AI Gateway | `AI_GATEWAY_API_KEY` | `vercel-ai-gateway` |
85
+ | ZAI Coding Plan (Global) | `ZAI_API_KEY` | `zai` |
86
+ | ZAI Coding Plan (China) | `ZAI_CODING_CN_API_KEY` | `zai-coding-cn` |
87
+ | OpenCode Zen | `OPENCODE_API_KEY` | `opencode` |
88
+ | OpenCode Go | `OPENCODE_API_KEY` | `opencode-go` |
89
+ | Hugging Face | `HF_TOKEN` | `huggingface` |
90
+ | Fireworks | `FIREWORKS_API_KEY` | `fireworks` |
91
+ | Together AI | `TOGETHER_API_KEY` | `together` |
92
+ | Kimi For Coding | `KIMI_API_KEY` | `kimi-coding` |
93
+ | MiniMax | `MINIMAX_API_KEY` | `minimax` |
94
+ | MiniMax (China) | `MINIMAX_CN_API_KEY` | `minimax-cn` |
95
+ | Xiaomi MiMo | `XIAOMI_API_KEY` | `xiaomi` |
96
+ | Xiaomi MiMo Token Plan (China) | `XIAOMI_TOKEN_PLAN_CN_API_KEY` | `xiaomi-token-plan-cn` |
97
+ | Xiaomi MiMo Token Plan (Amsterdam) | `XIAOMI_TOKEN_PLAN_AMS_API_KEY` | `xiaomi-token-plan-ams` |
98
+ | Xiaomi MiMo Token Plan (Singapore) | `XIAOMI_TOKEN_PLAN_SGP_API_KEY` | `xiaomi-token-plan-sgp` |
99
+
100
+ Reference for environment variables and `auth.json` keys: [`const envMap`](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/env-api-keys.ts) in [`packages/ai/src/env-api-keys.ts`](https://github.com/earendil-works/pi-mono/blob/main/packages/ai/src/env-api-keys.ts).
101
+
102
+ #### Auth File
103
+
104
+ Store credentials in `~/.selesai/agent/auth.json`:
105
+
106
+ ```json
107
+ {
108
+ "anthropic": { "type": "api_key", "key": "sk-ant-..." },
109
+ "ant-ling": { "type": "api_key", "key": "..." },
110
+ "openai": { "type": "api_key", "key": "sk-..." },
111
+ "deepseek": { "type": "api_key", "key": "sk-..." },
112
+ "nvidia": { "type": "api_key", "key": "nvapi-..." },
113
+ "google": { "type": "api_key", "key": "..." },
114
+ "opencode": { "type": "api_key", "key": "..." },
115
+ "opencode-go": { "type": "api_key", "key": "..." },
116
+ "together": { "type": "api_key", "key": "..." },
117
+ "xiaomi": { "type": "api_key", "key": "..." },
118
+ "xiaomi-token-plan-cn": { "type": "api_key", "key": "..." },
119
+ "xiaomi-token-plan-ams": { "type": "api_key", "key": "..." },
120
+ "xiaomi-token-plan-sgp": { "type": "api_key", "key": "..." }
121
+ }
122
+ ```
123
+
124
+ The file is created with `0600` permissions (user read/write only). Auth file credentials take priority over environment variables.
125
+
126
+ API key credentials can also include provider-scoped environment values. These values are used before process environment variables when resolving the credential key, provider/model headers, and provider configuration such as Cloudflare account IDs, Azure OpenAI settings, Vertex project/location, Bedrock settings, `PI_CACHE_RETENTION`, and `HTTP_PROXY`/`HTTPS_PROXY`.
127
+
128
+ ```json
129
+ {
130
+ "cloudflare-ai-gateway": {
131
+ "type": "api_key",
132
+ "key": "$CLOUDFLARE_API_KEY",
133
+ "env": {
134
+ "CLOUDFLARE_API_KEY": "...",
135
+ "CLOUDFLARE_ACCOUNT_ID": "account-id",
136
+ "CLOUDFLARE_GATEWAY_ID": "gateway-id"
137
+ }
138
+ }
139
+ }
140
+ ```
141
+
142
+ Use this when pi should use different provider settings than the project shell environment.
143
+
144
+ ### Key Resolution
145
+
146
+ The `key` field supports command execution, environment interpolation, and literals:
147
+
148
+ - **Shell command:** `"!command"` at the start executes the whole value as a command and uses stdout (cached for process lifetime)
149
+ ```json
150
+ { "type": "api_key", "key": "!security find-generic-password -ws 'anthropic'" }
151
+ { "type": "api_key", "key": "!op read 'op://vault/item/credential'" }
152
+ ```
153
+ - **Environment interpolation:** `"$ENV_VAR"` or `"${ENV_VAR}"` uses the value of the named variable. Interpolation works inside larger literals.
154
+ ```json
155
+ { "type": "api_key", "key": "$MY_ANTHROPIC_KEY" }
156
+ { "type": "api_key", "key": "${KEY_PREFIX}_${KEY_SUFFIX}" }
157
+ ```
158
+ `$FOO_BAR` is the variable `FOO_BAR`; use `${FOO}_BAR` when `BAR` is literal text. Missing environment variables make the value unresolved.
159
+ - **Escapes:** `"$$"` emits a literal `"$"`; `"$!"` emits a literal `"!"` without triggering command execution.
160
+ ```json
161
+ { "type": "api_key", "key": "$$literal-dollar-prefix" }
162
+ { "type": "api_key", "key": "$!literal-bang-prefix" }
163
+ ```
164
+ - **Literal value:** Used directly. Plain uppercase strings such as `MY_API_KEY` are literals; use `$MY_API_KEY` for environment variables.
165
+ ```json
166
+ { "type": "api_key", "key": "sk-ant-..." }
167
+ { "type": "api_key", "key": "public" }
168
+ ```
169
+
170
+ OAuth credentials are also stored here after `/login` and managed automatically.
171
+
172
+ ## Cloud Providers
173
+
174
+ ### Azure OpenAI
175
+
176
+ ```bash
177
+ export AZURE_OPENAI_API_KEY=...
178
+ export AZURE_OPENAI_BASE_URL=https://your-resource.openai.azure.com
179
+ # also supported: https://your-resource.cognitiveservices.azure.com
180
+ # root endpoints are auto-normalized to /openai/v1
181
+ # or use resource name instead of base URL
182
+ export AZURE_OPENAI_RESOURCE_NAME=your-resource
183
+
184
+ # Optional
185
+ export AZURE_OPENAI_API_VERSION=2024-02-01
186
+ export AZURE_OPENAI_DEPLOYMENT_NAME_MAP=gpt-4=my-gpt4,gpt-4o=my-gpt4o
187
+ ```
188
+
189
+ ### Amazon Bedrock
190
+
191
+ ```bash
192
+ # Option 1: AWS Profile
193
+ export AWS_PROFILE=your-profile
194
+
195
+ # Option 2: IAM Keys
196
+ export AWS_ACCESS_KEY_ID=AKIA...
197
+ export AWS_SECRET_ACCESS_KEY=...
198
+
199
+ # Option 3: Bearer Token
200
+ export AWS_BEARER_TOKEN_BEDROCK=...
201
+
202
+ # Optional region (defaults to us-east-1)
203
+ export AWS_REGION=us-west-2
204
+ ```
205
+
206
+ Also supports ECS task roles (`AWS_CONTAINER_CREDENTIALS_*`) and IRSA (`AWS_WEB_IDENTITY_TOKEN_FILE`).
207
+
208
+ ```bash
209
+ pi --provider amazon-bedrock --model us.anthropic.claude-sonnet-4-20250514-v1:0
210
+ ```
211
+
212
+ Prompt caching is enabled automatically for Claude models whose ID contains a recognizable model name (base models and system-defined inference profiles). For application inference profiles (whose ARNs don't contain the model name), set `AWS_BEDROCK_FORCE_CACHE=1` to enable cache points:
213
+
214
+ ```bash
215
+ export AWS_BEDROCK_FORCE_CACHE=1
216
+ pi --provider amazon-bedrock --model arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123
217
+ ```
218
+
219
+ If you are connecting to a Bedrock API proxy, the following environment variables can be used:
220
+
221
+ ```bash
222
+ # Set the URL for the Bedrock proxy (standard AWS SDK env var)
223
+ export AWS_ENDPOINT_URL_BEDROCK_RUNTIME=https://my.corp.proxy/bedrock
224
+
225
+ # Set if your proxy does not require authentication
226
+ export AWS_BEDROCK_SKIP_AUTH=1
227
+
228
+ # Set if your proxy only supports HTTP/1.1
229
+ export AWS_BEDROCK_FORCE_HTTP1=1
230
+ ```
231
+
232
+ ### Cloudflare AI Gateway
233
+
234
+ `CLOUDFLARE_API_KEY` can be set via `/login`. The account ID and gateway slug can be set as environment variables or in the API key credential's `env` object in `auth.json`.
235
+
236
+ ```bash
237
+ export CLOUDFLARE_API_KEY=... # or use /login
238
+ export CLOUDFLARE_ACCOUNT_ID=...
239
+ export CLOUDFLARE_GATEWAY_ID=... # create at dash.cloudflare.com → AI → AI Gateway
240
+ pi --provider cloudflare-ai-gateway --model "claude-sonnet-4-5"
241
+ ```
242
+
243
+ Routes to OpenAI, Anthropic, and Workers AI through Cloudflare AI Gateway. Workers AI uses the Unified API (`/compat`) and prefixed model IDs (`workers-ai/@cf/...`). OpenAI uses the OpenAI passthrough route (`/openai`) with native OpenAI model IDs such as `gpt-5.1`. Anthropic uses the Anthropic passthrough route (`/anthropic`) with native Anthropic model IDs such as `claude-sonnet-4-5`.
244
+
245
+ AI Gateway authentication uses `CLOUDFLARE_API_KEY` as `cf-aig-authorization`. Upstream authentication can be one of:
246
+
247
+ | Mode | Request auth | Upstream auth |
248
+ |------|--------------|---------------|
249
+ | Workers AI | Cloudflare token only | Cloudflare-native |
250
+ | Unified billing | Cloudflare token only | Cloudflare handles upstream auth and deducts credits |
251
+ | Stored BYOK | Cloudflare token only | Cloudflare injects provider keys stored in the AI Gateway dashboard |
252
+ | Inline BYOK | Cloudflare token plus upstream `Authorization` header | The request supplies the upstream provider key |
253
+
254
+ For normal pi usage, prefer unified billing or stored BYOK. Inline BYOK requires configuring an additional upstream `Authorization` header for the Cloudflare AI Gateway provider, for example via a `models.json` provider/model override.
255
+
256
+ ### Cloudflare Workers AI
257
+
258
+ `CLOUDFLARE_API_KEY` can be set via `/login`. `CLOUDFLARE_ACCOUNT_ID` can be set as an environment variable or in the API key credential's `env` object in `auth.json`.
259
+
260
+ ```bash
261
+ export CLOUDFLARE_API_KEY=... # or use /login
262
+ export CLOUDFLARE_ACCOUNT_ID=...
263
+ pi --provider cloudflare-workers-ai --model "@cf/moonshotai/kimi-k2.6"
264
+ ```
265
+
266
+ Pi automatically sets `x-session-affinity` for [prefix caching](https://developers.cloudflare.com/workers-ai/features/prompt-caching/) discounts.
267
+
268
+ ### Google Vertex AI
269
+
270
+ Uses Application Default Credentials:
271
+
272
+ ```bash
273
+ gcloud auth application-default login
274
+ export GOOGLE_CLOUD_PROJECT=your-project
275
+ export GOOGLE_CLOUD_LOCATION=us-central1
276
+ ```
277
+
278
+ Or set `GOOGLE_APPLICATION_CREDENTIALS` to a service account key file.
279
+
280
+ ## Custom Providers
281
+
282
+ **Via models.json:** Add Ollama, LM Studio, vLLM, or any provider that speaks a supported API (OpenAI Completions, OpenAI Responses, Anthropic Messages, Google Generative AI). See [models.md](models.md).
283
+
284
+ **Via extensions:** For providers that need custom API implementations or OAuth flows, create an extension. See [custom-provider.md](custom-provider.md) and [examples/extensions/custom-provider-gitlab-duo](../examples/extensions/custom-provider-gitlab-duo/).
285
+
286
+ ## Resolution Order
287
+
288
+ When resolving credentials for a provider:
289
+
290
+ 1. CLI `--api-key` flag
291
+ 2. `auth.json` entry (API key or OAuth token)
292
+ 3. Environment variable
293
+ 4. Custom provider keys from `models.json`