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.
- package/README.md +1 -1
- package/esm/cli/commands/extension/command-help.d.ts +3 -0
- package/esm/cli/commands/extension/command-help.d.ts.map +1 -0
- package/esm/cli/commands/extension/command-help.js +16 -0
- package/esm/cli/commands/extension/handler.d.ts +3 -0
- package/esm/cli/commands/extension/handler.d.ts.map +1 -0
- package/esm/cli/commands/extension/handler.js +36 -0
- package/esm/cli/commands/extension/init-command.d.ts +19 -0
- package/esm/cli/commands/extension/init-command.d.ts.map +1 -0
- package/esm/cli/commands/extension/init-command.js +122 -0
- package/esm/cli/commands/extension/validate-command.d.ts +13 -0
- package/esm/cli/commands/extension/validate-command.d.ts.map +1 -0
- package/esm/cli/commands/extension/validate-command.js +62 -0
- package/esm/cli/commands/generate/integration-generator-helpers.d.ts +35 -0
- package/esm/cli/commands/generate/integration-generator-helpers.d.ts.map +1 -0
- package/esm/cli/commands/generate/integration-generator-helpers.js +123 -0
- package/esm/cli/commands/generate/integration-generator.d.ts +1 -2
- package/esm/cli/commands/generate/integration-generator.d.ts.map +1 -1
- package/esm/cli/commands/generate/integration-generator.js +1 -123
- package/esm/cli/commands/knowledge/command-helpers.d.ts +48 -0
- package/esm/cli/commands/knowledge/command-helpers.d.ts.map +1 -0
- package/esm/cli/commands/knowledge/command-helpers.js +216 -0
- package/esm/cli/commands/knowledge/command.d.ts +12 -17
- package/esm/cli/commands/knowledge/command.d.ts.map +1 -1
- package/esm/cli/commands/knowledge/command.js +26 -214
- package/esm/cli/help/command-definitions.d.ts.map +1 -1
- package/esm/cli/help/command-definitions.js +2 -0
- package/esm/cli/mcp/remote-file-tool-helpers.d.ts +5 -0
- package/esm/cli/mcp/remote-file-tool-helpers.d.ts.map +1 -0
- package/esm/cli/mcp/remote-file-tool-helpers.js +22 -0
- package/esm/cli/mcp/remote-file-tools.d.ts.map +1 -1
- package/esm/cli/mcp/remote-file-tools.js +1 -22
- package/esm/cli/router.d.ts.map +1 -1
- package/esm/cli/router.js +2 -0
- package/esm/cli/templates/integration-loader-helpers.d.ts +8 -0
- package/esm/cli/templates/integration-loader-helpers.d.ts.map +1 -0
- package/esm/cli/templates/integration-loader-helpers.js +29 -0
- package/esm/cli/templates/integration-loader.d.ts.map +1 -1
- package/esm/cli/templates/integration-loader.js +5 -21
- package/esm/cli/templates/manifest.d.ts +1 -0
- package/esm/cli/templates/manifest.js +2 -1
- package/esm/deno.d.ts +3 -0
- package/esm/deno.js +5 -2
- package/esm/src/agent/runtime/index.d.ts.map +1 -1
- package/esm/src/agent/runtime/index.js +48 -90
- package/esm/src/chat/ag-ui-helpers.d.ts +17 -0
- package/esm/src/chat/ag-ui-helpers.d.ts.map +1 -0
- package/esm/src/chat/ag-ui-helpers.js +111 -0
- package/esm/src/chat/ag-ui.d.ts.map +1 -1
- package/esm/src/chat/ag-ui.js +1 -111
- package/esm/src/config/schemas/config.schema.d.ts +1 -0
- package/esm/src/config/schemas/config.schema.d.ts.map +1 -1
- package/esm/src/config/schemas/config.schema.js +11 -0
- package/esm/src/config/schemas/index.d.ts +11 -1
- package/esm/src/config/schemas/index.d.ts.map +1 -1
- package/esm/src/errors/error-registry-helpers.d.ts +6 -0
- package/esm/src/errors/error-registry-helpers.d.ts.map +1 -0
- package/esm/src/errors/error-registry-helpers.js +9 -0
- package/esm/src/errors/error-registry.d.ts.map +1 -1
- package/esm/src/errors/error-registry.js +4 -3
- package/esm/src/extensions/capabilities.d.ts +20 -0
- package/esm/src/extensions/capabilities.d.ts.map +1 -0
- package/esm/src/extensions/capabilities.js +77 -0
- package/esm/src/extensions/contracts.d.ts +10 -0
- package/esm/src/extensions/contracts.d.ts.map +1 -0
- package/esm/src/extensions/contracts.js +28 -0
- package/esm/src/extensions/discovery.d.ts +48 -0
- package/esm/src/extensions/discovery.d.ts.map +1 -0
- package/esm/src/extensions/discovery.js +179 -0
- package/esm/src/extensions/errors.d.ts +10 -0
- package/esm/src/extensions/errors.d.ts.map +1 -0
- package/esm/src/extensions/errors.js +34 -0
- package/esm/src/extensions/factory-loader.d.ts +29 -0
- package/esm/src/extensions/factory-loader.d.ts.map +1 -0
- package/esm/src/extensions/factory-loader.js +63 -0
- package/esm/src/extensions/index.d.ts +37 -0
- package/esm/src/extensions/index.d.ts.map +1 -0
- package/esm/src/extensions/index.js +41 -0
- package/esm/src/extensions/interfaces/ai-model-provider.d.ts +94 -0
- package/esm/src/extensions/interfaces/ai-model-provider.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/ai-model-provider.js +8 -0
- package/esm/src/extensions/interfaces/auth-provider.d.ts +49 -0
- package/esm/src/extensions/interfaces/auth-provider.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/auth-provider.js +8 -0
- package/esm/src/extensions/interfaces/bundler.d.ts +118 -0
- package/esm/src/extensions/interfaces/bundler.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/bundler.js +8 -0
- package/esm/src/extensions/interfaces/cache-store.d.ts +27 -0
- package/esm/src/extensions/interfaces/cache-store.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/cache-store.js +8 -0
- package/esm/src/extensions/interfaces/code-parser.d.ts +76 -0
- package/esm/src/extensions/interfaces/code-parser.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/code-parser.js +8 -0
- package/esm/src/extensions/interfaces/content-transformer.d.ts +40 -0
- package/esm/src/extensions/interfaces/content-transformer.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/content-transformer.js +8 -0
- package/esm/src/extensions/interfaces/css-processor.d.ts +38 -0
- package/esm/src/extensions/interfaces/css-processor.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/css-processor.js +8 -0
- package/esm/src/extensions/interfaces/database-client.d.ts +31 -0
- package/esm/src/extensions/interfaces/database-client.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/database-client.js +8 -0
- package/esm/src/extensions/interfaces/embedding-provider.d.ts +37 -0
- package/esm/src/extensions/interfaces/embedding-provider.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/embedding-provider.js +8 -0
- package/esm/src/extensions/interfaces/index.d.ts +21 -0
- package/esm/src/extensions/interfaces/index.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/index.js +9 -0
- package/esm/src/extensions/interfaces/node-compat.d.ts +25 -0
- package/esm/src/extensions/interfaces/node-compat.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/node-compat.js +8 -0
- package/esm/src/extensions/interfaces/schema-validator.d.ts +46 -0
- package/esm/src/extensions/interfaces/schema-validator.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/schema-validator.js +8 -0
- package/esm/src/extensions/interfaces/tracing-exporter.d.ts +44 -0
- package/esm/src/extensions/interfaces/tracing-exporter.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/tracing-exporter.js +8 -0
- package/esm/src/extensions/loader.d.ts +33 -0
- package/esm/src/extensions/loader.d.ts.map +1 -0
- package/esm/src/extensions/loader.js +209 -0
- package/esm/src/extensions/orchestrate.d.ts +54 -0
- package/esm/src/extensions/orchestrate.d.ts.map +1 -0
- package/esm/src/extensions/orchestrate.js +116 -0
- package/esm/src/extensions/recommendations.d.ts +7 -0
- package/esm/src/extensions/recommendations.d.ts.map +1 -0
- package/esm/src/extensions/recommendations.js +22 -0
- package/esm/src/extensions/types.d.ts +47 -0
- package/esm/src/extensions/types.d.ts.map +1 -0
- package/esm/src/extensions/types.js +6 -0
- package/esm/src/extensions/validation.d.ts +44 -0
- package/esm/src/extensions/validation.d.ts.map +1 -0
- package/esm/src/extensions/validation.js +115 -0
- package/esm/src/html/styles-builder/plugin-loader.d.ts.map +1 -1
- package/esm/src/html/styles-builder/plugin-loader.js +23 -0
- package/esm/src/html/styles-builder/tailwind-plugin-allowlist.d.ts +29 -0
- package/esm/src/html/styles-builder/tailwind-plugin-allowlist.d.ts.map +1 -0
- package/esm/src/html/styles-builder/tailwind-plugin-allowlist.js +48 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.d.ts +15 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.d.ts.map +1 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.js +22 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts +0 -2
- package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts.map +1 -1
- package/esm/src/modules/react-loader/ssr-module-loader/loader.js +4 -24
- package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.d.ts +19 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.d.ts.map +1 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.js +26 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/adapter.js +4 -20
- package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.d.ts +1 -0
- package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.js +3 -0
- package/esm/src/platform/adapters/fs/veryfront/read-operations.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/read-operations.js +4 -7
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.d.ts +28 -0
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.d.ts.map +1 -0
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.js +41 -0
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts +1 -4
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.js +7 -40
- package/esm/src/platform/compat/process/command.d.ts +31 -0
- package/esm/src/platform/compat/process/command.d.ts.map +1 -0
- package/esm/src/platform/compat/process/command.js +193 -0
- package/esm/src/platform/compat/process/env.d.ts +31 -0
- package/esm/src/platform/compat/process/env.d.ts.map +1 -0
- package/esm/src/platform/compat/process/env.js +175 -0
- package/esm/src/platform/compat/process/lifecycle.d.ts +98 -0
- package/esm/src/platform/compat/process/lifecycle.d.ts.map +1 -0
- package/esm/src/platform/compat/process/lifecycle.js +305 -0
- package/esm/src/platform/compat/process/runtime-process.d.ts +10 -0
- package/esm/src/platform/compat/process/runtime-process.d.ts.map +1 -0
- package/esm/src/platform/compat/process/runtime-process.js +24 -0
- package/esm/src/platform/compat/process.d.ts +4 -165
- package/esm/src/platform/compat/process.d.ts.map +1 -1
- package/esm/src/platform/compat/process.js +4 -682
- package/esm/src/platform/index.d.ts +1 -1
- package/esm/src/platform/index.d.ts.map +1 -1
- package/esm/src/provider/runtime-loader/provider-endpoints.d.ts +8 -0
- package/esm/src/provider/runtime-loader/provider-endpoints.d.ts.map +1 -0
- package/esm/src/provider/runtime-loader/provider-endpoints.js +27 -0
- package/esm/src/provider/runtime-loader/provider-request-init.d.ts +32 -0
- package/esm/src/provider/runtime-loader/provider-request-init.d.ts.map +1 -0
- package/esm/src/provider/runtime-loader/provider-request-init.js +67 -0
- package/esm/src/provider/runtime-loader/tool-input-status.d.ts +17 -0
- package/esm/src/provider/runtime-loader/tool-input-status.d.ts.map +1 -0
- package/esm/src/provider/runtime-loader/tool-input-status.js +155 -0
- package/esm/src/provider/runtime-loader.d.ts +2 -3
- package/esm/src/provider/runtime-loader.d.ts.map +1 -1
- package/esm/src/provider/runtime-loader.js +92 -291
- package/esm/src/proxy/handler.d.ts.map +1 -1
- package/esm/src/proxy/handler.js +14 -0
- package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts +8 -0
- package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts.map +1 -0
- package/esm/src/rendering/orchestrator/pipeline-helpers.js +20 -0
- package/esm/src/rendering/orchestrator/pipeline.d.ts +0 -3
- package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/pipeline.js +4 -22
- package/esm/src/routing/api/module-loader/loader-helpers.d.ts +10 -0
- package/esm/src/routing/api/module-loader/loader-helpers.d.ts.map +1 -0
- package/esm/src/routing/api/module-loader/loader-helpers.js +62 -0
- package/esm/src/routing/api/module-loader/loader.d.ts +1 -1
- package/esm/src/routing/api/module-loader/loader.d.ts.map +1 -1
- package/esm/src/routing/api/module-loader/loader.js +2 -60
- package/esm/src/server/bootstrap.d.ts +22 -2
- package/esm/src/server/bootstrap.d.ts.map +1 -1
- package/esm/src/server/bootstrap.js +67 -5
- package/esm/src/server/dev-ui/manifest.d.ts +2 -0
- package/esm/src/server/dev-ui/manifest.js +3 -1
- package/esm/src/server/handlers/request/api/project-discovery.d.ts.map +1 -1
- package/esm/src/server/handlers/request/api/project-discovery.js +14 -8
- package/esm/src/server/production-server.js +1 -1
- package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.d.ts.map +1 -1
- package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.js +2 -2
- package/esm/src/server/utils/domain-parser.d.ts.map +1 -1
- package/esm/src/server/utils/domain-parser.js +4 -0
- package/esm/src/studio/bridge/bridge-bundle.generated.d.ts.map +1 -1
- package/esm/src/studio/bridge/bridge-bundle.generated.js +1 -1
- package/esm/src/tool/index.d.ts +1 -1
- package/esm/src/tool/index.d.ts.map +1 -1
- package/esm/src/tool/types.d.ts +20 -0
- package/esm/src/tool/types.d.ts.map +1 -1
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +7 -1
- package/src/cli/commands/extension/command-help.ts +18 -0
- package/src/cli/commands/extension/handler.ts +41 -0
- package/src/cli/commands/extension/init-command.ts +140 -0
- package/src/cli/commands/extension/validate-command.ts +78 -0
- package/src/cli/commands/generate/integration-generator-helpers.ts +185 -0
- package/src/cli/commands/generate/integration-generator.ts +12 -168
- package/src/cli/commands/knowledge/command-helpers.ts +295 -0
- package/src/cli/commands/knowledge/command.ts +34 -261
- package/src/cli/help/command-definitions.ts +2 -0
- package/src/cli/mcp/remote-file-tool-helpers.ts +27 -0
- package/src/cli/mcp/remote-file-tools.ts +6 -28
- package/src/cli/router.ts +2 -0
- package/src/cli/templates/integration-loader-helpers.ts +49 -0
- package/src/cli/templates/integration-loader.ts +10 -28
- package/src/cli/templates/manifest.js +2 -1
- package/src/deno.js +5 -2
- package/src/src/agent/runtime/index.ts +77 -94
- package/src/src/chat/ag-ui-helpers.ts +139 -0
- package/src/src/chat/ag-ui.ts +11 -139
- package/src/src/config/schemas/config.schema.ts +11 -0
- package/src/src/config/schemas/index.ts +15 -1
- package/src/src/errors/error-registry-helpers.ts +23 -0
- package/src/src/errors/error-registry.ts +8 -3
- package/src/src/extensions/capabilities.ts +97 -0
- package/src/src/extensions/contracts.ts +36 -0
- package/src/src/extensions/discovery.ts +221 -0
- package/src/src/extensions/errors.ts +39 -0
- package/src/src/extensions/factory-loader.ts +76 -0
- package/src/src/extensions/index.ts +79 -0
- package/src/src/extensions/interfaces/ai-model-provider.ts +100 -0
- package/src/src/extensions/interfaces/auth-provider.ts +52 -0
- package/src/src/extensions/interfaces/bundler.ts +116 -0
- package/src/src/extensions/interfaces/cache-store.ts +27 -0
- package/src/src/extensions/interfaces/code-parser.ts +84 -0
- package/src/src/extensions/interfaces/content-transformer.ts +38 -0
- package/src/src/extensions/interfaces/css-processor.ts +40 -0
- package/src/src/extensions/interfaces/database-client.ts +35 -0
- package/src/src/extensions/interfaces/embedding-provider.ts +39 -0
- package/src/src/extensions/interfaces/index.ts +81 -0
- package/src/src/extensions/interfaces/node-compat.ts +25 -0
- package/src/src/extensions/interfaces/schema-validator.ts +51 -0
- package/src/src/extensions/interfaces/tracing-exporter.ts +42 -0
- package/src/src/extensions/loader.ts +245 -0
- package/src/src/extensions/orchestrate.ts +184 -0
- package/src/src/extensions/recommendations.ts +24 -0
- package/src/src/extensions/types.ts +57 -0
- package/src/src/extensions/validation.ts +147 -0
- package/src/src/html/styles-builder/plugin-loader.ts +32 -0
- package/src/src/html/styles-builder/tailwind-plugin-allowlist.ts +51 -0
- package/src/src/modules/react-loader/ssr-module-loader/loader-helpers.ts +37 -0
- package/src/src/modules/react-loader/ssr-module-loader/loader.ts +8 -39
- package/src/src/platform/adapters/fs/veryfront/adapter-helpers.ts +43 -0
- package/src/src/platform/adapters/fs/veryfront/adapter.ts +8 -22
- package/src/src/platform/adapters/fs/veryfront/read-operations-helpers.ts +4 -0
- package/src/src/platform/adapters/fs/veryfront/read-operations.ts +4 -7
- package/src/src/platform/adapters/fs/veryfront/websocket-manager-helpers.ts +73 -0
- package/src/src/platform/adapters/fs/veryfront/websocket-manager.ts +29 -44
- package/src/src/platform/compat/process/command.ts +297 -0
- package/src/src/platform/compat/process/env.ts +227 -0
- package/src/src/platform/compat/process/lifecycle.ts +330 -0
- package/src/src/platform/compat/process/runtime-process.ts +27 -0
- package/src/src/platform/compat/process.ts +37 -870
- package/src/src/platform/index.ts +1 -0
- package/src/src/provider/runtime-loader/provider-endpoints.ts +50 -0
- package/src/src/provider/runtime-loader/provider-request-init.ts +101 -0
- package/src/src/provider/runtime-loader/tool-input-status.ts +210 -0
- package/src/src/provider/runtime-loader.ts +113 -368
- package/src/src/proxy/handler.ts +16 -0
- package/src/src/rendering/orchestrator/pipeline-helpers.ts +35 -0
- package/src/src/rendering/orchestrator/pipeline.ts +8 -35
- package/src/src/routing/api/module-loader/loader-helpers.ts +68 -0
- package/src/src/routing/api/module-loader/loader.ts +8 -65
- package/src/src/server/bootstrap.ts +88 -7
- package/src/src/server/dev-ui/manifest.js +3 -1
- package/src/src/server/handlers/request/api/project-discovery.ts +19 -8
- package/src/src/server/production-server.ts +1 -1
- package/src/src/server/services/rsc/endpoints/rsc-bundles.generated.ts +2 -2
- package/src/src/server/utils/domain-parser.ts +4 -0
- package/src/src/studio/bridge/bridge-bundle.generated.ts +1 -1
- package/src/src/tool/index.ts +1 -0
- package/src/src/tool/types.ts +21 -0
- 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)
|
|
2221
|
-
//
|
|
2222
|
-
// rather than a 400 from the API.
|
|
2223
|
-
if (
|
|
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
|
|
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
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
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
|
-
...(!
|
|
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
|
-
...(!
|
|
2033
|
+
...(!dropSamplingParams && options.presencePenalty !== undefined
|
|
2263
2034
|
? { presence_penalty: options.presencePenalty }
|
|
2264
2035
|
: {}),
|
|
2265
|
-
...(!
|
|
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
|
-
|
|
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
|
-
|
|
3061
|
-
|
|
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
|
-
|
|
3095
|
-
|
|
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
|
-
|
|
3714
|
-
|
|
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
|
-
|
|
3748
|
-
|
|
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
|
-
|
|
3797
|
-
|
|
3798
|
-
|
|
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
|
-
|
|
3831
|
-
|
|
3832
|
-
|
|
3833
|
-
|
|
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
|
-
|
|
3878
|
-
|
|
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
|
-
|
|
3910
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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),
|
package/src/src/proxy/handler.ts
CHANGED
|
@@ -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
|
}
|