@poolzin/pool-bot 2026.1.39 → 2026.2.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/assets/chrome-extension/README.md +3 -3
- package/assets/chrome-extension/background.js +5 -5
- package/assets/chrome-extension/manifest.json +3 -3
- package/assets/chrome-extension/options.html +4 -4
- package/assets/chrome-extension/options.js +1 -1
- package/dist/acp/client.js +3 -3
- package/dist/acp/types.js +1 -1
- package/dist/agents/agent-paths.js +3 -3
- package/dist/agents/auth-profiles/paths.js +3 -3
- package/dist/agents/cli-runner/helpers.js +1 -1
- package/dist/agents/cli-runner.js +2 -2
- package/dist/agents/cloudflare-ai-gateway.js +31 -0
- package/dist/agents/compaction.js +16 -2
- package/dist/agents/context-window-guard.js +13 -10
- package/dist/agents/context.js +4 -4
- package/dist/agents/docs-path.js +1 -1
- package/dist/agents/minimax-vlm.js +1 -1
- package/dist/agents/model-auth.js +12 -1
- package/dist/agents/model-catalog.js +4 -4
- package/dist/agents/model-selection.js +10 -4
- package/dist/agents/models-config.js +3 -3
- package/dist/agents/models-config.providers.js +147 -39
- package/dist/agents/pi-embedded-helpers/openai.js +1 -1
- package/dist/agents/pi-embedded-runner/compact.js +8 -8
- package/dist/agents/pi-embedded-runner/model.js +2 -2
- package/dist/agents/pi-embedded-runner/run/attempt.js +6 -6
- package/dist/agents/pi-embedded-runner/run.js +4 -4
- package/dist/agents/pi-embedded-runner/tool-result-truncation.js +275 -0
- package/dist/agents/pi-embedded-runner/utils.js +1 -1
- package/dist/agents/pi-model-discovery.js +10 -0
- package/dist/agents/pi-tool-definition-adapter.js +50 -9
- package/dist/agents/pi-tools.before-tool-call.js +67 -0
- package/dist/agents/pi-tools.js +10 -5
- package/dist/agents/pi-tools.read.js +2 -2
- package/dist/agents/session-file-repair.js +83 -0
- package/dist/agents/session-transcript-repair.js +68 -0
- package/dist/agents/skills/frontmatter.js +1 -1
- package/dist/agents/skills/workspace.js +2 -2
- package/dist/agents/system-prompt.js +28 -4
- package/dist/agents/together-models.js +127 -0
- package/dist/agents/tool-images.js +1 -1
- package/dist/agents/tool-policy.js +1 -1
- package/dist/agents/tools/browser-tool.js +3 -3
- package/dist/agents/tools/image-tool.js +2 -2
- package/dist/agents/tools/memory-tool.js +93 -5
- package/dist/agents/tools/web-search.js +1 -1
- package/dist/auto-reply/commands-registry.data.js +1 -1
- package/dist/auto-reply/reply/commands-context-report.js +2 -2
- package/dist/auto-reply/reply/commands-session.js +2 -2
- package/dist/auto-reply/reply/get-reply-run.js +14 -4
- package/dist/auto-reply/reply/groups.js +1 -1
- package/dist/auto-reply/reply/inbound-context.js +4 -0
- package/dist/auto-reply/reply/inbound-meta.js +130 -0
- package/dist/auto-reply/reply/untrusted-context.js +15 -0
- package/dist/auto-reply/status.js +1 -1
- package/dist/browser/client-fetch.js +1 -1
- package/dist/browser/config.js +1 -1
- package/dist/browser/extension-relay.js +3 -3
- package/dist/browser/server-context.js +2 -2
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui.js +3 -3
- package/dist/channels/plugins/catalog.js +2 -2
- package/dist/channels/plugins/onboarding/imessage.js +1 -1
- package/dist/channels/plugins/onboarding/signal.js +1 -1
- package/dist/channels/plugins/onboarding/slack.js +4 -4
- package/dist/channels/plugins/onboarding/whatsapp.js +3 -3
- package/dist/channels/plugins/pairing-message.js +1 -1
- package/dist/cli/browser-cli-extension.js +2 -2
- package/dist/cli/docs-cli.js +1 -1
- package/dist/cli/gateway-cli/dev.js +1 -1
- package/dist/cli/memory-cli.js +25 -15
- package/dist/cli/nodes-cli/register.canvas.js +1 -1
- package/dist/cli/plugins-cli.js +1 -1
- package/dist/cli/run-main.js +2 -2
- package/dist/cli/security-cli.js +1 -1
- package/dist/cli/tagline.js +1 -1
- package/dist/cli/update-cli.js +4 -4
- package/dist/cli/webhooks-cli.js +5 -5
- package/dist/commands/agents.commands.add.js +1 -1
- package/dist/commands/auth-choice.apply.api-providers.js +305 -17
- package/dist/commands/auth-choice.apply.js +4 -1
- package/dist/commands/auth-choice.apply.plugin-provider.js +2 -2
- package/dist/commands/auth-choice.apply.xai.js +63 -0
- package/dist/commands/auth-choice.preferred-provider.js +7 -1
- package/dist/commands/configure.wizard.js +1 -1
- package/dist/commands/dashboard.js +1 -1
- package/dist/commands/docs.js +1 -1
- package/dist/commands/doctor-gateway-services.js +3 -3
- package/dist/commands/doctor-update.js +3 -3
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/models/list.probe.js +2 -2
- package/dist/commands/models/list.registry.js +4 -4
- package/dist/commands/models/list.status-command.js +2 -2
- package/dist/commands/onboard-auth.config-core.js +366 -28
- package/dist/commands/onboard-auth.credentials.js +71 -9
- package/dist/commands/onboard-auth.js +3 -3
- package/dist/commands/onboard-auth.models.js +26 -24
- package/dist/commands/onboard-non-interactive/local/auth-choice.js +140 -6
- package/dist/commands/status-all/report-lines.js +1 -1
- package/dist/commands/status.command.js +1 -1
- package/dist/commands/uninstall.js +3 -3
- package/dist/compat/legacy-names.js +1 -1
- package/dist/config/io.js +3 -3
- package/dist/config/schema.js +1 -1
- package/dist/config/types.memory.js +1 -0
- package/dist/config/version.js +4 -4
- package/dist/daemon/constants.js +7 -7
- package/dist/daemon/inspect.js +6 -6
- package/dist/daemon/systemd-unit.js +1 -1
- package/dist/gateway/live-image-probe.js +1 -66
- package/dist/gateway/openai-http.js +2 -2
- package/dist/gateway/openresponses-http.js +4 -4
- package/dist/gateway/server-discovery.js +2 -2
- package/dist/gateway/server-http.js +1 -1
- package/dist/gateway/server.impl.js +2 -2
- package/dist/hooks/frontmatter.js +1 -1
- package/dist/hooks/hooks-status.js +1 -1
- package/dist/hooks/install.js +2 -2
- package/dist/hooks/loader.js +1 -1
- package/dist/hooks/workspace.js +3 -3
- package/dist/index.js +2 -2
- package/dist/infra/bonjour.js +3 -3
- package/dist/infra/path-env.js +3 -3
- package/dist/infra/provider-usage.fetch.minimax.js +1 -1
- package/dist/infra/restart.js +1 -1
- package/dist/infra/tailscale.js +1 -1
- package/dist/macos/relay.js +2 -2
- package/dist/media/input-files.js +1 -1
- package/dist/media/mime.js +4 -0
- package/dist/media/png-encode.js +74 -0
- package/dist/media-understanding/providers/image.js +2 -2
- package/dist/memory/backend-config.js +207 -0
- package/dist/memory/embeddings.js +1 -1
- package/dist/memory/manager.js +1 -0
- package/dist/memory/types.js +1 -0
- package/dist/node-host/runner.js +2 -2
- package/dist/pairing/pairing-messages.js +1 -1
- package/dist/plugins/discovery.js +1 -1
- package/dist/plugins/install.js +2 -2
- package/dist/plugins/update.js +1 -1
- package/dist/security/audit.js +2 -2
- package/dist/shared/text/reasoning-tags.js +52 -7
- package/dist/tailscale/detect.js +146 -0
- package/dist/telegram/bot-message-context.js +1 -1
- package/dist/test-helpers/workspace.js +11 -0
- package/dist/test-utils/channel-plugins.js +82 -0
- package/dist/test-utils/ports.js +73 -0
- package/dist/utils/shell-argv.js +61 -0
- package/dist/utils.js +10 -0
- package/dist/web/qr-image.js +1 -61
- package/dist/wizard/onboarding.finalize.js +7 -7
- package/dist/wizard/onboarding.js +3 -3
- package/docs/RELEASE_WORKFOTS_COMPARISON.md +3 -3
- package/docs/_config.yml +2 -2
- package/docs/_layouts/default.html +9 -9
- package/docs/concepts/typebox.md +1 -1
- package/docs/docs.json +1 -1
- package/docs/northflank.mdx +7 -7
- package/docs/railway.mdx +3 -3
- package/docs/render.mdx +5 -5
- package/docs/start/lore.md +2 -2
- package/extensions/bluebubbles/index.ts +2 -2
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/bluebubbles/src/accounts.ts +8 -8
- package/extensions/bluebubbles/src/actions.test.ts +22 -22
- package/extensions/bluebubbles/src/actions.ts +5 -5
- package/extensions/bluebubbles/src/attachments.ts +2 -2
- package/extensions/bluebubbles/src/channel.ts +16 -16
- package/extensions/bluebubbles/src/chat.ts +2 -2
- package/extensions/bluebubbles/src/media-send.ts +2 -2
- package/extensions/bluebubbles/src/monitor.test.ts +46 -46
- package/extensions/bluebubbles/src/monitor.ts +5 -5
- package/extensions/bluebubbles/src/onboarding.ts +7 -7
- package/extensions/bluebubbles/src/reactions.ts +2 -2
- package/extensions/bluebubbles/src/send.ts +2 -2
- package/extensions/copilot-proxy/README.md +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/diagnostics-otel/index.ts +2 -2
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/diagnostics-otel/src/service.ts +3 -3
- package/extensions/discord/index.ts +2 -2
- package/extensions/discord/package.json +1 -1
- package/extensions/google-antigravity-auth/README.md +1 -1
- package/extensions/google-antigravity-auth/index.ts +1 -1
- package/extensions/google-antigravity-auth/package.json +1 -1
- package/extensions/google-gemini-cli-auth/README.md +1 -1
- package/extensions/google-gemini-cli-auth/oauth.ts +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/googlechat/index.ts +3 -3
- package/extensions/googlechat/package.json +1 -1
- package/extensions/googlechat/src/accounts.ts +8 -8
- package/extensions/googlechat/src/actions.ts +6 -6
- package/extensions/googlechat/src/channel.ts +21 -21
- package/extensions/googlechat/src/monitor.ts +8 -8
- package/extensions/googlechat/src/onboarding.ts +10 -10
- package/extensions/imessage/index.ts +2 -2
- package/extensions/imessage/package.json +1 -1
- package/extensions/line/index.ts +2 -2
- package/extensions/line/package.json +1 -1
- package/extensions/line/src/card-command.ts +2 -2
- package/extensions/line/src/channel.logout.test.ts +4 -4
- package/extensions/line/src/channel.sendPayload.test.ts +8 -8
- package/extensions/line/src/channel.ts +3 -3
- package/extensions/llm-task/README.md +3 -3
- package/extensions/llm-task/index.ts +2 -2
- package/extensions/llm-task/package.json +1 -1
- package/extensions/llm-task/src/llm-task-tool.ts +4 -4
- package/extensions/lobster/README.md +6 -6
- package/extensions/lobster/index.ts +2 -2
- package/extensions/lobster/src/lobster-tool.test.ts +4 -4
- package/extensions/lobster/src/lobster-tool.ts +2 -2
- package/extensions/matrix/index.ts +2 -2
- package/extensions/matrix/package.json +1 -1
- package/extensions/matrix/src/matrix/client/config.ts +1 -1
- package/extensions/matrix/src/matrix/monitor/handler.ts +1 -1
- package/extensions/matrix/src/onboarding.ts +1 -1
- package/extensions/mattermost/index.ts +2 -2
- package/extensions/mattermost/package.json +1 -1
- package/extensions/mattermost/src/mattermost/accounts.ts +8 -8
- package/extensions/mattermost/src/mattermost/monitor-helpers.ts +5 -5
- package/extensions/mattermost/src/mattermost/monitor.ts +2 -2
- package/extensions/mattermost/src/onboarding-helpers.ts +3 -3
- package/extensions/mattermost/src/onboarding.ts +2 -2
- package/extensions/memory-core/index.ts +2 -2
- package/extensions/memory-core/package.json +1 -1
- package/extensions/memory-lancedb/index.ts +3 -3
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/msteams/index.ts +2 -2
- package/extensions/msteams/package.json +1 -1
- package/extensions/msteams/src/channel.directory.test.ts +2 -2
- package/extensions/msteams/src/channel.ts +2 -2
- package/extensions/msteams/src/graph-upload.ts +4 -4
- package/extensions/msteams/src/monitor-handler.ts +2 -2
- package/extensions/msteams/src/monitor.ts +2 -2
- package/extensions/msteams/src/onboarding.ts +9 -9
- package/extensions/msteams/src/reply-dispatcher.ts +2 -2
- package/extensions/msteams/src/send-context.ts +2 -2
- package/extensions/msteams/src/send.ts +4 -4
- package/extensions/nextcloud-talk/index.ts +2 -2
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nextcloud-talk/src/channel.ts +7 -7
- package/extensions/nextcloud-talk/src/inbound.ts +7 -7
- package/extensions/nextcloud-talk/src/onboarding.ts +1 -1
- package/extensions/nostr/README.md +2 -2
- package/extensions/nostr/index.ts +5 -5
- package/extensions/nostr/package.json +1 -1
- package/extensions/nostr/src/types.ts +4 -4
- package/extensions/open-prose/index.ts +2 -2
- package/extensions/qwen-portal-auth/README.md +1 -1
- package/extensions/signal/index.ts +2 -2
- package/extensions/signal/package.json +1 -1
- package/extensions/slack/index.ts +2 -2
- package/extensions/slack/package.json +1 -1
- package/extensions/telegram/index.ts +2 -2
- package/extensions/telegram/package.json +1 -1
- package/extensions/telegram/src/channel.ts +2 -2
- package/extensions/tlon/README.md +2 -2
- package/extensions/tlon/index.ts +2 -2
- package/extensions/tlon/package.json +1 -1
- package/extensions/tlon/src/channel.ts +13 -13
- package/extensions/tlon/src/monitor/index.ts +3 -3
- package/extensions/tlon/src/onboarding.ts +3 -3
- package/extensions/tlon/src/types.ts +3 -3
- package/extensions/twitch/README.md +1 -1
- package/extensions/twitch/index.ts +2 -2
- package/extensions/twitch/package.json +1 -1
- package/extensions/twitch/src/config.ts +3 -3
- package/extensions/twitch/src/monitor.ts +3 -3
- package/extensions/twitch/src/onboarding.ts +9 -9
- package/extensions/twitch/src/outbound.test.ts +2 -2
- package/extensions/twitch/src/plugin.test.ts +2 -2
- package/extensions/twitch/src/plugin.ts +8 -8
- package/extensions/twitch/src/send.test.ts +2 -2
- package/extensions/twitch/src/send.ts +4 -4
- package/extensions/twitch/src/token.test.ts +8 -8
- package/extensions/twitch/src/token.ts +3 -3
- package/extensions/twitch/src/twitch-client.ts +3 -3
- package/extensions/twitch/src/types.ts +3 -3
- package/extensions/twitch/src/utils/markdown.ts +1 -1
- package/extensions/voice-call/README.md +3 -3
- package/extensions/voice-call/package.json +1 -1
- package/extensions/voice-call/src/core-bridge.ts +2 -2
- package/extensions/voice-call/src/response-generator.ts +1 -1
- package/extensions/whatsapp/index.ts +2 -2
- package/extensions/whatsapp/package.json +1 -1
- package/extensions/zalo/README.md +1 -1
- package/extensions/zalo/index.ts +2 -2
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalo/src/accounts.ts +8 -8
- package/extensions/zalo/src/actions.ts +4 -4
- package/extensions/zalo/src/channel.directory.test.ts +2 -2
- package/extensions/zalo/src/channel.ts +18 -18
- package/extensions/zalo/src/monitor.ts +9 -9
- package/extensions/zalo/src/monitor.webhook.test.ts +2 -2
- package/extensions/zalo/src/onboarding.ts +24 -24
- package/extensions/zalo/src/send.ts +2 -2
- package/extensions/zalouser/README.md +2 -2
- package/extensions/zalouser/index.ts +2 -2
- package/extensions/zalouser/package.json +1 -1
- package/extensions/zalouser/src/accounts.ts +9 -9
- package/extensions/zalouser/src/channel.ts +24 -24
- package/extensions/zalouser/src/monitor.ts +4 -4
- package/extensions/zalouser/src/onboarding.ts +28 -28
- package/package.json +13 -251
- package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
- package/skills/tmux/scripts/find-sessions.sh +1 -1
- package/CHANGELOG.md +0 -102
- package/README-header.png +0 -0
- package/git-hooks/pre-commit +0 -4
- package/scripts/format-staged.js +0 -148
- package/scripts/postinstall.js +0 -300
- package/scripts/setup-git-hooks.js +0 -96
|
@@ -2,13 +2,17 @@ import { DEFAULT_COPILOT_API_BASE_URL, resolveCopilotApiToken, } from "../provid
|
|
|
2
2
|
import { ensureAuthProfileStore, listProfilesForProvider } from "./auth-profiles.js";
|
|
3
3
|
import { resolveAwsSdkEnvVarName, resolveEnvApiKey } from "./model-auth.js";
|
|
4
4
|
import { discoverBedrockModels } from "./bedrock-discovery.js";
|
|
5
|
+
import { buildCloudflareAiGatewayModelDefinition, resolveCloudflareAiGatewayBaseUrl, } from "./cloudflare-ai-gateway.js";
|
|
5
6
|
import { buildSyntheticModelDefinition, SYNTHETIC_BASE_URL, SYNTHETIC_MODEL_CATALOG, } from "./synthetic-models.js";
|
|
7
|
+
import { TOGETHER_BASE_URL, TOGETHER_MODEL_CATALOG, buildTogetherModelDefinition, } from "./together-models.js";
|
|
6
8
|
import { discoverVeniceModels, VENICE_BASE_URL } from "./venice-models.js";
|
|
7
|
-
const MINIMAX_API_BASE_URL = "https://api.minimax.
|
|
9
|
+
const MINIMAX_API_BASE_URL = "https://api.minimax.chat/v1";
|
|
10
|
+
const MINIMAX_PORTAL_BASE_URL = "https://api.minimax.io/anthropic";
|
|
8
11
|
const MINIMAX_DEFAULT_MODEL_ID = "MiniMax-M2.1";
|
|
9
12
|
const MINIMAX_DEFAULT_VISION_MODEL_ID = "MiniMax-VL-01";
|
|
10
13
|
const MINIMAX_DEFAULT_CONTEXT_WINDOW = 200000;
|
|
11
14
|
const MINIMAX_DEFAULT_MAX_TOKENS = 8192;
|
|
15
|
+
const MINIMAX_OAUTH_PLACEHOLDER = "minimax-oauth";
|
|
12
16
|
// Pricing: MiniMax doesn't publish public rates. Override in models.json for accurate costs.
|
|
13
17
|
const MINIMAX_API_COST = {
|
|
14
18
|
input: 15,
|
|
@@ -17,7 +21,7 @@ const MINIMAX_API_COST = {
|
|
|
17
21
|
cacheWrite: 10,
|
|
18
22
|
};
|
|
19
23
|
const MOONSHOT_BASE_URL = "https://api.moonshot.ai/v1";
|
|
20
|
-
const MOONSHOT_DEFAULT_MODEL_ID = "kimi-k2
|
|
24
|
+
const MOONSHOT_DEFAULT_MODEL_ID = "kimi-k2.5";
|
|
21
25
|
const MOONSHOT_DEFAULT_CONTEXT_WINDOW = 256000;
|
|
22
26
|
const MOONSHOT_DEFAULT_MAX_TOKENS = 8192;
|
|
23
27
|
const MOONSHOT_DEFAULT_COST = {
|
|
@@ -26,13 +30,11 @@ const MOONSHOT_DEFAULT_COST = {
|
|
|
26
30
|
cacheRead: 0,
|
|
27
31
|
cacheWrite: 0,
|
|
28
32
|
};
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const KIMI_CODE_COMPAT = { supportsDeveloperRole: false };
|
|
35
|
-
const KIMI_CODE_DEFAULT_COST = {
|
|
33
|
+
const XIAOMI_BASE_URL = "https://api.xiaomimimo.com/anthropic";
|
|
34
|
+
export const XIAOMI_DEFAULT_MODEL_ID = "mimo-v2-flash";
|
|
35
|
+
const XIAOMI_DEFAULT_CONTEXT_WINDOW = 262144;
|
|
36
|
+
const XIAOMI_DEFAULT_MAX_TOKENS = 8192;
|
|
37
|
+
const XIAOMI_DEFAULT_COST = {
|
|
36
38
|
input: 0,
|
|
37
39
|
output: 0,
|
|
38
40
|
cacheRead: 0,
|
|
@@ -58,6 +60,16 @@ const OLLAMA_DEFAULT_COST = {
|
|
|
58
60
|
cacheRead: 0,
|
|
59
61
|
cacheWrite: 0,
|
|
60
62
|
};
|
|
63
|
+
export const QIANFAN_BASE_URL = "https://qianfan.baidubce.com/v2";
|
|
64
|
+
export const QIANFAN_DEFAULT_MODEL_ID = "deepseek-v3.2";
|
|
65
|
+
const QIANFAN_DEFAULT_CONTEXT_WINDOW = 98304;
|
|
66
|
+
const QIANFAN_DEFAULT_MAX_TOKENS = 32768;
|
|
67
|
+
const QIANFAN_DEFAULT_COST = {
|
|
68
|
+
input: 0,
|
|
69
|
+
output: 0,
|
|
70
|
+
cacheRead: 0,
|
|
71
|
+
cacheWrite: 0,
|
|
72
|
+
};
|
|
61
73
|
async function discoverOllamaModels() {
|
|
62
74
|
// Skip Ollama discovery in test environments
|
|
63
75
|
if (process.env.VITEST || process.env.NODE_ENV === "test") {
|
|
@@ -87,6 +99,11 @@ async function discoverOllamaModels() {
|
|
|
87
99
|
cost: OLLAMA_DEFAULT_COST,
|
|
88
100
|
contextWindow: OLLAMA_DEFAULT_CONTEXT_WINDOW,
|
|
89
101
|
maxTokens: OLLAMA_DEFAULT_MAX_TOKENS,
|
|
102
|
+
// Disable streaming by default for Ollama to avoid SDK issue #1205
|
|
103
|
+
// See: https://github.com/badlogic/pi-mono/issues/1205
|
|
104
|
+
params: {
|
|
105
|
+
streaming: false,
|
|
106
|
+
},
|
|
90
107
|
};
|
|
91
108
|
});
|
|
92
109
|
}
|
|
@@ -198,7 +215,7 @@ export function normalizeProviders(params) {
|
|
|
198
215
|
function buildMinimaxProvider() {
|
|
199
216
|
return {
|
|
200
217
|
baseUrl: MINIMAX_API_BASE_URL,
|
|
201
|
-
api: "
|
|
218
|
+
api: "openai-completions",
|
|
202
219
|
models: [
|
|
203
220
|
{
|
|
204
221
|
id: MINIMAX_DEFAULT_MODEL_ID,
|
|
@@ -228,7 +245,7 @@ function buildMoonshotProvider() {
|
|
|
228
245
|
models: [
|
|
229
246
|
{
|
|
230
247
|
id: MOONSHOT_DEFAULT_MODEL_ID,
|
|
231
|
-
name: "Kimi K2
|
|
248
|
+
name: "Kimi K2.5",
|
|
232
249
|
reasoning: false,
|
|
233
250
|
input: ["text"],
|
|
234
251
|
cost: MOONSHOT_DEFAULT_COST,
|
|
@@ -238,25 +255,6 @@ function buildMoonshotProvider() {
|
|
|
238
255
|
],
|
|
239
256
|
};
|
|
240
257
|
}
|
|
241
|
-
function buildKimiCodeProvider() {
|
|
242
|
-
return {
|
|
243
|
-
baseUrl: KIMI_CODE_BASE_URL,
|
|
244
|
-
api: "openai-completions",
|
|
245
|
-
models: [
|
|
246
|
-
{
|
|
247
|
-
id: KIMI_CODE_MODEL_ID,
|
|
248
|
-
name: "Kimi For Coding",
|
|
249
|
-
reasoning: true,
|
|
250
|
-
input: ["text"],
|
|
251
|
-
cost: KIMI_CODE_DEFAULT_COST,
|
|
252
|
-
contextWindow: KIMI_CODE_CONTEXT_WINDOW,
|
|
253
|
-
maxTokens: KIMI_CODE_MAX_TOKENS,
|
|
254
|
-
headers: KIMI_CODE_HEADERS,
|
|
255
|
-
compat: KIMI_CODE_COMPAT,
|
|
256
|
-
},
|
|
257
|
-
],
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
258
|
function buildQwenPortalProvider() {
|
|
261
259
|
return {
|
|
262
260
|
baseUrl: QWEN_PORTAL_BASE_URL,
|
|
@@ -306,6 +304,73 @@ async function buildOllamaProvider() {
|
|
|
306
304
|
models,
|
|
307
305
|
};
|
|
308
306
|
}
|
|
307
|
+
function buildMinimaxPortalProvider() {
|
|
308
|
+
return {
|
|
309
|
+
baseUrl: MINIMAX_PORTAL_BASE_URL,
|
|
310
|
+
api: "anthropic-messages",
|
|
311
|
+
models: [
|
|
312
|
+
{
|
|
313
|
+
id: MINIMAX_DEFAULT_MODEL_ID,
|
|
314
|
+
name: "MiniMax M2.1",
|
|
315
|
+
reasoning: false,
|
|
316
|
+
input: ["text"],
|
|
317
|
+
cost: MINIMAX_API_COST,
|
|
318
|
+
contextWindow: MINIMAX_DEFAULT_CONTEXT_WINDOW,
|
|
319
|
+
maxTokens: MINIMAX_DEFAULT_MAX_TOKENS,
|
|
320
|
+
},
|
|
321
|
+
],
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
export function buildXiaomiProvider() {
|
|
325
|
+
return {
|
|
326
|
+
baseUrl: XIAOMI_BASE_URL,
|
|
327
|
+
api: "anthropic-messages",
|
|
328
|
+
models: [
|
|
329
|
+
{
|
|
330
|
+
id: XIAOMI_DEFAULT_MODEL_ID,
|
|
331
|
+
name: "Xiaomi MiMo V2 Flash",
|
|
332
|
+
reasoning: false,
|
|
333
|
+
input: ["text"],
|
|
334
|
+
cost: XIAOMI_DEFAULT_COST,
|
|
335
|
+
contextWindow: XIAOMI_DEFAULT_CONTEXT_WINDOW,
|
|
336
|
+
maxTokens: XIAOMI_DEFAULT_MAX_TOKENS,
|
|
337
|
+
},
|
|
338
|
+
],
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
function buildTogetherProvider() {
|
|
342
|
+
return {
|
|
343
|
+
baseUrl: TOGETHER_BASE_URL,
|
|
344
|
+
api: "openai-completions",
|
|
345
|
+
models: TOGETHER_MODEL_CATALOG.map(buildTogetherModelDefinition),
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
export function buildQianfanProvider() {
|
|
349
|
+
return {
|
|
350
|
+
baseUrl: QIANFAN_BASE_URL,
|
|
351
|
+
api: "openai-completions",
|
|
352
|
+
models: [
|
|
353
|
+
{
|
|
354
|
+
id: QIANFAN_DEFAULT_MODEL_ID,
|
|
355
|
+
name: "DEEPSEEK V3.2",
|
|
356
|
+
reasoning: true,
|
|
357
|
+
input: ["text"],
|
|
358
|
+
cost: QIANFAN_DEFAULT_COST,
|
|
359
|
+
contextWindow: QIANFAN_DEFAULT_CONTEXT_WINDOW,
|
|
360
|
+
maxTokens: QIANFAN_DEFAULT_MAX_TOKENS,
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
id: "ernie-5.0-thinking-preview",
|
|
364
|
+
name: "ERNIE-5.0-Thinking-Preview",
|
|
365
|
+
reasoning: true,
|
|
366
|
+
input: ["text", "image"],
|
|
367
|
+
cost: QIANFAN_DEFAULT_COST,
|
|
368
|
+
contextWindow: 119000,
|
|
369
|
+
maxTokens: 64000,
|
|
370
|
+
},
|
|
371
|
+
],
|
|
372
|
+
};
|
|
373
|
+
}
|
|
309
374
|
export async function resolveImplicitProviders(params) {
|
|
310
375
|
const providers = {};
|
|
311
376
|
const authStore = ensureAuthProfileStore(params.agentDir, {
|
|
@@ -316,16 +381,18 @@ export async function resolveImplicitProviders(params) {
|
|
|
316
381
|
if (minimaxKey) {
|
|
317
382
|
providers.minimax = { ...buildMinimaxProvider(), apiKey: minimaxKey };
|
|
318
383
|
}
|
|
384
|
+
const minimaxOauthProfile = listProfilesForProvider(authStore, "minimax-portal");
|
|
385
|
+
if (minimaxOauthProfile.length > 0) {
|
|
386
|
+
providers["minimax-portal"] = {
|
|
387
|
+
...buildMinimaxPortalProvider(),
|
|
388
|
+
apiKey: MINIMAX_OAUTH_PLACEHOLDER,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
319
391
|
const moonshotKey = resolveEnvApiKeyVarName("moonshot") ??
|
|
320
392
|
resolveApiKeyFromProfiles({ provider: "moonshot", store: authStore });
|
|
321
393
|
if (moonshotKey) {
|
|
322
394
|
providers.moonshot = { ...buildMoonshotProvider(), apiKey: moonshotKey };
|
|
323
395
|
}
|
|
324
|
-
const kimiCodeKey = resolveEnvApiKeyVarName("kimi-code") ??
|
|
325
|
-
resolveApiKeyFromProfiles({ provider: "kimi-code", store: authStore });
|
|
326
|
-
if (kimiCodeKey) {
|
|
327
|
-
providers["kimi-code"] = { ...buildKimiCodeProvider(), apiKey: kimiCodeKey };
|
|
328
|
-
}
|
|
329
396
|
const syntheticKey = resolveEnvApiKeyVarName("synthetic") ??
|
|
330
397
|
resolveApiKeyFromProfiles({ provider: "synthetic", store: authStore });
|
|
331
398
|
if (syntheticKey) {
|
|
@@ -343,12 +410,53 @@ export async function resolveImplicitProviders(params) {
|
|
|
343
410
|
apiKey: QWEN_PORTAL_OAUTH_PLACEHOLDER,
|
|
344
411
|
};
|
|
345
412
|
}
|
|
413
|
+
const xiaomiKey = resolveEnvApiKeyVarName("xiaomi") ??
|
|
414
|
+
resolveApiKeyFromProfiles({ provider: "xiaomi", store: authStore });
|
|
415
|
+
if (xiaomiKey) {
|
|
416
|
+
providers.xiaomi = { ...buildXiaomiProvider(), apiKey: xiaomiKey };
|
|
417
|
+
}
|
|
418
|
+
const cloudflareProfiles = listProfilesForProvider(authStore, "cloudflare-ai-gateway");
|
|
419
|
+
for (const profileId of cloudflareProfiles) {
|
|
420
|
+
const cred = authStore.profiles[profileId];
|
|
421
|
+
if (cred?.type !== "api_key")
|
|
422
|
+
continue;
|
|
423
|
+
const accountId = cred.metadata?.accountId?.trim();
|
|
424
|
+
const gatewayId = cred.metadata?.gatewayId?.trim();
|
|
425
|
+
if (!accountId || !gatewayId)
|
|
426
|
+
continue;
|
|
427
|
+
const baseUrl = resolveCloudflareAiGatewayBaseUrl({ accountId, gatewayId });
|
|
428
|
+
if (!baseUrl)
|
|
429
|
+
continue;
|
|
430
|
+
const apiKey = resolveEnvApiKeyVarName("cloudflare-ai-gateway") ?? cred.key?.trim() ?? "";
|
|
431
|
+
if (!apiKey)
|
|
432
|
+
continue;
|
|
433
|
+
providers["cloudflare-ai-gateway"] = {
|
|
434
|
+
baseUrl,
|
|
435
|
+
api: "anthropic-messages",
|
|
436
|
+
apiKey,
|
|
437
|
+
models: [buildCloudflareAiGatewayModelDefinition()],
|
|
438
|
+
};
|
|
439
|
+
break;
|
|
440
|
+
}
|
|
346
441
|
// Ollama provider - only add if explicitly configured
|
|
347
442
|
const ollamaKey = resolveEnvApiKeyVarName("ollama") ??
|
|
348
443
|
resolveApiKeyFromProfiles({ provider: "ollama", store: authStore });
|
|
349
444
|
if (ollamaKey) {
|
|
350
445
|
providers.ollama = { ...(await buildOllamaProvider()), apiKey: ollamaKey };
|
|
351
446
|
}
|
|
447
|
+
const togetherKey = resolveEnvApiKeyVarName("together") ??
|
|
448
|
+
resolveApiKeyFromProfiles({ provider: "together", store: authStore });
|
|
449
|
+
if (togetherKey) {
|
|
450
|
+
providers.together = {
|
|
451
|
+
...buildTogetherProvider(),
|
|
452
|
+
apiKey: togetherKey,
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
const qianfanKey = resolveEnvApiKeyVarName("qianfan") ??
|
|
456
|
+
resolveApiKeyFromProfiles({ provider: "qianfan", store: authStore });
|
|
457
|
+
if (qianfanKey) {
|
|
458
|
+
providers.qianfan = { ...buildQianfanProvider(), apiKey: qianfanKey };
|
|
459
|
+
}
|
|
352
460
|
return providers;
|
|
353
461
|
}
|
|
354
462
|
export async function resolveImplicitCopilotProvider(params) {
|
|
@@ -384,15 +492,15 @@ export async function resolveImplicitCopilotProvider(params) {
|
|
|
384
492
|
}
|
|
385
493
|
// pi-coding-agent's ModelRegistry marks a model "available" only if its
|
|
386
494
|
// `AuthStorage` has auth configured for that provider (via auth.json/env/etc).
|
|
387
|
-
// Our Copilot auth lives in
|
|
495
|
+
// Our Copilot auth lives in Poolbot's auth-profiles store instead, so we also
|
|
388
496
|
// write a runtime-only auth.json entry for pi-coding-agent to pick up.
|
|
389
497
|
//
|
|
390
|
-
// This is safe because it's (1) within
|
|
498
|
+
// This is safe because it's (1) within Poolbot's agent dir, (2) contains the
|
|
391
499
|
// GitHub token (not the exchanged Copilot token), and (3) matches existing
|
|
392
500
|
// patterns for OAuth-like providers in pi-coding-agent.
|
|
393
501
|
// Note: we deliberately do not write pi-coding-agent's `auth.json` here.
|
|
394
|
-
//
|
|
395
|
-
// `models list` uses
|
|
502
|
+
// Poolbot uses its own auth store and exchanges tokens at runtime.
|
|
503
|
+
// `models list` uses Poolbot's auth heuristics for availability.
|
|
396
504
|
// We intentionally do NOT define custom models for Copilot in models.json.
|
|
397
505
|
// pi-coding-agent treats providers with models as replacements requiring apiKey.
|
|
398
506
|
// We only override baseUrl; the model list comes from pi-ai built-ins.
|
|
@@ -41,7 +41,7 @@ function hasFollowingNonThinkingBlock(content, index) {
|
|
|
41
41
|
* OpenAI Responses API can reject transcripts that contain a standalone `reasoning` item id
|
|
42
42
|
* without the required following item.
|
|
43
43
|
*
|
|
44
|
-
*
|
|
44
|
+
* Poolbot persists provider-specific reasoning metadata in `thinkingSignature`; if that metadata
|
|
45
45
|
* is incomplete, drop the block to keep history usable.
|
|
46
46
|
*/
|
|
47
47
|
export function downgradeOpenAIReasoningBlocks(messages) {
|
|
@@ -13,16 +13,16 @@ import { normalizeMessageChannel } from "../../utils/message-channel.js";
|
|
|
13
13
|
import { isSubagentSessionKey } from "../../routing/session-key.js";
|
|
14
14
|
import { isReasoningTagProvider } from "../../utils/provider-utils.js";
|
|
15
15
|
import { resolveUserPath } from "../../utils.js";
|
|
16
|
-
import {
|
|
16
|
+
import { resolvePoolbotAgentDir } from "../agent-paths.js";
|
|
17
17
|
import { resolveSessionAgentIds } from "../agent-scope.js";
|
|
18
18
|
import { makeBootstrapWarn, resolveBootstrapContextForRun } from "../bootstrap-files.js";
|
|
19
|
-
import {
|
|
19
|
+
import { resolvePoolbotDocsPath } from "../docs-path.js";
|
|
20
20
|
import { DEFAULT_MODEL, DEFAULT_PROVIDER } from "../defaults.js";
|
|
21
21
|
import { getApiKeyForModel, resolveModelAuthMode } from "../model-auth.js";
|
|
22
|
-
import {
|
|
22
|
+
import { ensurePoolbotModelsJson } from "../models-config.js";
|
|
23
23
|
import { ensureSessionHeader, validateAnthropicTurns, validateGeminiTurns, } from "../pi-embedded-helpers.js";
|
|
24
24
|
import { ensurePiCompactionReserveTokens, resolveCompactionReserveTokensFloor, } from "../pi-settings.js";
|
|
25
|
-
import {
|
|
25
|
+
import { createPoolbotCodingTools } from "../pi-tools.js";
|
|
26
26
|
import { resolveSandboxContext } from "../sandbox.js";
|
|
27
27
|
import { guardSessionManager } from "../session-tool-result-guard-wrapper.js";
|
|
28
28
|
import { resolveTranscriptPolicy } from "../transcript-policy.js";
|
|
@@ -50,8 +50,8 @@ export async function compactEmbeddedPiSessionDirect(params) {
|
|
|
50
50
|
const prevCwd = process.cwd();
|
|
51
51
|
const provider = (params.provider ?? DEFAULT_PROVIDER).trim() || DEFAULT_PROVIDER;
|
|
52
52
|
const modelId = (params.model ?? DEFAULT_MODEL).trim() || DEFAULT_MODEL;
|
|
53
|
-
const agentDir = params.agentDir ??
|
|
54
|
-
await
|
|
53
|
+
const agentDir = params.agentDir ?? resolvePoolbotAgentDir();
|
|
54
|
+
await ensurePoolbotModelsJson(params.config, agentDir);
|
|
55
55
|
const { model, error, authStorage, modelRegistry } = resolveModel(provider, modelId, agentDir, params.config);
|
|
56
56
|
if (!model) {
|
|
57
57
|
return {
|
|
@@ -139,7 +139,7 @@ export async function compactEmbeddedPiSessionDirect(params) {
|
|
|
139
139
|
warn: makeBootstrapWarn({ sessionLabel, warn: (message) => log.warn(message) }),
|
|
140
140
|
});
|
|
141
141
|
const runAbortController = new AbortController();
|
|
142
|
-
const toolsRaw =
|
|
142
|
+
const toolsRaw = createPoolbotCodingTools({
|
|
143
143
|
exec: {
|
|
144
144
|
...resolveExecToolDefaults(params.config),
|
|
145
145
|
elevated: params.bashElevated,
|
|
@@ -240,7 +240,7 @@ export async function compactEmbeddedPiSessionDirect(params) {
|
|
|
240
240
|
});
|
|
241
241
|
const isDefaultAgent = sessionAgentId === defaultAgentId;
|
|
242
242
|
const promptMode = isSubagentSessionKey(params.sessionKey) ? "minimal" : "full";
|
|
243
|
-
const docsPath = await
|
|
243
|
+
const docsPath = await resolvePoolbotDocsPath({
|
|
244
244
|
workspaceDir: effectiveWorkspace,
|
|
245
245
|
argv1: process.argv[1],
|
|
246
246
|
cwd: process.cwd(),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { discoverAuthStorage, discoverModels } from "@mariozechner/pi-coding-agent";
|
|
2
|
-
import {
|
|
2
|
+
import { resolvePoolbotAgentDir } from "../agent-paths.js";
|
|
3
3
|
import { DEFAULT_CONTEXT_TOKENS } from "../defaults.js";
|
|
4
4
|
import { normalizeModelCompat } from "../model-compat.js";
|
|
5
5
|
import { normalizeProviderId } from "../model-selection.js";
|
|
@@ -28,7 +28,7 @@ export function buildModelAliasLines(cfg) {
|
|
|
28
28
|
.map((entry) => `- ${entry.alias}: ${entry.model}`);
|
|
29
29
|
}
|
|
30
30
|
export function resolveModel(provider, modelId, agentDir, cfg) {
|
|
31
|
-
const resolvedAgentDir = agentDir ??
|
|
31
|
+
const resolvedAgentDir = agentDir ?? resolvePoolbotAgentDir();
|
|
32
32
|
const authStorage = discoverAuthStorage(resolvedAgentDir);
|
|
33
33
|
const modelRegistry = discoverModels(authStorage, resolvedAgentDir);
|
|
34
34
|
const model = modelRegistry.find(provider, modelId);
|
|
@@ -15,15 +15,15 @@ import { isSubagentSessionKey } from "../../../routing/session-key.js";
|
|
|
15
15
|
import { resolveUserPath } from "../../../utils.js";
|
|
16
16
|
import { createCacheTrace } from "../../cache-trace.js";
|
|
17
17
|
import { createAnthropicPayloadLogger } from "../../anthropic-payload-log.js";
|
|
18
|
-
import {
|
|
18
|
+
import { resolvePoolbotAgentDir } from "../../agent-paths.js";
|
|
19
19
|
import { resolveSessionAgentIds } from "../../agent-scope.js";
|
|
20
20
|
import { makeBootstrapWarn, resolveBootstrapContextForRun } from "../../bootstrap-files.js";
|
|
21
|
-
import {
|
|
21
|
+
import { resolvePoolbotDocsPath } from "../../docs-path.js";
|
|
22
22
|
import { resolveModelAuthMode } from "../../model-auth.js";
|
|
23
23
|
import { isCloudCodeAssistFormatError, resolveBootstrapMaxChars, validateAnthropicTurns, validateGeminiTurns, } from "../../pi-embedded-helpers.js";
|
|
24
24
|
import { subscribeEmbeddedPiSession } from "../../pi-embedded-subscribe.js";
|
|
25
25
|
import { ensurePiCompactionReserveTokens, resolveCompactionReserveTokensFloor, } from "../../pi-settings.js";
|
|
26
|
-
import {
|
|
26
|
+
import { createPoolbotCodingTools } from "../../pi-tools.js";
|
|
27
27
|
import { resolveSandboxContext } from "../../sandbox.js";
|
|
28
28
|
import { guardSessionManager } from "../../session-tool-result-guard-wrapper.js";
|
|
29
29
|
import { resolveTranscriptPolicy } from "../../transcript-policy.js";
|
|
@@ -141,12 +141,12 @@ export async function runEmbeddedAttempt(params) {
|
|
|
141
141
|
const workspaceNotes = hookAdjustedBootstrapFiles.some((file) => file.name === DEFAULT_BOOTSTRAP_FILENAME && !file.missing)
|
|
142
142
|
? ["Reminder: commit your changes in this workspace after edits."]
|
|
143
143
|
: undefined;
|
|
144
|
-
const agentDir = params.agentDir ??
|
|
144
|
+
const agentDir = params.agentDir ?? resolvePoolbotAgentDir();
|
|
145
145
|
// Check if the model supports native image input
|
|
146
146
|
const modelHasVision = params.model.input?.includes("image") ?? false;
|
|
147
147
|
const toolsRaw = params.disableTools
|
|
148
148
|
? []
|
|
149
|
-
:
|
|
149
|
+
: createPoolbotCodingTools({
|
|
150
150
|
exec: {
|
|
151
151
|
...params.execOverrides,
|
|
152
152
|
elevated: params.bashElevated,
|
|
@@ -267,7 +267,7 @@ export async function runEmbeddedAttempt(params) {
|
|
|
267
267
|
});
|
|
268
268
|
const isDefaultAgent = sessionAgentId === defaultAgentId;
|
|
269
269
|
const promptMode = isSubagentSessionKey(params.sessionKey) ? "minimal" : "full";
|
|
270
|
-
const docsPath = await
|
|
270
|
+
const docsPath = await resolvePoolbotDocsPath({
|
|
271
271
|
workspaceDir: effectiveWorkspace,
|
|
272
272
|
argv1: process.argv[1],
|
|
273
273
|
cwd: process.cwd(),
|
|
@@ -2,14 +2,14 @@ import fs from "node:fs/promises";
|
|
|
2
2
|
import { enqueueCommandInLane } from "../../process/command-queue.js";
|
|
3
3
|
import { resolveUserPath } from "../../utils.js";
|
|
4
4
|
import { isMarkdownCapableMessageChannel } from "../../utils/message-channel.js";
|
|
5
|
-
import {
|
|
5
|
+
import { resolvePoolbotAgentDir } from "../agent-paths.js";
|
|
6
6
|
import { isProfileInCooldown, markAuthProfileFailure, markAuthProfileGood, markAuthProfileUsed, } from "../auth-profiles.js";
|
|
7
7
|
import { CONTEXT_WINDOW_HARD_MIN_TOKENS, CONTEXT_WINDOW_WARN_BELOW_TOKENS, evaluateContextWindowGuard, resolveContextWindowInfo, } from "../context-window-guard.js";
|
|
8
8
|
import { DEFAULT_CONTEXT_TOKENS, DEFAULT_MODEL, DEFAULT_PROVIDER } from "../defaults.js";
|
|
9
9
|
import { FailoverError, resolveFailoverStatus } from "../failover-error.js";
|
|
10
10
|
import { ensureAuthProfileStore, getApiKeyForModel, resolveAuthProfileOrder, } from "../model-auth.js";
|
|
11
11
|
import { normalizeProviderId } from "../model-selection.js";
|
|
12
|
-
import {
|
|
12
|
+
import { ensurePoolbotModelsJson } from "../models-config.js";
|
|
13
13
|
import { classifyFailoverReason, formatAssistantErrorText, isAuthAssistantError, isCompactionFailureError, isContextOverflowError, isFailoverAssistantError, isFailoverErrorMessage, parseImageDimensionError, isRateLimitAssistantError, isTimeoutErrorMessage, pickFallbackThinkingLevel, } from "../pi-embedded-helpers.js";
|
|
14
14
|
import { normalizeUsage } from "../usage.js";
|
|
15
15
|
import { compactEmbeddedPiSessionDirect } from "./compact.js";
|
|
@@ -46,9 +46,9 @@ export async function runEmbeddedPiAgent(params) {
|
|
|
46
46
|
const prevCwd = process.cwd();
|
|
47
47
|
const provider = (params.provider ?? DEFAULT_PROVIDER).trim() || DEFAULT_PROVIDER;
|
|
48
48
|
const modelId = (params.model ?? DEFAULT_MODEL).trim() || DEFAULT_MODEL;
|
|
49
|
-
const agentDir = params.agentDir ??
|
|
49
|
+
const agentDir = params.agentDir ?? resolvePoolbotAgentDir();
|
|
50
50
|
const fallbackConfigured = (params.config?.agents?.defaults?.model?.fallbacks?.length ?? 0) > 0;
|
|
51
|
-
await
|
|
51
|
+
await ensurePoolbotModelsJson(params.config, agentDir);
|
|
52
52
|
const { model, error, authStorage, modelRegistry } = resolveModel(provider, modelId, agentDir, params.config);
|
|
53
53
|
if (!model) {
|
|
54
54
|
throw new Error(error ?? `Unknown model: ${provider}/${modelId}`);
|