whale-code 6.4.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/README.md +95 -0
- package/bin/swag-agent.js +9 -0
- package/bin/swagmanager-mcp.js +321 -0
- package/dist/cli/app.d.ts +26 -0
- package/dist/cli/app.js +64 -0
- package/dist/cli/chat/AgentSelector.d.ts +14 -0
- package/dist/cli/chat/AgentSelector.js +14 -0
- package/dist/cli/chat/ChatApp.d.ts +9 -0
- package/dist/cli/chat/ChatApp.js +267 -0
- package/dist/cli/chat/ChatInput.d.ts +39 -0
- package/dist/cli/chat/ChatInput.js +509 -0
- package/dist/cli/chat/MarkdownText.d.ts +10 -0
- package/dist/cli/chat/MarkdownText.js +20 -0
- package/dist/cli/chat/MessageList.d.ts +37 -0
- package/dist/cli/chat/MessageList.js +80 -0
- package/dist/cli/chat/ModelSelector.d.ts +20 -0
- package/dist/cli/chat/ModelSelector.js +73 -0
- package/dist/cli/chat/RewindViewer.d.ts +26 -0
- package/dist/cli/chat/RewindViewer.js +185 -0
- package/dist/cli/chat/StoreSelector.d.ts +14 -0
- package/dist/cli/chat/StoreSelector.js +24 -0
- package/dist/cli/chat/StreamingText.d.ts +12 -0
- package/dist/cli/chat/StreamingText.js +12 -0
- package/dist/cli/chat/SubagentPanel.d.ts +45 -0
- package/dist/cli/chat/SubagentPanel.js +110 -0
- package/dist/cli/chat/TeamPanel.d.ts +21 -0
- package/dist/cli/chat/TeamPanel.js +42 -0
- package/dist/cli/chat/ToolIndicator.d.ts +25 -0
- package/dist/cli/chat/ToolIndicator.js +436 -0
- package/dist/cli/chat/hooks/useAgentLoop.d.ts +39 -0
- package/dist/cli/chat/hooks/useAgentLoop.js +382 -0
- package/dist/cli/chat/hooks/useSlashCommands.d.ts +37 -0
- package/dist/cli/chat/hooks/useSlashCommands.js +387 -0
- package/dist/cli/commands/config-cmd.d.ts +10 -0
- package/dist/cli/commands/config-cmd.js +99 -0
- package/dist/cli/commands/doctor.d.ts +14 -0
- package/dist/cli/commands/doctor.js +172 -0
- package/dist/cli/commands/init.d.ts +16 -0
- package/dist/cli/commands/init.js +278 -0
- package/dist/cli/commands/mcp.d.ts +12 -0
- package/dist/cli/commands/mcp.js +162 -0
- package/dist/cli/login/LoginApp.d.ts +7 -0
- package/dist/cli/login/LoginApp.js +157 -0
- package/dist/cli/print-mode.d.ts +31 -0
- package/dist/cli/print-mode.js +202 -0
- package/dist/cli/serve-mode.d.ts +37 -0
- package/dist/cli/serve-mode.js +636 -0
- package/dist/cli/services/agent-definitions.d.ts +25 -0
- package/dist/cli/services/agent-definitions.js +91 -0
- package/dist/cli/services/agent-events.d.ts +178 -0
- package/dist/cli/services/agent-events.js +175 -0
- package/dist/cli/services/agent-loop.d.ts +90 -0
- package/dist/cli/services/agent-loop.js +762 -0
- package/dist/cli/services/agent-worker-base.d.ts +97 -0
- package/dist/cli/services/agent-worker-base.js +220 -0
- package/dist/cli/services/auth-service.d.ts +30 -0
- package/dist/cli/services/auth-service.js +160 -0
- package/dist/cli/services/background-processes.d.ts +126 -0
- package/dist/cli/services/background-processes.js +318 -0
- package/dist/cli/services/browser-auth.d.ts +24 -0
- package/dist/cli/services/browser-auth.js +180 -0
- package/dist/cli/services/claude-md-loader.d.ts +16 -0
- package/dist/cli/services/claude-md-loader.js +58 -0
- package/dist/cli/services/config-store.d.ts +47 -0
- package/dist/cli/services/config-store.js +79 -0
- package/dist/cli/services/debug-log.d.ts +10 -0
- package/dist/cli/services/debug-log.js +52 -0
- package/dist/cli/services/error-logger.d.ts +58 -0
- package/dist/cli/services/error-logger.js +269 -0
- package/dist/cli/services/file-history.d.ts +21 -0
- package/dist/cli/services/file-history.js +83 -0
- package/dist/cli/services/format-server-response.d.ts +16 -0
- package/dist/cli/services/format-server-response.js +440 -0
- package/dist/cli/services/git-context.d.ts +11 -0
- package/dist/cli/services/git-context.js +66 -0
- package/dist/cli/services/hooks.d.ts +85 -0
- package/dist/cli/services/hooks.js +258 -0
- package/dist/cli/services/interactive-tools.d.ts +125 -0
- package/dist/cli/services/interactive-tools.js +260 -0
- package/dist/cli/services/keybinding-manager.d.ts +52 -0
- package/dist/cli/services/keybinding-manager.js +115 -0
- package/dist/cli/services/local-tools.d.ts +22 -0
- package/dist/cli/services/local-tools.js +697 -0
- package/dist/cli/services/lsp-manager.d.ts +18 -0
- package/dist/cli/services/lsp-manager.js +717 -0
- package/dist/cli/services/mcp-client.d.ts +48 -0
- package/dist/cli/services/mcp-client.js +157 -0
- package/dist/cli/services/memory-manager.d.ts +16 -0
- package/dist/cli/services/memory-manager.js +57 -0
- package/dist/cli/services/model-manager.d.ts +18 -0
- package/dist/cli/services/model-manager.js +71 -0
- package/dist/cli/services/model-router.d.ts +26 -0
- package/dist/cli/services/model-router.js +149 -0
- package/dist/cli/services/permission-modes.d.ts +13 -0
- package/dist/cli/services/permission-modes.js +43 -0
- package/dist/cli/services/rewind.d.ts +84 -0
- package/dist/cli/services/rewind.js +194 -0
- package/dist/cli/services/ripgrep.d.ts +28 -0
- package/dist/cli/services/ripgrep.js +138 -0
- package/dist/cli/services/sandbox.d.ts +29 -0
- package/dist/cli/services/sandbox.js +97 -0
- package/dist/cli/services/server-tools.d.ts +61 -0
- package/dist/cli/services/server-tools.js +543 -0
- package/dist/cli/services/session-persistence.d.ts +23 -0
- package/dist/cli/services/session-persistence.js +99 -0
- package/dist/cli/services/subagent-worker.d.ts +19 -0
- package/dist/cli/services/subagent-worker.js +41 -0
- package/dist/cli/services/subagent.d.ts +47 -0
- package/dist/cli/services/subagent.js +647 -0
- package/dist/cli/services/system-prompt.d.ts +7 -0
- package/dist/cli/services/system-prompt.js +198 -0
- package/dist/cli/services/team-lead.d.ts +73 -0
- package/dist/cli/services/team-lead.js +512 -0
- package/dist/cli/services/team-state.d.ts +77 -0
- package/dist/cli/services/team-state.js +398 -0
- package/dist/cli/services/teammate.d.ts +31 -0
- package/dist/cli/services/teammate.js +689 -0
- package/dist/cli/services/telemetry.d.ts +61 -0
- package/dist/cli/services/telemetry.js +209 -0
- package/dist/cli/services/tools/agent-tools.d.ts +14 -0
- package/dist/cli/services/tools/agent-tools.js +347 -0
- package/dist/cli/services/tools/file-ops.d.ts +15 -0
- package/dist/cli/services/tools/file-ops.js +487 -0
- package/dist/cli/services/tools/search-tools.d.ts +8 -0
- package/dist/cli/services/tools/search-tools.js +186 -0
- package/dist/cli/services/tools/shell-exec.d.ts +10 -0
- package/dist/cli/services/tools/shell-exec.js +168 -0
- package/dist/cli/services/tools/task-manager.d.ts +28 -0
- package/dist/cli/services/tools/task-manager.js +209 -0
- package/dist/cli/services/tools/web-tools.d.ts +11 -0
- package/dist/cli/services/tools/web-tools.js +395 -0
- package/dist/cli/setup/SetupApp.d.ts +9 -0
- package/dist/cli/setup/SetupApp.js +191 -0
- package/dist/cli/shared/MatrixIntro.d.ts +4 -0
- package/dist/cli/shared/MatrixIntro.js +83 -0
- package/dist/cli/shared/Theme.d.ts +74 -0
- package/dist/cli/shared/Theme.js +127 -0
- package/dist/cli/shared/WhaleBanner.d.ts +10 -0
- package/dist/cli/shared/WhaleBanner.js +12 -0
- package/dist/cli/shared/markdown.d.ts +21 -0
- package/dist/cli/shared/markdown.js +756 -0
- package/dist/cli/status/StatusApp.d.ts +4 -0
- package/dist/cli/status/StatusApp.js +105 -0
- package/dist/cli/stores/StoreApp.d.ts +7 -0
- package/dist/cli/stores/StoreApp.js +81 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +538 -0
- package/dist/local-agent/connection.d.ts +48 -0
- package/dist/local-agent/connection.js +332 -0
- package/dist/local-agent/discovery.d.ts +18 -0
- package/dist/local-agent/discovery.js +146 -0
- package/dist/local-agent/executor.d.ts +34 -0
- package/dist/local-agent/executor.js +241 -0
- package/dist/local-agent/index.d.ts +14 -0
- package/dist/local-agent/index.js +198 -0
- package/dist/node/adapters/base.d.ts +35 -0
- package/dist/node/adapters/base.js +10 -0
- package/dist/node/adapters/discord.d.ts +29 -0
- package/dist/node/adapters/discord.js +299 -0
- package/dist/node/adapters/email.d.ts +23 -0
- package/dist/node/adapters/email.js +218 -0
- package/dist/node/adapters/imessage.d.ts +17 -0
- package/dist/node/adapters/imessage.js +118 -0
- package/dist/node/adapters/slack.d.ts +26 -0
- package/dist/node/adapters/slack.js +259 -0
- package/dist/node/adapters/sms.d.ts +23 -0
- package/dist/node/adapters/sms.js +161 -0
- package/dist/node/adapters/telegram.d.ts +17 -0
- package/dist/node/adapters/telegram.js +101 -0
- package/dist/node/adapters/webchat.d.ts +27 -0
- package/dist/node/adapters/webchat.js +160 -0
- package/dist/node/adapters/whatsapp.d.ts +28 -0
- package/dist/node/adapters/whatsapp.js +230 -0
- package/dist/node/cli.d.ts +2 -0
- package/dist/node/cli.js +325 -0
- package/dist/node/config.d.ts +17 -0
- package/dist/node/config.js +31 -0
- package/dist/node/runtime.d.ts +50 -0
- package/dist/node/runtime.js +351 -0
- package/dist/server/handlers/__test-utils__/mock-supabase.d.ts +11 -0
- package/dist/server/handlers/__test-utils__/mock-supabase.js +393 -0
- package/dist/server/handlers/analytics.d.ts +17 -0
- package/dist/server/handlers/analytics.js +266 -0
- package/dist/server/handlers/api-keys.d.ts +6 -0
- package/dist/server/handlers/api-keys.js +221 -0
- package/dist/server/handlers/billing.d.ts +33 -0
- package/dist/server/handlers/billing.js +272 -0
- package/dist/server/handlers/browser.d.ts +10 -0
- package/dist/server/handlers/browser.js +517 -0
- package/dist/server/handlers/catalog.d.ts +99 -0
- package/dist/server/handlers/catalog.js +976 -0
- package/dist/server/handlers/comms.d.ts +254 -0
- package/dist/server/handlers/comms.js +588 -0
- package/dist/server/handlers/creations.d.ts +6 -0
- package/dist/server/handlers/creations.js +479 -0
- package/dist/server/handlers/crm.d.ts +89 -0
- package/dist/server/handlers/crm.js +538 -0
- package/dist/server/handlers/discovery.d.ts +6 -0
- package/dist/server/handlers/discovery.js +288 -0
- package/dist/server/handlers/embeddings.d.ts +92 -0
- package/dist/server/handlers/embeddings.js +197 -0
- package/dist/server/handlers/enrichment.d.ts +8 -0
- package/dist/server/handlers/enrichment.js +768 -0
- package/dist/server/handlers/image-gen.d.ts +6 -0
- package/dist/server/handlers/image-gen.js +409 -0
- package/dist/server/handlers/inventory.d.ts +319 -0
- package/dist/server/handlers/inventory.js +447 -0
- package/dist/server/handlers/kali.d.ts +10 -0
- package/dist/server/handlers/kali.js +210 -0
- package/dist/server/handlers/llm-providers.d.ts +6 -0
- package/dist/server/handlers/llm-providers.js +673 -0
- package/dist/server/handlers/local-agent.d.ts +6 -0
- package/dist/server/handlers/local-agent.js +118 -0
- package/dist/server/handlers/meta-ads.d.ts +111 -0
- package/dist/server/handlers/meta-ads.js +2279 -0
- package/dist/server/handlers/nodes.d.ts +33 -0
- package/dist/server/handlers/nodes.js +699 -0
- package/dist/server/handlers/operations.d.ts +138 -0
- package/dist/server/handlers/operations.js +131 -0
- package/dist/server/handlers/platform.d.ts +23 -0
- package/dist/server/handlers/platform.js +227 -0
- package/dist/server/handlers/supply-chain.d.ts +19 -0
- package/dist/server/handlers/supply-chain.js +327 -0
- package/dist/server/handlers/transcription.d.ts +17 -0
- package/dist/server/handlers/transcription.js +121 -0
- package/dist/server/handlers/video-gen.d.ts +6 -0
- package/dist/server/handlers/video-gen.js +466 -0
- package/dist/server/handlers/voice.d.ts +8 -0
- package/dist/server/handlers/voice.js +1146 -0
- package/dist/server/handlers/workflow-steps.d.ts +86 -0
- package/dist/server/handlers/workflow-steps.js +2349 -0
- package/dist/server/handlers/workflows.d.ts +7 -0
- package/dist/server/handlers/workflows.js +989 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.js +2427 -0
- package/dist/server/lib/batch-client.d.ts +80 -0
- package/dist/server/lib/batch-client.js +467 -0
- package/dist/server/lib/code-worker-pool.d.ts +31 -0
- package/dist/server/lib/code-worker-pool.js +224 -0
- package/dist/server/lib/code-worker.d.ts +1 -0
- package/dist/server/lib/code-worker.js +188 -0
- package/dist/server/lib/compaction-service.d.ts +32 -0
- package/dist/server/lib/compaction-service.js +162 -0
- package/dist/server/lib/logger.d.ts +19 -0
- package/dist/server/lib/logger.js +46 -0
- package/dist/server/lib/otel.d.ts +38 -0
- package/dist/server/lib/otel.js +126 -0
- package/dist/server/lib/pg-rate-limiter.d.ts +21 -0
- package/dist/server/lib/pg-rate-limiter.js +86 -0
- package/dist/server/lib/prompt-sanitizer.d.ts +37 -0
- package/dist/server/lib/prompt-sanitizer.js +177 -0
- package/dist/server/lib/provider-capabilities.d.ts +85 -0
- package/dist/server/lib/provider-capabilities.js +190 -0
- package/dist/server/lib/provider-failover.d.ts +74 -0
- package/dist/server/lib/provider-failover.js +210 -0
- package/dist/server/lib/rate-limiter.d.ts +39 -0
- package/dist/server/lib/rate-limiter.js +147 -0
- package/dist/server/lib/server-agent-loop.d.ts +107 -0
- package/dist/server/lib/server-agent-loop.js +667 -0
- package/dist/server/lib/server-subagent.d.ts +78 -0
- package/dist/server/lib/server-subagent.js +203 -0
- package/dist/server/lib/session-checkpoint.d.ts +51 -0
- package/dist/server/lib/session-checkpoint.js +145 -0
- package/dist/server/lib/ssrf-guard.d.ts +13 -0
- package/dist/server/lib/ssrf-guard.js +240 -0
- package/dist/server/lib/supabase-client.d.ts +7 -0
- package/dist/server/lib/supabase-client.js +78 -0
- package/dist/server/lib/template-resolver.d.ts +31 -0
- package/dist/server/lib/template-resolver.js +215 -0
- package/dist/server/lib/utils.d.ts +16 -0
- package/dist/server/lib/utils.js +147 -0
- package/dist/server/local-agent-gateway.d.ts +82 -0
- package/dist/server/local-agent-gateway.js +426 -0
- package/dist/server/providers/anthropic.d.ts +20 -0
- package/dist/server/providers/anthropic.js +199 -0
- package/dist/server/providers/bedrock.d.ts +20 -0
- package/dist/server/providers/bedrock.js +194 -0
- package/dist/server/providers/gemini.d.ts +24 -0
- package/dist/server/providers/gemini.js +486 -0
- package/dist/server/providers/openai.d.ts +24 -0
- package/dist/server/providers/openai.js +522 -0
- package/dist/server/providers/registry.d.ts +32 -0
- package/dist/server/providers/registry.js +58 -0
- package/dist/server/providers/shared.d.ts +32 -0
- package/dist/server/providers/shared.js +124 -0
- package/dist/server/providers/types.d.ts +92 -0
- package/dist/server/providers/types.js +12 -0
- package/dist/server/proxy-handlers.d.ts +6 -0
- package/dist/server/proxy-handlers.js +89 -0
- package/dist/server/tool-router.d.ts +149 -0
- package/dist/server/tool-router.js +803 -0
- package/dist/server/validation.d.ts +24 -0
- package/dist/server/validation.js +301 -0
- package/dist/server/worker.d.ts +19 -0
- package/dist/server/worker.js +201 -0
- package/dist/setup.d.ts +8 -0
- package/dist/setup.js +181 -0
- package/dist/shared/agent-core.d.ts +157 -0
- package/dist/shared/agent-core.js +534 -0
- package/dist/shared/anthropic-types.d.ts +105 -0
- package/dist/shared/anthropic-types.js +7 -0
- package/dist/shared/api-client.d.ts +90 -0
- package/dist/shared/api-client.js +379 -0
- package/dist/shared/constants.d.ts +33 -0
- package/dist/shared/constants.js +80 -0
- package/dist/shared/sse-parser.d.ts +26 -0
- package/dist/shared/sse-parser.js +259 -0
- package/dist/shared/tool-dispatch.d.ts +52 -0
- package/dist/shared/tool-dispatch.js +191 -0
- package/dist/shared/types.d.ts +72 -0
- package/dist/shared/types.js +7 -0
- package/dist/updater.d.ts +25 -0
- package/dist/updater.js +140 -0
- package/dist/webchat/widget.d.ts +0 -0
- package/dist/webchat/widget.js +397 -0
- package/package.json +95 -0
- package/src/cli/services/builtin-skills/commit.md +19 -0
- package/src/cli/services/builtin-skills/review-pr.md +21 -0
- package/src/cli/services/builtin-skills/review.md +18 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Provider Adapter — direct Anthropic API passthrough.
|
|
3
|
+
*
|
|
4
|
+
* Simplest adapter: system prompt gets cache_control blocks, tools get
|
|
5
|
+
* { name, description, input_schema }, streaming events pass through as-is.
|
|
6
|
+
*
|
|
7
|
+
* Phase 7.1: Also encapsulates thinking config, context management,
|
|
8
|
+
* output token limits, and compaction config for Anthropic/Claude models.
|
|
9
|
+
*/
|
|
10
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
11
|
+
import { sanitizeError } from "../../shared/agent-core.js";
|
|
12
|
+
import { getCapabilities } from "../lib/provider-capabilities.js";
|
|
13
|
+
import { registerProvider } from "./registry.js";
|
|
14
|
+
import { jsonResponse, writeSSEHeaders } from "./shared.js";
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// CONSTANTS — Anthropic-specific model config
|
|
17
|
+
// ============================================================================
|
|
18
|
+
const COMPACTION_TRIGGER_TOKENS = 120_000;
|
|
19
|
+
const COMPACTION_TOTAL_BUDGET = 2_000_000;
|
|
20
|
+
const DEFAULT_OUTPUT_TOKENS = 16384;
|
|
21
|
+
const MODEL_MAX_OUTPUT_TOKENS = {
|
|
22
|
+
"claude-opus-4-6": 128000,
|
|
23
|
+
"claude-sonnet-4-6": 64000,
|
|
24
|
+
"claude-haiku-4-5-20251001": 64000,
|
|
25
|
+
"claude-sonnet-4-5-20250929": 64000,
|
|
26
|
+
"claude-opus-4-5-20251101": 64000,
|
|
27
|
+
"claude-opus-4-1-20250805": 32768,
|
|
28
|
+
"claude-sonnet-4-20250514": 64000,
|
|
29
|
+
"claude-opus-4-20250514": 32768,
|
|
30
|
+
"claude-3-7-sonnet-20250219": 64000,
|
|
31
|
+
"claude-3-haiku-20240307": 4096,
|
|
32
|
+
};
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// ADAPTER
|
|
35
|
+
// ============================================================================
|
|
36
|
+
export class AnthropicAdapter {
|
|
37
|
+
name = "anthropic";
|
|
38
|
+
async handleStream(res, config, corsHeaders) {
|
|
39
|
+
const { model, messages, system, tools, max_tokens, temperature, stream = true, betas, context_management, thinking, tool_choice, documents, } = config;
|
|
40
|
+
const ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY;
|
|
41
|
+
const anthropic = new Anthropic({ apiKey: ANTHROPIC_API_KEY });
|
|
42
|
+
const apiParams = { model, max_tokens, messages, stream: true };
|
|
43
|
+
if (system) {
|
|
44
|
+
if (typeof system === "string") {
|
|
45
|
+
apiParams.system = [{ type: "text", text: system, cache_control: { type: "ephemeral" } }];
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
apiParams.system = system;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (tools?.length) {
|
|
52
|
+
apiParams.tools = tools.map((t) => ({
|
|
53
|
+
name: t.name,
|
|
54
|
+
description: typeof t.description === "string" ? t.description.slice(0, 4096) : "",
|
|
55
|
+
input_schema: t.input_schema,
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
if (temperature !== undefined)
|
|
59
|
+
apiParams.temperature = temperature;
|
|
60
|
+
// Citations API: add beta and documents when source documents are provided
|
|
61
|
+
const effectiveBetas = betas?.length ? [...betas] : [];
|
|
62
|
+
if (documents?.length) {
|
|
63
|
+
if (!effectiveBetas.includes("citations-2025-04-15")) {
|
|
64
|
+
effectiveBetas.push("citations-2025-04-15");
|
|
65
|
+
}
|
|
66
|
+
apiParams.documents = documents;
|
|
67
|
+
}
|
|
68
|
+
if (effectiveBetas.length)
|
|
69
|
+
apiParams.betas = effectiveBetas;
|
|
70
|
+
if (context_management?.edits?.length)
|
|
71
|
+
apiParams.context_management = context_management;
|
|
72
|
+
if (thinking)
|
|
73
|
+
apiParams.thinking = thinking;
|
|
74
|
+
// Map tool_choice to Anthropic format
|
|
75
|
+
if (tool_choice) {
|
|
76
|
+
if (tool_choice === "auto") {
|
|
77
|
+
apiParams.tool_choice = { type: "auto" };
|
|
78
|
+
}
|
|
79
|
+
else if (tool_choice === "any") {
|
|
80
|
+
apiParams.tool_choice = { type: "any" };
|
|
81
|
+
}
|
|
82
|
+
else if (tool_choice === "none") {
|
|
83
|
+
// "none" means no tools — remove tools from request
|
|
84
|
+
delete apiParams.tools;
|
|
85
|
+
}
|
|
86
|
+
else if (typeof tool_choice === "object" && tool_choice.type === "tool") {
|
|
87
|
+
apiParams.tool_choice = { type: "tool", name: tool_choice.name };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (!stream) {
|
|
91
|
+
try {
|
|
92
|
+
const response = effectiveBetas.length
|
|
93
|
+
? await anthropic.beta.messages.create({ ...apiParams, stream: false })
|
|
94
|
+
: await anthropic.messages.create({ ...apiParams, stream: false });
|
|
95
|
+
jsonResponse(res, 200, response, corsHeaders);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
jsonResponse(res, 500, { error: sanitizeError(err) }, corsHeaders);
|
|
99
|
+
}
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// Streaming: defer SSE headers until stream is successfully created
|
|
103
|
+
// so we can return proper HTTP errors if the initial API call fails.
|
|
104
|
+
let heartbeat;
|
|
105
|
+
try {
|
|
106
|
+
const response = effectiveBetas.length
|
|
107
|
+
? await anthropic.beta.messages.create({ ...apiParams, stream: true })
|
|
108
|
+
: await anthropic.messages.create(apiParams);
|
|
109
|
+
// Stream created successfully — now safe to commit to SSE
|
|
110
|
+
writeSSEHeaders(res, corsHeaders);
|
|
111
|
+
// Heartbeat keeps the connection alive and helps detect dead clients
|
|
112
|
+
heartbeat = setInterval(() => {
|
|
113
|
+
if (!res.writableEnded)
|
|
114
|
+
res.write(":ping\n\n");
|
|
115
|
+
}, 15_000);
|
|
116
|
+
for await (const event of response) {
|
|
117
|
+
res.write(`data: ${JSON.stringify(event)}\n\n`);
|
|
118
|
+
}
|
|
119
|
+
res.write("data: [DONE]\n\n");
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
if (!res.headersSent) {
|
|
123
|
+
// Haven't started streaming yet — return proper HTTP error
|
|
124
|
+
jsonResponse(res, 502, { error: `anthropic error: ${sanitizeError(err)}` }, corsHeaders);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// Mid-stream failure — send error event so client doesn't hang
|
|
128
|
+
res.write(`data: ${JSON.stringify({ type: "error", error: sanitizeError(err) })}\n\n`);
|
|
129
|
+
res.write("data: [DONE]\n\n");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
if (heartbeat)
|
|
134
|
+
clearInterval(heartbeat);
|
|
135
|
+
}
|
|
136
|
+
res.end();
|
|
137
|
+
}
|
|
138
|
+
// ---- Provider-specific config methods ----
|
|
139
|
+
getThinkingConfig(model, enabled) {
|
|
140
|
+
if (!enabled) {
|
|
141
|
+
return { thinking: { type: "disabled" }, beta: "" };
|
|
142
|
+
}
|
|
143
|
+
if (model.includes("opus-4-6") || model.includes("sonnet-4-6")) {
|
|
144
|
+
return {
|
|
145
|
+
thinking: { type: "adaptive" },
|
|
146
|
+
beta: "adaptive-thinking-2026-01-28",
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// Sonnet 4.5/4.0 / Haiku: fixed budget
|
|
150
|
+
return {
|
|
151
|
+
thinking: { type: "enabled", budget_tokens: 10_000 },
|
|
152
|
+
beta: "interleaved-thinking-2025-05-14",
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
getMaxOutputTokens(model, agentMax) {
|
|
156
|
+
const modelMax = MODEL_MAX_OUTPUT_TOKENS[model] ?? DEFAULT_OUTPUT_TOKENS;
|
|
157
|
+
if (agentMax)
|
|
158
|
+
return Math.min(agentMax, modelMax);
|
|
159
|
+
return Math.min(DEFAULT_OUTPUT_TOKENS, modelMax);
|
|
160
|
+
}
|
|
161
|
+
getContextManagement(model) {
|
|
162
|
+
const edits = [];
|
|
163
|
+
const betas = ["context-management-2025-06-27"];
|
|
164
|
+
// Thinking block clearing — must come FIRST in edits array (API requirement).
|
|
165
|
+
edits.push({
|
|
166
|
+
type: "clear_thinking_20251015",
|
|
167
|
+
keep: { type: "thinking_turns", value: 2 },
|
|
168
|
+
});
|
|
169
|
+
// Server-side compaction for models that support compact_20260112.
|
|
170
|
+
const supportsCompaction = model.includes("opus-4-6") || model.includes("sonnet-4-6");
|
|
171
|
+
if (supportsCompaction) {
|
|
172
|
+
edits.push({
|
|
173
|
+
type: "compact_20260112",
|
|
174
|
+
trigger: { type: "input_tokens", value: COMPACTION_TRIGGER_TOKENS },
|
|
175
|
+
pause_after_compaction: true,
|
|
176
|
+
instructions: "Summarize the conversation preserving: (1) task goals and constraints, (2) files created/modified with paths, (3) decisions made and rationale, (4) errors encountered and resolutions, (5) exact next steps. Be concise but preserve all state needed to continue work without repeating mistakes.",
|
|
177
|
+
});
|
|
178
|
+
betas.push("compact-2026-01-12");
|
|
179
|
+
}
|
|
180
|
+
edits.push({
|
|
181
|
+
type: "clear_tool_uses_20250919",
|
|
182
|
+
trigger: { type: "input_tokens", value: 80_000 },
|
|
183
|
+
keep: { type: "tool_uses", value: 3 },
|
|
184
|
+
});
|
|
185
|
+
return { betas, config: { edits } };
|
|
186
|
+
}
|
|
187
|
+
getCompactionConfig(_model) {
|
|
188
|
+
return {
|
|
189
|
+
triggerTokens: COMPACTION_TRIGGER_TOKENS,
|
|
190
|
+
totalBudget: COMPACTION_TOTAL_BUDGET,
|
|
191
|
+
isNative: true,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
getCapabilities() {
|
|
195
|
+
return getCapabilities("anthropic");
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Auto-register on import
|
|
199
|
+
registerProvider("anthropic", new AnthropicAdapter());
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bedrock Provider Adapter — AWS Bedrock Claude streaming.
|
|
3
|
+
*
|
|
4
|
+
* Similar to Anthropic but: strips cache_control from system blocks,
|
|
5
|
+
* uses AWS SDK credentials, parses event.chunk.bytes for streaming.
|
|
6
|
+
*
|
|
7
|
+
* Phase 7.1: Also encapsulates thinking config, context management,
|
|
8
|
+
* output token limits, and compaction config for Bedrock Claude models.
|
|
9
|
+
*/
|
|
10
|
+
import type { ProviderAdapter, ProviderStreamConfig, ProviderCapabilities, ThinkingConfigResult, ContextManagementConfig, CompactionConfig } from "./types.js";
|
|
11
|
+
import type http from "node:http";
|
|
12
|
+
export declare class BedrockAdapter implements ProviderAdapter {
|
|
13
|
+
name: string;
|
|
14
|
+
handleStream(res: http.ServerResponse, config: ProviderStreamConfig, corsHeaders: Record<string, string>): Promise<void>;
|
|
15
|
+
getThinkingConfig(model: string, enabled: boolean): ThinkingConfigResult;
|
|
16
|
+
getMaxOutputTokens(model: string, agentMax?: number): number;
|
|
17
|
+
getContextManagement(model: string): ContextManagementConfig;
|
|
18
|
+
getCompactionConfig(_model: string): CompactionConfig;
|
|
19
|
+
getCapabilities(): ProviderCapabilities;
|
|
20
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bedrock Provider Adapter — AWS Bedrock Claude streaming.
|
|
3
|
+
*
|
|
4
|
+
* Similar to Anthropic but: strips cache_control from system blocks,
|
|
5
|
+
* uses AWS SDK credentials, parses event.chunk.bytes for streaming.
|
|
6
|
+
*
|
|
7
|
+
* Phase 7.1: Also encapsulates thinking config, context management,
|
|
8
|
+
* output token limits, and compaction config for Bedrock Claude models.
|
|
9
|
+
*/
|
|
10
|
+
import { BedrockRuntimeClient, InvokeModelWithResponseStreamCommand } from "@aws-sdk/client-bedrock-runtime";
|
|
11
|
+
import { sanitizeError } from "../../shared/agent-core.js";
|
|
12
|
+
import { getCapabilities } from "../lib/provider-capabilities.js";
|
|
13
|
+
import { registerProvider } from "./registry.js";
|
|
14
|
+
import { jsonResponse, writeSSEHeaders, resolveProviderCredentials } from "./shared.js";
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// CONSTANTS — Bedrock-specific model config
|
|
17
|
+
// ============================================================================
|
|
18
|
+
const COMPACTION_TRIGGER_TOKENS = 120_000;
|
|
19
|
+
const COMPACTION_TOTAL_BUDGET = 2_000_000;
|
|
20
|
+
const DEFAULT_OUTPUT_TOKENS = 16384;
|
|
21
|
+
const MODEL_MAX_OUTPUT_TOKENS = {
|
|
22
|
+
"anthropic.claude-sonnet-4-6": 64000,
|
|
23
|
+
"us.anthropic.claude-sonnet-4-20250514-v1:0": 64000,
|
|
24
|
+
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": 64000,
|
|
25
|
+
"us.anthropic.claude-haiku-4-5-20251001-v1:0": 64000,
|
|
26
|
+
};
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// ADAPTER
|
|
29
|
+
// ============================================================================
|
|
30
|
+
export class BedrockAdapter {
|
|
31
|
+
name = "bedrock";
|
|
32
|
+
async handleStream(res, config, corsHeaders) {
|
|
33
|
+
const { model, messages, system, tools, max_tokens, temperature, thinking, storeId, tool_choice } = config;
|
|
34
|
+
const creds = await resolveProviderCredentials("bedrock", storeId);
|
|
35
|
+
if (!creds.bedrock) {
|
|
36
|
+
jsonResponse(res, 422, { error: "Bedrock credentials not configured. Add aws_access_key_id and aws_secret_access_key to platform_secrets." }, corsHeaders);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const client = new BedrockRuntimeClient({
|
|
40
|
+
region: creds.bedrock.region,
|
|
41
|
+
credentials: {
|
|
42
|
+
accessKeyId: creds.bedrock.accessKeyId,
|
|
43
|
+
secretAccessKey: creds.bedrock.secretAccessKey,
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
// Build Anthropic Messages API body (Bedrock Claude understands this natively)
|
|
47
|
+
const bedrockBody = {
|
|
48
|
+
anthropic_version: "bedrock-2023-10-16",
|
|
49
|
+
max_tokens,
|
|
50
|
+
messages,
|
|
51
|
+
};
|
|
52
|
+
if (system) {
|
|
53
|
+
bedrockBody.system = typeof system === "string"
|
|
54
|
+
? [{ type: "text", text: system }]
|
|
55
|
+
: system.map((s) => {
|
|
56
|
+
// Strip cache_control — Bedrock doesn't support it
|
|
57
|
+
const { cache_control: _, ...rest } = s;
|
|
58
|
+
return rest;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (tools?.length) {
|
|
62
|
+
bedrockBody.tools = tools.map((t) => ({
|
|
63
|
+
name: t.name,
|
|
64
|
+
description: typeof t.description === "string" ? t.description.slice(0, 4096) : "",
|
|
65
|
+
input_schema: t.input_schema,
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
if (temperature !== undefined)
|
|
69
|
+
bedrockBody.temperature = temperature;
|
|
70
|
+
if (thinking)
|
|
71
|
+
bedrockBody.thinking = thinking;
|
|
72
|
+
// Map tool_choice to Anthropic/Bedrock format
|
|
73
|
+
if (tool_choice) {
|
|
74
|
+
if (tool_choice === "auto") {
|
|
75
|
+
bedrockBody.tool_choice = { type: "auto" };
|
|
76
|
+
}
|
|
77
|
+
else if (tool_choice === "any") {
|
|
78
|
+
bedrockBody.tool_choice = { type: "any" };
|
|
79
|
+
}
|
|
80
|
+
else if (tool_choice === "none") {
|
|
81
|
+
// "none" means no tools — remove tools from request
|
|
82
|
+
delete bedrockBody.tools;
|
|
83
|
+
}
|
|
84
|
+
else if (typeof tool_choice === "object" && tool_choice.type === "tool") {
|
|
85
|
+
bedrockBody.tool_choice = { type: "tool", name: tool_choice.name };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const command = new InvokeModelWithResponseStreamCommand({
|
|
89
|
+
modelId: model,
|
|
90
|
+
contentType: "application/json",
|
|
91
|
+
accept: "application/json",
|
|
92
|
+
body: new TextEncoder().encode(JSON.stringify(bedrockBody)),
|
|
93
|
+
});
|
|
94
|
+
// Stream SSE — defer headers until stream is successfully created
|
|
95
|
+
// so we can return proper HTTP errors if the initial API call fails.
|
|
96
|
+
let heartbeat;
|
|
97
|
+
try {
|
|
98
|
+
const response = await client.send(command);
|
|
99
|
+
// Stream created successfully — now safe to commit to SSE
|
|
100
|
+
writeSSEHeaders(res, corsHeaders);
|
|
101
|
+
// Heartbeat keeps the connection alive and helps detect dead clients
|
|
102
|
+
heartbeat = setInterval(() => {
|
|
103
|
+
if (!res.writableEnded)
|
|
104
|
+
res.write(":ping\n\n");
|
|
105
|
+
}, 15_000);
|
|
106
|
+
if (response.body) {
|
|
107
|
+
for await (const event of response.body) {
|
|
108
|
+
if (event.chunk?.bytes) {
|
|
109
|
+
const chunk = JSON.parse(new TextDecoder().decode(event.chunk.bytes));
|
|
110
|
+
res.write(`data: ${JSON.stringify(chunk)}\n\n`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
res.write("data: [DONE]\n\n");
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
if (!res.headersSent) {
|
|
118
|
+
// Haven't started streaming yet — return proper HTTP error
|
|
119
|
+
jsonResponse(res, 502, { error: `bedrock error: ${sanitizeError(err)}` }, corsHeaders);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// Mid-stream failure — send error event so client doesn't hang
|
|
123
|
+
res.write(`data: ${JSON.stringify({ type: "error", error: sanitizeError(err) })}\n\n`);
|
|
124
|
+
res.write("data: [DONE]\n\n");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
if (heartbeat)
|
|
129
|
+
clearInterval(heartbeat);
|
|
130
|
+
}
|
|
131
|
+
res.end();
|
|
132
|
+
}
|
|
133
|
+
// ---- Provider-specific config methods ----
|
|
134
|
+
// Bedrock uses same thinking/context management as Anthropic (it's Claude underneath)
|
|
135
|
+
getThinkingConfig(model, enabled) {
|
|
136
|
+
if (!enabled) {
|
|
137
|
+
return { thinking: { type: "disabled" }, beta: "" };
|
|
138
|
+
}
|
|
139
|
+
// Bedrock model IDs contain the Claude model name
|
|
140
|
+
if (model.includes("opus-4-6") || model.includes("sonnet-4-6")) {
|
|
141
|
+
return {
|
|
142
|
+
thinking: { type: "adaptive" },
|
|
143
|
+
beta: "adaptive-thinking-2026-01-28",
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
thinking: { type: "enabled", budget_tokens: 10_000 },
|
|
148
|
+
beta: "interleaved-thinking-2025-05-14",
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
getMaxOutputTokens(model, agentMax) {
|
|
152
|
+
const modelMax = MODEL_MAX_OUTPUT_TOKENS[model] ?? DEFAULT_OUTPUT_TOKENS;
|
|
153
|
+
if (agentMax)
|
|
154
|
+
return Math.min(agentMax, modelMax);
|
|
155
|
+
return Math.min(DEFAULT_OUTPUT_TOKENS, modelMax);
|
|
156
|
+
}
|
|
157
|
+
getContextManagement(model) {
|
|
158
|
+
// Bedrock Claude supports the same context management as direct Anthropic
|
|
159
|
+
const edits = [];
|
|
160
|
+
const betas = ["context-management-2025-06-27"];
|
|
161
|
+
edits.push({
|
|
162
|
+
type: "clear_thinking_20251015",
|
|
163
|
+
keep: { type: "thinking_turns", value: 2 },
|
|
164
|
+
});
|
|
165
|
+
const supportsCompaction = model.includes("opus-4-6") || model.includes("sonnet-4-6");
|
|
166
|
+
if (supportsCompaction) {
|
|
167
|
+
edits.push({
|
|
168
|
+
type: "compact_20260112",
|
|
169
|
+
trigger: { type: "input_tokens", value: COMPACTION_TRIGGER_TOKENS },
|
|
170
|
+
pause_after_compaction: true,
|
|
171
|
+
instructions: "Summarize the conversation preserving: (1) task goals and constraints, (2) files created/modified with paths, (3) decisions made and rationale, (4) errors encountered and resolutions, (5) exact next steps. Be concise but preserve all state needed to continue work without repeating mistakes.",
|
|
172
|
+
});
|
|
173
|
+
betas.push("compact-2026-01-12");
|
|
174
|
+
}
|
|
175
|
+
edits.push({
|
|
176
|
+
type: "clear_tool_uses_20250919",
|
|
177
|
+
trigger: { type: "input_tokens", value: 80_000 },
|
|
178
|
+
keep: { type: "tool_uses", value: 3 },
|
|
179
|
+
});
|
|
180
|
+
return { betas, config: { edits } };
|
|
181
|
+
}
|
|
182
|
+
getCompactionConfig(_model) {
|
|
183
|
+
return {
|
|
184
|
+
triggerTokens: COMPACTION_TRIGGER_TOKENS,
|
|
185
|
+
totalBudget: COMPACTION_TOTAL_BUDGET,
|
|
186
|
+
isNative: true,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
getCapabilities() {
|
|
190
|
+
return getCapabilities("bedrock");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Auto-register on import
|
|
194
|
+
registerProvider("bedrock", new BedrockAdapter());
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini Provider Adapter — full format conversion to/from Anthropic SSE.
|
|
3
|
+
*
|
|
4
|
+
* Contains:
|
|
5
|
+
* - anthropicToGeminiMessages() — message format conversion
|
|
6
|
+
* - sanitizeSchemaForGemini() — type uppercase, enum stringification, key stripping
|
|
7
|
+
* - anthropicToGeminiFunctions() — tool conversion
|
|
8
|
+
* - Streaming event loop with thinking/text/function call detection
|
|
9
|
+
* - seenFunctionCalls deduplication
|
|
10
|
+
*
|
|
11
|
+
* Phase 7.1: Also encapsulates thinking config, context management,
|
|
12
|
+
* output token limits, and compaction config for Gemini models.
|
|
13
|
+
*/
|
|
14
|
+
import type { ProviderAdapter, ProviderStreamConfig, ProviderCapabilities, ThinkingConfigResult, ContextManagementConfig, CompactionConfig } from "./types.js";
|
|
15
|
+
import type http from "node:http";
|
|
16
|
+
export declare class GeminiAdapter implements ProviderAdapter {
|
|
17
|
+
name: string;
|
|
18
|
+
handleStream(res: http.ServerResponse, config: ProviderStreamConfig, corsHeaders: Record<string, string>): Promise<void>;
|
|
19
|
+
getThinkingConfig(_model: string, enabled: boolean): ThinkingConfigResult;
|
|
20
|
+
getMaxOutputTokens(model: string, agentMax?: number): number;
|
|
21
|
+
getContextManagement(_model: string): ContextManagementConfig;
|
|
22
|
+
getCompactionConfig(_model: string): CompactionConfig;
|
|
23
|
+
getCapabilities(): ProviderCapabilities;
|
|
24
|
+
}
|