@chances-ai/engine 24.0.0
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/dist/agents/discover.d.ts +30 -0
- package/dist/agents/discover.d.ts.map +1 -0
- package/dist/agents/discover.js +183 -0
- package/dist/agents/discover.js.map +1 -0
- package/dist/agents/index.d.ts +20 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +52 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/parse.d.ts +61 -0
- package/dist/agents/parse.d.ts.map +1 -0
- package/dist/agents/parse.js +527 -0
- package/dist/agents/parse.js.map +1 -0
- package/dist/agents/types.d.ts +52 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +8 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/ai/adapters/ai-sdk-stream.d.ts +19 -0
- package/dist/ai/adapters/ai-sdk-stream.d.ts.map +1 -0
- package/dist/ai/adapters/ai-sdk-stream.js +125 -0
- package/dist/ai/adapters/ai-sdk-stream.js.map +1 -0
- package/dist/ai/adapters/ai-sdk.d.ts +56 -0
- package/dist/ai/adapters/ai-sdk.d.ts.map +1 -0
- package/dist/ai/adapters/ai-sdk.js +112 -0
- package/dist/ai/adapters/ai-sdk.js.map +1 -0
- package/dist/ai/adapters/mock.d.ts +13 -0
- package/dist/ai/adapters/mock.d.ts.map +1 -0
- package/dist/ai/adapters/mock.js +54 -0
- package/dist/ai/adapters/mock.js.map +1 -0
- package/dist/ai/adapters/openai-compatible.d.ts +23 -0
- package/dist/ai/adapters/openai-compatible.d.ts.map +1 -0
- package/dist/ai/adapters/openai-compatible.js +45 -0
- package/dist/ai/adapters/openai-compatible.js.map +1 -0
- package/dist/ai/cost.d.ts +3 -0
- package/dist/ai/cost.d.ts.map +1 -0
- package/dist/ai/cost.js +5 -0
- package/dist/ai/cost.js.map +1 -0
- package/dist/ai/index.d.ts +12 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +11 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/known-models.d.ts +20 -0
- package/dist/ai/known-models.d.ts.map +1 -0
- package/dist/ai/known-models.js +129 -0
- package/dist/ai/known-models.js.map +1 -0
- package/dist/ai/registry.d.ts +12 -0
- package/dist/ai/registry.d.ts.map +1 -0
- package/dist/ai/registry.js +24 -0
- package/dist/ai/registry.js.map +1 -0
- package/dist/ai/retry.d.ts +11 -0
- package/dist/ai/retry.d.ts.map +1 -0
- package/dist/ai/retry.js +14 -0
- package/dist/ai/retry.js.map +1 -0
- package/dist/ai/router.d.ts +25 -0
- package/dist/ai/router.d.ts.map +1 -0
- package/dist/ai/router.js +36 -0
- package/dist/ai/router.js.map +1 -0
- package/dist/ai/setup.d.ts +23 -0
- package/dist/ai/setup.d.ts.map +1 -0
- package/dist/ai/setup.js +47 -0
- package/dist/ai/setup.js.map +1 -0
- package/dist/ai/summarizer.d.ts +24 -0
- package/dist/ai/summarizer.d.ts.map +1 -0
- package/dist/ai/summarizer.js +56 -0
- package/dist/ai/summarizer.js.map +1 -0
- package/dist/ai/types.d.ts +83 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +2 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/core/compaction/circuit-breaker.d.ts +32 -0
- package/dist/core/compaction/circuit-breaker.d.ts.map +1 -0
- package/dist/core/compaction/circuit-breaker.js +42 -0
- package/dist/core/compaction/circuit-breaker.js.map +1 -0
- package/dist/core/compaction/compactor.d.ts +75 -0
- package/dist/core/compaction/compactor.d.ts.map +1 -0
- package/dist/core/compaction/compactor.js +261 -0
- package/dist/core/compaction/compactor.js.map +1 -0
- package/dist/core/compaction/estimate.d.ts +39 -0
- package/dist/core/compaction/estimate.d.ts.map +1 -0
- package/dist/core/compaction/estimate.js +74 -0
- package/dist/core/compaction/estimate.js.map +1 -0
- package/dist/core/compaction/index.d.ts +5 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +5 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/prune.d.ts +43 -0
- package/dist/core/compaction/prune.d.ts.map +1 -0
- package/dist/core/compaction/prune.js +51 -0
- package/dist/core/compaction/prune.js.map +1 -0
- package/dist/core/engine.d.ts +268 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +767 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/task-tool.d.ts +175 -0
- package/dist/core/task-tool.d.ts.map +1 -0
- package/dist/core/task-tool.js +901 -0
- package/dist/core/task-tool.js.map +1 -0
- package/dist/core/workspace-query.d.ts +83 -0
- package/dist/core/workspace-query.d.ts.map +1 -0
- package/dist/core/workspace-query.js +217 -0
- package/dist/core/workspace-query.js.map +1 -0
- package/dist/core/worktree/active-marker.d.ts +31 -0
- package/dist/core/worktree/active-marker.d.ts.map +1 -0
- package/dist/core/worktree/active-marker.js +109 -0
- package/dist/core/worktree/active-marker.js.map +1 -0
- package/dist/core/worktree/create.d.ts +40 -0
- package/dist/core/worktree/create.d.ts.map +1 -0
- package/dist/core/worktree/create.js +121 -0
- package/dist/core/worktree/create.js.map +1 -0
- package/dist/core/worktree/errors.d.ts +7 -0
- package/dist/core/worktree/errors.d.ts.map +1 -0
- package/dist/core/worktree/errors.js +11 -0
- package/dist/core/worktree/errors.js.map +1 -0
- package/dist/core/worktree/gc.d.ts +39 -0
- package/dist/core/worktree/gc.d.ts.map +1 -0
- package/dist/core/worktree/gc.js +146 -0
- package/dist/core/worktree/gc.js.map +1 -0
- package/dist/core/worktree/git.d.ts +53 -0
- package/dist/core/worktree/git.d.ts.map +1 -0
- package/dist/core/worktree/git.js +166 -0
- package/dist/core/worktree/git.js.map +1 -0
- package/dist/core/worktree/index.d.ts +8 -0
- package/dist/core/worktree/index.d.ts.map +1 -0
- package/dist/core/worktree/index.js +8 -0
- package/dist/core/worktree/index.js.map +1 -0
- package/dist/core/worktree/paths.d.ts +26 -0
- package/dist/core/worktree/paths.d.ts.map +1 -0
- package/dist/core/worktree/paths.js +57 -0
- package/dist/core/worktree/paths.js.map +1 -0
- package/dist/core/worktree/slug.d.ts +6 -0
- package/dist/core/worktree/slug.d.ts.map +1 -0
- package/dist/core/worktree/slug.js +21 -0
- package/dist/core/worktree/slug.js.map +1 -0
- package/dist/local-vault/file-store.d.ts +64 -0
- package/dist/local-vault/file-store.d.ts.map +1 -0
- package/dist/local-vault/file-store.js +225 -0
- package/dist/local-vault/file-store.js.map +1 -0
- package/dist/local-vault/index.d.ts +57 -0
- package/dist/local-vault/index.d.ts.map +1 -0
- package/dist/local-vault/index.js +68 -0
- package/dist/local-vault/index.js.map +1 -0
- package/dist/local-vault/keychain.d.ts +58 -0
- package/dist/local-vault/keychain.d.ts.map +1 -0
- package/dist/local-vault/keychain.js +200 -0
- package/dist/local-vault/keychain.js.map +1 -0
- package/dist/local-vault/mutex.d.ts +20 -0
- package/dist/local-vault/mutex.d.ts.map +1 -0
- package/dist/local-vault/mutex.js +44 -0
- package/dist/local-vault/mutex.js.map +1 -0
- package/dist/local-vault/passphrase.d.ts +30 -0
- package/dist/local-vault/passphrase.d.ts.map +1 -0
- package/dist/local-vault/passphrase.js +72 -0
- package/dist/local-vault/passphrase.js.map +1 -0
- package/dist/lsp/config.d.ts +34 -0
- package/dist/lsp/config.d.ts.map +1 -0
- package/dist/lsp/config.js +68 -0
- package/dist/lsp/config.js.map +1 -0
- package/dist/lsp/detect.d.ts +7 -0
- package/dist/lsp/detect.d.ts.map +1 -0
- package/dist/lsp/detect.js +78 -0
- package/dist/lsp/detect.js.map +1 -0
- package/dist/lsp/errors.d.ts +11 -0
- package/dist/lsp/errors.d.ts.map +1 -0
- package/dist/lsp/errors.js +11 -0
- package/dist/lsp/errors.js.map +1 -0
- package/dist/lsp/formatters.d.ts +147 -0
- package/dist/lsp/formatters.d.ts.map +1 -0
- package/dist/lsp/formatters.js +259 -0
- package/dist/lsp/formatters.js.map +1 -0
- package/dist/lsp/index.d.ts +31 -0
- package/dist/lsp/index.d.ts.map +1 -0
- package/dist/lsp/index.js +31 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/lsp/instance.d.ts +72 -0
- package/dist/lsp/instance.d.ts.map +1 -0
- package/dist/lsp/instance.js +489 -0
- package/dist/lsp/instance.js.map +1 -0
- package/dist/lsp/lazy-load.d.ts +27 -0
- package/dist/lsp/lazy-load.d.ts.map +1 -0
- package/dist/lsp/lazy-load.js +57 -0
- package/dist/lsp/lazy-load.js.map +1 -0
- package/dist/lsp/manager.d.ts +59 -0
- package/dist/lsp/manager.d.ts.map +1 -0
- package/dist/lsp/manager.js +242 -0
- package/dist/lsp/manager.js.map +1 -0
- package/dist/lsp/ops.d.ts +13 -0
- package/dist/lsp/ops.d.ts.map +1 -0
- package/dist/lsp/ops.js +225 -0
- package/dist/lsp/ops.js.map +1 -0
- package/dist/lsp/rpc.d.ts +47 -0
- package/dist/lsp/rpc.d.ts.map +1 -0
- package/dist/lsp/rpc.js +134 -0
- package/dist/lsp/rpc.js.map +1 -0
- package/dist/lsp/safe-uri.d.ts +18 -0
- package/dist/lsp/safe-uri.d.ts.map +1 -0
- package/dist/lsp/safe-uri.js +96 -0
- package/dist/lsp/safe-uri.js.map +1 -0
- package/dist/lsp/types.d.ts +70 -0
- package/dist/lsp/types.d.ts.map +1 -0
- package/dist/lsp/types.js +16 -0
- package/dist/lsp/types.js.map +1 -0
- package/dist/mcp/bridge.d.ts +57 -0
- package/dist/mcp/bridge.d.ts.map +1 -0
- package/dist/mcp/bridge.js +98 -0
- package/dist/mcp/bridge.js.map +1 -0
- package/dist/mcp/category.d.ts +22 -0
- package/dist/mcp/category.d.ts.map +1 -0
- package/dist/mcp/category.js +11 -0
- package/dist/mcp/category.js.map +1 -0
- package/dist/mcp/client.d.ts +228 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +352 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/content.d.ts +86 -0
- package/dist/mcp/content.d.ts.map +1 -0
- package/dist/mcp/content.js +147 -0
- package/dist/mcp/content.js.map +1 -0
- package/dist/mcp/env.d.ts +19 -0
- package/dist/mcp/env.d.ts.map +1 -0
- package/dist/mcp/env.js +50 -0
- package/dist/mcp/env.js.map +1 -0
- package/dist/mcp/host.d.ts +199 -0
- package/dist/mcp/host.d.ts.map +1 -0
- package/dist/mcp/host.js +530 -0
- package/dist/mcp/host.js.map +1 -0
- package/dist/mcp/index.d.ts +18 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +17 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/load-mcp-host.d.ts +32 -0
- package/dist/mcp/load-mcp-host.d.ts.map +1 -0
- package/dist/mcp/load-mcp-host.js +49 -0
- package/dist/mcp/load-mcp-host.js.map +1 -0
- package/dist/mcp/oauth/callback-server.d.ts +73 -0
- package/dist/mcp/oauth/callback-server.d.ts.map +1 -0
- package/dist/mcp/oauth/callback-server.js +280 -0
- package/dist/mcp/oauth/callback-server.js.map +1 -0
- package/dist/mcp/oauth/config-hash.d.ts +24 -0
- package/dist/mcp/oauth/config-hash.d.ts.map +1 -0
- package/dist/mcp/oauth/config-hash.js +55 -0
- package/dist/mcp/oauth/config-hash.js.map +1 -0
- package/dist/mcp/oauth/error-normalize.d.ts +39 -0
- package/dist/mcp/oauth/error-normalize.d.ts.map +1 -0
- package/dist/mcp/oauth/error-normalize.js +91 -0
- package/dist/mcp/oauth/error-normalize.js.map +1 -0
- package/dist/mcp/oauth/provider.d.ts +190 -0
- package/dist/mcp/oauth/provider.d.ts.map +1 -0
- package/dist/mcp/oauth/provider.js +305 -0
- package/dist/mcp/oauth/provider.js.map +1 -0
- package/dist/mcp/oauth/refresh-coalescer.d.ts +46 -0
- package/dist/mcp/oauth/refresh-coalescer.d.ts.map +1 -0
- package/dist/mcp/oauth/refresh-coalescer.js +77 -0
- package/dist/mcp/oauth/refresh-coalescer.js.map +1 -0
- package/dist/mcp/oauth/sdk-shapes.d.ts +77 -0
- package/dist/mcp/oauth/sdk-shapes.d.ts.map +1 -0
- package/dist/mcp/oauth/sdk-shapes.js +21 -0
- package/dist/mcp/oauth/sdk-shapes.js.map +1 -0
- package/dist/mcp/parse.d.ts +28 -0
- package/dist/mcp/parse.d.ts.map +1 -0
- package/dist/mcp/parse.js +209 -0
- package/dist/mcp/parse.js.map +1 -0
- package/dist/mcp/prompts.d.ts +31 -0
- package/dist/mcp/prompts.d.ts.map +1 -0
- package/dist/mcp/prompts.js +71 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/redact.d.ts +62 -0
- package/dist/mcp/redact.d.ts.map +1 -0
- package/dist/mcp/redact.js +87 -0
- package/dist/mcp/redact.js.map +1 -0
- package/dist/mcp/resources.d.ts +70 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +170 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/types.d.ts +123 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/memory/frontmatter.d.ts +18 -0
- package/dist/memory/frontmatter.d.ts.map +1 -0
- package/dist/memory/frontmatter.js +81 -0
- package/dist/memory/frontmatter.js.map +1 -0
- package/dist/memory/index.d.ts +5 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +5 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/store.d.ts +44 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +237 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/tools.d.ts +11 -0
- package/dist/memory/tools.d.ts.map +1 -0
- package/dist/memory/tools.js +159 -0
- package/dist/memory/tools.js.map +1 -0
- package/dist/memory/types.d.ts +32 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +20 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/plugin-api/index.d.ts +167 -0
- package/dist/plugin-api/index.d.ts.map +1 -0
- package/dist/plugin-api/index.js +151 -0
- package/dist/plugin-api/index.js.map +1 -0
- package/dist/plugin-logger/index.d.ts +21 -0
- package/dist/plugin-logger/index.d.ts.map +1 -0
- package/dist/plugin-logger/index.js +59 -0
- package/dist/plugin-logger/index.js.map +1 -0
- package/dist/session/index.d.ts +125 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +202 -0
- package/dist/session/index.js.map +1 -0
- package/dist/tools/approval.d.ts +33 -0
- package/dist/tools/approval.d.ts.map +1 -0
- package/dist/tools/approval.js +53 -0
- package/dist/tools/approval.js.map +1 -0
- package/dist/tools/builtins/_shared.d.ts +94 -0
- package/dist/tools/builtins/_shared.d.ts.map +1 -0
- package/dist/tools/builtins/_shared.js +246 -0
- package/dist/tools/builtins/_shared.js.map +1 -0
- package/dist/tools/builtins/ask-user-question.d.ts +27 -0
- package/dist/tools/builtins/ask-user-question.d.ts.map +1 -0
- package/dist/tools/builtins/ask-user-question.js +191 -0
- package/dist/tools/builtins/ask-user-question.js.map +1 -0
- package/dist/tools/builtins/bash.d.ts +3 -0
- package/dist/tools/builtins/bash.d.ts.map +1 -0
- package/dist/tools/builtins/bash.js +158 -0
- package/dist/tools/builtins/bash.js.map +1 -0
- package/dist/tools/builtins/diff.d.ts +3 -0
- package/dist/tools/builtins/diff.d.ts.map +1 -0
- package/dist/tools/builtins/diff.js +83 -0
- package/dist/tools/builtins/diff.js.map +1 -0
- package/dist/tools/builtins/edit.d.ts +3 -0
- package/dist/tools/builtins/edit.d.ts.map +1 -0
- package/dist/tools/builtins/edit.js +40 -0
- package/dist/tools/builtins/edit.js.map +1 -0
- package/dist/tools/builtins/glob.d.ts +3 -0
- package/dist/tools/builtins/glob.d.ts.map +1 -0
- package/dist/tools/builtins/glob.js +37 -0
- package/dist/tools/builtins/glob.js.map +1 -0
- package/dist/tools/builtins/grep.d.ts +3 -0
- package/dist/tools/builtins/grep.d.ts.map +1 -0
- package/dist/tools/builtins/grep.js +81 -0
- package/dist/tools/builtins/grep.js.map +1 -0
- package/dist/tools/builtins/lsp.d.ts +3 -0
- package/dist/tools/builtins/lsp.d.ts.map +1 -0
- package/dist/tools/builtins/lsp.js +102 -0
- package/dist/tools/builtins/lsp.js.map +1 -0
- package/dist/tools/builtins/pty.d.ts +64 -0
- package/dist/tools/builtins/pty.d.ts.map +1 -0
- package/dist/tools/builtins/pty.js +536 -0
- package/dist/tools/builtins/pty.js.map +1 -0
- package/dist/tools/builtins/read.d.ts +3 -0
- package/dist/tools/builtins/read.d.ts.map +1 -0
- package/dist/tools/builtins/read.js +18 -0
- package/dist/tools/builtins/read.js.map +1 -0
- package/dist/tools/builtins/web-fetch.d.ts +4 -0
- package/dist/tools/builtins/web-fetch.d.ts.map +1 -0
- package/dist/tools/builtins/web-fetch.js +353 -0
- package/dist/tools/builtins/web-fetch.js.map +1 -0
- package/dist/tools/builtins/write.d.ts +3 -0
- package/dist/tools/builtins/write.d.ts.map +1 -0
- package/dist/tools/builtins/write.js +48 -0
- package/dist/tools/builtins/write.js.map +1 -0
- package/dist/tools/builtins.d.ts +9 -0
- package/dist/tools/builtins.d.ts.map +1 -0
- package/dist/tools/builtins.js +29 -0
- package/dist/tools/builtins.js.map +1 -0
- package/dist/tools/diff.d.ts +18 -0
- package/dist/tools/diff.d.ts.map +1 -0
- package/dist/tools/diff.js +57 -0
- package/dist/tools/diff.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +9 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/permission.d.ts +120 -0
- package/dist/tools/permission.d.ts.map +1 -0
- package/dist/tools/permission.js +208 -0
- package/dist/tools/permission.js.map +1 -0
- package/dist/tools/registry.d.ts +12 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +19 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +244 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +15 -0
- package/dist/tools/types.js.map +1 -0
- package/package.json +109 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { createId } from "@chances-ai/runtime";
|
|
2
|
+
/** Normalize SDK-delivered tool args (typed `unknown`) into a guaranteed
|
|
3
|
+
* JSON-safe `JSONValue` before they cross into the engine/session (codex R2
|
|
4
|
+
* Q5 — the previous `as JSONValue` cast was unsound). A JSON round-trip drops
|
|
5
|
+
* functions/symbols/`undefined` and rejects cycles; non-serializable input
|
|
6
|
+
* degrades to `{}` rather than leaking a non-JSON value downstream. */
|
|
7
|
+
function toJsonArgs(x) {
|
|
8
|
+
if (x === undefined || x === null)
|
|
9
|
+
return {};
|
|
10
|
+
try {
|
|
11
|
+
return JSON.parse(JSON.stringify(x));
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Streams a chat request through any Vercel AI SDK language model. Both
|
|
19
|
+
* {@link AiSdkAdapter} (native @ai-sdk/* providers) and
|
|
20
|
+
* {@link OpenAICompatibleAdapter} (createOpenAICompatible-backed providers)
|
|
21
|
+
* call into this so the normalization → ProviderEvent mapping lives in one
|
|
22
|
+
* place.
|
|
23
|
+
*
|
|
24
|
+
* `model` is typed as `unknown` because the AI SDK module is dynamic-imported
|
|
25
|
+
* and we don't pin its type surface here; callers pass through whatever
|
|
26
|
+
* `streamText({ model })` accepts at their installed version.
|
|
27
|
+
*
|
|
28
|
+
* `loadAi` is a test-only seam — the adapters thread their own
|
|
29
|
+
* `__loadSdkModuleForTest` through it so an end-to-end test can drive the
|
|
30
|
+
* streaming-error redaction path without depending on the real `ai`
|
|
31
|
+
* package's internals. Production callers omit it and pay one `import("ai")`.
|
|
32
|
+
*/
|
|
33
|
+
export async function* streamFromAiSdk(model, req, signal, loadAi = () => import("ai")) {
|
|
34
|
+
const ai = (await loadAi().catch(() => null));
|
|
35
|
+
const streamText = ai?.streamText;
|
|
36
|
+
const jsonSchema = ai?.jsonSchema;
|
|
37
|
+
if (typeof streamText !== "function" || typeof jsonSchema !== "function") {
|
|
38
|
+
yield {
|
|
39
|
+
type: "error",
|
|
40
|
+
message: ai
|
|
41
|
+
? "The 'ai' package is installed but incompatible (missing streamText/jsonSchema)"
|
|
42
|
+
: "The 'ai' package is not installed",
|
|
43
|
+
};
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const tools = Object.fromEntries(req.tools.map((t) => [
|
|
47
|
+
t.name,
|
|
48
|
+
{ description: t.description, parameters: jsonSchema(t.parameters) },
|
|
49
|
+
]));
|
|
50
|
+
let result;
|
|
51
|
+
try {
|
|
52
|
+
result = streamText({
|
|
53
|
+
model,
|
|
54
|
+
system: req.system,
|
|
55
|
+
messages: req.messages.map(toCoreMessage),
|
|
56
|
+
tools,
|
|
57
|
+
abortSignal: signal,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
yield { type: "error", message: err instanceof Error ? err.message : String(err) };
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
for await (const part of result.fullStream) {
|
|
66
|
+
switch (part.type) {
|
|
67
|
+
case "text-delta":
|
|
68
|
+
yield { type: "text-delta", text: part.text ?? part.textDelta ?? "" };
|
|
69
|
+
break;
|
|
70
|
+
case "tool-call":
|
|
71
|
+
yield {
|
|
72
|
+
type: "tool-call",
|
|
73
|
+
call: {
|
|
74
|
+
callId: part.toolCallId ?? createId("call"),
|
|
75
|
+
name: part.toolName ?? "",
|
|
76
|
+
args: toJsonArgs(part.args ?? part.input),
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
break;
|
|
80
|
+
case "finish": {
|
|
81
|
+
const u = part.usage ?? {};
|
|
82
|
+
yield {
|
|
83
|
+
type: "usage",
|
|
84
|
+
usage: {
|
|
85
|
+
inputTokens: u.inputTokens ?? u.promptTokens ?? 0,
|
|
86
|
+
outputTokens: u.outputTokens ?? u.completionTokens ?? 0,
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case "error":
|
|
92
|
+
yield { type: "error", message: String(part.error ?? "provider error") };
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
yield { type: "error", message: err instanceof Error ? err.message : String(err) };
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
yield { type: "done" };
|
|
102
|
+
}
|
|
103
|
+
function toCoreMessage(m) {
|
|
104
|
+
if (m.role === "tool") {
|
|
105
|
+
return {
|
|
106
|
+
role: "tool",
|
|
107
|
+
content: m.content
|
|
108
|
+
.filter((c) => c.type === "tool-result")
|
|
109
|
+
.map((c) => {
|
|
110
|
+
const r = c;
|
|
111
|
+
return { type: "tool-result", toolCallId: r.callId, toolName: r.name, result: r.output };
|
|
112
|
+
}),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (m.role === "assistant") {
|
|
116
|
+
return {
|
|
117
|
+
role: "assistant",
|
|
118
|
+
content: m.content.map((c) => c.type === "tool-call"
|
|
119
|
+
? { type: "tool-call", toolCallId: c.callId, toolName: c.name, args: c.args }
|
|
120
|
+
: { type: "text", text: c.type === "text" ? c.text : "" }),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return { role: m.role, content: m.content.map((c) => (c.type === "text" ? c.text : "")).join("") };
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=ai-sdk-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-sdk-stream.js","sourceRoot":"","sources":["../../../src/ai/adapters/ai-sdk-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ChatRequest, ModelDescriptor, ProviderAdapter, ProviderEvent } from "../types.js";
|
|
2
|
+
export type AiSdkProvider = "anthropic" | "openai" | "google";
|
|
3
|
+
/** Maps native AI-SDK providers to the npm package each one needs. Exported
|
|
4
|
+
* so the diagnostic in {@link AiSdkAdapter.createModel} and tests share one
|
|
5
|
+
* source of truth — keep this in sync with `packages/ai/package.json`'s
|
|
6
|
+
* `peerDependencies`. */
|
|
7
|
+
export declare const AI_SDK_PACKAGES: Record<AiSdkProvider, string>;
|
|
8
|
+
export interface AiSdkAdapterOptions {
|
|
9
|
+
/** Provider id — one of the natively-supported AI SDK families. */
|
|
10
|
+
provider: AiSdkProvider;
|
|
11
|
+
apiKey: string;
|
|
12
|
+
models: ModelDescriptor[];
|
|
13
|
+
/**
|
|
14
|
+
* @internal Test-only seam. Production code leaves this undefined and the
|
|
15
|
+
* adapter uses the native `import()` of the package name in
|
|
16
|
+
* {@link AI_SDK_PACKAGES}. Tests inject a stub to simulate a missing peer
|
|
17
|
+
* dependency or return a mocked SDK module without hitting npm. The
|
|
18
|
+
* double-underscore + `ForTest` suffix is the convention to discourage
|
|
19
|
+
* non-test use; the field is intentionally not surfaced anywhere in the
|
|
20
|
+
* CLI or config path.
|
|
21
|
+
*/
|
|
22
|
+
__loadSdkModuleForTest?: (specifier: string) => Promise<unknown>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Adapter pattern over the Vercel AI SDK for providers that have their own
|
|
26
|
+
* `@ai-sdk/<vendor>` package (anthropic / openai / google). Providers that
|
|
27
|
+
* only expose OpenAI-compatible endpoints — including all five Chinese
|
|
28
|
+
* providers — go through {@link OpenAICompatibleAdapter} instead, sharing
|
|
29
|
+
* one adapter class.
|
|
30
|
+
*
|
|
31
|
+
* The SDK module is imported dynamically and typed loosely so the package
|
|
32
|
+
* builds even when `ai` / `@ai-sdk/*` isn't installed, and so minor AI-SDK
|
|
33
|
+
* version drift can't break the typecheck of the whole monorepo. A missing
|
|
34
|
+
* peer-dependency surfaces as a `provider:error` event carrying a concrete
|
|
35
|
+
* install hint — the old behavior was a misleading "Unknown provider".
|
|
36
|
+
*/
|
|
37
|
+
export declare class AiSdkAdapter implements ProviderAdapter {
|
|
38
|
+
private readonly opts;
|
|
39
|
+
readonly id: string;
|
|
40
|
+
constructor(opts: AiSdkAdapterOptions);
|
|
41
|
+
listModels(): ModelDescriptor[];
|
|
42
|
+
stream(req: ChatRequest, signal: AbortSignal): AsyncIterable<ProviderEvent>;
|
|
43
|
+
private createModel;
|
|
44
|
+
}
|
|
45
|
+
/** Replaces every occurrence of `apiKey` in `message` with `[REDACTED]`.
|
|
46
|
+
* No-op when the key is empty / shorter than 8 chars (avoids redacting
|
|
47
|
+
* innocuous test fixtures like `""` or `"sk"` that could substring-match
|
|
48
|
+
* real prose). Exact-string match, not regex, so a key containing regex
|
|
49
|
+
* metacharacters can't blow up. Exported so OpenAICompatibleAdapter
|
|
50
|
+
* shares one redactor. */
|
|
51
|
+
export declare function redact(message: string, apiKey: string): string;
|
|
52
|
+
/** Pipes a ProviderEvent stream through {@link redact} for every `error`
|
|
53
|
+
* event's `message`. Other event types pass through unchanged so streaming
|
|
54
|
+
* remains zero-copy for the hot path (text-delta / tool-call / usage). */
|
|
55
|
+
export declare function redactStream(source: AsyncIterable<ProviderEvent>, apiKey: string): AsyncIterable<ProviderEvent>;
|
|
56
|
+
//# sourceMappingURL=ai-sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-sdk.d.ts","sourceRoot":"","sources":["../../../src/ai/adapters/ai-sdk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,eAAe,EACf,aAAa,EACd,MAAM,aAAa,CAAC;AAGrB,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9D;;;yBAGyB;AACzB,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAIzD,CAAC;AAoBF,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B;;;;;;;;OAQG;IACH,sBAAsB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAClE;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAa,YAAW,eAAe;IAGtC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;gBAES,IAAI,EAAE,mBAAmB;IAItD,UAAU,IAAI,eAAe,EAAE;IAIxB,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,aAAa,CAAC,aAAa,CAAC;YAuBpE,WAAW;CAyB1B;AAED;;;;;2BAK2B;AAC3B,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED;;2EAE2E;AAC3E,wBAAuB,YAAY,CACjC,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,EACpC,MAAM,EAAE,MAAM,GACb,aAAa,CAAC,aAAa,CAAC,CAQ9B"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { streamFromAiSdk } from "./ai-sdk-stream.js";
|
|
2
|
+
/** Maps native AI-SDK providers to the npm package each one needs. Exported
|
|
3
|
+
* so the diagnostic in {@link AiSdkAdapter.createModel} and tests share one
|
|
4
|
+
* source of truth — keep this in sync with `packages/ai/package.json`'s
|
|
5
|
+
* `peerDependencies`. */
|
|
6
|
+
export const AI_SDK_PACKAGES = {
|
|
7
|
+
anthropic: "@ai-sdk/anthropic",
|
|
8
|
+
openai: "@ai-sdk/openai",
|
|
9
|
+
google: "@ai-sdk/google",
|
|
10
|
+
};
|
|
11
|
+
/** Provider → the SDK factory export it must expose. */
|
|
12
|
+
const FACTORY_NAMES = {
|
|
13
|
+
anthropic: "createAnthropic",
|
|
14
|
+
openai: "createOpenAI",
|
|
15
|
+
google: "createGoogleGenerativeAI",
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Adapter pattern over the Vercel AI SDK for providers that have their own
|
|
19
|
+
* `@ai-sdk/<vendor>` package (anthropic / openai / google). Providers that
|
|
20
|
+
* only expose OpenAI-compatible endpoints — including all five Chinese
|
|
21
|
+
* providers — go through {@link OpenAICompatibleAdapter} instead, sharing
|
|
22
|
+
* one adapter class.
|
|
23
|
+
*
|
|
24
|
+
* The SDK module is imported dynamically and typed loosely so the package
|
|
25
|
+
* builds even when `ai` / `@ai-sdk/*` isn't installed, and so minor AI-SDK
|
|
26
|
+
* version drift can't break the typecheck of the whole monorepo. A missing
|
|
27
|
+
* peer-dependency surfaces as a `provider:error` event carrying a concrete
|
|
28
|
+
* install hint — the old behavior was a misleading "Unknown provider".
|
|
29
|
+
*/
|
|
30
|
+
export class AiSdkAdapter {
|
|
31
|
+
opts;
|
|
32
|
+
id;
|
|
33
|
+
constructor(opts) {
|
|
34
|
+
this.opts = opts;
|
|
35
|
+
this.id = opts.provider;
|
|
36
|
+
}
|
|
37
|
+
listModels() {
|
|
38
|
+
return this.opts.models;
|
|
39
|
+
}
|
|
40
|
+
async *stream(req, signal) {
|
|
41
|
+
let model;
|
|
42
|
+
try {
|
|
43
|
+
model = await this.createModel(req.model);
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
47
|
+
yield { type: "error", message: redact(message, this.opts.apiKey) };
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (!model) {
|
|
51
|
+
yield { type: "error", message: `Unknown provider: ${this.opts.provider}` };
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Redact the api key from EVERY downstream error too — streamFromAiSdk
|
|
55
|
+
// wraps `ai.streamText()` / `fullStream` whose errors come straight from
|
|
56
|
+
// the SDK and could in principle echo request headers / auth. Defense in
|
|
57
|
+
// depth: scrub at the adapter boundary regardless of source.
|
|
58
|
+
const loadAi = this.opts.__loadSdkModuleForTest
|
|
59
|
+
? () => this.opts.__loadSdkModuleForTest("ai")
|
|
60
|
+
: undefined;
|
|
61
|
+
yield* redactStream(streamFromAiSdk(model, req, signal, loadAi), this.opts.apiKey);
|
|
62
|
+
}
|
|
63
|
+
async createModel(modelId) {
|
|
64
|
+
const pkg = AI_SDK_PACKAGES[this.opts.provider];
|
|
65
|
+
if (!pkg)
|
|
66
|
+
return null;
|
|
67
|
+
const load = this.opts.__loadSdkModuleForTest ?? ((specifier) => import(specifier));
|
|
68
|
+
let mod;
|
|
69
|
+
try {
|
|
70
|
+
mod = (await load(pkg));
|
|
71
|
+
}
|
|
72
|
+
catch (cause) {
|
|
73
|
+
const reason = cause instanceof Error ? cause.message : String(cause);
|
|
74
|
+
throw new Error(`Provider '${this.opts.provider}' requires the '${pkg}' npm package to be installed. It is declared as an optional peer dependency of @chances-ai/ai. Install it with the package manager you use (e.g. \`bun add ${pkg}\`, \`npm i ${pkg}\`, \`pnpm add ${pkg}\`). (underlying: ${reason})`);
|
|
75
|
+
}
|
|
76
|
+
// Resolve the provider's factory by name. If the module loaded but lacks
|
|
77
|
+
// the expected `create…` export, surface a clear named error (better than
|
|
78
|
+
// the bare "x is not a function" TypeError the untyped code relied on) —
|
|
79
|
+
// it bubbles to the stream's outer try/catch as an error event.
|
|
80
|
+
const factoryName = FACTORY_NAMES[this.opts.provider];
|
|
81
|
+
const factory = mod[factoryName];
|
|
82
|
+
if (typeof factory !== "function") {
|
|
83
|
+
throw new Error(`Provider '${this.opts.provider}' module '${pkg}' does not expose ${factoryName}.`);
|
|
84
|
+
}
|
|
85
|
+
return factory({ apiKey: this.opts.apiKey })(modelId);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** Replaces every occurrence of `apiKey` in `message` with `[REDACTED]`.
|
|
89
|
+
* No-op when the key is empty / shorter than 8 chars (avoids redacting
|
|
90
|
+
* innocuous test fixtures like `""` or `"sk"` that could substring-match
|
|
91
|
+
* real prose). Exact-string match, not regex, so a key containing regex
|
|
92
|
+
* metacharacters can't blow up. Exported so OpenAICompatibleAdapter
|
|
93
|
+
* shares one redactor. */
|
|
94
|
+
export function redact(message, apiKey) {
|
|
95
|
+
if (!apiKey || apiKey.length < 8)
|
|
96
|
+
return message;
|
|
97
|
+
return message.split(apiKey).join("[REDACTED]");
|
|
98
|
+
}
|
|
99
|
+
/** Pipes a ProviderEvent stream through {@link redact} for every `error`
|
|
100
|
+
* event's `message`. Other event types pass through unchanged so streaming
|
|
101
|
+
* remains zero-copy for the hot path (text-delta / tool-call / usage). */
|
|
102
|
+
export async function* redactStream(source, apiKey) {
|
|
103
|
+
for await (const ev of source) {
|
|
104
|
+
if (ev.type === "error") {
|
|
105
|
+
yield { type: "error", message: redact(ev.message, apiKey) };
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
yield ev;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=ai-sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-sdk.js","sourceRoot":"","sources":["../../../src/ai/adapters/ai-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ChatRequest, ModelDescriptor, ProviderAdapter, ProviderEvent } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Deterministic, offline provider used as the default in dev/tests. It drives
|
|
4
|
+
* the full agent loop without network or API keys:
|
|
5
|
+
* - "read <path>" -> issues a `read` tool call, then summarizes the result
|
|
6
|
+
* - otherwise -> streams a short echo response
|
|
7
|
+
*/
|
|
8
|
+
export declare class MockAdapter implements ProviderAdapter {
|
|
9
|
+
readonly id = "mock";
|
|
10
|
+
listModels(): ModelDescriptor[];
|
|
11
|
+
stream(req: ChatRequest, _signal: AbortSignal): AsyncIterable<ProviderEvent>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../../src/ai/adapters/mock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EAEX,eAAe,EACf,eAAe,EACf,aAAa,EACd,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,eAAe;IACjD,QAAQ,CAAC,EAAE,UAAU;IAErB,UAAU,IAAI,eAAe,EAAE;IAexB,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,GAAG,aAAa,CAAC,aAAa,CAAC;CAwBpF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { createId } from "@chances-ai/runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Deterministic, offline provider used as the default in dev/tests. It drives
|
|
4
|
+
* the full agent loop without network or API keys:
|
|
5
|
+
* - "read <path>" -> issues a `read` tool call, then summarizes the result
|
|
6
|
+
* - otherwise -> streams a short echo response
|
|
7
|
+
*/
|
|
8
|
+
export class MockAdapter {
|
|
9
|
+
id = "mock";
|
|
10
|
+
listModels() {
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
id: "mock-1",
|
|
14
|
+
provider: "mock",
|
|
15
|
+
api: "openai",
|
|
16
|
+
contextWindow: 200_000,
|
|
17
|
+
supportsTools: true,
|
|
18
|
+
supportsVision: false,
|
|
19
|
+
inputCostPerMTok: 0,
|
|
20
|
+
outputCostPerMTok: 0,
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
}
|
|
24
|
+
async *stream(req, _signal) {
|
|
25
|
+
const lastUser = [...req.messages].reverse().find((m) => m.role === "user");
|
|
26
|
+
const text = lastUser ? textOf(lastUser.content) : "";
|
|
27
|
+
const alreadyHasToolResult = req.messages.some((m) => m.content.some((c) => c.type === "tool-result"));
|
|
28
|
+
const readMatch = /^\s*read\s+(\S+)/i.exec(text);
|
|
29
|
+
if (readMatch && !alreadyHasToolResult && req.tools.some((t) => t.name === "read")) {
|
|
30
|
+
yield { type: "tool-call", call: { callId: createId("call"), name: "read", args: { path: readMatch[1] } } };
|
|
31
|
+
yield { type: "usage", usage: { inputTokens: estimate(text), outputTokens: 4 } };
|
|
32
|
+
yield { type: "done" };
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const reply = alreadyHasToolResult
|
|
36
|
+
? `Done — I read the file you asked for.`
|
|
37
|
+
: `You said: ${text || "(nothing)"}`;
|
|
38
|
+
for (const chunk of reply.match(/.{1,12}/g) ?? [reply]) {
|
|
39
|
+
yield { type: "text-delta", text: chunk };
|
|
40
|
+
}
|
|
41
|
+
yield { type: "usage", usage: { inputTokens: estimate(text), outputTokens: estimate(reply) } };
|
|
42
|
+
yield { type: "done" };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function textOf(content) {
|
|
46
|
+
return content
|
|
47
|
+
.filter((c) => c.type === "text")
|
|
48
|
+
.map((c) => c.text)
|
|
49
|
+
.join("");
|
|
50
|
+
}
|
|
51
|
+
function estimate(s) {
|
|
52
|
+
return Math.max(1, Math.ceil(s.length / 4));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../../src/ai/adapters/mock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ChatRequest, ModelDescriptor, ProviderAdapter, ProviderEvent } from "../types.js";
|
|
2
|
+
export interface OpenAICompatibleAdapterOptions {
|
|
3
|
+
/** Provider id, e.g. "deepseek" or "xai". Becomes the adapter id. */
|
|
4
|
+
provider: string;
|
|
5
|
+
/** API endpoint, e.g. https://api.deepseek.com. */
|
|
6
|
+
baseURL: string;
|
|
7
|
+
apiKey: string;
|
|
8
|
+
models: ModelDescriptor[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* One adapter, many OpenAI-compatible providers (deepseek / doubao / minimax /
|
|
12
|
+
* glm / kimi + xai / groq / openrouter). Parameterised by `baseURL` + `apiKey`
|
|
13
|
+
* — `@ai-sdk/openai-compatible` is dynamic-imported, so the package
|
|
14
|
+
* type-checks even when it isn't installed.
|
|
15
|
+
*/
|
|
16
|
+
export declare class OpenAICompatibleAdapter implements ProviderAdapter {
|
|
17
|
+
private readonly opts;
|
|
18
|
+
readonly id: string;
|
|
19
|
+
constructor(opts: OpenAICompatibleAdapterOptions);
|
|
20
|
+
listModels(): ModelDescriptor[];
|
|
21
|
+
stream(req: ChatRequest, signal: AbortSignal): AsyncIterable<ProviderEvent>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=openai-compatible.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-compatible.d.ts","sourceRoot":"","sources":["../../../src/ai/adapters/openai-compatible.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,eAAe,EACf,aAAa,EACd,MAAM,aAAa,CAAC;AAIrB,MAAM,WAAW,8BAA8B;IAC7C,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED;;;;;GAKG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAGjD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;gBAES,IAAI,EAAE,8BAA8B;IAIjE,UAAU,IAAI,eAAe,EAAE;IAIxB,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,aAAa,CAAC,aAAa,CAAC;CAgCnF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { streamFromAiSdk } from "./ai-sdk-stream.js";
|
|
2
|
+
import { redact, redactStream } from "./ai-sdk.js";
|
|
3
|
+
/**
|
|
4
|
+
* One adapter, many OpenAI-compatible providers (deepseek / doubao / minimax /
|
|
5
|
+
* glm / kimi + xai / groq / openrouter). Parameterised by `baseURL` + `apiKey`
|
|
6
|
+
* — `@ai-sdk/openai-compatible` is dynamic-imported, so the package
|
|
7
|
+
* type-checks even when it isn't installed.
|
|
8
|
+
*/
|
|
9
|
+
export class OpenAICompatibleAdapter {
|
|
10
|
+
opts;
|
|
11
|
+
id;
|
|
12
|
+
constructor(opts) {
|
|
13
|
+
this.opts = opts;
|
|
14
|
+
this.id = opts.provider;
|
|
15
|
+
}
|
|
16
|
+
listModels() {
|
|
17
|
+
return this.opts.models;
|
|
18
|
+
}
|
|
19
|
+
async *stream(req, signal) {
|
|
20
|
+
const compat = (await import("@ai-sdk/openai-compatible").catch(() => null));
|
|
21
|
+
const create = compat?.createOpenAICompatible;
|
|
22
|
+
if (!create) {
|
|
23
|
+
yield { type: "error", message: "@ai-sdk/openai-compatible is not installed" };
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
let provider;
|
|
27
|
+
try {
|
|
28
|
+
provider = create({
|
|
29
|
+
name: this.opts.provider,
|
|
30
|
+
baseURL: this.opts.baseURL,
|
|
31
|
+
apiKey: this.opts.apiKey,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
36
|
+
yield { type: "error", message: redact(message, this.opts.apiKey) };
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Redact downstream stream errors too — same defense-in-depth posture as
|
|
40
|
+
// AiSdkAdapter. We pass `apiKey` into a third-party constructor, so any
|
|
41
|
+
// future SDK that echoes the key on throw shouldn't reach the bus.
|
|
42
|
+
yield* redactStream(streamFromAiSdk(provider(req.model), req, signal), this.opts.apiKey);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=openai-compatible.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-compatible.js","sourceRoot":"","sources":["../../../src/ai/adapters/openai-compatible.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAWnD;;;;;GAKG;AACH,MAAM,OAAO,uBAAuB;IAGL;IAFpB,EAAE,CAAS;IAEpB,YAA6B,IAAoC;QAApC,SAAI,GAAJ,IAAI,CAAgC;QAC/D,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC1B,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,GAAgB,EAAE,MAAmB;QASjD,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAwB,CAAC;QACpG,MAAM,MAAM,GAAG,MAAM,EAAE,sBAAsB,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,4CAA4C,EAAE,CAAC;YAC/E,OAAO;QACT,CAAC;QACD,IAAI,QAAsC,CAAC;QAC3C,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,CAAC;gBAChB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ;gBACxB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;gBAC1B,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;aACzB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACpE,OAAO;QACT,CAAC;QACD,yEAAyE;QACzE,wEAAwE;QACxE,mEAAmE;QACnE,KAAK,CAAC,CAAC,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3F,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../src/ai/cost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEzD,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAKzE"}
|
package/dist/ai/cost.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/ai/cost.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,KAAsB,EAAE,KAAY;IAC/D,OAAO,CACL,CAAC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,gBAAgB;QACxD,CAAC,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAC3D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type { Role, ContentPart, Message, ToolDefinition, ToolCallRequest, Usage, ApiFamily, ModelDescriptor, ChatRequest, ProviderEvent, ProviderAdapter, } from "./types.js";
|
|
2
|
+
export { ModelRegistry } from "./registry.js";
|
|
3
|
+
export { ModelRouter, type RouteHints, type Route } from "./router.js";
|
|
4
|
+
export { estimateCost } from "./cost.js";
|
|
5
|
+
export { MockAdapter } from "./adapters/mock.js";
|
|
6
|
+
export { AiSdkAdapter, AI_SDK_PACKAGES, type AiSdkAdapterOptions, type AiSdkProvider, } from "./adapters/ai-sdk.js";
|
|
7
|
+
export { OpenAICompatibleAdapter, type OpenAICompatibleAdapterOptions, } from "./adapters/openai-compatible.js";
|
|
8
|
+
export { KNOWN_MODELS, type ProviderEntry } from "./known-models.js";
|
|
9
|
+
export { buildRegistry, envByProviderFrom, type RegistryOptions } from "./setup.js";
|
|
10
|
+
export { classifyProviderError, defaultRetryConfig, type RetryConfig, type RetryDecision, } from "./retry.js";
|
|
11
|
+
export { summarizeConversation, COMPACT_SUMMARY_SYSTEM } from "./summarizer.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,IAAI,EACJ,WAAW,EACX,OAAO,EACP,cAAc,EACd,eAAe,EACf,KAAK,EACL,SAAS,EACT,eAAe,EACf,WAAW,EACX,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,aAAa,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,uBAAuB,EACvB,KAAK,8BAA8B,GACpC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/ai/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { ModelRegistry } from "./registry.js";
|
|
2
|
+
export { ModelRouter } from "./router.js";
|
|
3
|
+
export { estimateCost } from "./cost.js";
|
|
4
|
+
export { MockAdapter } from "./adapters/mock.js";
|
|
5
|
+
export { AiSdkAdapter, AI_SDK_PACKAGES, } from "./adapters/ai-sdk.js";
|
|
6
|
+
export { OpenAICompatibleAdapter, } from "./adapters/openai-compatible.js";
|
|
7
|
+
export { KNOWN_MODELS } from "./known-models.js";
|
|
8
|
+
export { buildRegistry, envByProviderFrom } from "./setup.js";
|
|
9
|
+
export { classifyProviderError, defaultRetryConfig, } from "./retry.js";
|
|
10
|
+
export { summarizeConversation, COMPACT_SUMMARY_SYSTEM } from "./summarizer.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAA+B,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EACL,YAAY,EACZ,eAAe,GAGhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,uBAAuB,GAExB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,YAAY,EAAsB,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAwB,MAAM,YAAY,CAAC;AACpF,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GAGnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ApiFamily, ModelDescriptor } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Per-provider metadata used by `buildRegistry` to wire the right adapter.
|
|
4
|
+
* `models` is the capability table the registry indexes; `envKey` resolves
|
|
5
|
+
* the API key; `baseURL` is required for the `openai-compatible` family
|
|
6
|
+
* (Chinese providers + xai/groq/openrouter) and ignored for the native ones.
|
|
7
|
+
*
|
|
8
|
+
* Prices are USD per 1M tokens and should be reviewed per release.
|
|
9
|
+
* `supportsTools` is per-model — uneven across the OpenAI-compatible set
|
|
10
|
+
* (especially older MiniMax / Kimi). Verify before flipping the flag.
|
|
11
|
+
*/
|
|
12
|
+
export interface ProviderEntry {
|
|
13
|
+
id: string;
|
|
14
|
+
api: ApiFamily;
|
|
15
|
+
envKey: string;
|
|
16
|
+
baseURL?: string;
|
|
17
|
+
models: ModelDescriptor[];
|
|
18
|
+
}
|
|
19
|
+
export declare const KNOWN_MODELS: ProviderEntry[];
|
|
20
|
+
//# sourceMappingURL=known-models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-models.d.ts","sourceRoot":"","sources":["../../src/ai/known-models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7D;;;;;;;;;GASG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,YAAY,EAAE,aAAa,EA4HvC,CAAC"}
|