@rarebit-one/harness-kernel 0.10.0 → 0.11.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +160 -6
  2. package/dist/agent.d.ts +117 -8
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +332 -25
  5. package/dist/agent.js.map +1 -1
  6. package/dist/engines/native.d.ts +5 -0
  7. package/dist/engines/native.d.ts.map +1 -1
  8. package/dist/engines/native.js +30 -10
  9. package/dist/engines/native.js.map +1 -1
  10. package/dist/engines/types.d.ts +31 -1
  11. package/dist/engines/types.d.ts.map +1 -1
  12. package/dist/events.d.ts +30 -2
  13. package/dist/events.d.ts.map +1 -1
  14. package/dist/events.js.map +1 -1
  15. package/dist/index.d.ts +18 -12
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +7 -4
  18. package/dist/index.js.map +1 -1
  19. package/dist/loop.d.ts +60 -11
  20. package/dist/loop.d.ts.map +1 -1
  21. package/dist/loop.js +7 -5
  22. package/dist/loop.js.map +1 -1
  23. package/dist/models/chat.d.ts +2 -1
  24. package/dist/models/chat.d.ts.map +1 -1
  25. package/dist/models/chat.js +20 -4
  26. package/dist/models/chat.js.map +1 -1
  27. package/dist/models/types.d.ts +16 -0
  28. package/dist/models/types.d.ts.map +1 -1
  29. package/dist/models/types.js.map +1 -1
  30. package/dist/private.d.ts.map +1 -1
  31. package/dist/private.js +29 -1
  32. package/dist/private.js.map +1 -1
  33. package/dist/providers/anthropic.d.ts +30 -4
  34. package/dist/providers/anthropic.d.ts.map +1 -1
  35. package/dist/providers/anthropic.js +130 -29
  36. package/dist/providers/anthropic.js.map +1 -1
  37. package/dist/providers/index.d.ts +42 -6
  38. package/dist/providers/index.d.ts.map +1 -1
  39. package/dist/providers/index.js +132 -48
  40. package/dist/providers/index.js.map +1 -1
  41. package/dist/providers/mock.d.ts +6 -3
  42. package/dist/providers/mock.d.ts.map +1 -1
  43. package/dist/providers/mock.js +9 -4
  44. package/dist/providers/mock.js.map +1 -1
  45. package/dist/providers/openai.d.ts +54 -8
  46. package/dist/providers/openai.d.ts.map +1 -1
  47. package/dist/providers/openai.js +164 -32
  48. package/dist/providers/openai.js.map +1 -1
  49. package/dist/providers/options.d.ts +177 -0
  50. package/dist/providers/options.d.ts.map +1 -0
  51. package/dist/providers/options.js +67 -0
  52. package/dist/providers/options.js.map +1 -0
  53. package/dist/providers/scripted.d.ts +49 -0
  54. package/dist/providers/scripted.d.ts.map +1 -0
  55. package/dist/providers/scripted.js +90 -0
  56. package/dist/providers/scripted.js.map +1 -0
  57. package/dist/providers/types.d.ts +60 -0
  58. package/dist/providers/types.d.ts.map +1 -1
  59. package/dist/tools/metadata.d.ts +24 -0
  60. package/dist/tools/metadata.d.ts.map +1 -1
  61. package/dist/tools/metadata.js +8 -0
  62. package/dist/tools/metadata.js.map +1 -1
  63. package/dist/tools/registry.d.ts +10 -3
  64. package/dist/tools/registry.d.ts.map +1 -1
  65. package/dist/tools/registry.js +9 -4
  66. package/dist/tools/registry.js.map +1 -1
  67. package/dist/tools/terminal.d.ts +33 -0
  68. package/dist/tools/terminal.d.ts.map +1 -0
  69. package/dist/tools/terminal.js +32 -0
  70. package/dist/tools/terminal.js.map +1 -0
  71. package/package.json +4 -3
