veryfront 0.1.215 → 0.1.217

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 (305) hide show
  1. package/README.md +1 -1
  2. package/esm/cli/commands/extension/command-help.d.ts +3 -0
  3. package/esm/cli/commands/extension/command-help.d.ts.map +1 -0
  4. package/esm/cli/commands/extension/command-help.js +16 -0
  5. package/esm/cli/commands/extension/handler.d.ts +3 -0
  6. package/esm/cli/commands/extension/handler.d.ts.map +1 -0
  7. package/esm/cli/commands/extension/handler.js +36 -0
  8. package/esm/cli/commands/extension/init-command.d.ts +19 -0
  9. package/esm/cli/commands/extension/init-command.d.ts.map +1 -0
  10. package/esm/cli/commands/extension/init-command.js +122 -0
  11. package/esm/cli/commands/extension/validate-command.d.ts +13 -0
  12. package/esm/cli/commands/extension/validate-command.d.ts.map +1 -0
  13. package/esm/cli/commands/extension/validate-command.js +62 -0
  14. package/esm/cli/commands/generate/integration-generator-helpers.d.ts +35 -0
  15. package/esm/cli/commands/generate/integration-generator-helpers.d.ts.map +1 -0
  16. package/esm/cli/commands/generate/integration-generator-helpers.js +123 -0
  17. package/esm/cli/commands/generate/integration-generator.d.ts +1 -2
  18. package/esm/cli/commands/generate/integration-generator.d.ts.map +1 -1
  19. package/esm/cli/commands/generate/integration-generator.js +1 -123
  20. package/esm/cli/commands/knowledge/command-helpers.d.ts +48 -0
  21. package/esm/cli/commands/knowledge/command-helpers.d.ts.map +1 -0
  22. package/esm/cli/commands/knowledge/command-helpers.js +216 -0
  23. package/esm/cli/commands/knowledge/command.d.ts +12 -17
  24. package/esm/cli/commands/knowledge/command.d.ts.map +1 -1
  25. package/esm/cli/commands/knowledge/command.js +26 -214
  26. package/esm/cli/help/command-definitions.d.ts.map +1 -1
  27. package/esm/cli/help/command-definitions.js +2 -0
  28. package/esm/cli/mcp/remote-file-tool-helpers.d.ts +5 -0
  29. package/esm/cli/mcp/remote-file-tool-helpers.d.ts.map +1 -0
  30. package/esm/cli/mcp/remote-file-tool-helpers.js +22 -0
  31. package/esm/cli/mcp/remote-file-tools.d.ts.map +1 -1
  32. package/esm/cli/mcp/remote-file-tools.js +1 -22
  33. package/esm/cli/router.d.ts.map +1 -1
  34. package/esm/cli/router.js +2 -0
  35. package/esm/cli/templates/integration-loader-helpers.d.ts +8 -0
  36. package/esm/cli/templates/integration-loader-helpers.d.ts.map +1 -0
  37. package/esm/cli/templates/integration-loader-helpers.js +29 -0
  38. package/esm/cli/templates/integration-loader.d.ts.map +1 -1
  39. package/esm/cli/templates/integration-loader.js +5 -21
  40. package/esm/cli/templates/manifest.d.ts +1 -0
  41. package/esm/cli/templates/manifest.js +2 -1
  42. package/esm/deno.d.ts +3 -0
  43. package/esm/deno.js +5 -2
  44. package/esm/src/agent/runtime/index.d.ts.map +1 -1
  45. package/esm/src/agent/runtime/index.js +48 -90
  46. package/esm/src/chat/ag-ui-helpers.d.ts +17 -0
  47. package/esm/src/chat/ag-ui-helpers.d.ts.map +1 -0
  48. package/esm/src/chat/ag-ui-helpers.js +111 -0
  49. package/esm/src/chat/ag-ui.d.ts.map +1 -1
  50. package/esm/src/chat/ag-ui.js +1 -111
  51. package/esm/src/config/schemas/config.schema.d.ts +1 -0
  52. package/esm/src/config/schemas/config.schema.d.ts.map +1 -1
  53. package/esm/src/config/schemas/config.schema.js +11 -0
  54. package/esm/src/config/schemas/index.d.ts +11 -1
  55. package/esm/src/config/schemas/index.d.ts.map +1 -1
  56. package/esm/src/errors/error-registry-helpers.d.ts +6 -0
  57. package/esm/src/errors/error-registry-helpers.d.ts.map +1 -0
  58. package/esm/src/errors/error-registry-helpers.js +9 -0
  59. package/esm/src/errors/error-registry.d.ts.map +1 -1
  60. package/esm/src/errors/error-registry.js +4 -3
  61. package/esm/src/extensions/capabilities.d.ts +20 -0
  62. package/esm/src/extensions/capabilities.d.ts.map +1 -0
  63. package/esm/src/extensions/capabilities.js +77 -0
  64. package/esm/src/extensions/contracts.d.ts +10 -0
  65. package/esm/src/extensions/contracts.d.ts.map +1 -0
  66. package/esm/src/extensions/contracts.js +28 -0
  67. package/esm/src/extensions/discovery.d.ts +48 -0
  68. package/esm/src/extensions/discovery.d.ts.map +1 -0
  69. package/esm/src/extensions/discovery.js +179 -0
  70. package/esm/src/extensions/errors.d.ts +10 -0
  71. package/esm/src/extensions/errors.d.ts.map +1 -0
  72. package/esm/src/extensions/errors.js +34 -0
  73. package/esm/src/extensions/factory-loader.d.ts +29 -0
  74. package/esm/src/extensions/factory-loader.d.ts.map +1 -0
  75. package/esm/src/extensions/factory-loader.js +63 -0
  76. package/esm/src/extensions/index.d.ts +37 -0
  77. package/esm/src/extensions/index.d.ts.map +1 -0
  78. package/esm/src/extensions/index.js +41 -0
  79. package/esm/src/extensions/interfaces/ai-model-provider.d.ts +94 -0
  80. package/esm/src/extensions/interfaces/ai-model-provider.d.ts.map +1 -0
  81. package/esm/src/extensions/interfaces/ai-model-provider.js +8 -0
  82. package/esm/src/extensions/interfaces/auth-provider.d.ts +49 -0
  83. package/esm/src/extensions/interfaces/auth-provider.d.ts.map +1 -0
  84. package/esm/src/extensions/interfaces/auth-provider.js +8 -0
  85. package/esm/src/extensions/interfaces/bundler.d.ts +118 -0
  86. package/esm/src/extensions/interfaces/bundler.d.ts.map +1 -0
  87. package/esm/src/extensions/interfaces/bundler.js +8 -0
  88. package/esm/src/extensions/interfaces/cache-store.d.ts +27 -0
  89. package/esm/src/extensions/interfaces/cache-store.d.ts.map +1 -0
  90. package/esm/src/extensions/interfaces/cache-store.js +8 -0
  91. package/esm/src/extensions/interfaces/code-parser.d.ts +76 -0
  92. package/esm/src/extensions/interfaces/code-parser.d.ts.map +1 -0
  93. package/esm/src/extensions/interfaces/code-parser.js +8 -0
  94. package/esm/src/extensions/interfaces/content-transformer.d.ts +40 -0
  95. package/esm/src/extensions/interfaces/content-transformer.d.ts.map +1 -0
  96. package/esm/src/extensions/interfaces/content-transformer.js +8 -0
  97. package/esm/src/extensions/interfaces/css-processor.d.ts +38 -0
  98. package/esm/src/extensions/interfaces/css-processor.d.ts.map +1 -0
  99. package/esm/src/extensions/interfaces/css-processor.js +8 -0
  100. package/esm/src/extensions/interfaces/database-client.d.ts +31 -0
  101. package/esm/src/extensions/interfaces/database-client.d.ts.map +1 -0
  102. package/esm/src/extensions/interfaces/database-client.js +8 -0
  103. package/esm/src/extensions/interfaces/embedding-provider.d.ts +37 -0
  104. package/esm/src/extensions/interfaces/embedding-provider.d.ts.map +1 -0
  105. package/esm/src/extensions/interfaces/embedding-provider.js +8 -0
  106. package/esm/src/extensions/interfaces/index.d.ts +21 -0
  107. package/esm/src/extensions/interfaces/index.d.ts.map +1 -0
  108. package/esm/src/extensions/interfaces/index.js +9 -0
  109. package/esm/src/extensions/interfaces/node-compat.d.ts +25 -0
  110. package/esm/src/extensions/interfaces/node-compat.d.ts.map +1 -0
  111. package/esm/src/extensions/interfaces/node-compat.js +8 -0
  112. package/esm/src/extensions/interfaces/schema-validator.d.ts +46 -0
  113. package/esm/src/extensions/interfaces/schema-validator.d.ts.map +1 -0
  114. package/esm/src/extensions/interfaces/schema-validator.js +8 -0
  115. package/esm/src/extensions/interfaces/tracing-exporter.d.ts +44 -0
  116. package/esm/src/extensions/interfaces/tracing-exporter.d.ts.map +1 -0
  117. package/esm/src/extensions/interfaces/tracing-exporter.js +8 -0
  118. package/esm/src/extensions/loader.d.ts +33 -0
  119. package/esm/src/extensions/loader.d.ts.map +1 -0
  120. package/esm/src/extensions/loader.js +209 -0
  121. package/esm/src/extensions/orchestrate.d.ts +54 -0
  122. package/esm/src/extensions/orchestrate.d.ts.map +1 -0
  123. package/esm/src/extensions/orchestrate.js +116 -0
  124. package/esm/src/extensions/recommendations.d.ts +7 -0
  125. package/esm/src/extensions/recommendations.d.ts.map +1 -0
  126. package/esm/src/extensions/recommendations.js +22 -0
  127. package/esm/src/extensions/types.d.ts +47 -0
  128. package/esm/src/extensions/types.d.ts.map +1 -0
  129. package/esm/src/extensions/types.js +6 -0
  130. package/esm/src/extensions/validation.d.ts +44 -0
  131. package/esm/src/extensions/validation.d.ts.map +1 -0
  132. package/esm/src/extensions/validation.js +115 -0
  133. package/esm/src/html/styles-builder/plugin-loader.d.ts.map +1 -1
  134. package/esm/src/html/styles-builder/plugin-loader.js +23 -0
  135. package/esm/src/html/styles-builder/tailwind-plugin-allowlist.d.ts +29 -0
  136. package/esm/src/html/styles-builder/tailwind-plugin-allowlist.d.ts.map +1 -0
  137. package/esm/src/html/styles-builder/tailwind-plugin-allowlist.js +48 -0
  138. package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.d.ts +15 -0
  139. package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.d.ts.map +1 -0
  140. package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.js +22 -0
  141. package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts +0 -2
  142. package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts.map +1 -1
  143. package/esm/src/modules/react-loader/ssr-module-loader/loader.js +4 -24
  144. package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.d.ts +19 -0
  145. package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.d.ts.map +1 -0
  146. package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.js +26 -0
  147. package/esm/src/platform/adapters/fs/veryfront/adapter.d.ts.map +1 -1
  148. package/esm/src/platform/adapters/fs/veryfront/adapter.js +4 -20
  149. package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.d.ts +1 -0
  150. package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.d.ts.map +1 -1
  151. package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.js +3 -0
  152. package/esm/src/platform/adapters/fs/veryfront/read-operations.d.ts.map +1 -1
  153. package/esm/src/platform/adapters/fs/veryfront/read-operations.js +4 -7
  154. package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.d.ts +28 -0
  155. package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.d.ts.map +1 -0
  156. package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.js +41 -0
  157. package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts +1 -4
  158. package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts.map +1 -1
  159. package/esm/src/platform/adapters/fs/veryfront/websocket-manager.js +7 -40
  160. package/esm/src/platform/compat/process/command.d.ts +31 -0
  161. package/esm/src/platform/compat/process/command.d.ts.map +1 -0
  162. package/esm/src/platform/compat/process/command.js +193 -0
  163. package/esm/src/platform/compat/process/env.d.ts +31 -0
  164. package/esm/src/platform/compat/process/env.d.ts.map +1 -0
  165. package/esm/src/platform/compat/process/env.js +175 -0
  166. package/esm/src/platform/compat/process/lifecycle.d.ts +98 -0
  167. package/esm/src/platform/compat/process/lifecycle.d.ts.map +1 -0
  168. package/esm/src/platform/compat/process/lifecycle.js +305 -0
  169. package/esm/src/platform/compat/process/runtime-process.d.ts +10 -0
  170. package/esm/src/platform/compat/process/runtime-process.d.ts.map +1 -0
  171. package/esm/src/platform/compat/process/runtime-process.js +24 -0
  172. package/esm/src/platform/compat/process.d.ts +4 -165
  173. package/esm/src/platform/compat/process.d.ts.map +1 -1
  174. package/esm/src/platform/compat/process.js +4 -682
  175. package/esm/src/platform/index.d.ts +1 -1
  176. package/esm/src/platform/index.d.ts.map +1 -1
  177. package/esm/src/provider/runtime-loader/provider-endpoints.d.ts +8 -0
  178. package/esm/src/provider/runtime-loader/provider-endpoints.d.ts.map +1 -0
  179. package/esm/src/provider/runtime-loader/provider-endpoints.js +27 -0
  180. package/esm/src/provider/runtime-loader/provider-request-init.d.ts +32 -0
  181. package/esm/src/provider/runtime-loader/provider-request-init.d.ts.map +1 -0
  182. package/esm/src/provider/runtime-loader/provider-request-init.js +67 -0
  183. package/esm/src/provider/runtime-loader/tool-input-status.d.ts +17 -0
  184. package/esm/src/provider/runtime-loader/tool-input-status.d.ts.map +1 -0
  185. package/esm/src/provider/runtime-loader/tool-input-status.js +155 -0
  186. package/esm/src/provider/runtime-loader.d.ts +2 -3
  187. package/esm/src/provider/runtime-loader.d.ts.map +1 -1
  188. package/esm/src/provider/runtime-loader.js +92 -291
  189. package/esm/src/proxy/handler.d.ts.map +1 -1
  190. package/esm/src/proxy/handler.js +14 -0
  191. package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts +8 -0
  192. package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts.map +1 -0
  193. package/esm/src/rendering/orchestrator/pipeline-helpers.js +20 -0
  194. package/esm/src/rendering/orchestrator/pipeline.d.ts +0 -3
  195. package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
  196. package/esm/src/rendering/orchestrator/pipeline.js +4 -22
  197. package/esm/src/routing/api/module-loader/loader-helpers.d.ts +10 -0
  198. package/esm/src/routing/api/module-loader/loader-helpers.d.ts.map +1 -0
  199. package/esm/src/routing/api/module-loader/loader-helpers.js +62 -0
  200. package/esm/src/routing/api/module-loader/loader.d.ts +1 -1
  201. package/esm/src/routing/api/module-loader/loader.d.ts.map +1 -1
  202. package/esm/src/routing/api/module-loader/loader.js +2 -60
  203. package/esm/src/server/bootstrap.d.ts +22 -2
  204. package/esm/src/server/bootstrap.d.ts.map +1 -1
  205. package/esm/src/server/bootstrap.js +67 -5
  206. package/esm/src/server/dev-ui/manifest.d.ts +2 -0
  207. package/esm/src/server/dev-ui/manifest.js +3 -1
  208. package/esm/src/server/handlers/request/api/project-discovery.d.ts.map +1 -1
  209. package/esm/src/server/handlers/request/api/project-discovery.js +14 -8
  210. package/esm/src/server/production-server.js +1 -1
  211. package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.d.ts.map +1 -1
  212. package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.js +2 -2
  213. package/esm/src/server/utils/domain-parser.d.ts.map +1 -1
  214. package/esm/src/server/utils/domain-parser.js +4 -0
  215. package/esm/src/studio/bridge/bridge-bundle.generated.d.ts.map +1 -1
  216. package/esm/src/studio/bridge/bridge-bundle.generated.js +1 -1
  217. package/esm/src/tool/index.d.ts +1 -1
  218. package/esm/src/tool/index.d.ts.map +1 -1
  219. package/esm/src/tool/types.d.ts +20 -0
  220. package/esm/src/tool/types.d.ts.map +1 -1
  221. package/esm/src/utils/version-constant.d.ts +1 -1
  222. package/esm/src/utils/version-constant.js +1 -1
  223. package/package.json +7 -1
  224. package/src/cli/commands/extension/command-help.ts +18 -0
  225. package/src/cli/commands/extension/handler.ts +41 -0
  226. package/src/cli/commands/extension/init-command.ts +140 -0
  227. package/src/cli/commands/extension/validate-command.ts +78 -0
  228. package/src/cli/commands/generate/integration-generator-helpers.ts +185 -0
  229. package/src/cli/commands/generate/integration-generator.ts +12 -168
  230. package/src/cli/commands/knowledge/command-helpers.ts +295 -0
  231. package/src/cli/commands/knowledge/command.ts +34 -261
  232. package/src/cli/help/command-definitions.ts +2 -0
  233. package/src/cli/mcp/remote-file-tool-helpers.ts +27 -0
  234. package/src/cli/mcp/remote-file-tools.ts +6 -28
  235. package/src/cli/router.ts +2 -0
  236. package/src/cli/templates/integration-loader-helpers.ts +49 -0
  237. package/src/cli/templates/integration-loader.ts +10 -28
  238. package/src/cli/templates/manifest.js +2 -1
  239. package/src/deno.js +5 -2
  240. package/src/src/agent/runtime/index.ts +77 -94
  241. package/src/src/chat/ag-ui-helpers.ts +139 -0
  242. package/src/src/chat/ag-ui.ts +11 -139
  243. package/src/src/config/schemas/config.schema.ts +11 -0
  244. package/src/src/config/schemas/index.ts +15 -1
  245. package/src/src/errors/error-registry-helpers.ts +23 -0
  246. package/src/src/errors/error-registry.ts +8 -3
  247. package/src/src/extensions/capabilities.ts +97 -0
  248. package/src/src/extensions/contracts.ts +36 -0
  249. package/src/src/extensions/discovery.ts +221 -0
  250. package/src/src/extensions/errors.ts +39 -0
  251. package/src/src/extensions/factory-loader.ts +76 -0
  252. package/src/src/extensions/index.ts +79 -0
  253. package/src/src/extensions/interfaces/ai-model-provider.ts +100 -0
  254. package/src/src/extensions/interfaces/auth-provider.ts +52 -0
  255. package/src/src/extensions/interfaces/bundler.ts +116 -0
  256. package/src/src/extensions/interfaces/cache-store.ts +27 -0
  257. package/src/src/extensions/interfaces/code-parser.ts +84 -0
  258. package/src/src/extensions/interfaces/content-transformer.ts +38 -0
  259. package/src/src/extensions/interfaces/css-processor.ts +40 -0
  260. package/src/src/extensions/interfaces/database-client.ts +35 -0
  261. package/src/src/extensions/interfaces/embedding-provider.ts +39 -0
  262. package/src/src/extensions/interfaces/index.ts +81 -0
  263. package/src/src/extensions/interfaces/node-compat.ts +25 -0
  264. package/src/src/extensions/interfaces/schema-validator.ts +51 -0
  265. package/src/src/extensions/interfaces/tracing-exporter.ts +42 -0
  266. package/src/src/extensions/loader.ts +245 -0
  267. package/src/src/extensions/orchestrate.ts +184 -0
  268. package/src/src/extensions/recommendations.ts +24 -0
  269. package/src/src/extensions/types.ts +57 -0
  270. package/src/src/extensions/validation.ts +147 -0
  271. package/src/src/html/styles-builder/plugin-loader.ts +32 -0
  272. package/src/src/html/styles-builder/tailwind-plugin-allowlist.ts +51 -0
  273. package/src/src/modules/react-loader/ssr-module-loader/loader-helpers.ts +37 -0
  274. package/src/src/modules/react-loader/ssr-module-loader/loader.ts +8 -39
  275. package/src/src/platform/adapters/fs/veryfront/adapter-helpers.ts +43 -0
  276. package/src/src/platform/adapters/fs/veryfront/adapter.ts +8 -22
  277. package/src/src/platform/adapters/fs/veryfront/read-operations-helpers.ts +4 -0
  278. package/src/src/platform/adapters/fs/veryfront/read-operations.ts +4 -7
  279. package/src/src/platform/adapters/fs/veryfront/websocket-manager-helpers.ts +73 -0
  280. package/src/src/platform/adapters/fs/veryfront/websocket-manager.ts +29 -44
  281. package/src/src/platform/compat/process/command.ts +297 -0
  282. package/src/src/platform/compat/process/env.ts +227 -0
  283. package/src/src/platform/compat/process/lifecycle.ts +330 -0
  284. package/src/src/platform/compat/process/runtime-process.ts +27 -0
  285. package/src/src/platform/compat/process.ts +37 -870
  286. package/src/src/platform/index.ts +1 -0
  287. package/src/src/provider/runtime-loader/provider-endpoints.ts +50 -0
  288. package/src/src/provider/runtime-loader/provider-request-init.ts +101 -0
  289. package/src/src/provider/runtime-loader/tool-input-status.ts +210 -0
  290. package/src/src/provider/runtime-loader.ts +113 -368
  291. package/src/src/proxy/handler.ts +16 -0
  292. package/src/src/rendering/orchestrator/pipeline-helpers.ts +35 -0
  293. package/src/src/rendering/orchestrator/pipeline.ts +8 -35
  294. package/src/src/routing/api/module-loader/loader-helpers.ts +68 -0
  295. package/src/src/routing/api/module-loader/loader.ts +8 -65
  296. package/src/src/server/bootstrap.ts +88 -7
  297. package/src/src/server/dev-ui/manifest.js +3 -1
  298. package/src/src/server/handlers/request/api/project-discovery.ts +19 -8
  299. package/src/src/server/production-server.ts +1 -1
  300. package/src/src/server/services/rsc/endpoints/rsc-bundles.generated.ts +2 -2
  301. package/src/src/server/utils/domain-parser.ts +4 -0
  302. package/src/src/studio/bridge/bridge-bundle.generated.ts +1 -1
  303. package/src/src/tool/index.ts +1 -0
  304. package/src/src/tool/types.ts +21 -0
  305. package/src/src/utils/version-constant.ts +1 -1
