@fastpaca/cria 1.3.0 → 1.5.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 +51 -26
- package/dist/dsl/builder.d.ts +243 -0
- package/dist/dsl/builder.d.ts.map +1 -0
- package/dist/dsl/builder.js +458 -0
- package/dist/dsl/builder.js.map +1 -0
- package/dist/dsl/index.d.ts +71 -0
- package/dist/dsl/index.d.ts.map +1 -0
- package/dist/dsl/index.js +82 -0
- package/dist/dsl/index.js.map +1 -0
- package/dist/dsl/strategies.d.ts +29 -0
- package/dist/dsl/strategies.d.ts.map +1 -0
- package/dist/dsl/strategies.js +62 -0
- package/dist/dsl/strategies.js.map +1 -0
- package/dist/dsl/summary.d.ts +50 -0
- package/dist/dsl/summary.d.ts.map +1 -0
- package/dist/dsl/summary.js +56 -0
- package/dist/dsl/summary.js.map +1 -0
- package/dist/dsl/templating.d.ts +31 -0
- package/dist/dsl/templating.d.ts.map +1 -0
- package/dist/dsl/templating.js +83 -0
- package/dist/dsl/templating.js.map +1 -0
- package/dist/dsl/vector-search.d.ts +52 -0
- package/dist/dsl/vector-search.d.ts.map +1 -0
- package/dist/{components → dsl}/vector-search.js +12 -34
- package/dist/dsl/vector-search.js.map +1 -0
- package/dist/eval/index.d.ts +49 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +34 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/judge.d.ts +20 -0
- package/dist/eval/judge.d.ts.map +1 -0
- package/dist/eval/judge.js +59 -0
- package/dist/eval/judge.js.map +1 -0
- package/dist/index.d.ts +6 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -7
- package/dist/index.js.map +1 -1
- package/dist/instrumentation/otel.js +5 -14
- package/dist/instrumentation/otel.js.map +1 -1
- package/dist/providers/ai-sdk.d.ts +29 -0
- package/dist/providers/ai-sdk.d.ts.map +1 -0
- package/dist/providers/ai-sdk.js +104 -0
- package/dist/providers/ai-sdk.js.map +1 -0
- package/dist/providers/anthropic.d.ts +30 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +160 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/openai.d.ts +37 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +164 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/render.d.ts +24 -22
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +191 -63
- package/dist/render.js.map +1 -1
- package/dist/testing/plaintext.d.ts +28 -0
- package/dist/testing/plaintext.d.ts.map +1 -0
- package/dist/testing/plaintext.js +71 -0
- package/dist/testing/plaintext.js.map +1 -0
- package/dist/types.d.ts +202 -174
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +37 -100
- package/dist/types.js.map +1 -1
- package/package.json +11 -33
- package/dist/ai-sdk/index.d.ts +0 -68
- package/dist/ai-sdk/index.d.ts.map +0 -1
- package/dist/ai-sdk/index.js +0 -375
- package/dist/ai-sdk/index.js.map +0 -1
- package/dist/anthropic/index.d.ts +0 -102
- package/dist/anthropic/index.d.ts.map +0 -1
- package/dist/anthropic/index.js +0 -281
- package/dist/anthropic/index.js.map +0 -1
- package/dist/components/index.d.ts +0 -147
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/index.js +0 -181
- package/dist/components/index.js.map +0 -1
- package/dist/components/summary.d.ts +0 -90
- package/dist/components/summary.d.ts.map +0 -1
- package/dist/components/summary.js +0 -118
- package/dist/components/summary.js.map +0 -1
- package/dist/components/vector-search.d.ts +0 -70
- package/dist/components/vector-search.d.ts.map +0 -1
- package/dist/components/vector-search.js.map +0 -1
- package/dist/dsl.d.ts +0 -202
- package/dist/dsl.d.ts.map +0 -1
- package/dist/dsl.js +0 -320
- package/dist/dsl.js.map +0 -1
- package/dist/jsx/index.d.ts +0 -6
- package/dist/jsx/index.d.ts.map +0 -1
- package/dist/jsx/index.js +0 -7
- package/dist/jsx/index.js.map +0 -1
- package/dist/jsx/jsx-dev-runtime.d.ts +0 -2
- package/dist/jsx/jsx-dev-runtime.d.ts.map +0 -1
- package/dist/jsx/jsx-dev-runtime.js +0 -3
- package/dist/jsx/jsx-dev-runtime.js.map +0 -1
- package/dist/jsx/jsx-runtime.d.ts +0 -40
- package/dist/jsx/jsx-runtime.d.ts.map +0 -1
- package/dist/jsx/jsx-runtime.js +0 -40
- package/dist/jsx/jsx-runtime.js.map +0 -1
- package/dist/openai/index.d.ts +0 -73
- package/dist/openai/index.d.ts.map +0 -1
- package/dist/openai/index.js +0 -306
- package/dist/openai/index.js.map +0 -1
- package/dist/renderers/markdown.d.ts +0 -3
- package/dist/renderers/markdown.d.ts.map +0 -1
- package/dist/renderers/markdown.js +0 -43
- package/dist/renderers/markdown.js.map +0 -1
- package/dist/renderers/shared.d.ts +0 -82
- package/dist/renderers/shared.d.ts.map +0 -1
- package/dist/renderers/shared.js +0 -156
- package/dist/renderers/shared.js.map +0 -1
- package/dist/snapshot.d.ts +0 -47
- package/dist/snapshot.d.ts.map +0 -1
- package/dist/snapshot.js +0 -144
- package/dist/snapshot.js.map +0 -1
- package/dist/tokenizers.d.ts +0 -14
- package/dist/tokenizers.d.ts.map +0 -1
- package/dist/tokenizers.js +0 -45
- package/dist/tokenizers.js.map +0 -1
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { getEncoding } from "js-tiktoken";
|
|
2
|
+
import { ModelProvider, PromptRenderer } from "../types";
|
|
3
|
+
const encoder = getEncoding("cl100k_base");
|
|
4
|
+
const countText = (text) => encoder.encode(text).length;
|
|
5
|
+
export class OpenAIChatRenderer extends PromptRenderer {
|
|
6
|
+
render(layout) {
|
|
7
|
+
return layout.map((m) => {
|
|
8
|
+
if (m.role === "system") {
|
|
9
|
+
return { role: "system", content: m.text };
|
|
10
|
+
}
|
|
11
|
+
if (m.role === "user") {
|
|
12
|
+
return { role: "user", content: m.text };
|
|
13
|
+
}
|
|
14
|
+
if (m.role === "assistant") {
|
|
15
|
+
const result = {
|
|
16
|
+
role: "assistant",
|
|
17
|
+
};
|
|
18
|
+
if (m.text) {
|
|
19
|
+
result.content = m.text;
|
|
20
|
+
}
|
|
21
|
+
if (m.toolCalls && m.toolCalls.length > 0) {
|
|
22
|
+
result.tool_calls = m.toolCalls.map((tc) => ({
|
|
23
|
+
id: tc.toolCallId,
|
|
24
|
+
type: "function",
|
|
25
|
+
function: { name: tc.toolName, arguments: tc.input },
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
role: "tool",
|
|
32
|
+
tool_call_id: m.toolCallId,
|
|
33
|
+
content: m.output,
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class OpenAIResponsesRenderer extends PromptRenderer {
|
|
39
|
+
render(layout) {
|
|
40
|
+
let idx = 0;
|
|
41
|
+
return layout.flatMap((m) => {
|
|
42
|
+
if (m.role === "tool") {
|
|
43
|
+
return [
|
|
44
|
+
{
|
|
45
|
+
type: "function_call_output",
|
|
46
|
+
call_id: m.toolCallId,
|
|
47
|
+
output: m.output,
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
const role = m.role;
|
|
52
|
+
const items = [];
|
|
53
|
+
if (m.text) {
|
|
54
|
+
items.push({ role, content: m.text });
|
|
55
|
+
}
|
|
56
|
+
if (m.role === "assistant" && m.reasoning) {
|
|
57
|
+
items.push({
|
|
58
|
+
id: `reasoning_${idx++}`,
|
|
59
|
+
type: "reasoning",
|
|
60
|
+
summary: [{ type: "summary_text", text: m.reasoning }],
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (m.role === "assistant" && m.toolCalls) {
|
|
64
|
+
for (const tc of m.toolCalls) {
|
|
65
|
+
items.push({
|
|
66
|
+
type: "function_call",
|
|
67
|
+
call_id: tc.toolCallId,
|
|
68
|
+
name: tc.toolName,
|
|
69
|
+
arguments: tc.input,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return items;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function countChatMessageTokens(msg) {
|
|
78
|
+
let n = 0;
|
|
79
|
+
if ("content" in msg && typeof msg.content === "string") {
|
|
80
|
+
n += countText(msg.content);
|
|
81
|
+
}
|
|
82
|
+
if ("tool_calls" in msg && msg.tool_calls) {
|
|
83
|
+
for (const c of msg.tool_calls) {
|
|
84
|
+
n += countText(c.function.name + c.function.arguments);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return n;
|
|
88
|
+
}
|
|
89
|
+
function countResponseItemTokens(item) {
|
|
90
|
+
if ("content" in item && typeof item.content === "string") {
|
|
91
|
+
return countText(item.content);
|
|
92
|
+
}
|
|
93
|
+
if (item.type === "message" && Array.isArray(item.content)) {
|
|
94
|
+
return item.content.reduce((n, c) => n + (c.text ? countText(c.text) : 0), 0);
|
|
95
|
+
}
|
|
96
|
+
if (item.type === "reasoning") {
|
|
97
|
+
return item.summary.reduce((n, s) => n + countText(s.text), 0);
|
|
98
|
+
}
|
|
99
|
+
if (item.type === "function_call") {
|
|
100
|
+
return countText(item.name + item.arguments);
|
|
101
|
+
}
|
|
102
|
+
if (item.type === "function_call_output") {
|
|
103
|
+
return countText(item.output);
|
|
104
|
+
}
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
export class OpenAIChatProvider extends ModelProvider {
|
|
108
|
+
renderer = new OpenAIChatRenderer();
|
|
109
|
+
client;
|
|
110
|
+
model;
|
|
111
|
+
constructor(client, model) {
|
|
112
|
+
super();
|
|
113
|
+
this.client = client;
|
|
114
|
+
this.model = model;
|
|
115
|
+
}
|
|
116
|
+
countTokens(messages) {
|
|
117
|
+
return messages.reduce((n, m) => n + countChatMessageTokens(m), 0);
|
|
118
|
+
}
|
|
119
|
+
async completion(messages) {
|
|
120
|
+
const res = await this.client.chat.completions.create({
|
|
121
|
+
model: this.model,
|
|
122
|
+
messages,
|
|
123
|
+
});
|
|
124
|
+
return res.choices[0]?.message?.content ?? "";
|
|
125
|
+
}
|
|
126
|
+
async object(messages, schema) {
|
|
127
|
+
const res = await this.client.chat.completions.create({
|
|
128
|
+
model: this.model,
|
|
129
|
+
messages,
|
|
130
|
+
response_format: { type: "json_object" },
|
|
131
|
+
});
|
|
132
|
+
return schema.parse(JSON.parse(res.choices[0]?.message?.content ?? ""));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export class OpenAIResponsesProvider extends ModelProvider {
|
|
136
|
+
renderer = new OpenAIResponsesRenderer();
|
|
137
|
+
client;
|
|
138
|
+
model;
|
|
139
|
+
constructor(client, model) {
|
|
140
|
+
super();
|
|
141
|
+
this.client = client;
|
|
142
|
+
this.model = model;
|
|
143
|
+
}
|
|
144
|
+
countTokens(items) {
|
|
145
|
+
return items.reduce((n, i) => n + countResponseItemTokens(i), 0);
|
|
146
|
+
}
|
|
147
|
+
async completion(items) {
|
|
148
|
+
const res = await this.client.responses.create({
|
|
149
|
+
model: this.model,
|
|
150
|
+
input: items,
|
|
151
|
+
});
|
|
152
|
+
return res.output_text ?? "";
|
|
153
|
+
}
|
|
154
|
+
async object(items, schema) {
|
|
155
|
+
return schema.parse(JSON.parse(await this.completion(items)));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export function createProvider(client, model) {
|
|
159
|
+
return new OpenAIChatProvider(client, model);
|
|
160
|
+
}
|
|
161
|
+
export function createResponsesProvider(client, model) {
|
|
162
|
+
return new OpenAIResponsesProvider(client, model);
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
|
package/dist/render.d.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
import { FitError, type MaybePromise, type
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { FitError, type MaybePromise, type ModelProvider, type PromptScope, type PromptTree, type ProviderToolIO } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Render pipeline:
|
|
4
|
+
* - PromptTree carries provider-bound tool IO types.
|
|
5
|
+
* - layoutPrompt flattens the tree into a PromptLayout and enforces invariants.
|
|
6
|
+
* - The provider's renderer translates that layout into the provider payload.
|
|
7
|
+
* - Token counting is provider-owned and happens on rendered output.
|
|
8
|
+
*/
|
|
9
|
+
export interface RenderOptions<TRendered = unknown, TToolIO extends ProviderToolIO = ProviderToolIO> {
|
|
10
|
+
provider: ModelProvider<TRendered, TToolIO>;
|
|
5
11
|
budget?: number;
|
|
6
|
-
|
|
7
|
-
hooks?: RenderHooks;
|
|
12
|
+
hooks?: RenderHooks<TToolIO>;
|
|
8
13
|
}
|
|
9
|
-
export interface FitStartEvent {
|
|
10
|
-
element:
|
|
14
|
+
export interface FitStartEvent<TToolIO extends ProviderToolIO = ProviderToolIO> {
|
|
15
|
+
element: PromptTree<TToolIO>;
|
|
11
16
|
budget: number;
|
|
12
17
|
totalTokens: number;
|
|
13
18
|
}
|
|
@@ -16,14 +21,14 @@ export interface FitIterationEvent {
|
|
|
16
21
|
priority: number;
|
|
17
22
|
totalTokens: number;
|
|
18
23
|
}
|
|
19
|
-
export interface StrategyAppliedEvent {
|
|
20
|
-
target:
|
|
21
|
-
result:
|
|
24
|
+
export interface StrategyAppliedEvent<TToolIO extends ProviderToolIO = ProviderToolIO> {
|
|
25
|
+
target: PromptScope<TToolIO>;
|
|
26
|
+
result: PromptScope<TToolIO> | null;
|
|
22
27
|
priority: number;
|
|
23
28
|
iteration: number;
|
|
24
29
|
}
|
|
25
|
-
export interface FitCompleteEvent {
|
|
26
|
-
result:
|
|
30
|
+
export interface FitCompleteEvent<TToolIO extends ProviderToolIO = ProviderToolIO> {
|
|
31
|
+
result: PromptScope<TToolIO> | null;
|
|
27
32
|
iterations: number;
|
|
28
33
|
totalTokens: number;
|
|
29
34
|
}
|
|
@@ -33,16 +38,13 @@ export interface FitErrorEvent {
|
|
|
33
38
|
priority: number;
|
|
34
39
|
totalTokens: number;
|
|
35
40
|
}
|
|
36
|
-
export interface RenderHooks {
|
|
37
|
-
onFitStart?: (event: FitStartEvent) => MaybePromise<void>;
|
|
41
|
+
export interface RenderHooks<TToolIO extends ProviderToolIO = ProviderToolIO> {
|
|
42
|
+
onFitStart?: (event: FitStartEvent<TToolIO>) => MaybePromise<void>;
|
|
38
43
|
onFitIteration?: (event: FitIterationEvent) => MaybePromise<void>;
|
|
39
|
-
onStrategyApplied?: (event: StrategyAppliedEvent) => MaybePromise<void>;
|
|
40
|
-
onFitComplete?: (event: FitCompleteEvent) => MaybePromise<void>;
|
|
44
|
+
onStrategyApplied?: (event: StrategyAppliedEvent<TToolIO>) => MaybePromise<void>;
|
|
45
|
+
onFitComplete?: (event: FitCompleteEvent<TToolIO>) => MaybePromise<void>;
|
|
41
46
|
onFitError?: (event: FitErrorEvent) => MaybePromise<void>;
|
|
42
47
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
} ? TOutput : string;
|
|
46
|
-
export declare function render<TOptions extends RenderOptions>(element: MaybePromise<PromptElement>, { tokenizer, budget, renderer, hooks }: TOptions): Promise<RenderOutput<TOptions>>;
|
|
47
|
-
export {};
|
|
48
|
+
export declare function render<TRendered, TToolIO extends ProviderToolIO>(element: MaybePromise<PromptTree<TToolIO>>, options: RenderOptions<TRendered, TToolIO>): Promise<TRendered>;
|
|
49
|
+
export declare function assertValidMessageScope<TToolIO extends ProviderToolIO = ProviderToolIO>(root: PromptTree<TToolIO>): void;
|
|
48
50
|
//# sourceMappingURL=render.d.ts.map
|
package/dist/render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,QAAQ,EACR,KAAK,YAAY,EACjB,KAAK,aAAa,EAKlB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EAIpB,MAAM,SAAS,CAAC;AAEjB;;;;;;GAMG;AACH,MAAM,WAAW,aAAa,CAC5B,SAAS,GAAG,OAAO,EACnB,OAAO,SAAS,cAAc,GAAG,cAAc;IAG/C,QAAQ,EAAE,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAI5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa,CAC5B,OAAO,SAAS,cAAc,GAAG,cAAc;IAE/C,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB,CACnC,OAAO,SAAS,cAAc,GAAG,cAAc;IAE/C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB,CAC/B,OAAO,SAAS,cAAc,GAAG,cAAc;IAE/C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,QAAQ,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc;IAC1E,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IACnE,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAClE,iBAAiB,CAAC,EAAE,CAClB,KAAK,EAAE,oBAAoB,CAAC,OAAO,CAAC,KACjC,YAAY,CAAC,IAAI,CAAC,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IACzE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CAC3D;AAED,wBAAsB,MAAM,CAAC,SAAS,EAAE,OAAO,SAAS,cAAc,EACpE,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAC1C,OAAO,EAAE,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,GACzC,OAAO,CAAC,SAAS,CAAC,CA2BpB;AAsBD,wBAAgB,uBAAuB,CACrC,OAAO,SAAS,cAAc,GAAG,cAAc,EAC/C,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI,CAGjC"}
|
package/dist/render.js
CHANGED
|
@@ -1,30 +1,132 @@
|
|
|
1
|
-
import { markdownRenderer } from "./renderers/markdown";
|
|
2
1
|
import { FitError, } from "./types";
|
|
3
|
-
export async function render(element,
|
|
2
|
+
export async function render(element, options) {
|
|
3
|
+
// Data flow: PromptTree -> PromptLayout (flatten) -> provider.renderer -> provider.countTokens.
|
|
4
|
+
// The fit loop just re-renders and re-counts until we land under budget.
|
|
4
5
|
/*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Non-Promise thenables are intentionally unsupported.
|
|
6
|
+
* Rendering is budget-agnostic; fitting owns the budget and simply calls
|
|
7
|
+
* rendering to get total tokens. Keep that separation explicit here.
|
|
8
8
|
*/
|
|
9
9
|
const resolvedElement = element instanceof Promise ? await element : element;
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return (await resolvedRenderer.render(resolvedElement));
|
|
10
|
+
const provider = resolveProvider(resolvedElement, options.provider);
|
|
11
|
+
if (options.budget === undefined || options.budget === null) {
|
|
12
|
+
return renderOutput(resolvedElement, provider);
|
|
14
13
|
}
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
const fitted = await fitToBudget(resolvedElement, options.budget, provider, options.hooks, { provider });
|
|
15
|
+
if (!fitted) {
|
|
16
|
+
return renderOutput({ kind: "scope", priority: 0, children: [] }, provider);
|
|
17
|
+
}
|
|
18
|
+
return renderOutput(fitted, provider);
|
|
19
|
+
}
|
|
20
|
+
function renderOutput(root, provider) {
|
|
21
|
+
// Prompt tree composition is resolved before rendering; renderers only see layout.
|
|
22
|
+
const layout = layoutPrompt(root);
|
|
23
|
+
return provider.renderer.render(layout);
|
|
24
|
+
}
|
|
25
|
+
function renderAndCount(root, provider) {
|
|
26
|
+
// Tree -> layout -> renderer output, then provider-owned token counting.
|
|
27
|
+
const layout = layoutPrompt(root);
|
|
28
|
+
const output = provider.renderer.render(layout);
|
|
29
|
+
const tokens = provider.countTokens(output);
|
|
30
|
+
return { output, tokens };
|
|
31
|
+
}
|
|
32
|
+
export function assertValidMessageScope(root) {
|
|
33
|
+
// Enforce layout invariants by reusing the layout pass.
|
|
34
|
+
layoutPrompt(root);
|
|
35
|
+
}
|
|
36
|
+
function layoutPrompt(root) {
|
|
37
|
+
// Flatten tree to a list of opinionated messages.
|
|
38
|
+
// Traversal order is depth-first, left-to-right so layout is deterministic.
|
|
39
|
+
// This is the only place we validate message/part structure.
|
|
40
|
+
const messages = [];
|
|
41
|
+
const walk = (node) => {
|
|
42
|
+
if (node.kind === "message") {
|
|
43
|
+
messages.push(buildMessage(node));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
for (const child of node.children) {
|
|
47
|
+
walk(child);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
walk(root);
|
|
51
|
+
return messages;
|
|
52
|
+
}
|
|
53
|
+
function buildMessage(node) {
|
|
54
|
+
if (node.role === "tool") {
|
|
55
|
+
return buildToolMessage(node.children);
|
|
17
56
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
throw new Error("Token budgeting requires a tokenizer. Provide one to render(), or wrap your prompt in a provider that supplies a tokenizer (e.g. <OpenAIProvider>, <AnthropicProvider>, or <AISDKProvider>). See docs/how-to/fit-and-compaction.md for details.");
|
|
57
|
+
if (node.role === "assistant") {
|
|
58
|
+
return buildAssistantMessage(node.children);
|
|
21
59
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
60
|
+
return buildTextMessage(node.role, node.children);
|
|
61
|
+
}
|
|
62
|
+
function buildToolMessage(children) {
|
|
63
|
+
// Tool messages are a single tool result by construction.
|
|
64
|
+
if (children.length !== 1 || children[0]?.type !== "tool-result") {
|
|
65
|
+
throw new Error("Tool messages must contain exactly one tool result.");
|
|
66
|
+
}
|
|
67
|
+
const result = children[0];
|
|
68
|
+
return {
|
|
69
|
+
role: "tool",
|
|
70
|
+
toolCallId: result.toolCallId,
|
|
71
|
+
toolName: result.toolName,
|
|
72
|
+
output: result.output,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function buildAssistantMessage(children) {
|
|
76
|
+
const { text, reasoning, toolCalls } = collectAssistantParts(children);
|
|
77
|
+
const message = { role: "assistant", text };
|
|
78
|
+
if (reasoning.length > 0) {
|
|
79
|
+
message.reasoning = reasoning;
|
|
80
|
+
}
|
|
81
|
+
if (toolCalls.length > 0) {
|
|
82
|
+
message.toolCalls = toolCalls;
|
|
26
83
|
}
|
|
27
|
-
return
|
|
84
|
+
return message;
|
|
85
|
+
}
|
|
86
|
+
function collectAssistantParts(children) {
|
|
87
|
+
let text = "";
|
|
88
|
+
let reasoning = "";
|
|
89
|
+
const toolCalls = [];
|
|
90
|
+
for (const part of children) {
|
|
91
|
+
if (part.type === "text") {
|
|
92
|
+
text += part.text;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (part.type === "reasoning") {
|
|
96
|
+
reasoning += part.text;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (part.type === "tool-call") {
|
|
100
|
+
toolCalls.push(part);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (part.type === "tool-result") {
|
|
104
|
+
// Tool results must live in tool messages, not assistant messages.
|
|
105
|
+
throw new Error("Tool results must be inside a tool message.");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return { text, reasoning, toolCalls };
|
|
109
|
+
}
|
|
110
|
+
function buildTextMessage(role, children) {
|
|
111
|
+
// System/user messages are text-only; other parts are rejected here.
|
|
112
|
+
const text = collectTextParts(children);
|
|
113
|
+
if (role === "system") {
|
|
114
|
+
return { role: "system", text };
|
|
115
|
+
}
|
|
116
|
+
if (role === "user") {
|
|
117
|
+
return { role: "user", text };
|
|
118
|
+
}
|
|
119
|
+
throw new Error(`Unsupported message role: ${role}`);
|
|
120
|
+
}
|
|
121
|
+
function collectTextParts(children) {
|
|
122
|
+
let text = "";
|
|
123
|
+
for (const part of children) {
|
|
124
|
+
if (part.type !== "text") {
|
|
125
|
+
throw new Error("Only assistant messages may contain reasoning or tool calls.");
|
|
126
|
+
}
|
|
127
|
+
text += part.text;
|
|
128
|
+
}
|
|
129
|
+
return text;
|
|
28
130
|
}
|
|
29
131
|
async function safeInvoke(handler, event) {
|
|
30
132
|
if (!handler) {
|
|
@@ -32,46 +134,59 @@ async function safeInvoke(handler, event) {
|
|
|
32
134
|
}
|
|
33
135
|
await handler(event);
|
|
34
136
|
}
|
|
35
|
-
function
|
|
137
|
+
function resolveProvider(element, override) {
|
|
138
|
+
// Provider may come from the tree (provider scopes) or from render options.
|
|
139
|
+
// Either way, it must be a single consistent provider for the entire tree.
|
|
140
|
+
const providers = collectProviders(element);
|
|
36
141
|
if (override) {
|
|
37
|
-
|
|
142
|
+
if (providers.length > 0 && !providers.includes(override)) {
|
|
143
|
+
throw new Error("Render provider does not match provider in the tree.");
|
|
144
|
+
}
|
|
145
|
+
return override;
|
|
38
146
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return { ...providerResolution, source: "provider" };
|
|
147
|
+
if (providers.length === 0) {
|
|
148
|
+
throw new Error("Rendering requires a provider with a renderer.");
|
|
42
149
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
function findProviderTokenizer(element) {
|
|
46
|
-
const providerTokenizer = element.context?.provider?.tokenizer;
|
|
47
|
-
if (providerTokenizer) {
|
|
48
|
-
return {
|
|
49
|
-
tokenizer: providerTokenizer,
|
|
50
|
-
providerName: element.context?.provider?.name,
|
|
51
|
-
};
|
|
150
|
+
if (providers.length > 1) {
|
|
151
|
+
throw new Error("Multiple providers found in one prompt tree.");
|
|
52
152
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
153
|
+
const provider = providers[0];
|
|
154
|
+
if (!provider) {
|
|
155
|
+
throw new Error("Rendering requires a provider with a renderer.");
|
|
156
|
+
}
|
|
157
|
+
return provider;
|
|
158
|
+
}
|
|
159
|
+
function collectProviders(element) {
|
|
160
|
+
// Walk scopes and collect unique providers from context.
|
|
161
|
+
const found = [];
|
|
162
|
+
const visit = (node) => {
|
|
163
|
+
if (node.kind === "message") {
|
|
164
|
+
return;
|
|
56
165
|
}
|
|
57
|
-
const
|
|
58
|
-
if (found) {
|
|
59
|
-
|
|
166
|
+
const provider = node.context?.provider;
|
|
167
|
+
if (provider && !found.includes(provider)) {
|
|
168
|
+
found.push(provider);
|
|
60
169
|
}
|
|
61
|
-
|
|
62
|
-
|
|
170
|
+
for (const child of node.children) {
|
|
171
|
+
visit(child);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
visit(element);
|
|
175
|
+
return found;
|
|
63
176
|
}
|
|
64
|
-
async function fitToBudget(element, budget,
|
|
177
|
+
async function fitToBudget(element, budget, provider, hooks, baseContext) {
|
|
178
|
+
// Fit loop is render-driven: render+count, then apply the lowest-importance
|
|
179
|
+
// strategy, re-render, and repeat until we fit or cannot reduce further.
|
|
65
180
|
let current = element;
|
|
66
181
|
let iteration = 0;
|
|
67
|
-
let totalTokens =
|
|
182
|
+
let totalTokens = renderAndCount(element, provider).tokens;
|
|
68
183
|
await safeInvoke(hooks?.onFitStart, {
|
|
69
184
|
element,
|
|
70
185
|
budget,
|
|
71
186
|
totalTokens,
|
|
72
187
|
});
|
|
73
188
|
while (current && totalTokens > budget) {
|
|
74
|
-
iteration
|
|
189
|
+
iteration += 1;
|
|
75
190
|
const lowestImportancePriority = findLowestImportancePriority(current);
|
|
76
191
|
if (lowestImportancePriority === null) {
|
|
77
192
|
const error = new FitError({
|
|
@@ -95,16 +210,31 @@ async function fitToBudget(element, budget, tokenizer, tokenString, hooks) {
|
|
|
95
210
|
totalTokens,
|
|
96
211
|
});
|
|
97
212
|
const baseCtx = {
|
|
98
|
-
budget,
|
|
99
|
-
tokenizer,
|
|
100
|
-
tokenString,
|
|
101
213
|
totalTokens,
|
|
102
214
|
iteration,
|
|
103
215
|
};
|
|
104
|
-
const applied = await applyStrategiesAtPriority(current, lowestImportancePriority, baseCtx,
|
|
105
|
-
|
|
216
|
+
const applied = await applyStrategiesAtPriority(current, lowestImportancePriority, baseCtx, baseContext, hooks, iteration);
|
|
217
|
+
if (!applied.applied) {
|
|
218
|
+
const error = new FitError({
|
|
219
|
+
overBudgetBy: totalTokens - budget,
|
|
220
|
+
priority: lowestImportancePriority,
|
|
221
|
+
iteration,
|
|
222
|
+
budget,
|
|
223
|
+
totalTokens,
|
|
224
|
+
});
|
|
225
|
+
await safeInvoke(hooks?.onFitError, {
|
|
226
|
+
error,
|
|
227
|
+
iteration,
|
|
228
|
+
priority: lowestImportancePriority,
|
|
229
|
+
totalTokens,
|
|
230
|
+
});
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
233
|
+
if (applied.element && applied.element.kind !== "scope") {
|
|
234
|
+
throw new Error("Root scope was replaced by a message node.");
|
|
235
|
+
}
|
|
106
236
|
current = applied.element;
|
|
107
|
-
const nextTokens = current ?
|
|
237
|
+
const nextTokens = current ? renderAndCount(current, provider).tokens : 0;
|
|
108
238
|
if (nextTokens >= totalTokens) {
|
|
109
239
|
const error = new FitError({
|
|
110
240
|
overBudgetBy: nextTokens - budget,
|
|
@@ -130,12 +260,12 @@ async function fitToBudget(element, budget, tokenizer, tokenString, hooks) {
|
|
|
130
260
|
});
|
|
131
261
|
return current;
|
|
132
262
|
}
|
|
133
|
-
function findLowestImportancePriority(
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
263
|
+
function findLowestImportancePriority(node) {
|
|
264
|
+
if (node.kind === "message") {
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
let maxPriority = node.strategy ? node.priority : null;
|
|
268
|
+
for (const child of node.children) {
|
|
139
269
|
const childMax = findLowestImportancePriority(child);
|
|
140
270
|
maxPriority = maxNullable(maxPriority, childMax);
|
|
141
271
|
}
|
|
@@ -151,19 +281,17 @@ function maxNullable(a, b) {
|
|
|
151
281
|
return Math.max(a, b);
|
|
152
282
|
}
|
|
153
283
|
async function applyStrategiesAtPriority(element, priority, baseCtx, inheritedContext, hooks, iteration) {
|
|
154
|
-
|
|
155
|
-
|
|
284
|
+
if (element.kind === "message") {
|
|
285
|
+
return { element, applied: false };
|
|
286
|
+
}
|
|
287
|
+
// Bottom-up: rewrite children first so nested strategies get first crack.
|
|
288
|
+
// Element context overrides inherited context.
|
|
156
289
|
const mergedContext = element.context
|
|
157
290
|
? { ...inheritedContext, ...element.context }
|
|
158
291
|
: inheritedContext;
|
|
159
292
|
let childrenChanged = false;
|
|
160
293
|
const nextChildren = [];
|
|
161
294
|
for (const child of element.children) {
|
|
162
|
-
if (typeof child === "string") {
|
|
163
|
-
nextChildren.push(child);
|
|
164
|
-
continue;
|
|
165
|
-
}
|
|
166
|
-
// Pass merged context to children
|
|
167
295
|
const applied = await applyStrategiesAtPriority(child, priority, baseCtx, mergedContext, hooks, iteration);
|
|
168
296
|
if (applied.applied) {
|
|
169
297
|
childrenChanged = true;
|
package/dist/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|