@modelprofile.com/flexharness 10.13.0 → 10.14.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.
@@ -22,11 +22,36 @@ When constructing the summary, try to stick to this template:
22
22
  ---`;
23
23
  /** The instructions of a summary call whose caller names none of the conversation's own. */
24
24
  const COMPACTION_INSTRUCTIONS = 'You summarize a conversation so that another agent can continue its work.';
25
+ /** Added to the summary request when it carries the conversation's tools. */
26
+ const NO_TOOL_CALLS = 'Do not call any tool. Reply with the summary text only.';
27
+ /**
28
+ * Whether the summary request should carry the turns' tool definitions. A cached prefix is read at
29
+ * about a tenth of the input price (Anthropic and OpenAI), so repeating the turns' prefix costs about
30
+ * 0.1 x (tools + history), while a request without the tools reads nothing and pays the history in
31
+ * full: the tools pay their way while they are less than nine times the history.
32
+ */
33
+ async function toolsRepayTheirPrefix(tools, messages) {
34
+ let toolBytes = 0;
35
+ for (const [name, definition] of Object.entries(tools)) {
36
+ const schema = definition.type === 'provider' ? definition.args : await plugins.asSchema(definition.inputSchema).jsonSchema;
37
+ toolBytes += name.length + JSON.stringify([definition.description ?? '', schema ?? null]).length;
38
+ }
39
+ return toolBytes <= 9 * JSON.stringify(messages).length;
40
+ }
41
+ /** A tool set's definitions without anything that runs: no `execute`, no input callbacks. */
42
+ function toolDefinitions(tools) {
43
+ return Object.fromEntries(Object.entries(tools).map(([name, definition]) => {
44
+ const { execute: _execute, onInputStart: _onInputStart, onInputDelta: _onInputDelta, onInputAvailable: _onInputAvailable, ...rest } = definition;
45
+ return [name, rest];
46
+ }));
47
+ }
25
48
  /**
26
49
  * Compacts a message history into a summary.
27
50
  *
28
51
  * The summary is one streamed, instructed model call, the shape every agent turn has, so it reaches
29
- * a provider that serves only that shape (the ChatGPT Codex backend) the way the turns do.
52
+ * a provider that serves only that shape (the ChatGPT Codex backend) the way the turns do. With the
53
+ * turns' `tools` it also repeats their prefix, which the provider has cached; a model that answers
54
+ * it with a tool call instead of a summary is asked once more with tool use turned off.
30
55
  *
31
56
  * @param model The same model used by runAgent, or a cheaper small model
32
57
  * @param messages The full message history that overflowed
@@ -34,9 +59,12 @@ const COMPACTION_INSTRUCTIONS = 'You summarize a conversation so that another ag
34
59
  * @returns A minimal ModelMessage[] containing the summary as context
35
60
  */
36
61
  export async function compactMessages(model, messages, options = {}) {
62
+ const tools = options.tools && Object.keys(options.tools).length > 0 && await toolsRepayTheirPrefix(options.tools, messages)
63
+ ? toolDefinitions(options.tools)
64
+ : undefined;
37
65
  const prompt = [
38
66
  ...messages,
39
- { role: 'user', content: COMPACTION_PROMPT },
67
+ { role: 'user', content: tools ? `${COMPACTION_PROMPT}\n\n${NO_TOOL_CALLS}` : COMPACTION_PROMPT },
40
68
  ];
41
69
  const reportUsage = options.reportUsage;
42
70
  const modelCalls = reportUsage
@@ -61,41 +89,54 @@ export async function compactMessages(model, messages, options = {}) {
61
89
  },
62
90
  })
63
91
  : model;
64
- let streamError;
65
- try {
66
- const result = plugins.streamText({
67
- model: observedModel,
68
- instructions: options.system ?? COMPACTION_INSTRUCTIONS,
69
- messages: prompt,
70
- allowSystemInMessages: true,
71
- ...(options.providerOptions ? { providerOptions: options.providerOptions } : {}),
72
- abortSignal: options.abortSignal,
73
- onError: ({ error }) => {
74
- streamError ??= error;
75
- },
76
- ...(modelCalls
77
- ? {
78
- onLanguageModelCallEnd: ({ modelId, usage }) => {
79
- modelCalls.end(modelId, usage);
80
- },
81
- }
82
- : {}),
83
- });
84
- let summary = '';
85
- for await (const delta of result.textStream)
86
- summary += delta;
87
- // A stream that fails delivers its error to onError and ends, and an aborted stream just ends;
88
- // either way the summary is incomplete and must not replace the history.
89
- if (streamError !== undefined)
90
- throw streamError;
91
- options.abortSignal?.throwIfAborted();
92
- modelCalls?.settle('missing');
93
- return summaryMessages(summary);
94
- }
95
- catch (error) {
96
- modelCalls?.settle(options.abortSignal?.aborted ? 'aborted' : 'failed');
97
- throw streamError ?? error;
98
- }
92
+ // The summary is asked for in the shape of a turn, the tools offered as the turns offer them. A
93
+ // model that calls a tool instead of answering is asked again with tool use turned off, which
94
+ // keeps the tool definitions and so still the cached tools and instructions.
95
+ const summarize = async (toolChoice) => {
96
+ let streamError;
97
+ try {
98
+ const result = plugins.streamText({
99
+ model: observedModel,
100
+ instructions: options.system ?? COMPACTION_INSTRUCTIONS,
101
+ messages: prompt,
102
+ allowSystemInMessages: true,
103
+ ...(tools ? { tools, ...(toolChoice ? { toolChoice } : {}) } : {}),
104
+ ...(options.providerOptions ? { providerOptions: options.providerOptions } : {}),
105
+ abortSignal: options.abortSignal,
106
+ onError: ({ error }) => {
107
+ streamError ??= error;
108
+ },
109
+ ...(modelCalls
110
+ ? {
111
+ onLanguageModelCallEnd: ({ modelId, usage }) => {
112
+ modelCalls.end(modelId, usage);
113
+ },
114
+ }
115
+ : {}),
116
+ });
117
+ let summary = '';
118
+ for await (const delta of result.textStream)
119
+ summary += delta;
120
+ // A stream that fails delivers its error to onError and ends, and an aborted stream just ends;
121
+ // either way the summary is incomplete and must not replace the history.
122
+ if (streamError !== undefined)
123
+ throw streamError;
124
+ options.abortSignal?.throwIfAborted();
125
+ modelCalls?.settle('missing');
126
+ return { summary, calledTools: tools !== undefined && (await result.toolCalls).length > 0 };
127
+ }
128
+ catch (error) {
129
+ modelCalls?.settle(options.abortSignal?.aborted ? 'aborted' : 'failed');
130
+ throw streamError ?? error;
131
+ }
132
+ };
133
+ // A provider-executed tool, such as a web search, would run on the provider's side before the
134
+ // retry could prevent it: with one in the set, tool use is off from the start.
135
+ const providerExecuted = tools !== undefined && Object.values(tools).some((definition) => definition.type === 'provider');
136
+ let { summary, calledTools } = await summarize(providerExecuted ? 'none' : undefined);
137
+ if (calledTools && !summary.trim())
138
+ ({ summary } = await summarize('none'));
139
+ return summaryMessages(summary);
99
140
  }
100
141
  function summaryMessages(summary) {
101
142
  return [
@@ -105,4 +146,4 @@ function summaryMessages(summary) {
105
146
  },
106
147
  ];
107
148
  }
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jb21wYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfY29tcGFjdGlvbi9zbWFydGFnZW50LmNvbXBhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxpQkFBaUIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFvQnRCLENBQUM7QUFFTCw0RkFBNEY7QUFDNUYsTUFBTSx1QkFBdUIsR0FBRywyRUFBMkUsQ0FBQztBQXdCNUc7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUNuQyxLQUFvQyxFQUNwQyxRQUFnQyxFQUNoQyxVQUFtQyxFQUFFO0lBRXJDLE1BQU0sTUFBTSxHQUEyQjtRQUNyQyxHQUFHLFFBQVE7UUFDWCxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFO0tBQzdDLENBQUM7SUFDRixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO0lBQ3hDLE1BQU0sVUFBVSxHQUFHLFdBQVc7UUFDNUIsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxXQUFXLENBQUM7UUFDN0QsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNkLDZGQUE2RjtJQUM3RixnR0FBZ0c7SUFDaEcsTUFBTSxhQUFhLEdBQUcsVUFBVTtRQUM5QixDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1lBQ3hCLEtBQUs7WUFDTCxVQUFVLEVBQUU7Z0JBQ1YsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO29CQUN6QyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ25CLElBQUksQ0FBQzt3QkFDSCxPQUFPLE1BQU0sUUFBUSxFQUFFLENBQUM7b0JBQzFCLENBQUM7b0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzt3QkFDZixVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUN0RSxNQUFNLEtBQUssQ0FBQztvQkFDZCxDQUFDO2dCQUNILENBQUM7YUFDRjtTQUNGLENBQUM7UUFDSixDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ1YsSUFBSSxXQUFvQixDQUFDO0lBQ3pCLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDaEMsS0FBSyxFQUFFLGFBQWE7WUFDcEIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksdUJBQXVCO1lBQ3ZELFFBQVEsRUFBRSxNQUFNO1lBQ2hCLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hGLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztZQUNoQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7Z0JBQ3JCLFdBQVcsS0FBSyxLQUFLLENBQUM7WUFDeEIsQ0FBQztZQUNELEdBQUcsQ0FBQyxVQUFVO2dCQUNaLENBQUMsQ0FBQztvQkFDRSxzQkFBc0IsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7d0JBQzdDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNqQyxDQUFDO2lCQUNGO2dCQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDUixDQUFDLENBQUM7UUFDSCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksS0FBSyxDQUFDO1FBQzlELCtGQUErRjtRQUMvRix5RUFBeUU7UUFDekUsSUFBSSxXQUFXLEtBQUssU0FBUztZQUFFLE1BQU0sV0FBVyxDQUFDO1FBQ2pELE9BQU8sQ0FBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDdEMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixPQUFPLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEUsTUFBTSxXQUFXLElBQUksS0FBSyxDQUFDO0lBQzdCLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsT0FBZTtJQUN0QyxPQUFPO1FBQ0w7WUFDRSxJQUFJLEVBQUUsTUFBTTtZQUNaLE9BQU8sRUFBRSxzQ0FBc0MsT0FBTywyQ0FBMkM7U0FDbEc7S0FDRixDQUFDO0FBQ0osQ0FBQyJ9
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jb21wYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfY29tcGFjdGlvbi9zbWFydGFnZW50LmNvbXBhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxpQkFBaUIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFvQnRCLENBQUM7QUFFTCw0RkFBNEY7QUFDNUYsTUFBTSx1QkFBdUIsR0FBRywyRUFBMkUsQ0FBQztBQUU1Ryw2RUFBNkU7QUFDN0UsTUFBTSxhQUFhLEdBQUcseURBQXlELENBQUM7QUErQmhGOzs7OztHQUtHO0FBQ0gsS0FBSyxVQUFVLHFCQUFxQixDQUFDLEtBQXNCLEVBQUUsUUFBZ0M7SUFDM0YsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQzVILFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDbkcsQ0FBQztJQUNELE9BQU8sU0FBUyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUMxRCxDQUFDO0FBRUQsNkZBQTZGO0FBQzdGLFNB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
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "author": "Task Venture Capital GmbH",
3
3
  "license": "MIT",
4
4
  "name": "@modelprofile.com/flexharness",
5
- "version": "10.13.0",
5
+ "version": "10.14.0",
6
6
  "type": "module",
7
7
  "description": "Managed agent sessions with tools, MCP, chat, OCR, documents and browser control through focused subpath imports.",
8
8
  "main": "./dist_ts/index.js",
@@ -75,8 +75,8 @@
75
75
  },
76
76
  "dependencies": {
77
77
  "@cfworker/json-schema": "^4.1.1",
78
- "@modelprofile.com/flexharness-agent": "10.13.0",
79
- "@modelprofile.com/flexharness-models": "10.13.0",
78
+ "@modelprofile.com/flexharness-agent": "10.14.0",
79
+ "@modelprofile.com/flexharness-models": "10.14.0",
80
80
  "@push.rocks/smartrequest": "^5.5.1",
81
81
  "ai": "^7.0.111",
82
82
  "zod": "^4.6.5"
@@ -93,7 +93,10 @@
93
93
  "lit": "^3.2.0",
94
94
  "@types/react": "^19.0.0",
95
95
  "@lossless.org/client": "^1.17.0",
96
- "@design.estate/dees-catalog": "^17.0.0 || ^19.5.0 || ^20.0.0 || ^21.0.0"
96
+ "@design.estate/dees-catalog": "^17.0.0 || ^19.5.0 || ^20.0.0 || ^21.0.0",
97
+ "quickjs-emscripten-core": "^0.32.0",
98
+ "@jitl/quickjs-ng-wasmfile-release-sync": "^0.32.0",
99
+ "amaro": "^1.2.1"
97
100
  },
98
101
  "peerDependenciesMeta": {
99
102
  "@modelcontextprotocol/sdk": {
@@ -131,6 +134,15 @@
131
134
  },
132
135
  "@design.estate/dees-catalog": {
133
136
  "optional": true
137
+ },
138
+ "quickjs-emscripten-core": {
139
+ "optional": true
140
+ },
141
+ "@jitl/quickjs-ng-wasmfile-release-sync": {
142
+ "optional": true
143
+ },
144
+ "amaro": {
145
+ "optional": true
134
146
  }
135
147
  },
136
148
  "engines": {
package/readme.md CHANGED
@@ -1026,7 +1026,7 @@ A `contextCompactor` states which model to compact with from the model the compa
1026
1026
 
1027
1027
  A compactor uses `resolvedModel.model` directly, and resolves `modelHint` the way its model resolver resolves a prompt's `modelHint`. Only when neither member is present, because nothing dispatched states a model, does the host choose the compaction model itself.
1028
1028
 
1029
- A `context-overflow` or `context-budget` compaction also carries `system` and `providerOptions`: the instructions and the provider options (cache options applied, so `store: false` on OpenAI) the run's turns are sent with. `compactMessages()` sends its summary call with them as one streamed call, the shape of every turn, so a compactor that passes its options through reaches the provider the way the run does. Without `system` it sends its own instructions.
1029
+ A `context-overflow` or `context-budget` compaction also carries `system` and `providerOptions`: the instructions and the provider options (cache options applied, so `store: false` on OpenAI) the run's turns are sent with. A `context-budget` compaction on a provider that caches the prefix also carries the turns' `tools`. `compactMessages()` sends its summary call with them as one streamed call, the shape of every turn, with the tools' definitions but none of their code, so a compactor that passes its options through repeats the run's prefix and reads it from the provider's prompt cache; definitions that outweigh the history nine times are left out. Without `system` it sends its own instructions.
1030
1030
 
1031
1031
  ```typescript
1032
1032
  agentSessionPolicy: {
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@modelprofile.com/flexharness',
6
- version: '10.13.0',
6
+ version: '10.14.0',
7
7
  description: 'The FlexHarness toolbox source repository and shared dependency catalog.'
8
8
  }