@@ -1,5 +1,24 @@
1
- import * as dntShim from "../../_dnt.shims.js";
2
1
  import type { EmbeddingRuntime, ModelRuntime } from "./types.js";
2
+ import {
3
+ getAnthropicMessagesUrl,
4
+ getGoogleEmbeddingUrl,
5
+ getGoogleGenerateContentUrl,
6
+ getGoogleStreamGenerateContentUrl,
7
+ getOpenAIChatCompletionsUrl,
8
+ getOpenAIEmbeddingUrl,
9
+ getOpenAIResponsesUrl,
10
+ } from "./runtime-loader/provider-endpoints.js";
11
+ import {
12
+ createAnthropicRequestInit,
13
+ createGoogleRequestInit,
14
+ createOpenAIRequestInit,
15
+ } from "./runtime-loader/provider-request-init.js";
16
+ import {
17
+ TOOL_INPUT_PENDING_THRESHOLD_MS,
18
+ withToolInputStatusTransitions,
19
+ } from "./runtime-loader/tool-input-status.js";
20
+
21
+ export { TOOL_INPUT_PENDING_THRESHOLD_MS, withToolInputStatusTransitions };
3
22
 
4
23
  export interface OpenAIRuntimeConfig {
5
24
  apiKey: string;
@@ -301,6 +320,7 @@ type OpenAICompatibleChatRequest = {
301
320
  include_usage?: boolean;
302
321
  };
303
322
  max_tokens?: number;
323
+ max_completion_tokens?: number;
304
324
  temperature?: number;
305
325
  top_p?: number;
306
326
  stop?: string[];
@@ -377,252 +397,6 @@ type GoogleCompatibleRequest = {
377
397
  [key: string]: unknown;
378
398
  };
379
399
 
380
- const DEFAULT_ANTHROPIC_BASE_URL = "https://api.anthropic.com/v1";
381
- const DEFAULT_OPENAI_BASE_URL = "https://api.openai.com/v1";
382
- const DEFAULT_GOOGLE_BASE_URL = "https://generativelanguage.googleapis.com/v1beta";
383
- export const TOOL_INPUT_PENDING_THRESHOLD_MS = 5_000;
384
- type ToolInputActivityStatus = "pending_input" | "streaming_input";
385
-
386
- type ToolInputStatusState = {
387
- dueAt: number | null;
388
- lastStatus: ToolInputActivityStatus | null;
389
- };
390
-
391
- function getToolCallIdFromStreamPart(part: unknown): string | null {
392
- if (!part || typeof part !== "object") {
393
- return null;
394
- }
395
-
396
- const record = part as Record<string, unknown>;
397
- if (typeof record.toolCallId === "string" && record.toolCallId.length > 0) {
398
- return record.toolCallId;
399
- }
400
-
401
- if (typeof record.id === "string" && record.id.length > 0) {
402
- return record.id;
403
- }
404
-
405
- return null;
406
- }
407
-
408
- function collectDueToolStatuses(
409
- toolStates: Map<string, ToolInputStatusState>,
410
- now: number,
411
- thresholdMs: number,
412
- ): Array<{ type: "data-tool-call-status"; data: { toolCallId: string; status: "pending_input" } }> {
413
- const events: Array<
414
- { type: "data-tool-call-status"; data: { toolCallId: string; status: "pending_input" } }
415
- > = [];
416
-
417
- for (const [toolCallId, state] of toolStates.entries()) {
418
- if (state.dueAt === null || state.dueAt > now) {
419
- continue;
420
- }
421
-
422
- state.dueAt = now + thresholdMs;
423
- state.lastStatus = "pending_input";
424
- events.push({
425
- type: "data-tool-call-status",
426
- data: {
427
- toolCallId,
428
- status: "pending_input",
429
- },
430
- });
431
- }
432
-
433
- return events;
434
- }
435
-
436
- export async function* withToolInputStatusTransitions(
437
- stream: AsyncIterable<unknown>,
438
- thresholdMs = TOOL_INPUT_PENDING_THRESHOLD_MS,
439
- ): AsyncIterable<unknown> {
440
- const iterator = stream[Symbol.asyncIterator]();
441
- const toolStates = new Map<string, ToolInputStatusState>();
442
- const buffered: unknown[] = [];
443
- let nextPartPromise: Promise<IteratorResult<unknown>> | null = null;
444
-
445
- const closeTool = (toolCallId: string | null) => {
446
- if (!toolCallId) {
447
- return;
448
- }
449
-
450
- toolStates.delete(toolCallId);
451
- };
452
-
453
- const schedulePending = (toolCallId: string | null) => {
454
- if (!toolCallId) {
455
- return;
456
- }
457
-
458
- const state = toolStates.get(toolCallId) ?? {
459
- dueAt: null,
460
- lastStatus: null,
461
- };
462
- state.dueAt = Date.now() + thresholdMs;
463
- toolStates.set(toolCallId, state);
464
- };
465
-
466
- const markStreaming = (toolCallId: string | null) => {
467
- if (!toolCallId) {
468
- return;
469
- }
470
-
471
- const state = toolStates.get(toolCallId) ?? {
472
- dueAt: null,
473
- lastStatus: null,
474
- };
475
-
476
- if (state.lastStatus !== "streaming_input") {
477
- buffered.push({
478
- type: "data-tool-call-status",
479
- data: {
480
- toolCallId,
481
- status: "streaming_input",
482
- },
483
- });
484
- }
485
-
486
- state.lastStatus = "streaming_input";
487
- state.dueAt = Date.now() + thresholdMs;
488
- toolStates.set(toolCallId, state);
489
- };
490
-
491
- const processPart = (part: unknown) => {
492
- if (!part || typeof part !== "object") {
493
- buffered.push(part);
494
- return;
495
- }
496
-
497
- const record = part as Record<string, unknown>;
498
- const partType = typeof record.type === "string" ? record.type : null;
499
- const toolCallId = getToolCallIdFromStreamPart(part);
500
-
501
- switch (partType) {
502
- case "tool-input-start":
503
- schedulePending(toolCallId);
504
- buffered.push(part);
505
- return;
506
- case "tool-input-delta":
507
- markStreaming(toolCallId);
508
- buffered.push(part);
509
- return;
510
- case "tool-call":
511
- case "tool-result":
512
- case "tool-error":
513
- closeTool(toolCallId);
514
- buffered.push(part);
515
- return;
516
- case "finish":
517
- case "error":
518
- toolStates.clear();
519
- buffered.push(part);
520
- return;
521
- default:
522
- buffered.push(part);
523
- return;
524
- }
525
- };
526
-
527
- while (true) {
528
- if (buffered.length > 0) {
529
- yield buffered.shift();
530
- continue;
531
- }
532
-
533
- if (!nextPartPromise) {
534
- nextPartPromise = iterator.next();
535
- }
536
-
537
- const nextDueAt = [...toolStates.values()]
538
- .map((state) => state.dueAt)
539
- .filter((value): value is number => value !== null)
540
- .sort((left, right) => left - right)[0] ?? null;
541
-
542
- if (nextDueAt !== null) {
543
- let timeoutId: ReturnType<typeof dntShim.setTimeout> | null = null;
544
- const timeoutResult = await Promise.race([
545
- nextPartPromise.then((result) => ({ kind: "part" as const, result })),
546
- new Promise<{ kind: "timeout" }>((resolve) => {
547
- timeoutId = dntShim.setTimeout(
548
- () => resolve({ kind: "timeout" }),
549
- Math.max(0, nextDueAt - Date.now()),
550
- );
551
- }),
552
- ]);
553
- if (timeoutId !== null) {
554
- clearTimeout(timeoutId);
555
- }
556
-
557
- if (timeoutResult.kind === "timeout") {
558
- buffered.push(...collectDueToolStatuses(toolStates, Date.now(), thresholdMs));
559
- continue;
560
- }
561
-
562
- nextPartPromise = null;
563
- if (timeoutResult.result.done) {
564
- buffered.push(...collectDueToolStatuses(toolStates, Date.now(), thresholdMs));
565
- while (buffered.length > 0) {
566
- yield buffered.shift();
567
- }
568
- return;
569
- }
570
-
571
- processPart(timeoutResult.result.value);
572
- continue;
573
- }
574
-
575
- const result = await nextPartPromise;
576
- nextPartPromise = null;
577
- if (result.done) {
578
- return;
579
- }
580
-
581
- processPart(result.value);
582
- }
583
- }
584
-
585
- function joinUrl(base: string, path: string): string {
586
- return `${base.replace(/\/+$/, "")}/${path.replace(/^\/+/, "")}`;
587
- }
588
-
589
- function getOpenAIEmbeddingUrl(baseURL?: string): string {
590
- return joinUrl(baseURL ?? DEFAULT_OPENAI_BASE_URL, "embeddings");
591
- }
592
-
593
- function getAnthropicMessagesUrl(baseURL?: string): string {
594
- return joinUrl(baseURL ?? DEFAULT_ANTHROPIC_BASE_URL, "messages");
595
- }
596
-
597
- function getOpenAIChatCompletionsUrl(baseURL?: string): string {
598
- return joinUrl(baseURL ?? DEFAULT_OPENAI_BASE_URL, "chat/completions");
599
- }
600
-
601
- function getOpenAIResponsesUrl(baseURL?: string): string {
602
- return joinUrl(baseURL ?? DEFAULT_OPENAI_BASE_URL, "responses");
603
- }
604
-
605
- function getGoogleGenerateContentUrl(baseURL: string | undefined, modelId: string): string {
606
- return joinUrl(
607
- baseURL ?? DEFAULT_GOOGLE_BASE_URL,
608
- `models/${encodeURIComponent(modelId)}:generateContent`,
609
- );
610
- }
611
-
612
- function getGoogleStreamGenerateContentUrl(baseURL: string | undefined, modelId: string): string {
613
- return joinUrl(
614
- baseURL ?? DEFAULT_GOOGLE_BASE_URL,
615
- `models/${encodeURIComponent(modelId)}:streamGenerateContent?alt=sse`,
616
- );
617
- }
618
-
619
- function getGoogleEmbeddingUrl(baseURL: string | undefined, modelId: string): string {
620
- return joinUrl(
621
- baseURL ?? DEFAULT_GOOGLE_BASE_URL,
622
- `models/${encodeURIComponent(modelId)}:embedContent`,
623
- );
624
- }
625
-
626
400
  function isNumberArray(value: unknown): value is number[] {
627
401
  return Array.isArray(value) && value.every((entry) => typeof entry === "number");
628
402
  }
@@ -1054,17 +828,6 @@ function readProviderOptions(
1054
828
  return merged;
1055
829
  }
1056
830
 
1057
- function createRequestHeaders(options: {
1058
- apiKeyHeaderName: string;
1059
- apiKey: string;
1060
- extraHeaders?: HeadersInit;
1061
- }): Headers {
1062
- const headers = new Headers(options.extraHeaders);
1063
- headers.set("content-type", "application/json");
1064
- headers.set(options.apiKeyHeaderName, options.apiKey);
1065
- return headers;
1066
- }
1067
-
1068
831
  function normalizeAnthropicFinishReason(
1069
832
  raw: unknown,
1070
833
  ): string | { unified: string; raw: string } | null {
@@ -1397,24 +1160,6 @@ function toAnthropicTools(
1397
1160
  return normalized;
1398
1161
  }
1399
1162
 
1400
- function createAnthropicRequestHeaders(options: {
1401
- apiKey?: string;
1402
- authToken?: string;
1403
- extraHeaders?: HeadersInit;
1404
- }): Headers {
1405
- const headers = new Headers(options.extraHeaders);
1406
- headers.set("content-type", "application/json");
1407
- headers.set("anthropic-version", headers.get("anthropic-version") ?? "2023-06-01");
1408
-
1409
- if (options.authToken) {
1410
- headers.set("authorization", `Bearer ${options.authToken}`);
1411
- } else if (options.apiKey) {
1412
- headers.set("x-api-key", options.apiKey);
1413
- }
1414
-
1415
- return headers;
1416
- }
1417
-
1418
1163
  /**
1419
1164
  * Anthropic's Messages API requires `max_tokens` on every call, so the
1420
1165
  * outbound request builder must always supply a number. Picking the right
@@ -2172,6 +1917,25 @@ function isOpenAIReasoningModel(modelId: string): boolean {
2172
1917
  return /^o[134](-|$)/.test(modelId);
2173
1918
  }
2174
1919
 
1920
+ /**
1921
+ * Detect native OpenAI models (gpt-*, o-series, chatgpt-*) vs third-party
1922
+ * OpenAI-compatible providers (Kimi, etc.). Native OpenAI models require
1923
+ * `max_completion_tokens` (the old `max_tokens` is rejected by newer models
1924
+ * like gpt-5.2), while third-party providers still expect `max_tokens`.
1925
+ */
1926
+ function isNativeOpenAIModel(modelId: string): boolean {
1927
+ return /^(gpt-|o[134](-|$)|chatgpt-)/.test(modelId);
1928
+ }
1929
+
1930
+ /**
1931
+ * Kimi K2.5 fixes sampling parameters (temperature, top_p, presence_penalty,
1932
+ * frequency_penalty) to predetermined values and rejects any other values.
1933
+ * See https://platform.moonshot.cn/docs/guide/kimi-k2-5-quickstart
1934
+ */
1935
+ function isFixedSamplingModel(modelId: string): boolean {
1936
+ return /^kimi-k2\.5/.test(modelId);
1937
+ }
1938
+
2175
1939
  /**
2176
1940
  * Map the unified reasoning effort to OpenAI's `reasoning_effort` enum.
2177
1941
  * OpenAI doesn't accept "max" — we collapse it to "high".
@@ -2204,6 +1968,8 @@ function buildOpenAIChatRequest(
2204
1968
  const isReasoningModel = isOpenAIReasoningModel(modelId);
2205
1969
  const reasoningEffort = resolveOpenAIReasoningEffort(options.reasoning);
2206
1970
  const reasoningEnabled = isReasoningModel || reasoningEffort !== undefined;
1971
+ const fixedSampling = isFixedSamplingModel(modelId);
1972
+ const dropSamplingParams = reasoningEnabled || fixedSampling;
2207
1973
 
2208
1974
  // OpenAI Chat Completions has no top_k surface (it's exposed only on the
2209
1975
  // Responses API for some reasoning models). Quietly accepting it would
@@ -2217,10 +1983,10 @@ function buildOpenAIChatRequest(
2217
1983
  });
2218
1984
  }
2219
1985
 
2220
- // Reasoning models (o1 / o3 / o4) reject sampling params outright. Emit
2221
- // warnings at build time so callers see *why* the value didn't apply
2222
- // rather than a 400 from the API.
2223
- if (reasoningEnabled) {
1986
+ // Reasoning models (o1 / o3 / o4) and models with fixed sampling params
1987
+ // (Kimi K2.5) reject sampling params outright. Emit warnings at build time
1988
+ // so callers see *why* the value didn't apply rather than a 400 from the API.
1989
+ if (dropSamplingParams) {
2224
1990
  const dropped: Array<[keyof typeof options, string]> = [
2225
1991
  ["temperature", "temperature"],
2226
1992
  ["topP", "top_p"],
@@ -2233,8 +1999,9 @@ function buildOpenAIChatRequest(
2233
1999
  type: "unsupported-setting",
2234
2000
  provider: "openai",
2235
2001
  setting: key,
2236
- details:
2237
- `Dropped because OpenAI reasoning models reject ${openaiName}. Reasoning was active for this request.`,
2002
+ details: fixedSampling
2003
+ ? `Dropped because this model uses fixed sampling parameters.`
2004
+ : `Dropped because OpenAI reasoning models reject ${openaiName}. Reasoning was active for this request.`,
2238
2005
  });
2239
2006
  }
2240
2007
  }
@@ -2244,13 +2011,17 @@ function buildOpenAIChatRequest(
2244
2011
  model: modelId,
2245
2012
  messages: toOpenAICompatibleMessages(options.prompt),
2246
2013
  ...(stream ? { stream: true, stream_options: { include_usage: true } } : {}),
2247
- ...(options.maxOutputTokens !== undefined ? { max_tokens: options.maxOutputTokens } : {}),
2248
- // OpenAI reasoning models reject temperature / top_p / frequency / presence.
2249
- // Drop them silently rather than letting the API bounce the request.
2250
- ...(!reasoningEnabled && options.temperature !== undefined
2014
+ ...(options.maxOutputTokens !== undefined
2015
+ ? isNativeOpenAIModel(modelId)
2016
+ ? { max_completion_tokens: options.maxOutputTokens }
2017
+ : { max_tokens: options.maxOutputTokens }
2018
+ : {}),
2019
+ // Reasoning models and fixed-sampling models reject temperature / top_p /
2020
+ // frequency / presence. Drop them rather than letting the API bounce.
2021
+ ...(!dropSamplingParams && options.temperature !== undefined
2251
2022
  ? { temperature: options.temperature }
2252
2023
  : {}),
2253
- ...(!reasoningEnabled && options.topP !== undefined ? { top_p: options.topP } : {}),
2024
+ ...(!dropSamplingParams && options.topP !== undefined ? { top_p: options.topP } : {}),
2254
2025
  ...(options.stopSequences && options.stopSequences.length > 0
2255
2026
  ? { stop: options.stopSequences }
2256
2027
  : {}),
@@ -2259,10 +2030,10 @@ function buildOpenAIChatRequest(
2259
2030
  : {}),
2260
2031
  ...(options.toolChoice !== undefined ? { tool_choice: options.toolChoice } : {}),
2261
2032
  ...(options.seed !== undefined ? { seed: options.seed } : {}),
2262
- ...(!reasoningEnabled && options.presencePenalty !== undefined
2033
+ ...(!dropSamplingParams && options.presencePenalty !== undefined
2263
2034
  ? { presence_penalty: options.presencePenalty }
2264
2035
  : {}),
2265
- ...(!reasoningEnabled && options.frequencyPenalty !== undefined
2036
+ ...(!dropSamplingParams && options.frequencyPenalty !== undefined
2266
2037
  ? { frequency_penalty: options.frequencyPenalty }
2267
2038
  : {}),
2268
2039
  ...(reasoningEffort !== undefined ? { reasoning_effort: reasoningEffort } : {}),
@@ -2292,7 +2063,18 @@ function buildOpenAIChatRequest(
2292
2063
  : {}),
2293
2064
  };
2294
2065
 
2295
- Object.assign(body, readProviderOptions(options.providerOptions, "openai", providerName));
2066
+ const providerOpts = readProviderOptions(options.providerOptions, "openai", providerName);
2067
+
2068
+ // Normalize max_tokens → max_completion_tokens for native OpenAI models.
2069
+ // Provider options can re-introduce max_tokens which newer models reject.
2070
+ if (isNativeOpenAIModel(modelId) && "max_tokens" in providerOpts) {
2071
+ if (!("max_completion_tokens" in providerOpts)) {
2072
+ providerOpts.max_completion_tokens = providerOpts.max_tokens;
2073
+ }
2074
+ delete providerOpts.max_tokens;
2075
+ }
2076
+
2077
+ Object.assign(body, providerOpts);
2296
2078
  return body;
2297
2079
  }
2298
2080
 
@@ -3056,16 +2838,12 @@ export function createOpenAIModelRuntime(
3056
2838
  fetchImpl,
3057
2839
  providerLabel: config.name ?? "openai",
3058
2840
  providerKind: "openai",
3059
- init: {
3060
- method: "POST",
3061
- headers: createRequestHeaders({
3062
- apiKeyHeaderName: "authorization",
3063
- apiKey: `Bearer ${config.apiKey}`,
3064
- extraHeaders: options.headers,
3065
- }),
2841
+ init: createOpenAIRequestInit({
2842
+ apiKey: config.apiKey,
2843
+ extraHeaders: options.headers,
3066
2844
  body: JSON.stringify(body),
3067
2845
  signal: options.abortSignal,
3068
- },
2846
+ }),
3069
2847
  }).then((payload) => {
3070
2848
  const drained = warnings.drain();
3071
2849
  return {
@@ -3090,16 +2868,12 @@ export function createOpenAIModelRuntime(
3090
2868
  fetchImpl,
3091
2869
  providerLabel: config.name ?? "openai",
3092
2870
  providerKind: "openai",
3093
- init: {
3094
- method: "POST",
3095
- headers: createRequestHeaders({
3096
- apiKeyHeaderName: "authorization",
3097
- apiKey: `Bearer ${config.apiKey}`,
3098
- extraHeaders: options.headers,
3099
- }),
2871
+ init: createOpenAIRequestInit({
2872
+ apiKey: config.apiKey,
2873
+ extraHeaders: options.headers,
3100
2874
  body: JSON.stringify(body),
3101
2875
  signal: options.abortSignal,
3102
- },
2876
+ }),
3103
2877
  }).then((responseStream) => {
3104
2878
  const drained = warnings.drain();
3105
2879
  return {
@@ -3709,16 +3483,12 @@ export function createOpenAIResponsesRuntime(
3709
3483
  fetchImpl,
3710
3484
  providerLabel: config.name ?? "openai",
3711
3485
  providerKind: "openai",
3712
- init: {
3713
- method: "POST",
3714
- headers: createRequestHeaders({
3715
- apiKeyHeaderName: "authorization",
3716
- apiKey: `Bearer ${config.apiKey}`,
3717
- extraHeaders: options.headers,
3718
- }),
3486
+ init: createOpenAIRequestInit({
3487
+ apiKey: config.apiKey,
3488
+ extraHeaders: options.headers,
3719
3489
  body: JSON.stringify(body),
3720
3490
  signal: options.abortSignal,
3721
- },
3491
+ }),
3722
3492
  }).then((payload) => {
3723
3493
  const drained = warnings.drain();
3724
3494
  return {
@@ -3743,16 +3513,12 @@ export function createOpenAIResponsesRuntime(
3743
3513
  fetchImpl,
3744
3514
  providerLabel: config.name ?? "openai",
3745
3515
  providerKind: "openai",
3746
- init: {
3747
- method: "POST",
3748
- headers: createRequestHeaders({
3749
- apiKeyHeaderName: "authorization",
3750
- apiKey: `Bearer ${config.apiKey}`,
3751
- extraHeaders: options.headers,
3752
- }),
3516
+ init: createOpenAIRequestInit({
3517
+ apiKey: config.apiKey,
3518
+ extraHeaders: options.headers,
3753
3519
  body: JSON.stringify(body),
3754
3520
  signal: options.abortSignal,
3755
- },
3521
+ }),
3756
3522
  }).then((responseStream) => {
3757
3523
  const drained = warnings.drain();
3758
3524
  return {
@@ -3792,16 +3558,13 @@ export function createAnthropicModelRuntime(
3792
3558
  fetchImpl,
3793
3559
  providerLabel: config.name ?? "anthropic",
3794
3560
  providerKind: "anthropic",
3795
- init: {
3796
- method: "POST",
3797
- headers: createAnthropicRequestHeaders({
3798
- apiKey: config.apiKey,
3799
- authToken: config.authToken,
3800
- extraHeaders: options.headers,
3801
- }),
3561
+ init: createAnthropicRequestInit({
3562
+ apiKey: config.apiKey,
3563
+ authToken: config.authToken,
3564
+ extraHeaders: options.headers,
3802
3565
  body: JSON.stringify(body),
3803
3566
  signal: options.abortSignal,
3804
- },
3567
+ }),
3805
3568
  }).then((payload) => {
3806
3569
  const drained = warnings.drain();
3807
3570
  return {
@@ -3826,16 +3589,14 @@ export function createAnthropicModelRuntime(
3826
3589
  fetchImpl,
3827
3590
  providerLabel: config.name ?? "anthropic",
3828
3591
  providerKind: "anthropic",
3829
- init: {
3830
- method: "POST",
3831
- headers: createAnthropicRequestHeaders({
3832
- apiKey: config.apiKey,
3833
- authToken: config.authToken,
3834
- extraHeaders: options.headers,
3835
- }),
3592
+ init: createAnthropicRequestInit({
3593
+ apiKey: config.apiKey,
3594
+ authToken: config.authToken,
3595
+ extraHeaders: options.headers,
3596
+ enableFineGrainedToolStreaming: true,
3836
3597
  body: JSON.stringify(body),
3837
3598
  signal: options.abortSignal,
3838
- },
3599
+ }),
3839
3600
  }).then((responseStream) => {
3840
3601
  const drained = warnings.drain();
3841
3602
  return {
@@ -3873,16 +3634,12 @@ export function createGoogleModelRuntime(
3873
3634
  fetchImpl,
3874
3635
  providerLabel: config.name ?? "google",
3875
3636
  providerKind: "google",
3876
- init: {
3877
- method: "POST",
3878
- headers: createRequestHeaders({
3879
- apiKeyHeaderName: "x-goog-api-key",
3880
- apiKey: config.apiKey,
3881
- extraHeaders: options.headers,
3882
- }),
3637
+ init: createGoogleRequestInit({
3638
+ apiKey: config.apiKey,
3639
+ extraHeaders: options.headers,
3883
3640
  body: JSON.stringify(body),
3884
3641
  signal: options.abortSignal,
3885
- },
3642
+ }),
3886
3643
  }).then((payload) => {
3887
3644
  const drained = warnings.drain();
3888
3645
  return {
@@ -3905,16 +3662,12 @@ export function createGoogleModelRuntime(
3905
3662
  fetchImpl,
3906
3663
  providerLabel: config.name ?? "google",
3907
3664
  providerKind: "google",
3908
- init: {
3909
- method: "POST",
3910
- headers: createRequestHeaders({
3911
- apiKeyHeaderName: "x-goog-api-key",
3912
- apiKey: config.apiKey,
3913
- extraHeaders: options.headers,
3914
- }),
3665
+ init: createGoogleRequestInit({
3666
+ apiKey: config.apiKey,
3667
+ extraHeaders: options.headers,
3915
3668
  body: JSON.stringify(body),
3916
3669
  signal: options.abortSignal,
3917
- },
3670
+ }),
3918
3671
  }).then((responseStream) => {
3919
3672
  const drained = warnings.drain();
3920
3673
  return {
@@ -3952,18 +3705,14 @@ export function createOpenAIEmbeddingRuntime(
3952
3705
  fetchImpl,
3953
3706
  providerLabel: config.name ?? "openai",
3954
3707
  providerKind: "openai",
3955
- init: {
3956
- method: "POST",
3957
- headers: {
3958
- "content-type": "application/json",
3959
- authorization: `Bearer ${config.apiKey}`,
3960
- },
3708
+ init: createOpenAIRequestInit({
3709
+ apiKey: config.apiKey,
3961
3710
  body: JSON.stringify({
3962
3711
  model: modelId,
3963
3712
  input: values,
3964
3713
  }),
3965
3714
  signal: abortSignal,
3966
- },
3715
+ }),
3967
3716
  }).then((payload) => ({
3968
3717
  embeddings: extractOpenAIEmbeddings(payload),
3969
3718
  usage: {
@@ -4001,19 +3750,15 @@ export function createGoogleEmbeddingRuntime(
4001
3750
  fetchImpl,
4002
3751
  providerLabel: config.name ?? "google",
4003
3752
  providerKind: "google",
4004
- init: {
4005
- method: "POST",
4006
- headers: {
4007
- "content-type": "application/json",
4008
- "x-goog-api-key": config.apiKey,
4009
- },
3753
+ init: createGoogleRequestInit({
3754
+ apiKey: config.apiKey,
4010
3755
  body: JSON.stringify({
4011
3756
  content: {
4012
3757
  parts: [{ text: value }],
4013
3758
  },
4014
3759
  }),
4015
3760
  signal: abortSignal,
4016
- },
3761
+ }),
4017
3762
  })
4018
3763
  )).then((payloads) => ({
4019
3764
  embeddings: payloads.map(extractGoogleEmbedding),
@@ -215,6 +215,15 @@ function parseStatusFromError(error: unknown): number | null {
215
215
  return match ? Number(match[1]) : null;
216
216
  }
217
217
 
218
+ // Brittle on purpose: we string-match the API's OAuth error body. Source of truth is
219
+ // veryfront-api/src/api/http/rest/auth/routes.ts — `oauthError(c, 'Project not found
220
+ // for domain', ...)`. If that string is renamed, this regex silently regresses to 502.
221
+ // Durable fix is a typed error code from the token-mint helper; tracked separately.
222
+ function isMissingCustomDomainProjectError(error: unknown): boolean {
223
+ const message = error instanceof Error ? error.message : String(error);
224
+ return /project not found for domain/i.test(message);
225
+ }
226
+
218
227
  async function extractUserIdFromToken(
219
228
  token: string,
220
229
  apiBaseUrl: string,
@@ -635,6 +644,13 @@ export function createProxyHandler(options: ProxyHandlerOptions) {
635
644
 
636
645
  if (isCustomDomain && !projectSlug) {
637
646
  if (!token) {
647
+ if (isMissingCustomDomainProjectError(tokenFetchError)) {
648
+ logger?.info("Custom domain project not found during token fetch", {
649
+ domain: host,
650
+ });
651
+ return makeErrorContext(base, 404, `No project configured for domain: ${host}`);
652
+ }
653
+
638
654
  logger?.error("Cannot process custom domain without token", undefined, { domain: host });
639
655
  return makeErrorContext(base, 502, `Failed to authenticate for domain: ${host}`, token);
640
656
  }