@selesai/code 0.9.9 → 0.9.11

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 (306) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/cli/args.js +13 -2
  3. package/dist/cli/args.test.js +8 -0
  4. package/dist/cli/credential-print.js +4 -4
  5. package/dist/cli.js +0 -0
  6. package/dist/core/agent-session-auto-handoff.test.js +24 -1
  7. package/dist/core/agent-session.d.ts +11 -4
  8. package/dist/core/agent-session.js +99 -39
  9. package/dist/core/compaction/branch-summarization.js +30 -30
  10. package/dist/core/compaction/compaction.js +81 -81
  11. package/dist/core/compaction/utils.js +2 -2
  12. package/dist/core/defaults.d.ts +1 -0
  13. package/dist/core/defaults.js +9 -0
  14. package/dist/core/export-html/template.css +1066 -1066
  15. package/dist/core/export-html/template.html +55 -55
  16. package/dist/core/export-html/template.js +1864 -1864
  17. package/dist/core/export-html/vendor/highlight.min.js +1212 -1212
  18. package/dist/core/export-html/vendor/marked.min.js +78 -78
  19. package/dist/core/extensions/loader.js +108 -35
  20. package/dist/core/extensions/loader.test.d.ts +1 -0
  21. package/dist/core/extensions/loader.test.js +21 -0
  22. package/dist/core/extensions/types.d.ts +12 -2
  23. package/dist/core/keybindings.d.ts +2 -2
  24. package/dist/core/messages.js +7 -7
  25. package/dist/core/model-resolver.d.ts +1 -0
  26. package/dist/core/model-resolver.js +10 -4
  27. package/dist/core/package-manager.js +4 -4
  28. package/dist/core/sdk.d.ts +5 -5
  29. package/dist/core/sdk.js +16 -4
  30. package/dist/core/settings-manager.d.ts +6 -0
  31. package/dist/core/settings-manager.js +22 -0
  32. package/dist/core/tools/bash.d.ts +18 -1
  33. package/dist/core/tools/bash.js +41 -23
  34. package/dist/core/tools/index.d.ts +4 -1
  35. package/dist/core/tools/index.js +9 -1
  36. package/dist/core/tools/powershell.d.ts +15 -0
  37. package/dist/core/tools/powershell.js +38 -0
  38. package/dist/core/tools/powershell.test.d.ts +1 -0
  39. package/dist/core/tools/powershell.test.js +20 -0
  40. package/dist/extensions/context-compaction-reminder.test.ts +82 -82
  41. package/dist/extensions/context-compaction-reminder.ts +28 -28
  42. package/dist/extensions/copy-turn.test.ts +24 -1
  43. package/dist/extensions/copy-turn.ts +6 -1
  44. package/dist/extensions/handoff-new.test.ts +15 -2
  45. package/dist/extensions/handoff-new.ts +44 -30
  46. package/dist/extensions/pi-intercom/LICENSE +21 -21
  47. package/dist/extensions/pi-intercom/broker/client.test.ts +83 -83
  48. package/dist/extensions/pi-intercom/broker/extension.test.ts +387 -387
  49. package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -114
  50. package/dist/extensions/pi-intercom/broker/paths.test.ts +153 -153
  51. package/dist/extensions/pi-intercom/broker/paths.ts +134 -134
  52. package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -34
  53. package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -21
  54. package/dist/extensions/pi-intercom/cwd.test.ts +40 -40
  55. package/dist/extensions/pi-intercom/cwd.ts +31 -31
  56. package/dist/extensions/pi-intercom/extension-api.ts +44 -44
  57. package/dist/extensions/pi-intercom/format-context.test.ts +31 -31
  58. package/dist/extensions/pi-intercom/format-context.ts +32 -32
  59. package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -66
  60. package/dist/extensions/pi-intercom/ui/compose.ts +143 -143
  61. package/dist/extensions/pi-intercom/ui/session-list.ts +166 -166
  62. package/dist/extensions/pi-powerline-footer/bash-mode/shell-session.ts +286 -286
  63. package/dist/extensions/pi-powerline-footer/bash-mode/transcript.ts +108 -108
  64. package/dist/extensions/pi-powerline-footer/separators.ts +57 -57
  65. package/dist/extensions/pi-powerline-footer/tests/session-usage.test.ts +47 -47
  66. package/dist/extensions/pi-powerline-footer/tests/tps.test.ts +39 -39
  67. package/dist/extensions/pi-powerline-footer/theme.example.json +24 -24
  68. package/dist/extensions/pi-powerline-footer/theme.json +12 -12
  69. package/dist/extensions/pi-powerline-footer/tps.ts +345 -345
  70. package/dist/extensions/pi-rewind-hook/README.md +245 -245
  71. package/dist/extensions/pi-rewind-hook/index.ts +1445 -1445
  72. package/dist/extensions/pi-rewind-hook/package.json +29 -29
  73. package/dist/extensions/pi-subagents/install.mjs +0 -0
  74. package/dist/extensions/pi-web-agent/package.json +31 -31
  75. package/dist/extensions/pi-web-agent/src/backends/config.ts +205 -205
  76. package/dist/extensions/pi-web-agent/src/backends/doctor.ts +136 -136
  77. package/dist/extensions/pi-web-agent/src/backends/factory.ts +152 -152
  78. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +25 -25
  79. package/dist/extensions/pi-web-agent/src/cache/ttl-cache.ts +28 -28
  80. package/dist/extensions/pi-web-agent/src/changelog-notice.ts +136 -136
  81. package/dist/extensions/pi-web-agent/src/commands/web-agent-config.ts +946 -946
  82. package/dist/extensions/pi-web-agent/src/extension.ts +126 -126
  83. package/dist/extensions/pi-web-agent/src/extract/readability.ts +118 -118
  84. package/dist/extensions/pi-web-agent/src/fetch/browser-resolution.ts +199 -199
  85. package/dist/extensions/pi-web-agent/src/fetch/firecrawl-fetch.ts +100 -100
  86. package/dist/extensions/pi-web-agent/src/fetch/headless-fetch.ts +117 -117
  87. package/dist/extensions/pi-web-agent/src/fetch/http-fetch.ts +67 -67
  88. package/dist/extensions/pi-web-agent/src/orchestration/answer-synthesizer.ts +60 -60
  89. package/dist/extensions/pi-web-agent/src/orchestration/candidate-selector.ts +50 -50
  90. package/dist/extensions/pi-web-agent/src/orchestration/direct-url.ts +52 -52
  91. package/dist/extensions/pi-web-agent/src/orchestration/evidence-quality.ts +105 -105
  92. package/dist/extensions/pi-web-agent/src/orchestration/evidence-ranker.ts +45 -45
  93. package/dist/extensions/pi-web-agent/src/orchestration/index.ts +28 -28
  94. package/dist/extensions/pi-web-agent/src/orchestration/query-planner.ts +47 -47
  95. package/dist/extensions/pi-web-agent/src/orchestration/research-orchestrator.ts +376 -376
  96. package/dist/extensions/pi-web-agent/src/orchestration/research-types.ts +64 -64
  97. package/dist/extensions/pi-web-agent/src/orchestration/research-worker.ts +181 -181
  98. package/dist/extensions/pi-web-agent/src/orchestration/source-profile.ts +101 -101
  99. package/dist/extensions/pi-web-agent/src/orchestration/stop-decider.ts +81 -81
  100. package/dist/extensions/pi-web-agent/src/presentation/config-store.ts +210 -210
  101. package/dist/extensions/pi-web-agent/src/presentation/config.ts +75 -75
  102. package/dist/extensions/pi-web-agent/src/presentation/explore-presentation.ts +61 -61
  103. package/dist/extensions/pi-web-agent/src/presentation/fetch-presentation.ts +54 -54
  104. package/dist/extensions/pi-web-agent/src/presentation/search-presentation.ts +41 -41
  105. package/dist/extensions/pi-web-agent/src/presentation/select-view.ts +20 -20
  106. package/dist/extensions/pi-web-agent/src/presentation/types.ts +63 -63
  107. package/dist/extensions/pi-web-agent/src/search/brave.ts +114 -114
  108. package/dist/extensions/pi-web-agent/src/search/duckduckgo.ts +72 -72
  109. package/dist/extensions/pi-web-agent/src/search/searxng.ts +96 -96
  110. package/dist/extensions/pi-web-agent/src/tools/web-explore.ts +71 -71
  111. package/dist/extensions/pi-web-agent/src/tools/web-fetch-headless.ts +31 -31
  112. package/dist/extensions/pi-web-agent/src/tools/web-fetch.ts +31 -31
  113. package/dist/extensions/pi-web-agent/src/tools/web-search.ts +157 -157
  114. package/dist/extensions/pi-web-agent/src/types.ts +88 -88
  115. package/dist/extensions/ponytail/package.json +8 -8
  116. package/dist/extensions/question/batch.ts +103 -103
  117. package/dist/extensions/question/constants.ts +30 -30
  118. package/dist/extensions/question/helpers.ts +58 -58
  119. package/dist/extensions/question/navigation.ts +14 -14
  120. package/dist/extensions/question/package.json +19 -19
  121. package/dist/extensions/question/schemas.ts +43 -43
  122. package/dist/extensions/question/selection-mode.ts +46 -46
  123. package/dist/extensions/question/shortcuts.ts +44 -44
  124. package/dist/extensions/question/types.ts +132 -132
  125. package/dist/extensions/test-resolve-hook-impl.mjs +6 -6
  126. package/dist/extensions/test-resolve-hook.mjs +6 -6
  127. package/dist/extensions/web-agent-onboarding.ts +222 -222
  128. package/dist/extensions/workflow/package.json +17 -17
  129. package/dist/package-manager-cli.js +71 -71
  130. package/dist/rpc-entry.js +0 -0
  131. package/dist/skills/agent-browser/SKILL.md +52 -52
  132. package/dist/skills/batch-grill-me/SKILL.md +19 -19
  133. package/dist/skills/grill-me/SKILL.md +10 -10
  134. package/dist/skills/handoff/SKILL.md +16 -16
  135. package/dist/skills/handoff-text/SKILL.md +14 -14
  136. package/dist/skills/implanger/SKILL.md +69 -69
  137. package/dist/skills/improve-codebase/REFERENCE.md +78 -78
  138. package/dist/skills/improve-codebase/SKILL.md +178 -178
  139. package/dist/skills/planger/SKILL.md +166 -166
  140. package/dist/skills/ponytail/SKILL.md +116 -116
  141. package/dist/skills/ponytail-audit/SKILL.md +42 -42
  142. package/dist/skills/ponytail-debt/SKILL.md +45 -45
  143. package/dist/skills/ponytail-gain/SKILL.md +51 -51
  144. package/dist/skills/ponytail-help/SKILL.md +70 -70
  145. package/dist/skills/ponytail-review/SKILL.md +58 -58
  146. package/dist/skills/selesai-handoff/SKILL.md +20 -20
  147. package/dist/skills/workflow-creation/SKILL.md +73 -73
  148. package/dist/themes/powerline-footer/theme.json +33 -33
  149. package/dist/utils/shell.d.ts +3 -0
  150. package/dist/utils/shell.js +17 -5
  151. package/docs/compaction.md +396 -396
  152. package/docs/containerization.md +111 -111
  153. package/docs/development.md +71 -71
  154. package/docs/docs.json +164 -164
  155. package/docs/environment-variables.md +86 -86
  156. package/docs/index.md +83 -83
  157. package/docs/json.md +82 -82
  158. package/docs/models.md +502 -502
  159. package/docs/packages.md +227 -227
  160. package/docs/plans/subagent-delegation/phase-0-correctness.md +264 -264
  161. package/docs/plans/subagent-delegation/phase-1-behavioral-contract.md +485 -485
  162. package/docs/plans/subagent-delegation/phase-2-context-controls.md +281 -281
  163. package/docs/plans/subagent-delegation/phase-3-advisory-routing.md +361 -361
  164. package/docs/plans/subagent-delegation/phase-4-optional-enforcement.md +380 -380
  165. package/docs/prompt-templates.md +95 -95
  166. package/docs/providers.md +293 -293
  167. package/docs/sdk.md +1144 -1143
  168. package/docs/security.md +59 -59
  169. package/docs/session-format.md +414 -414
  170. package/docs/sessions.md +145 -145
  171. package/docs/shared-host-extensions.md +109 -109
  172. package/docs/shell-aliases.md +13 -13
  173. package/docs/skills.md +231 -231
  174. package/docs/terminal-setup.md +142 -142
  175. package/docs/termux.md +127 -127
  176. package/docs/themes.md +295 -295
  177. package/docs/tmux.md +63 -63
  178. package/docs/tui.md +927 -927
  179. package/docs/windows.md +17 -17
  180. package/examples/README.md +25 -25
  181. package/examples/extensions/README.md +211 -211
  182. package/examples/extensions/auto-commit-on-exit.ts +49 -49
  183. package/examples/extensions/bash-spawn-hook.ts +30 -30
  184. package/examples/extensions/bookmark.ts +50 -50
  185. package/examples/extensions/border-status-editor.ts +150 -150
  186. package/examples/extensions/built-in-tool-renderer.ts +249 -249
  187. package/examples/extensions/claude-rules.ts +86 -86
  188. package/examples/extensions/commands.ts +72 -72
  189. package/examples/extensions/confirm-destructive.ts +59 -59
  190. package/examples/extensions/custom-compaction.ts +130 -130
  191. package/examples/extensions/custom-footer.ts +64 -64
  192. package/examples/extensions/custom-header.ts +73 -73
  193. package/examples/extensions/custom-provider-anthropic/index.ts +610 -610
  194. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -24
  195. package/examples/extensions/custom-provider-anthropic/package.json +19 -19
  196. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -404
  197. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -16
  198. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -82
  199. package/examples/extensions/dirty-repo-guard.ts +56 -56
  200. package/examples/extensions/doom-overlay/README.md +46 -46
  201. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -21
  202. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  203. package/examples/extensions/doom-overlay/doom/build.sh +152 -152
  204. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -72
  205. package/examples/extensions/doom-overlay/doom-component.ts +132 -132
  206. package/examples/extensions/doom-overlay/doom-engine.ts +173 -173
  207. package/examples/extensions/doom-overlay/doom-keys.ts +104 -104
  208. package/examples/extensions/doom-overlay/index.ts +74 -74
  209. package/examples/extensions/doom-overlay/wad-finder.ts +51 -51
  210. package/examples/extensions/dynamic-resources/SKILL.md +8 -8
  211. package/examples/extensions/dynamic-resources/dynamic.json +79 -79
  212. package/examples/extensions/dynamic-resources/dynamic.md +5 -5
  213. package/examples/extensions/dynamic-resources/index.ts +15 -15
  214. package/examples/extensions/dynamic-tools.ts +74 -74
  215. package/examples/extensions/event-bus.ts +43 -43
  216. package/examples/extensions/file-trigger.ts +41 -41
  217. package/examples/extensions/git-checkpoint.ts +53 -53
  218. package/examples/extensions/git-merge-and-resolve.ts +115 -115
  219. package/examples/extensions/github-issue-autocomplete.ts +185 -185
  220. package/examples/extensions/gondolin/index.ts +531 -531
  221. package/examples/extensions/gondolin/package-lock.json +185 -185
  222. package/examples/extensions/gondolin/package.json +19 -19
  223. package/examples/extensions/handoff.ts +199 -199
  224. package/examples/extensions/hello.ts +26 -26
  225. package/examples/extensions/hidden-thinking-label.ts +53 -53
  226. package/examples/extensions/inline-bash.ts +94 -94
  227. package/examples/extensions/input-transform-streaming.ts +39 -39
  228. package/examples/extensions/input-transform.ts +43 -43
  229. package/examples/extensions/interactive-shell.ts +196 -196
  230. package/examples/extensions/mac-system-theme.ts +47 -47
  231. package/examples/extensions/message-renderer.ts +59 -59
  232. package/examples/extensions/minimal-mode.ts +426 -426
  233. package/examples/extensions/modal-editor.ts +85 -85
  234. package/examples/extensions/model-status.ts +31 -31
  235. package/examples/extensions/notify.ts +55 -55
  236. package/examples/extensions/overlay-qa-tests.ts +1450 -1450
  237. package/examples/extensions/overlay-test.ts +153 -153
  238. package/examples/extensions/permission-gate.ts +34 -34
  239. package/examples/extensions/pirate.ts +47 -47
  240. package/examples/extensions/plan-mode/README.md +66 -66
  241. package/examples/extensions/plan-mode/index.ts +390 -390
  242. package/examples/extensions/plan-mode/utils.ts +168 -168
  243. package/examples/extensions/preset.ts +436 -436
  244. package/examples/extensions/project-trust.ts +64 -64
  245. package/examples/extensions/prompt-customizer.ts +97 -97
  246. package/examples/extensions/protected-paths.ts +30 -30
  247. package/examples/extensions/provider-payload.ts +18 -18
  248. package/examples/extensions/qna.ts +122 -122
  249. package/examples/extensions/question.ts +285 -285
  250. package/examples/extensions/questionnaire.ts +448 -448
  251. package/examples/extensions/rainbow-editor.ts +88 -88
  252. package/examples/extensions/reload-runtime.ts +37 -37
  253. package/examples/extensions/rpc-demo.ts +118 -118
  254. package/examples/extensions/sandbox/index.ts +321 -321
  255. package/examples/extensions/sandbox/package-lock.json +92 -92
  256. package/examples/extensions/sandbox/package.json +19 -19
  257. package/examples/extensions/send-user-message.ts +97 -97
  258. package/examples/extensions/session-name.ts +27 -27
  259. package/examples/extensions/shutdown-command.ts +63 -63
  260. package/examples/extensions/snake.ts +343 -343
  261. package/examples/extensions/space-invaders.ts +560 -560
  262. package/examples/extensions/ssh.ts +220 -220
  263. package/examples/extensions/status-line.ts +32 -32
  264. package/examples/extensions/structured-output.ts +65 -65
  265. package/examples/extensions/subagent/README.md +175 -175
  266. package/examples/extensions/subagent/agents/planner.md +37 -37
  267. package/examples/extensions/subagent/agents/reviewer.md +35 -35
  268. package/examples/extensions/subagent/agents/scout.md +50 -50
  269. package/examples/extensions/subagent/agents/worker.md +24 -24
  270. package/examples/extensions/subagent/agents.ts +126 -126
  271. package/examples/extensions/subagent/index.ts +1015 -1015
  272. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -10
  273. package/examples/extensions/subagent/prompts/implement.md +10 -10
  274. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -9
  275. package/examples/extensions/summarize.ts +209 -209
  276. package/examples/extensions/system-prompt-header.ts +17 -17
  277. package/examples/extensions/tic-tac-toe.ts +1008 -1008
  278. package/examples/extensions/timed-confirm.ts +70 -70
  279. package/examples/extensions/titlebar-spinner.ts +58 -58
  280. package/examples/extensions/todo.ts +297 -297
  281. package/examples/extensions/tool-override.ts +144 -144
  282. package/examples/extensions/tools.ts +146 -146
  283. package/examples/extensions/trigger-compact.ts +50 -50
  284. package/examples/extensions/truncated-tool.ts +195 -195
  285. package/examples/extensions/widget-placement.ts +9 -9
  286. package/examples/extensions/with-deps/index.ts +32 -32
  287. package/examples/extensions/with-deps/package-lock.json +31 -31
  288. package/examples/extensions/with-deps/package.json +22 -22
  289. package/examples/extensions/working-indicator.ts +123 -123
  290. package/examples/extensions/working-message-test.ts +25 -25
  291. package/examples/rpc-extension-ui.ts +632 -632
  292. package/examples/sdk/01-minimal.ts +26 -26
  293. package/examples/sdk/02-custom-model.ts +53 -53
  294. package/examples/sdk/03-custom-prompt.ts +75 -75
  295. package/examples/sdk/04-skills.ts +55 -55
  296. package/examples/sdk/05-tools.ts +48 -48
  297. package/examples/sdk/06-extensions.ts +99 -99
  298. package/examples/sdk/07-context-files.ts +47 -47
  299. package/examples/sdk/08-prompt-templates.ts +51 -51
  300. package/examples/sdk/09-api-keys-and-oauth.ts +52 -52
  301. package/examples/sdk/10-settings.ts +53 -53
  302. package/examples/sdk/11-sessions.ts +52 -52
  303. package/examples/sdk/12-full-control.ts +79 -79
  304. package/examples/sdk/13-session-runtime.ts +67 -67
  305. package/examples/sdk/README.md +144 -144
  306. package/package.json +4 -4
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`