@felan-ai/agent-core 0.9.2 → 0.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.
- package/README.md +26 -1
- package/dist/classifier/index.d.ts +5 -0
- package/dist/classifier/index.d.ts.map +1 -0
- package/dist/classifier/index.js +3 -0
- package/dist/classifier/index.js.map +1 -0
- package/dist/{jev → classifier/jev}/classifier.d.ts +1 -1
- package/dist/classifier/jev/classifier.d.ts.map +1 -0
- package/dist/{jev → classifier/jev}/classifier.js +3 -0
- package/dist/classifier/jev/classifier.js.map +1 -0
- package/dist/{jev → classifier/jev}/client.d.ts +2 -0
- package/dist/classifier/jev/client.d.ts.map +1 -0
- package/dist/{jev → classifier/jev}/client.js +28 -11
- package/dist/classifier/jev/client.js.map +1 -0
- package/dist/classifier/jev/credentials.d.ts.map +1 -0
- package/dist/classifier/jev/credentials.js.map +1 -0
- package/dist/classifier/session-evidence.d.ts +25 -0
- package/dist/classifier/session-evidence.d.ts.map +1 -0
- package/dist/classifier/session-evidence.js +159 -0
- package/dist/classifier/session-evidence.js.map +1 -0
- package/dist/{classifier.d.ts → classifier/types.d.ts} +2 -1
- package/dist/classifier/types.d.ts.map +1 -0
- package/dist/classifier/types.js +2 -0
- package/dist/classifier/types.js.map +1 -0
- package/dist/dynamic-thinking/index.d.ts +2 -0
- package/dist/dynamic-thinking/index.d.ts.map +1 -0
- package/dist/dynamic-thinking/index.js +2 -0
- package/dist/dynamic-thinking/index.js.map +1 -0
- package/dist/dynamic-thinking/savings.d.ts +10 -0
- package/dist/dynamic-thinking/savings.d.ts.map +1 -0
- package/dist/dynamic-thinking/savings.js +56 -0
- package/dist/dynamic-thinking/savings.js.map +1 -0
- package/dist/dynamic-thinking/selection.d.ts +11 -0
- package/dist/dynamic-thinking/selection.d.ts.map +1 -0
- package/dist/dynamic-thinking/selection.js +66 -0
- package/dist/dynamic-thinking/selection.js.map +1 -0
- package/dist/dynamic-thinking/session.d.ts +6 -0
- package/dist/dynamic-thinking/session.d.ts.map +1 -0
- package/dist/dynamic-thinking/session.js +86 -0
- package/dist/dynamic-thinking/session.js.map +1 -0
- package/dist/host-agent-runtime.d.ts +1 -1
- package/dist/host-agent-runtime.d.ts.map +1 -1
- package/dist/host-agent-runtime.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/session.d.ts +1 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +13 -0
- package/dist/session.js.map +1 -1
- package/dist/transcript-evidence.d.ts +12 -0
- package/dist/transcript-evidence.d.ts.map +1 -0
- package/dist/transcript-evidence.js +42 -0
- package/dist/transcript-evidence.js.map +1 -0
- package/package.json +1 -1
- package/dist/classifier.d.ts.map +0 -1
- package/dist/classifier.js +0 -2
- package/dist/classifier.js.map +0 -1
- package/dist/jev/classifier.d.ts.map +0 -1
- package/dist/jev/classifier.js.map +0 -1
- package/dist/jev/client.d.ts.map +0 -1
- package/dist/jev/client.js.map +0 -1
- package/dist/jev/credentials.d.ts.map +0 -1
- package/dist/jev/credentials.js.map +0 -1
- /package/dist/{jev → classifier/jev}/credentials.d.ts +0 -0
- /package/dist/{jev → classifier/jev}/credentials.js +0 -0
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Portable Felan agent contracts and the Node.js host runtime.
|
|
4
4
|
|
|
5
|
-
`@felan-ai/agent-core` is the
|
|
5
|
+
`@felan-ai/agent-core` is the portable composition layer between a
|
|
6
6
|
Felan host and the pinned Pi packages. It is intended for applications and
|
|
7
7
|
portable extensions, not as a complete end-user CLI.
|
|
8
8
|
|
|
@@ -62,6 +62,31 @@ judgment and an additive probability-of-yes judgment for independently scoring
|
|
|
62
62
|
multiple conditions. Jev implements the latter with its Noul primitive; Agent
|
|
63
63
|
Core does not expose Jev transport types through this contract.
|
|
64
64
|
|
|
65
|
+
`collectClassifierSessionEvidence` converts the active Pi session projection
|
|
66
|
+
into bounded conversation and correlated tool-call metadata for classifiers.
|
|
67
|
+
It handles branch/compaction summaries, omits images, raw thinking and tool
|
|
68
|
+
result bodies, and redacts recognizable credential patterns. It is not a
|
|
69
|
+
guarantee that arbitrary secrets in user text are detected. Feature packages
|
|
70
|
+
choose their own classifier questions and any additional state.
|
|
71
|
+
|
|
72
|
+
Session composition accepts an optional `dynamicThinking` capability. When the
|
|
73
|
+
runtime has a classifier, it selects a supported effort on `before_agent_start`,
|
|
74
|
+
not queued follow-ups or tool continuations, without persisting the user's
|
|
75
|
+
default. Codex requests are classified only when the Codex extension is loaded;
|
|
76
|
+
eligible Anthropic models use Pi's mid-conversation effort support.
|
|
77
|
+
Explicit thinking changes take precedence for the remainder of the session.
|
|
78
|
+
Absent the option or the classifier, composition does not enable this feature.
|
|
79
|
+
|
|
80
|
+
With an optional savings reporter, Agent Core reports a heuristic
|
|
81
|
+
API-equivalent estimate for any supported model's automatic `high` → `low` or
|
|
82
|
+
`high` → `medium` change when the run settles without tool failures and its
|
|
83
|
+
first assistant response includes reasoning-token usage. It estimates 5%
|
|
84
|
+
extra reasoning output at `high`, keeps observed input, cache and visible-output
|
|
85
|
+
usage unchanged, and subtracts reported classifier
|
|
86
|
+
cost. No change, a return to `high`, other models/levels, missing usage, or a
|
|
87
|
+
failed response produces no measurement. The unvalidated cross-model
|
|
88
|
+
assumption and quality caveats are in [the public benchmark notes](../../docs/benchmarks/dynamic-thinking-effort.md).
|
|
89
|
+
|
|
65
90
|
Host runtimes expose optional persistent process operations for extensions that
|
|
66
91
|
need incremental output and stdin. `startShell()` keeps process ownership in
|
|
67
92
|
the runtime adapter and returns a bounded polling handle with write, terminate,
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createJevClassifier } from './jev/classifier.js';
|
|
2
|
+
export { collectClassifierSessionEvidence, sanitizeClassifierText } from './session-evidence.js';
|
|
3
|
+
export type { ClassifierSessionEvidence, ClassifierSessionEvidenceLimits } from './session-evidence.js';
|
|
4
|
+
export type { Classifier, ClassifierAnswer, ClassifierAnswers, ClassifierEvaluationMetadata, ClassifierQuestion, ClassifierQuestions, ClassifierProbabilityAnswer, ClassifierProbabilityAnswers, ClassifierProbabilityQuestion, ClassifierProbabilityQuestions, ClassifierUsage, } from './types.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/classifier/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,gCAAgC,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACjG,YAAY,EAAE,yBAAyB,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AACxG,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,4BAA4B,EAC5B,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,EAC9B,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/classifier/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,gCAAgC,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Classifier } from '../
|
|
1
|
+
import type { Classifier } from '../types.js';
|
|
2
2
|
import { type CreateJevClientOptions } from './client.js';
|
|
3
3
|
export declare function createJevClassifier(): Classifier | undefined;
|
|
4
4
|
export declare function createJevClassifierWithOptions(options: CreateJevClientOptions): Classifier | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../../src/classifier/jev/classifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAIX,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,KAAK,sBAAsB,EAE5B,MAAM,aAAa,CAAC;AAErB,wBAAgB,mBAAmB,IAAI,UAAU,GAAG,SAAS,CAE5D;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,sBAAsB,GAC9B,UAAU,GAAG,SAAS,CA4BxB"}
|
|
@@ -7,6 +7,9 @@ export function createJevClassifierWithOptions(options) {
|
|
|
7
7
|
if (!client.resolveTransport())
|
|
8
8
|
return undefined;
|
|
9
9
|
return {
|
|
10
|
+
canEvaluate(state, questions) {
|
|
11
|
+
return client.canEvaluate(state, questions);
|
|
12
|
+
},
|
|
10
13
|
async evaluate(state, questions, signal) {
|
|
11
14
|
const started = Date.now();
|
|
12
15
|
const result = await client.evaluate(state, questions, signal === undefined ? {} : { signal });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../../src/classifier/jev/classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,12 +49,14 @@ export declare class JevClientError extends Error {
|
|
|
49
49
|
export interface CreateJevClientOptions extends JevCredentialSources {
|
|
50
50
|
readonly fetch?: JevFetch;
|
|
51
51
|
readonly timeoutMs?: number;
|
|
52
|
+
readonly maxQuestionsPerRequest?: number;
|
|
52
53
|
}
|
|
53
54
|
export interface JevEvaluateOptions {
|
|
54
55
|
readonly signal?: AbortSignal;
|
|
55
56
|
}
|
|
56
57
|
export declare function createJevClient(options?: CreateJevClientOptions): {
|
|
57
58
|
resolveTransport(): ReturnType<typeof resolveJevTransport>;
|
|
59
|
+
canEvaluate(state: unknown, questions: JevQuestions): boolean;
|
|
58
60
|
evaluate(state: unknown, questions: JevQuestions, evaluateOptions?: JevEvaluateOptions): Promise<JevEvaluation>;
|
|
59
61
|
};
|
|
60
62
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/classifier/jev/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,25 +9,40 @@ export class JevClientError extends Error {
|
|
|
9
9
|
}
|
|
10
10
|
const DEFAULT_TIMEOUT_MS = 20_000;
|
|
11
11
|
const MAX_TIMEOUT_MS = 60_000;
|
|
12
|
-
const
|
|
13
|
-
const
|
|
12
|
+
const MAX_COMBINED_INPUT_BYTES = 64_000;
|
|
13
|
+
const MAX_STATE_AND_QUESTION_BYTES = 32_000;
|
|
14
14
|
const MAX_RESPONSE_BYTES = 256 * 1_024;
|
|
15
|
-
const MAX_QUESTIONS = 256;
|
|
16
15
|
const MAX_INSTRUCTIONS_BYTES = 4_096;
|
|
17
16
|
const PINNED_HOSTS = new Set(['api.typesafe.ai', 'openrouter.ai']);
|
|
18
17
|
export function createJevClient(options = {}) {
|
|
19
18
|
const timeoutMs = normalizeTimeout(options.timeoutMs);
|
|
19
|
+
const maxQuestionsPerRequest = options.maxQuestionsPerRequest;
|
|
20
|
+
if (maxQuestionsPerRequest !== undefined && (!Number.isSafeInteger(maxQuestionsPerRequest) || maxQuestionsPerRequest < 1)) {
|
|
21
|
+
throw new JevClientError('invalid_request', 'Jev max questions per request must be a positive safe integer');
|
|
22
|
+
}
|
|
20
23
|
const fetcher = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
21
24
|
return {
|
|
22
25
|
resolveTransport() {
|
|
23
26
|
return resolveTransport(options);
|
|
24
27
|
},
|
|
28
|
+
canEvaluate(state, questions) {
|
|
29
|
+
try {
|
|
30
|
+
const transport = resolveTransport(options);
|
|
31
|
+
if (!transport)
|
|
32
|
+
return false;
|
|
33
|
+
partitionQuestions(transport.model, state, questionEntries(questions), maxQuestionsPerRequest);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
},
|
|
25
40
|
async evaluate(state, questions, evaluateOptions = {}) {
|
|
26
41
|
const transport = resolveTransport(options);
|
|
27
42
|
if (!transport)
|
|
28
43
|
throw new JevClientError('unavailable', 'Jev credentials are unavailable');
|
|
29
44
|
const entries = questionEntries(questions);
|
|
30
|
-
const batches = partitionQuestions(transport.model, state, entries);
|
|
45
|
+
const batches = partitionQuestions(transport.model, state, entries, maxQuestionsPerRequest);
|
|
31
46
|
const answers = {};
|
|
32
47
|
let requests = 0;
|
|
33
48
|
let usage;
|
|
@@ -59,7 +74,7 @@ async function requestAnswers(transport, fetcher, timeoutMs, state, questions, s
|
|
|
59
74
|
throw new JevClientError('invalid_request', 'Jev endpoint is not pinned');
|
|
60
75
|
}
|
|
61
76
|
const body = JSON.stringify({ model: transport.model, state, questions });
|
|
62
|
-
if (Buffer.byteLength(body, 'utf8') >
|
|
77
|
+
if (Buffer.byteLength(body, 'utf8') > MAX_COMBINED_INPUT_BYTES) {
|
|
63
78
|
throw new JevClientError('invalid_request', 'Jev request exceeds the size budget');
|
|
64
79
|
}
|
|
65
80
|
const controller = createTimeout(signal, timeoutMs);
|
|
@@ -108,8 +123,6 @@ function questionEntries(questions) {
|
|
|
108
123
|
const entries = Object.entries(questions);
|
|
109
124
|
if (entries.length === 0)
|
|
110
125
|
throw new JevClientError('invalid_request', 'Jev questions are required');
|
|
111
|
-
if (entries.length > MAX_QUESTIONS)
|
|
112
|
-
throw new JevClientError('invalid_request', 'Jev question count exceeds the budget');
|
|
113
126
|
for (const [name, question] of entries) {
|
|
114
127
|
if (!name.trim() || name.length > 128)
|
|
115
128
|
throw new JevClientError('invalid_request', 'Jev question id is invalid');
|
|
@@ -131,27 +144,31 @@ function validateQuestion(question) {
|
|
|
131
144
|
throw new JevClientError('invalid_request', 'Jev score criteria are invalid');
|
|
132
145
|
}
|
|
133
146
|
}
|
|
134
|
-
function partitionQuestions(model, state, entries) {
|
|
147
|
+
function partitionQuestions(model, state, entries, maxQuestionsPerRequest) {
|
|
135
148
|
const stateBytes = Buffer.byteLength(JSON.stringify(state), 'utf8');
|
|
136
|
-
if (stateBytes === 0 || stateBytes >
|
|
149
|
+
if (stateBytes === 0 || stateBytes > MAX_STATE_AND_QUESTION_BYTES) {
|
|
137
150
|
throw new JevClientError('invalid_request', 'Jev state exceeds the size budget');
|
|
138
151
|
}
|
|
139
152
|
const overhead = Buffer.byteLength(JSON.stringify({ model, state, questions: {} }), 'utf8');
|
|
140
153
|
const batches = [];
|
|
141
154
|
let current = {};
|
|
142
155
|
let currentBytes = overhead;
|
|
156
|
+
let currentCount = 0;
|
|
143
157
|
for (const [name, question] of entries) {
|
|
144
158
|
const added = Buffer.byteLength(JSON.stringify({ [name]: question }), 'utf8') + 1;
|
|
145
|
-
if (overhead + added >
|
|
159
|
+
if (overhead + added > MAX_STATE_AND_QUESTION_BYTES) {
|
|
146
160
|
throw new JevClientError('invalid_request', 'Jev question exceeds the size budget');
|
|
147
161
|
}
|
|
148
|
-
if (
|
|
162
|
+
if (currentCount > 0 && (currentBytes + added > MAX_COMBINED_INPUT_BYTES
|
|
163
|
+
|| (maxQuestionsPerRequest !== undefined && currentCount >= maxQuestionsPerRequest))) {
|
|
149
164
|
batches.push(current);
|
|
150
165
|
current = {};
|
|
151
166
|
currentBytes = overhead;
|
|
167
|
+
currentCount = 0;
|
|
152
168
|
}
|
|
153
169
|
current[name] = question;
|
|
154
170
|
currentBytes += added;
|
|
171
|
+
currentCount += 1;
|
|
155
172
|
}
|
|
156
173
|
batches.push(current);
|
|
157
174
|
return batches;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/classifier/jev/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/classifier/jev/credentials.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,YAAY,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,sBAAsB,yCAAyC,CAAC;AAC7E,eAAO,MAAM,wBAAwB,8CAA8C,CAAC;AACpF,eAAO,MAAM,cAAc,eAAe,CAAC;AAC3C,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AAEpD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,oBAAoB,GAAG,SAAS,CAYnG;AAoBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEtF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/classifier/jev/credentials.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,MAAM,CAAC;AACpC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAkB5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,sCAAsC,CAAC;AAC7E,MAAM,CAAC,MAAM,wBAAwB,GAAG,2CAA2C,CAAC;AACpF,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEpD,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC;IACvD,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,mBAAmB,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;IACrH,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,gBAAgB,CAAC;WAC9D,mBAAmB,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAEzD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC;IAC5C,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7F,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrG,IAAI,WAAW;QAAE,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACvD,IAAI,aAAa;QAAE,OAAO,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC7D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc;IACvC,OAAO;QACL,QAAQ,EAAE,UAAU;QACpB,MAAM;QACN,GAAG,EAAE,IAAI,GAAG,CAAC,sBAAsB,CAAC;QACpC,KAAK,EAAE,cAAc;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc;IACzC,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,MAAM;QACN,GAAG,EAAE,IAAI,GAAG,CAAC,wBAAwB,CAAC;QACtC,KAAK,EAAE,gBAAgB;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,UAA8B;IAC5E,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACzE,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,oBAAoB,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClG,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SessionManager } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
export interface ClassifierSessionEvidence {
|
|
3
|
+
readonly conversation: ReadonlyArray<{
|
|
4
|
+
readonly role: 'user' | 'assistant' | 'summary';
|
|
5
|
+
readonly text: string;
|
|
6
|
+
}>;
|
|
7
|
+
readonly tool_activity: ReadonlyArray<{
|
|
8
|
+
readonly tool: string;
|
|
9
|
+
readonly input: string;
|
|
10
|
+
readonly result?: 'ok' | 'failed';
|
|
11
|
+
readonly exit_code?: number;
|
|
12
|
+
readonly task_status?: string;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
export interface ClassifierSessionEvidenceLimits {
|
|
16
|
+
readonly maxConversationItems?: number;
|
|
17
|
+
readonly maxToolActivities?: number;
|
|
18
|
+
readonly maxTextBytes?: number;
|
|
19
|
+
readonly maxToolInputBytes?: number;
|
|
20
|
+
readonly maxTotalBytes?: number;
|
|
21
|
+
readonly maxSourceEntries?: number;
|
|
22
|
+
}
|
|
23
|
+
export declare function collectClassifierSessionEvidence(session: Pick<SessionManager, 'buildSessionProjection' | 'buildContextEntries'>, limits?: ClassifierSessionEvidenceLimits): ClassifierSessionEvidence;
|
|
24
|
+
export declare function sanitizeClassifierText(value: unknown, maxBytes: number): string;
|
|
25
|
+
//# sourceMappingURL=session-evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-evidence.d.ts","sourceRoot":"","sources":["../../src/classifier/session-evidence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjH,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;QACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC;QAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAoBD,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,wBAAwB,GAAG,qBAAqB,CAAC,EAC/E,MAAM,GAAE,+BAAoC,GAC3C,yBAAyB,CAkF3B;AAiDD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/E"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
const encoder = new TextEncoder();
|
|
2
|
+
const defaults = {
|
|
3
|
+
maxConversationItems: 24,
|
|
4
|
+
maxToolActivities: 40,
|
|
5
|
+
maxTextBytes: 1_200,
|
|
6
|
+
maxToolInputBytes: 160,
|
|
7
|
+
maxTotalBytes: 16_384,
|
|
8
|
+
maxSourceEntries: 4_096,
|
|
9
|
+
};
|
|
10
|
+
export function collectClassifierSessionEvidence(session, limits = {}) {
|
|
11
|
+
const bounds = {
|
|
12
|
+
maxConversationItems: bound(limits.maxConversationItems, defaults.maxConversationItems),
|
|
13
|
+
maxToolActivities: bound(limits.maxToolActivities, defaults.maxToolActivities, 4_096),
|
|
14
|
+
maxTextBytes: bound(limits.maxTextBytes, defaults.maxTextBytes),
|
|
15
|
+
maxToolInputBytes: bound(limits.maxToolInputBytes, defaults.maxToolInputBytes),
|
|
16
|
+
maxTotalBytes: bound(limits.maxTotalBytes, defaults.maxTotalBytes, 256 * 1_024),
|
|
17
|
+
maxSourceEntries: bound(limits.maxSourceEntries, defaults.maxSourceEntries),
|
|
18
|
+
};
|
|
19
|
+
const conversation = [];
|
|
20
|
+
const toolActivity = [];
|
|
21
|
+
const calls = new Map();
|
|
22
|
+
const recent = (items) => bounds.maxSourceEntries === 0 ? [] : items.slice(-bounds.maxSourceEntries);
|
|
23
|
+
const projection = typeof session.buildSessionProjection === 'function'
|
|
24
|
+
? recent(session.buildSessionProjection().entries).flatMap(({ sourceEntry, messages }) => (sourceEntry.type === 'compaction' || sourceEntry.type === 'branch_summary'
|
|
25
|
+
? [{ role: 'summary', text: sourceEntry.summary }]
|
|
26
|
+
: messages))
|
|
27
|
+
: recent(session.buildContextEntries()).flatMap((entry) => (entry.type === 'compaction' || entry.type === 'branch_summary'
|
|
28
|
+
? [{ role: 'summary', text: entry.summary }]
|
|
29
|
+
: entry.type === 'message' ? [entry.message] : []));
|
|
30
|
+
for (const message of projection) {
|
|
31
|
+
if (!isRecord(message))
|
|
32
|
+
continue;
|
|
33
|
+
if (message.role === 'summary') {
|
|
34
|
+
const text = safeText(message.text, bounds.maxTextBytes);
|
|
35
|
+
if (text)
|
|
36
|
+
conversation.push({ role: 'summary', text });
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (message.role === 'toolResult' && typeof message.toolCallId === 'string') {
|
|
40
|
+
const call = calls.get(message.toolCallId);
|
|
41
|
+
if (call) {
|
|
42
|
+
const exitCode = resultExitCode(message);
|
|
43
|
+
call.result = message.isError === true || (exitCode !== undefined && exitCode !== 0) ? 'failed' : 'ok';
|
|
44
|
+
if (exitCode !== undefined)
|
|
45
|
+
call.exit_code = exitCode;
|
|
46
|
+
const details = message.details;
|
|
47
|
+
if (isRecord(details) && isRecord(details.task) && typeof details.task.status === 'string') {
|
|
48
|
+
call.task_status = safeText(details.task.status, 48);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (message.role !== 'user' && message.role !== 'assistant')
|
|
54
|
+
continue;
|
|
55
|
+
const text = safeText(contentText(message.content), bounds.maxTextBytes);
|
|
56
|
+
if (text)
|
|
57
|
+
conversation.push({ role: message.role, text });
|
|
58
|
+
if (message.role !== 'assistant' || !Array.isArray(message.content))
|
|
59
|
+
continue;
|
|
60
|
+
for (const part of message.content) {
|
|
61
|
+
if (!isRecord(part) || part.type !== 'toolCall' || typeof part.name !== 'string')
|
|
62
|
+
continue;
|
|
63
|
+
const call = {
|
|
64
|
+
tool: safeText(part.name, 80), input: toolInput(part.arguments, bounds.maxToolInputBytes),
|
|
65
|
+
};
|
|
66
|
+
if (!call.tool)
|
|
67
|
+
continue;
|
|
68
|
+
toolActivity.push(call);
|
|
69
|
+
if (typeof part.id === 'string')
|
|
70
|
+
calls.set(part.id, call);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
let remaining = Math.max(0, bounds.maxTotalBytes - 44);
|
|
74
|
+
const fit = (values, maxItems) => {
|
|
75
|
+
const kept = [];
|
|
76
|
+
for (let index = values.length - 1; index >= 0 && kept.length < maxItems; index--) {
|
|
77
|
+
const item = values[index];
|
|
78
|
+
const size = encoder.encode(JSON.stringify(item)).byteLength;
|
|
79
|
+
if (size > remaining)
|
|
80
|
+
continue;
|
|
81
|
+
remaining -= size;
|
|
82
|
+
kept.push(item);
|
|
83
|
+
}
|
|
84
|
+
return kept.reverse();
|
|
85
|
+
};
|
|
86
|
+
const evidence = {
|
|
87
|
+
conversation: fit(conversation, bounds.maxConversationItems),
|
|
88
|
+
tool_activity: fit(toolActivity, bounds.maxToolActivities),
|
|
89
|
+
};
|
|
90
|
+
while (encoder.encode(JSON.stringify(evidence)).byteLength > bounds.maxTotalBytes) {
|
|
91
|
+
if (evidence.tool_activity.length > 0)
|
|
92
|
+
evidence.tool_activity.shift();
|
|
93
|
+
else if (evidence.conversation.length > 0)
|
|
94
|
+
evidence.conversation.shift();
|
|
95
|
+
else
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
return evidence;
|
|
99
|
+
}
|
|
100
|
+
function toolInput(value, maxBytes) {
|
|
101
|
+
if (!isRecord(value))
|
|
102
|
+
return '';
|
|
103
|
+
for (const key of ['path', 'file_path', 'command', 'pattern', 'query', 'description', 'title']) {
|
|
104
|
+
if (typeof value[key] === 'string')
|
|
105
|
+
return safeText(value[key], maxBytes);
|
|
106
|
+
}
|
|
107
|
+
return '';
|
|
108
|
+
}
|
|
109
|
+
function resultExitCode(message) {
|
|
110
|
+
const details = message.details;
|
|
111
|
+
if (isRecord(details) && typeof details.exitCode === 'number' && Number.isSafeInteger(details.exitCode))
|
|
112
|
+
return details.exitCode;
|
|
113
|
+
const text = safeText(contentText(message.content), 256);
|
|
114
|
+
const match = /(?:Exit(?: code)?):\s*(\d+)/iu.exec(text);
|
|
115
|
+
return match ? Number(match[1]) : undefined;
|
|
116
|
+
}
|
|
117
|
+
function contentText(value) {
|
|
118
|
+
if (typeof value === 'string')
|
|
119
|
+
return value;
|
|
120
|
+
if (!Array.isArray(value))
|
|
121
|
+
return '';
|
|
122
|
+
return value.flatMap((part) => (isRecord(part) && part.type === 'text' && typeof part.text === 'string' ? [part.text] : [])).join('\n');
|
|
123
|
+
}
|
|
124
|
+
function safeText(value, maxBytes) {
|
|
125
|
+
if (typeof value !== 'string' || maxBytes <= 0)
|
|
126
|
+
return '';
|
|
127
|
+
let text = value.slice(0, Math.max(512, maxBytes * 8))
|
|
128
|
+
.replace(/\r\n?/gu, '\n')
|
|
129
|
+
.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f\u202a-\u202e\u2066-\u2069]/gu, '')
|
|
130
|
+
.replace(/-----BEGIN [^-]*PRIVATE KEY-----[\s\S]*?(?:-----END [^-]*PRIVATE KEY-----|$)/gu, '[REDACTED_PRIVATE_KEY]')
|
|
131
|
+
.replace(/\b(?:sk-[A-Za-z0-9_-]+|ghp_[A-Za-z0-9]+|github_pat_[A-Za-z0-9_]+|xox[baprs]-[A-Za-z0-9-]+)\b/gu, '[REDACTED_TOKEN]')
|
|
132
|
+
.replace(/(Bearer\s+)[A-Za-z0-9._~+/=-]+/giu, '$1[REDACTED_TOKEN]')
|
|
133
|
+
.replace(/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|password|secret|authorization)["']?\s*[:=]\s*["']?)[^"'\s,}]+/giu, '$1[REDACTED_SECRET]')
|
|
134
|
+
.trim();
|
|
135
|
+
if (encoder.encode(text).byteLength <= maxBytes)
|
|
136
|
+
return text;
|
|
137
|
+
let bytes = 0;
|
|
138
|
+
let end = 0;
|
|
139
|
+
for (const codepoint of text) {
|
|
140
|
+
const size = encoder.encode(codepoint).byteLength;
|
|
141
|
+
if (bytes + size > maxBytes)
|
|
142
|
+
break;
|
|
143
|
+
bytes += size;
|
|
144
|
+
end += codepoint.length;
|
|
145
|
+
}
|
|
146
|
+
text = text.slice(0, end).trimEnd();
|
|
147
|
+
return text;
|
|
148
|
+
}
|
|
149
|
+
export function sanitizeClassifierText(value, maxBytes) {
|
|
150
|
+
return safeText(value, bound(maxBytes, 4_096, 16_384));
|
|
151
|
+
}
|
|
152
|
+
function isRecord(value) {
|
|
153
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
154
|
+
}
|
|
155
|
+
function bound(value, fallback, maximum = fallback * 16) {
|
|
156
|
+
return value !== undefined && Number.isSafeInteger(value) && value >= 0
|
|
157
|
+
? Math.min(value, maximum) : fallback;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=session-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-evidence.js","sourceRoot":"","sources":["../../src/classifier/session-evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,6 +32,7 @@ export interface ClassifierEvaluationMetadata {
|
|
|
32
32
|
readonly elapsedMs?: number;
|
|
33
33
|
}
|
|
34
34
|
export interface Classifier {
|
|
35
|
+
canEvaluate?(state: unknown, questions: ClassifierQuestions): boolean;
|
|
35
36
|
evaluate(state: unknown, questions: ClassifierQuestions, signal?: AbortSignal): Promise<{
|
|
36
37
|
readonly answers: ClassifierAnswers;
|
|
37
38
|
readonly metadata?: ClassifierEvaluationMetadata;
|
|
@@ -41,4 +42,4 @@ export interface Classifier {
|
|
|
41
42
|
readonly metadata?: ClassifierEvaluationMetadata;
|
|
42
43
|
}>;
|
|
43
44
|
}
|
|
44
|
-
//# sourceMappingURL=
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/classifier/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD;AAED,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAE/E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAE3E,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC,CAAC;AAErG,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC,CAAC;AAEjG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC;IACtE,QAAQ,CACN,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,mBAAmB,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC;QACT,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;QACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC;KAClD,CAAC,CAAC;IACH,qBAAqB,CAAC,CACpB,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,8BAA8B,EACzC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC;QACT,QAAQ,CAAC,OAAO,EAAE,4BAA4B,CAAC;QAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC;KAClD,CAAC,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/classifier/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dynamic-thinking/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dynamic-thinking/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Api, AssistantMessage, Model } from '@earendil-works/pi-ai';
|
|
2
|
+
import type { SavingsReporter } from '../savings.js';
|
|
3
|
+
import type { FelanThinkingLevel } from '../thinking.js';
|
|
4
|
+
export declare const DYNAMIC_THINKING_SAVINGS_METHOD = "high-effort-reasoning-5pct-heuristic-v1";
|
|
5
|
+
export declare function estimateHighEffortOutputTokens(model: Model<Api>, previous: FelanThinkingLevel, selected: FelanThinkingLevel, usage: {
|
|
6
|
+
readonly output: number;
|
|
7
|
+
readonly reasoning?: number;
|
|
8
|
+
}): number | undefined;
|
|
9
|
+
export declare function reportDynamicThinkingSavings(reporter: SavingsReporter | undefined, model: Model<Api>, previous: FelanThinkingLevel, selected: FelanThinkingLevel, message: AssistantMessage, classifierCostUsd?: number): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=savings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savings.d.ts","sourceRoot":"","sources":["../../src/dynamic-thinking/savings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,eAAe,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAKzD,eAAO,MAAM,+BAA+B,4CAA4C,CAAC;AAEzF,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,MAAM,GAAG,SAAS,CAUpB;AAED,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,eAAe,GAAG,SAAS,EACrC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,gBAAgB,EACzB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,IAAI,CAAC,CAoCf"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { supportsDynamicThinking } from './selection.js';
|
|
2
|
+
const HIGH_EFFORT_REASONING_UPLIFT_DENOMINATOR = 20;
|
|
3
|
+
export const DYNAMIC_THINKING_SAVINGS_METHOD = 'high-effort-reasoning-5pct-heuristic-v1';
|
|
4
|
+
export function estimateHighEffortOutputTokens(model, previous, selected, usage) {
|
|
5
|
+
if (!supportsDynamicThinking(model) || previous !== 'high' || (selected !== 'low' && selected !== 'medium')) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
const { output, reasoning } = usage;
|
|
9
|
+
if (!Number.isSafeInteger(output) || output <= 0 || reasoning === undefined
|
|
10
|
+
|| !Number.isSafeInteger(reasoning) || reasoning <= 0 || reasoning > output)
|
|
11
|
+
return undefined;
|
|
12
|
+
const extra = Math.floor(reasoning / HIGH_EFFORT_REASONING_UPLIFT_DENOMINATOR);
|
|
13
|
+
const estimated = output + extra;
|
|
14
|
+
return extra > 0 && Number.isSafeInteger(estimated) ? estimated : undefined;
|
|
15
|
+
}
|
|
16
|
+
export async function reportDynamicThinkingSavings(reporter, model, previous, selected, message, classifierCostUsd) {
|
|
17
|
+
if (!reporter || (message.stopReason !== 'stop' && message.stopReason !== 'toolUse'))
|
|
18
|
+
return;
|
|
19
|
+
const { usage } = message;
|
|
20
|
+
const highOutput = estimateHighEffortOutputTokens(model, previous, selected, usage);
|
|
21
|
+
if (highOutput === undefined || ![usage.input, usage.output, usage.cacheRead, usage.cacheWrite]
|
|
22
|
+
.every((value) => Number.isSafeInteger(value) && value >= 0)
|
|
23
|
+
|| (usage.cacheWrite1h !== undefined && (!Number.isSafeInteger(usage.cacheWrite1h)
|
|
24
|
+
|| usage.cacheWrite1h < 0 || usage.cacheWrite1h > usage.cacheWrite))
|
|
25
|
+
|| !Number.isFinite(usage.cost.total) || usage.cost.total < 0
|
|
26
|
+
|| !Number.isFinite(usage.cost.output) || usage.cost.output <= 0
|
|
27
|
+
|| (classifierCostUsd !== undefined && (!Number.isFinite(classifierCostUsd) || classifierCostUsd < 0)))
|
|
28
|
+
return;
|
|
29
|
+
const extraCostUsd = (highOutput - usage.output) * usage.cost.output / usage.output;
|
|
30
|
+
if (extraCostUsd <= (classifierCostUsd ?? 0))
|
|
31
|
+
return;
|
|
32
|
+
const modelRef = { provider: model.provider, id: model.id };
|
|
33
|
+
const tokens = {
|
|
34
|
+
input: usage.input,
|
|
35
|
+
output: usage.output,
|
|
36
|
+
cacheRead: usage.cacheRead,
|
|
37
|
+
cacheWrite: usage.cacheWrite,
|
|
38
|
+
...(usage.cacheWrite1h === undefined ? {} : { cacheWrite1h: usage.cacheWrite1h }),
|
|
39
|
+
};
|
|
40
|
+
try {
|
|
41
|
+
await reporter.report({
|
|
42
|
+
category: 'output-optimization',
|
|
43
|
+
operation: 'dynamic-thinking',
|
|
44
|
+
baseline: {
|
|
45
|
+
model: modelRef, tokens: { ...tokens, output: highOutput },
|
|
46
|
+
costUsd: usage.cost.total + extraCostUsd,
|
|
47
|
+
},
|
|
48
|
+
actual: {
|
|
49
|
+
model: modelRef, tokens, costUsd: usage.cost.total + (classifierCostUsd ?? 0),
|
|
50
|
+
},
|
|
51
|
+
basis: { kind: 'estimated-baseline', method: DYNAMIC_THINKING_SAVINGS_METHOD },
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch { }
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=savings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savings.js","sourceRoot":"","sources":["../../src/dynamic-thinking/savings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Api, type Model } from '@earendil-works/pi-ai';
|
|
2
|
+
import { type Classifier, type ClassifierSessionEvidence } from '../classifier/index.js';
|
|
3
|
+
import type { FelanThinkingLevel } from '../thinking.js';
|
|
4
|
+
export declare function supportsDynamicThinking(model: Model<Api> | undefined): model is Model<Api>;
|
|
5
|
+
export declare function selectDynamicThinkingLevel(classifier: Classifier, model: Model<Api>, request: string, session: ClassifierSessionEvidence, current: FelanThinkingLevel, signal?: AbortSignal): Promise<FelanThinkingLevel | undefined>;
|
|
6
|
+
export interface DynamicThinkingDecision {
|
|
7
|
+
readonly level: FelanThinkingLevel;
|
|
8
|
+
readonly classifierCostUsd?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function evaluateDynamicThinkingLevel(classifier: Classifier, model: Model<Api>, request: string, session: ClassifierSessionEvidence, current: FelanThinkingLevel, signal?: AbortSignal): Promise<DynamicThinkingDecision | undefined>;
|
|
11
|
+
//# sourceMappingURL=selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/dynamic-thinking/selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAGL,KAAK,UAAU,EAEf,KAAK,yBAAyB,EAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAKzD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,CAQ1F;AAED,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,kBAAkB,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAEzC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,kBAAkB,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAyC9C"}
|