@agenticprimitives/orchestration-openai-compat 0.0.0-alpha.4 → 0.0.0-alpha.6

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 CHANGED
@@ -1,5 +1,7 @@
1
1
  # @agenticprimitives/orchestration-openai-compat
2
2
 
3
+ > Part of **[Agentic Primitives](https://agenticprimitives.dev)** — the open-source trust substrate for agentic applications: identity that can sign, authority checked at act time, evidence the owner carries. [Developer kit](https://github.com/agentictrustlabs/agentic-primitives) · [All packages](https://agenticprimitives.dev/developers)
4
+
3
5
  The **OpenAI-compatible LLM binding** for the [`@agenticprimitives/orchestration`](../orchestration) `Planner`
4
6
  and `AnswerComposer` ports — the in-repo adapter (the `chain-state` / `chain-state-viem` pattern), sibling to
5
7
  [`orchestration-anthropic`](../orchestration-anthropic). The pure orchestration core stays vendor-free; the
@@ -1,6 +1,8 @@
1
1
  import type { AnswerComposer } from '@agenticprimitives/orchestration';
2
- import type { OpenAiCompatLike } from './types.js';
2
+ import { type OpenAiCompatLike, type OpenAiCompatUsageV1 } from './types.js';
3
3
  export interface OpenAiCompatComposerOpts {
4
+ /** Told what each call used, as the provider reported it (tokens — never an estimate). */
5
+ onUsage?: (u: OpenAiCompatUsageV1) => void;
4
6
  client: OpenAiCompatLike;
5
7
  /** The answering model, as the host names it. REQUIRED. */
6
8
  model: string;
@@ -1 +1 @@
1
- {"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../src/composer.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,kCAAkC,CAAC;AAErF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAsBnD,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,gBAAgB,CAAC;IACzB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iGAAiG;IACjG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,wBAAwB,GAAG,cAAc,CAoCzF"}
1
+ {"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../src/composer.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,kCAAkC,CAAC;AAErF,OAAO,EAAuB,KAAK,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAsBlG,MAAM,WAAW,wBAAwB;IACvC,0FAA0F;IAC1F,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC3C,MAAM,EAAE,gBAAgB,CAAC;IACzB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iGAAiG;IACjG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,wBAAwB,GAAG,cAAc,CAqCzF"}
package/dist/composer.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { fitEvidence } from '@agenticprimitives/orchestration';
2
+ import { usageOfOpenAiCompat } from './types.js';
2
3
  const SYSTEM = [
3
4
  'You put an agent\'s findings into plain words for the person who asked.',
4
5
  '',
@@ -55,6 +56,11 @@ export function createOpenAiCompatComposer(opts) {
55
56
  },
56
57
  ],
57
58
  });
59
+ {
60
+ const u = usageOfOpenAiCompat(res.usage);
61
+ if (u)
62
+ opts.onUsage?.(u);
63
+ }
58
64
  const text = (res.choices?.[0]?.message?.content ?? '').trim();
59
65
  // No text is not an answer. Say nothing rather than something: the caller renders the raw result.
60
66
  if (!text)
