@code-yeongyu/senpi 2026.7.13 → 2026.7.14-3

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 (196) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/core/agent-session.js +1 -1
  3. package/dist/core/agent-session.js.map +1 -1
  4. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  5. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  6. package/dist/core/compaction/branch-summarization.js.map +1 -1
  7. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  8. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +14 -5
  9. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  10. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +1 -1
  11. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  12. package/dist/core/extensions/builtin/terminal/runtime-session.js +3 -2
  13. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  14. package/dist/core/extensions/builtin/websearch/websearch/native.d.ts +1 -1
  15. package/dist/core/extensions/builtin/websearch/websearch/native.d.ts.map +1 -1
  16. package/dist/core/extensions/builtin/websearch/websearch/native.js +83 -33
  17. package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
  18. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.d.ts.map +1 -1
  19. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js +2 -1
  20. package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js.map +1 -1
  21. package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
  22. package/dist/core/extensions/builtin/websearch/websearch/tool.js +3 -3
  23. package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
  24. package/dist/core/model-registry.d.ts.map +1 -1
  25. package/dist/core/model-registry.js +18 -3
  26. package/dist/core/model-registry.js.map +1 -1
  27. package/dist/core/model-resolver.d.ts.map +1 -1
  28. package/dist/core/model-resolver.js +1 -0
  29. package/dist/core/model-resolver.js.map +1 -1
  30. package/dist/core/package-manager.d.ts.map +1 -1
  31. package/dist/core/package-manager.js +7 -2
  32. package/dist/core/package-manager.js.map +1 -1
  33. package/dist/core/provider-display-names.d.ts.map +1 -1
  34. package/dist/core/provider-display-names.js +1 -0
  35. package/dist/core/provider-display-names.js.map +1 -1
  36. package/dist/core/radius.d.ts +21 -0
  37. package/dist/core/radius.d.ts.map +1 -0
  38. package/dist/core/radius.js +30 -0
  39. package/dist/core/radius.js.map +1 -0
  40. package/dist/core/system-prompt.d.ts.map +1 -1
  41. package/dist/core/system-prompt.js +1 -11
  42. package/dist/core/system-prompt.js.map +1 -1
  43. package/dist/modes/interactive/interactive-mode.js +2 -2
  44. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  45. package/docs/custom-provider.md +2 -0
  46. package/docs/models.md +2 -0
  47. package/examples/AGENTS.md +34 -0
  48. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  49. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  50. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  51. package/examples/extensions/gondolin/package-lock.json +2 -2
  52. package/examples/extensions/gondolin/package.json +1 -1
  53. package/examples/extensions/sandbox/package-lock.json +2 -2
  54. package/examples/extensions/sandbox/package.json +1 -1
  55. package/examples/extensions/with-deps/package-lock.json +2 -2
  56. package/examples/extensions/with-deps/package.json +1 -1
  57. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +26 -0
  58. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  59. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +16 -23
  60. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  61. package/node_modules/@earendil-works/pi-ai/README.md +3 -2
  62. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  63. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +23 -42
  64. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  65. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  66. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +10 -6
  67. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
  68. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts +1 -0
  69. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  70. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +1 -1
  71. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  72. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  73. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +12 -3
  74. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  75. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  76. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +23 -0
  77. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  78. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts +1 -0
  79. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  80. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +22 -6
  81. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  82. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts +97 -0
  83. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts.map +1 -0
  84. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js +307 -0
  85. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js.map +1 -0
  86. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.d.ts +3 -0
  87. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.d.ts.map +1 -0
  88. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.js +3 -0
  89. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.js.map +1 -0
  90. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +2 -0
  91. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
  92. package/node_modules/@earendil-works/pi-ai/dist/compat.js +3 -0
  93. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
  94. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  95. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +1 -0
  96. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  97. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  98. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  99. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  100. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +233 -164
  101. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  102. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts +9 -5
  103. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  104. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  105. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts +60 -0
  106. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
  107. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js +54 -0
  108. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js.map +1 -1
  109. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.js +1 -1
  110. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.js.map +1 -1
  111. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts +92 -0
  112. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
  113. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js +72 -0
  114. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
  115. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts +1 -6
  116. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts.map +1 -1
  117. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js +1 -2
  118. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js.map +1 -1
  119. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +57 -0
  120. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
  121. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js +19 -0
  122. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
  123. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +23 -22
  124. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
  125. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +54 -54
  126. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  127. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +0 -136
  128. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  129. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +2 -138
  130. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  131. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.d.ts.map +1 -1
  132. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js +9 -0
  133. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
  134. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts +1 -1
  135. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
  136. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +6 -2
  137. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
  138. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts +8 -0
  139. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts.map +1 -0
  140. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js +92 -0
  141. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js.map +1 -0
  142. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts +6 -0
  143. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts.map +1 -0
  144. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.js +54 -0
  145. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.js.map +1 -0
  146. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.d.ts +4 -0
  147. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.d.ts.map +1 -0
  148. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.js +4 -0
  149. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.js.map +1 -0
  150. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.d.ts +7 -0
  151. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.d.ts.map +1 -0
  152. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.js +16 -0
  153. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.js.map +1 -0
  154. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts +19 -0
  155. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts.map +1 -0
  156. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js +217 -0
  157. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js.map +1 -0
  158. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts +4 -0
  159. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts.map +1 -0
  160. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.js +46 -0
  161. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.js.map +1 -0
  162. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts +13 -0
  163. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts.map +1 -0
  164. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js +144 -0
  165. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js.map +1 -0
  166. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts +5 -0
  167. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +1 -0
  168. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js +208 -0
  169. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +1 -0
  170. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts +4 -0
  171. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts.map +1 -0
  172. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js +17 -0
  173. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js.map +1 -0
  174. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.d.ts +5 -0
  175. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.d.ts.map +1 -0
  176. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.js +34 -0
  177. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.js.map +1 -0
  178. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts +3 -1
  179. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts.map +1 -1
  180. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.js.map +1 -1
  181. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +10 -5
  182. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  183. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  184. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts +1 -0
  185. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts.map +1 -1
  186. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js +9 -0
  187. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js.map +1 -1
  188. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.d.ts +39 -0
  189. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.d.ts.map +1 -0
  190. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.js +413 -0
  191. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.js.map +1 -0
  192. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  193. package/node_modules/@earendil-works/pi-pty/native/prebuilds/darwin-arm64/senpi_pty.darwin-arm64.node +0 -0
  194. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  195. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  196. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"provider-endpoints.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/provider-endpoints.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SearchProvider, SearchProviderConfig } from \"./types.ts\";\n\nconst DEFAULT_PROVIDER_URLS: Record<SearchProvider, string> = {\n\texa: \"https://api.exa.ai/search\",\n\ttavily: \"https://api.tavily.com/search\",\n\tbrave: \"https://api.search.brave.com/res/v1/web/search\",\n\t\"duckduckgo-html\": \"https://html.duckduckgo.com/html/\",\n\tserper: \"https://google.serper.dev/search\",\n\t\"google-cse\": \"https://customsearch.googleapis.com/customsearch/v1\",\n\t\"z-ai\": \"https://api.z.ai/api/paas/v4/web_search\",\n\topenai: \"https://api.openai.com/v1/responses\",\n\tcodex: \"https://api.openai.com/v1/responses\",\n\tanthropic: \"https://api.anthropic.com/v1/messages\",\n\tperplexity: \"https://api.perplexity.ai/search\",\n\txai: \"https://api.x.ai/v1/responses\",\n\tkimi: \"https://api.kimi.com/coding/v1/search\",\n};\n\nexport function defaultProviderUrl(provider: SearchProvider): string {\n\treturn DEFAULT_PROVIDER_URLS[provider];\n}\n\nfunction isPrivateIpv4(hostname: string): boolean {\n\tconst parts = hostname.split(\".\").map((part) => Number.parseInt(part, 10));\n\tif (parts.length !== 4 || parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)) return false;\n\tconst first = parts[0] ?? -1;\n\tconst second = parts[1] ?? -1;\n\tif (first === 10 || first === 127 || first === 0 || (first === 169 && second === 254)) return true;\n\tif (first === 172 && second >= 16 && second <= 31) return true;\n\treturn first === 192 && second === 168;\n}\n\nfunction isPrivateHostname(hostname: string): boolean {\n\tconst normalized = hostname.toLowerCase().replace(/^\\[/, \"\").replace(/\\]$/, \"\");\n\treturn (\n\t\tnormalized === \"localhost\" ||\n\t\tnormalized.endsWith(\".localhost\") ||\n\t\tnormalized.includes(\":\") ||\n\t\tnormalized === \"::1\" ||\n\t\tnormalized.startsWith(\"fc\") ||\n\t\tnormalized.startsWith(\"fd\") ||\n\t\t/^fe[89ab][0-9a-f]:/.test(normalized) ||\n\t\tisPrivateIpv4(normalized)\n\t);\n}\n\nexport function isAllowedProviderBaseUrl(baseUrl: string): boolean {\n\tlet configured: URL;\n\ttry {\n\t\tconfigured = new URL(baseUrl);\n\t} catch {\n\t\treturn false;\n\t}\n\treturn (\n\t\tconfigured.protocol === \"https:\" &&\n\t\tconfigured.username === \"\" &&\n\t\tconfigured.password === \"\" &&\n\t\t!isPrivateHostname(configured.hostname)\n\t);\n}\n\nexport function providerUrl(config: SearchProviderConfig): string {\n\treturn config.baseUrl ?? defaultProviderUrl(config.provider);\n}\n"]}