@@ -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. The kernel is provider-agnostic; when the preferred provider has
9
- * no credentials we degrade to the offline mock rather than failing the run,
10
- * which keeps a harness runnable end-to-end without keys. The one exception is
11
- * `local`: it is chosen to keep a run on private inference, so a missing
12
- * LOCAL_MODEL_BASE_URL throws rather than degrading to any other provider.
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 below).
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
- switch (preferred) {
24
- case "anthropic":
25
- if (anthropicKey)
26
- return new AnthropicProvider(anthropicKey, model);
27
- break;
28
- case "openai":
29
- if (openaiKey)
30
- return new OpenAIProvider(openaiKey, model);
31
- break;
32
- case "openrouter":
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
- return new LocalProvider(baseURL, opts.credentials?.local ?? process.env.LOCAL_MODEL_API_KEY, model);
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
- // An explicit `preferred: mock` always gets the mock, even when a key is
51
- // configured — it's the offline dry-run lens, so honour it deterministically
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAaxC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,SAAyB,EAAE,OAA0B,EAAE;IACpF,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAA;IACjF,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;IACxE,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;IACpF,qEAAqE;IACrE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,SAAS,CAAA;IAErC,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,WAAW;YACd,IAAI,YAAY;gBAAE,OAAO,IAAI,iBAAiB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;YACnE,MAAK;QACP,KAAK,QAAQ;YACX,IAAI,SAAS;gBAAE,OAAO,IAAI,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YAC1D,MAAK;QACP,KAAK,YAAY;YACf,IAAI,aAAa;gBAAE,OAAO,IAAI,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;YACtE,MAAK;QACP,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,2EAA2E;YAC3E,0EAA0E;YAC1E,uEAAuE;YACvE,yEAAyE;YACzE,wDAAwD;YACxD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAA;YAChD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,sEAAsE;oBACpE,kEAAkE,CACrE,CAAA;YACH,CAAC;YACD,OAAO,IAAI,aAAa,CACtB,OAAO,EACP,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAC1D,KAAK,CACN,CAAA;QACH,CAAC;QACD,KAAK,MAAM;YACT,yEAAyE;YACzE,6EAA6E;YAC7E,sEAAsE;YACtE,4EAA4E;YAC5E,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,mEAAmE;IACnE,IAAI,YAAY;QAAE,OAAO,IAAI,iBAAiB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;IACnE,IAAI,SAAS;QAAE,OAAO,IAAI,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC1D,IAAI,aAAa;QAAE,OAAO,IAAI,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;IACtE,8EAA8E;IAC9E,oEAAoE;IACpE,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import type { CompletionRequest, ConverseOptions, ConverseRequest, ConverseResult, Provider } from "./types.js";
2
2
  import type { ProviderSelection } from "./index.js";
3
3
  /**
4
- * Deterministic, offline provider. Used when no API key is configured — or when a
5
- * workflow explicitly asks for `preferred: mock` — so the end-to-end loop (and
6
- * tests) run without network access or credentials.
4
+ * Deterministic, offline provider. Used when a workflow explicitly asks for
5
+ * `preferred: mock`, or when a caller opts into `allowMockFallback` and no key
6
+ * is configured, so the end-to-end loop (and tests) run without network access
7
+ * or credentials. It accepts and ignores `providerOptions`: it is the dry run.
7
8
  *
8
9
  * It cannot call a model, but it is handed the SAME provider selection a real
9
10
  * provider would receive (the resolved per-run model + per-org BYO keys) and
@@ -14,6 +15,8 @@ import type { ProviderSelection } from "./index.js";
14
15
  */
15
16
  export declare class MockProvider implements Provider {
16
17
  readonly name = "mock";
18
+ /** The model the caller resolved, when it resolved one; the mock calls nothing. */
19
+ readonly model?: string;
17
20
  private readonly selection;
18
21
  constructor(selection?: ProviderSelection);
19
22
  private resolvedModel;
@@ -1 +1 @@
1
- {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/providers/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,cAAc,EACd,QAAQ,EACT,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD;;;;;;;;;;;GAWG;AACH,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,IAAI,UAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;gBAEjC,SAAS,GAAE,iBAAsB;IAS7C,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,cAAc;IAWtB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B3C,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAWtF"}
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/providers/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,cAAc,EACd,QAAQ,EACT,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,IAAI,UAAS;IACtB,mFAAmF;IACnF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;gBAEjC,SAAS,GAAE,iBAAsB;IAU7C,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,cAAc;IAWtB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B3C,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAWtF"}
@@ -1,7 +1,8 @@
1
1
  /**
2
- * Deterministic, offline provider. Used when no API key is configured — or when a
3
- * workflow explicitly asks for `preferred: mock` — so the end-to-end loop (and
4
- * tests) run without network access or credentials.
2
+ * Deterministic, offline provider. Used when a workflow explicitly asks for
3
+ * `preferred: mock`, or when a caller opts into `allowMockFallback` and no key
4
+ * is configured, so the end-to-end loop (and tests) run without network access
5
+ * or credentials. It accepts and ignores `providerOptions`: it is the dry run.
5
6
  *
6
7
  * It cannot call a model, but it is handed the SAME provider selection a real
7
8
  * provider would receive (the resolved per-run model + per-org BYO keys) and
@@ -12,9 +13,13 @@
12
13
  */
13
14
  export class MockProvider {
14
15
  name = "mock";
16
+ /** The model the caller resolved, when it resolved one; the mock calls nothing. */
17
+ model;
15
18
  selection;
16
19
  constructor(selection = {}) {
17
20
  this.selection = selection;
21
+ if (selection.model)
22
+ this.model = selection.model;
18
23
  }
19
24
  // "What a real provider would have used" for the model: the model the caller
20
25
  // resolved (workflow YAML → org default), else the host's
@@ -83,7 +88,7 @@ export class MockProvider {
83
88
  prompt,
84
89
  });
85
90
  opts?.signal?.throwIfAborted();
86
- return { text, toolCalls: [] };
91
+ return { text, toolCalls: [], finishReason: "stop" };
87
92
  }
88
93
  }
89
94
  //# sourceMappingURL=mock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/providers/mock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/providers/mock.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,MAAM,CAAA;IACtB,mFAAmF;IAC1E,KAAK,CAAS;IACN,SAAS,CAAmB;IAE7C,YAAY,YAA+B,EAAE;QAC3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,SAAS,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;IACnD,CAAC;IAED,6EAA6E;IAC7E,0DAA0D;IAC1D,sEAAsE;IACtE,+EAA+E;IAC/E,gFAAgF;IACxE,aAAa;QACnB,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;QACpF,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAA;QACzF,IAAI,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAA;QACtE,OAAO,EAAE,KAAK,EAAE,6BAA6B,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAA;IACtF,CAAC;IAED,gFAAgF;IAChF,gFAAgF;IAChF,sCAAsC;IAC9B,YAAY;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,CAAA;QAC9C,MAAM,OAAO,GAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAW;aAC7D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,uCAAuC,CAAA;IACtF,CAAC;IAED,gFAAgF;IACxE,cAAc;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAA;QAClC,OAAO;YACL,wCAAwC;YACxC,EAAE;YACF,UAAU,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,kBAAkB;YACxD,gBAAgB,IAAI,CAAC,YAAY,EAAE,EAAE;YACrC,EAAE;SACH,CAAA;IACH,CAAC;IAED,QAAQ,CAAC,GAAsB;QAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QACxC,OAAO,OAAO,CAAC,OAAO,CACpB;YACE,mCAAmC;YACnC,EAAE;YACF,+EAA+E;YAC/E,yCAAyC;YACzC,EAAE;YACF,GAAG,IAAI,CAAC,cAAc,EAAE;YACxB,WAAW;YACX,EAAE;YACF,GAAG,CAAC,MAAM;YACV,EAAE;YACF,+BAA+B;YAC/B,EAAE;YACF,KAAK;YACL,OAAO;YACP,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAA;IACH,CAAC;IAED,8EAA8E;IAC9E,0EAA0E;IAC1E,2EAA2E;IAC3E,wDAAwD;IACxD,KAAK,CAAC,QAAQ,CAAC,GAAoB,EAAE,IAAsB;QACzD,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QAC9B,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;QAC3E,MAAM,MAAM,GAAG,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QACxE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC;YAC/B,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE;YAClG,MAAM;SACP,CAAC,CAAA;QACF,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QAC9B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAA;IACtD,CAAC;CACF"}
@@ -1,15 +1,33 @@
1
1
  import OpenAI from "openai";
2
2
  import type { TokenUsage } from "../models/types.js";
3
- import type { AgentMessage, CompletionRequest, ConverseOptions, ConverseRequest, ConverseResult, Provider } from "./types.js";
4
- /** Map provider-neutral messages to OpenAI chat messages (pure; tested). */
5
- export declare function toOpenAIMessages(messages: AgentMessage[]): OpenAI.Chat.Completions.ChatCompletionMessageParam[];
3
+ import { type CacheTtl } from "./options.js";
4
+ import type { AgentMessage, CompletionRequest, ConverseOptions, ConverseRequest, ConverseResult, FinishReason, Provider } from "./types.js";
5
+ /** Where to put message breakpoints: how many trailing messages, and the lifetime. */
6
+ export interface OpenAIMessageCache {
7
+ trailingMessages: number;
8
+ ttl?: CacheTtl;
9
+ }
10
+ /**
11
+ * Map provider-neutral messages to OpenAI chat messages (pure; tested).
12
+ *
13
+ * With `cache` set (OpenRouter), the trailing N messages are sent as content
14
+ * parts with a `cache_control` breakpoint on their text. An assistant message
15
+ * with no prose has nowhere to put one and is left as it was; a tool message
16
+ * puts it on its last result. Messages outside the window keep the plain
17
+ * string form.
18
+ */
19
+ export declare function toOpenAIMessages(messages: AgentMessage[], cache?: OpenAIMessageCache): OpenAI.Chat.Completions.ChatCompletionMessageParam[];
6
20
  /** Reduce an OpenAI response message to text + tool calls (pure; tested). */
7
21
  export declare function parseOpenAIMessage(message: OpenAI.Chat.Completions.ChatCompletionMessage): ConverseResult;
22
+ /** Map the OpenAI dialect's `finish_reason` onto the neutral vocabulary (pure; tested). */
23
+ export declare function openAIFinishReason(finishReason: string | null | undefined): FinishReason;
8
24
  /**
9
- * Map an OpenAI `usage` block to the kernel's token accounting (pure; tested).
10
- * `prompt_tokens` already includes cached input, so it maps to `inputTokens`
11
- * as-is and `cached_tokens` is the cache-read breakdown. OpenAI's automatic
12
- * caching reports no separate write count.
25
+ * Map an OpenAI-dialect `usage` block to the kernel's token accounting (pure;
26
+ * tested). `prompt_tokens` already includes cached input, so it maps to
27
+ * `inputTokens` as-is and `cached_tokens` is the cache-read breakdown. OpenAI
28
+ * reports no write count; OpenRouter does (`cache_write_tokens`), and prices
29
+ * the call (`cost`), so both are carried when present. Reasoning tokens are
30
+ * the `completion_tokens_details` breakdown either side reports.
13
31
  */
14
32
  export declare function openAIUsage(usage: OpenAI.Completions.CompletionUsage | null | undefined): TokenUsage | undefined;
15
33
  /** Constructor options for an OpenAI-compatible (chat.completions) provider. */
@@ -25,6 +43,34 @@ export interface OpenAICompatibleOptions {
25
43
  */
26
44
  defaultHeaders?: Record<string, string | null>;
27
45
  }
46
+ /** The adapter names whose dialect differences this core knows about. */
47
+ export declare const OPENAI_ADAPTER = "openai";
48
+ export declare const OPENROUTER_ADAPTER = "openrouter";
49
+ /**
50
+ * The chat.completions request body plus the fields OpenRouter adds to the
51
+ * dialect (`models`, `provider`, `usage`, `transforms`). The SDK forwards
52
+ * unknown body fields untouched, so they are typed here as an extension rather
53
+ * than cast away at the call site.
54
+ */
55
+ export type OpenAICompatibleBody = OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming & {
56
+ models?: string[];
57
+ provider?: Record<string, unknown>;
58
+ usage?: {
59
+ include: boolean;
60
+ };
61
+ transforms?: string[];
62
+ };
63
+ /**
64
+ * Build the chat.completions request for one conversation step (pure; tested).
65
+ *
66
+ * `name` selects the dialect: `openrouter` accepts the `openrouter` options
67
+ * block and places prompt-cache breakpoints as content parts; `openai` maps
68
+ * `promptCache.key` onto `prompt_cache_key` (its caching is otherwise
69
+ * automatic, so breakpoints have nothing to attach to); any other name (local
70
+ * servers, custom endpoints) gets the plain dialect and rejects the
71
+ * OpenRouter block.
72
+ */
73
+ export declare function openAICompatibleRequestBody(name: string, model: string, req: ConverseRequest, fallbackMaxTokens?: number): OpenAICompatibleBody;
28
74
  /**
29
75
  * Shared core for providers speaking the OpenAI chat.completions dialect
30
76
  * (including tools). OpenAI proper and OpenRouter both instantiate this —
@@ -33,8 +79,8 @@ export interface OpenAICompatibleOptions {
33
79
  export declare class OpenAICompatibleProvider implements Provider {
34
80
  readonly name: string;
35
81
  readonly reportsUsage = true;
82
+ readonly model: string;
36
83
  private client;
37
- private model;
38
84
  constructor(name: string, opts: OpenAICompatibleOptions);
39
85
  complete(req: CompletionRequest): Promise<string>;
40
86
  converse(req: ConverseRequest, opts?: ConverseOptions): Promise<ConverseResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,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;AAEnB,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,EAAE,GACvB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,0BAA0B,EAAE,CA0BtD;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,qBAAqB,GACrD,cAAc,CAchB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,eAAe,GAAG,IAAI,GAAG,SAAS,GAC3D,UAAU,GAAG,SAAS,CASxB;AAaD,gFAAgF;AAChF,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;CAC/C;AAED;;;;GAIG;AACH,qBAAa,wBAAyB,YAAW,QAAQ;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,YAAY,QAAO;IAC5B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,KAAK,CAAQ;gBAET,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB;IAejD,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAajD,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAsBtF;AAED,qBAAa,cAAe,SAAQ,wBAAwB;gBAC9C,MAAM,EAAE,MAAM,EAAE,KAAK,SAAwC;CAG1E"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,EAKL,KAAK,QAAQ,EAGd,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,cAAc,EACd,YAAY,EACZ,QAAQ,EAET,MAAM,YAAY,CAAA;AAgBnB,sFAAsF;AACtF,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,MAAM,CAAA;IACxB,GAAG,CAAC,EAAE,QAAQ,CAAA;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,EAAE,EACxB,KAAK,CAAC,EAAE,kBAAkB,GACzB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,0BAA0B,EAAE,CAoCtD;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,qBAAqB,GACrD,cAAc,CAehB;AAED,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,CAcxF;AAsBD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,eAAe,GAAG,IAAI,GAAG,SAAS,GAC3D,UAAU,GAAG,SAAS,CAkBxB;AAaD,gFAAgF;AAChF,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;CAC/C;AAED,yEAAyE;AACzE,eAAO,MAAM,cAAc,WAAW,CAAA;AACtC,eAAO,MAAM,kBAAkB,eAAe,CAAA;AAE9C;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAC9B,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,sCAAsC,GAAG;IAC/D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB,CAAA;AAEH;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,eAAe,EACpB,iBAAiB,GAAE,MAAoB,GACtC,oBAAoB,CAiDtB;AAED;;;;GAIG;AACH,qBAAa,wBAAyB,YAAW,QAAQ;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,YAAY,QAAO;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,MAAM,CAAQ;gBAEV,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB;IAejD,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBjD,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAgCtF;AAED,qBAAa,cAAe,SAAQ,wBAAwB;gBAC9C,MAAM,EAAE,MAAM,EAAE,KAAK,SAAwC;CAG1E"}