@@ -1 +1 @@
1
- {"version":3,"file":"composer.js","sourceRoot":"","sources":["../src/composer.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAG/D,MAAM,MAAM,GAAG;IACb,yEAAyE;IACzE,EAAE;IACF,yGAAyG;IACzG,6EAA6E;IAC7E,EAAE;IACF,oGAAoG;IACpG,qGAAqG;IACrG,sFAAsF;IACtF,2FAA2F;IAC3F,EAAE;IACF,wGAAwG;IACxG,wGAAwG;IACxG,EAAE;IACF,sGAAsG;IACtG,qGAAqG;IACrG,sGAAsG;IACtG,iEAAiE;CAClE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAeb,MAAM,SAAS,GAAG,CAAC,CAAU,EAAU,EAAE;IACvC,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;AACtH,CAAC,CAAC;AAEF,MAAM,UAAU,0BAA0B,CAAC,IAA8B;IACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC;IAC5C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,qEAAqE,CAAC,CAAC;IAC3G,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,IAAI,MAAM,CAAC;IAC5C,OAAO;QACL,cAAc,EAAE,GAAG;QACnB,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAgB;YACzE,wGAAwG;YACxG,qGAAqG;YACrG,8EAA8E;YAC9E,MAAM,KAAK,GAAG,QAAQ,IAAI,WAAW,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;YAC/D,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACpD,KAAK,EAAE,UAAU,EAAE,SAAS;gBAC5B,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE;oBAC7F;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,aAAa,MAAM,CAAC,IAAI,iBAAiB,IAAI,GACpD,WAAW,EAAE,MAAM;4BACjB,uFAAuF;4BACvF,gEAAgE;4BAChE,CAAC,CAAC,wFAAwF,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;4BACvI,CAAC,CAAC,EACN,EAAE;qBACH;iBACF;aACF,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/D,kGAAkG;YAClG,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"composer.js","sourceRoot":"","sources":["../src/composer.ts"],"names":[],"mappings":"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"}
@@ -26,9 +26,19 @@ export interface FetchOpenAiCompatOpts {
26
26
  * longer wait, or a second 429, surfaces as the error it is. `0` disables it. Default 30.
27
27
  */
28
28
  waitOn429UpToSeconds?: number;
29
+ /**
30
+ * On a 502/503/504 — the host overloaded ("This model is currently experiencing high demand", seen live on Gemini
31
+ * 2026-09-28, where the act laboratory counted three turns lost to it) — send the SAME request again, up to this many
32
+ * times, after a short growing pause (0.8 s, then 2 s). The bounded retry of one call ADR-0013 permits: same body,
33
+ * same host, never another vendor; still overloaded after that, the error surfaces as it is. `0` disables. Default 2.
34
+ */
35
+ retryOnOverloadAttempts?: number;
29
36
  /** Injectable sleep (tests). */
30
37
  sleep?: (ms: number) => Promise<void>;
31
38
  }
39
+ /** The pause before overload retry `n` (0-based): 0.8 s, 2 s, then 2 s. */
40
+ export declare const overloadPauseMs: (n: number) => number;
41
+ export declare const isOverloaded: (status: number) => boolean;
32
42
  /** A non-OK HTTP response, with what a caller needs to SAY about it: the status and, on a 429, how long the
33
43
  * host asked us to wait. Surfaces as-is — never a cue to route to another vendor (ADR-0013). */
34
44
  export declare class OpenAiCompatHttpError extends Error {
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-client.d.ts","sourceRoot":"","sources":["../src/fetch-client.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,gBAAgB,EAA4D,MAAM,YAAY,CAAC;AAE7G,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,sHAAsH;IACtH,OAAO,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,wIAAwI;IACxI,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mGAAmG;IACnG,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,YAAY,GAAG,uBAAuB,CAAC;IACzD;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gCAAgC;IAChC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED;iGACiG;AACjG,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM;CASvE;AAWD,mEAAmE;AACnE,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CAkD3F"}
1
+ {"version":3,"file":"fetch-client.d.ts","sourceRoot":"","sources":["../src/fetch-client.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,gBAAgB,EAA4D,MAAM,YAAY,CAAC;AAE7G,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,sHAAsH;IACtH,OAAO,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,wIAAwI;IACxI,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mGAAmG;IACnG,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,YAAY,GAAG,uBAAuB,CAAC;IACzD;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,gCAAgC;IAChC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,2EAA2E;AAC3E,eAAO,MAAM,eAAe,MAAO,MAAM,KAAG,MAAgC,CAAC;AAC7E,eAAO,MAAM,YAAY,WAAY,MAAM,KAAG,OAA6D,CAAC;AAE5G;iGACiG;AACjG,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM;CASvE;AAWD,mEAAmE;AACnE,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CAuD3F"}
@@ -1,3 +1,6 @@
1
+ /** The pause before overload retry `n` (0-based): 0.8 s, 2 s, then 2 s. */
2
+ export const overloadPauseMs = (n) => (n === 0 ? 800 : 2000);
3
+ export const isOverloaded = (status) => status === 502 || status === 503 || status === 504;
1
4
  /** A non-OK HTTP response, with what a caller needs to SAY about it: the status and, on a 429, how long the
2
5
  * host asked us to wait. Surfaces as-is — never a cue to route to another vendor (ADR-0013). */
3
6
  export class OpenAiCompatHttpError extends Error {
@@ -48,6 +51,11 @@ export function createFetchOpenAiCompatClient(opts) {
48
51
  const waitUpTo = opts.waitOn429UpToSeconds ?? 30;
49
52
  const sleep = opts.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
50
53
  let resp = await send();
54
+ for (let n = 0; n < (opts.retryOnOverloadAttempts ?? 2) && isOverloaded(resp.status); n++) {
55
+ await resp.text().catch(() => '');
56
+ await sleep(overloadPauseMs(n));
57
+ resp = await send();
58
+ }
51
59
  if (resp.status === 429 && waitUpTo > 0) {
52
60
  const after = retryAfterOf(resp);
53
61
  if (after !== undefined && after <= waitUpTo) {
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-client.js","sourceRoot":"","sources":["../src/fetch-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetch-client.js","sourceRoot":"","sources":["../src/fetch-client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- export { PACKAGE_NAME, PACKAGE_STATUS, SPEC_REF } from './types.js';
1
+ export { PACKAGE_NAME, PACKAGE_STATUS, SPEC_REF, usageOfOpenAiCompat, type OpenAiCompatUsageV1 } from './types.js';
2
+ export { createOpenAiCompatLogprobChoice, type OpenAiCompatLogprobChoiceOpts } from './logprob-choice.js';
2
3
  export type { OpenAiCompatLike, OpenAiCompatChatCreateParams, OpenAiCompatChatCompletion, OpenAiCompatChatMessage, OpenAiCompatToolDef, OpenAiCompatToolChoice, OpenAiCompatToolCall, } from './types.js';
3
4
  export { createOpenAiCompatPlanner, parseToolArguments } from './planner.js';
4
5
  export type { OpenAiCompatPlannerOpts } from './planner.js';
@@ -8,4 +9,5 @@ export { createOpenAiCompatComposer } from './composer.js';
8
9
  export type { OpenAiCompatComposerOpts } from './composer.js';
9
10
  export { createOpenAiCompatStructuredCall } from './structured-call.js';
10
11
  export type { OpenAiCompatStructuredCallOpts, StructuredToolCallInput } from './structured-call.js';
12
+ export { createOpenAiCompatTextStream, type OpenAiCompatTextStreamOpts, type TextStreamCall } from './text-stream.js';
11
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpE,YAAY,EACV,gBAAgB,EAChB,4BAA4B,EAC5B,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC7E,YAAY,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE5D,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACzF,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,YAAY,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAG9D,OAAO,EAAE,gCAAgC,EAAE,MAAM,sBAAsB,CAAC;AACxE,YAAY,EAAE,8BAA8B,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACnH,OAAO,EAAE,+BAA+B,EAAE,KAAK,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAC1G,YAAY,EACV,gBAAgB,EAChB,4BAA4B,EAC5B,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC7E,YAAY,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE5D,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACzF,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,YAAY,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAG9D,OAAO,EAAE,gCAAgC,EAAE,MAAM,sBAAsB,CAAC;AACxE,YAAY,EAAE,8BAA8B,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,EAAE,4BAA4B,EAAE,KAAK,0BAA0B,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -2,11 +2,13 @@
2
2
  // orchestration `Planner` / `AnswerComposer` ports (the in-repo adapter, chain-state-viem pattern; spec 377).
3
3
  // Vendor-neutral: the consumer supplies `baseUrl` + `model` (Groq, Ollama, OpenRouter, …). Authority is never
4
4
  // here — a chosen tool's call still rides the task delegation at the invoker (ADR-0041).
5
- export { PACKAGE_NAME, PACKAGE_STATUS, SPEC_REF } from './types.js';
5
+ export { PACKAGE_NAME, PACKAGE_STATUS, SPEC_REF, usageOfOpenAiCompat } from './types.js';
6
+ export { createOpenAiCompatLogprobChoice } from './logprob-choice.js';
6
7
  export { createOpenAiCompatPlanner, parseToolArguments } from './planner.js';
7
8
  export { createFetchOpenAiCompatClient, OpenAiCompatHttpError } from './fetch-client.js';
8
9
  // Spec 350 §3.7 — the answering half: what the tools returned, in plain words, grounded in them.
9
10
  export { createOpenAiCompatComposer } from './composer.js';
10
11
  // Spec 358 W1 — the one forced single-tool call the semantic context plane makes.
11
12
  export { createOpenAiCompatStructuredCall } from './structured-call.js';
13
+ export { createOpenAiCompatTextStream } from './text-stream.js';
12
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,8GAA8G;AAC9G,8GAA8G;AAC9G,yFAAyF;AAEzF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAWpE,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAG7E,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAGzF,iGAAiG;AACjG,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAG3D,kFAAkF;AAClF,OAAO,EAAE,gCAAgC,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,8GAA8G;AAC9G,8GAA8G;AAC9G,yFAAyF;AAEzF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,mBAAmB,EAA4B,MAAM,YAAY,CAAC;AACnH,OAAO,EAAE,+BAA+B,EAAsC,MAAM,qBAAqB,CAAC;AAW1G,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAG7E,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAGzF,iGAAiG;AACjG,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAG3D,kFAAkF;AAClF,OAAO,EAAE,gCAAgC,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAE,4BAA4B,EAAwD,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type OpenAiCompatLike, type OpenAiCompatUsageV1 } from './types.js';
2
+ export interface OpenAiCompatLogprobChoiceOpts {
3
+ client: OpenAiCompatLike;
4
+ model: string;
5
+ label?: string;
6
+ /** How many alternatives the host returns for the one token (default 20 — covers a dozen options and n/a). */
7
+ topLogprobs?: number;
8
+ /** Reasoning effort for a model that thinks (`none` where the host accepts it keeps the one token the answer). */
9
+ reasoningEffort?: 'none' | 'minimal' | 'low';
10
+ onUsage?: (u: OpenAiCompatUsageV1) => void;
11
+ }
12
+ /** Ask for one letter among `letters`; return each letter's log-probability as reported (absent ⇒ not among the top). */
13
+ export declare function createOpenAiCompatLogprobChoice(opts: OpenAiCompatLogprobChoiceOpts): (input: {
14
+ system: string;
15
+ user: string;
16
+ letters: readonly string[];
17
+ }) => Promise<Record<string, number>>;
18
+ //# sourceMappingURL=logprob-choice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logprob-choice.d.ts","sourceRoot":"","sources":["../src/logprob-choice.ts"],"names":[],"mappings":"AAMA,OAAO,EAAuB,KAAK,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAElG,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8GAA8G;IAC9G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kHAAkH;IAClH,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAC5C;AAED,yHAAyH;AACzH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,6BAA6B,GAAG,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqB7L"}
@@ -0,0 +1,38 @@
1
+ // THE LOG-PROBABILITY CHOICE — spec 416 §4f. The cheapest judgment an LLM API can give: the options are single
2
+ // letters, the model emits ONE token, and the distribution is read from the token's log-probabilities — not from JSON the
3
+ // model writes. No tool schema, no reasoning, one output token.
4
+ //
5
+ // A host that does not return log-probabilities is refused by name (never read as a uniform or empty answer): the caller
6
+ // records a failed judgment and the comparison shows it.
7
+ import { usageOfOpenAiCompat } from './types.js';
8
+ /** Ask for one letter among `letters`; return each letter's log-probability as reported (absent ⇒ not among the top). */
9
+ export function createOpenAiCompatLogprobChoice(opts) {
10
+ const label = opts.label ?? 'openai-compat';
11
+ return async ({ system, user, letters }) => {
12
+ const res = await opts.client.chat.completions.create({
13
+ model: opts.model, max_tokens: 1, temperature: 0,
14
+ messages: [{ role: 'system', content: system }, { role: 'user', content: user }],
15
+ logprobs: true, top_logprobs: opts.topLogprobs ?? 20,
16
+ ...(opts.reasoningEffort ? { reasoning_effort: opts.reasoningEffort } : {}),
17
+ });
18
+ {
19
+ const u = usageOfOpenAiCompat(res.usage);
20
+ if (u)
21
+ opts.onUsage?.(u);
22
+ }
23
+ const first = res.choices?.[0]?.logprobs?.content?.[0];
24
+ if (!first)
25
+ throw new Error(`${label}(${opts.model}) returned no log-probabilities — this host or model does not support them`);
26
+ const want = new Set(letters);
27
+ const out = {};
28
+ for (const t of [first, ...(first.top_logprobs ?? [])]) {
29
+ const k = String(t.token ?? '').trim().toUpperCase();
30
+ if (want.has(k) && typeof t.logprob === 'number' && (out[k] === undefined || t.logprob > out[k]))
31
+ out[k] = t.logprob;
32
+ }
33
+ if (!Object.keys(out).length)
34
+ throw new Error(`${label}(${opts.model}) answered with no offered letter (first token "${String(first.token ?? '').slice(0, 20)}")`);
35
+ return out;
36
+ };
37
+ }
38
+ //# sourceMappingURL=logprob-choice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logprob-choice.js","sourceRoot":"","sources":["../src/logprob-choice.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAC/G,0HAA0H;AAC1H,gEAAgE;AAChE,EAAE;AACF,yHAAyH;AACzH,yDAAyD;AACzD,OAAO,EAAE,mBAAmB,EAAmD,MAAM,YAAY,CAAC;AAalG,yHAAyH;AACzH,MAAM,UAAU,+BAA+B,CAAC,IAAmC;IACjF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC;IAC5C,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QACzC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACpD,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;YAChD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAChF,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACpD,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,eAAwB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC,CAAC;QACZ,CAAC;YAAC,MAAM,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACvE,MAAM,KAAK,GAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAsJ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7M,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,4EAA4E,CAAC,CAAC;QAChI,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACvD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;gBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;QACxH,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,mDAAmD,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACnK,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;AACJ,CAAC"}
package/dist/planner.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import { type Planner } from '@agenticprimitives/orchestration';
2
- import type { OpenAiCompatLike } from './types.js';
2
+ import { type OpenAiCompatLike, type OpenAiCompatUsageV1 } from './types.js';
3
3
  export interface OpenAiCompatPlannerOpts {
4
+ /** Told what each call used, as the provider reported it (tokens — never an estimate). */
5
+ onUsage?: (u: OpenAiCompatUsageV1) => void;
4
6
  /** The structural client (real `openai` SDK client OR `createFetchOpenAiCompatClient`). */
5
7
  client: OpenAiCompatLike;
6
8
  /** Planning model, as the host names it (`llama-3.3-70b-versatile`, `openai/gpt-oss-120b`, …). REQUIRED. */
@@ -1 +1 @@
1
- {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,OAAO,EAMb,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,YAAY,CAAC;AAExE,MAAM,WAAW,uBAAuB;IACtC,2FAA2F;IAC3F,MAAM,EAAE,gBAAgB,CAAC;IACzB,4GAA4G;IAC5G,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;2GAEuG;IACvG,eAAe,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxD,+FAA+F;IAC/F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+FAA+F;IAC/F,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+BD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAalG;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAkChF"}
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,KAAK,OAAO,EAMb,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAuB,KAAK,gBAAgB,EAA4B,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE5H,MAAM,WAAW,uBAAuB;IACtC,0FAA0F;IAC1F,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC3C,2FAA2F;IAC3F,MAAM,EAAE,gBAAgB,CAAC;IACzB,4GAA4G;IAC5G,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;2GAEuG;IACvG,eAAe,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxD,+FAA+F;IAC/F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+FAA+F;IAC/F,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiCD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAalG;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAmChF"}
package/dist/planner.js CHANGED
@@ -2,7 +2,8 @@
2
2
  // Present the goal + the agent's exposed tools to the model; read back the chosen tool + args as a `Plan`.
3
3
  // Authority is NOT here — the chosen tool's call still rides the task delegation at the invoker (ADR-0041).
4
4
  // The model only decides WHICH tool; it never gains authority by being asked.
5
- import { OrchestrationError, toolNameMap, planStepFromToolArgs, } from '@agenticprimitives/orchestration';
5
+ import { OrchestrationError, toolNameMap, renderContinuation, planStepFromToolArgs, } from '@agenticprimitives/orchestration';
6
+ import { usageOfOpenAiCompat } from './types.js';
6
7
  const DEFAULT_SYSTEM = 'You are the planning component of an agent. Choose the single tool that best satisfies the user\'s goal, ' +
7
8
  'and provide its arguments. You may ONLY use the provided tools. Do not answer in prose — select a tool.';
8
9
  /** Map an orchestration `ToolSpec` to a chat-completions tool definition (object-root schema by default). */
@@ -23,7 +24,10 @@ function buildUserMessage(input) {
23
24
  lines.push(`Constraints: ${JSON.stringify(input.intent.constraints)}`);
24
25
  if (input.intent.context)
25
26
  lines.push(`Context: ${JSON.stringify(input.intent.context)}`);
26
- const failed = (input.observations ?? []).filter((o) => !o.ok);
27
+ // Spec 421 W1 — a CONTINUATION is shown what the reads returned (the one renderer the core owns).
28
+ if (input.continuation)
29
+ lines.push(renderContinuation(input.observations ?? []));
30
+ const failed = input.continuation ? [] : (input.observations ?? []).filter((o) => !o.ok);
27
31
  if (failed.length) {
28
32
  lines.push('Previous attempts failed — choose a different approach:');
29
33
  for (const o of failed)
@@ -77,6 +81,11 @@ export function createOpenAiCompatPlanner(opts) {
77
81
  tool_choice: 'required', // force a tool selection (no prose-only answer) — a request, not a guarantee
78
82
  ...(opts.reasoningEffort ? { reasoning_effort: opts.reasoningEffort } : {}),
79
83
  });
84
+ {
85
+ const u = usageOfOpenAiCompat(res.usage);
86
+ if (u)
87
+ opts.onUsage?.(u);
88
+ }
80
89
  const calls = res.choices?.[0]?.message?.tool_calls ?? [];
81
90
  const steps = calls
82
91
  .filter((c) => c && c.type === 'function' && typeof c.function?.name === 'string')
@@ -1 +1 @@
1
- {"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { OpenAiCompatLike } from './types.js';
1
+ import { type OpenAiCompatLike, type OpenAiCompatUsageV1 } from './types.js';
2
2
  export interface StructuredToolCallInput {
3
3
  system: string;
4
4
  messages: Array<{
@@ -15,6 +15,8 @@ export interface StructuredToolCallInput {
15
15
  maxTokens?: number;
16
16
  }
17
17
  export interface OpenAiCompatStructuredCallOpts {
18
+ /** Told what each call used, as the provider reported it (tokens — never an estimate). */
19
+ onUsage?: (u: OpenAiCompatUsageV1) => void;
18
20
  client: OpenAiCompatLike;
19
21
  /** The model, as the host names it. REQUIRED. */
20
22
  model: string;
@@ -26,6 +28,13 @@ export interface OpenAiCompatStructuredCallOpts {
26
28
  reasoningEffort?: 'minimal' | 'low' | 'medium' | 'high';
27
29
  /** The completion bound when a call names none. Default 1500. */
28
30
  maxTokens?: number;
31
+ /** Tokens ADDED to whichever bound applies, for a model that thinks inside it. A caller's `maxTokens` sizes the
32
+ * ANSWER (a judge's distribution is ~600); on a thinking model the same bound also has to hold the thinking, and
33
+ * when it cannot the model calls nothing — "answered in prose". Default 0. */
34
+ reasoningHeadroom?: number;
35
+ /** How the one tool is forced: `named` (the object form, default) or `required` (any tool — there is only one).
36
+ * Some hosts honour one form more reliably than the other; the result is checked the same way either way. */
37
+ toolChoice?: 'named' | 'required';
29
38
  }
30
39
  /**
31
40
  * Build the forced call. STRICTER than a permissive reading on purpose: a response with no tool call, or a
@@ -1 +1 @@
1
- {"version":3,"file":"structured-call.d.ts","sourceRoot":"","sources":["../src/structured-call.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE;iDAC6C;IAC7C,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,gBAAgB,CAAC;IACzB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;uGAEmG;IACnG,eAAe,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxD,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,8BAA8B,GACnC,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAqBtE"}
1
+ {"version":3,"file":"structured-call.d.ts","sourceRoot":"","sources":["../src/structured-call.ts"],"names":[],"mappings":"AAWA,OAAO,EAAuB,KAAK,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGlG,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE;iDAC6C;IAC7C,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,8BAA8B;IAC7C,0FAA0F;IAC1F,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC3C,MAAM,EAAE,gBAAgB,CAAC;IACzB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;uGAEmG;IACnG,eAAe,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxD,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;mFAE+E;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;kHAC8G;IAC9G,UAAU,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CACnC;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,8BAA8B,GACnC,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAsBtE"}
@@ -9,6 +9,7 @@
9
9
  // The return type is STRUCTURALLY the `StructuredCall` port in `@agenticprimitives/context`; this package
10
10
  // does not import that package (an adapter depends on the core it binds, nothing else).
11
11
  import { OrchestrationError, wireNameFor } from '@agenticprimitives/orchestration';
12
+ import { usageOfOpenAiCompat } from './types.js';
12
13
  import { parseToolArguments } from './planner.js';
13
14
  /**
14
15
  * Build the forced call. STRICTER than a permissive reading on purpose: a response with no tool call, or a
@@ -25,12 +26,17 @@ export function createOpenAiCompatStructuredCall(opts) {
25
26
  const wire = wireNameFor(tool.name);
26
27
  const res = await opts.client.chat.completions.create({
27
28
  model,
28
- max_tokens: maxTokens ?? opts.maxTokens ?? 1500,
29
+ max_tokens: (maxTokens ?? opts.maxTokens ?? 1500) + (opts.reasoningHeadroom ?? 0),
29
30
  messages: [{ role: 'system', content: system }, ...messages],
30
31
  tools: [{ type: 'function', function: { name: wire, description: tool.description, parameters: tool.input_schema } }],
31
- tool_choice: { type: 'function', function: { name: wire } },
32
+ tool_choice: opts.toolChoice === 'required' ? 'required' : { type: 'function', function: { name: wire } },
32
33
  ...(opts.reasoningEffort ? { reasoning_effort: opts.reasoningEffort } : {}),
33
34
  });
35
+ {
36
+ const u = usageOfOpenAiCompat(res.usage);
37
+ if (u)
38
+ opts.onUsage?.(u);
39
+ }
34
40
  const call = (res.choices?.[0]?.message?.tool_calls ?? []).find((c) => c && c.type === 'function');
35
41
  if (!call)
36
42
  throw new OrchestrationError('planner_failed', `${label}(${model}) answered in prose instead of calling "${tool.name}"`);
@@ -1 +1 @@
1
- {"version":3,"file":"structured-call.js","sourceRoot":"","sources":["../src/structured-call.ts"],"names":[],"mappings":"AAAA,6GAA6G;AAC7G,0GAA0G;AAC1G,yEAAyE;AACzE,EAAE;AACF,6GAA6G;AAC7G,2GAA2G;AAC3G,iCAAiC;AACjC,EAAE;AACF,0GAA0G;AAC1G,wFAAwF;AACxF,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAyBlD;;;;;GAKG;AACH,MAAM,UAAU,gCAAgC,CAC9C,IAAoC;IAEpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC;IAC5C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,4EAA4E,CAAC,CAAC;IAClH,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;QACrD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACpD,KAAK;YACL,UAAU,EAAE,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;YAC/C,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,QAAQ,CAAC;YAC5D,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACrH,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YAC3D,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QACnG,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,kBAAkB,CAAC,gBAAgB,EAAE,GAAG,KAAK,IAAI,KAAK,2CAA2C,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACpI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAChC,MAAM,IAAI,kBAAkB,CAAC,gBAAgB,EAAE,GAAG,KAAK,IAAI,KAAK,aAAa,IAAI,CAAC,QAAQ,CAAC,IAAI,gBAAgB,IAAI,CAAC,IAAI,eAAe,CAAC,CAAC;QAC3I,CAAC;QACD,OAAO,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC;IAC3E,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"structured-call.js","sourceRoot":"","sources":["../src/structured-call.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { OpenAiCompatUsageV1 } from './types.js';
2
+ export interface OpenAiCompatTextStreamOpts {
3
+ apiKey: string;
4
+ baseUrl: string;
5
+ model: string;
6
+ label?: string;
7
+ fetchImpl?: typeof fetch;
8
+ reasoningEffort?: 'none' | 'minimal' | 'low' | 'medium';
9
+ /** Tokens added to `max_tokens` for a reasoning model's thinking, which the host counts against it — the structured
10
+ * call's rule; without it the answer is cut where the thinking ran long. */
11
+ reasoningHeadroom?: number;
12
+ /** Called ONCE, with the stream's final usage (hosts repeat a cumulative usage on every chunk). */
13
+ onUsage?: (u: OpenAiCompatUsageV1) => void;
14
+ /** Overloaded host (502/503/504) before the first byte: the same request again, up to this many times. Default 2. */
15
+ retryOnOverloadAttempts?: number;
16
+ sleep?: (ms: number) => Promise<void>;
17
+ }
18
+ export type TextStreamCall = (input: {
19
+ system: string;
20
+ messages: Array<{
21
+ role: 'user' | 'assistant';
22
+ content: string;
23
+ }>;
24
+ maxTokens?: number;
25
+ onDelta: (delta: string, soFar: string) => void;
26
+ }) => Promise<string>;
27
+ export declare function createOpenAiCompatTextStream(opts: OpenAiCompatTextStreamOpts): TextStreamCall;
28
+ //# sourceMappingURL=text-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-stream.d.ts","sourceRoot":"","sources":["../src/text-stream.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAItD,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;IACxD;iFAC6E;IAC7E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mGAAmG;IACnG,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC3C,qHAAqH;IACrH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEnN,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,0BAA0B,GAAG,cAAc,CAwC7F"}
@@ -0,0 +1,67 @@
1
+ import { usageOfOpenAiCompat } from './types.js';
2
+ import { isOverloaded, overloadPauseMs } from './fetch-client.js';
3
+ export function createOpenAiCompatTextStream(opts) {
4
+ const base = opts.baseUrl.trim().replace(/\/+$/, '');
5
+ if (!base)
6
+ throw new Error('createOpenAiCompatTextStream: baseUrl is required');
7
+ const f = opts.fetchImpl ?? fetch;
8
+ const label = opts.label ?? 'openai-compat';
9
+ return async ({ system, messages, maxTokens, onDelta }) => {
10
+ const send = () => f(`${base}/chat/completions`, {
11
+ method: 'POST',
12
+ headers: { 'content-type': 'application/json', authorization: `Bearer ${opts.apiKey}` },
13
+ body: JSON.stringify({ model: opts.model, stream: true, stream_options: { include_usage: true }, max_tokens: (maxTokens ?? 1400) + (opts.reasoningHeadroom ?? 0), messages: [{ role: 'system', content: system }, ...messages], ...(opts.reasoningEffort ? { reasoning_effort: opts.reasoningEffort } : {}) }),
14
+ });
15
+ let resp = await send();
16
+ const sleep = opts.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
17
+ for (let n = 0; n < (opts.retryOnOverloadAttempts ?? 2) && isOverloaded(resp.status); n++) {
18
+ await resp.text().catch(() => '');
19
+ await sleep(overloadPauseMs(n));
20
+ resp = await send();
21
+ }
22
+ if (!resp.ok || !resp.body)
23
+ throw new Error(`${label}(${opts.model}) stream refused: HTTP ${resp.status} ${(await resp.text().catch(() => '')).slice(0, 200)}`);
24
+ const reader = resp.body.getReader();
25
+ const dec = new TextDecoder();
26
+ let buf = '';
27
+ let text = '';
28
+ let usage = null;
29
+ for (;;) {
30
+ const { value, done } = await reader.read();
31
+ if (done)
32
+ break;
33
+ buf += dec.decode(value, { stream: true });
34
+ let nl;
35
+ while ((nl = buf.indexOf('\n')) >= 0) {
36
+ const line = buf.slice(0, nl).trim();
37
+ buf = buf.slice(nl + 1);
38
+ if (!line.startsWith('data:'))
39
+ continue;
40
+ const data = line.slice(5).trim();
41
+ if (data === '[DONE]')
42
+ continue;
43
+ let chunk;
44
+ try {
45
+ chunk = JSON.parse(data);
46
+ }
47
+ catch {
48
+ continue;
49
+ }
50
+ const delta = chunk.choices?.[0]?.delta?.content;
51
+ if (typeof delta === 'string' && delta) {
52
+ text += delta;
53
+ onDelta(delta, text);
54
+ }
55
+ const u = usageOfOpenAiCompat(chunk.usage);
56
+ if (u)
57
+ usage = u; // cumulative: the last one is the stream's
58
+ }
59
+ }
60
+ if (usage)
61
+ opts.onUsage?.(usage);
62
+ if (!text.trim())
63
+ throw new Error(`${label}(${opts.model}) streamed no text`);
64
+ return text;
65
+ };
66
+ }
67
+ //# sourceMappingURL=text-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-stream.js","sourceRoot":"","sources":["../src/text-stream.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -64,6 +64,12 @@ export interface OpenAiCompatChatCompletion {
64
64
  prompt_tokens?: number;
65
65
  completion_tokens?: number;
66
66
  total_tokens?: number;
67
+ prompt_tokens_details?: {
68
+ cached_tokens?: number;
69
+ };
70
+ completion_tokens_details?: {
71
+ reasoning_tokens?: number;
72
+ };
67
73
  };
68
74
  }
69
75
  /** The structural client the adapter needs — satisfied by `new OpenAI()` OR `createFetchOpenAiCompatClient`. */
@@ -74,4 +80,12 @@ export interface OpenAiCompatLike {
74
80
  };
75
81
  };
76
82
  }
83
+ /** A provider-reported usage, in the substrate's shape (`@agenticprimitives/orchestration` ModelUsageV1). */
84
+ export interface OpenAiCompatUsageV1 {
85
+ tokensIn: number;
86
+ tokensOut: number;
87
+ cachedIn?: number;
88
+ reasoningOut?: number;
89
+ }
90
+ export declare function usageOfOpenAiCompat(u: OpenAiCompatChatCompletion['usage']): OpenAiCompatUsageV1 | undefined;
77
91
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,YAAY,EAAG,gDAAyD,CAAC;AACtF,eAAO,MAAM,cAAc,EAAG,YAAqB,CAAC;AACpD,eAAO,MAAM,QAAQ,EAAG,8CAAuD,CAAC;AAEhF,kGAAkG;AAClG,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,wDAAwD;QACxD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;CACH;AAED;wFACwF;AACxF,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAErH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;iEACiE;AACjE,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB;;uFAEmF;IACnF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,KAAK,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;kHAE8G;IAC9G,gBAAgB,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC1D;AAED,4GAA4G;AAC5G,MAAM,WAAW,oBAAoB;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,oDAAoD;AACpD,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,UAAU,CAAC,EAAE,oBAAoB,EAAE,CAAA;SAAE,CAAC;QACxF,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,CAAC,CAAC;IACH,KAAK,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvF;AAED,gHAAgH;AAChH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE;QACJ,WAAW,EAAE;YACX,MAAM,CAAC,MAAM,EAAE,4BAA4B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;SACnF,CAAC;KACH,CAAC;CACH"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,YAAY,EAAG,gDAAyD,CAAC;AACtF,eAAO,MAAM,cAAc,EAAG,YAAqB,CAAC;AACpD,eAAO,MAAM,QAAQ,EAAG,8CAAuD,CAAC;AAEhF,kGAAkG;AAClG,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,wDAAwD;QACxD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;CACH;AAED;wFACwF;AACxF,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAErH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;iEACiE;AACjE,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB;;uFAEmF;IACnF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,KAAK,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;kHAE8G;IAC9G,gBAAgB,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC1D;AAED,4GAA4G;AAC5G,MAAM,WAAW,oBAAoB;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,oDAAoD;AACpD,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,UAAU,CAAC,EAAE,oBAAoB,EAAE,CAAA;SAAE,CAAC;QACxF,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,CAAC,CAAC;IACH,KAAK,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,qBAAqB,CAAC,EAAE;YAAE,aAAa,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,yBAAyB,CAAC,EAAE;YAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CACtM;AAED,gHAAgH;AAChH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE;QACJ,WAAW,EAAE;YACX,MAAM,CAAC,MAAM,EAAE,4BAA4B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;SACnF,CAAC;KACH,CAAC;CACH;AAED,6GAA6G;AAC7G,MAAM,WAAW,mBAAmB;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE;AACtH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,0BAA0B,CAAC,OAAO,CAAC,GAAG,mBAAmB,GAAG,SAAS,CAI3G"}
package/dist/types.js CHANGED
@@ -11,4 +11,10 @@
11
11
  export const PACKAGE_NAME = '@agenticprimitives/orchestration-openai-compat';
12
12
  export const PACKAGE_STATUS = 'w1-adapter';
13
13
  export const SPEC_REF = 'packages/orchestration-openai-compat/spec.md';
14
+ export function usageOfOpenAiCompat(u) {
15
+ if (!u || (typeof u.prompt_tokens !== 'number' && typeof u.completion_tokens !== 'number'))
16
+ return undefined;
17
+ const cached = u.prompt_tokens_details?.cached_tokens, reasoning = u.completion_tokens_details?.reasoning_tokens;
18
+ return { tokensIn: u.prompt_tokens ?? 0, tokensOut: u.completion_tokens ?? 0, ...(typeof cached === 'number' && cached > 0 ? { cachedIn: cached } : {}), ...(typeof reasoning === 'number' && reasoning > 0 ? { reasoningOut: reasoning } : {}) };
19
+ }
14
20
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAC3G,6CAA6C;AAC7C,EAAE;AACF,kHAAkH;AAClH,4GAA4G;AAC5G,6GAA6G;AAC7G,8GAA8G;AAC9G,6GAA6G;AAC7G,0GAA0G;AAC1G,6FAA6F;AAE7F,MAAM,CAAC,MAAM,YAAY,GAAG,gDAAyD,CAAC;AACtF,MAAM,CAAC,MAAM,cAAc,GAAG,YAAqB,CAAC;AACpD,MAAM,CAAC,MAAM,QAAQ,GAAG,8CAAuD,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAC3G,6CAA6C;AAC7C,EAAE;AACF,kHAAkH;AAClH,4GAA4G;AAC5G,6GAA6G;AAC7G,8GAA8G;AAC9G,6GAA6G;AAC7G,0GAA0G;AAC1G,6FAA6F;AAE7F,MAAM,CAAC,MAAM,YAAY,GAAG,gDAAyD,CAAC;AACtF,MAAM,CAAC,MAAM,cAAc,GAAG,YAAqB,CAAC;AACpD,MAAM,CAAC,MAAM,QAAQ,GAAG,8CAAuD,CAAC;AAoEhF,MAAM,UAAU,mBAAmB,CAAC,CAAsC;IACxE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,iBAAiB,KAAK,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7G,MAAM,MAAM,GAAG,CAAC,CAAC,qBAAqB,EAAE,aAAa,EAAE,SAAS,GAAG,CAAC,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;IACjH,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,aAAa,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,iBAAiB,IAAI,CAAC,EAAE,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACpP,CAAC"}
package/package.json CHANGED
@@ -1,17 +1,21 @@
1
1
  {
2
2
  "name": "@agenticprimitives/orchestration-openai-compat",
3
- "version": "0.0.0-alpha.4",
3
+ "version": "0.0.0-alpha.6",
4
4
  "description": "OpenAI-compatible chat-completions binding for the @agenticprimitives/orchestration Planner / AnswerComposer ports (the in-repo adapter, chain-state-viem pattern). Vendor-neutral: the consumer supplies baseUrl + model (Groq, Ollama, OpenRouter, …). createOpenAiCompatPlanner turns a goal + exposed tools into a plan via tool calling, plus a composer, a forced single-tool structured call, and a dependency-free fetch client (Cloudflare-Worker friendly). The pure orchestration core stays vendor-free; authority is never here.",
5
+ "homepage": "https://agenticprimitives.dev",
6
+ "bugs": {
7
+ "url": "https://github.com/agentictrustlabs/agenticprimitives/issues"
8
+ },
9
+ "author": {
10
+ "name": "Agentic Trust Labs",
11
+ "url": "https://agenticprimitives.dev"
12
+ },
5
13
  "license": "MIT",
6
14
  "repository": {
7
15
  "type": "git",
8
16
  "url": "git+https://github.com/agentictrustlabs/agenticprimitives.git",
9
17
  "directory": "packages/orchestration-openai-compat"
10
18
  },
11
- "homepage": "https://github.com/agentictrustlabs/agenticprimitives/tree/master/packages/orchestration-openai-compat",
12
- "bugs": {
13
- "url": "https://github.com/agentictrustlabs/agenticprimitives/issues"
14
- },
15
19
  "type": "module",
16
20
  "main": "./dist/index.js",
17
21
  "types": "./dist/index.d.ts",
@@ -31,11 +35,11 @@
31
35
  "access": "public"
32
36
  },
33
37
  "peerDependencies": {
34
- "@agenticprimitives/orchestration": "0.0.0-alpha.4"
38
+ "@agenticprimitives/orchestration": "0.0.0-alpha.6"
35
39
  },
36
40
  "devDependencies": {
37
41
  "vitest": "^4.1.8",
38
- "@agenticprimitives/orchestration": "0.0.0-alpha.4"
42
+ "@agenticprimitives/orchestration": "0.0.0-alpha.6"
39
43
  },
40
44
  "keywords": [
41
45
  "agentic",
@@ -44,7 +48,12 @@
44
48
  "planner",
45
49
  "openai-compatible",
46
50
  "groq",
47
- "llm-adapter"
51
+ "llm-adapter",
52
+ "agentic-primitives",
53
+ "agenticprimitives",
54
+ "ai-agents",
55
+ "agent-authority",
56
+ "agentic-trust"
48
57
  ],
49
58
  "scripts": {
50
59
  "build": "tsc -p tsconfig.build.json",