@usine/agents 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -30
- package/dist/child-host/child-host.d.ts +60 -0
- package/dist/child-host/child-host.d.ts.map +1 -0
- package/dist/child-host/child-host.js +84 -0
- package/dist/child-host/child-host.js.map +1 -0
- package/dist/child-host/command.d.ts +11 -0
- package/dist/child-host/command.d.ts.map +1 -0
- package/dist/child-host/command.js +26 -0
- package/dist/child-host/command.js.map +1 -0
- package/dist/pi/authentication.d.ts +11 -2
- package/dist/pi/authentication.d.ts.map +1 -1
- package/dist/pi/authentication.js +15 -2
- package/dist/pi/authentication.js.map +1 -1
- package/dist/pi/children.d.ts +1 -4
- package/dist/pi/children.d.ts.map +1 -1
- package/dist/pi/children.js +1 -4
- package/dist/pi/children.js.map +1 -1
- package/dist/pi/claude.d.ts +8 -9
- package/dist/pi/claude.d.ts.map +1 -1
- package/dist/pi/claude.js +366 -50
- package/dist/pi/claude.js.map +1 -1
- package/dist/pi/codex/account.d.ts +3 -3
- package/dist/pi/codex/account.d.ts.map +1 -1
- package/dist/pi/codex/account.js +5 -5
- package/dist/pi/codex/account.js.map +1 -1
- package/dist/pi/codex/app-server.d.ts +19 -7
- package/dist/pi/codex/app-server.d.ts.map +1 -1
- package/dist/pi/codex/app-server.js +41 -36
- package/dist/pi/codex/app-server.js.map +1 -1
- package/dist/pi/codex/codec.d.ts +35 -13
- package/dist/pi/codex/codec.d.ts.map +1 -1
- package/dist/pi/codex/codec.js +42 -15
- package/dist/pi/codex/codec.js.map +1 -1
- package/dist/pi/codex/codex.d.ts +0 -1
- package/dist/pi/codex/codex.d.ts.map +1 -1
- package/dist/pi/codex/codex.js +75 -14
- package/dist/pi/codex/codex.js.map +1 -1
- package/dist/pi/conversation.d.ts +29 -12
- package/dist/pi/conversation.d.ts.map +1 -1
- package/dist/pi/conversation.js +54 -18
- package/dist/pi/conversation.js.map +1 -1
- package/dist/pi/pi.d.ts +1 -4
- package/dist/pi/pi.d.ts.map +1 -1
- package/dist/pi/pi.js +24 -175
- package/dist/pi/pi.js.map +1 -1
- package/dist/pi/sdk.d.ts +11 -15
- package/dist/pi/sdk.d.ts.map +1 -1
- package/dist/pi/sdk.js +35 -53
- package/dist/pi/sdk.js.map +1 -1
- package/dist/pi/session.d.ts +13 -14
- package/dist/pi/session.d.ts.map +1 -1
- package/dist/pi/session.js +63 -24
- package/dist/pi/session.js.map +1 -1
- package/dist/pi/turns.d.ts +7 -7
- package/dist/pi/turns.d.ts.map +1 -1
- package/dist/pi/turns.js +22 -9
- package/dist/pi/turns.js.map +1 -1
- package/dist/pi/usage.d.ts +29 -15
- package/dist/pi/usage.d.ts.map +1 -1
- package/dist/pi/usage.js +48 -24
- package/dist/pi/usage.js.map +1 -1
- package/dist/preflight/command.d.ts +16 -3
- package/dist/preflight/command.d.ts.map +1 -1
- package/dist/preflight/command.js +30 -17
- package/dist/preflight/command.js.map +1 -1
- package/dist/preflight/preflight.d.ts +10 -5
- package/dist/preflight/preflight.d.ts.map +1 -1
- package/dist/preflight/preflight.js +52 -25
- package/dist/preflight/preflight.js.map +1 -1
- package/dist/prompt.d.ts +12 -9
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +33 -4
- package/dist/prompt.js.map +1 -1
- package/dist/protocol/codex.d.ts +4 -7
- package/dist/protocol/codex.d.ts.map +1 -1
- package/dist/protocol/codex.js +1 -1
- package/dist/protocol/codex.js.map +1 -1
- package/dist/runtime.d.ts +100 -55
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +108 -27
- package/dist/runtime.js.map +1 -1
- package/package.json +22 -10
- package/dist/pi/live.d.ts +0 -4
- package/dist/pi/live.d.ts.map +0 -1
- package/dist/pi/live.js +0 -11
- package/dist/pi/live.js.map +0 -1
- package/dist/pi/subagents.d.ts +0 -29
- package/dist/pi/subagents.d.ts.map +0 -1
- package/dist/pi/subagents.js +0 -120
- package/dist/pi/subagents.js.map +0 -1
- package/dist/pi/thinking.d.ts +0 -8
- package/dist/pi/thinking.d.ts.map +0 -1
- package/dist/pi/thinking.js +0 -15
- package/dist/pi/thinking.js.map +0 -1
package/dist/pi/session.d.ts
CHANGED
|
@@ -1,42 +1,41 @@
|
|
|
1
|
-
import { AgentSession, AgentSessionEvent, AgentSessionId, SessionFinished, SessionTokensUpdated, TextOutput, ToolFinished, ToolStarted } from "@usine/core/agent/session";
|
|
2
|
-
import { Cause, Deferred, Effect, Queue } from "effect";
|
|
1
|
+
import { AgentSession, AgentSessionEvent, AgentSessionId, ProviderRecovered, ProviderRetrying, SessionFinished, SessionTokensUpdated, TextOutput, ToolFinished, ToolStarted } from "@usine/core/agent/session";
|
|
2
|
+
import { Cause, Deferred, Effect, Option, Queue } from "effect";
|
|
3
3
|
import { type AgentSessionError, SessionResult } from "../runtime.ts";
|
|
4
4
|
import type { PiMessage, PiSession } from "./sdk.ts";
|
|
5
5
|
export interface SessionChannelOptions {
|
|
6
|
-
/**
|
|
6
|
+
/** The adapter name in log lines. */
|
|
7
7
|
readonly label: string;
|
|
8
8
|
readonly sessionId: AgentSessionId;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* on that transition.
|
|
11
|
+
* The state of one session: an event queue, a result, and a latch that allows one terminal
|
|
12
|
+
* transition. Cleanups registered with `onTerminal` run on that transition.
|
|
14
13
|
*/
|
|
15
14
|
export interface SessionChannel {
|
|
16
15
|
readonly events: Queue.Queue<AgentSessionEvent, AgentSessionError | Cause.Done>;
|
|
17
16
|
readonly result: Deferred.Deferred<SessionResult, AgentSessionError>;
|
|
18
17
|
readonly isTerminal: Effect.Effect<boolean>;
|
|
19
18
|
readonly onTerminal: (cleanup: () => void) => void;
|
|
20
|
-
/** Queues
|
|
19
|
+
/** Queues an event; after the terminal transition, logs and drops it. */
|
|
21
20
|
readonly emit: (event: AgentSessionEvent) => Effect.Effect<void>;
|
|
22
21
|
readonly fail: (error: AgentSessionError) => Effect.Effect<void>;
|
|
23
22
|
readonly finish: (session: AgentSession, message: string) => Effect.Effect<void>;
|
|
24
23
|
}
|
|
25
24
|
export declare const sessionChannel: (options: SessionChannelOptions) => Effect.Effect<{
|
|
26
|
-
events: Queue.Queue<import("@usine/core/agent/session").PoolRateLimitsUpdated | SessionFinished | import("@usine/core/agent/session").SessionIdle | import("@usine/core/agent/session").SessionResumed | import("@usine/core/agent/session").SessionStarted | SessionTokensUpdated | TextOutput | ToolFinished | ToolStarted, import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | Cause.Done<void> | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError>;
|
|
27
|
-
result: Deferred.Deferred<SessionResult, import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError>;
|
|
25
|
+
events: Queue.Queue<import("@usine/core/agent/session").PoolRateLimitsUpdated | ProviderRecovered | ProviderRetrying | SessionFinished | import("@usine/core/agent/session").SessionIdle | import("@usine/core/agent/session").SessionResumed | import("@usine/core/agent/session").SessionStarted | SessionTokensUpdated | TextOutput | ToolFinished | ToolStarted, import("../runtime.ts").AgentBlockedError | import("../runtime.ts").AgentQuestionError | import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | Cause.Done<void> | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError>;
|
|
26
|
+
result: Deferred.Deferred<SessionResult, import("../runtime.ts").AgentBlockedError | import("../runtime.ts").AgentQuestionError | import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError>;
|
|
28
27
|
isTerminal: Effect.Effect<boolean, never, never>;
|
|
29
28
|
onTerminal: (cleanup: () => void) => void;
|
|
30
29
|
emit: (event: AgentSessionEvent) => Effect.Effect<void, never, never>;
|
|
31
|
-
fail: (error: import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError) => Effect.Effect<void, never, never>;
|
|
30
|
+
fail: (error: import("../runtime.ts").AgentBlockedError | import("../runtime.ts").AgentQuestionError | import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError) => Effect.Effect<void, never, never>;
|
|
32
31
|
finish: (session: import("@usine/core/agent/session").ChildSession | import("@usine/core/agent/session").ParentSession, message: string) => Effect.Effect<void, never, never>;
|
|
33
32
|
}, never, never>;
|
|
33
|
+
/** Returns the text of a user message as Pi compares it with its queued messages, or `None` for other messages. */
|
|
34
|
+
export declare const piUserMessageText: (message: PiMessage) => Option.Option<string>;
|
|
34
35
|
export declare const lastPiMessageText: (messages: ReadonlyArray<PiMessage>) => string | undefined;
|
|
35
36
|
/**
|
|
36
|
-
* Subscribes
|
|
37
|
-
*
|
|
38
|
-
* the prompt's resolution; operational events with no normalized shape (retry
|
|
39
|
-
* backoffs, compactions) are logged so a silent wait stays explainable.
|
|
37
|
+
* Subscribes to `piSession` and queues normalized events synchronously, so none arrive after the
|
|
38
|
+
* prompt resolves. Provider retries are counted per turn and reset on `agent_settled`.
|
|
40
39
|
*/
|
|
41
40
|
export declare const subscribePiSession: (piSession: PiSession, session: AgentSession, channel: SessionChannel) => Effect.Effect<{
|
|
42
41
|
lastText: () => string | undefined;
|
package/dist/pi/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,oBAAoB,EAEpB,UAAU,EACV,YAAY,EACZ,WAAW,EACZ,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EAEjB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EAEpB,UAAU,EACV,YAAY,EACZ,WAAW,EACZ,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAe,MAAM,QAAQ,CAAC;AAE7E,OAAO,EAAE,KAAK,iBAAiB,EAAmB,aAAa,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAkB,MAAM,UAAU,CAAC;AAErE,MAAM,WAAW,qBAAqB;IACpC,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAChF,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IACrE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACnD,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjE,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjE,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CAClF;AAED,eAAO,MAAM,cAAc;;;;0BAyDD,MAAM,IAAI;kBA9Cb,iBAAiB;;;gBAqDtC,CAAC;AA8CH,mHAAmH;AACnH,eAAO,MAAM,iBAAiB,YAAa,SAAS,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAS1E,CAAC;AAEF,eAAO,MAAM,iBAAiB,aAAc,aAAa,CAAC,SAAS,CAAC,KAAG,MAAM,GAAG,SAQ/E,CAAC;AA8BF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,cAClB,SAAS,WACX,YAAY,WACZ,cAAc;;;gBAyFrB,CAAC"}
|
package/dist/pi/session.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AgentSession, AgentSessionEvent, AgentSessionId, SessionFinished, SessionTokensUpdated, TokenCount, TextOutput, ToolFinished, ToolStarted, } from "@usine/core/agent/session";
|
|
1
|
+
import { AgentSession, AgentSessionEvent, AgentSessionId, ProviderRecovered, ProviderRetries, ProviderRetrying, SessionFinished, SessionTokensUpdated, TokenCount, TextOutput, ToolFinished, ToolStarted, } from "@usine/core/agent/session";
|
|
2
2
|
import { Cause, Deferred, Effect, Option, Queue, Ref, Schema } from "effect";
|
|
3
|
-
import {
|
|
4
|
-
import { SessionResult } from "../runtime.js";
|
|
3
|
+
import { addUsage, piMessageUsage } from "./usage.js";
|
|
4
|
+
import { reportedOutcome, SessionResult } from "../runtime.js";
|
|
5
5
|
export const sessionChannel = Effect.fn("SessionChannel.make")(function* (options) {
|
|
6
6
|
const events = yield* Queue.make();
|
|
7
7
|
const result = yield* Deferred.make();
|
|
@@ -18,6 +18,7 @@ export const sessionChannel = Effect.fn("SessionChannel.make")(function* (option
|
|
|
18
18
|
sessionId: options.sessionId,
|
|
19
19
|
})));
|
|
20
20
|
const fail = Effect.fn("SessionChannel.fail")(function* (error) {
|
|
21
|
+
yield* Effect.annotateCurrentSpan({ sessionId: options.sessionId });
|
|
21
22
|
if (yield* Ref.getAndSet(terminal, true))
|
|
22
23
|
return;
|
|
23
24
|
yield* Effect.logError(`${options.label} failed`, {
|
|
@@ -30,6 +31,10 @@ export const sessionChannel = Effect.fn("SessionChannel.make")(function* (option
|
|
|
30
31
|
yield* runCleanups;
|
|
31
32
|
});
|
|
32
33
|
const finish = Effect.fn("SessionChannel.finish")(function* (session, message) {
|
|
34
|
+
yield* Effect.annotateCurrentSpan({ sessionId: session.id });
|
|
35
|
+
const own = reportedOutcome(Option.some(session.id), message);
|
|
36
|
+
if (Option.isSome(own))
|
|
37
|
+
return yield* fail(own.value);
|
|
33
38
|
if (yield* Ref.getAndSet(terminal, true))
|
|
34
39
|
return;
|
|
35
40
|
yield* Queue.offer(events, new SessionFinished({ session }));
|
|
@@ -89,6 +94,21 @@ const messageText = (message) => {
|
|
|
89
94
|
.trim();
|
|
90
95
|
return text || undefined;
|
|
91
96
|
};
|
|
97
|
+
const PiUserMessage = Schema.Struct({
|
|
98
|
+
role: Schema.Literal("user"),
|
|
99
|
+
content: Schema.Union([Schema.String, Schema.Array(Schema.Json)]),
|
|
100
|
+
});
|
|
101
|
+
/** Returns the text of a user message as Pi compares it with its queued messages, or `None` for other messages. */
|
|
102
|
+
export const piUserMessageText = (message) => {
|
|
103
|
+
if (!Schema.is(PiUserMessage)(message))
|
|
104
|
+
return Option.none();
|
|
105
|
+
if (Schema.is(Schema.String)(message.content))
|
|
106
|
+
return Option.some(message.content);
|
|
107
|
+
return Option.some(message.content
|
|
108
|
+
.filter(Schema.is(PiTextBlock))
|
|
109
|
+
.map(({ text }) => text)
|
|
110
|
+
.join(""));
|
|
111
|
+
};
|
|
92
112
|
export const lastPiMessageText = (messages) => {
|
|
93
113
|
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
94
114
|
const message = messages[index];
|
|
@@ -125,40 +145,59 @@ const sessionEventFrom = (event, session) => {
|
|
|
125
145
|
return undefined;
|
|
126
146
|
};
|
|
127
147
|
/**
|
|
128
|
-
* Subscribes
|
|
129
|
-
*
|
|
130
|
-
* the prompt's resolution; operational events with no normalized shape (retry
|
|
131
|
-
* backoffs, compactions) are logged so a silent wait stays explainable.
|
|
148
|
+
* Subscribes to `piSession` and queues normalized events synchronously, so none arrive after the
|
|
149
|
+
* prompt resolves. Provider retries are counted per turn and reset on `agent_settled`.
|
|
132
150
|
*/
|
|
133
151
|
export const subscribePiSession = (piSession, session, channel) => Effect.gen(function* () {
|
|
134
152
|
const context = yield* Effect.context();
|
|
135
153
|
const log = Effect.runForkWith(context);
|
|
136
154
|
let lastText;
|
|
137
|
-
let
|
|
155
|
+
let total = { totalTokens: TokenCount.make(0), costUsd: Option.none() };
|
|
156
|
+
// Provider retries reported in the current turn, and whether the last retry is unresolved.
|
|
157
|
+
let retries = 0;
|
|
158
|
+
let retrying = false;
|
|
159
|
+
const offer = (sessionEvent) => {
|
|
160
|
+
if (!Queue.offerUnsafe(channel.events, sessionEvent)) {
|
|
161
|
+
log(Effect.logWarning("Dropped a Pi session event after the terminal transition", {
|
|
162
|
+
event: sessionEvent._tag,
|
|
163
|
+
sessionId: session.id,
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
};
|
|
138
167
|
const unsubscribe = piSession.subscribe((event) => {
|
|
139
168
|
if (event.type === "message_end") {
|
|
140
|
-
const usage =
|
|
169
|
+
const usage = piMessageUsage(event.message);
|
|
141
170
|
if (Option.isSome(usage)) {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
log(Effect.logWarning("Dropped Pi usage after the terminal transition", {
|
|
145
|
-
sessionId: session.id,
|
|
146
|
-
}));
|
|
147
|
-
}
|
|
171
|
+
total = addUsage(total, usage.value);
|
|
172
|
+
offer(new SessionTokensUpdated({ session, ...total }));
|
|
148
173
|
}
|
|
149
174
|
}
|
|
150
175
|
if (event.type === "auto_retry_start") {
|
|
151
|
-
|
|
176
|
+
retries += 1;
|
|
177
|
+
retrying = true;
|
|
178
|
+
const message = event.errorMessage || "Unknown error";
|
|
179
|
+
log(Effect.logWarning("Pi session cannot reach its provider and will retry", {
|
|
152
180
|
attempt: event.attempt,
|
|
153
181
|
delayMillis: event.delayMs,
|
|
154
|
-
errorMessage: event.errorMessage,
|
|
155
182
|
maxAttempts: event.maxAttempts,
|
|
183
|
+
message,
|
|
184
|
+
retries,
|
|
156
185
|
sessionId: session.id,
|
|
157
186
|
}));
|
|
187
|
+
offer(new ProviderRetrying({ session, message, retries: ProviderRetries.make(retries) }));
|
|
158
188
|
return;
|
|
159
189
|
}
|
|
160
190
|
if (event.type === "auto_retry_end") {
|
|
161
|
-
|
|
191
|
+
if (event.success && retrying) {
|
|
192
|
+
retrying = false;
|
|
193
|
+
log(Effect.logInfo("Pi session reached its provider again", {
|
|
194
|
+
retries,
|
|
195
|
+
sessionId: session.id,
|
|
196
|
+
}));
|
|
197
|
+
offer(new ProviderRecovered({ session, retries: ProviderRetries.make(retries) }));
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
log(Effect.logInfo("Pi session stopped retrying its provider", {
|
|
162
201
|
attempt: event.attempt,
|
|
163
202
|
finalError: event.finalError,
|
|
164
203
|
sessionId: session.id,
|
|
@@ -166,6 +205,11 @@ export const subscribePiSession = (piSession, session, channel) => Effect.gen(fu
|
|
|
166
205
|
}));
|
|
167
206
|
return;
|
|
168
207
|
}
|
|
208
|
+
if (event.type === "agent_settled") {
|
|
209
|
+
retries = 0;
|
|
210
|
+
retrying = false;
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
169
213
|
if (event.type === "compaction_start" || event.type === "compaction_end") {
|
|
170
214
|
log(Effect.logInfo("Pi session context compaction", {
|
|
171
215
|
phase: event.type,
|
|
@@ -179,12 +223,7 @@ export const subscribePiSession = (piSession, session, channel) => Effect.gen(fu
|
|
|
179
223
|
return;
|
|
180
224
|
if (sessionEvent._tag === "TextOutput")
|
|
181
225
|
lastText = sessionEvent.text;
|
|
182
|
-
|
|
183
|
-
log(Effect.logWarning("Dropped a Pi session event after the terminal transition", {
|
|
184
|
-
event: sessionEvent._tag,
|
|
185
|
-
sessionId: session.id,
|
|
186
|
-
}));
|
|
187
|
-
}
|
|
226
|
+
offer(sessionEvent);
|
|
188
227
|
});
|
|
189
228
|
channel.onTerminal(unsubscribe);
|
|
190
229
|
return { lastText: () => lastText, unsubscribe };
|
package/dist/pi/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,WAAW,GACZ,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"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"}
|
package/dist/pi/turns.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ChildSession } from "@usine/core/agent/session";
|
|
2
2
|
import { Effect } from "effect";
|
|
3
3
|
import { type AgentSessionError } from "../runtime.ts";
|
|
4
4
|
import type { PiSession } from "./sdk.ts";
|
|
5
5
|
import { type SessionChannel } from "./session.ts";
|
|
6
|
-
/**
|
|
6
|
+
/** Creates a gate that blocks Pi tool calls and provider requests at their next boundary while an operator pause is active. */
|
|
7
7
|
export declare const piPauseGate: Effect.Effect<{
|
|
8
8
|
set: (next: Effect.Effect<void>) => void;
|
|
9
9
|
extension: {
|
|
@@ -11,9 +11,9 @@ export declare const piPauseGate: Effect.Effect<{
|
|
|
11
11
|
factory: (pi: import("@earendil-works/pi-coding-agent").ExtensionAPI) => void;
|
|
12
12
|
};
|
|
13
13
|
}, never, import("effect/Scope").Scope>;
|
|
14
|
-
/** Runs successive Pi turns in one SDK session
|
|
14
|
+
/** Runs successive Pi turns in one SDK session; the conversation decides when the session completes. */
|
|
15
15
|
export declare const piTurns: (options: {
|
|
16
|
-
readonly session:
|
|
16
|
+
readonly session: ChildSession;
|
|
17
17
|
readonly sdk: PiSession;
|
|
18
18
|
readonly channel: SessionChannel;
|
|
19
19
|
readonly prompt: string;
|
|
@@ -21,8 +21,8 @@ export declare const piTurns: (options: {
|
|
|
21
21
|
readonly error: (operation: "stream" | "steer" | "interrupt", cause: unknown) => AgentSessionError;
|
|
22
22
|
readonly gate: Effect.Success<typeof piPauseGate>;
|
|
23
23
|
}) => Effect.Effect<{
|
|
24
|
-
intervene: (action: import("@usine/core/attempt/channel").Interrupt | import("@usine/core/attempt/channel").OperatorMessage | import("@usine/core/attempt/channel").Release | import("@usine/core/attempt/channel").Steer) => Effect.Effect<import("@usine/core/attempt/channel").InterventionState, import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError, never>;
|
|
25
|
-
steer: (message: string) => Effect.Effect<void, import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError, never>;
|
|
26
|
-
interrupt: Effect.Effect<void, import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError, never>;
|
|
24
|
+
intervene: (action: import("@usine/core/attempt/channel").Interrupt | import("@usine/core/attempt/channel").OperatorMessage | import("@usine/core/attempt/channel").Release | import("@usine/core/attempt/channel").Steer, onDelivery: import("../runtime.ts").OnDelivery) => Effect.Effect<import("@usine/core/attempt/channel").InterventionState, import("../runtime.ts").AgentBlockedError | import("../runtime.ts").AgentQuestionError | import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError, never>;
|
|
25
|
+
steer: (message: string) => Effect.Effect<void, import("../runtime.ts").AgentBlockedError | import("../runtime.ts").AgentQuestionError | import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError, never>;
|
|
26
|
+
interrupt: Effect.Effect<void, import("../runtime.ts").AgentBlockedError | import("../runtime.ts").AgentQuestionError | import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError, never>;
|
|
27
27
|
}, never, import("effect/Scope").Scope>;
|
|
28
28
|
//# sourceMappingURL=turns.d.ts.map
|
package/dist/pi/turns.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turns.d.ts","sourceRoot":"","sources":["../../src/pi/turns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"turns.d.ts","sourceRoot":"","sources":["../../src/pi/turns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAiB,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,KAAK,iBAAiB,EAAuB,MAAM,eAAe,CAAC;AAE5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAwC,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAEzF,+HAA+H;AAC/H,eAAO,MAAM,WAAW;gBASR,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;;;;uCAWjC,CAAC;AAEH,wGAAwG;AACxG,eAAO,MAAM,OAAO;sBACA,YAAY;kBAChB,SAAS;sBACL,cAAc;qBACf,MAAM;uBACJ,MAAM,MAAM,GAAG,SAAS;oBAC3B,CACd,SAAS,EAAE,QAAQ,GAAG,OAAO,GAAG,WAAW,EAC3C,KAAK,EAAE,OAAO,KACX,iBAAiB;mBACP,MAAM,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC;;;qBAgD9B,MAAM;;uCAMzB,CAAC"}
|
package/dist/pi/turns.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Effect, Fiber } from "effect";
|
|
1
|
+
import { ChildSession } from "@usine/core/agent/session";
|
|
2
|
+
import { Effect, Fiber, Option } from "effect";
|
|
3
3
|
import {} from "../runtime.js";
|
|
4
4
|
import { sessionConversation } from "./conversation.js";
|
|
5
|
-
import { lastPiMessageText } from "./session.js";
|
|
6
|
-
/**
|
|
5
|
+
import { lastPiMessageText, piUserMessageText } from "./session.js";
|
|
6
|
+
/** Creates a gate that blocks Pi tool calls and provider requests at their next boundary while an operator pause is active. */
|
|
7
7
|
export const piPauseGate = Effect.gen(function* () {
|
|
8
8
|
const context = yield* Effect.context();
|
|
9
9
|
const scope = yield* Effect.scope;
|
|
@@ -22,29 +22,42 @@ export const piPauseGate = Effect.gen(function* () {
|
|
|
22
22
|
},
|
|
23
23
|
};
|
|
24
24
|
});
|
|
25
|
-
/** Runs successive Pi turns in one SDK session
|
|
25
|
+
/** Runs successive Pi turns in one SDK session; the conversation decides when the session completes. */
|
|
26
26
|
export const piTurns = Effect.fn("PiTurns.start")(function* (options) {
|
|
27
27
|
const scope = yield* Effect.scope;
|
|
28
|
+
const context = yield* Effect.context();
|
|
28
29
|
const startTurn = (message) => Effect.tryPromise({
|
|
29
30
|
try: () => options.sdk.prompt(message),
|
|
30
31
|
catch: (cause) => options.error("stream", cause),
|
|
31
32
|
}).pipe(Effect.flatMap(() => conversation.finish(options.lastText() ?? lastPiMessageText(options.sdk.messages) ?? "Pi session completed")), Effect.catch(options.channel.fail), Effect.forkIn(scope), Effect.asVoid);
|
|
32
|
-
|
|
33
|
+
// Pi delivers a steering message after the running tool calls return, before its next model request.
|
|
34
|
+
const queueSteer = (message) => Effect.tryPromise({
|
|
33
35
|
try: () => options.sdk.steer(message),
|
|
34
36
|
catch: (cause) => options.error("steer", cause),
|
|
35
|
-
});
|
|
37
|
+
}).pipe(Effect.map((disposition) => (disposition === "handled" ? "read" : "queued")));
|
|
36
38
|
const conversation = yield* sessionConversation({
|
|
37
39
|
session: options.session,
|
|
38
40
|
channel: options.channel,
|
|
39
|
-
send: (message, activity) =>
|
|
41
|
+
send: (message, activity) => activity === "idle"
|
|
42
|
+
? startTurn(message).pipe(Effect.as("read"))
|
|
43
|
+
: queueSteer(message),
|
|
40
44
|
pause: Effect.void,
|
|
41
45
|
beforeFinish: Effect.void,
|
|
42
46
|
});
|
|
47
|
+
// Pi removes a steering message from its queue when the message starts in the conversation.
|
|
48
|
+
const unsubscribe = options.sdk.subscribe((event) => {
|
|
49
|
+
if (event.type !== "message_start")
|
|
50
|
+
return;
|
|
51
|
+
const text = piUserMessageText(event.message);
|
|
52
|
+
if (Option.isSome(text))
|
|
53
|
+
Effect.runForkWith(context)(conversation.read((queued) => queued.indexOf(text.value) + 1));
|
|
54
|
+
});
|
|
55
|
+
yield* Effect.addFinalizer(() => Effect.sync(unsubscribe));
|
|
43
56
|
options.gate.set(conversation.awaitUnpaused);
|
|
44
57
|
yield* startTurn(options.prompt);
|
|
45
58
|
return {
|
|
46
59
|
intervene: conversation.intervene,
|
|
47
|
-
steer,
|
|
60
|
+
steer: (message) => queueSteer(message).pipe(Effect.asVoid),
|
|
48
61
|
interrupt: Effect.tryPromise({
|
|
49
62
|
try: () => options.sdk.abort(),
|
|
50
63
|
catch: (cause) => options.error("interrupt", cause),
|
package/dist/pi/turns.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turns.js","sourceRoot":"","sources":["../../src/pi/turns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"turns.js","sourceRoot":"","sources":["../../src/pi/turns.ts"],"names":[],"mappings":"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"}
|
package/dist/pi/usage.d.ts
CHANGED
|
@@ -1,25 +1,39 @@
|
|
|
1
|
-
import { TokenCount } from "@usine/core/agent/session";
|
|
1
|
+
import { TokenCount, UsdAmount } from "@usine/core/agent/session";
|
|
2
2
|
import { Option, Schema } from "effect";
|
|
3
|
-
/**
|
|
4
|
-
export
|
|
5
|
-
readonly
|
|
6
|
-
readonly
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
/** A session's token count and, if the harness reports one, its cost in dollars. */
|
|
4
|
+
export interface SessionUsage {
|
|
5
|
+
readonly totalTokens: TokenCount;
|
|
6
|
+
readonly costUsd: Option.Option<UsdAmount>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Returns the usage of one completed Pi assistant message: output plus uncached input, where cache
|
|
10
|
+
* writes count and cache reads do not, and the dollar cost if Pi reports one.
|
|
11
|
+
*/
|
|
12
|
+
export declare const piMessageUsage: (input: unknown, options?: import("effect/SchemaAST").ParseOptions | undefined) => Option.Option<SessionUsage>;
|
|
13
|
+
/** Adds a message's usage to a session total; the cost is `Some` once any message has a cost. */
|
|
14
|
+
export declare const addUsage: (total: SessionUsage, message: SessionUsage) => SessionUsage;
|
|
15
|
+
/**
|
|
16
|
+
* Returns a Claude token meter: live message usage between results, reconciled with the cumulative
|
|
17
|
+
* `modelUsage` at each result. Consumption is output plus input plus cache creation, because the
|
|
18
|
+
* SDK's input counts exclude cache reads and writes; repeated blocks with one message ID count only
|
|
19
|
+
* their added tokens. The cost is the SDK's `costUSD` estimate and changes only at a result.
|
|
14
20
|
*/
|
|
15
|
-
export declare const claudeTokenMeter: () => (message: Schema.Json) => Option.Option<
|
|
16
|
-
/** Codex
|
|
21
|
+
export declare const claudeTokenMeter: () => (message: Schema.Json) => Option.Option<SessionUsage>;
|
|
22
|
+
/** The Codex thread token usage, cumulative across turns; `inputTokens` includes cached input. */
|
|
17
23
|
export declare const CodexTokenUsage: Schema.Struct<{
|
|
18
24
|
readonly threadId: Schema.NonEmptyString;
|
|
19
25
|
readonly tokenUsage: Schema.Struct<{
|
|
20
26
|
readonly total: Schema.Struct<{
|
|
21
|
-
readonly
|
|
27
|
+
readonly inputTokens: Schema.Int;
|
|
28
|
+
readonly cachedInputTokens: Schema.Int;
|
|
29
|
+
readonly outputTokens: Schema.Int;
|
|
22
30
|
}>;
|
|
23
31
|
}>;
|
|
24
32
|
}>;
|
|
33
|
+
export type CodexTokenUsage = typeof CodexTokenUsage.Type;
|
|
34
|
+
/**
|
|
35
|
+
* Returns a Codex thread's consumption: output plus uncached input. The thread's `totalTokens` counts
|
|
36
|
+
* the whole context on every turn, so it is not used.
|
|
37
|
+
*/
|
|
38
|
+
export declare const codexThreadTokens: (total: CodexTokenUsage["tokenUsage"]["total"]) => TokenCount;
|
|
25
39
|
//# sourceMappingURL=usage.d.ts.map
|
package/dist/pi/usage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/pi/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/pi/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAQ,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAc9C,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;CAC5C;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,gHAM1B,CAAC;AAEF,iGAAiG;AACjG,eAAO,MAAM,QAAQ,UAAW,YAAY,WAAW,YAAY,KAAG,YAKpE,CAAC;AA0BH;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,kBAIV,MAAM,CAAC,IAAI,KAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAwB1D,CAAC;AAEF,kGAAkG;AAClG,eAAO,MAAM,eAAe;;;;;;;;;EAK1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,iBAAiB,UAAW,eAAe,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,KAAG,UACc,CAAC"}
|
package/dist/pi/usage.js
CHANGED
|
@@ -1,12 +1,31 @@
|
|
|
1
|
-
import { TokenCount } from "@usine/core/agent/session";
|
|
2
|
-
import { Option, Schema } from "effect";
|
|
1
|
+
import { TokenCount, UsdAmount } from "@usine/core/agent/session";
|
|
2
|
+
import { flow, Option, Schema } from "effect";
|
|
3
3
|
const Count = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
|
|
4
|
+
const Dollars = Schema.Finite.check(Schema.isGreaterThanOrEqualTo(0));
|
|
4
5
|
const PiUsage = Schema.Struct({
|
|
5
6
|
role: Schema.Literal("assistant"),
|
|
6
|
-
usage: Schema.Struct({
|
|
7
|
+
usage: Schema.Struct({
|
|
8
|
+
input: Count,
|
|
9
|
+
output: Count,
|
|
10
|
+
cacheWrite: Count,
|
|
11
|
+
cost: Schema.optionalKey(Schema.Struct({ total: Dollars })),
|
|
12
|
+
}),
|
|
13
|
+
});
|
|
14
|
+
/**
|
|
15
|
+
* Returns the usage of one completed Pi assistant message: output plus uncached input, where cache
|
|
16
|
+
* writes count and cache reads do not, and the dollar cost if Pi reports one.
|
|
17
|
+
*/
|
|
18
|
+
export const piMessageUsage = flow(Schema.decodeUnknownOption(PiUsage), Option.map(({ usage }) => ({
|
|
19
|
+
totalTokens: TokenCount.make(usage.output + usage.input + usage.cacheWrite),
|
|
20
|
+
costUsd: Option.map(Option.fromNullishOr(usage.cost), ({ total }) => UsdAmount.make(total)),
|
|
21
|
+
})));
|
|
22
|
+
/** Adds a message's usage to a session total; the cost is `Some` once any message has a cost. */
|
|
23
|
+
export const addUsage = (total, message) => ({
|
|
24
|
+
totalTokens: TokenCount.make(total.totalTokens + message.totalTokens),
|
|
25
|
+
costUsd: Option.isNone(message.costUsd)
|
|
26
|
+
? total.costUsd
|
|
27
|
+
: Option.some(UsdAmount.make(Option.getOrElse(total.costUsd, () => 0) + message.costUsd.value)),
|
|
7
28
|
});
|
|
8
|
-
/** Pi assistant usage is per completed message, including cache tokens. */
|
|
9
|
-
export const piMessageTokens = Schema.decodeUnknownOption(PiUsage);
|
|
10
29
|
const ClaudeAssistantUsage = Schema.Struct({
|
|
11
30
|
type: Schema.Literal("assistant"),
|
|
12
31
|
message: Schema.Struct({
|
|
@@ -14,7 +33,6 @@ const ClaudeAssistantUsage = Schema.Struct({
|
|
|
14
33
|
usage: Schema.Struct({
|
|
15
34
|
input_tokens: Count,
|
|
16
35
|
output_tokens: Count,
|
|
17
|
-
cache_read_input_tokens: Schema.optionalKey(Schema.NullOr(Count)),
|
|
18
36
|
cache_creation_input_tokens: Schema.optionalKey(Schema.NullOr(Count)),
|
|
19
37
|
}),
|
|
20
38
|
}),
|
|
@@ -22,8 +40,8 @@ const ClaudeAssistantUsage = Schema.Struct({
|
|
|
22
40
|
const ClaudeModelUsage = Schema.Struct({
|
|
23
41
|
inputTokens: Count,
|
|
24
42
|
outputTokens: Count,
|
|
25
|
-
cacheReadInputTokens: Count,
|
|
26
43
|
cacheCreationInputTokens: Count,
|
|
44
|
+
costUSD: Schema.optionalKey(Dollars),
|
|
27
45
|
});
|
|
28
46
|
const ClaudeResultUsage = Schema.Struct({
|
|
29
47
|
type: Schema.Literal("result"),
|
|
@@ -31,42 +49,48 @@ const ClaudeResultUsage = Schema.Struct({
|
|
|
31
49
|
});
|
|
32
50
|
const decodeAssistant = Schema.decodeUnknownOption(ClaudeAssistantUsage);
|
|
33
51
|
const decodeResult = Schema.decodeUnknownOption(ClaudeResultUsage);
|
|
34
|
-
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
52
|
+
/**
|
|
53
|
+
* Returns a Claude token meter: live message usage between results, reconciled with the cumulative
|
|
54
|
+
* `modelUsage` at each result. Consumption is output plus input plus cache creation, because the
|
|
55
|
+
* SDK's input counts exclude cache reads and writes; repeated blocks with one message ID count only
|
|
56
|
+
* their added tokens. The cost is the SDK's `costUSD` estimate and changes only at a result.
|
|
38
57
|
*/
|
|
39
58
|
export const claudeTokenMeter = () => {
|
|
40
59
|
let total = 0;
|
|
60
|
+
let cost = Option.none();
|
|
41
61
|
const messages = new Map();
|
|
42
62
|
return (message) => {
|
|
43
63
|
const assistant = decodeAssistant(message);
|
|
44
64
|
if (Option.isSome(assistant)) {
|
|
45
65
|
const { id, usage } = assistant.value.message;
|
|
46
|
-
const consumed = usage.input_tokens +
|
|
47
|
-
usage.output_tokens +
|
|
48
|
-
(usage.cache_read_input_tokens ?? 0) +
|
|
49
|
-
(usage.cache_creation_input_tokens ?? 0);
|
|
66
|
+
const consumed = usage.output_tokens + usage.input_tokens + (usage.cache_creation_input_tokens ?? 0);
|
|
50
67
|
const previous = messages.get(id) ?? 0;
|
|
51
68
|
total += Math.max(0, consumed - previous);
|
|
52
69
|
messages.set(id, Math.max(previous, consumed));
|
|
53
|
-
return Option.some(TokenCount.make(total));
|
|
70
|
+
return Option.some({ totalTokens: TokenCount.make(total), costUsd: cost });
|
|
54
71
|
}
|
|
55
72
|
const result = decodeResult(message);
|
|
56
73
|
if (Option.isNone(result))
|
|
57
74
|
return Option.none();
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
usage.outputTokens +
|
|
61
|
-
usage.cacheReadInputTokens +
|
|
62
|
-
usage.cacheCreationInputTokens, 0);
|
|
75
|
+
const models = Object.values(result.value.modelUsage);
|
|
76
|
+
const consumed = models.reduce((sum, usage) => sum + usage.outputTokens + usage.inputTokens + usage.cacheCreationInputTokens, 0);
|
|
63
77
|
total = Math.max(total, consumed);
|
|
64
|
-
|
|
78
|
+
const priced = models.flatMap(({ costUSD }) => (costUSD === undefined ? [] : [costUSD]));
|
|
79
|
+
if (priced.length > 0)
|
|
80
|
+
cost = Option.some(UsdAmount.make(priced.reduce((sum, value) => sum + value, 0)));
|
|
81
|
+
return Option.some({ totalTokens: TokenCount.make(total), costUsd: cost });
|
|
65
82
|
};
|
|
66
83
|
};
|
|
67
|
-
/** Codex
|
|
84
|
+
/** The Codex thread token usage, cumulative across turns; `inputTokens` includes cached input. */
|
|
68
85
|
export const CodexTokenUsage = Schema.Struct({
|
|
69
86
|
threadId: Schema.NonEmptyString,
|
|
70
|
-
tokenUsage: Schema.Struct({
|
|
87
|
+
tokenUsage: Schema.Struct({
|
|
88
|
+
total: Schema.Struct({ inputTokens: Count, cachedInputTokens: Count, outputTokens: Count }),
|
|
89
|
+
}),
|
|
71
90
|
});
|
|
91
|
+
/**
|
|
92
|
+
* Returns a Codex thread's consumption: output plus uncached input. The thread's `totalTokens` counts
|
|
93
|
+
* the whole context on every turn, so it is not used.
|
|
94
|
+
*/
|
|
95
|
+
export const codexThreadTokens = (total) => TokenCount.make(total.outputTokens + Math.max(0, total.inputTokens - total.cachedInputTokens));
|
|
72
96
|
//# sourceMappingURL=usage.js.map
|
package/dist/pi/usage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/pi/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/pi/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,KAAK;QACb,UAAU,EAAE,KAAK;QACjB,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;KAC5D,CAAC;CACH,CAAC,CAAC;AAQH;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAChC,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,EACnC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAgB,EAAE,CAAC,CAAC;IACvC,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;IAC3E,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;CAC5F,CAAC,CAAC,CACJ,CAAC;AAEF,iGAAiG;AACjG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAmB,EAAE,OAAqB,EAAgB,EAAE,CAAC,CAAC;IACrF,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACrE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QACrC,CAAC,CAAC,KAAK,CAAC,OAAO;QACf,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;CAClG,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;QACrB,EAAE,EAAE,MAAM,CAAC,cAAc;QACzB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;YACnB,YAAY,EAAE,KAAK;YACnB,aAAa,EAAE,KAAK;YACpB,2BAA2B,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACtE,CAAC;KACH,CAAC;CACH,CAAC,CAAC;AACH,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC;IACrC,WAAW,EAAE,KAAK;IAClB,YAAY,EAAE,KAAK;IACnB,wBAAwB,EAAE,KAAK;IAC/B,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;CACrC,CAAC,CAAC;AACH,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC;CAC3D,CAAC,CAAC;AACH,MAAM,eAAe,GAAG,MAAM,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;AACzE,MAAM,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;AAEnE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE;IACnC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,EAAa,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,OAAO,CAAC,OAAoB,EAA+B,EAAE;QAC3D,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;YAC9C,MAAM,QAAQ,GACZ,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,CAAC,CAAC;YACtF,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACvC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC;YAC1C,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC5B,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,wBAAwB,EAC7F,CAAC,CACF,CAAC;QACF,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YACnB,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,kGAAkG;AAClG,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC,cAAc;IAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;KAC5F,CAAC;CACH,CAAC,CAAC;AAGH;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAA6C,EAAc,EAAE,CAC7F,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC"}
|