@rarebit-one/harness-kernel 0.9.0 → 0.11.0-next.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 +174 -6
- package/dist/agent.d.ts +80 -8
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +225 -25
- package/dist/agent.js.map +1 -1
- package/dist/engines/acp.d.ts +10 -0
- package/dist/engines/acp.d.ts.map +1 -1
- package/dist/engines/acp.js +8 -1
- package/dist/engines/acp.js.map +1 -1
- package/dist/engines/acpDriver.d.ts +2 -0
- package/dist/engines/acpDriver.d.ts.map +1 -1
- package/dist/engines/acpDriver.js +6 -1
- package/dist/engines/acpDriver.js.map +1 -1
- package/dist/engines/claudeCode.d.ts +6 -4
- package/dist/engines/claudeCode.d.ts.map +1 -1
- package/dist/engines/claudeCode.js +8 -5
- package/dist/engines/claudeCode.js.map +1 -1
- package/dist/engines/claudeCodeDriver.d.ts +8 -0
- package/dist/engines/claudeCodeDriver.d.ts.map +1 -1
- package/dist/engines/claudeCodeDriver.js +14 -1
- package/dist/engines/claudeCodeDriver.js.map +1 -1
- package/dist/engines/codex.d.ts.map +1 -1
- package/dist/engines/codex.js +2 -1
- package/dist/engines/codex.js.map +1 -1
- package/dist/engines/codexDriver.d.ts +2 -0
- package/dist/engines/codexDriver.d.ts.map +1 -1
- package/dist/engines/codexDriver.js +15 -9
- package/dist/engines/codexDriver.js.map +1 -1
- package/dist/engines/isolation.d.ts +45 -0
- package/dist/engines/isolation.d.ts.map +1 -0
- package/dist/engines/isolation.js +119 -0
- package/dist/engines/isolation.js.map +1 -0
- package/dist/engines/native.d.ts +5 -0
- package/dist/engines/native.d.ts.map +1 -1
- package/dist/engines/native.js +28 -10
- package/dist/engines/native.js.map +1 -1
- package/dist/engines/types.d.ts +28 -0
- package/dist/engines/types.d.ts.map +1 -1
- package/dist/events.d.ts +20 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +17 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/loop.d.ts +58 -11
- package/dist/loop.d.ts.map +1 -1
- package/dist/loop.js +7 -5
- package/dist/loop.js.map +1 -1
- package/dist/models/chat.d.ts +2 -1
- package/dist/models/chat.d.ts.map +1 -1
- package/dist/models/chat.js +20 -4
- package/dist/models/chat.js.map +1 -1
- package/dist/models/types.d.ts +16 -0
- package/dist/models/types.d.ts.map +1 -1
- package/dist/models/types.js.map +1 -1
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +21 -0
- package/dist/private.js.map +1 -1
- package/dist/providers/anthropic.d.ts +27 -3
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +95 -29
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/index.d.ts +42 -6
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +132 -48
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/mock.d.ts +6 -3
- package/dist/providers/mock.d.ts.map +1 -1
- package/dist/providers/mock.js +8 -3
- package/dist/providers/mock.js.map +1 -1
- package/dist/providers/openai.d.ts +51 -7
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +128 -30
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/options.d.ts +162 -0
- package/dist/providers/options.d.ts.map +1 -0
- package/dist/providers/options.js +67 -0
- package/dist/providers/options.js.map +1 -0
- package/dist/providers/scripted.d.ts +49 -0
- package/dist/providers/scripted.d.ts.map +1 -0
- package/dist/providers/scripted.js +90 -0
- package/dist/providers/scripted.js.map +1 -0
- package/dist/providers/types.d.ts +34 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/tools/metadata.d.ts +24 -0
- package/dist/tools/metadata.d.ts.map +1 -1
- package/dist/tools/metadata.js +8 -0
- package/dist/tools/metadata.js.map +1 -1
- package/dist/tools/registry.d.ts +10 -3
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +9 -4
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/terminal.d.ts +33 -0
- package/dist/tools/terminal.d.ts.map +1 -0
- package/dist/tools/terminal.js +32 -0
- package/dist/tools/terminal.js.map +1 -0
- package/package.json +5 -4
package/dist/models/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/models/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/models/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA8HH;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAgB,EAChB,UAAkB,EAClB,QAAgB,EAChB,IAAY;IAEZ,IAAI,CAAC,eAAe,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IAC5C,IAAI,CAAC,eAAe,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IACxC,IAAI,CAAC,kBAAkB,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;AACvD,CAAC;AA0BD,wDAAwD;AACxD,MAAM,UAAU,aAAa,CAAC,KAAsC;IAClE,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAA;AAC7D,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,KAAK,CAAe;IACpB,UAAU,CAAiB;IAEpC,YAAY,KAAoB,EAAE,UAA2B,EAAE,MAAe;QAC5E,KAAK,CACH,SAAS,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,qBAAqB,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAChG,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;CACF;AAED,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAC/B,KAAoB,EACpB,UAA2B,EAC3B,MAAe;IAEf,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;AACnF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAgC,EAChC,GAAQ,EACR,IAAgB,EAChB,GAAkB;IAElB,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IACrC,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IACxC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACxB,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,4CAA4C,CAAC,CAAA;IAChG,CAAC;IACD,OAAO,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;AAC3C,CAAC"}
|
package/dist/private.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAY,YAAY,
|
|
1
|
+
{"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAY,YAAY,EAAc,MAAM,aAAa,CAAA;AAGrE,yDAAyD;AACzD,eAAO,MAAM,iBAAiB,eAAe,CAAA;AAK7C;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAA;gBAEpB,KAAK,EAAE,OAAO,GAAG,MAAM;CAKpC;AAED,iDAAiD;AACjD,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B;;;;OAIG;IACH,IAAI,EAAE,YAAY,CAAA;CACnB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC3B,IAAI,CAAC,EAAE,YAAY,GAClB,kBAAkB,CAwHpB;AA+FD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,GACtC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAM3C"}
|
package/dist/private.js
CHANGED
|
@@ -99,6 +99,9 @@ export function privateRunChannels(log, sink) {
|
|
|
99
99
|
text: "",
|
|
100
100
|
toolCalls: event.toolCalls.map((c) => ({ id: callId(c.id), name: toolName(c.name) })),
|
|
101
101
|
...(usage ? { usage } : {}),
|
|
102
|
+
// The served model id and upstream are configuration echoed back, not material.
|
|
103
|
+
...(typeof event.model === "string" ? { model: event.model } : {}),
|
|
104
|
+
...(typeof event.upstream === "string" ? { upstream: event.upstream } : {}),
|
|
102
105
|
};
|
|
103
106
|
}
|
|
104
107
|
case "model.turn.failed":
|
|
@@ -153,6 +156,7 @@ export function privateRunChannels(log, sink) {
|
|
|
153
156
|
...base(event),
|
|
154
157
|
type: event.type,
|
|
155
158
|
outcome: oneOf(event.outcome, OUTCOMES, "failed"),
|
|
159
|
+
...(isStopReason(event.stopReason) ? { stopReason: event.stopReason } : {}),
|
|
156
160
|
...(event.steps !== undefined ? { steps: event.steps } : {}),
|
|
157
161
|
...(event.error !== undefined ? { error: PRIVATE_REDACTION } : {}),
|
|
158
162
|
};
|
|
@@ -170,6 +174,18 @@ export function privateRunChannels(log, sink) {
|
|
|
170
174
|
const FAILURE_REASONS = ["threw", "unknown_tool", "aborted"];
|
|
171
175
|
const BUDGET_KINDS = ["steps", "duration"];
|
|
172
176
|
const OUTCOMES = ["completed", "steps_exhausted", "timed_out", "canceled", "failed"];
|
|
177
|
+
const STOP_REASONS = [
|
|
178
|
+
"end_turn",
|
|
179
|
+
"terminal_tool",
|
|
180
|
+
"steps_exhausted",
|
|
181
|
+
"timed_out",
|
|
182
|
+
"canceled",
|
|
183
|
+
"failed",
|
|
184
|
+
];
|
|
185
|
+
/** A known stop reason; anything else (a custom loop's own word) is dropped. */
|
|
186
|
+
function isStopReason(value) {
|
|
187
|
+
return typeof value === "string" && STOP_REASONS.includes(value);
|
|
188
|
+
}
|
|
173
189
|
/** `value` when it is one of `allowed`, else `fallback`. */
|
|
174
190
|
function oneOf(value, allowed, fallback) {
|
|
175
191
|
return allowed.includes(value) ? value : fallback;
|
|
@@ -187,11 +203,16 @@ function redactUsage(usage) {
|
|
|
187
203
|
"totalTokens",
|
|
188
204
|
"cacheReadTokens",
|
|
189
205
|
"cacheWriteTokens",
|
|
206
|
+
"reasoningTokens",
|
|
190
207
|
]) {
|
|
191
208
|
const n = usage[key];
|
|
192
209
|
if (typeof n === "number")
|
|
193
210
|
out[key] = n;
|
|
194
211
|
}
|
|
212
|
+
// A cost is a number with a fixed-vocabulary currency: structural, not material.
|
|
213
|
+
if (usage.reportedCost && typeof usage.reportedCost.amount === "number") {
|
|
214
|
+
out.reportedCost = { amount: usage.reportedCost.amount, currency: "USD" };
|
|
215
|
+
}
|
|
195
216
|
return out;
|
|
196
217
|
}
|
|
197
218
|
/**
|
package/dist/private.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"private.js","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAKH,yDAAyD;AACzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAA;AAE7C,yEAAyE;AACzE,MAAM,iBAAiB,GAAG,gBAAgB,CAAA;AAE1C;;;;;GAKG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,oEAAoE;IAC3D,KAAK,CAAkB;IAEhC,YAAY,KAAuB;QACjC,KAAK,CAAC,6BAA6B,KAAK,qBAAqB,CAAC,CAAA;QAC9D,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;CACF;AAcD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAA2B,EAC3B,IAAmB;IAEnB,IAAI,UAAmC,CAAA;IACvC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAA;IAE7F,0EAA0E;IAC1E,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC5C,MAAM,MAAM,GAAG,CAAC,EAAU,EAAU,EAAE;QACpC,IAAI,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAClC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,SAAS,GAAG,QAAQ,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAA;YACzC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA;QAC/B,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC,CAAA;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,6EAA6E;IAC7E,0EAA0E;IAC1E,sBAAsB;IACtB,MAAM,IAAI,GAAG,CAAC,KAAe,EAA+C,EAAE,CAAC,CAAC;QAC9E,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,QAAQ,EAAE,IAAI;KACf,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,CAAC,KAAe,EAAY,EAAE;QAC3C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,aAAa;gBAChB,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBACjC,OAAO;oBACL,GAAG,IAAI,CAAC,KAAK,CAAC;oBACd,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,aAAa,EAAE,KAAK,CAAC,aAAa;oBAClC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;iBACxB,CAAA;YACH,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBACtC,OAAO;oBACL,GAAG,IAAI,CAAC,KAAK,CAAC;oBACd,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,EAAE;oBACR,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACrF,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"private.js","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,22 @@
|
|
|
1
1
|
import Anthropic from "@anthropic-ai/sdk";
|
|
2
2
|
import type { TokenUsage } from "../models/types.js";
|
|
3
|
+
import { type CacheTtl } from "./options.js";
|
|
3
4
|
import type { AgentMessage, CompletionRequest, ConverseOptions, ConverseRequest, ConverseResult, Provider } from "./types.js";
|
|
4
|
-
/**
|
|
5
|
-
export
|
|
5
|
+
/** Where to put message breakpoints: how many trailing messages, and the lifetime. */
|
|
6
|
+
export interface AnthropicMessageCache {
|
|
7
|
+
trailingMessages: number;
|
|
8
|
+
ttl?: CacheTtl;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Map provider-neutral messages to Anthropic's message params (pure; tested).
|
|
12
|
+
*
|
|
13
|
+
* With `cache` set, the last content block of each of the trailing N messages
|
|
14
|
+
* carries a `cache_control` breakpoint, so the whole prefix up to and including
|
|
15
|
+
* that message is served from cache on the next call. Messages outside the
|
|
16
|
+
* trailing window keep the compact string form a plain user turn had before
|
|
17
|
+
* caching existed.
|
|
18
|
+
*/
|
|
19
|
+
export declare function toAnthropicMessages(messages: AgentMessage[], cache?: AnthropicMessageCache): Anthropic.MessageParam[];
|
|
6
20
|
/** Reduce an Anthropic response's content blocks to text + tool calls (pure; tested). */
|
|
7
21
|
export declare function parseAnthropicContent(content: Anthropic.ContentBlock[]): ConverseResult;
|
|
8
22
|
/**
|
|
@@ -13,11 +27,21 @@ export declare function parseAnthropicContent(content: Anthropic.ContentBlock[])
|
|
|
13
27
|
* is what `inputTokens` carries, with the cache split out alongside.
|
|
14
28
|
*/
|
|
15
29
|
export declare function anthropicUsage(usage: Pick<Anthropic.Usage, "input_tokens" | "output_tokens" | "cache_read_input_tokens" | "cache_creation_input_tokens"> | Pick<Anthropic.Usage, "input_tokens" | "output_tokens"> | null | undefined): TokenUsage | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Build the Messages API request for one conversation step (pure; tested).
|
|
32
|
+
*
|
|
33
|
+
* Prompt caching places up to four breakpoints: the system prompt (sent as one
|
|
34
|
+
* text block so it can carry one), the last tool definition, and the trailing
|
|
35
|
+
* messages. A `responseFormat` or an `openrouter` block is rejected here: the
|
|
36
|
+
* Messages API has neither, and honouring a structured answer means a terminal
|
|
37
|
+
* tool with a schema, not a request flag.
|
|
38
|
+
*/
|
|
39
|
+
export declare function anthropicRequestBody(model: string, req: ConverseRequest, fallbackMaxTokens?: number): Anthropic.MessageCreateParamsNonStreaming;
|
|
16
40
|
export declare class AnthropicProvider implements Provider {
|
|
17
41
|
readonly name = "anthropic";
|
|
18
42
|
readonly reportsUsage = true;
|
|
43
|
+
readonly model: string;
|
|
19
44
|
private client;
|
|
20
|
-
private model;
|
|
21
45
|
constructor(apiKey: string, model?: string);
|
|
22
46
|
complete(req: CompletionRequest): Promise<string>;
|
|
23
47
|
converse(req: ConverseRequest, opts?: ConverseOptions): Promise<ConverseResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAA;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,cAAc,EACd,QAAQ,EAET,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAA;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,EAKL,KAAK,QAAQ,EAEd,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,cAAc,EACd,QAAQ,EAET,MAAM,YAAY,CAAA;AAOnB,sFAAsF;AACtF,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAA;IACxB,GAAG,CAAC,EAAE,QAAQ,CAAA;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,YAAY,EAAE,EACxB,KAAK,CAAC,EAAE,qBAAqB,GAC5B,SAAS,CAAC,YAAY,EAAE,CA8B1B;AAWD,yFAAyF;AACzF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,YAAY,EAAE,GAAG,cAAc,CAevF;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EACD,IAAI,CACF,SAAS,CAAC,KAAK,EACf,cAAc,GAAG,eAAe,GAAG,yBAAyB,GAAG,6BAA6B,CAC7F,GACD,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAAC,GACvD,IAAI,GACJ,SAAS,GACZ,UAAU,GAAG,SAAS,CAcxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,eAAe,EACpB,iBAAiB,GAAE,MAAoB,GACtC,SAAS,CAAC,+BAA+B,CAoC3C;AAED,qBAAa,iBAAkB,YAAW,QAAQ;IAChD,QAAQ,CAAC,IAAI,eAAc;IAC3B,QAAQ,CAAC,YAAY,QAAO;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,MAAM,CAAW;gBAEb,MAAM,EAAE,MAAM,EAAE,KAAK,SAAqD;IAYhF,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAcjD,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAiBtF"}
|
|
@@ -1,10 +1,30 @@
|
|
|
1
1
|
import Anthropic from "@anthropic-ai/sdk";
|
|
2
2
|
import { maxTokens, providerMaxRetries, providerTimeoutMs } from "./clientOptions.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import { rejectOption, resolveMaxRetries, resolveMaxTokens, resolvePromptCache, } from "./options.js";
|
|
4
|
+
/** The breakpoint marker placed on a block, with the requested lifetime. */
|
|
5
|
+
function cacheControl(ttl) {
|
|
6
|
+
return { type: "ephemeral", ...(ttl !== undefined ? { ttl } : {}) };
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Map provider-neutral messages to Anthropic's message params (pure; tested).
|
|
10
|
+
*
|
|
11
|
+
* With `cache` set, the last content block of each of the trailing N messages
|
|
12
|
+
* carries a `cache_control` breakpoint, so the whole prefix up to and including
|
|
13
|
+
* that message is served from cache on the next call. Messages outside the
|
|
14
|
+
* trailing window keep the compact string form a plain user turn had before
|
|
15
|
+
* caching existed.
|
|
16
|
+
*/
|
|
17
|
+
export function toAnthropicMessages(messages, cache) {
|
|
18
|
+
const firstCached = cache ? Math.max(0, messages.length - cache.trailingMessages) : Infinity;
|
|
19
|
+
return messages.map((m, index) => {
|
|
20
|
+
const mark = cache !== undefined && index >= firstCached;
|
|
6
21
|
if (m.role === "user") {
|
|
7
|
-
|
|
22
|
+
if (!mark)
|
|
23
|
+
return { role: "user", content: m.text };
|
|
24
|
+
return {
|
|
25
|
+
role: "user",
|
|
26
|
+
content: [{ type: "text", text: m.text, cache_control: cacheControl(cache.ttl) }],
|
|
27
|
+
};
|
|
8
28
|
}
|
|
9
29
|
if (m.role === "assistant") {
|
|
10
30
|
const blocks = [];
|
|
@@ -13,20 +33,28 @@ export function toAnthropicMessages(messages) {
|
|
|
13
33
|
for (const tc of m.toolCalls) {
|
|
14
34
|
blocks.push({ type: "tool_use", id: tc.id, name: tc.name, input: tc.input });
|
|
15
35
|
}
|
|
36
|
+
if (mark)
|
|
37
|
+
markLast(blocks, cache.ttl);
|
|
16
38
|
return { role: "assistant", content: blocks };
|
|
17
39
|
}
|
|
18
40
|
// Tool results are sent back as a user turn of tool_result blocks.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
};
|
|
41
|
+
const blocks = m.results.map((r) => ({
|
|
42
|
+
type: "tool_result",
|
|
43
|
+
tool_use_id: r.toolCallId,
|
|
44
|
+
content: r.content,
|
|
45
|
+
is_error: r.isError ?? false,
|
|
46
|
+
}));
|
|
47
|
+
if (mark)
|
|
48
|
+
markLast(blocks, cache.ttl);
|
|
49
|
+
return { role: "user", content: blocks };
|
|
28
50
|
});
|
|
29
51
|
}
|
|
52
|
+
/** Attach a breakpoint to the last block, when there is one to attach it to. */
|
|
53
|
+
function markLast(blocks, ttl) {
|
|
54
|
+
const last = blocks[blocks.length - 1];
|
|
55
|
+
if (last)
|
|
56
|
+
last.cache_control = cacheControl(ttl);
|
|
57
|
+
}
|
|
30
58
|
/** Reduce an Anthropic response's content blocks to text + tool calls (pure; tested). */
|
|
31
59
|
export function parseAnthropicContent(content) {
|
|
32
60
|
let text = "";
|
|
@@ -67,11 +95,51 @@ export function anthropicUsage(usage) {
|
|
|
67
95
|
...(cacheWrite > 0 ? { cacheWriteTokens: cacheWrite } : {}),
|
|
68
96
|
};
|
|
69
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Build the Messages API request for one conversation step (pure; tested).
|
|
100
|
+
*
|
|
101
|
+
* Prompt caching places up to four breakpoints: the system prompt (sent as one
|
|
102
|
+
* text block so it can carry one), the last tool definition, and the trailing
|
|
103
|
+
* messages. A `responseFormat` or an `openrouter` block is rejected here: the
|
|
104
|
+
* Messages API has neither, and honouring a structured answer means a terminal
|
|
105
|
+
* tool with a schema, not a request flag.
|
|
106
|
+
*/
|
|
107
|
+
export function anthropicRequestBody(model, req, fallbackMaxTokens = maxTokens()) {
|
|
108
|
+
const options = req.providerOptions;
|
|
109
|
+
rejectOption("anthropic", options, "responseFormat", "use a terminal tool with a schema");
|
|
110
|
+
rejectOption("anthropic", options, "openrouter");
|
|
111
|
+
const cache = options?.promptCache
|
|
112
|
+
? resolvePromptCache(options.promptCache)
|
|
113
|
+
: undefined;
|
|
114
|
+
const tools = req.tools.map((t) => ({
|
|
115
|
+
name: t.name,
|
|
116
|
+
description: t.description,
|
|
117
|
+
input_schema: t.inputSchema,
|
|
118
|
+
}));
|
|
119
|
+
if (cache?.tools) {
|
|
120
|
+
const last = tools[tools.length - 1];
|
|
121
|
+
if (last)
|
|
122
|
+
last.cache_control = cacheControl(cache.ttl);
|
|
123
|
+
}
|
|
124
|
+
// An empty system prompt stays a string: Anthropic rejects an empty text block.
|
|
125
|
+
const system = cache?.system && req.system
|
|
126
|
+
? [{ type: "text", text: req.system, cache_control: cacheControl(cache.ttl) }]
|
|
127
|
+
: req.system;
|
|
128
|
+
return {
|
|
129
|
+
model,
|
|
130
|
+
max_tokens: resolveMaxTokens(options, fallbackMaxTokens),
|
|
131
|
+
system,
|
|
132
|
+
tools,
|
|
133
|
+
messages: toAnthropicMessages(req.messages, cache && cache.trailingMessages > 0
|
|
134
|
+
? { trailingMessages: cache.trailingMessages, ...(cache.ttl ? { ttl: cache.ttl } : {}) }
|
|
135
|
+
: undefined),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
70
138
|
export class AnthropicProvider {
|
|
71
139
|
name = "anthropic";
|
|
72
140
|
reportsUsage = true;
|
|
73
|
-
client;
|
|
74
141
|
model;
|
|
142
|
+
client;
|
|
75
143
|
constructor(apiKey, model = process.env.ANTHROPIC_MODEL ?? "claude-sonnet-4-6") {
|
|
76
144
|
// The SDK retries transient 429/5xx/network errors with exponential backoff
|
|
77
145
|
// internally, so a blip doesn't fail the whole run; `timeout` bounds each
|
|
@@ -96,22 +164,20 @@ export class AnthropicProvider {
|
|
|
96
164
|
.join("\n");
|
|
97
165
|
}
|
|
98
166
|
async converse(req, opts) {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
input_schema: t.inputSchema,
|
|
107
|
-
})),
|
|
108
|
-
messages: toAnthropicMessages(req.messages),
|
|
109
|
-
},
|
|
110
|
-
// Per-request, so an abort cancels THIS call (retries included) and
|
|
111
|
-
// leaves the shared client untouched.
|
|
112
|
-
opts?.signal ? { signal: opts.signal } : undefined);
|
|
167
|
+
// Per-request options, so an abort cancels THIS call (retries included)
|
|
168
|
+
// and a per-call retry count leaves the shared client untouched.
|
|
169
|
+
const retries = resolveMaxRetries(req.providerOptions);
|
|
170
|
+
const message = await this.client.messages.create(anthropicRequestBody(this.model, req), {
|
|
171
|
+
...(opts?.signal ? { signal: opts.signal } : {}),
|
|
172
|
+
...(retries !== undefined ? { maxRetries: retries } : {}),
|
|
173
|
+
});
|
|
113
174
|
const usage = anthropicUsage(message.usage);
|
|
114
|
-
return {
|
|
175
|
+
return {
|
|
176
|
+
...parseAnthropicContent(message.content),
|
|
177
|
+
...(usage ? { usage } : {}),
|
|
178
|
+
...(typeof message.model === "string" && message.model ? { model: message.model } : {}),
|
|
179
|
+
...(typeof message.id === "string" && message.id ? { responseId: message.id } : {}),
|
|
180
|
+
};
|
|
115
181
|
}
|
|
116
182
|
}
|
|
117
183
|
//# sourceMappingURL=anthropic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAA;AAEzC,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,17 +11,53 @@ export interface ProviderSelection {
|
|
|
11
11
|
openrouter?: string;
|
|
12
12
|
local?: string;
|
|
13
13
|
};
|
|
14
|
+
/**
|
|
15
|
+
* Run on the offline mock when no credential resolves, instead of failing.
|
|
16
|
+
* Off by default: a run that silently lands on the mock looks exactly like a
|
|
17
|
+
* run that reached a model, and nothing on the wire tells them apart. Set it
|
|
18
|
+
* for a keyless test rig or a local demo, never in production. An explicit
|
|
19
|
+
* `preferred: "mock"` needs no opt-in; that is a request, not a fallback.
|
|
20
|
+
*/
|
|
21
|
+
allowMockFallback?: boolean;
|
|
14
22
|
}
|
|
23
|
+
/** The outcome of {@link providerAvailability}: mirrors `AgentEngine.supports()`. */
|
|
24
|
+
export type ProviderAvailability = {
|
|
25
|
+
ok: true;
|
|
26
|
+
} | {
|
|
27
|
+
ok: false;
|
|
28
|
+
reason: string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Thrown by {@link selectProvider} when the run's provider cannot be resolved:
|
|
32
|
+
* no credential for the one asked for, none configured at all, or a name the
|
|
33
|
+
* kernel does not know. `missing` names what would have satisfied it (the env
|
|
34
|
+
* var and the BYO slot), so the message tells an operator what to set; it is
|
|
35
|
+
* empty for an unknown name, where nothing would.
|
|
36
|
+
*/
|
|
37
|
+
export declare class ProviderCredentialsError extends Error {
|
|
38
|
+
readonly preferred: string | null;
|
|
39
|
+
readonly missing: string[];
|
|
40
|
+
constructor(preferred: string | null | undefined, missing: string[], reason: string);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Whether {@link selectProvider} would succeed, as a reason rather than a
|
|
44
|
+
* throw, so an engine's `supports()` can refuse a run before it starts. Pure:
|
|
45
|
+
* it constructs no client.
|
|
46
|
+
*/
|
|
47
|
+
export declare function providerAvailability(preferred?: string | null, opts?: ProviderSelection): ProviderAvailability;
|
|
15
48
|
/**
|
|
16
49
|
* Resolves a provider from the workflow's preference and the host's
|
|
17
|
-
* environment.
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
50
|
+
* environment.
|
|
51
|
+
*
|
|
52
|
+
* It fails loud: a preferred provider with no credential, or no preference and
|
|
53
|
+
* no credential at all, throws a {@link ProviderCredentialsError} naming what
|
|
54
|
+
* would have satisfied it. The offline mock is reached only on request
|
|
55
|
+
* (`preferred: "mock"`) or by explicit opt-in (`allowMockFallback`), because a
|
|
56
|
+
* run that silently landed on the mock used to be indistinguishable from one
|
|
57
|
+
* that reached a model, and consumers grew prediction code to tell them apart.
|
|
22
58
|
*
|
|
23
59
|
* `opts` carries the per-run model and per-org BYO keys; both fall back to the
|
|
24
|
-
* host's env (model via the provider constructor's env default, keys
|
|
60
|
+
* host's env (model via the provider constructor's env default, keys above).
|
|
25
61
|
*/
|
|
26
62
|
export declare function selectProvider(preferred?: string | null, opts?: ProviderSelection): Provider;
|
|
27
63
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE7D,mEAAmE;AACnE,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,sFAAsF;IACtF,WAAW,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE7D,mEAAmE;AACnE,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,sFAAsF;IACtF,WAAW,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1F;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED,qFAAqF;AACrF,MAAM,MAAM,oBAAoB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAE/E;;;;;;GAMG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;gBAEd,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM;CAMpF;AA6GD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,IAAI,GAAE,iBAAsB,GAC3B,oBAAoB,CAKtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,GAAE,iBAAsB,GAAG,QAAQ,CA4BhG"}
|
package/dist/providers/index.js
CHANGED
|
@@ -3,65 +3,149 @@ import { OpenAIProvider } from "./openai.js";
|
|
|
3
3
|
import { OpenRouterProvider } from "./openrouter.js";
|
|
4
4
|
import { LocalProvider } from "./local.js";
|
|
5
5
|
import { MockProvider } from "./mock.js";
|
|
6
|
+
/**
|
|
7
|
+
* Thrown by {@link selectProvider} when the run's provider cannot be resolved:
|
|
8
|
+
* no credential for the one asked for, none configured at all, or a name the
|
|
9
|
+
* kernel does not know. `missing` names what would have satisfied it (the env
|
|
10
|
+
* var and the BYO slot), so the message tells an operator what to set; it is
|
|
11
|
+
* empty for an unknown name, where nothing would.
|
|
12
|
+
*/
|
|
13
|
+
export class ProviderCredentialsError extends Error {
|
|
14
|
+
preferred;
|
|
15
|
+
missing;
|
|
16
|
+
constructor(preferred, missing, reason) {
|
|
17
|
+
super(reason);
|
|
18
|
+
this.name = "ProviderCredentialsError";
|
|
19
|
+
this.preferred = preferred ?? null;
|
|
20
|
+
this.missing = missing;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const CLOUD = ["anthropic", "openai", "openrouter"];
|
|
24
|
+
const ENV_KEY = {
|
|
25
|
+
anthropic: "ANTHROPIC_API_KEY",
|
|
26
|
+
openai: "OPENAI_API_KEY",
|
|
27
|
+
openrouter: "OPENROUTER_API_KEY",
|
|
28
|
+
};
|
|
29
|
+
function isCloud(name) {
|
|
30
|
+
return CLOUD.includes(name ?? "");
|
|
31
|
+
}
|
|
32
|
+
/** The resolved key per cloud provider: the org's BYO key, else the host's env key. */
|
|
33
|
+
function resolveKeys(opts) {
|
|
34
|
+
return {
|
|
35
|
+
anthropic: opts.credentials?.anthropic ?? process.env.ANTHROPIC_API_KEY,
|
|
36
|
+
openai: opts.credentials?.openai ?? process.env.OPENAI_API_KEY,
|
|
37
|
+
openrouter: opts.credentials?.openrouter ?? process.env.OPENROUTER_API_KEY,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** What satisfies a provider's credential, for the error message. */
|
|
41
|
+
function wouldSatisfy(name) {
|
|
42
|
+
return [ENV_KEY[name], `credentials.${name}`];
|
|
43
|
+
}
|
|
44
|
+
function resolve(preferred, opts) {
|
|
45
|
+
const keys = resolveKeys(opts);
|
|
46
|
+
const missing = (reason, names) => ({
|
|
47
|
+
kind: "missing",
|
|
48
|
+
error: new ProviderCredentialsError(preferred, names, reason),
|
|
49
|
+
});
|
|
50
|
+
if (preferred === "mock")
|
|
51
|
+
return { kind: "mock" };
|
|
52
|
+
if (preferred === "local") {
|
|
53
|
+
// The one provider that was always loud: it is chosen precisely to keep a
|
|
54
|
+
// run on private inference (e.g. a data_class: pii workflow), so running it
|
|
55
|
+
// anywhere else would defeat the point. A key is optional (a local server
|
|
56
|
+
// usually needs none); the base URL is not — without it there is nothing
|
|
57
|
+
// to point at. `allowMockFallback` does not apply here for the same reason.
|
|
58
|
+
const baseURL = process.env.LOCAL_MODEL_BASE_URL;
|
|
59
|
+
if (!baseURL) {
|
|
60
|
+
return missing("provider.preferred is 'local' but LOCAL_MODEL_BASE_URL is not set — " +
|
|
61
|
+
"refusing to run a private-inference workflow on another provider", ["LOCAL_MODEL_BASE_URL"]);
|
|
62
|
+
}
|
|
63
|
+
return { kind: "local", baseURL };
|
|
64
|
+
}
|
|
65
|
+
if (isCloud(preferred)) {
|
|
66
|
+
const key = keys[preferred];
|
|
67
|
+
if (key)
|
|
68
|
+
return { kind: "cloud", name: preferred, key };
|
|
69
|
+
// No falling through to another configured provider: a run that asked for
|
|
70
|
+
// one model and quietly got another is the same failure as one that
|
|
71
|
+
// quietly got the mock.
|
|
72
|
+
if (opts.allowMockFallback)
|
|
73
|
+
return { kind: "mock" };
|
|
74
|
+
const [env, slot] = wouldSatisfy(preferred);
|
|
75
|
+
return missing(`provider "${preferred}" was requested but no credential is configured: ` +
|
|
76
|
+
`set ${env} on the host or pass ${slot} with the run ` +
|
|
77
|
+
"(or set allowMockFallback to run offline on the mock)", wouldSatisfy(preferred));
|
|
78
|
+
}
|
|
79
|
+
// A name the kernel does not know is a typo or a provider this kernel has no
|
|
80
|
+
// adapter for. It is refused rather than read as "no preference": routing a
|
|
81
|
+
// run that asked for "openia" to whichever key happens to be configured is
|
|
82
|
+
// the silent substitution this contract exists to stop. (The mock opt-in is
|
|
83
|
+
// for a missing credential, not a wrong name, so it does not apply.)
|
|
84
|
+
if (typeof preferred === "string" && preferred.trim() !== "") {
|
|
85
|
+
return missing(`provider "${preferred}" is not one this kernel knows; use one of ` +
|
|
86
|
+
`${[...CLOUD, "local", "mock"].join(", ")}, or omit the preference`, []);
|
|
87
|
+
}
|
|
88
|
+
// No preference (absent, null or blank): pick whatever is configured, in a
|
|
89
|
+
// fixed order.
|
|
90
|
+
for (const name of CLOUD) {
|
|
91
|
+
const key = keys[name];
|
|
92
|
+
if (key)
|
|
93
|
+
return { kind: "cloud", name, key };
|
|
94
|
+
}
|
|
95
|
+
if (opts.allowMockFallback)
|
|
96
|
+
return { kind: "mock" };
|
|
97
|
+
return missing("no provider credential is configured: set one of " +
|
|
98
|
+
`${CLOUD.map((n) => ENV_KEY[n]).join(", ")} on the host or pass credentials with the run ` +
|
|
99
|
+
"(or set allowMockFallback to run offline on the mock)", CLOUD.flatMap(wouldSatisfy));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Whether {@link selectProvider} would succeed, as a reason rather than a
|
|
103
|
+
* throw, so an engine's `supports()` can refuse a run before it starts. Pure:
|
|
104
|
+
* it constructs no client.
|
|
105
|
+
*/
|
|
106
|
+
export function providerAvailability(preferred, opts = {}) {
|
|
107
|
+
const resolution = resolve(preferred, opts);
|
|
108
|
+
return resolution.kind === "missing"
|
|
109
|
+
? { ok: false, reason: resolution.error.message }
|
|
110
|
+
: { ok: true };
|
|
111
|
+
}
|
|
6
112
|
/**
|
|
7
113
|
* Resolves a provider from the workflow's preference and the host's
|
|
8
|
-
* environment.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
114
|
+
* environment.
|
|
115
|
+
*
|
|
116
|
+
* It fails loud: a preferred provider with no credential, or no preference and
|
|
117
|
+
* no credential at all, throws a {@link ProviderCredentialsError} naming what
|
|
118
|
+
* would have satisfied it. The offline mock is reached only on request
|
|
119
|
+
* (`preferred: "mock"`) or by explicit opt-in (`allowMockFallback`), because a
|
|
120
|
+
* run that silently landed on the mock used to be indistinguishable from one
|
|
121
|
+
* that reached a model, and consumers grew prediction code to tell them apart.
|
|
13
122
|
*
|
|
14
123
|
* `opts` carries the per-run model and per-org BYO keys; both fall back to the
|
|
15
|
-
* host's env (model via the provider constructor's env default, keys
|
|
124
|
+
* host's env (model via the provider constructor's env default, keys above).
|
|
16
125
|
*/
|
|
17
126
|
export function selectProvider(preferred, opts = {}) {
|
|
18
|
-
const anthropicKey = opts.credentials?.anthropic ?? process.env.ANTHROPIC_API_KEY;
|
|
19
|
-
const openaiKey = opts.credentials?.openai ?? process.env.OPENAI_API_KEY;
|
|
20
|
-
const openrouterKey = opts.credentials?.openrouter ?? process.env.OPENROUTER_API_KEY;
|
|
21
127
|
// undefined → the provider constructor's env-default model kicks in.
|
|
22
128
|
const model = opts.model ?? undefined;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if (openrouterKey)
|
|
34
|
-
return new OpenRouterProvider(openrouterKey, model);
|
|
35
|
-
break;
|
|
36
|
-
case "local": {
|
|
37
|
-
// The one provider that FAILS LOUD instead of degrading to the mock: it is
|
|
38
|
-
// chosen precisely to keep a run on private inference (e.g. a data_class:
|
|
39
|
-
// pii workflow), so silently running it anywhere else would defeat the
|
|
40
|
-
// point. A key is optional (a local server usually needs none); the base
|
|
41
|
-
// URL is not — without it there is nothing to point at.
|
|
42
|
-
const baseURL = process.env.LOCAL_MODEL_BASE_URL;
|
|
43
|
-
if (!baseURL) {
|
|
44
|
-
throw new Error("provider.preferred is 'local' but LOCAL_MODEL_BASE_URL is not set — " +
|
|
45
|
-
"refusing to run a private-inference workflow on another provider");
|
|
129
|
+
const resolution = resolve(preferred, opts);
|
|
130
|
+
switch (resolution.kind) {
|
|
131
|
+
case "cloud":
|
|
132
|
+
switch (resolution.name) {
|
|
133
|
+
case "anthropic":
|
|
134
|
+
return new AnthropicProvider(resolution.key, model);
|
|
135
|
+
case "openai":
|
|
136
|
+
return new OpenAIProvider(resolution.key, model);
|
|
137
|
+
case "openrouter":
|
|
138
|
+
return new OpenRouterProvider(resolution.key, model);
|
|
46
139
|
}
|
|
47
|
-
|
|
48
|
-
|
|
140
|
+
// eslint-disable-next-line no-fallthrough -- the inner switch is exhaustive
|
|
141
|
+
case "local":
|
|
142
|
+
return new LocalProvider(resolution.baseURL, opts.credentials?.local ?? process.env.LOCAL_MODEL_API_KEY, model);
|
|
49
143
|
case "mock":
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
// rather than silently upgrading to a real provider. Hand it the full
|
|
53
|
-
// selection so it can self-document the model + BYO key it WOULD have used.
|
|
144
|
+
// The mock is handed the full selection so it can self-document the
|
|
145
|
+
// model + BYO key a real run WOULD have used.
|
|
54
146
|
return new MockProvider(opts);
|
|
147
|
+
case "missing":
|
|
148
|
+
throw resolution.error;
|
|
55
149
|
}
|
|
56
|
-
// No explicit (or usable) preference: pick whatever is configured.
|
|
57
|
-
if (anthropicKey)
|
|
58
|
-
return new AnthropicProvider(anthropicKey, model);
|
|
59
|
-
if (openaiKey)
|
|
60
|
-
return new OpenAIProvider(openaiKey, model);
|
|
61
|
-
if (openrouterKey)
|
|
62
|
-
return new OpenRouterProvider(openrouterKey, model);
|
|
63
|
-
// The offline fallback still carries the selection, so a keyless run's output
|
|
64
|
-
// artifact reports the model (and any BYO key) the caller resolved.
|
|
65
|
-
return new MockProvider(opts);
|
|
66
150
|
}
|
|
67
151
|
//# sourceMappingURL=index.js.map
|