@llm4ts/core 2.9.3 → 2.9.4

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.
@@ -1,7 +1,8 @@
1
1
  import * as Effect from "effect/Effect";
2
2
  import * as Schema from "effect/Schema";
3
+ import * as Stream from "effect/Stream";
3
4
  import { ProviderError } from "../Errors.ts";
4
- import { LlmChunk, type TokenUsage } from "../Models.ts";
5
+ import { LlmChunk, TokenUsage } from "../Models.ts";
5
6
  export type JsonValue = typeof Schema.Json.Type;
6
7
  export type JsonRecord = Readonly<Record<string, JsonValue>>;
7
8
  export declare const isJsonRecord: (value: JsonValue) => value is JsonRecord;
@@ -17,6 +18,15 @@ export declare const jsonText: (value: JsonValue) => string;
17
18
  export declare const sortedFlagArgs: (flags: Readonly<Record<string, string>>) => ReadonlyArray<string>;
18
19
  export declare const optionalModelArgs: (model: string | undefined) => ReadonlyArray<string>;
19
20
  export declare const toolEventChunk: (name: string, input: JsonValue | undefined) => LlmChunk;
21
+ /** Two usage reports as one: counts add up, and so do cache reads and costs when either has them. */
22
+ export declare const addTokenUsage: (sum: TokenUsage | undefined, next: TokenUsage) => TokenUsage;
23
+ /**
24
+ * For a harness that reports usage per model message or step (pi's
25
+ * `message_end`, opencode's `step_finish`): every usage chunk carries the
26
+ * running total instead of its own share. A reply is read as its last usage
27
+ * chunk, so without this an agent turn of thirty model calls counted as one.
28
+ */
29
+ export declare const cumulativeUsage: <E, R>(stream: Stream.Stream<LlmChunk, E, R>) => Stream.Stream<LlmChunk, E, R>;
20
30
  export declare const usageEventChunk: (model: string | undefined, usage: TokenUsage) => LlmChunk;