1
+ {"version":3,"file":"provider-endpoints.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/provider-endpoints.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SearchProvider, SearchProviderConfig } from \"./types.ts\";\n\nconst DEFAULT_PROVIDER_URLS: Record<SearchProvider, string> = {\n\texa: \"https://api.exa.ai/search\",\n\ttavily: \"https://api.tavily.com/search\",\n\tbrave: \"https://api.search.brave.com/res/v1/web/search\",\n\t\"duckduckgo-html\": \"https://html.duckduckgo.com/html/\",\n\tserper: \"https://google.serper.dev/search\",\n\t\"google-cse\": \"https://customsearch.googleapis.com/customsearch/v1\",\n\t\"z-ai\": \"https://api.z.ai/api/paas/v4/web_search\",\n\topenai: \"https://api.openai.com/v1/responses\",\n\tcodex: \"https://api.openai.com/v1/responses\",\n\tanthropic: \"https://api.anthropic.com/v1/messages\",\n\tperplexity: \"https://api.perplexity.ai/search\",\n\txai: \"https://api.x.ai/v1/responses\",\n\tkimi: \"https://api.kimi.com/coding/v1/search\",\n};\n\nexport function defaultProviderUrl(provider: SearchProvider): string {\n\treturn DEFAULT_PROVIDER_URLS[provider];\n}\n\nfunction isPrivateIpv4(hostname: string): boolean {\n\tconst parts = hostname.split(\".\").map((part) => Number.parseInt(part, 10));\n\tif (parts.length !== 4 || parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)) return false;\n\tconst first = parts[0] ?? -1;\n\tconst second = parts[1] ?? -1;\n\tif (first === 10 || first === 127 || first === 0 || (first === 169 && second === 254)) return true;\n\tif (first === 172 && second >= 16 && second <= 31) return true;\n\treturn first === 192 && second === 168;\n}\n\nfunction isPrivateHostname(hostname: string): boolean {\n\tconst normalized = hostname.toLowerCase().replace(/^\\[/, \"\").replace(/\\]$/, \"\").replace(/\\.$/, \"\");\n\treturn (\n\t\tnormalized === \"localhost\" ||\n\t\tnormalized.endsWith(\".localhost\") ||\n\t\tnormalized.includes(\":\") ||\n\t\tnormalized === \"::1\" ||\n\t\tnormalized.startsWith(\"fc\") ||\n\t\tnormalized.startsWith(\"fd\") ||\n\t\t/^fe[89ab][0-9a-f]:/.test(normalized) ||\n\t\tisPrivateIpv4(normalized)\n\t);\n}\n\nexport function isAllowedProviderBaseUrl(baseUrl: string): boolean {\n\tlet configured: URL;\n\ttry {\n\t\tconfigured = new URL(baseUrl);\n\t} catch {\n\t\treturn false;\n\t}\n\treturn (\n\t\tconfigured.protocol === \"https:\" &&\n\t\tconfigured.username === \"\" &&\n\t\tconfigured.password === \"\" &&\n\t\t!configured.hostname.endsWith(\"..\") &&\n\t\t!isPrivateHostname(configured.hostname)\n\t);\n}\n\nexport function providerUrl(config: SearchProviderConfig): string {\n\treturn config.baseUrl ?? defaultProviderUrl(config.provider);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK/C,OAAO,KAAK,EACX,gBAAgB,EAIhB,mBAAmB,EAEnB,MAAM,YAAY,CAAC;AAEpB,QAAA,MAAM,MAAM;;;;EAWX,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,gBAAgB,CAAC;AACpD,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,OAAO,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;AA0BvF,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,cAAc,GAAG,aAAa,CA6D5E;AAED,eAAO,MAAM,UAAU;;;;yFAIpB,CAAC"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK/C,OAAO,KAAK,EACX,gBAAgB,EAIhB,mBAAmB,EAEnB,MAAM,YAAY,CAAC;AAEpB,QAAA,MAAM,MAAM;;;;EAWX,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,gBAAgB,CAAC;AACpD,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,OAAO,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;AA8BvF,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,cAAc,GAAG,aAAa,CA6D5E;AAED,eAAO,MAAM,UAAU;;;;yFAIpB,CAAC"}
@@ -8,10 +8,10 @@ const Params = Type.Object({
8
8
  allowed_domains: Type.Optional(Type.Array(Type.String(), { description: "Only include search results from these domains" })),
9
9
  blocked_domains: Type.Optional(Type.Array(Type.String(), { description: "Never include search results from these domains" })),
10
10
  }, { additionalProperties: false });
11
- async function configWithNativeRoute(config, ctx) {
11
+ async function configWithNativeRoute(config, ctx, signal) {
12
12
  if (!config.auto)
13
13
  return config;
14
- const nativeEntries = await buildNativeEntries(ctx?.model, ctx?.modelRegistry);
14
+ const nativeEntries = await buildNativeEntries(ctx?.model, ctx?.modelRegistry, signal);
15
15
  return nativeEntries.length > 0 ? { ...config, providers: [...nativeEntries, ...config.providers] } : config;
16
16
  }
17
17
  function providerLabel(provider) {
@@ -46,7 +46,7 @@ export function createWebSearchTool(getConfig) {
46
46
  return { content: [{ type: "text", text: loaded.message }], details };
47
47
  }
48
48
  const maxResults = loaded.config.providers[0]?.maxResults ?? 10;
49
- const config = await configWithNativeRoute(loaded.config, ctx);
49
+ const config = await configWithNativeRoute(loaded.config, ctx, signal);
50
50
  const progressDetails = {
51
51
  phase: "searching",
52
52
  query: params.query,
@@ -1 +1 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type } from \"typebox\";\nimport { defineTool } from \"../../../types.ts\";\n\nimport { buildNativeEntries, type NativeModelInfo, type NativeModelRegistry } from \"./native.ts\";\nimport { renderSearchCall, renderSearchResult } from \"./renderers.ts\";\nimport { createSearchRoutingState, formatSearchText, performSearch, type SearchRoutingState } from \"./search.ts\";\nimport type {\n\tConfigLoadResult,\n\tSearchErrorDetails,\n\tSearchProgressDetails,\n\tSearchProviderEntry,\n\tSearchRenderDetails,\n\tWebsearchConfig,\n} from \"./types.ts\";\n\nconst Params = Type.Object(\n\t{\n\t\tquery: Type.String({ minLength: 2, description: \"The search query to use\" }),\n\t\tallowed_domains: Type.Optional(\n\t\t\tType.Array(Type.String(), { description: \"Only include search results from these domains\" }),\n\t\t),\n\t\tblocked_domains: Type.Optional(\n\t\t\tType.Array(Type.String(), { description: \"Never include search results from these domains\" }),\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type ConfigProvider = () => ConfigLoadResult;\ntype WebSearchTool = ReturnType<typeof defineTool<typeof Params, SearchRenderDetails>>;\n\ninterface WebSearchToolContext {\n\tmodel: NativeModelInfo | undefined;\n\tmodelRegistry: NativeModelRegistry;\n}\n\nasync function configWithNativeRoute(config: WebsearchConfig, ctx?: WebSearchToolContext): Promise<WebsearchConfig> {\n\tif (!config.auto) return config;\n\tconst nativeEntries = await buildNativeEntries(ctx?.model, ctx?.modelRegistry);\n\treturn nativeEntries.length > 0 ? { ...config, providers: [...nativeEntries, ...config.providers] } : config;\n}\n\nfunction providerLabel(provider: SearchProviderEntry): string {\n\treturn provider.id ? `${provider.id}/${provider.provider}` : provider.provider;\n}\n\nfunction formatSearchProgressText(details: SearchProgressDetails): string {\n\tconst route = details.providerLabels.length > 0 ? details.providerLabels.join(\" -> \") : \"configured providers\";\n\treturn `Searching \"${details.query}\" via ${route} (max ${details.maxResults})`;\n}\n\nfunction searchErrorDetails(query: string, error: string, reason?: SearchErrorDetails[\"reason\"]): SearchErrorDetails {\n\treturn { phase: \"error\", query, error, ...(reason ? { reason } : {}) };\n}\n\nexport function createWebSearchTool(getConfig: ConfigProvider): WebSearchTool {\n\tlet routingState: SearchRoutingState | undefined;\n\tlet routingKey = \"\";\n\n\treturn defineTool<typeof Params, SearchRenderDetails>({\n\t\tname: \"web_search\",\n\t\tlabel: \"Web Search\",\n\t\tdescription: \"Search the web for current information and return source URLs for citation.\",\n\t\tpromptSnippet: \"Search the web for current information, documentation, news, or external facts.\",\n\t\tpromptGuidelines: [\"After using web_search, cite relevant returned URLs in the final answer.\"],\n\t\tparameters: Params,\n\t\tasync execute(_toolCallId, params, signal, onUpdate, ctx?: WebSearchToolContext) {\n\t\t\tif (params.allowed_domains?.length && params.blocked_domains?.length) {\n\t\t\t\tconst message = \"Error: Cannot specify both allowed_domains and blocked_domains in the same request\";\n\t\t\t\tconst details = searchErrorDetails(params.query, message);\n\t\t\t\treturn { content: [{ type: \"text\", text: message }], details };\n\t\t\t}\n\n\t\t\tconst loaded = getConfig();\n\t\t\tif (!loaded.ok) {\n\t\t\t\tconst details = searchErrorDetails(params.query, loaded.message, loaded.reason);\n\t\t\t\treturn { content: [{ type: \"text\", text: loaded.message }], details };\n\t\t\t}\n\n\t\t\tconst maxResults = loaded.config.providers[0]?.maxResults ?? 10;\n\t\t\tconst config = await configWithNativeRoute(loaded.config, ctx);\n\t\t\tconst progressDetails: SearchProgressDetails = {\n\t\t\t\tphase: \"searching\",\n\t\t\t\tquery: params.query,\n\t\t\t\tproviderLabels: config.providers.map(providerLabel),\n\t\t\t\tmaxResults,\n\t\t\t\tstrategy: config.strategy,\n\t\t\t\t...(params.allowed_domains ? { allowedDomains: params.allowed_domains } : {}),\n\t\t\t\t...(params.blocked_domains ? { blockedDomains: params.blocked_domains } : {}),\n\t\t\t};\n\t\t\tonUpdate?.({\n\t\t\t\tcontent: [{ type: \"text\", text: formatSearchProgressText(progressDetails) }],\n\t\t\t\tdetails: progressDetails,\n\t\t\t});\n\n\t\t\tconst nextRoutingKey = `${config.strategy}:${config.providers.map((provider) => provider.id ?? provider.provider).join(\"|\")}`;\n\t\t\tif (\n\t\t\t\t!routingState ||\n\t\t\t\troutingKey !== nextRoutingKey ||\n\t\t\t\troutingState.successCounts.length !== config.providers.length\n\t\t\t) {\n\t\t\t\troutingState = createSearchRoutingState(config.providers.length);\n\t\t\t\troutingKey = nextRoutingKey;\n\t\t\t}\n\t\t\tconst request = {\n\t\t\t\tquery: params.query,\n\t\t\t\tmaxResults,\n\t\t\t\t...(params.allowed_domains === undefined ? {} : { allowedDomains: params.allowed_domains }),\n\t\t\t\t...(params.blocked_domains === undefined ? {} : { blockedDomains: params.blocked_domains }),\n\t\t\t};\n\t\t\tconst details = await performSearch(config, request, signal, routingState);\n\t\t\treturn { content: [{ type: \"text\", text: formatSearchText(details) }], details };\n\t\t},\n\t\trenderCall: (args, theme) => renderSearchCall(args, theme),\n\t\trenderResult: (result, options, theme) => renderSearchResult(result, options, theme),\n\t});\n}\n\nexport const web_search = createWebSearchTool(() => ({\n\tok: false,\n\treason: \"missing_config\",\n\tmessage: \"Missing websearch config. Create .pi/websearch.json or ~/.pi/websearch.json before starting pi.\",\n}));\n"]}
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type } from \"typebox\";\nimport { defineTool } from \"../../../types.ts\";\n\nimport { buildNativeEntries, type NativeModelInfo, type NativeModelRegistry } from \"./native.ts\";\nimport { renderSearchCall, renderSearchResult } from \"./renderers.ts\";\nimport { createSearchRoutingState, formatSearchText, performSearch, type SearchRoutingState } from \"./search.ts\";\nimport type {\n\tConfigLoadResult,\n\tSearchErrorDetails,\n\tSearchProgressDetails,\n\tSearchProviderEntry,\n\tSearchRenderDetails,\n\tWebsearchConfig,\n} from \"./types.ts\";\n\nconst Params = Type.Object(\n\t{\n\t\tquery: Type.String({ minLength: 2, description: \"The search query to use\" }),\n\t\tallowed_domains: Type.Optional(\n\t\t\tType.Array(Type.String(), { description: \"Only include search results from these domains\" }),\n\t\t),\n\t\tblocked_domains: Type.Optional(\n\t\t\tType.Array(Type.String(), { description: \"Never include search results from these domains\" }),\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type ConfigProvider = () => ConfigLoadResult;\ntype WebSearchTool = ReturnType<typeof defineTool<typeof Params, SearchRenderDetails>>;\n\ninterface WebSearchToolContext {\n\tmodel: NativeModelInfo | undefined;\n\tmodelRegistry: NativeModelRegistry;\n}\n\nasync function configWithNativeRoute(\n\tconfig: WebsearchConfig,\n\tctx: WebSearchToolContext | undefined,\n\tsignal: AbortSignal | undefined,\n): Promise<WebsearchConfig> {\n\tif (!config.auto) return config;\n\tconst nativeEntries = await buildNativeEntries(ctx?.model, ctx?.modelRegistry, signal);\n\treturn nativeEntries.length > 0 ? { ...config, providers: [...nativeEntries, ...config.providers] } : config;\n}\n\nfunction providerLabel(provider: SearchProviderEntry): string {\n\treturn provider.id ? `${provider.id}/${provider.provider}` : provider.provider;\n}\n\nfunction formatSearchProgressText(details: SearchProgressDetails): string {\n\tconst route = details.providerLabels.length > 0 ? details.providerLabels.join(\" -> \") : \"configured providers\";\n\treturn `Searching \"${details.query}\" via ${route} (max ${details.maxResults})`;\n}\n\nfunction searchErrorDetails(query: string, error: string, reason?: SearchErrorDetails[\"reason\"]): SearchErrorDetails {\n\treturn { phase: \"error\", query, error, ...(reason ? { reason } : {}) };\n}\n\nexport function createWebSearchTool(getConfig: ConfigProvider): WebSearchTool {\n\tlet routingState: SearchRoutingState | undefined;\n\tlet routingKey = \"\";\n\n\treturn defineTool<typeof Params, SearchRenderDetails>({\n\t\tname: \"web_search\",\n\t\tlabel: \"Web Search\",\n\t\tdescription: \"Search the web for current information and return source URLs for citation.\",\n\t\tpromptSnippet: \"Search the web for current information, documentation, news, or external facts.\",\n\t\tpromptGuidelines: [\"After using web_search, cite relevant returned URLs in the final answer.\"],\n\t\tparameters: Params,\n\t\tasync execute(_toolCallId, params, signal, onUpdate, ctx?: WebSearchToolContext) {\n\t\t\tif (params.allowed_domains?.length && params.blocked_domains?.length) {\n\t\t\t\tconst message = \"Error: Cannot specify both allowed_domains and blocked_domains in the same request\";\n\t\t\t\tconst details = searchErrorDetails(params.query, message);\n\t\t\t\treturn { content: [{ type: \"text\", text: message }], details };\n\t\t\t}\n\n\t\t\tconst loaded = getConfig();\n\t\t\tif (!loaded.ok) {\n\t\t\t\tconst details = searchErrorDetails(params.query, loaded.message, loaded.reason);\n\t\t\t\treturn { content: [{ type: \"text\", text: loaded.message }], details };\n\t\t\t}\n\n\t\t\tconst maxResults = loaded.config.providers[0]?.maxResults ?? 10;\n\t\t\tconst config = await configWithNativeRoute(loaded.config, ctx, signal);\n\t\t\tconst progressDetails: SearchProgressDetails = {\n\t\t\t\tphase: \"searching\",\n\t\t\t\tquery: params.query,\n\t\t\t\tproviderLabels: config.providers.map(providerLabel),\n\t\t\t\tmaxResults,\n\t\t\t\tstrategy: config.strategy,\n\t\t\t\t...(params.allowed_domains ? { allowedDomains: params.allowed_domains } : {}),\n\t\t\t\t...(params.blocked_domains ? { blockedDomains: params.blocked_domains } : {}),\n\t\t\t};\n\t\t\tonUpdate?.({\n\t\t\t\tcontent: [{ type: \"text\", text: formatSearchProgressText(progressDetails) }],\n\t\t\t\tdetails: progressDetails,\n\t\t\t});\n\n\t\t\tconst nextRoutingKey = `${config.strategy}:${config.providers.map((provider) => provider.id ?? provider.provider).join(\"|\")}`;\n\t\t\tif (\n\t\t\t\t!routingState ||\n\t\t\t\troutingKey !== nextRoutingKey ||\n\t\t\t\troutingState.successCounts.length !== config.providers.length\n\t\t\t) {\n\t\t\t\troutingState = createSearchRoutingState(config.providers.length);\n\t\t\t\troutingKey = nextRoutingKey;\n\t\t\t}\n\t\t\tconst request = {\n\t\t\t\tquery: params.query,\n\t\t\t\tmaxResults,\n\t\t\t\t...(params.allowed_domains === undefined ? {} : { allowedDomains: params.allowed_domains }),\n\t\t\t\t...(params.blocked_domains === undefined ? {} : { blockedDomains: params.blocked_domains }),\n\t\t\t};\n\t\t\tconst details = await performSearch(config, request, signal, routingState);\n\t\t\treturn { content: [{ type: \"text\", text: formatSearchText(details) }], details };\n\t\t},\n\t\trenderCall: (args, theme) => renderSearchCall(args, theme),\n\t\trenderResult: (result, options, theme) => renderSearchResult(result, options, theme),\n\t});\n}\n\nexport const web_search = createWebSearchTool(() => ({\n\tok: false,\n\treason: \"missing_config\",\n\tmessage: \"Missing websearch config. Create .pi/websearch.json or ~/.pi/websearch.json before starting pi.\",\n}));\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"model-registry.d.ts","sourceRoot":"","sources":["../../src/core/model-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-registry.d.ts","sourceRoot":"","sources":["../../src/core/model-registry.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ import { getAgentDir } from "../config.js";
11
11
  import { stripJsonComments } from "../utils/json.js";
