@felan-ai/ext-output-style 0.3.0 → 0.4.1
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 +23 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/savings.d.ts +4 -0
- package/dist/savings.d.ts.map +1 -0
- package/dist/savings.js +33 -0
- package/dist/savings.js.map +1 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -36,6 +36,28 @@ The local TUI, CLI, `/settings`, and Agent Core consumers resolve these fields
|
|
|
36
36
|
before activating the extension for root and child sessions. A custom style
|
|
37
37
|
requires non-empty instructions.
|
|
38
38
|
|
|
39
|
+
## Savings measurement
|
|
40
|
+
|
|
41
|
+
Only the built-in `concise` style contributes a savings measurement. For each
|
|
42
|
+
successful assistant turn containing visible text, the extension estimates the
|
|
43
|
+
actual output as UTF-8 bytes divided by four and rounded up. It estimates the
|
|
44
|
+
disabled-style baseline as:
|
|
45
|
+
|
|
46
|
+
```text
|
|
47
|
+
ceil(actual visible-output estimate * 4187 / 3500)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
This uses the current repeated benchmark's pooled output-token result: 4,187
|
|
51
|
+
baseline tokens versus 3,500 concise tokens, a 16.4% reduction. The producer
|
|
52
|
+
only sees UTF-8 visible text, so this is a documented byte-to-token proxy rather
|
|
53
|
+
than an observed tokenizer count. The method identifier is
|
|
54
|
+
`concise-output-token-ratio-202609-v1`.
|
|
55
|
+
|
|
56
|
+
This measurement isolates the visible-output boundary and is not a claim of
|
|
57
|
+
whole-workflow savings; the benchmark's prompt tokens increased. Empty, errored,
|
|
58
|
+
aborted, or unattributed turns do not report. `explanatory` and `custom` have no
|
|
59
|
+
supported baseline and never contribute savings.
|
|
60
|
+
|
|
39
61
|
## Package boundary and requirements
|
|
40
62
|
|
|
41
63
|
The package owns the supported style names, built-in instructions, custom-text
|
|
@@ -61,6 +83,7 @@ pnpm --filter @felan-ai/ext-output-style test
|
|
|
61
83
|
- [Configuration](../../docs/user-guide/configuration.md#output-style)
|
|
62
84
|
- [Extension catalog](../../docs/reference/extension-catalog.md)
|
|
63
85
|
- [Architecture](../../docs/concepts/architecture.md)
|
|
86
|
+
- [Efficient execution and savings](../../docs/concepts/efficient-execution.md)
|
|
64
87
|
|
|
65
88
|
## Attribution
|
|
66
89
|
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,KAAK,cAAc,EAA0B,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,KAAK,cAAc,EAA0B,MAAM,sBAAsB,CAAC;AAGjJ,eAAO,MAAM,aAAa,+CAAgD,CAAC;AAC3E,MAAM,MAAM,WAAW,GAAG,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAEvD,eAAO,MAAM,oBAAoB,EAAE,WAAuB,CAAC;AAC3D,eAAO,MAAM,mBAAmB;;;EAe9B,CAAC;AA0BH,wBAAgB,gBAAgB,CAAC,KAAK,GAAE,OAA8B,GAAG,WAAW,CAKnF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,CAW3F;AAED,wBAAgB,0BAA0B,CACxC,KAAK,GAAE,OAA8B,EACrC,YAAY,CAAC,EAAE,OAAO,GACrB,cAAc,CAmBhB;AAED,QAAA,MAAM,oBAAoB,EAAE,cAGtB,CAAC;AAGP,eAAe,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { associateExtensionConfig, configField, defineExtensionConfig } from '@felan-ai/agent-core';
|
|
2
|
+
import { reportConciseSavings } from './savings.js';
|
|
2
3
|
export const OUTPUT_STYLES = ['concise', 'explanatory', 'custom'];
|
|
3
4
|
export const DEFAULT_OUTPUT_STYLE = 'concise';
|
|
4
5
|
export const OUTPUT_STYLE_CONFIG = defineExtensionConfig({
|
|
@@ -64,6 +65,13 @@ export function createOutputStyleExtension(value = DEFAULT_OUTPUT_STYLE, instruc
|
|
|
64
65
|
pi.on('before_agent_start', (event) => {
|
|
65
66
|
return { systemPrompt: `${event.systemPrompt}\n\n${section}` };
|
|
66
67
|
});
|
|
68
|
+
if (style === 'concise') {
|
|
69
|
+
pi.on('turn_end', (event, ctx) => {
|
|
70
|
+
if (event.message.role !== 'assistant')
|
|
71
|
+
return;
|
|
72
|
+
reportConciseSavings(pi.savings, ctx.model === undefined ? undefined : { provider: ctx.model.provider, id: ctx.model.id }, event.message);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
67
75
|
};
|
|
68
76
|
}
|
|
69
77
|
const outputStyleExtension = ((pi) => createOutputStyleExtension(pi.config?.style ?? DEFAULT_OUTPUT_STYLE, pi.config?.instructions)(pi));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,WAAW,EAAE,qBAAqB,EAA+C,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AssistantMessage, SavingsModelReference, SavingsReporter } from '@felan-ai/agent-core';
|
|
2
|
+
export declare const CONCISE_SAVINGS_METHOD = "concise-output-token-ratio-202609-v1";
|
|
3
|
+
export declare function reportConciseSavings(reporter: SavingsReporter | undefined, model: SavingsModelReference | undefined, message: AssistantMessage): void;
|
|
4
|
+
//# sourceMappingURL=savings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savings.d.ts","sourceRoot":"","sources":["../src/savings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAEhB,qBAAqB,EACrB,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAK9B,eAAO,MAAM,sBAAsB,yCAAyC,CAAC;AAE7E,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,GAAG,SAAS,EACrC,KAAK,EAAE,qBAAqB,GAAG,SAAS,EACxC,OAAO,EAAE,gBAAgB,GACxB,IAAI,CAgBN"}
|
package/dist/savings.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const CONCISE_BASELINE_OUTPUT_TOKENS = 4_187;
|
|
2
|
+
const CONCISE_ACTUAL_OUTPUT_TOKENS = 3_500;
|
|
3
|
+
export const CONCISE_SAVINGS_METHOD = 'concise-output-token-ratio-202609-v1';
|
|
4
|
+
export function reportConciseSavings(reporter, model, message) {
|
|
5
|
+
if (!reporter || !model || message.stopReason === 'error' || message.stopReason === 'aborted')
|
|
6
|
+
return;
|
|
7
|
+
const actualOutput = estimateVisibleTextTokens(message.content);
|
|
8
|
+
if (actualOutput === 0)
|
|
9
|
+
return;
|
|
10
|
+
const baselineOutput = Math.ceil(actualOutput * CONCISE_BASELINE_OUTPUT_TOKENS / CONCISE_ACTUAL_OUTPUT_TOKENS);
|
|
11
|
+
const measurement = {
|
|
12
|
+
category: 'output-optimization',
|
|
13
|
+
operation: 'concise-response',
|
|
14
|
+
baseline: { model, tokens: { input: 0, output: baselineOutput } },
|
|
15
|
+
actual: { model, tokens: { input: 0, output: actualOutput } },
|
|
16
|
+
basis: { kind: 'estimated-baseline', method: CONCISE_SAVINGS_METHOD },
|
|
17
|
+
dimensions: { techniques: ['concise'] },
|
|
18
|
+
};
|
|
19
|
+
try {
|
|
20
|
+
void reporter.report(measurement).catch(() => { });
|
|
21
|
+
}
|
|
22
|
+
catch { }
|
|
23
|
+
}
|
|
24
|
+
function estimateVisibleTextTokens(content) {
|
|
25
|
+
let bytes = 0;
|
|
26
|
+
for (const block of content) {
|
|
27
|
+
if (block.type !== 'text')
|
|
28
|
+
continue;
|
|
29
|
+
bytes += new TextEncoder().encode(block.text).byteLength;
|
|
30
|
+
}
|
|
31
|
+
return Math.ceil(bytes / 4);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=savings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savings.js","sourceRoot":"","sources":["../src/savings.ts"],"names":[],"mappings":"AAOA,MAAM,8BAA8B,GAAG,KAAK,CAAC;AAC7C,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAE3C,MAAM,CAAC,MAAM,sBAAsB,GAAG,sCAAsC,CAAC;AAE7E,MAAM,UAAU,oBAAoB,CAClC,QAAqC,EACrC,KAAwC,EACxC,OAAyB;IAEzB,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO;IACtG,MAAM,YAAY,GAAG,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,IAAI,YAAY,KAAK,CAAC;QAAE,OAAO;IAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,8BAA8B,GAAG,4BAA4B,CAAC,CAAC;IAC/G,MAAM,WAAW,GAAuB;QACtC,QAAQ,EAAE,qBAAqB;QAC/B,SAAS,EAAE,kBAAkB;QAC7B,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE;QACjE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE;QAC7D,KAAK,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,sBAAsB,EAAE;QACrE,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE;KACxC,CAAC;IACF,IAAI,CAAC;QACH,KAAK,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAED,SAAS,yBAAyB,CAAC,OAAoC;IACrE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QACpC,KAAK,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC9B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@felan-ai/ext-output-style",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Portable output-style system prompt extension for Felan",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -25,10 +25,10 @@
|
|
|
25
25
|
}
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
-
"@felan-ai/agent-core": "^0.
|
|
28
|
+
"@felan-ai/agent-core": "^0.6.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@felan-ai/agent-core": "0.
|
|
31
|
+
"@felan-ai/agent-core": "0.6.0"
|
|
32
32
|
},
|
|
33
33
|
"publishConfig": {
|
|
34
34
|
"access": "public",
|