21
31
  /**
22
32
  * The message signatures of a coding agent's own loop breaker. Gemini CLI
@@ -1 +1 @@
1
- {"version":3,"file":"CliSupport.d.ts","sourceRoot":"","sources":["../../src/providers/CliSupport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,aAAa,EAAiB,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAGxD,MAAM,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAA;AAC/C,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;AAE5D,eAAO,MAAM,YAAY,GAAI,OAAO,SAAS,KAAG,KAAK,IAAI,UACa,CAAA;AAEtE,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,SAAS,GAAG,SAQxD,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,SAAS,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,SAAS,GAAG,SACb,CAAA;AAEtE,eAAO,MAAM,eAAe,GAAI,OAAO,SAAS,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,SAGrF,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,SAAS,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,SAGlF,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,SAAS,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,SAGrF,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC3B,OAAO,SAAS,GAAG,SAAS,EAC5B,MAAM,MAAM,KACX,OAAO,GAAG,SAGZ,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,SAAS,GAAG,SAAS,KAAG,aAAa,CAAC,SAAS,CAC7C,CAAA;AAEnC,eAAO,MAAM,iBAAiB,GAC5B,OAAO,SAAS,GAAG,SAAS,KAC3B,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAC4B,CAAA;AAEzE,eAAO,MAAM,QAAQ,GAAI,OAAO,SAAS,KAAG,MAAuC,CAAA;AAEnF,eAAO,MAAM,cAAc,GAAI,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAG,aAAa,CAAC,MAAM,CAGJ,CAAA;AAEzF,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,GAAG,SAAS,KAAG,aAAa,CAAC,MAAM,CACnC,CAAA;AAE/C,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,OAAO,SAAS,GAAG,SAAS,KAAG,QAQxE,CAAA;AAEJ,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,GAAG,SAAS,EAAE,OAAO,UAAU,KAAG,QAW3E,CAAA;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,MAAM,CAAuC,CAAA;AAE9F,eAAO,MAAM,qBAAqB,GAAI,SAAS,MAAM,KAAG,OAGvD,CAAA;AAED,eAAO,MAAM,sBAAsB,4cAajC,CAAA"}
1
+ {"version":3,"file":"CliSupport.d.ts","sourceRoot":"","sources":["../../src/providers/CliSupport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,aAAa,EAAiB,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGnD,MAAM,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAA;AAC/C,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;AAE5D,eAAO,MAAM,YAAY,GAAI,OAAO,SAAS,KAAG,KAAK,IAAI,UACa,CAAA;AAEtE,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,SAAS,GAAG,SAQxD,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,SAAS,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,SAAS,GAAG,SACb,CAAA;AAEtE,eAAO,MAAM,eAAe,GAAI,OAAO,SAAS,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,SAGrF,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,SAAS,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,SAGlF,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,SAAS,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,SAGrF,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC3B,OAAO,SAAS,GAAG,SAAS,EAC5B,MAAM,MAAM,KACX,OAAO,GAAG,SAGZ,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,SAAS,GAAG,SAAS,KAAG,aAAa,CAAC,SAAS,CAC7C,CAAA;AAEnC,eAAO,MAAM,iBAAiB,GAC5B,OAAO,SAAS,GAAG,SAAS,KAC3B,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAC4B,CAAA;AAEzE,eAAO,MAAM,QAAQ,GAAI,OAAO,SAAS,KAAG,MAAuC,CAAA;AAEnF,eAAO,MAAM,cAAc,GAAI,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAG,aAAa,CAAC,MAAM,CAGJ,CAAA;AAEzF,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,GAAG,SAAS,KAAG,aAAa,CAAC,MAAM,CACnC,CAAA;AAE/C,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,OAAO,SAAS,GAAG,SAAS,KAAG,QAQxE,CAAA;AAEJ,qGAAqG;AACrG,eAAO,MAAM,aAAa,GAAI,KAAK,UAAU,GAAG,SAAS,EAAE,MAAM,UAAU,KAAG,UAmB7E,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,CAAC,EAClC,QAAQ,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,KACpC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAe5B,CAAA;AAEH,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,GAAG,SAAS,EAAE,OAAO,UAAU,KAAG,QAW3E,CAAA;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,MAAM,CAAuC,CAAA;AAE9F,eAAO,MAAM,qBAAqB,GAAI,SAAS,MAAM,KAAG,OAGvD,CAAA;AAED,eAAO,MAAM,sBAAsB,4cAajC,CAAA"}
@@ -1,9 +1,11 @@
1
1
  import * as DateTime from "effect/DateTime";
2
2
  import * as Effect from "effect/Effect";
3
3
  import * as Option from "effect/Option";
4
+ import * as Ref from "effect/Ref";
4
5
  import * as Schema from "effect/Schema";
6
+ import * as Stream from "effect/Stream";
5
7
  import { ProviderError } from "../Errors.js";
6
- import { LlmChunk } from "../Models.js";
8
+ import { LlmChunk, TokenUsage } from "../Models.js";
7
9
  import { classifyUsageLimit } from "../UsageLimits.js";
8
10
  export const isJsonRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
9
11
  export const parseJsonLine = (line) => {
@@ -45,6 +47,37 @@ export const toolEventChunk = (name, input) => LlmChunk.make({
45
47
  tool_input: input === undefined ? "{}" : jsonText(input)
46
48
  }
47
49
  });
50
+ /** Two usage reports as one: counts add up, and so do cache reads and costs when either has them. */
51
+ export const addTokenUsage = (sum, next) => {
52
+ if (sum === undefined) {
53
+ return next;
54
+ }
55
+ const cached = sum.cached === undefined && next.cached === undefined
56
+ ? undefined
57
+ : (sum.cached ?? 0) + (next.cached ?? 0);
58
+ const costUsd = sum.costUsd === undefined && next.costUsd === undefined
59
+ ? undefined
60
+ : (sum.costUsd ?? 0) + (next.costUsd ?? 0);
61
+ return TokenUsage.make({
62
+ prompt: sum.prompt + next.prompt,
63
+ completion: sum.completion + next.completion,
64
+ total: sum.total + next.total,
65
+ ...(cached === undefined ? {} : { cached }),
66
+ ...(costUsd === undefined ? {} : { costUsd })
67
+ });
68
+ };
69
+ /**
70
+ * For a harness that reports usage per model message or step (pi's
71
+ * `message_end`, opencode's `step_finish`): every usage chunk carries the
72
+ * running total instead of its own share. A reply is read as its last usage
73
+ * chunk, so without this an agent turn of thirty model calls counted as one.
74
+ */
75
+ export const cumulativeUsage = (stream) => Stream.unwrap(Effect.map(Ref.make(undefined), (total) => stream.pipe(Stream.mapEffect((chunk) => {
76
+ const usage = chunk.usage;
77
+ return usage === undefined
78
+ ? Effect.succeed(chunk)
79
+ : Effect.map(Ref.updateAndGet(total, (sum) => addTokenUsage(sum, usage)), (sum) => (sum === undefined ? chunk : LlmChunk.make({ ...chunk, usage: sum })));
80
+ }))));
48
81
  export const usageEventChunk = (model, usage) => LlmChunk.make({
49
82
  delta: "",
50
83
  finishReason: "stop",
@@ -1 +1 @@
1
- {"version":3,"file":"CliSupport.js","sourceRoot":"","sources":["../../src/providers/CliSupport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CliSupport.js","sourceRoot":"","sources":["../../src/providers/CliSupport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,GAAG,MAAM,YAAY,CAAA;AACjC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,aAAa,EAAiB,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAKtD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAgB,EAAuB,EAAE,CACpE,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAEtE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAyB,EAAE;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO,MAAM,CAAC,cAAc,CAC1B,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CACxE,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAA4B,EAAE,IAAY,EAAyB,EAAE,CAC7F,KAAK,KAAK,SAAS,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AAEtE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAA4B,EAAE,IAAY,EAAsB,EAAE;IAChG,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AACtD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAA4B,EAAE,IAAY,EAAsB,EAAE;IAC7F,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AAC5F,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAA4B,EAAE,IAAY,EAAsB,EAAE;IAChG,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AAChF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,KAA4B,EAC5B,IAAY,EACS,EAAE;IACvB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACpC,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AACvD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAA4B,EAA4B,EAAE,CAClF,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;AAEnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,KAA4B,EACiB,EAAE,CAC/C,KAAK,KAAK,SAAS,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAEzE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAgB,EAAU,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI,CAAA;AAEnF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAuC,EAAyB,EAAE,CAC/F,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;KAClB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;KACpD,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;AAEzF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAyB,EAAyB,EAAE,CACpF,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;AAE/C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,KAA4B,EAAY,EAAE,CACrF,QAAQ,CAAC,IAAI,CAAC;IACZ,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE;QACR,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;KACzD;CACF,CAAC,CAAA;AAEJ,qGAAqG;AACrG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAA2B,EAAE,IAAgB,EAAc,EAAE;IACzF,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,MAAM,GACV,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QACnD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAA;IAC5C,MAAM,OAAO,GACX,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QACrD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAA;IAC9C,OAAO,UAAU,CAAC,IAAI,CAAC;QACrB,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;QAChC,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;QAC5C,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;QAC7B,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3C,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;KAC9C,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,MAAqC,EACN,EAAE,CACjC,MAAM,CAAC,MAAM,CACX,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAyB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAChE,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;IACzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;IACzB,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QACvB,CAAC,CAAC,MAAM,CAAC,GAAG,CACR,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAC3D,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAC/E,CAAA;AACP,CAAC,CAAC,CACH,CACF,CACF,CAAA;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAyB,EAAE,KAAiB,EAAY,EAAE,CACxF,QAAQ,CAAC,IAAI,CAAC;IACZ,KAAK,EAAE,EAAE;IACT,YAAY,EAAE,MAAM;IACpB,KAAK;IACL,QAAQ,EACN,KAAK,KAAK,SAAS;QACjB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACE,KAAK;SACN;CACR,CAAC,CAAA;AAEJ;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA0B,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAA;AAE9F,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAW,EAAE;IAChE,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;IACxC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;AAC3E,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,EAAE,CAC7C,0DAA0D,CAC3D,CAAC,QAAQ,CAAC,EACT,QAAgB,EAChB,cAAsB,EACtB,GAAW;IAEX,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAA;IAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,CAAA;IAC3F,OAAO,KAAK,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC;QAC5D,aAAa,CAAC,IAAI,CAAC;YACjB,OAAO,EAAE,GAAG,cAAc,KAAK,GAAG,EAAE;SACrC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"OpenCodeCliConnector.d.ts","sourceRoot":"","sources":["../../src/providers/OpenCodeCliConnector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAgB,QAAQ,EAAc,MAAM,cAAc,CAAA;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAajE,eAAO,MAAM,oBAAoB,GAAI,QAAQ,kBAAkB,KAAG,aAAa,CAAC,MAAM,CAIrF,CAAA;AAED,eAAO,MAAM,0BAA0B,GAAI,MAAM,MAAM,KAAG,aAAa,CAAC,QAAQ,CAkE/E,CAAA;AAED,eAAO,MAAM,wBAAwB,GACnC,QAAQ,kBAAkB,EAC1B,UAAU,oBAAoB,KAC7B,iBAmDF,CAAA"}
1
+ {"version":3,"file":"OpenCodeCliConnector.d.ts","sourceRoot":"","sources":["../../src/providers/OpenCodeCliConnector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAgB,QAAQ,EAAc,MAAM,cAAc,CAAA;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAcjE,eAAO,MAAM,oBAAoB,GAAI,QAAQ,kBAAkB,KAAG,aAAa,CAAC,MAAM,CAIrF,CAAA;AAED,eAAO,MAAM,0BAA0B,GAAI,MAAM,MAAM,KAAG,aAAa,CAAC,QAAQ,CAkE/E,CAAA;AAED,eAAO,MAAM,wBAAwB,GACnC,QAAQ,kBAAkB,EAC1B,UAAU,oBAAoB,KAC7B,iBAqDF,CAAA"}
@@ -2,7 +2,7 @@ import * as Effect from "effect/Effect";
2
2
  import * as Stream from "effect/Stream";
3
3
  import { makeCliConnector } from "../Connector.js";
4
4
  import { ConnectorIds, LlmChunk, TokenUsage } from "../Models.js";
5
- import { failClassifiedCliError, jsonField, jsonIntField, jsonStringField, optionalModelArgs, parseJsonLine, sortedFlagArgs, toolEventChunk, usageEventChunk } from "./CliSupport.js";
5
+ import { failClassifiedCliError, jsonField, jsonIntField, jsonStringField, optionalModelArgs, parseJsonLine, sortedFlagArgs, cumulativeUsage, toolEventChunk, usageEventChunk } from "./CliSupport.js";
6
6
  export const openCodeCliExtraArgs = (config) => [
7
7
  ...optionalModelArgs(config.model),
8
8
  ...(config.readOnly ? ["--agent", "plan"] : ["--auto"]),
@@ -86,7 +86,9 @@ export const makeOpenCodeCliConnector = (config, executor) => {
86
86
  });
87
87
  const completeStream = (prompt) => executor
88
88
  .runStreaming(["opencode", "run", "--format", "json", ...extraArgs, prompt], cwd, config.envVars)
89
- .pipe(Stream.flatMap((line) => Stream.fromIterable(parseOpenCodeCliStreamLine(line))), Stream.mapEffect((chunk) => {
89
+ .pipe(Stream.flatMap((line) => Stream.fromIterable(parseOpenCodeCliStreamLine(line))),
90
+ // opencode reports usage per step; a turn is all of them.
91
+ cumulativeUsage, Stream.mapEffect((chunk) => {
90
92
  const message = chunk.metadata.opencodeError;
91
93
  return message === undefined
92
94
  ? Effect.succeed(chunk)
@@ -1 +1 @@
1
- {"version":3,"file":"OpenCodeCliConnector.js","sourceRoot":"","sources":["../../src/providers/OpenCodeCliConnector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OpenCodeCliConnector.js","sourceRoot":"","sources":["../../src/providers/OpenCodeCliConnector.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PiConnector.d.ts","sourceRoot":"","sources":["../../src/providers/PiConnector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE/D,OAAO,EAAuC,QAAQ,EAAc,MAAM,cAAc,CAAA;AACxF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAcjE,eAAO,MAAM,WAAW,GAAI,QAAQ,kBAAkB,KAAG,aAAa,CAAC,MAAM,CAS5E,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,aAAa,CAAC,QAAQ,CAyEtE,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,QAAQ,kBAAkB,EAC1B,UAAU,oBAAoB,KAC7B,iBA4DF,CAAA"}
1
+ {"version":3,"file":"PiConnector.d.ts","sourceRoot":"","sources":["../../src/providers/PiConnector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE/D,OAAO,EAAuC,QAAQ,EAAc,MAAM,cAAc,CAAA;AACxF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAejE,eAAO,MAAM,WAAW,GAAI,QAAQ,kBAAkB,KAAG,aAAa,CAAC,MAAM,CAS5E,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,aAAa,CAAC,QAAQ,CA2EtE,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,QAAQ,kBAAkB,EAC1B,UAAU,oBAAoB,KAC7B,iBA8DF,CAAA"}
@@ -3,7 +3,7 @@ import * as Stream from "effect/Stream";
3
3
  import { makeCliConnector } from "../Connector.js";
4
4
  import { ProviderError } from "../Errors.js";
5
5
  import { ConnectorCapabilities, ConnectorIds, LlmChunk, TokenUsage } from "../Models.js";
6
- import { failClassifiedCliError, jsonBooleanField, jsonField, jsonIntField, jsonStringField, optionalModelArgs, parseJsonLine, sortedFlagArgs, toolEventChunk, usageEventChunk } from "./CliSupport.js";
6
+ import { cumulativeUsage, failClassifiedCliError, jsonBooleanField, jsonField, jsonIntField, jsonStringField, optionalModelArgs, parseJsonLine, sortedFlagArgs, toolEventChunk, usageEventChunk } from "./CliSupport.js";
7
7
  export const piExtraArgs = (config) => [
8
8
  ...optionalModelArgs(config.model),
9
9
  // `noTools` takes precedence over `readOnly`: `--no-tools` disables tool
@@ -51,11 +51,13 @@ export const parsePiStreamLine = (line) => {
51
51
  }
52
52
  const prompt = jsonIntField(usage, "input") ?? 0;
53
53
  const completion = jsonIntField(usage, "output") ?? 0;
54
+ const cached = jsonIntField(usage, "cacheRead");
54
55
  return [
55
56
  usageEventChunk(undefined, TokenUsage.make({
56
57
  prompt,
57
58
  completion,
58
- total: prompt + completion
59
+ total: prompt + completion,
60
+ ...(cached === undefined || cached === 0 ? {} : { cached })
59
61
  }))
60
62
  ];
61
63
  }
@@ -102,7 +104,9 @@ export const makePiConnector = (config, executor) => {
102
104
  });
103
105
  const completeStream = (prompt) => executor
104
106
  .runStreamingWithStdin(["pi", "-p", "--mode", "json", ...extraArgs], cwd, config.envVars, prompt)
105
- .pipe(Stream.flatMap((line) => Stream.fromIterable(parsePiStreamLine(line))), Stream.mapEffect((chunk) => {
107
+ .pipe(Stream.flatMap((line) => Stream.fromIterable(parsePiStreamLine(line))),
108
+ // pi reports usage per assistant message; a turn is all of them.
109
+ cumulativeUsage, Stream.mapEffect((chunk) => {
106
110
  const message = chunk.metadata.piError;
107
111
  return message === undefined
108
112
  ? Effect.succeed(chunk)
@@ -1 +1 @@
1
- {"version":3,"file":"PiConnector.js","sourceRoot":"","sources":["../../src/providers/PiConnector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PiConnector.js","sourceRoot":"","sources":["../../src/providers/PiConnector.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llm4ts/core",
3
- "version": "2.9.3",
3
+ "version": "2.9.4",
4
4
  "description": "Effect-native LLM contracts, providers, tools, evaluation, and observability",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,9 +1,11 @@
1
1
  import * as DateTime from "effect/DateTime"
2
2
  import * as Effect from "effect/Effect"
3
3
  import * as Option from "effect/Option"
4
+ import * as Ref from "effect/Ref"
4
5
  import * as Schema from "effect/Schema"
6
+ import * as Stream from "effect/Stream"
5
7
  import { ProviderError, type LlmError } from "../Errors.ts"
6
- import { LlmChunk, type TokenUsage } from "../Models.ts"
8
+ import { LlmChunk, TokenUsage } from "../Models.ts"
7
9
  import { classifyUsageLimit } from "../UsageLimits.ts"
8
10
 
9
11
  export type JsonValue = typeof Schema.Json.Type
@@ -76,6 +78,53 @@ export const toolEventChunk = (name: string, input: JsonValue | undefined): LlmC
76
78
  }
77
79
  })
78
80
 
81
+ /** Two usage reports as one: counts add up, and so do cache reads and costs when either has them. */
82
+ export const addTokenUsage = (sum: TokenUsage | undefined, next: TokenUsage): TokenUsage => {
83
+ if (sum === undefined) {
84
+ return next
85
+ }
86
+ const cached =
87
+ sum.cached === undefined && next.cached === undefined
88
+ ? undefined
89
+ : (sum.cached ?? 0) + (next.cached ?? 0)
90
+ const costUsd =
91
+ sum.costUsd === undefined && next.costUsd === undefined
92
+ ? undefined
93
+ : (sum.costUsd ?? 0) + (next.costUsd ?? 0)
94
+ return TokenUsage.make({
95
+ prompt: sum.prompt + next.prompt,
96
+ completion: sum.completion + next.completion,
97
+ total: sum.total + next.total,
98
+ ...(cached === undefined ? {} : { cached }),
99
+ ...(costUsd === undefined ? {} : { costUsd })
100
+ })
101
+ }
102
+
103
+ /**
104
+ * For a harness that reports usage per model message or step (pi's
105
+ * `message_end`, opencode's `step_finish`): every usage chunk carries the
106
+ * running total instead of its own share. A reply is read as its last usage
107
+ * chunk, so without this an agent turn of thirty model calls counted as one.
108
+ */
109
+ export const cumulativeUsage = <E, R>(
110
+ stream: Stream.Stream<LlmChunk, E, R>
111
+ ): Stream.Stream<LlmChunk, E, R> =>
112
+ Stream.unwrap(
113
+ Effect.map(Ref.make<TokenUsage | undefined>(undefined), (total) =>
114
+ stream.pipe(
115
+ Stream.mapEffect((chunk) => {
116
+ const usage = chunk.usage
117
+ return usage === undefined
118
+ ? Effect.succeed(chunk)
119
+ : Effect.map(
120
+ Ref.updateAndGet(total, (sum) => addTokenUsage(sum, usage)),
121
+ (sum) => (sum === undefined ? chunk : LlmChunk.make({ ...chunk, usage: sum }))
122
+ )
123
+ })
124
+ )
125
+ )
126
+ )
127
+
79
128
  export const usageEventChunk = (model: string | undefined, usage: TokenUsage): LlmChunk =>
80
129
  LlmChunk.make({
81
130
  delta: "",
@@ -12,6 +12,7 @@ import {
12
12
  optionalModelArgs,
13
13
  parseJsonLine,
14
14
  sortedFlagArgs,
15
+ cumulativeUsage,
15
16
  toolEventChunk,
16
17
  usageEventChunk
17
18
  } from "./CliSupport.ts"
@@ -127,6 +128,8 @@ export const makeOpenCodeCliConnector = (
127
128
  )
128
129
  .pipe(
129
130
  Stream.flatMap((line) => Stream.fromIterable(parseOpenCodeCliStreamLine(line))),
131
+ // opencode reports usage per step; a turn is all of them.
132
+ cumulativeUsage,
130
133
  Stream.mapEffect((chunk) => {
131
134
  const message = chunk.metadata.opencodeError
132
135
  return message === undefined
@@ -6,6 +6,7 @@ import { ProviderError } from "../Errors.ts"
6
6
  import { ConnectorCapabilities, ConnectorIds, LlmChunk, TokenUsage } from "../Models.ts"
7
7
  import type { ProcessExecutorShape } from "../ProcessExecutor.ts"
8
8
  import {
9
+ cumulativeUsage,
9
10
  failClassifiedCliError,
10
11
  jsonBooleanField,
11
12
  jsonField,
@@ -68,13 +69,15 @@ export const parsePiStreamLine = (line: string): ReadonlyArray<LlmChunk> => {
68
69
  }
69
70
  const prompt = jsonIntField(usage, "input") ?? 0
70
71
  const completion = jsonIntField(usage, "output") ?? 0
72
+ const cached = jsonIntField(usage, "cacheRead")
71
73
  return [
72
74
  usageEventChunk(
73
75
  undefined,
74
76
  TokenUsage.make({
75
77
  prompt,
76
78
  completion,
77
- total: prompt + completion
79
+ total: prompt + completion,
80
+ ...(cached === undefined || cached === 0 ? {} : { cached })
78
81
  })
79
82
  )
80
83
  ]
@@ -143,6 +146,8 @@ export const makePiConnector = (
143
146
  )
144
147
  .pipe(
145
148
  Stream.flatMap((line) => Stream.fromIterable(parsePiStreamLine(line))),
149
+ // pi reports usage per assistant message; a turn is all of them.
150
+ cumulativeUsage,
146
151
  Stream.mapEffect((chunk) => {
147
152
  const message = chunk.metadata.piError
148
153
  return message === undefined