neoctl 0.2.52 → 0.2.54
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 +0 -1
- package/dist/agents/agent-tool.js +4 -4
- package/dist/agents/agent-tool.js.map +1 -1
- package/dist/core/query-engine.d.ts +10 -0
- package/dist/core/query-engine.js +72 -16
- package/dist/core/query-engine.js.map +1 -1
- package/dist/core/query.d.ts +1 -0
- package/dist/core/query.js +5 -0
- package/dist/core/query.js.map +1 -1
- package/dist/core/run-agent.js +45 -36
- package/dist/core/run-agent.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/model/agent-settings-boundary.d.ts +11 -0
- package/dist/model/agent-settings-boundary.js +52 -0
- package/dist/model/agent-settings-boundary.js.map +1 -0
- package/dist/model/anthropic-adapter.d.ts +24 -0
- package/dist/model/anthropic-adapter.js +106 -0
- package/dist/model/anthropic-adapter.js.map +1 -0
- package/dist/model/anthropic-mapper.d.ts +14 -0
- package/dist/model/anthropic-mapper.js +340 -0
- package/dist/model/anthropic-mapper.js.map +1 -0
- package/dist/model/composition-runtime.d.ts +31 -0
- package/dist/model/composition-runtime.js +31 -0
- package/dist/model/composition-runtime.js.map +1 -0
- package/dist/model/config.d.ts +10 -3
- package/dist/model/config.js +26 -10
- package/dist/model/config.js.map +1 -1
- package/dist/model/context-window.d.ts +16 -1
- package/dist/model/context-window.js +171 -5
- package/dist/model/context-window.js.map +1 -1
- package/dist/model/env.js +0 -1
- package/dist/model/env.js.map +1 -1
- package/dist/model/model-gateway.d.ts +3 -1
- package/dist/model/model-gateway.js +4 -0
- package/dist/model/model-gateway.js.map +1 -1
- package/dist/model/model-metadata.json +9 -3
- package/dist/model/openai-adapter.js +2 -1
- package/dist/model/openai-adapter.js.map +1 -1
- package/dist/model/provider-factory.js +28 -1
- package/dist/model/provider-factory.js.map +1 -1
- package/dist/model/settings-files.d.ts +3 -0
- package/dist/model/settings-files.js +43 -0
- package/dist/model/settings-files.js.map +1 -0
- package/dist/model/settings-store.d.ts +84 -0
- package/dist/model/settings-store.js +191 -0
- package/dist/model/settings-store.js.map +1 -0
- package/dist/model/settings-sync.d.ts +23 -0
- package/dist/model/settings-sync.js +68 -0
- package/dist/model/settings-sync.js.map +1 -0
- package/dist/repl/commands.d.ts +1 -1
- package/dist/repl/commands.js +3 -2
- package/dist/repl/commands.js.map +1 -1
- package/dist/repl/index.js +50 -22
- package/dist/repl/index.js.map +1 -1
- package/dist/session/session-store.d.ts +2 -0
- package/dist/session/session-store.js +7 -1
- package/dist/session/session-store.js.map +1 -1
- package/dist/tasks/task-persistence.js +2 -1
- package/dist/tasks/task-persistence.js.map +1 -1
- package/dist/tools/builtins/image-generation-tool.js +2 -0
- package/dist/tools/builtins/image-generation-tool.js.map +1 -1
- package/dist/tools/builtins/search-providers.js +2 -0
- package/dist/tools/builtins/search-providers.js.map +1 -1
- package/dist/tools/builtins/search-tool.d.ts +2 -0
- package/dist/tools/builtins/search-tool.js +2 -2
- package/dist/tools/builtins/search-tool.js.map +1 -1
- package/dist/web/index.d.ts +10 -3
- package/dist/web/index.js +126 -33
- package/dist/web/index.js.map +1 -1
- package/dist/web/model-settings-api.d.ts +9 -0
- package/dist/web/model-settings-api.js +221 -0
- package/dist/web/model-settings-api.js.map +1 -0
- package/package.json +2 -2
- package/scripts/initialize-model-metadata.mjs +6 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { EnvCredentialProvider, StaticCredentialProvider } from "./credentials.js";
|
|
2
|
+
import { categoryForStatus, ModelAPIError, normalizeUnknownError, parseRetryAfterMs } from "./errors.js";
|
|
3
|
+
import { anthropicInvalid, buildAnthropicRequest, normalizeAnthropicObject, normalizeAnthropicStream } from "./anthropic-mapper.js";
|
|
4
|
+
/** Native Messages API. CPA owns upstream OAuth; neo only receives its API key. */
|
|
5
|
+
export class AnthropicAdapter {
|
|
6
|
+
options;
|
|
7
|
+
name = "anthropic";
|
|
8
|
+
capabilities = {
|
|
9
|
+
streaming: true, functionTools: true, parallelToolCalls: true, structuredOutput: true,
|
|
10
|
+
previousResponseId: false, imageInput: true, fileInput: false, reasoningConfig: true, builtInTools: false,
|
|
11
|
+
};
|
|
12
|
+
credentials;
|
|
13
|
+
url;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.options = options;
|
|
16
|
+
this.credentials = options.credentialProvider ?? (options.apiKey ? new StaticCredentialProvider(options.apiKey) : new EnvCredentialProvider("ANTHROPIC_API_KEY"));
|
|
17
|
+
const base = (options.baseUrl ?? "https://api.anthropic.com").replace(/\/+$/, "");
|
|
18
|
+
const parsed = new URL(base);
|
|
19
|
+
if (!["http:", "https:"].includes(parsed.protocol) || parsed.search || parsed.hash)
|
|
20
|
+
anthropicInvalid("ANTHROPIC_BASE_URL must be an HTTP(S) origin or API prefix without query/fragment");
|
|
21
|
+
this.url = base.endsWith("/v1/messages") ? base : base.endsWith("/v1") ? `${base}/messages` : `${base}/v1/messages`;
|
|
22
|
+
}
|
|
23
|
+
async *stream(request) {
|
|
24
|
+
const body = buildAnthropicRequest(request, this.options);
|
|
25
|
+
const credential = await this.credentials.getCredential();
|
|
26
|
+
if (!credential)
|
|
27
|
+
throw new ModelAPIError({ provider: this.name, category: "auth_unavailable", message: "ANTHROPIC_API_KEY (official or gateway key) is not configured" });
|
|
28
|
+
const maxRetries = this.options.maxRetries ?? 2;
|
|
29
|
+
for (let attempt = 0;; attempt++) {
|
|
30
|
+
let published = false;
|
|
31
|
+
try {
|
|
32
|
+
for await (const event of this.attempt(request, body, credential)) {
|
|
33
|
+
if (["assistant_delta", "thinking_delta", "assistant_message", "tool_call_started", "tool_call_delta", "tool_use"].includes(event.type))
|
|
34
|
+
published = true;
|
|
35
|
+
yield event;
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (request.cancellation?.aborted)
|
|
41
|
+
throw new ModelAPIError({ provider: this.name, category: "user_abort", message: "Claude request cancelled", retryable: false });
|
|
42
|
+
const normalized = normalizeUnknownError(error, this.name);
|
|
43
|
+
if (published || !normalized.retryable || attempt >= maxRetries)
|
|
44
|
+
throw normalized;
|
|
45
|
+
const delayMs = Math.min(normalized.retryAfterMs ?? 3000, 32000);
|
|
46
|
+
yield { type: "retrying", error: normalized, attempt: attempt + 1, delayMs };
|
|
47
|
+
await abortableDelay(delayMs, request.cancellation);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async *attempt(request, body, credential) {
|
|
52
|
+
const controller = new AbortController();
|
|
53
|
+
const cancel = () => controller.abort();
|
|
54
|
+
if (request.cancellation?.aborted)
|
|
55
|
+
cancel();
|
|
56
|
+
request.cancellation?.addEventListener("abort", cancel, { once: true });
|
|
57
|
+
const timeoutMs = request.timeoutMs ?? this.options.timeoutMs ?? 120000;
|
|
58
|
+
const timer = timeoutMs > 0 ? setTimeout(cancel, timeoutMs) : undefined;
|
|
59
|
+
try {
|
|
60
|
+
const response = await fetch(this.url, {
|
|
61
|
+
method: "POST",
|
|
62
|
+
headers: { "Content-Type": "application/json", Accept: request.stream === false ? "application/json" : "text/event-stream", "User-Agent": "neoctl/anthropic", "x-api-key": credential, "anthropic-version": this.options.apiVersion ?? "2023-06-01" },
|
|
63
|
+
body: JSON.stringify(body), signal: controller.signal,
|
|
64
|
+
});
|
|
65
|
+
if (request.stream !== false && response.ok && timer)
|
|
66
|
+
clearTimeout(timer);
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
const raw = await response.text();
|
|
69
|
+
let parsed;
|
|
70
|
+
try {
|
|
71
|
+
parsed = JSON.parse(raw);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
parsed = { message: raw };
|
|
75
|
+
}
|
|
76
|
+
const error = parsed.error && typeof parsed.error === "object" ? parsed.error : parsed;
|
|
77
|
+
const message = typeof error.message === "string" ? error.message : `HTTP ${response.status} from Claude`;
|
|
78
|
+
throw new ModelAPIError({ provider: this.name, category: /prompt is too long|context.*(?:length|limit)/i.test(message) ? "context_length" : categoryForStatus(response.status, parsed), message, status: response.status, code: typeof error.type === "string" ? error.type : undefined, requestId: response.headers.get("request-id") ?? undefined, retryAfterMs: parseRetryAfterMs(response.headers.get("retry-after")), raw: parsed });
|
|
79
|
+
}
|
|
80
|
+
const model = request.model ?? this.options.model;
|
|
81
|
+
if (request.stream === false)
|
|
82
|
+
yield* normalizeAnthropicObject(await response.json(), model);
|
|
83
|
+
else {
|
|
84
|
+
if (!response.body)
|
|
85
|
+
throw new ModelAPIError({ provider: this.name, category: "provider_bug", message: "Claude streaming response has no body", retryable: false });
|
|
86
|
+
yield* normalizeAnthropicStream(response.body, model, this.options.streamIdleTimeoutMs);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
if (timer)
|
|
91
|
+
clearTimeout(timer);
|
|
92
|
+
request.cancellation?.removeEventListener("abort", cancel);
|
|
93
|
+
controller.abort();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function abortableDelay(ms, signal) {
|
|
98
|
+
if (signal?.aborted)
|
|
99
|
+
throw new ModelAPIError({ provider: "anthropic", category: "user_abort", message: "Claude request cancelled", retryable: false });
|
|
100
|
+
await new Promise((resolve, reject) => {
|
|
101
|
+
const abort = () => { clearTimeout(timer); signal?.removeEventListener("abort", abort); reject(new ModelAPIError({ provider: "anthropic", category: "user_abort", message: "Claude request cancelled", retryable: false })); };
|
|
102
|
+
const timer = setTimeout(() => { signal?.removeEventListener("abort", abort); resolve(); }, ms);
|
|
103
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=anthropic-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-adapter.js","sourceRoot":"","sources":["../../src/model/anthropic-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ModelRequest, ModelStreamEvent, ModelUsage, ReasoningConfig } from "./model-gateway.js";
|
|
2
|
+
type Block = Record<string, unknown>;
|
|
3
|
+
export interface AnthropicMapperOptions {
|
|
4
|
+
model: string;
|
|
5
|
+
defaultMaxOutputTokens?: number;
|
|
6
|
+
defaultReasoning?: ReasoningConfig | null;
|
|
7
|
+
thinkingBudgetTokens?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function anthropicInvalid(message: string): never;
|
|
10
|
+
export declare function buildAnthropicRequest(request: ModelRequest, options: AnthropicMapperOptions): Block;
|
|
11
|
+
export declare function anthropicUsage(raw: Block): ModelUsage;
|
|
12
|
+
export declare function normalizeAnthropicObject(body: Block, model: string): Generator<ModelStreamEvent>;
|
|
13
|
+
export declare function normalizeAnthropicStream(stream: ReadableStream<Uint8Array>, model: string, idleTimeoutMs?: number): AsyncGenerator<ModelStreamEvent>;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { createTextMessage } from "../types/messages.js";
|
|
3
|
+
import { splitSystemPromptPrefix } from "../context/prompts.js";
|
|
4
|
+
import { resolveImageBlockDataSync } from "../core/image-storage.js";
|
|
5
|
+
import { validateImageInput } from "../core/image-input.js";
|
|
6
|
+
import { ModelAPIError } from "./errors.js";
|
|
7
|
+
import { decodeSSE } from "./sse-decoder.js";
|
|
8
|
+
import { findModelMetadata } from "./context-window.js";
|
|
9
|
+
export function anthropicInvalid(message) {
|
|
10
|
+
throw new ModelAPIError({ provider: "anthropic", category: "invalid_request", message, retryable: false });
|
|
11
|
+
}
|
|
12
|
+
function protocolError(message) {
|
|
13
|
+
throw new ModelAPIError({ provider: "anthropic", category: "provider_bug", message, retryable: false });
|
|
14
|
+
}
|
|
15
|
+
function record(value) { return !!value && typeof value === "object" && !Array.isArray(value); }
|
|
16
|
+
function visibleFingerprint(blocks) {
|
|
17
|
+
return createHash("sha256").update(JSON.stringify(blocks.filter(b => b.type !== "thinking"))).digest("hex");
|
|
18
|
+
}
|
|
19
|
+
export function buildAnthropicRequest(request, options) {
|
|
20
|
+
const model = request.model ?? options.model;
|
|
21
|
+
const metadata = findModelMetadata(model);
|
|
22
|
+
const maxTokens = request.maxOutputTokens ?? options.defaultMaxOutputTokens ?? 8192;
|
|
23
|
+
if (!Number.isSafeInteger(maxTokens) || maxTokens <= 0)
|
|
24
|
+
anthropicInvalid("Claude max_tokens must be a positive integer");
|
|
25
|
+
if (metadata?.provider === "anthropic" && metadata.maxOutputTokens && maxTokens > metadata.maxOutputTokens)
|
|
26
|
+
anthropicInvalid(`max_tokens exceeds the configured limit for ${model}: ${metadata.maxOutputTokens}`);
|
|
27
|
+
const split = splitSystemPromptPrefix(request.instructions ?? request.systemPrompt ?? "");
|
|
28
|
+
const system = [split.stablePrefix, split.dynamicSuffix].filter(Boolean).map(text => ({ type: "text", text }));
|
|
29
|
+
const turns = [];
|
|
30
|
+
const uses = new Set(), results = new Set();
|
|
31
|
+
for (const m of request.messages)
|
|
32
|
+
for (const b of m.blocks) {
|
|
33
|
+
if (b.type === "tool_use")
|
|
34
|
+
uses.add(b.id);
|
|
35
|
+
if (b.type === "tool_result")
|
|
36
|
+
results.add(b.toolUseId);
|
|
37
|
+
}
|
|
38
|
+
const paired = new Set([...uses].filter(id => results.has(id)));
|
|
39
|
+
for (const message of request.messages) {
|
|
40
|
+
if (message.role === "progress" || message.role === "tombstone" || message.metadata?.displayOnly || message.metadata?.systemInit)
|
|
41
|
+
continue;
|
|
42
|
+
if (message.role === "system") {
|
|
43
|
+
for (const b of message.blocks)
|
|
44
|
+
if (b.type === "text" && b.text.trim())
|
|
45
|
+
system.push({ type: "text", text: b.text });
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const role = message.role === "assistant" ? "assistant" : "user";
|
|
49
|
+
let content = [];
|
|
50
|
+
// Preserve the provider's signed/opaque blocks through neo's local thinking
|
|
51
|
+
// filtering and session persistence. Never replay another provider/model's
|
|
52
|
+
// signatures or resurrect content changed by compaction.
|
|
53
|
+
const replay = message.metadata?.anthropicReplay;
|
|
54
|
+
if (role === "assistant" && record(replay) && replay.model === model && replay.fingerprint === visibleFingerprint(message.blocks) && Array.isArray(replay.content)) {
|
|
55
|
+
content = replay.content.filter(b => b.type !== "tool_use" || paired.has(String(b.id))).map(b => ({ ...b }));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
for (const b of message.blocks) {
|
|
59
|
+
if (b.type === "text" && b.text.trim())
|
|
60
|
+
content.push({ type: "text", text: b.text });
|
|
61
|
+
else if (b.type === "image" && role === "user") {
|
|
62
|
+
const data = resolveImageBlockDataSync(b);
|
|
63
|
+
if (!data)
|
|
64
|
+
anthropicInvalid("Claude image data is missing");
|
|
65
|
+
const image = validateImageInput(data);
|
|
66
|
+
content.push({ type: "image", source: { type: "base64", media_type: image.mimeType, data: image.data } });
|
|
67
|
+
}
|
|
68
|
+
else if (b.type === "tool_use" && role === "assistant" && paired.has(b.id)) {
|
|
69
|
+
if (!record(b.input))
|
|
70
|
+
anthropicInvalid(`Tool input for ${b.name} must be a JSON object`);
|
|
71
|
+
content.push({ type: "tool_use", id: b.id, name: b.name, input: b.input });
|
|
72
|
+
}
|
|
73
|
+
else if (b.type === "tool_result" && paired.has(b.toolUseId)) {
|
|
74
|
+
content.push({ type: "tool_result", tool_use_id: b.toolUseId, is_error: !b.ok, content: typeof b.output === "string" ? b.output : JSON.stringify(b.output) ?? "null" });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (!content.length)
|
|
79
|
+
continue;
|
|
80
|
+
const last = turns[turns.length - 1];
|
|
81
|
+
if (last?.role === role)
|
|
82
|
+
last.content.push(...content);
|
|
83
|
+
else
|
|
84
|
+
turns.push({ role, content });
|
|
85
|
+
}
|
|
86
|
+
// Multiple parallel tool results and injected runtime context share a user
|
|
87
|
+
// turn. Anthropic requires all tool_result blocks before ordinary user text.
|
|
88
|
+
for (const turn of turns)
|
|
89
|
+
if (turn.role === "user")
|
|
90
|
+
turn.content = [...turn.content.filter(b => b.type === "tool_result"), ...turn.content.filter(b => b.type !== "tool_result")];
|
|
91
|
+
let pending = new Set();
|
|
92
|
+
for (const turn of turns) {
|
|
93
|
+
if (turn.role === "user") {
|
|
94
|
+
const ids = turn.content.filter(b => b.type === "tool_result").map(b => String(b.tool_use_id));
|
|
95
|
+
if (ids.length !== new Set(ids).size || ids.some(id => !pending.has(id)) || [...pending].some(id => !ids.includes(id)))
|
|
96
|
+
anthropicInvalid("Claude tool results must immediately follow and match all assistant tool calls");
|
|
97
|
+
pending.clear();
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
pending = new Set(turn.content.filter(b => b.type === "tool_use").map(b => String(b.id)));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (pending.size)
|
|
104
|
+
anthropicInvalid("Claude tool calls are missing their following results");
|
|
105
|
+
if (!turns.length || turns[0].role !== "user")
|
|
106
|
+
anthropicInvalid("Claude messages must start with a non-empty user turn");
|
|
107
|
+
if (turns[turns.length - 1].role === "assistant")
|
|
108
|
+
anthropicInvalid("Claude assistant prefill is not supported; append a user turn");
|
|
109
|
+
const body = { model, max_tokens: maxTokens, messages: turns, stream: request.stream !== false };
|
|
110
|
+
if (system.length)
|
|
111
|
+
body.system = system;
|
|
112
|
+
const tools = request.tools.map(t => ({ name: t.name, description: t.description, input_schema: t.inputSchema }));
|
|
113
|
+
if (tools.length) {
|
|
114
|
+
body.tools = tools;
|
|
115
|
+
const choice = request.toolChoice;
|
|
116
|
+
if (typeof choice === "object") {
|
|
117
|
+
if (!tools.some(t => t.name === choice.name))
|
|
118
|
+
anthropicInvalid(`Unknown Claude tool choice: ${choice.name}`);
|
|
119
|
+
body.tool_choice = { type: "tool", name: choice.name };
|
|
120
|
+
}
|
|
121
|
+
else
|
|
122
|
+
body.tool_choice = { type: choice === "required" ? "any" : choice ?? "auto" };
|
|
123
|
+
}
|
|
124
|
+
else if (request.toolChoice === "required" || typeof request.toolChoice === "object")
|
|
125
|
+
anthropicInvalid("Claude tool choice requires tools");
|
|
126
|
+
configureThinking(body, request, options, model, maxTokens);
|
|
127
|
+
if (request.textFormat?.type === "json_schema") {
|
|
128
|
+
if (!request.textFormat.schema)
|
|
129
|
+
anthropicInvalid("Claude JSON schema output requires a schema");
|
|
130
|
+
body.output_config = { ...(body.output_config ?? {}), format: { type: "json_schema", schema: request.textFormat.schema } };
|
|
131
|
+
}
|
|
132
|
+
else if (request.textFormat?.type === "json_object")
|
|
133
|
+
anthropicInvalid("Claude requires json_schema rather than OpenAI json_object output");
|
|
134
|
+
if (request.serviceTier && request.serviceTier !== "auto" && request.serviceTier !== "default")
|
|
135
|
+
anthropicInvalid(`Claude does not map OpenAI service tier '${request.serviceTier}'`);
|
|
136
|
+
if (request.serviceTier === "auto")
|
|
137
|
+
body.service_tier = "auto";
|
|
138
|
+
if (request.serviceTier === "default")
|
|
139
|
+
body.service_tier = "standard_only";
|
|
140
|
+
if (request.metadata?.user_id)
|
|
141
|
+
body.metadata = { user_id: request.metadata.user_id };
|
|
142
|
+
// Deliberately no OpenAI-only fields, previous_response_id, or arbitrary
|
|
143
|
+
// providerOptions spreading. Claude history is sent explicitly each time.
|
|
144
|
+
return body;
|
|
145
|
+
}
|
|
146
|
+
function configureThinking(body, request, options, model, maxTokens) {
|
|
147
|
+
const reasoning = request.reasoning === undefined ? options.defaultReasoning : request.reasoning;
|
|
148
|
+
if (reasoning?.summary)
|
|
149
|
+
anthropicInvalid("OpenAI reasoning.summary is not a Claude parameter");
|
|
150
|
+
const effort = reasoning?.effort;
|
|
151
|
+
const metadata = findModelMetadata(model);
|
|
152
|
+
if (effort && metadata?.provider === "anthropic" && metadata.reasoningEfforts && !metadata.reasoningEfforts.includes(effort))
|
|
153
|
+
anthropicInvalid(`Claude model ${model} does not support effort '${effort}'`);
|
|
154
|
+
const adaptive = /claude-(?:opus-4-[678]|sonnet-4-6|(?:opus|sonnet|haiku|fable|mythos)-5|mythos-preview)/i.test(model);
|
|
155
|
+
const alwaysOn = /claude-(?:opus-5-5|sonnet-5-5|fable-5|mythos-5|mythos-preview)/i.test(model);
|
|
156
|
+
const disabled = reasoning === null || effort === "none";
|
|
157
|
+
if (disabled) {
|
|
158
|
+
if (alwaysOn)
|
|
159
|
+
anthropicInvalid(`Thinking cannot be disabled on ${model}`);
|
|
160
|
+
body.thinking = { type: "disabled" };
|
|
161
|
+
}
|
|
162
|
+
else if (effort) {
|
|
163
|
+
if (effort === "minimal" && !metadata?.reasoningEfforts?.includes(effort))
|
|
164
|
+
anthropicInvalid("Claude has no 'minimal' effort; select low, medium, or high");
|
|
165
|
+
if (adaptive) {
|
|
166
|
+
body.thinking = { type: "adaptive" };
|
|
167
|
+
body.output_config = { effort };
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
if (!["low", "medium", "high"].includes(effort))
|
|
171
|
+
anthropicInvalid("Legacy Claude thinking supports low/medium/high budget mapping only");
|
|
172
|
+
const budget = options.thinkingBudgetTokens ?? Math.min(({ low: 1024, medium: 2048, high: 4096 }[effort]), maxTokens - 1);
|
|
173
|
+
if (!Number.isSafeInteger(budget) || budget < 1024 || budget >= maxTokens)
|
|
174
|
+
anthropicInvalid("Claude thinking budget must be >=1024 and less than max_tokens; raise MODEL_MAX_OUTPUT_TOKENS or set ANTHROPIC_THINKING_BUDGET_TOKENS");
|
|
175
|
+
body.thinking = { type: "enabled", budget_tokens: budget };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const choice = body.tool_choice;
|
|
179
|
+
const thinkingEnabled = !!body.thinking && body.thinking.type !== "disabled";
|
|
180
|
+
const defaultThinking = /claude-(?:(?:opus|sonnet|haiku|fable|mythos)-5|mythos-preview)/i.test(model) && !disabled;
|
|
181
|
+
if ((thinkingEnabled || defaultThinking) && (choice?.type === "any" || choice?.type === "tool"))
|
|
182
|
+
anthropicInvalid("Claude thinking requires auto or none tool choice");
|
|
183
|
+
}
|
|
184
|
+
export function anthropicUsage(raw) {
|
|
185
|
+
const number = (key) => typeof raw[key] === "number" ? raw[key] : 0;
|
|
186
|
+
const inputTokens = number("input_tokens") + number("cache_creation_input_tokens") + number("cache_read_input_tokens");
|
|
187
|
+
const outputTokens = number("output_tokens");
|
|
188
|
+
return { inputTokens, outputTokens, totalTokens: inputTokens + outputTokens, cachedTokens: number("cache_read_input_tokens"), raw };
|
|
189
|
+
}
|
|
190
|
+
function assistantMessage(content, model, id) {
|
|
191
|
+
const blocks = [];
|
|
192
|
+
for (const b of content) {
|
|
193
|
+
if (b.type === "text" && typeof b.text === "string")
|
|
194
|
+
blocks.push({ type: "text", text: b.text });
|
|
195
|
+
else if (b.type === "thinking")
|
|
196
|
+
blocks.push({ type: "thinking", text: String(b.thinking ?? ""), signature: typeof b.signature === "string" ? b.signature : undefined });
|
|
197
|
+
else if (b.type === "tool_use") {
|
|
198
|
+
if (typeof b.id !== "string" || typeof b.name !== "string" || !record(b.input))
|
|
199
|
+
protocolError("Invalid Claude tool_use block");
|
|
200
|
+
blocks.push({ type: "tool_use", id: b.id, name: b.name, input: b.input });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const message = { ...createTextMessage("assistant", ""), blocks, providerMessageId: id };
|
|
204
|
+
return { ...message, metadata: { anthropicReplay: { model, content, fingerprint: visibleFingerprint(blocks) } } };
|
|
205
|
+
}
|
|
206
|
+
export function* normalizeAnthropicObject(body, model) {
|
|
207
|
+
if (body.type === "error")
|
|
208
|
+
throw anthropicStreamError(body);
|
|
209
|
+
if (body.type !== "message" || !Array.isArray(body.content))
|
|
210
|
+
protocolError("Expected an Anthropic Message response");
|
|
211
|
+
if (typeof body.stop_reason !== "string" || !body.stop_reason)
|
|
212
|
+
protocolError("Incomplete Claude Message response: missing stop_reason");
|
|
213
|
+
if (!body.content.every(record))
|
|
214
|
+
protocolError("Invalid Claude Message content block");
|
|
215
|
+
const content = body.content;
|
|
216
|
+
const id = typeof body.id === "string" ? body.id : undefined;
|
|
217
|
+
if (id)
|
|
218
|
+
yield { type: "response_started", responseId: id };
|
|
219
|
+
yield { type: "assistant_message", message: assistantMessage(content, model, id) };
|
|
220
|
+
yield completionEvent(body.stop_reason, anthropicUsage(record(body.usage) ? body.usage : {}));
|
|
221
|
+
}
|
|
222
|
+
export async function* normalizeAnthropicStream(stream, model, idleTimeoutMs = 120000) {
|
|
223
|
+
const blocks = new Map();
|
|
224
|
+
const partialJson = new Map();
|
|
225
|
+
const openBlocks = new Set();
|
|
226
|
+
let id, started = false, stopped = false, reason;
|
|
227
|
+
let usage = {};
|
|
228
|
+
for await (const sse of decodeSSE(stream, idleTimeoutMs)) {
|
|
229
|
+
if (!record(sse.data))
|
|
230
|
+
protocolError("Invalid JSON in Claude SSE event");
|
|
231
|
+
const event = sse.data;
|
|
232
|
+
const type = event.type ?? sse.event;
|
|
233
|
+
if (type === "error")
|
|
234
|
+
throw anthropicStreamError(event);
|
|
235
|
+
yield { type: "provider_event", event };
|
|
236
|
+
if (type === "message_start") {
|
|
237
|
+
if (started || !record(event.message))
|
|
238
|
+
protocolError("Invalid Claude message_start");
|
|
239
|
+
started = true;
|
|
240
|
+
const message = event.message;
|
|
241
|
+
id = typeof message.id === "string" ? message.id : undefined;
|
|
242
|
+
if (record(message.usage))
|
|
243
|
+
usage = { ...message.usage };
|
|
244
|
+
if (id)
|
|
245
|
+
yield { type: "response_started", responseId: id };
|
|
246
|
+
}
|
|
247
|
+
else if (type === "content_block_start") {
|
|
248
|
+
const index = event.index;
|
|
249
|
+
if (!started || !Number.isInteger(index) || blocks.has(index) || !record(event.content_block))
|
|
250
|
+
protocolError("Invalid Claude content_block_start");
|
|
251
|
+
const block = { ...event.content_block };
|
|
252
|
+
blocks.set(index, block);
|
|
253
|
+
openBlocks.add(index);
|
|
254
|
+
if (block.type === "tool_use") {
|
|
255
|
+
partialJson.set(index, "");
|
|
256
|
+
yield { type: "tool_call_started", callId: String(block.id), name: String(block.name) };
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
else if (type === "content_block_delta") {
|
|
260
|
+
const index = event.index, block = blocks.get(index);
|
|
261
|
+
if (!block || !openBlocks.has(index) || !record(event.delta))
|
|
262
|
+
protocolError("Claude delta has no open content block");
|
|
263
|
+
const b = block, delta = event.delta;
|
|
264
|
+
if (delta.type === "text_delta") {
|
|
265
|
+
const text = String(delta.text ?? "");
|
|
266
|
+
b.text = String(b.text ?? "") + text;
|
|
267
|
+
yield { type: "assistant_delta", text };
|
|
268
|
+
}
|
|
269
|
+
else if (delta.type === "thinking_delta") {
|
|
270
|
+
const text = String(delta.thinking ?? "");
|
|
271
|
+
b.thinking = String(b.thinking ?? "") + text;
|
|
272
|
+
yield { type: "thinking_delta", text };
|
|
273
|
+
}
|
|
274
|
+
else if (delta.type === "signature_delta")
|
|
275
|
+
b.signature = String(b.signature ?? "") + String(delta.signature ?? "");
|
|
276
|
+
else if (delta.type === "input_json_delta") {
|
|
277
|
+
const text = String(delta.partial_json ?? "");
|
|
278
|
+
partialJson.set(index, (partialJson.get(index) ?? "") + text);
|
|
279
|
+
yield { type: "tool_call_delta", callId: String(b.id), name: String(b.name), argumentsDelta: text };
|
|
280
|
+
}
|
|
281
|
+
else if (delta.type === "citations_delta") {
|
|
282
|
+
b.citations = [...(Array.isArray(b.citations) ? b.citations : []), delta.citation];
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
else if (type === "content_block_stop") {
|
|
286
|
+
const index = event.index, block = blocks.get(index);
|
|
287
|
+
if (!block || !openBlocks.delete(index))
|
|
288
|
+
protocolError("Claude stopped an unopened content block");
|
|
289
|
+
if (block.type === "tool_use") {
|
|
290
|
+
const json = partialJson.get(index);
|
|
291
|
+
if (json) {
|
|
292
|
+
try {
|
|
293
|
+
block.input = JSON.parse(json);
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
protocolError("Claude returned incomplete or malformed tool JSON");
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (!record(block.input))
|
|
300
|
+
protocolError("Claude tool input must be an object");
|
|
301
|
+
}
|
|
302
|
+
if (block.type === "text")
|
|
303
|
+
yield { type: "assistant_text_done" };
|
|
304
|
+
}
|
|
305
|
+
else if (type === "message_delta") {
|
|
306
|
+
if (record(event.delta) && typeof event.delta.stop_reason === "string")
|
|
307
|
+
reason = event.delta.stop_reason;
|
|
308
|
+
if (record(event.usage))
|
|
309
|
+
usage = { ...usage, ...event.usage };
|
|
310
|
+
}
|
|
311
|
+
else if (type === "message_stop") {
|
|
312
|
+
if (!started || openBlocks.size || !reason)
|
|
313
|
+
protocolError("Incomplete Claude message at message_stop");
|
|
314
|
+
stopped = true;
|
|
315
|
+
const content = [...blocks.entries()].sort(([a], [b]) => a - b).map(([, b]) => b);
|
|
316
|
+
// Emit completed tool calls only after the whole message validates. A
|
|
317
|
+
// truncated stream must never execute a partially received command.
|
|
318
|
+
yield { type: "assistant_message", message: assistantMessage(content, model, id) };
|
|
319
|
+
yield completionEvent(reason, anthropicUsage(usage));
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (!stopped)
|
|
324
|
+
protocolError("Claude stream closed before message_stop");
|
|
325
|
+
}
|
|
326
|
+
function completionEvent(reason, usage) {
|
|
327
|
+
return reason === "max_tokens" || reason === "model_context_window_exceeded"
|
|
328
|
+
? { type: "response_incomplete", reason, usage }
|
|
329
|
+
: { type: "response_completed", stopReason: reason, usage };
|
|
330
|
+
}
|
|
331
|
+
function anthropicStreamError(event) {
|
|
332
|
+
const error = record(event.error) ? event.error : event;
|
|
333
|
+
const type = String(error.type ?? "api_error"), message = String(error.message ?? "Claude stream error");
|
|
334
|
+
const category = /prompt is too long|context.*(?:length|limit)/i.test(message) ? "context_length"
|
|
335
|
+
: type === "overloaded_error" ? "overloaded" : type === "rate_limit_error" ? "rate_limit"
|
|
336
|
+
: type === "authentication_error" ? "auth_unavailable" : type === "permission_error" ? "permission_denied"
|
|
337
|
+
: type === "invalid_request_error" ? "invalid_request" : "server_error";
|
|
338
|
+
return new ModelAPIError({ provider: "anthropic", category, code: type, message, raw: event });
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=anthropic-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-mapper.js","sourceRoot":"","sources":["../../src/model/anthropic-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAmC,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAWxD,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7G,CAAC;AACD,SAAS,aAAa,CAAC,OAAe;IACpC,MAAM,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1G,CAAC;AACD,SAAS,MAAM,CAAC,KAAc,IAAoB,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzH,SAAS,kBAAkB,CAAC,MAA+B;IACzD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9G,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAqB,EAAE,OAA+B;IAC1F,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IAC7C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,sBAAsB,IAAI,IAAI,CAAC;IACpF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC;QAAE,gBAAgB,CAAC,8CAA8C,CAAC,CAAC;IACzH,IAAI,QAAQ,EAAE,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,eAAe,IAAI,SAAS,GAAG,QAAQ,CAAC,eAAe;QAAE,gBAAgB,CAAC,+CAA+C,KAAK,KAAK,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC;IAClN,MAAM,KAAK,GAAG,uBAAuB,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAY,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxH,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,EAAE,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ;QAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YAC3D,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;gBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACzD,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChE,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,UAAU;YAAE,SAAS;QAC3I,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM;gBAAE,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACpH,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;QACjE,IAAI,OAAO,GAAY,EAAE,CAAC;QAC1B,4EAA4E;QAC5E,2EAA2E;QAC3E,yDAAyD;QACzD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC;QACjD,IAAI,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,WAAW,KAAK,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACnK,OAAO,GAAI,MAAM,CAAC,OAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5H,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;qBAChF,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC/C,MAAM,IAAI,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAC;oBAC1C,IAAI,CAAC,IAAI;wBAAE,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;oBAC5D,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;oBACvC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC5G,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC7E,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;wBAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,IAAI,wBAAwB,CAAC,CAAC;oBACzF,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC7E,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC/D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;gBAC1K,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,SAAS;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;;YAClD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,2EAA2E;IAC3E,6EAA6E;IAC7E,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC;IAClL,IAAI,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YAC/F,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAAE,gBAAgB,CAAC,gFAAgF,CAAC,CAAC;YAC3N,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,IAAI;QAAE,gBAAgB,CAAC,uDAAuD,CAAC,CAAC;IAC5F,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,MAAM;QAAE,gBAAgB,CAAC,uDAAuD,CAAC,CAAC;IAC1H,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,IAAI,KAAK,WAAW;QAAE,gBAAgB,CAAC,+DAA+D,CAAC,CAAC;IACrI,MAAM,IAAI,GAAU,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;IACxG,IAAI,MAAM,CAAC,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAClH,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;QAClC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;gBAAE,gBAAgB,CAAC,+BAA+B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7G,IAAI,CAAC,WAAW,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QACzD,CAAC;;YAAM,IAAI,CAAC,WAAW,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;IACvF,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;QAAE,gBAAgB,CAAC,mCAAmC,CAAC,CAAC;IAC9I,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,UAAU,EAAE,IAAI,KAAK,aAAa,EAAE,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM;YAAE,gBAAgB,CAAC,6CAA6C,CAAC,CAAC;QAChG,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,aAAsB,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;IACtI,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,EAAE,IAAI,KAAK,aAAa;QAAE,gBAAgB,CAAC,mEAAmE,CAAC,CAAC;IAC7I,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,KAAK,MAAM,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;QAAE,gBAAgB,CAAC,4CAA4C,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;IACrL,IAAI,OAAO,CAAC,WAAW,KAAK,MAAM;QAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;IAC/D,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;QAAE,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC;IAC3E,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO;QAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IACrF,yEAAyE;IACzE,0EAA0E;IAC1E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAW,EAAE,OAAqB,EAAE,OAA+B,EAAE,KAAa,EAAE,SAAiB;IAC9H,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACjG,IAAI,SAAS,EAAE,OAAO;QAAE,gBAAgB,CAAC,oDAAoD,CAAC,CAAC;IAC/F,MAAM,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC;IACjC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,MAAM,IAAI,QAAQ,EAAE,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,gBAAgB,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,gBAAgB,CAAC,gBAAgB,KAAK,6BAA6B,MAAM,GAAG,CAAC,CAAC;IAC5M,MAAM,QAAQ,GAAG,yFAAyF,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvH,MAAM,QAAQ,GAAG,iEAAiE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/F,MAAM,QAAQ,GAAG,SAAS,KAAK,IAAI,IAAI,MAAM,KAAK,MAAM,CAAC;IACzD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ;YAAE,gBAAgB,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACvC,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAClB,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC;YAAE,gBAAgB,CAAC,6DAA6D,CAAC,CAAC;QAC3J,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,gBAAgB,CAAC,qEAAqE,CAAC,CAAC;YACzI,MAAM,MAAM,GAAG,OAAO,CAAC,oBAAoB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,MAAmC,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;YACvJ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAO,GAAG,IAAI,IAAI,MAAO,IAAI,SAAS;gBAAE,gBAAgB,CAAC,uIAAuI,CAAC,CAAC;YACvO,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAgC,CAAC;IACrD,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAK,IAAI,CAAC,QAAkB,CAAC,IAAI,KAAK,UAAU,CAAC;IACxF,MAAM,eAAe,GAAG,iEAAiE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;IACnH,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,KAAK,IAAI,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC;QAAE,gBAAgB,CAAC,mDAAmD,CAAC,CAAC;AACzK,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAU;IACvC,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,6BAA6B,CAAC,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;IACvH,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;IAC7C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,GAAG,YAAY,EAAE,YAAY,EAAE,MAAM,CAAC,yBAAyB,CAAC,EAAE,GAAG,EAAE,CAAC;AACtI,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgB,EAAE,KAAa,EAAE,EAAW;IACpE,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAC5F,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;aACnK,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,aAAa,CAAC,+BAA+B,CAAC,CAAC;YAC/H,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAY,EAAE,IAAI,EAAE,CAAC,CAAC,IAAc,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,GAAG,iBAAiB,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;IACzF,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC;AACpH,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,wBAAwB,CAAC,IAAW,EAAE,KAAa;IAClE,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,aAAa,CAAC,wCAAwC,CAAC,CAAC;IACrH,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW;QAAE,aAAa,CAAC,yDAAyD,CAAC,CAAC;IACxI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,aAAa,CAAC,sCAAsC,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAkB,CAAC;IACxC,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,IAAI,EAAE;QAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC3D,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;IACnF,MAAM,eAAe,CAAC,IAAI,CAAC,WAAqB,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1G,CAAC;AAED,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,wBAAwB,CAAC,MAAkC,EAAE,KAAa,EAAE,aAAa,GAAG,MAAM;IACvH,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IACxC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,IAAI,EAAsB,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,MAA0B,CAAC;IACzF,IAAI,KAAK,GAAU,EAAE,CAAC;IACtB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,aAAa,CAAC,kCAAkC,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,GAAG,CAAC,IAAa,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC;QACrC,IAAI,IAAI,KAAK,OAAO;YAAE,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;QACxC,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YAC7B,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,aAAa,CAAC,8BAA8B,CAAC,CAAC;YACrF,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,CAAC,OAAgB,CAAC;YACvC,EAAE,GAAG,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7D,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,KAAK,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;YACxD,IAAI,EAAE;gBAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAC7D,CAAC;aAAM,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAe,CAAC;YACpC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;gBAAE,aAAa,CAAC,oCAAoC,CAAC,CAAC;YACnJ,MAAM,KAAK,GAAG,EAAE,GAAI,KAAK,CAAC,aAAuB,EAAE,CAAC;YACpD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC9B,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC3B,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1F,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAe,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC/D,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,aAAa,CAAC,wCAAwC,CAAC,CAAC;YACtH,MAAM,CAAC,GAAG,KAAM,EAAE,KAAK,GAAG,KAAK,CAAC,KAAc,CAAC;YAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;gBAC5E,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;YAC1C,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;gBAAC,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;gBACxF,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;YACzC,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;gBAAE,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;iBAChH,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;gBAC9C,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC9D,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;YACtG,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAC5C,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAe,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC/D,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;gBAAE,aAAa,CAAC,0CAA0C,CAAC,CAAC;YACnG,IAAI,KAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACpC,IAAI,IAAI,EAAE,CAAC;oBAAC,IAAI,CAAC;wBAAC,KAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC;wBAAC,aAAa,CAAC,mDAAmD,CAAC,CAAC;oBAAC,CAAC;gBAAC,CAAC;gBACpI,IAAI,CAAC,MAAM,CAAC,KAAM,CAAC,KAAK,CAAC;oBAAE,aAAa,CAAC,qCAAqC,CAAC,CAAC;YAClF,CAAC;YACD,IAAI,KAAM,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;QACpE,CAAC;aAAM,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YACpC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,WAAW,KAAK,QAAQ;gBAAE,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;YACzG,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAChE,CAAC;aAAM,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YACnC,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,IAAI,CAAC,MAAM;gBAAE,aAAa,CAAC,2CAA2C,CAAC,CAAC;YACvG,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAClF,sEAAsE;YACtE,oEAAoE;YACpE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;YACnF,MAAM,eAAe,CAAC,MAAO,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;YACtD,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,CAAC,OAAO;QAAE,aAAa,CAAC,0CAA0C,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,eAAe,CAAC,MAAc,EAAE,KAAiB;IACxD,OAAO,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,+BAA+B;QAC1E,CAAC,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,KAAK,EAAE;QAChD,CAAC,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAY;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,qBAAqB,CAAC,CAAC;IACzG,MAAM,QAAQ,GAAG,+CAA+C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,gBAAgB;QAC/F,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,YAAY;YACzF,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,mBAAmB;gBAC1G,CAAC,CAAC,IAAI,KAAK,uBAAuB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,cAAc,CAAC;IAC1E,OAAO,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;AACjG,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ApiConnection, type Composition } from "./settings-store.js";
|
|
2
|
+
import type { ToolRegistry } from "../tools/registry.js";
|
|
3
|
+
export declare function compositionProviders(c: Composition, connections: ApiConnection[]): {
|
|
4
|
+
openai: import("../tools/builtins/search-providers.js").SearchProvider | undefined;
|
|
5
|
+
exa: import("../tools/builtins/search-providers.js").SearchProvider | undefined;
|
|
6
|
+
image: {
|
|
7
|
+
description: string;
|
|
8
|
+
name: string;
|
|
9
|
+
aliases?: readonly string[];
|
|
10
|
+
searchHint?: string;
|
|
11
|
+
inputSchema: import("../index.js").JsonSchema;
|
|
12
|
+
outputSchema?: import("../index.js").JsonSchema;
|
|
13
|
+
metadata: import("../index.js").ToolMetadata;
|
|
14
|
+
validate?(input: unknown, context: import("../index.js").ToolUseContext): import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput;
|
|
15
|
+
validateInput?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext): import("../index.js").ValidationResult<import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput> | Promise<import("../index.js").ValidationResult<import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput>>;
|
|
16
|
+
isConcurrencySafe?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext): boolean;
|
|
17
|
+
isEnabled?(context?: import("../index.js").ToolUseContext): boolean;
|
|
18
|
+
isReadOnly?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext): boolean;
|
|
19
|
+
isDestructive?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext): boolean;
|
|
20
|
+
interruptBehavior?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext): "cancel" | "block";
|
|
21
|
+
backfillObservableInput?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext): unknown;
|
|
22
|
+
execute?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext): Promise<import("../index.js").ToolResult>;
|
|
23
|
+
call?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext, options: import("../index.js").ToolCallOptions<import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput>): Promise<import("../index.js").ToolResult>;
|
|
24
|
+
mapResult?(result: import("../index.js").ToolResult, request: import("../index.js").ToolUseRequest): unknown;
|
|
25
|
+
renderToolUseMessage?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput): import("../index.js").Message | undefined;
|
|
26
|
+
renderToolResultMessage?(result: import("../index.js").ToolResult, request?: import("../index.js").ToolUseRequest): import("../index.js").Message | undefined;
|
|
27
|
+
renderToolProgressMessage?(progress: import("../index.js").ToolProgressEvent): import("../index.js").Message | undefined;
|
|
28
|
+
} | undefined;
|
|
29
|
+
search: import("../index.js").Tool<import("../tools/builtins/search-tool.js").WebSearchToolInput> | undefined;
|
|
30
|
+
};
|
|
31
|
+
export declare function registerCompositionTools(tools: ToolRegistry, c: Composition, connections: ApiConnection[]): void;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createSearchTool } from "../tools/builtins/search-tool.js";
|
|
2
|
+
import { createOpenAISearchProvider, createExaSearchProvider } from "../tools/builtins/search-providers.js";
|
|
3
|
+
import { createOpenAIImageGenerationTool } from "../tools/builtins/image-generation-tool.js";
|
|
4
|
+
import { connectionProtocols, optionalInteger } from "./settings-store.js";
|
|
5
|
+
export function compositionProviders(c, connections) {
|
|
6
|
+
const connection = (id) => { const a = connections.find(a => a.id === id); if (!a || !connectionProtocols(a).includes("openai"))
|
|
7
|
+
throw new Error("需要 OpenAI 兼容连接。"); return a; };
|
|
8
|
+
const openai = c.search.api ? (() => { const a = connection(c.search.api); return createOpenAISearchProvider({ apiKey: a.key, baseUrl: a.baseUrl, model: c.search.model, maxOutputTokens: optionalInteger(c.search.tokens, "搜索 Token"), searchContextSize: c.search.context || undefined, timeoutMs: optionalInteger(c.search.timeout, "搜索超时"), toolType: c.search.toolType }); })() : undefined;
|
|
9
|
+
const exa = c.search.exa ? createExaSearchProvider({ mcpUrl: c.search.exaUrl, toolName: c.search.exaTool, timeoutMs: optionalInteger(c.search.exaTimeout, "Exa 超时") }) : undefined;
|
|
10
|
+
const image = c.image.api ? (() => { const a = connection(c.image.api); const tool = createOpenAIImageGenerationTool({ apiKey: a.key, baseUrl: a.baseUrl, model: c.image.model, timeoutMs: optionalInteger(c.image.timeout, "图片超时") ?? 360000 }); return { ...tool, description: String(tool.description).replace("Available only when MODEL_PROVIDER=openai.", "Uses the separately configured OpenAI-compatible Images connection.") }; })() : undefined;
|
|
11
|
+
const search = openai || exa ? createSearchTool({
|
|
12
|
+
description: openai ? "Search the web. OpenAI Responses is the default. " + (exa ? "Use provider=exa only when OpenAI is unavailable, results are incomplete, or the user explicitly requests Exa." : "Exa is disabled; do not request it.") : "Search the web using Exa MCP. OpenAI search is disabled. Use provider=exa or omit provider.",
|
|
13
|
+
resolveProvider(name) { const selected = name?.trim().toLowerCase() || (openai ? "openai" : "exa"); const p = selected === "exa" ? exa : ["openai", "gpt"].includes(selected) ? openai : undefined; if (!p)
|
|
14
|
+
throw new Error(`Search provider ${selected} is not configured.`); return p; },
|
|
15
|
+
}) : undefined;
|
|
16
|
+
return { openai, exa, image, search };
|
|
17
|
+
}
|
|
18
|
+
export function registerCompositionTools(tools, c, connections) {
|
|
19
|
+
const providers = compositionProviders(c, connections);
|
|
20
|
+
for (const name of ["image_create", "web_search"]) {
|
|
21
|
+
const enabled = tools.isEnabled(name);
|
|
22
|
+
tools.unregister(name);
|
|
23
|
+
const tool = name === "image_create" ? providers.image : providers.search;
|
|
24
|
+
if (tool) {
|
|
25
|
+
tools.register(tool);
|
|
26
|
+
if (enabled === false)
|
|
27
|
+
tools.setEnabled(name, false);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=composition-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composition-runtime.js","sourceRoot":"","sources":["../../src/model/composition-runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/model/config.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type
|
|
2
|
-
export type ModelProviderName = "openai";
|
|
1
|
+
import { type ReasoningConfig } from "./model-gateway.js";
|
|
2
|
+
export type ModelProviderName = "openai" | "anthropic";
|
|
3
3
|
export type ReasoningSummary = NonNullable<ReasoningConfig["summary"]>;
|
|
4
4
|
export interface BaseModelProviderConfig {
|
|
5
5
|
provider: ModelProviderName;
|
|
@@ -19,6 +19,13 @@ export interface OpenAIProviderConfig extends BaseModelProviderConfig {
|
|
|
19
19
|
endpoint?: OpenAIEndpointPreference;
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
|
-
export
|
|
22
|
+
export interface AnthropicProviderConfig extends BaseModelProviderConfig {
|
|
23
|
+
provider: "anthropic";
|
|
24
|
+
anthropic?: {
|
|
25
|
+
apiVersion?: string;
|
|
26
|
+
thinkingBudgetTokens?: number;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export type ModelProviderConfig = OpenAIProviderConfig | AnthropicProviderConfig;
|
|
23
30
|
export declare function readModelProviderConfig(env?: NodeJS.ProcessEnv): ModelProviderConfig | undefined;
|
|
24
31
|
export declare function parseReasoning(effortValue: string | undefined, summaryValue?: string | undefined): ReasoningConfig | null | undefined;
|