@codemieai/code 0.14.1 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- package/bin/codemie-openwiki.js +18 -0
- package/dist/agents/core/AgentCLI.d.ts.map +1 -1
- package/dist/agents/core/AgentCLI.js +2 -0
- package/dist/agents/core/AgentCLI.js.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.js +25 -11
- package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
- package/dist/agents/core/extension/BaseExtensionInstaller.d.ts +1 -0
- package/dist/agents/core/extension/BaseExtensionInstaller.d.ts.map +1 -1
- package/dist/agents/core/extension/BaseExtensionInstaller.js +20 -0
- package/dist/agents/core/extension/BaseExtensionInstaller.js.map +1 -1
- package/dist/agents/core/types.d.ts +8 -0
- package/dist/agents/core/types.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude-message-types.d.ts +1 -0
- package/dist/agents/plugins/claude/claude-message-types.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.js +60 -6
- package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
- package/dist/agents/plugins/claude/plugin/__tests__/statusline.test.ts +26 -4
- package/dist/agents/plugins/claude/plugin/hooks/hooks.json +6 -6
- package/dist/agents/plugins/claude/plugin/statusline.mjs +5 -1
- package/dist/agents/plugins/codemie-code.plugin.d.ts +1 -0
- package/dist/agents/plugins/codemie-code.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/codemie-code.plugin.js +12 -5
- package/dist/agents/plugins/codemie-code.plugin.js.map +1 -1
- package/dist/agents/plugins/codex/codex-message-types.d.ts +28 -0
- package/dist/agents/plugins/codex/codex-message-types.d.ts.map +1 -1
- package/dist/agents/plugins/codex/codex-message-types.js.map +1 -1
- package/dist/agents/plugins/codex/codex.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/codex/codex.plugin.js +30 -2
- package/dist/agents/plugins/codex/codex.plugin.js.map +1 -1
- package/dist/agents/plugins/codex/index.d.ts +4 -2
- package/dist/agents/plugins/codex/index.d.ts.map +1 -1
- package/dist/agents/plugins/codex/index.js +3 -1
- package/dist/agents/plugins/codex/index.js.map +1 -1
- package/dist/agents/plugins/copilot-cli/copilot-cli.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/copilot-cli/copilot-cli.plugin.js +3 -1
- package/dist/agents/plugins/copilot-cli/copilot-cli.plugin.js.map +1 -1
- package/dist/agents/plugins/gemini/extension/hooks/hooks.json +4 -4
- package/dist/agents/plugins/gemini/gemini.models.d.ts +33 -0
- package/dist/agents/plugins/gemini/gemini.models.d.ts.map +1 -0
- package/dist/agents/plugins/gemini/gemini.models.js +122 -0
- package/dist/agents/plugins/gemini/gemini.models.js.map +1 -0
- package/dist/agents/plugins/gemini/gemini.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/gemini/gemini.plugin.js +6 -0
- package/dist/agents/plugins/gemini/gemini.plugin.js.map +1 -1
- package/dist/agents/plugins/gemini/gemini.session-adapter.d.ts +1 -1
- package/dist/agents/plugins/gemini/gemini.session-adapter.d.ts.map +1 -1
- package/dist/agents/plugins/gemini/gemini.session-adapter.js +155 -16
- package/dist/agents/plugins/gemini/gemini.session-adapter.js.map +1 -1
- package/dist/agents/plugins/gemini/session/processors/gemini.metrics-processor.d.ts.map +1 -1
- package/dist/agents/plugins/gemini/session/processors/gemini.metrics-processor.js +77 -31
- package/dist/agents/plugins/gemini/session/processors/gemini.metrics-processor.js.map +1 -1
- package/dist/agents/plugins/gemini/session/utils/turn-detector.d.ts +1 -1
- package/dist/agents/plugins/gemini/session/utils/turn-detector.d.ts.map +1 -1
- package/dist/agents/plugins/gemini/session/utils/turn-detector.js +7 -1
- package/dist/agents/plugins/gemini/session/utils/turn-detector.js.map +1 -1
- package/dist/agents/plugins/openwiki/openwiki.plugin.d.ts +30 -0
- package/dist/agents/plugins/openwiki/openwiki.plugin.d.ts.map +1 -0
- package/dist/agents/plugins/openwiki/openwiki.plugin.js +73 -0
- package/dist/agents/plugins/openwiki/openwiki.plugin.js.map +1 -0
- package/dist/agents/plugins/pi/pi.models.d.ts.map +1 -1
- package/dist/agents/plugins/pi/pi.models.js +62 -0
- package/dist/agents/plugins/pi/pi.models.js.map +1 -1
- package/dist/agents/plugins/pi/pi.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/pi/pi.plugin.js +7 -3
- package/dist/agents/plugins/pi/pi.plugin.js.map +1 -1
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +2 -0
- package/dist/agents/registry.js.map +1 -1
- package/dist/bin/proxy-daemon.js +3 -0
- package/dist/bin/proxy-daemon.js.map +1 -1
- package/dist/cli/commands/analytics/aggregator.d.ts.map +1 -1
- package/dist/cli/commands/analytics/aggregator.js +1 -0
- package/dist/cli/commands/analytics/aggregator.js.map +1 -1
- package/dist/cli/commands/analytics/cost/cost-enricher.d.ts.map +1 -1
- package/dist/cli/commands/analytics/cost/cost-enricher.js +6 -1
- package/dist/cli/commands/analytics/cost/cost-enricher.js.map +1 -1
- package/dist/cli/commands/analytics/cost/types.d.ts +8 -0
- package/dist/cli/commands/analytics/cost/types.d.ts.map +1 -1
- package/dist/cli/commands/analytics/report/client/app.js +111 -1
- package/dist/cli/commands/analytics/report/payload-builder.d.ts.map +1 -1
- package/dist/cli/commands/analytics/report/payload-builder.js +6 -0
- package/dist/cli/commands/analytics/report/payload-builder.js.map +1 -1
- package/dist/cli/commands/analytics/report/template.html +9 -0
- package/dist/cli/commands/analytics/report/types.d.ts +1 -0
- package/dist/cli/commands/analytics/report/types.d.ts.map +1 -1
- package/dist/cli/commands/analytics/types.d.ts +1 -0
- package/dist/cli/commands/analytics/types.d.ts.map +1 -1
- package/dist/cli/commands/assistants/chat/claudeUploadsDetector.d.ts.map +1 -1
- package/dist/cli/commands/assistants/chat/claudeUploadsDetector.js +43 -67
- package/dist/cli/commands/assistants/chat/claudeUploadsDetector.js.map +1 -1
- package/dist/cli/commands/assistants/chat/codexUploadsDetector.d.ts +26 -0
- package/dist/cli/commands/assistants/chat/codexUploadsDetector.d.ts.map +1 -0
- package/dist/cli/commands/assistants/chat/codexUploadsDetector.js +240 -0
- package/dist/cli/commands/assistants/chat/codexUploadsDetector.js.map +1 -0
- package/dist/cli/commands/assistants/chat/historyLoader.d.ts +2 -2
- package/dist/cli/commands/assistants/chat/historyLoader.d.ts.map +1 -1
- package/dist/cli/commands/assistants/chat/historyLoader.js.map +1 -1
- package/dist/cli/commands/assistants/chat/index.d.ts.map +1 -1
- package/dist/cli/commands/assistants/chat/index.js +14 -3
- package/dist/cli/commands/assistants/chat/index.js.map +1 -1
- package/dist/cli/commands/assistants/setup/data.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/data.js +7 -0
- package/dist/cli/commands/assistants/setup/data.js.map +1 -1
- package/dist/cli/commands/assistants/setup/selection/utils.d.ts +3 -3
- package/dist/cli/commands/assistants/setup/selection/utils.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/selection/utils.js.map +1 -1
- package/dist/cli/commands/docs.d.ts +12 -0
- package/dist/cli/commands/docs.d.ts.map +1 -0
- package/dist/cli/commands/docs.js +141 -0
- package/dist/cli/commands/docs.js.map +1 -0
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +30 -18
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/log/filter.js +1 -1
- package/dist/cli/commands/log/filter.js.map +1 -1
- package/dist/cli/commands/log/formatter.d.ts.map +1 -1
- package/dist/cli/commands/log/formatter.js +1 -0
- package/dist/cli/commands/log/formatter.js.map +1 -1
- package/dist/cli/commands/log/parser.d.ts.map +1 -1
- package/dist/cli/commands/log/parser.js +2 -0
- package/dist/cli/commands/log/parser.js.map +1 -1
- package/dist/cli/commands/log/types.d.ts +1 -1
- package/dist/cli/commands/log/types.d.ts.map +1 -1
- package/dist/cli/commands/models.d.ts.map +1 -1
- package/dist/cli/commands/models.js +12 -2
- package/dist/cli/commands/models.js.map +1 -1
- package/dist/cli/commands/profile/display.d.ts +3 -3
- package/dist/cli/commands/profile/display.d.ts.map +1 -1
- package/dist/cli/commands/profile/display.js +6 -6
- package/dist/cli/commands/profile/display.js.map +1 -1
- package/dist/cli/commands/profile/index.d.ts.map +1 -1
- package/dist/cli/commands/profile/index.js +4 -2
- package/dist/cli/commands/profile/index.js.map +1 -1
- package/dist/cli/commands/proxy/connect-orchestrator.d.ts +9 -0
- package/dist/cli/commands/proxy/connect-orchestrator.d.ts.map +1 -1
- package/dist/cli/commands/proxy/connect-orchestrator.js +15 -1
- package/dist/cli/commands/proxy/connect-orchestrator.js.map +1 -1
- package/dist/cli/commands/proxy/connectors/codex-desktop.d.ts +1 -1
- package/dist/cli/commands/proxy/connectors/codex-desktop.d.ts.map +1 -1
- package/dist/cli/commands/proxy/connectors/codex-desktop.js +19 -9
- package/dist/cli/commands/proxy/connectors/codex-desktop.js.map +1 -1
- package/dist/cli/commands/proxy/connectors/desktop.d.ts.map +1 -1
- package/dist/cli/commands/proxy/connectors/desktop.js +9 -0
- package/dist/cli/commands/proxy/connectors/desktop.js.map +1 -1
- package/dist/cli/commands/proxy/daemon-manager.d.ts +2 -0
- package/dist/cli/commands/proxy/daemon-manager.d.ts.map +1 -1
- package/dist/cli/commands/proxy/daemon-manager.js +2 -0
- package/dist/cli/commands/proxy/daemon-manager.js.map +1 -1
- package/dist/cli/commands/proxy/index.d.ts.map +1 -1
- package/dist/cli/commands/proxy/index.js +44 -2
- package/dist/cli/commands/proxy/index.js.map +1 -1
- package/dist/cli/commands/setup.d.ts +0 -16
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +8 -126
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/shared/api-response-guard.d.ts +20 -0
- package/dist/cli/commands/shared/api-response-guard.d.ts.map +1 -0
- package/dist/cli/commands/shared/api-response-guard.js +31 -0
- package/dist/cli/commands/shared/api-response-guard.js.map +1 -0
- package/dist/cli/commands/skills/setup/data.d.ts.map +1 -1
- package/dist/cli/commands/skills/setup/data.js +8 -0
- package/dist/cli/commands/skills/setup/data.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/env/types.d.ts +22 -15
- package/dist/env/types.d.ts.map +1 -1
- package/dist/env/types.js.map +1 -1
- package/dist/frameworks/core/registry.d.ts +6 -0
- package/dist/frameworks/core/registry.d.ts.map +1 -1
- package/dist/frameworks/core/registry.js +8 -0
- package/dist/frameworks/core/registry.js.map +1 -1
- package/dist/frameworks/core/types.d.ts +7 -0
- package/dist/frameworks/core/types.d.ts.map +1 -1
- package/dist/frameworks/plugins/codebase-memory.plugin.d.ts.map +1 -1
- package/dist/frameworks/plugins/codebase-memory.plugin.js +1 -0
- package/dist/frameworks/plugins/codebase-memory.plugin.js.map +1 -1
- package/dist/frameworks/plugins/codegraph.plugin.d.ts +17 -0
- package/dist/frameworks/plugins/codegraph.plugin.d.ts.map +1 -0
- package/dist/frameworks/plugins/codegraph.plugin.js +74 -0
- package/dist/frameworks/plugins/codegraph.plugin.js.map +1 -0
- package/dist/frameworks/plugins/graphify.plugin.d.ts +20 -0
- package/dist/frameworks/plugins/graphify.plugin.d.ts.map +1 -0
- package/dist/frameworks/plugins/graphify.plugin.js +92 -0
- package/dist/frameworks/plugins/graphify.plugin.js.map +1 -0
- package/dist/frameworks/plugins/index.d.ts +2 -0
- package/dist/frameworks/plugins/index.d.ts.map +1 -1
- package/dist/frameworks/plugins/index.js +6 -0
- package/dist/frameworks/plugins/index.js.map +1 -1
- package/dist/hooks/executor.d.ts +2 -0
- package/dist/hooks/executor.d.ts.map +1 -1
- package/dist/hooks/executor.js +14 -1
- package/dist/hooks/executor.js.map +1 -1
- package/dist/migrations/001-config-rename.migration.d.ts +0 -1
- package/dist/migrations/001-config-rename.migration.d.ts.map +1 -1
- package/dist/migrations/001-config-rename.migration.js +0 -1
- package/dist/migrations/001-config-rename.migration.js.map +1 -1
- package/dist/migrations/002-consolidate-sessions.migration.d.ts +0 -1
- package/dist/migrations/002-consolidate-sessions.migration.d.ts.map +1 -1
- package/dist/migrations/002-consolidate-sessions.migration.js +0 -1
- package/dist/migrations/002-consolidate-sessions.migration.js.map +1 -1
- package/dist/migrations/003-remove-hooks-node.migration.d.ts +0 -1
- package/dist/migrations/003-remove-hooks-node.migration.d.ts.map +1 -1
- package/dist/migrations/003-remove-hooks-node.migration.js +0 -1
- package/dist/migrations/003-remove-hooks-node.migration.js.map +1 -1
- package/dist/migrations/006-resolve-hook-command-paths.migration.d.ts +9 -0
- package/dist/migrations/006-resolve-hook-command-paths.migration.d.ts.map +1 -0
- package/dist/migrations/006-resolve-hook-command-paths.migration.js +59 -0
- package/dist/migrations/006-resolve-hook-command-paths.migration.js.map +1 -0
- package/dist/migrations/007-decouple-provider-workspace-config.migration.d.ts +10 -0
- package/dist/migrations/007-decouple-provider-workspace-config.migration.d.ts.map +1 -0
- package/dist/migrations/007-decouple-provider-workspace-config.migration.js +118 -0
- package/dist/migrations/007-decouple-provider-workspace-config.migration.js.map +1 -0
- package/dist/migrations/index.d.ts +2 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +2 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/types.d.ts +1 -3
- package/dist/migrations/types.d.ts.map +1 -1
- package/dist/plugins/loaders/hooks-loader.js +1 -1
- package/dist/plugins/loaders/hooks-loader.js.map +1 -1
- package/dist/providers/core/default-agent-hooks.d.ts.map +1 -1
- package/dist/providers/core/default-agent-hooks.js +21 -5
- package/dist/providers/core/default-agent-hooks.js.map +1 -1
- package/dist/providers/core/types.d.ts +2 -28
- package/dist/providers/core/types.d.ts.map +1 -1
- package/dist/providers/core/types.js.map +1 -1
- package/dist/providers/integration/setup-ui.d.ts +5 -0
- package/dist/providers/integration/setup-ui.d.ts.map +1 -1
- package/dist/providers/integration/setup-ui.js +17 -2
- package/dist/providers/integration/setup-ui.js.map +1 -1
- package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.d.ts.map +1 -1
- package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.js +12 -0
- package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.js.map +1 -1
- package/dist/providers/plugins/litellm/litellm.setup-steps.d.ts.map +1 -1
- package/dist/providers/plugins/litellm/litellm.setup-steps.js +4 -21
- package/dist/providers/plugins/litellm/litellm.setup-steps.js.map +1 -1
- package/dist/providers/plugins/ollama/ollama.health.js +1 -1
- package/dist/providers/plugins/ollama/ollama.health.js.map +1 -1
- package/dist/providers/plugins/ollama/ollama.models.d.ts +29 -2
- package/dist/providers/plugins/ollama/ollama.models.d.ts.map +1 -1
- package/dist/providers/plugins/ollama/ollama.models.js +103 -22
- package/dist/providers/plugins/ollama/ollama.models.js.map +1 -1
- package/dist/providers/plugins/ollama/ollama.setup-steps.d.ts.map +1 -1
- package/dist/providers/plugins/ollama/ollama.setup-steps.js +71 -8
- package/dist/providers/plugins/ollama/ollama.setup-steps.js.map +1 -1
- package/dist/providers/plugins/ollama/ollama.template.d.ts.map +1 -1
- package/dist/providers/plugins/ollama/ollama.template.js +66 -6
- package/dist/providers/plugins/ollama/ollama.template.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.d.ts +3 -25
- package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.js +93 -100
- package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/codex-request-normalizer.plugin.js +7 -2
- package/dist/providers/plugins/sso/proxy/plugins/codex-request-normalizer.plugin.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/header-injection.plugin.js +5 -1
- package/dist/providers/plugins/sso/proxy/plugins/header-injection.plugin.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/sso-auth.plugin.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/sso-auth.plugin.js +32 -3
- package/dist/providers/plugins/sso/proxy/plugins/sso-auth.plugin.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/proxy-errors.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/proxy-errors.js +27 -1
- package/dist/providers/plugins/sso/proxy/proxy-errors.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/proxy-http-client.d.ts +7 -2
- package/dist/providers/plugins/sso/proxy/proxy-http-client.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/proxy-http-client.js +191 -15
- package/dist/providers/plugins/sso/proxy/proxy-http-client.js.map +1 -1
- package/dist/providers/plugins/sso/sso.auth.d.ts.map +1 -1
- package/dist/providers/plugins/sso/sso.auth.js +6 -2
- package/dist/providers/plugins/sso/sso.auth.js.map +1 -1
- package/dist/providers/plugins/sso/sso.setup-steps.d.ts.map +1 -1
- package/dist/providers/plugins/sso/sso.setup-steps.js +22 -39
- package/dist/providers/plugins/sso/sso.setup-steps.js.map +1 -1
- package/dist/utils/config.d.ts +20 -27
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +90 -84
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/hardware.d.ts +36 -0
- package/dist/utils/hardware.d.ts.map +1 -0
- package/dist/utils/hardware.js +86 -0
- package/dist/utils/hardware.js.map +1 -0
- package/dist/utils/hook-command.d.ts +4 -0
- package/dist/utils/hook-command.d.ts.map +1 -0
- package/dist/utils/hook-command.js +82 -0
- package/dist/utils/hook-command.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +21 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/pricing.json +24 -0
- package/dist/utils/security.d.ts +28 -2
- package/dist/utils/security.d.ts.map +1 -1
- package/dist/utils/security.js +84 -24
- package/dist/utils/security.js.map +1 -1
- package/package.json +4 -10
- package/scripts/release.sh +3 -3
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { ProviderRegistry } from '../../core/registry.js';
|
|
10
10
|
import { OllamaTemplate } from './ollama.template.js';
|
|
11
|
+
import { toCloudOffloadTag } from './ollama.models.js';
|
|
11
12
|
/**
|
|
12
13
|
* Ollama setup steps implementation
|
|
13
14
|
*
|
|
@@ -17,7 +18,8 @@ export const OllamaSetupSteps = {
|
|
|
17
18
|
name: 'ollama',
|
|
18
19
|
/**
|
|
19
20
|
* Get credentials for Ollama
|
|
20
|
-
*
|
|
21
|
+
* The local daemon needs no API key; an optional ollama.com API key
|
|
22
|
+
* additionally enables listing models available on Ollama cloud.
|
|
21
23
|
*/
|
|
22
24
|
async getCredentials() {
|
|
23
25
|
const inquirer = (await import('inquirer')).default;
|
|
@@ -74,26 +76,83 @@ export const OllamaSetupSteps = {
|
|
|
74
76
|
healthSpinner.fail(chalk.red('Failed to check Ollama health'));
|
|
75
77
|
throw error;
|
|
76
78
|
}
|
|
79
|
+
// Detect system capabilities (with GPU probe) so model selection can
|
|
80
|
+
// recommend only the local models that actually fit this machine
|
|
81
|
+
const { detectSystemCapabilities } = await import('../../../utils/hardware.js');
|
|
82
|
+
const capabilities = await detectSystemCapabilities();
|
|
83
|
+
console.log(chalk.dim(` System: ~${Math.round(capabilities.totalMemoryGb)}GB RAM` +
|
|
84
|
+
(capabilities.gpuMemoryGb ? `, ~${Math.round(capabilities.gpuMemoryGb)}GB GPU VRAM` : '') +
|
|
85
|
+
` (~${Math.round(capabilities.usableMemoryGb)}GB usable for local models)\n`));
|
|
86
|
+
// Optional ollama.com API key - lets agents run cloud models directly
|
|
87
|
+
// on ollama.com (no local daemon) and unlocks Ollama's web search/fetch
|
|
88
|
+
// API (https://ollama.com/settings/keys). Not needed for local usage.
|
|
89
|
+
const { apiKey: cloudApiKey } = await inquirer.prompt([
|
|
90
|
+
{
|
|
91
|
+
type: 'password',
|
|
92
|
+
name: 'apiKey',
|
|
93
|
+
message: 'Ollama cloud API key (optional, for ollama.com direct access):',
|
|
94
|
+
mask: '*'
|
|
95
|
+
}
|
|
96
|
+
]);
|
|
97
|
+
let apiKey = (cloudApiKey || '').trim();
|
|
98
|
+
// Validate the key against ollama.com before saving it
|
|
99
|
+
if (apiKey) {
|
|
100
|
+
const keySpinner = ora('Validating Ollama cloud API key...').start();
|
|
101
|
+
const { validateOllamaCloudApiKey } = await import('./ollama.models.js');
|
|
102
|
+
if (await validateOllamaCloudApiKey(apiKey)) {
|
|
103
|
+
keySpinner.succeed(chalk.green('Ollama cloud API key is valid'));
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
keySpinner.fail(chalk.red('Ollama cloud API key validation failed'));
|
|
107
|
+
console.log(chalk.yellow(' Check your key at https://ollama.com/settings/keys\n'));
|
|
108
|
+
const { keepKey } = await inquirer.prompt([
|
|
109
|
+
{
|
|
110
|
+
type: 'confirm',
|
|
111
|
+
name: 'keepKey',
|
|
112
|
+
message: 'Save this key anyway?',
|
|
113
|
+
default: false
|
|
114
|
+
}
|
|
115
|
+
]);
|
|
116
|
+
if (!keepKey) {
|
|
117
|
+
apiKey = '';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
77
121
|
return {
|
|
78
122
|
baseUrl,
|
|
79
|
-
apiKey
|
|
123
|
+
apiKey
|
|
80
124
|
};
|
|
81
125
|
},
|
|
82
126
|
/**
|
|
83
127
|
* Fetch available models from Ollama
|
|
128
|
+
*
|
|
129
|
+
* Offers installed local models, the template's curated recommendations,
|
|
130
|
+
* and the ollama.com cloud catalog (capability filtering happens in the
|
|
131
|
+
* selection UI via modelMetadata).
|
|
132
|
+
*
|
|
133
|
+
* For local setups (daemon at localhost) cloud catalog entries are mapped
|
|
134
|
+
* to their local cloud-offload tag (`gpt-oss:120b` -> `gpt-oss:120b-cloud`,
|
|
135
|
+
* `kimi-k2.6` -> `kimi-k2.6:cloud`) so selecting one pulls an instant
|
|
136
|
+
* manifest and runs it on Ollama cloud through the signed-in daemon.
|
|
137
|
+
* When the base URL points at ollama.com directly, raw catalog ids are
|
|
138
|
+
* used as-is.
|
|
84
139
|
*/
|
|
85
140
|
async fetchModels(credentials) {
|
|
86
141
|
const { OllamaModelProxy } = await import('./ollama.models.js');
|
|
87
|
-
const modelProxy = new OllamaModelProxy(credentials.baseUrl);
|
|
142
|
+
const modelProxy = new OllamaModelProxy(credentials.baseUrl, credentials.apiKey);
|
|
88
143
|
try {
|
|
89
144
|
const models = await modelProxy.fetchModels({
|
|
90
145
|
provider: 'ollama',
|
|
91
146
|
baseUrl: credentials.baseUrl,
|
|
92
|
-
apiKey: '',
|
|
147
|
+
apiKey: credentials.apiKey || '',
|
|
93
148
|
model: 'temp',
|
|
94
149
|
timeout: 300
|
|
95
150
|
});
|
|
96
|
-
|
|
151
|
+
const isCloudHost = (credentials.baseUrl || '').includes('ollama.com');
|
|
152
|
+
const ids = models.map(m => !isCloudHost && m.metadata?.origin === 'cloud'
|
|
153
|
+
? toCloudOffloadTag(m.id)
|
|
154
|
+
: m.id);
|
|
155
|
+
return [...new Set([...ids, ...OllamaTemplate.recommendedModels])];
|
|
97
156
|
}
|
|
98
157
|
catch {
|
|
99
158
|
// If fetch fails, return empty so setup prompts the user to enter a
|
|
@@ -108,7 +167,7 @@ export const OllamaSetupSteps = {
|
|
|
108
167
|
const ora = (await import('ora')).default;
|
|
109
168
|
const chalk = (await import('chalk')).default;
|
|
110
169
|
const { OllamaModelProxy } = await import('./ollama.models.js');
|
|
111
|
-
const modelProxy = new OllamaModelProxy(credentials.baseUrl);
|
|
170
|
+
const modelProxy = new OllamaModelProxy(credentials.baseUrl, credentials.apiKey);
|
|
112
171
|
// Check if model is actually installed by querying Ollama directly
|
|
113
172
|
let isInstalled = false;
|
|
114
173
|
try {
|
|
@@ -143,7 +202,11 @@ export const OllamaSetupSteps = {
|
|
|
143
202
|
}
|
|
144
203
|
catch (error) {
|
|
145
204
|
installSpinner.fail(chalk.red('Model installation failed'));
|
|
146
|
-
|
|
205
|
+
const isCloudModel = selectedModel.endsWith('-cloud') || selectedModel.endsWith(':cloud');
|
|
206
|
+
const hint = isCloudModel
|
|
207
|
+
? ' (cloud models require `ollama signin` or a configured Ollama cloud API key)'
|
|
208
|
+
: '';
|
|
209
|
+
throw new Error(`Failed to install model: ${error instanceof Error ? error.message : 'Unknown error'}${hint}`);
|
|
147
210
|
}
|
|
148
211
|
},
|
|
149
212
|
/**
|
|
@@ -159,7 +222,7 @@ export const OllamaSetupSteps = {
|
|
|
159
222
|
return {
|
|
160
223
|
provider: 'ollama',
|
|
161
224
|
baseUrl,
|
|
162
|
-
apiKey: '', //
|
|
225
|
+
apiKey: credentials.apiKey || '', // Optional ollama.com cloud API key
|
|
163
226
|
model,
|
|
164
227
|
timeout: 300,
|
|
165
228
|
debug: false
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.setup-steps.js","sourceRoot":"","sources":["../../../../src/providers/plugins/ollama/ollama.setup-steps.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ollama.setup-steps.js","sourceRoot":"","sources":["../../../../src/providers/plugins/ollama/ollama.setup-steps.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.template.d.ts","sourceRoot":"","sources":["../../../../src/providers/plugins/ollama/ollama.template.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"ollama.template.d.ts","sourceRoot":"","sources":["../../../../src/providers/plugins/ollama/ollama.template.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,eAAO,MAAM,cAAc,kBAqHzB,CAAC"}
|
|
@@ -17,15 +17,66 @@ export const OllamaTemplate = registerProvider({
|
|
|
17
17
|
authType: 'none',
|
|
18
18
|
recommendedModels: [
|
|
19
19
|
'qwen2.5-coder',
|
|
20
|
-
'
|
|
21
|
-
'deepseek-coder-v2'
|
|
22
|
-
'deepseek-v3.1:671b-cloud'
|
|
20
|
+
'gpt-oss:120b-cloud',
|
|
21
|
+
'deepseek-coder-v2'
|
|
23
22
|
],
|
|
23
|
+
modelMetadata: {
|
|
24
|
+
'qwen2.5-coder': {
|
|
25
|
+
name: 'Qwen 2.5 Coder',
|
|
26
|
+
description: 'Excellent coding model with tool support (7B, ~5GB download)',
|
|
27
|
+
popular: true,
|
|
28
|
+
minMemoryGb: 8
|
|
29
|
+
},
|
|
30
|
+
'gpt-oss:120b-cloud': {
|
|
31
|
+
name: 'GPT-OSS 120B (cloud)',
|
|
32
|
+
description: 'OpenAI open-weight model on Ollama cloud - no local memory required',
|
|
33
|
+
popular: true
|
|
34
|
+
// No minMemoryGb: runs on ollama.com, not on the local machine
|
|
35
|
+
},
|
|
36
|
+
'deepseek-coder-v2': {
|
|
37
|
+
name: 'DeepSeek Coder V2',
|
|
38
|
+
description: 'Advanced coding model with tool support (16B, ~9GB download)',
|
|
39
|
+
popular: true,
|
|
40
|
+
minMemoryGb: 12
|
|
41
|
+
}
|
|
42
|
+
},
|
|
24
43
|
capabilities: ['streaming', 'tools', 'embeddings', 'model-management'],
|
|
25
44
|
supportsModelInstallation: true,
|
|
26
45
|
healthCheckEndpoint: '/api/version',
|
|
27
46
|
// Agent lifecycle hooks
|
|
28
|
-
agentHooks: {
|
|
47
|
+
agentHooks: {
|
|
48
|
+
// Wildcard hook: adjust env for ALL agents when running against Ollama.
|
|
49
|
+
// Chained before each agent's own default hooks (see resolveHook).
|
|
50
|
+
'*': {
|
|
51
|
+
beforeRun: async (env, config) => {
|
|
52
|
+
// Claude Code speaks the Anthropic Messages API, which Ollama serves
|
|
53
|
+
// at the host root (https://docs.ollama.com/api/anthropic-compatibility),
|
|
54
|
+
// while the profile baseUrl carries the OpenAI-compatible /v1 suffix.
|
|
55
|
+
if (env.ANTHROPIC_BASE_URL) {
|
|
56
|
+
env.ANTHROPIC_BASE_URL = env.ANTHROPIC_BASE_URL.replace(/\/v1\/?$/, '');
|
|
57
|
+
// Ollama ignores the token but Claude Code requires it to be set.
|
|
58
|
+
// A real ollama.com API key is used when configured (cloud access).
|
|
59
|
+
env.ANTHROPIC_AUTH_TOKEN =
|
|
60
|
+
config.apiKey && config.apiKey !== 'not-required' ? config.apiKey : 'ollama';
|
|
61
|
+
// Model tiers: ollama model names never match the haiku/sonnet/opus
|
|
62
|
+
// auto-selection, so route every tier to the selected model instead
|
|
63
|
+
// of letting Claude Code fall back to its built-in claude-* defaults.
|
|
64
|
+
if (env.CODEMIE_MODEL) {
|
|
65
|
+
if (!env.ANTHROPIC_DEFAULT_HAIKU_MODEL) {
|
|
66
|
+
env.ANTHROPIC_DEFAULT_HAIKU_MODEL = env.CODEMIE_MODEL;
|
|
67
|
+
}
|
|
68
|
+
if (!env.ANTHROPIC_DEFAULT_SONNET_MODEL) {
|
|
69
|
+
env.ANTHROPIC_DEFAULT_SONNET_MODEL = env.CODEMIE_MODEL;
|
|
70
|
+
}
|
|
71
|
+
if (!env.ANTHROPIC_DEFAULT_OPUS_MODEL) {
|
|
72
|
+
env.ANTHROPIC_DEFAULT_OPUS_MODEL = env.CODEMIE_MODEL;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return env;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
},
|
|
29
80
|
setupInstructions: `
|
|
30
81
|
# Ollama Setup Instructions
|
|
31
82
|
|
|
@@ -47,12 +98,21 @@ Download from: https://ollama.com/download
|
|
|
47
98
|
**Important**: Some agents require models with function calling/tool support.
|
|
48
99
|
|
|
49
100
|
- **qwen2.5-coder**: Excellent for coding tasks with tool support (7B, ~5GB)
|
|
50
|
-
- **
|
|
101
|
+
- **gpt-oss:120b-cloud**: OpenAI's open-weight model via Ollama cloud (120B, no download)
|
|
51
102
|
- **deepseek-coder-v2**: Advanced coding model with tool support (16B, ~9GB)
|
|
52
|
-
- **deepseek-v3.1:671b-cloud**: Latest DeepSeek with advanced reasoning (671B)
|
|
53
103
|
|
|
54
104
|
**Note**: Models without tool support (like codellama) will fail with agents that require function calling.
|
|
55
105
|
|
|
106
|
+
## Ollama Cloud (ollama.com)
|
|
107
|
+
|
|
108
|
+
Signed in locally via \`ollama signin\`? The local daemon authenticates cloud
|
|
109
|
+
models automatically - no extra configuration needed to *run* \`-cloud\` models.
|
|
110
|
+
The cloud model catalog is listed automatically during setup (public endpoint).
|
|
111
|
+
|
|
112
|
+
An optional API key from https://ollama.com/settings/keys additionally enables:
|
|
113
|
+
- Running cloud models directly on ollama.com (no local daemon required)
|
|
114
|
+
- Ollama's web search / web fetch API
|
|
115
|
+
|
|
56
116
|
## Documentation
|
|
57
117
|
|
|
58
118
|
- Official website: https://ollama.com
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.template.js","sourceRoot":"","sources":["../../../../src/providers/plugins/ollama/ollama.template.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAmB;IAC/D,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,QAAQ;IACrB,WAAW,EAAE,2EAA2E;IACxF,WAAW,EAAE,KAAK;IAClB,cAAc,EAAE,wBAAwB;IACxC,YAAY,EAAE,KAAK;IACnB,QAAQ,EAAE,MAAM;IAChB,iBAAiB,EAAE;QACjB,eAAe;QACf,
|
|
1
|
+
{"version":3,"file":"ollama.template.js","sourceRoot":"","sources":["../../../../src/providers/plugins/ollama/ollama.template.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAmB;IAC/D,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,QAAQ;IACrB,WAAW,EAAE,2EAA2E;IACxF,WAAW,EAAE,KAAK;IAClB,cAAc,EAAE,wBAAwB;IACxC,YAAY,EAAE,KAAK;IACnB,QAAQ,EAAE,MAAM;IAChB,iBAAiB,EAAE;QACjB,eAAe;QACf,oBAAoB;QACpB,mBAAmB;KACpB;IACD,aAAa,EAAE;QACb,eAAe,EAAE;YACf,IAAI,EAAE,gBAAgB;YACtB,WAAW,EAAE,8DAA8D;YAC3E,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,CAAC;SACf;QACD,oBAAoB,EAAE;YACpB,IAAI,EAAE,sBAAsB;YAC5B,WAAW,EAAE,qEAAqE;YAClF,OAAO,EAAE,IAAI;YACb,+DAA+D;SAChE;QACD,mBAAmB,EAAE;YACnB,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,8DAA8D;YAC3E,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,EAAE;SAChB;KACF;IACD,YAAY,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,kBAAkB,CAAC;IACtE,yBAAyB,EAAE,IAAI;IAC/B,mBAAmB,EAAE,cAAc;IAEnC,wBAAwB;IACxB,UAAU,EAAE;QACV,wEAAwE;QACxE,mEAAmE;QACnE,GAAG,EAAE;YACH,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;gBAC/B,qEAAqE;gBACrE,0EAA0E;gBAC1E,sEAAsE;gBACtE,IAAI,GAAG,CAAC,kBAAkB,EAAE,CAAC;oBAC3B,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;oBAExE,kEAAkE;oBAClE,oEAAoE;oBACpE,GAAG,CAAC,oBAAoB;wBACtB,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;oBAE/E,oEAAoE;oBACpE,oEAAoE;oBACpE,sEAAsE;oBACtE,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;wBACtB,IAAI,CAAC,GAAG,CAAC,6BAA6B,EAAE,CAAC;4BACvC,GAAG,CAAC,6BAA6B,GAAG,GAAG,CAAC,aAAa,CAAC;wBACxD,CAAC;wBACD,IAAI,CAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC;4BACxC,GAAG,CAAC,8BAA8B,GAAG,GAAG,CAAC,aAAa,CAAC;wBACzD,CAAC;wBACD,IAAI,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC;4BACtC,GAAG,CAAC,4BAA4B,GAAG,GAAG,CAAC,aAAa,CAAC;wBACvD,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,OAAO,GAAG,CAAC;YACb,CAAC;SACF;KACF;IAED,iBAAiB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCpB;CACA,CAAC,CAAC"}
|
|
@@ -1,29 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Claude
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Normalizes Claude API requests to match model-specific requirements.
|
|
6
|
-
* Handles thinking parameter variations across Claude model versions:
|
|
7
|
-
*
|
|
8
|
-
* 1. Models that DO NOT support thinking (e.g. claude-haiku-4-5, 4-6):
|
|
9
|
-
* → strips the thinking field entirely to prevent API errors
|
|
10
|
-
*
|
|
11
|
-
* 2. Models that require adaptive thinking API (e.g. claude-opus-4-7+, claude-sonnet-5):
|
|
12
|
-
* → "enabled" → thinking: { type: "adaptive" } + output_config.effort
|
|
13
|
-
* → "disabled" → either preserve or delete the field depending on model support
|
|
14
|
-
*
|
|
15
|
-
* 3. Models that deprecate sampling parameters (e.g. claude-sonnet-5):
|
|
16
|
-
* → strips temperature / top_p / top_k entirely to prevent API errors
|
|
17
|
-
*
|
|
18
|
-
* Problem: Claude Code sends `thinking: { type: "enabled", budget_tokens: N }`.
|
|
19
|
-
* - Haiku models reject thinking field with HTTP 400
|
|
20
|
-
* - Opus 4-7+ requires adaptive thinking format with output_config.effort
|
|
21
|
-
* - Sonnet 5 rejects manual extended thinking and sampling parameters
|
|
22
|
-
*
|
|
23
|
-
* Scope: Enabled for codemie-claude (Claude Code via SSO proxy), codemie-copilot
|
|
24
|
-
* (GitHub Copilot CLI via BYOK Anthropic shape), and claude-desktop (Desktop 3P mode).
|
|
25
|
-
*
|
|
26
|
-
* To add model support: update NO_THINKING_MODEL_PATTERNS or ADAPTIVE_THINKING_MODEL_PATTERNS.
|
|
2
|
+
* Normalizes Claude API requests per model. Every model-specific decision reads
|
|
3
|
+
* from MODEL_CAPABILITY_TABLE; add/edit a row to change support. Priority 14
|
|
4
|
+
* (before RequestSanitizer at 15). See EPMCDME-14035.
|
|
27
5
|
*/
|
|
28
6
|
import { ProxyPlugin, PluginContext, ProxyInterceptor } from './types.js';
|
|
29
7
|
export declare class ClaudeRequestNormalizerPlugin implements ProxyPlugin {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-request-normalizer.plugin.d.ts","sourceRoot":"","sources":["../../../../../../src/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claude-request-normalizer.plugin.d.ts","sourceRoot":"","sources":["../../../../../../src/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA8J1E,qBAAa,6BAA8B,YAAW,WAAW;IAC/D,EAAE,SAA8C;IAChD,IAAI,SAA+B;IACnC,OAAO,SAAW;IAClB,QAAQ,SAAM;IAER,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAQ3E"}
|
|
@@ -1,65 +1,44 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Claude
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Normalizes Claude API requests to match model-specific requirements.
|
|
6
|
-
* Handles thinking parameter variations across Claude model versions:
|
|
7
|
-
*
|
|
8
|
-
* 1. Models that DO NOT support thinking (e.g. claude-haiku-4-5, 4-6):
|
|
9
|
-
* → strips the thinking field entirely to prevent API errors
|
|
10
|
-
*
|
|
11
|
-
* 2. Models that require adaptive thinking API (e.g. claude-opus-4-7+, claude-sonnet-5):
|
|
12
|
-
* → "enabled" → thinking: { type: "adaptive" } + output_config.effort
|
|
13
|
-
* → "disabled" → either preserve or delete the field depending on model support
|
|
14
|
-
*
|
|
15
|
-
* 3. Models that deprecate sampling parameters (e.g. claude-sonnet-5):
|
|
16
|
-
* → strips temperature / top_p / top_k entirely to prevent API errors
|
|
17
|
-
*
|
|
18
|
-
* Problem: Claude Code sends `thinking: { type: "enabled", budget_tokens: N }`.
|
|
19
|
-
* - Haiku models reject thinking field with HTTP 400
|
|
20
|
-
* - Opus 4-7+ requires adaptive thinking format with output_config.effort
|
|
21
|
-
* - Sonnet 5 rejects manual extended thinking and sampling parameters
|
|
22
|
-
*
|
|
23
|
-
* Scope: Enabled for codemie-claude (Claude Code via SSO proxy), codemie-copilot
|
|
24
|
-
* (GitHub Copilot CLI via BYOK Anthropic shape), and claude-desktop (Desktop 3P mode).
|
|
25
|
-
*
|
|
26
|
-
* To add model support: update NO_THINKING_MODEL_PATTERNS or ADAPTIVE_THINKING_MODEL_PATTERNS.
|
|
2
|
+
* Normalizes Claude API requests per model. Every model-specific decision reads
|
|
3
|
+
* from MODEL_CAPABILITY_TABLE; add/edit a row to change support. Priority 14
|
|
4
|
+
* (before RequestSanitizer at 15). See EPMCDME-14035.
|
|
27
5
|
*/
|
|
28
6
|
import { logger } from '../../../../../utils/logger.js';
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
7
|
+
// Applied when no MODEL_CAPABILITY_TABLE row matches.
|
|
8
|
+
const DEFAULT_CAPABILITIES = {
|
|
9
|
+
thinking: 'standard',
|
|
10
|
+
effort: false,
|
|
11
|
+
sampling: true,
|
|
12
|
+
preserveDisabledThinking: false,
|
|
13
|
+
};
|
|
14
|
+
// Pattern → capabilities, first match wins. The `(?:[^0-9]|$)` after each version
|
|
15
|
+
// stops `4-7` from matching `4-70`. See EPMCDME-11821 / EPMCDME-14035.
|
|
16
|
+
const MODEL_CAPABILITY_TABLE = [
|
|
17
|
+
{
|
|
18
|
+
// claude-haiku-3-5 / 4-5 (+ date-tagged): no extended thinking at all.
|
|
19
|
+
pattern: /claude-haiku-(3-5|4-5)(?:[^0-9]|$)/i,
|
|
20
|
+
capabilities: { thinking: 'none', effort: false, sampling: true, preserveDisabledThinking: false },
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
// claude-opus-4-7/8/9 (+ date-tagged; excludes 4-70+): adaptive thinking + effort.
|
|
24
|
+
pattern: /claude-opus-4-[7-9](?:[^0-9]|$)/i,
|
|
25
|
+
capabilities: { thinking: 'adaptive', effort: true, sampling: true, preserveDisabledThinking: false },
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
// claude-sonnet-5 (+ date-tagged): adaptive thinking + effort; rejects manual
|
|
29
|
+
// sampling params; keeps thinking.type="disabled".
|
|
30
|
+
pattern: /claude-sonnet-5(?:[^0-9]|$)/i,
|
|
31
|
+
capabilities: { thinking: 'adaptive', effort: true, sampling: false, preserveDisabledThinking: true },
|
|
32
|
+
},
|
|
44
33
|
];
|
|
45
|
-
function
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
function modelPreservesDisabledThinking(modelName) {
|
|
52
|
-
return /claude-sonnet-5(?:[^0-9]|$)/i.test(modelName);
|
|
53
|
-
}
|
|
54
|
-
function modelDisablesSamplingParameters(modelName) {
|
|
55
|
-
return /claude-sonnet-5(?:[^0-9]|$)/i.test(modelName);
|
|
34
|
+
function capabilitiesFor(model) {
|
|
35
|
+
for (const entry of MODEL_CAPABILITY_TABLE) {
|
|
36
|
+
if (entry.pattern.test(model))
|
|
37
|
+
return entry.capabilities;
|
|
38
|
+
}
|
|
39
|
+
return DEFAULT_CAPABILITIES;
|
|
56
40
|
}
|
|
57
|
-
|
|
58
|
-
* Map legacy budget_tokens to the closest output_config.effort level.
|
|
59
|
-
*
|
|
60
|
-
* budget_tokens was the maximum token budget for thinking in the old API.
|
|
61
|
-
* effort is a coarser control in the new API: low / medium / high.
|
|
62
|
-
*/
|
|
41
|
+
// Map legacy budget_tokens to the coarser new-API effort level.
|
|
63
42
|
function budgetTokensToEffort(budgetTokens) {
|
|
64
43
|
const tokens = typeof budgetTokens === 'number' ? budgetTokens : 0;
|
|
65
44
|
if (tokens <= 2048)
|
|
@@ -68,50 +47,66 @@ function budgetTokensToEffort(budgetTokens) {
|
|
|
68
47
|
return 'medium';
|
|
69
48
|
return 'high';
|
|
70
49
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
delete body.thinking;
|
|
80
|
-
logger.debug(`[claude-request-normalizer] Stripped thinking field for unsupported model: ${model}`);
|
|
81
|
-
return true;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Handler: transforms thinking.type "enabled"/"disabled" to adaptive API format.
|
|
85
|
-
* Returns true if transformation applied, false if nothing changed.
|
|
86
|
-
*/
|
|
87
|
-
function handleAdaptiveThinkingTransform(body, model) {
|
|
88
|
-
const thinkingType = body.thinking?.type;
|
|
89
|
-
if (thinkingType !== 'enabled' && thinkingType !== 'disabled') {
|
|
90
|
-
return false;
|
|
91
|
-
}
|
|
92
|
-
if (!modelRequiresAdaptiveThinking(model)) {
|
|
93
|
-
return false;
|
|
50
|
+
// Normalize the thinking field per caps.thinking. Called only when body.thinking is set.
|
|
51
|
+
function handleThinkingField(body, caps, model) {
|
|
52
|
+
if (caps.thinking === 'none') {
|
|
53
|
+
delete body.thinking;
|
|
54
|
+
logger.debug(`[claude-request-normalizer] Stripped thinking field for unsupported model: ${model}`);
|
|
55
|
+
return true;
|
|
94
56
|
}
|
|
95
|
-
if (
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
body.output_config = { ...(body.output_config ?? {}), effort };
|
|
57
|
+
if (caps.thinking === 'adaptive') {
|
|
58
|
+
const thinkingType = body.thinking?.type;
|
|
59
|
+
if (thinkingType !== 'enabled' && thinkingType !== 'disabled') {
|
|
60
|
+
return false;
|
|
100
61
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
62
|
+
if (thinkingType === 'enabled') {
|
|
63
|
+
const effort = budgetTokensToEffort(body.thinking.budget_tokens);
|
|
64
|
+
body.thinking = { type: 'adaptive' };
|
|
65
|
+
if (!body.output_config?.effort) {
|
|
66
|
+
body.output_config = { ...(body.output_config ?? {}), effort };
|
|
67
|
+
}
|
|
68
|
+
logger.debug(`[claude-request-normalizer] Transformed thinking: "enabled" → "adaptive", effort="${effort}" for model: ${model}`);
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
// thinkingType === 'disabled'
|
|
72
|
+
if (caps.preserveDisabledThinking) {
|
|
105
73
|
logger.debug(`[claude-request-normalizer] Preserved thinking.type="disabled" for model: ${model}`);
|
|
106
74
|
return false;
|
|
107
75
|
}
|
|
108
76
|
delete body.thinking;
|
|
109
77
|
logger.debug(`[claude-request-normalizer] Removed unsupported thinking.type="disabled" for model: ${model}`);
|
|
78
|
+
return true;
|
|
110
79
|
}
|
|
111
|
-
|
|
80
|
+
// 'standard' — leave the thinking field untouched.
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
// Strip effort for models that reject it: Claude Code's --effort flag becomes
|
|
84
|
+
// output_config.effort (or top-level effort) and 400s on e.g. claude-4-5-sonnet.
|
|
85
|
+
function handleUnsupportedEffort(body, caps, model) {
|
|
86
|
+
if (caps.effort) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
let stripped = false;
|
|
90
|
+
const outputConfig = body.output_config;
|
|
91
|
+
if (outputConfig && typeof outputConfig === 'object' && 'effort' in outputConfig) {
|
|
92
|
+
delete outputConfig.effort;
|
|
93
|
+
stripped = true;
|
|
94
|
+
if (Object.keys(outputConfig).length === 0) {
|
|
95
|
+
delete body.output_config;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if ('effort' in body) {
|
|
99
|
+
delete body.effort;
|
|
100
|
+
stripped = true;
|
|
101
|
+
}
|
|
102
|
+
if (stripped) {
|
|
103
|
+
logger.debug(`[claude-request-normalizer] Stripped unsupported effort parameter for model: ${model}`);
|
|
104
|
+
}
|
|
105
|
+
return stripped;
|
|
112
106
|
}
|
|
113
|
-
|
|
114
|
-
|
|
107
|
+
// Strip sampling params (temperature/top_p/top_k) for models that reject them.
|
|
108
|
+
function handleDeprecatedSamplingParams(body, caps, model) {
|
|
109
|
+
if (caps.sampling) {
|
|
115
110
|
return false;
|
|
116
111
|
}
|
|
117
112
|
const stripped = [];
|
|
@@ -127,7 +122,6 @@ function handleDeprecatedSamplingParams(body, model) {
|
|
|
127
122
|
logger.debug(`[claude-request-normalizer] Stripped deprecated sampling params for model ${model}: ${stripped.join(', ')}`);
|
|
128
123
|
return true;
|
|
129
124
|
}
|
|
130
|
-
/** Agents whose Claude API requests need thinking normalization */
|
|
131
125
|
const ALLOWED_AGENTS = ['codemie-claude', 'codemie-copilot', 'claude-desktop'];
|
|
132
126
|
export class ClaudeRequestNormalizerPlugin {
|
|
133
127
|
id = '@codemie/proxy-claude-request-normalizer';
|
|
@@ -139,7 +133,6 @@ export class ClaudeRequestNormalizerPlugin {
|
|
|
139
133
|
if (!clientType || !ALLOWED_AGENTS.includes(clientType)) {
|
|
140
134
|
throw new Error(`Plugin disabled for agent: ${clientType}`);
|
|
141
135
|
}
|
|
142
|
-
// Pass the configured model as a fallback for requests that omit body.model
|
|
143
136
|
const configModel = context.config.model;
|
|
144
137
|
return new ClaudeRequestNormalizerInterceptor(configModel);
|
|
145
138
|
}
|
|
@@ -161,15 +154,15 @@ class ClaudeRequestNormalizerInterceptor {
|
|
|
161
154
|
if (!model) {
|
|
162
155
|
return;
|
|
163
156
|
}
|
|
164
|
-
const
|
|
157
|
+
const caps = capabilitiesFor(model);
|
|
158
|
+
const modifiedBySampling = handleDeprecatedSamplingParams(body, caps, model);
|
|
159
|
+
// Not behind the thinking guard: Claude Code can send effort without thinking.
|
|
160
|
+
const modifiedByEffort = handleUnsupportedEffort(body, caps, model);
|
|
165
161
|
let modifiedByThinking = false;
|
|
166
162
|
if (body.thinking) {
|
|
167
|
-
|
|
168
|
-
modifiedByThinking =
|
|
169
|
-
handleNoThinkingModels(body, model) ||
|
|
170
|
-
handleAdaptiveThinkingTransform(body, model);
|
|
163
|
+
modifiedByThinking = handleThinkingField(body, caps, model);
|
|
171
164
|
}
|
|
172
|
-
if (modifiedBySampling || modifiedByThinking) {
|
|
165
|
+
if (modifiedBySampling || modifiedByEffort || modifiedByThinking) {
|
|
173
166
|
const newBodyStr = JSON.stringify(body);
|
|
174
167
|
context.requestBody = Buffer.from(newBodyStr, 'utf-8');
|
|
175
168
|
context.headers['content-length'] = String(context.requestBody.length);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-request-normalizer.plugin.js","sourceRoot":"","sources":["../../../../../../src/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claude-request-normalizer.plugin.js","sourceRoot":"","sources":["../../../../../../src/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -185,8 +185,13 @@ class CodexRequestNormalizerInterceptor {
|
|
|
185
185
|
*/
|
|
186
186
|
resolveFallbackModel() {
|
|
187
187
|
const pinned = this.context.config.model;
|
|
188
|
-
if (pinned
|
|
189
|
-
|
|
188
|
+
if (pinned) {
|
|
189
|
+
// The pinned value may be the profile's undated picker name; resolve it to
|
|
190
|
+
// its dated deployment the same way an in-flight request is resolved.
|
|
191
|
+
const resolution = resolveCodexDeployment(pinned, this.availableModels, undefined);
|
|
192
|
+
if (resolution.kind === 'exact' || resolution.kind === 'resolved')
|
|
193
|
+
return resolution.model;
|
|
194
|
+
}
|
|
190
195
|
return rankDeploymentsByRecency(this.availableModels)[0];
|
|
191
196
|
}
|
|
192
197
|
/**
|