@gajae-code/ai 0.1.1

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 (349) hide show
  1. package/CHANGELOG.md +2644 -0
  2. package/README.md +1181 -0
  3. package/dist/types/api-registry.d.ts +30 -0
  4. package/dist/types/auth-broker/client.d.ts +66 -0
  5. package/dist/types/auth-broker/index.d.ts +5 -0
  6. package/dist/types/auth-broker/refresher.d.ts +25 -0
  7. package/dist/types/auth-broker/remote-store.d.ts +96 -0
  8. package/dist/types/auth-broker/server.d.ts +32 -0
  9. package/dist/types/auth-broker/types.d.ts +105 -0
  10. package/dist/types/auth-broker/wire-schemas.d.ts +412 -0
  11. package/dist/types/auth-gateway/http.d.ts +39 -0
  12. package/dist/types/auth-gateway/index.d.ts +3 -0
  13. package/dist/types/auth-gateway/server.d.ts +17 -0
  14. package/dist/types/auth-gateway/types.d.ts +115 -0
  15. package/dist/types/auth-storage.d.ts +641 -0
  16. package/dist/types/cli.d.ts +2 -0
  17. package/dist/types/index.d.ts +49 -0
  18. package/dist/types/model-cache.d.ts +17 -0
  19. package/dist/types/model-manager.d.ts +62 -0
  20. package/dist/types/model-thinking.d.ts +71 -0
  21. package/dist/types/models.d.ts +12 -0
  22. package/dist/types/provider-details.d.ts +24 -0
  23. package/dist/types/provider-models/bundled-references.d.ts +4 -0
  24. package/dist/types/provider-models/descriptors.d.ts +48 -0
  25. package/dist/types/provider-models/google.d.ts +20 -0
  26. package/dist/types/provider-models/index.d.ts +5 -0
  27. package/dist/types/provider-models/ollama.d.ts +7 -0
  28. package/dist/types/provider-models/openai-compat.d.ts +237 -0
  29. package/dist/types/provider-models/special.d.ts +16 -0
  30. package/dist/types/providers/amazon-bedrock.d.ts +36 -0
  31. package/dist/types/providers/anthropic-messages-server-schema.d.ts +450 -0
  32. package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
  33. package/dist/types/providers/anthropic.d.ts +188 -0
  34. package/dist/types/providers/aws-credentials.d.ts +43 -0
  35. package/dist/types/providers/aws-eventstream.d.ts +38 -0
  36. package/dist/types/providers/aws-sigv4.d.ts +55 -0
  37. package/dist/types/providers/azure-openai-responses.d.ts +15 -0
  38. package/dist/types/providers/cursor/gen/agent_pb.d.ts +13022 -0
  39. package/dist/types/providers/cursor.d.ts +42 -0
  40. package/dist/types/providers/error-message.d.ts +27 -0
  41. package/dist/types/providers/github-copilot-headers.d.ts +40 -0
  42. package/dist/types/providers/gitlab-duo.d.ts +27 -0
  43. package/dist/types/providers/google-auth.d.ts +24 -0
  44. package/dist/types/providers/google-gemini-cli.d.ts +72 -0
  45. package/dist/types/providers/google-gemini-headers.d.ts +18 -0
  46. package/dist/types/providers/google-shared.d.ts +163 -0
  47. package/dist/types/providers/google-types.d.ts +138 -0
  48. package/dist/types/providers/google-vertex.d.ts +7 -0
  49. package/dist/types/providers/google.d.ts +4 -0
  50. package/dist/types/providers/grammar.d.ts +1 -0
  51. package/dist/types/providers/kimi.d.ts +27 -0
  52. package/dist/types/providers/mock.d.ts +175 -0
  53. package/dist/types/providers/ollama.d.ts +6 -0
  54. package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
  55. package/dist/types/providers/openai-chat-server-schema.d.ts +814 -0
  56. package/dist/types/providers/openai-chat-server.d.ts +16 -0
  57. package/dist/types/providers/openai-codex/constants.d.ts +26 -0
  58. package/dist/types/providers/openai-codex/request-transformer.d.ts +49 -0
  59. package/dist/types/providers/openai-codex/response-handler.d.ts +17 -0
  60. package/dist/types/providers/openai-codex-responses.d.ts +67 -0
  61. package/dist/types/providers/openai-completions-compat.d.ts +25 -0
  62. package/dist/types/providers/openai-completions.d.ts +33 -0
  63. package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
  64. package/dist/types/providers/openai-responses-server.d.ts +17 -0
  65. package/dist/types/providers/openai-responses-shared.d.ts +89 -0
  66. package/dist/types/providers/openai-responses.d.ts +32 -0
  67. package/dist/types/providers/pi-native-client.d.ts +13 -0
  68. package/dist/types/providers/pi-native-server.d.ts +68 -0
  69. package/dist/types/providers/register-builtins.d.ts +31 -0
  70. package/dist/types/providers/synthetic.d.ts +26 -0
  71. package/dist/types/providers/transform-messages.d.ts +12 -0
  72. package/dist/types/providers/vision-guard.d.ts +8 -0
  73. package/dist/types/rate-limit-utils.d.ts +19 -0
  74. package/dist/types/stream.d.ts +24 -0
  75. package/dist/types/types.d.ts +746 -0
  76. package/dist/types/usage/claude.d.ts +3 -0
  77. package/dist/types/usage/gemini.d.ts +2 -0
  78. package/dist/types/usage/github-copilot.d.ts +7 -0
  79. package/dist/types/usage/google-antigravity.d.ts +2 -0
  80. package/dist/types/usage/kimi.d.ts +2 -0
  81. package/dist/types/usage/minimax-code.d.ts +2 -0
  82. package/dist/types/usage/openai-codex.d.ts +3 -0
  83. package/dist/types/usage/shared.d.ts +1 -0
  84. package/dist/types/usage/zai.d.ts +2 -0
  85. package/dist/types/usage.d.ts +258 -0
  86. package/dist/types/utils/abort.d.ts +19 -0
  87. package/dist/types/utils/anthropic-auth.d.ts +31 -0
  88. package/dist/types/utils/discovery/antigravity.d.ts +61 -0
  89. package/dist/types/utils/discovery/codex.d.ts +38 -0
  90. package/dist/types/utils/discovery/cursor.d.ts +23 -0
  91. package/dist/types/utils/discovery/gemini.d.ts +25 -0
  92. package/dist/types/utils/discovery/index.d.ts +4 -0
  93. package/dist/types/utils/discovery/openai-compatible.d.ts +72 -0
  94. package/dist/types/utils/event-stream.d.ts +28 -0
  95. package/dist/types/utils/fireworks-model-id.d.ts +10 -0
  96. package/dist/types/utils/foundry.d.ts +1 -0
  97. package/dist/types/utils/h2-fetch.d.ts +22 -0
  98. package/dist/types/utils/http-inspector.d.ts +31 -0
  99. package/dist/types/utils/idle-iterator.d.ts +67 -0
  100. package/dist/types/utils/json-parse.d.ts +10 -0
  101. package/dist/types/utils/oauth/alibaba-coding-plan.d.ts +18 -0
  102. package/dist/types/utils/oauth/anthropic.d.ts +22 -0
  103. package/dist/types/utils/oauth/api-key-login.d.ts +35 -0
  104. package/dist/types/utils/oauth/api-key-validation.d.ts +27 -0
  105. package/dist/types/utils/oauth/callback-server.d.ts +57 -0
  106. package/dist/types/utils/oauth/cerebras.d.ts +1 -0
  107. package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
  108. package/dist/types/utils/oauth/cursor.d.ts +15 -0
  109. package/dist/types/utils/oauth/deepseek.d.ts +10 -0
  110. package/dist/types/utils/oauth/firepass.d.ts +1 -0
  111. package/dist/types/utils/oauth/fireworks.d.ts +1 -0
  112. package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
  113. package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
  114. package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
  115. package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
  116. package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
  117. package/dist/types/utils/oauth/huggingface.d.ts +19 -0
  118. package/dist/types/utils/oauth/index.d.ts +38 -0
  119. package/dist/types/utils/oauth/kagi.d.ts +17 -0
  120. package/dist/types/utils/oauth/kilo.d.ts +5 -0
  121. package/dist/types/utils/oauth/kimi.d.ts +21 -0
  122. package/dist/types/utils/oauth/litellm.d.ts +18 -0
  123. package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
  124. package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
  125. package/dist/types/utils/oauth/moonshot.d.ts +1 -0
  126. package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
  127. package/dist/types/utils/oauth/nvidia.d.ts +18 -0
  128. package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
  129. package/dist/types/utils/oauth/ollama.d.ts +18 -0
  130. package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
  131. package/dist/types/utils/oauth/opencode.d.ts +18 -0
  132. package/dist/types/utils/oauth/parallel.d.ts +17 -0
  133. package/dist/types/utils/oauth/perplexity.d.ts +9 -0
  134. package/dist/types/utils/oauth/pkce.d.ts +8 -0
  135. package/dist/types/utils/oauth/qianfan.d.ts +17 -0
  136. package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
  137. package/dist/types/utils/oauth/synthetic.d.ts +1 -0
  138. package/dist/types/utils/oauth/tavily.d.ts +17 -0
  139. package/dist/types/utils/oauth/together.d.ts +1 -0
  140. package/dist/types/utils/oauth/types.d.ts +44 -0
  141. package/dist/types/utils/oauth/venice.d.ts +18 -0
  142. package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
  143. package/dist/types/utils/oauth/vllm.d.ts +16 -0
  144. package/dist/types/utils/oauth/xiaomi.d.ts +19 -0
  145. package/dist/types/utils/oauth/zai.d.ts +18 -0
  146. package/dist/types/utils/oauth/zenmux.d.ts +1 -0
  147. package/dist/types/utils/overflow.d.ts +54 -0
  148. package/dist/types/utils/parse-bind.d.ts +23 -0
  149. package/dist/types/utils/provider-response.d.ts +3 -0
  150. package/dist/types/utils/retry-after.d.ts +3 -0
  151. package/dist/types/utils/retry.d.ts +26 -0
  152. package/dist/types/utils/schema/adapt.d.ts +24 -0
  153. package/dist/types/utils/schema/compatibility.d.ts +30 -0
  154. package/dist/types/utils/schema/dereference.d.ts +11 -0
  155. package/dist/types/utils/schema/draft.d.ts +10 -0
  156. package/dist/types/utils/schema/equality.d.ts +4 -0
  157. package/dist/types/utils/schema/fields.d.ts +49 -0
  158. package/dist/types/utils/schema/index.d.ts +13 -0
  159. package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
  160. package/dist/types/utils/schema/meta-validator.d.ts +2 -0
  161. package/dist/types/utils/schema/normalize.d.ts +93 -0
  162. package/dist/types/utils/schema/spill.d.ts +8 -0
  163. package/dist/types/utils/schema/stamps.d.ts +25 -0
  164. package/dist/types/utils/schema/types.d.ts +4 -0
  165. package/dist/types/utils/schema/wire.d.ts +54 -0
  166. package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
  167. package/dist/types/utils/sse-debug.d.ts +10 -0
  168. package/dist/types/utils/tool-call-healing.d.ts +71 -0
  169. package/dist/types/utils/tool-choice.d.ts +50 -0
  170. package/dist/types/utils/validation.d.ts +17 -0
  171. package/dist/types/utils.d.ts +28 -0
  172. package/package.json +146 -0
  173. package/src/api-registry.ts +96 -0
  174. package/src/auth-broker/client.ts +358 -0
  175. package/src/auth-broker/index.ts +5 -0
  176. package/src/auth-broker/refresher.ts +127 -0
  177. package/src/auth-broker/remote-store.ts +623 -0
  178. package/src/auth-broker/server.ts +644 -0
  179. package/src/auth-broker/types.ts +127 -0
  180. package/src/auth-broker/wire-schemas.ts +200 -0
  181. package/src/auth-gateway/http.ts +194 -0
  182. package/src/auth-gateway/index.ts +3 -0
  183. package/src/auth-gateway/server.ts +717 -0
  184. package/src/auth-gateway/types.ts +134 -0
  185. package/src/auth-storage.ts +4104 -0
  186. package/src/cli.ts +262 -0
  187. package/src/index.ts +54 -0
  188. package/src/model-cache.ts +129 -0
  189. package/src/model-manager.ts +450 -0
  190. package/src/model-thinking.ts +691 -0
  191. package/src/models.json +73853 -0
  192. package/src/models.json.d.ts +9 -0
  193. package/src/models.ts +56 -0
  194. package/src/prompts/turn-aborted-guidance.md +4 -0
  195. package/src/provider-details.ts +90 -0
  196. package/src/provider-models/bundled-references.ts +38 -0
  197. package/src/provider-models/descriptors.ts +308 -0
  198. package/src/provider-models/google.ts +91 -0
  199. package/src/provider-models/index.ts +5 -0
  200. package/src/provider-models/ollama.ts +153 -0
  201. package/src/provider-models/openai-compat.ts +2275 -0
  202. package/src/provider-models/special.ts +67 -0
  203. package/src/providers/amazon-bedrock.ts +849 -0
  204. package/src/providers/anthropic-messages-server-schema.ts +229 -0
  205. package/src/providers/anthropic-messages-server.ts +677 -0
  206. package/src/providers/anthropic.ts +2696 -0
  207. package/src/providers/aws-credentials.ts +501 -0
  208. package/src/providers/aws-eventstream.ts +185 -0
  209. package/src/providers/aws-sigv4.ts +218 -0
  210. package/src/providers/azure-openai-responses.ts +337 -0
  211. package/src/providers/cursor/gen/agent_pb.ts +15274 -0
  212. package/src/providers/cursor/proto/agent.proto +3526 -0
  213. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  214. package/src/providers/cursor/proto/buf.yaml +17 -0
  215. package/src/providers/cursor.ts +2561 -0
  216. package/src/providers/error-message.ts +21 -0
  217. package/src/providers/github-copilot-headers.ts +140 -0
  218. package/src/providers/gitlab-duo.ts +372 -0
  219. package/src/providers/google-auth.ts +252 -0
  220. package/src/providers/google-gemini-cli.ts +795 -0
  221. package/src/providers/google-gemini-headers.ts +41 -0
  222. package/src/providers/google-shared.ts +902 -0
  223. package/src/providers/google-types.ts +167 -0
  224. package/src/providers/google-vertex.ts +88 -0
  225. package/src/providers/google.ts +41 -0
  226. package/src/providers/grammar.ts +70 -0
  227. package/src/providers/kimi.ts +52 -0
  228. package/src/providers/mock.ts +500 -0
  229. package/src/providers/ollama.ts +544 -0
  230. package/src/providers/openai-anthropic-shim.ts +138 -0
  231. package/src/providers/openai-chat-server-schema.ts +243 -0
  232. package/src/providers/openai-chat-server.ts +628 -0
  233. package/src/providers/openai-codex/constants.ts +43 -0
  234. package/src/providers/openai-codex/request-transformer.ts +161 -0
  235. package/src/providers/openai-codex/response-handler.ts +81 -0
  236. package/src/providers/openai-codex-responses.ts +2598 -0
  237. package/src/providers/openai-completions-compat.ts +279 -0
  238. package/src/providers/openai-completions.ts +1853 -0
  239. package/src/providers/openai-responses-server-schema.ts +290 -0
  240. package/src/providers/openai-responses-server.ts +1183 -0
  241. package/src/providers/openai-responses-shared.ts +800 -0
  242. package/src/providers/openai-responses.ts +621 -0
  243. package/src/providers/pi-native-client.ts +228 -0
  244. package/src/providers/pi-native-server.ts +210 -0
  245. package/src/providers/register-builtins.ts +412 -0
  246. package/src/providers/synthetic.ts +50 -0
  247. package/src/providers/transform-messages.ts +309 -0
  248. package/src/providers/vision-guard.ts +31 -0
  249. package/src/rate-limit-utils.ts +84 -0
  250. package/src/stream.ts +895 -0
  251. package/src/types.ts +884 -0
  252. package/src/usage/claude.ts +431 -0
  253. package/src/usage/gemini.ts +250 -0
  254. package/src/usage/github-copilot.ts +421 -0
  255. package/src/usage/google-antigravity.ts +201 -0
  256. package/src/usage/kimi.ts +271 -0
  257. package/src/usage/minimax-code.ts +31 -0
  258. package/src/usage/openai-codex.ts +503 -0
  259. package/src/usage/shared.ts +10 -0
  260. package/src/usage/zai.ts +247 -0
  261. package/src/usage.ts +183 -0
  262. package/src/utils/abort.ts +51 -0
  263. package/src/utils/anthropic-auth.ts +87 -0
  264. package/src/utils/discovery/antigravity.ts +261 -0
  265. package/src/utils/discovery/codex.ts +371 -0
  266. package/src/utils/discovery/cursor.ts +306 -0
  267. package/src/utils/discovery/gemini.ts +248 -0
  268. package/src/utils/discovery/index.ts +4 -0
  269. package/src/utils/discovery/openai-compatible.ts +224 -0
  270. package/src/utils/event-stream.ts +142 -0
  271. package/src/utils/fireworks-model-id.ts +30 -0
  272. package/src/utils/foundry.ts +8 -0
  273. package/src/utils/h2-fetch.ts +60 -0
  274. package/src/utils/http-inspector.ts +176 -0
  275. package/src/utils/idle-iterator.ts +250 -0
  276. package/src/utils/json-parse.ts +148 -0
  277. package/src/utils/oauth/alibaba-coding-plan.ts +59 -0
  278. package/src/utils/oauth/anthropic.ts +200 -0
  279. package/src/utils/oauth/api-key-login.ts +87 -0
  280. package/src/utils/oauth/api-key-validation.ts +92 -0
  281. package/src/utils/oauth/callback-server.ts +276 -0
  282. package/src/utils/oauth/cerebras.ts +16 -0
  283. package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
  284. package/src/utils/oauth/cursor.ts +157 -0
  285. package/src/utils/oauth/deepseek.ts +53 -0
  286. package/src/utils/oauth/firepass.ts +24 -0
  287. package/src/utils/oauth/fireworks.ts +15 -0
  288. package/src/utils/oauth/github-copilot.ts +362 -0
  289. package/src/utils/oauth/gitlab-duo.ts +123 -0
  290. package/src/utils/oauth/google-antigravity.ts +200 -0
  291. package/src/utils/oauth/google-gemini-cli.ts +256 -0
  292. package/src/utils/oauth/google-oauth-shared.ts +110 -0
  293. package/src/utils/oauth/huggingface.ts +62 -0
  294. package/src/utils/oauth/index.ts +444 -0
  295. package/src/utils/oauth/kagi.ts +47 -0
  296. package/src/utils/oauth/kilo.ts +87 -0
  297. package/src/utils/oauth/kimi.ts +254 -0
  298. package/src/utils/oauth/litellm.ts +47 -0
  299. package/src/utils/oauth/lm-studio.ts +38 -0
  300. package/src/utils/oauth/minimax-code.ts +78 -0
  301. package/src/utils/oauth/moonshot.ts +16 -0
  302. package/src/utils/oauth/nanogpt.ts +15 -0
  303. package/src/utils/oauth/nvidia.ts +70 -0
  304. package/src/utils/oauth/oauth.html +199 -0
  305. package/src/utils/oauth/ollama-cloud.ts +28 -0
  306. package/src/utils/oauth/ollama.ts +47 -0
  307. package/src/utils/oauth/openai-codex.ts +299 -0
  308. package/src/utils/oauth/opencode.ts +49 -0
  309. package/src/utils/oauth/parallel.ts +46 -0
  310. package/src/utils/oauth/perplexity.ts +206 -0
  311. package/src/utils/oauth/pkce.ts +18 -0
  312. package/src/utils/oauth/qianfan.ts +58 -0
  313. package/src/utils/oauth/qwen-portal.ts +60 -0
  314. package/src/utils/oauth/synthetic.ts +16 -0
  315. package/src/utils/oauth/tavily.ts +46 -0
  316. package/src/utils/oauth/together.ts +16 -0
  317. package/src/utils/oauth/types.ts +94 -0
  318. package/src/utils/oauth/venice.ts +59 -0
  319. package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
  320. package/src/utils/oauth/vllm.ts +40 -0
  321. package/src/utils/oauth/xiaomi.ts +137 -0
  322. package/src/utils/oauth/zai.ts +60 -0
  323. package/src/utils/oauth/zenmux.ts +15 -0
  324. package/src/utils/overflow.ts +137 -0
  325. package/src/utils/parse-bind.ts +54 -0
  326. package/src/utils/provider-response.ts +30 -0
  327. package/src/utils/retry-after.ts +110 -0
  328. package/src/utils/retry.ts +54 -0
  329. package/src/utils/schema/CONSTRAINTS.md +164 -0
  330. package/src/utils/schema/adapt.ts +36 -0
  331. package/src/utils/schema/compatibility.ts +435 -0
  332. package/src/utils/schema/dereference.ts +98 -0
  333. package/src/utils/schema/draft.ts +341 -0
  334. package/src/utils/schema/equality.ts +97 -0
  335. package/src/utils/schema/fields.ts +190 -0
  336. package/src/utils/schema/index.ts +13 -0
  337. package/src/utils/schema/json-schema-validator.ts +577 -0
  338. package/src/utils/schema/meta-validator.ts +167 -0
  339. package/src/utils/schema/normalize.ts +1588 -0
  340. package/src/utils/schema/spill.ts +43 -0
  341. package/src/utils/schema/stamps.ts +97 -0
  342. package/src/utils/schema/types.ts +11 -0
  343. package/src/utils/schema/wire.ts +213 -0
  344. package/src/utils/schema/zod-decontaminate.ts +331 -0
  345. package/src/utils/sse-debug.ts +289 -0
  346. package/src/utils/tool-call-healing.ts +271 -0
  347. package/src/utils/tool-choice.ts +99 -0
  348. package/src/utils/validation.ts +1019 -0
  349. package/src/utils.ts +166 -0