12
12
  import { normalizePath } from "../utils/paths.js";
13
13
  import { BUILT_IN_PROVIDER_DISPLAY_NAMES } from "./provider-display-names.js";
14
+ import { registerCustomRadiusOAuthProvider } from "./radius.js";
14
15
  import { getConfigValueEnvVarNames, isCommandConfigValue, isConfigValueConfigured, resolveConfigValueOrThrow, resolveConfigValueUncached, resolveHeadersOrThrow, } from "./resolve-config-value.js";
15
16
  // Schema for OpenRouter routing preferences
16
17
  const PercentileCutoffsSchema = Type.Object({
@@ -96,17 +97,20 @@ const OpenAICompletionsCompatSchema = Type.Object({
96
97
  vercelGatewayRouting: Type.Optional(VercelGatewayRoutingSchema),
97
98
  supportsStrictMode: Type.Optional(Type.Boolean()),
98
99
  toolCallFormat: Type.Optional(Type.Union([
100
+ Type.Literal("anthropic-xml"),
99
101
  Type.Literal("hermes"),
100
102
  Type.Literal("gemma4"),
101
103
  Type.Literal("gemma4-delimiter"),
102
104
  Type.Literal("xml"),
103
105
  Type.Literal("yaml-xml"),
104
106
  ])),
107
+ sendSessionAffinityHeaders: Type.Optional(Type.Boolean()),
108
+ sessionAffinityFormat: Type.Optional(Type.Union([Type.Literal("openai"), Type.Literal("openai-nosession"), Type.Literal("openrouter")])),
105
109
  supportsLongCacheRetention: Type.Optional(Type.Boolean()),
106
110
  });
107
111
  const OpenAIResponsesCompatSchema = Type.Object({
108
112
  supportsDeveloperRole: Type.Optional(Type.Boolean()),
109
- sendSessionIdHeader: Type.Optional(Type.Boolean()),
113
+ sessionAffinityFormat: Type.Optional(Type.Union([Type.Literal("openai"), Type.Literal("openai-nosession"), Type.Literal("openrouter")])),
110
114
  supportsLongCacheRetention: Type.Optional(Type.Boolean()),
111
115
  supportsWebSocket: Type.Optional(Type.Boolean()),
112
116
  supportsWebSearchPreview: Type.Optional(Type.Boolean()),
@@ -194,6 +198,9 @@ const ProviderConfigSchema = Type.Object({
194
198
  baseUrl: Type.Optional(Type.String({ minLength: 1 })),
195
199
  apiKey: Type.Optional(Type.String({ minLength: 1 })),
196
200
  api: Type.Optional(Type.String({ minLength: 1 })),
201
+ /** OAuth flavor spoken by this provider's endpoint. Registers a sign-in
202
+ * provider with a dynamic model catalog (e.g. a custom Radius gateway). */
203
+ oauth: Type.Optional(Type.Literal("radius")),
197
204
  headers: Type.Optional(Type.Record(Type.String(), Type.String())),
198
205
  extraBody: Type.Optional(ExtraBodySchema),
199
206
  cacheRetention: Type.Optional(CacheRetentionSchema),
@@ -465,6 +472,11 @@ export class ModelRegistry {
465
472
  cacheRetention: providerConfig.cacheRetention,
466
473
  });
467
474
  }
475
+ if (providerConfig.oauth === "radius") {
476
+ // Must run before the modifyModels loop in loadModels() so the
477
+ // credential-cached catalog is injected on this load.
478
+ registerCustomRadiusOAuthProvider(providerName, providerConfig.name, providerConfig.baseUrl);
479
+ }
468
480
  this.storeProviderRequestConfig(providerName, providerConfig);
469
481
  if (providerConfig.modelOverrides) {
470
482
  modelOverrides.set(providerName, new Map(Object.entries(providerConfig.modelOverrides)));
@@ -500,7 +512,10 @@ export class ModelRegistry {
500
512
  const hasProviderApi = !!providerConfig.api;
501
513
  const models = providerConfig.models ?? [];
502
514
  const hasModelOverrides = providerConfig.modelOverrides && Object.keys(providerConfig.modelOverrides).length > 0;
503
- if (models.length === 0) {
515
+ if (providerConfig.oauth && !providerConfig.baseUrl) {
516
+ throw new Error(`Provider ${providerName}: "baseUrl" is required when "oauth" is set.`);
517
+ }
518
+ if (models.length === 0 && !providerConfig.oauth) {
504
519
  // Override-only config: needs baseUrl, headers, compat, modelOverrides, extraBody, or some combination.
505
520
  if (!providerConfig.baseUrl &&
506
521
  !providerConfig.headers &&
@@ -510,7 +525,7 @@ export class ModelRegistry {
510
525
  !providerConfig.extraBody &&
511
526
  !providerConfig.whitelist &&
512
527
  !providerConfig.blacklist) {
513
- throw new Error(`Provider ${providerName}: must specify "baseUrl", "headers", "compat", "cacheRetention", "modelOverrides", "extraBody", or "models".`);
528
+ throw new Error(`Provider ${providerName}: must specify "baseUrl", "headers", "compat", "cacheRetention", "modelOverrides", "extraBody", "whitelist", "blacklist", or "models".`);
514
529
  }
515
530
  }
516
531
  else if (!isBuiltIn) {