@@ -0,0 +1,412 @@
1
+ /**
2
+ * Lazy provider module loading.
3
+ *
4
+ * Each provider module is loaded only when its stream function is first called.
5
+ * This avoids eagerly importing heavy SDK dependencies (e.g., @anthropic-ai/sdk,
6
+ * openai) at startup. The loaded module promise is cached so subsequent calls
7
+ * reuse the same import.
8
+ *
9
+ * NOTE: stream.ts currently imports providers directly, so this file is not yet
10
+ * wired into the main streaming path. It provides the infrastructure for lazy
11
+ * loading that can be integrated when stream.ts is refactored.
12
+ */
13
+ import type {
14
+ Api,
15
+ AssistantMessage,
16
+ AssistantMessageEvent,
17
+ AssistantMessageEventStream,
18
+ Context,
19
+ Model,
20
+ OptionsForApi,
21
+ } from "../types";
22
+ import { type AbortSourceTracker, createAbortSourceTracker } from "../utils/abort";
23
+ import { AssistantMessageEventStream as EventStreamImpl } from "../utils/event-stream";
24
+ import { getStreamFirstEventTimeoutMs, getStreamIdleTimeoutMs, iterateWithIdleTimeout } from "../utils/idle-iterator";
25
+ import type { BedrockOptions } from "./amazon-bedrock";
26
+ import type { AnthropicOptions } from "./anthropic";
27
+ import type { AzureOpenAIResponsesOptions } from "./azure-openai-responses";
28
+ import type { CursorOptions } from "./cursor";
29
+ import type { GoogleOptions } from "./google";
30
+ import type { GoogleGeminiCliOptions } from "./google-gemini-cli";
31
+ import type { GoogleVertexOptions } from "./google-vertex";
32
+ import type { OllamaChatOptions } from "./ollama";
33
+ import type { OpenAICodexResponsesOptions } from "./openai-codex-responses";
34
+ import type { OpenAICompletionsOptions } from "./openai-completions";
35
+ import type { OpenAIResponsesOptions } from "./openai-responses";
36
+
37
+ // ---------------------------------------------------------------------------
38
+ // Lazy provider module shape
39
+ // ---------------------------------------------------------------------------
40
+
41
+ interface LazyProviderModule<TApi extends Api> {
42
+ stream: (model: Model<TApi>, context: Context, options: OptionsForApi<TApi>) => AsyncIterable<AssistantMessageEvent>;
43
+ }
44
+
45
+ interface AnthropicProviderModule {
46
+ streamAnthropic: (
47
+ model: Model<"anthropic-messages">,
48
+ context: Context,
49
+ options: AnthropicOptions,
50
+ ) => AssistantMessageEventStream;
51
+ }
52
+
53
+ interface AzureOpenAIResponsesProviderModule {
54
+ streamAzureOpenAIResponses: (
55
+ model: Model<"azure-openai-responses">,
56
+ context: Context,
57
+ options: AzureOpenAIResponsesOptions,
58
+ ) => AssistantMessageEventStream;
59
+ }
60
+
61
+ interface GoogleProviderModule {
62
+ streamGoogle: (
63
+ model: Model<"google-generative-ai">,
64
+ context: Context,
65
+ options: GoogleOptions,
66
+ ) => AssistantMessageEventStream;
67
+ }
68
+
69
+ interface GoogleGeminiCliProviderModule {
70
+ streamGoogleGeminiCli: (
71
+ model: Model<"google-gemini-cli">,
72
+ context: Context,
73
+ options: GoogleGeminiCliOptions,
74
+ ) => AssistantMessageEventStream;
75
+ }
76
+
77
+ interface GoogleVertexProviderModule {
78
+ streamGoogleVertex: (
79
+ model: Model<"google-vertex">,
80
+ context: Context,
81
+ options: GoogleVertexOptions,
82
+ ) => AssistantMessageEventStream;
83
+ }
84
+
85
+ interface OpenAICodexResponsesProviderModule {
86
+ streamOpenAICodexResponses: (
87
+ model: Model<"openai-codex-responses">,
88
+ context: Context,
89
+ options: OpenAICodexResponsesOptions,
90
+ ) => AssistantMessageEventStream;
91
+ }
92
+
93
+ interface OpenAICompletionsProviderModule {
94
+ streamOpenAICompletions: (
95
+ model: Model<"openai-completions">,
96
+ context: Context,
97
+ options: OpenAICompletionsOptions,
98
+ ) => AssistantMessageEventStream;
99
+ }
100
+
101
+ interface OpenAIResponsesProviderModule {
102
+ streamOpenAIResponses: (
103
+ model: Model<"openai-responses">,
104
+ context: Context,
105
+ options: OpenAIResponsesOptions,
106
+ ) => AssistantMessageEventStream;
107
+ }
108
+
109
+ interface OllamaProviderModule {
110
+ streamOllama: (
111
+ model: Model<"ollama-chat">,
112
+ context: Context,
113
+ options: OllamaChatOptions,
114
+ ) => AssistantMessageEventStream;
115
+ }
116
+
117
+ interface CursorProviderModule {
118
+ streamCursor: (
119
+ model: Model<"cursor-agent">,
120
+ context: Context,
121
+ options: CursorOptions,
122
+ ) => AssistantMessageEventStream;
123
+ }
124
+
125
+ interface BedrockProviderModule {
126
+ streamBedrock: (
127
+ model: Model<"bedrock-converse-stream">,
128
+ context: Context,
129
+ options: BedrockOptions,
130
+ ) => AssistantMessageEventStream;
131
+ }
132
+
133
+ // ---------------------------------------------------------------------------
134
+ // Module-level lazy promise caches
135
+ // ---------------------------------------------------------------------------
136
+
137
+ let anthropicProviderModulePromise: Promise<LazyProviderModule<"anthropic-messages">> | undefined;
138
+ let azureOpenAIResponsesProviderModulePromise: Promise<LazyProviderModule<"azure-openai-responses">> | undefined;
139
+ let googleProviderModulePromise: Promise<LazyProviderModule<"google-generative-ai">> | undefined;
140
+ let googleGeminiCliProviderModulePromise: Promise<LazyProviderModule<"google-gemini-cli">> | undefined;
141
+ let googleVertexProviderModulePromise: Promise<LazyProviderModule<"google-vertex">> | undefined;
142
+ let openAICodexResponsesProviderModulePromise: Promise<LazyProviderModule<"openai-codex-responses">> | undefined;
143
+ let openAICompletionsProviderModulePromise: Promise<LazyProviderModule<"openai-completions">> | undefined;
144
+ let openAIResponsesProviderModulePromise: Promise<LazyProviderModule<"openai-responses">> | undefined;
145
+ let ollamaProviderModulePromise: Promise<LazyProviderModule<"ollama-chat">> | undefined;
146
+ let cursorProviderModulePromise: Promise<LazyProviderModule<"cursor-agent">> | undefined;
147
+ let bedrockProviderModuleOverride: LazyProviderModule<"bedrock-converse-stream"> | undefined;
148
+ let bedrockProviderModulePromise: Promise<LazyProviderModule<"bedrock-converse-stream">> | undefined;
149
+
150
+ export function setBedrockProviderModule(module: BedrockProviderModule): void {
151
+ bedrockProviderModuleOverride = {
152
+ stream: module.streamBedrock,
153
+ };
154
+ }
155
+
156
+ // ---------------------------------------------------------------------------
157
+ // Stream forwarding / error helpers
158
+ // ---------------------------------------------------------------------------
159
+
160
+ const LAZY_STREAM_IDLE_TIMEOUT_ERROR = "Provider stream stalled while waiting for the next event";
161
+ const LAZY_STREAM_FIRST_EVENT_TIMEOUT_ERROR = "Provider stream timed out while waiting for the first event";
162
+
163
+ function hasFinalResult(
164
+ source: AsyncIterable<AssistantMessageEvent>,
165
+ ): source is AsyncIterable<AssistantMessageEvent> & { result(): Promise<AssistantMessage> } {
166
+ return typeof (source as { result?: unknown }).result === "function";
167
+ }
168
+
169
+ /**
170
+ * Per-provider default overrides for the lazy stream watchdogs. These widen the
171
+ * floor used when neither caller option nor env var pins a value. The env vars
172
+ * (`PI_STREAM_FIRST_EVENT_TIMEOUT_MS`, `PI_STREAM_IDLE_TIMEOUT_MS`) still take
173
+ * precedence; `StreamOptions.streamFirstEventTimeoutMs` / `streamIdleTimeoutMs`
174
+ * still trump everything.
175
+ */
176
+ interface LazyStreamLimits {
177
+ defaultFirstEventTimeoutMs?: number;
178
+ defaultIdleTimeoutMs?: number;
179
+ }
180
+
181
+ /**
182
+ * Cloud Code Assist (google-gemini-cli / google-antigravity) routinely takes
183
+ * longer than the global 100s default to emit its first SSE event when serving
184
+ * the heavier Gemini 3.x Pro tiers at high thinking levels. Bump the first-event
185
+ * floor to five minutes so duke et al. stop seeing spurious "stream timed out
186
+ * while waiting for the first event" aborts on legitimate cold reasoning starts.
187
+ * The steady-state idle watchdog stays on the global default since the upstream
188
+ * emits thinking tokens frequently once it gets going.
189
+ */
190
+ const GOOGLE_GEMINI_CLI_LAZY_STREAM_LIMITS: LazyStreamLimits = {
191
+ defaultFirstEventTimeoutMs: 300_000,
192
+ };
193
+
194
+ function forwardStream<TApi extends Api>(
195
+ target: EventStreamImpl,
196
+ source: AsyncIterable<AssistantMessageEvent>,
197
+ model: Model<TApi>,
198
+ options: OptionsForApi<TApi>,
199
+ abortTracker: AbortSourceTracker,
200
+ limits?: LazyStreamLimits,
201
+ ): void {
202
+ (async () => {
203
+ try {
204
+ const idleTimeoutMs = options.streamIdleTimeoutMs ?? getStreamIdleTimeoutMs(limits?.defaultIdleTimeoutMs);
205
+ const watchedSource = iterateWithIdleTimeout(source, {
206
+ idleTimeoutMs,
207
+ firstItemTimeoutMs:
208
+ options.streamFirstEventTimeoutMs ??
209
+ getStreamFirstEventTimeoutMs(idleTimeoutMs, limits?.defaultFirstEventTimeoutMs),
210
+ errorMessage: LAZY_STREAM_IDLE_TIMEOUT_ERROR,
211
+ firstItemErrorMessage: LAZY_STREAM_FIRST_EVENT_TIMEOUT_ERROR,
212
+ onIdle: () => abortTracker.abortLocally(new Error(LAZY_STREAM_IDLE_TIMEOUT_ERROR)),
213
+ onFirstItemTimeout: () => abortTracker.abortLocally(new Error(LAZY_STREAM_FIRST_EVENT_TIMEOUT_ERROR)),
214
+ abortSignal: options.signal,
215
+ // The synthetic `start` event is yielded immediately by every provider before
216
+ // the upstream model has emitted any tokens. Treating it as the first "real"
217
+ // item would flip the watchdog from `firstItemTimeoutMs` to the much shorter
218
+ // `idleTimeoutMs` while we're still legitimately waiting on the model's
219
+ // first response (slow first-token from reasoning models, cold proxies, etc.).
220
+ isProgressItem: event => (event as AssistantMessageEvent).type !== "start",
221
+ });
222
+
223
+ for await (const event of watchedSource) {
224
+ target.push(event);
225
+ }
226
+ if (hasFinalResult(source)) {
227
+ target.end(await source.result());
228
+ } else {
229
+ target.end();
230
+ }
231
+ } catch (error) {
232
+ const stopReason = abortTracker.wasCallerAbort() ? "aborted" : "error";
233
+ const message = createLazyLoadErrorMessage(model, error, stopReason);
234
+ target.push({ type: "error", reason: stopReason, error: message });
235
+ target.end(message);
236
+ }
237
+ })();
238
+ }
239
+
240
+ function createLazyLoadErrorMessage<TApi extends Api>(
241
+ model: Model<TApi>,
242
+ error: unknown,
243
+ stopReason: Extract<AssistantMessage["stopReason"], "aborted" | "error"> = "error",
244
+ ): AssistantMessage {
245
+ return {
246
+ role: "assistant",
247
+ content: [],
248
+ api: model.api,
249
+ provider: model.provider,
250
+ model: model.id,
251
+ usage: {
252
+ input: 0,
253
+ output: 0,
254
+ cacheRead: 0,
255
+ cacheWrite: 0,
256
+ totalTokens: 0,
257
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
258
+ },
259
+ stopReason,
260
+ errorMessage:
261
+ stopReason === "aborted" ? "Request was aborted" : error instanceof Error ? error.message : String(error),
262
+ timestamp: Date.now(),
263
+ };
264
+ }
265
+
266
+ // ---------------------------------------------------------------------------
267
+ // Generic lazy stream factory
268
+ // ---------------------------------------------------------------------------
269
+
270
+ function createLazyStream<TApi extends Api>(
271
+ loadModule: () => Promise<LazyProviderModule<TApi>>,
272
+ limits?: LazyStreamLimits,
273
+ ): (model: Model<TApi>, context: Context, options: OptionsForApi<TApi>) => EventStreamImpl {
274
+ return (model, context, options) => {
275
+ const outer = new EventStreamImpl();
276
+ const streamOptions = (options ?? {}) as OptionsForApi<TApi>;
277
+
278
+ loadModule()
279
+ .then(module => {
280
+ const abortTracker = createAbortSourceTracker(streamOptions.signal);
281
+ const providerOptions = { ...streamOptions, signal: abortTracker.requestSignal } as OptionsForApi<TApi>;
282
+ const inner = module.stream(model, context, providerOptions);
283
+ forwardStream(outer, inner, model, streamOptions, abortTracker, limits);
284
+ })
285
+ .catch(error => {
286
+ const message = createLazyLoadErrorMessage(model, error);
287
+ outer.push({ type: "error", reason: "error", error: message });
288
+ outer.end(message);
289
+ });
290
+
291
+ return outer;
292
+ };
293
+ }
294
+
295
+ // ---------------------------------------------------------------------------
296
+ // Module loaders (one per provider, cached via ||=)
297
+ // ---------------------------------------------------------------------------
298
+
299
+ function loadAnthropicProviderModule(): Promise<LazyProviderModule<"anthropic-messages">> {
300
+ anthropicProviderModulePromise ||= import("./anthropic").then(module => {
301
+ const provider = module as AnthropicProviderModule;
302
+ return { stream: provider.streamAnthropic };
303
+ });
304
+ return anthropicProviderModulePromise;
305
+ }
306
+
307
+ function loadAzureOpenAIResponsesProviderModule(): Promise<LazyProviderModule<"azure-openai-responses">> {
308
+ azureOpenAIResponsesProviderModulePromise ||= import("./azure-openai-responses").then(module => {
309
+ const provider = module as AzureOpenAIResponsesProviderModule;
310
+ return { stream: provider.streamAzureOpenAIResponses };
311
+ });
312
+ return azureOpenAIResponsesProviderModulePromise;
313
+ }
314
+
315
+ function loadGoogleProviderModule(): Promise<LazyProviderModule<"google-generative-ai">> {
316
+ googleProviderModulePromise ||= import("./google").then(module => {
317
+ const provider = module as GoogleProviderModule;
318
+ return { stream: provider.streamGoogle };
319
+ });
320
+ return googleProviderModulePromise;
321
+ }
322
+
323
+ function loadGoogleGeminiCliProviderModule(): Promise<LazyProviderModule<"google-gemini-cli">> {
324
+ googleGeminiCliProviderModulePromise ||= import("./google-gemini-cli").then(module => {
325
+ const provider = module as GoogleGeminiCliProviderModule;
326
+ return { stream: provider.streamGoogleGeminiCli };
327
+ });
328
+ return googleGeminiCliProviderModulePromise;
329
+ }
330
+
331
+ function loadGoogleVertexProviderModule(): Promise<LazyProviderModule<"google-vertex">> {
332
+ googleVertexProviderModulePromise ||= import("./google-vertex").then(module => {
333
+ const provider = module as GoogleVertexProviderModule;
334
+ return { stream: provider.streamGoogleVertex };
335
+ });
336
+ return googleVertexProviderModulePromise;
337
+ }
338
+
339
+ function loadOpenAICodexResponsesProviderModule(): Promise<LazyProviderModule<"openai-codex-responses">> {
340
+ openAICodexResponsesProviderModulePromise ||= import("./openai-codex-responses").then(module => {
341
+ const provider = module as OpenAICodexResponsesProviderModule;
342
+ return { stream: provider.streamOpenAICodexResponses };
343
+ });
344
+ return openAICodexResponsesProviderModulePromise;
345
+ }
346
+
347
+ function loadOpenAICompletionsProviderModule(): Promise<LazyProviderModule<"openai-completions">> {
348
+ openAICompletionsProviderModulePromise ||= import("./openai-completions").then(module => {
349
+ const provider = module as OpenAICompletionsProviderModule;
350
+ return { stream: provider.streamOpenAICompletions };
351
+ });
352
+ return openAICompletionsProviderModulePromise;
353
+ }
354
+
355
+ function loadOpenAIResponsesProviderModule(): Promise<LazyProviderModule<"openai-responses">> {
356
+ openAIResponsesProviderModulePromise ||= import("./openai-responses").then(module => {
357
+ const provider = module as OpenAIResponsesProviderModule;
358
+ return { stream: provider.streamOpenAIResponses };
359
+ });
360
+ return openAIResponsesProviderModulePromise;
361
+ }
362
+
363
+ function loadOllamaProviderModule(): Promise<LazyProviderModule<"ollama-chat">> {
364
+ ollamaProviderModulePromise ||= import("./ollama").then(module => {
365
+ const provider = module as OllamaProviderModule;
366
+ return { stream: provider.streamOllama };
367
+ });
368
+ return ollamaProviderModulePromise;
369
+ }
370
+
371
+ function loadCursorProviderModule(): Promise<LazyProviderModule<"cursor-agent">> {
372
+ cursorProviderModulePromise ||= import("./cursor").then(module => {
373
+ const provider = module as CursorProviderModule;
374
+ return { stream: provider.streamCursor };
375
+ });
376
+ return cursorProviderModulePromise;
377
+ }
378
+
379
+ function loadBedrockProviderModule(): Promise<LazyProviderModule<"bedrock-converse-stream">> {
380
+ if (bedrockProviderModuleOverride) {
381
+ return Promise.resolve(bedrockProviderModuleOverride);
382
+ }
383
+ bedrockProviderModulePromise ||= import("./amazon-bedrock").then(module => {
384
+ const provider = module as BedrockProviderModule;
385
+ return { stream: provider.streamBedrock };
386
+ });
387
+ return bedrockProviderModulePromise;
388
+ }
389
+
390
+ // ---------------------------------------------------------------------------
391
+ // Lazy stream function exports
392
+ //
393
+ // These use the same names as the direct provider stream functions. When
394
+ // stream.ts is updated to import from this module instead of individual
395
+ // providers, the lazy loading will take effect on the main code path.
396
+ // ---------------------------------------------------------------------------
397
+
398
+ export const streamAnthropic = createLazyStream(loadAnthropicProviderModule);
399
+ export const streamAzureOpenAIResponses = createLazyStream(loadAzureOpenAIResponsesProviderModule);
400
+ export const streamGoogle = createLazyStream(loadGoogleProviderModule);
401
+ export const streamGoogleGeminiCli = createLazyStream(
402
+ loadGoogleGeminiCliProviderModule,
403
+ GOOGLE_GEMINI_CLI_LAZY_STREAM_LIMITS,
404
+ );
405
+ export const streamGoogleVertex = createLazyStream(loadGoogleVertexProviderModule);
406
+ export const streamOpenAICodexResponses = createLazyStream(loadOpenAICodexResponsesProviderModule);
407
+ export const streamOpenAICompletions = createLazyStream(loadOpenAICompletionsProviderModule);
408
+ export const streamOpenAIResponses = createLazyStream(loadOpenAIResponsesProviderModule);
409
+ export const streamCursor = createLazyStream(loadCursorProviderModule);
410
+ export const streamOllama = createLazyStream(loadOllamaProviderModule);
411
+
412
+ export const streamBedrock = createLazyStream(loadBedrockProviderModule);
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Synthetic provider - wraps OpenAI or Anthropic API based on format setting.
3
+ *
4
+ * Synthetic offers both OpenAI-compatible and Anthropic-compatible APIs:
5
+ * - OpenAI: https://api.synthetic.new/openai/v1/chat/completions
6
+ * - Anthropic: https://api.synthetic.new/anthropic/v1/messages
7
+ *
8
+ * @see https://dev.synthetic.new/docs/api/overview
9
+ */
10
+
11
+ import type { Api, Context, Model } from "../types";
12
+ import type { AssistantMessageEventStream } from "../utils/event-stream";
13
+ import {
14
+ type OpenAIAnthropicApiFormat,
15
+ type OpenAIAnthropicShimOptions,
16
+ streamOpenAIAnthropicShim,
17
+ } from "./openai-anthropic-shim";
18
+
19
+ export type SyntheticApiFormat = OpenAIAnthropicApiFormat;
20
+
21
+ const SYNTHETIC_NEW_BASE_URL = "https://api.synthetic.new/openai/v1";
22
+ const SYNTHETIC_NEW_ANTHROPIC_BASE_URL = "https://api.synthetic.new/anthropic";
23
+
24
+ export interface SyntheticOptions extends OpenAIAnthropicShimOptions {
25
+ /** API format: "openai" or "anthropic". Default: "openai" */
26
+ format?: SyntheticApiFormat;
27
+ }
28
+
29
+ /**
30
+ * Stream from Synthetic, routing to either OpenAI or Anthropic API based on format.
31
+ * Returns synchronously like other providers - async processing happens internally.
32
+ */
33
+ export function streamSynthetic(
34
+ model: Model<"openai-completions">,
35
+ context: Context,
36
+ options?: SyntheticOptions,
37
+ ): AssistantMessageEventStream {
38
+ return streamOpenAIAnthropicShim(model, context, options, {
39
+ anthropicBaseUrl: SYNTHETIC_NEW_ANTHROPIC_BASE_URL,
40
+ openaiBaseUrl: SYNTHETIC_NEW_BASE_URL,
41
+ defaultFormat: "openai",
42
+ });
43
+ }
44
+
45
+ /**
46
+ * Check if a model is a Synthetic model.
47
+ */
48
+ export function isSyntheticModel(model: Model<Api>): boolean {
49
+ return model.provider === "synthetic";
50
+ }