@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.
Files changed (119) hide show
  1. package/README.md +51 -26
  2. package/dist/dsl/builder.d.ts +243 -0
  3. package/dist/dsl/builder.d.ts.map +1 -0
  4. package/dist/dsl/builder.js +458 -0
  5. package/dist/dsl/builder.js.map +1 -0
  6. package/dist/dsl/index.d.ts +71 -0
  7. package/dist/dsl/index.d.ts.map +1 -0
  8. package/dist/dsl/index.js +82 -0
  9. package/dist/dsl/index.js.map +1 -0
  10. package/dist/dsl/strategies.d.ts +29 -0
  11. package/dist/dsl/strategies.d.ts.map +1 -0
  12. package/dist/dsl/strategies.js +62 -0
  13. package/dist/dsl/strategies.js.map +1 -0
  14. package/dist/dsl/summary.d.ts +50 -0
  15. package/dist/dsl/summary.d.ts.map +1 -0
  16. package/dist/dsl/summary.js +56 -0
  17. package/dist/dsl/summary.js.map +1 -0
  18. package/dist/dsl/templating.d.ts +31 -0
  19. package/dist/dsl/templating.d.ts.map +1 -0
  20. package/dist/dsl/templating.js +83 -0
  21. package/dist/dsl/templating.js.map +1 -0
  22. package/dist/dsl/vector-search.d.ts +52 -0
  23. package/dist/dsl/vector-search.d.ts.map +1 -0
  24. package/dist/{components → dsl}/vector-search.js +12 -34
  25. package/dist/dsl/vector-search.js.map +1 -0
  26. package/dist/eval/index.d.ts +49 -0
  27. package/dist/eval/index.d.ts.map +1 -0
  28. package/dist/eval/index.js +34 -0
  29. package/dist/eval/index.js.map +1 -0
  30. package/dist/eval/judge.d.ts +20 -0
  31. package/dist/eval/judge.d.ts.map +1 -0
  32. package/dist/eval/judge.js +59 -0
  33. package/dist/eval/judge.js.map +1 -0
  34. package/dist/index.d.ts +6 -10
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +4 -7
  37. package/dist/index.js.map +1 -1
  38. package/dist/instrumentation/otel.js +5 -14
  39. package/dist/instrumentation/otel.js.map +1 -1
  40. package/dist/providers/ai-sdk.d.ts +29 -0
  41. package/dist/providers/ai-sdk.d.ts.map +1 -0
  42. package/dist/providers/ai-sdk.js +104 -0
  43. package/dist/providers/ai-sdk.js.map +1 -0
  44. package/dist/providers/anthropic.d.ts +30 -0
  45. package/dist/providers/anthropic.d.ts.map +1 -0
  46. package/dist/providers/anthropic.js +160 -0
  47. package/dist/providers/anthropic.js.map +1 -0
  48. package/dist/providers/openai.d.ts +37 -0
  49. package/dist/providers/openai.d.ts.map +1 -0
  50. package/dist/providers/openai.js +164 -0
  51. package/dist/providers/openai.js.map +1 -0
  52. package/dist/render.d.ts +24 -22
  53. package/dist/render.d.ts.map +1 -1
  54. package/dist/render.js +191 -63
  55. package/dist/render.js.map +1 -1
  56. package/dist/testing/plaintext.d.ts +28 -0
  57. package/dist/testing/plaintext.d.ts.map +1 -0
  58. package/dist/testing/plaintext.js +71 -0
  59. package/dist/testing/plaintext.js.map +1 -0
  60. package/dist/types.d.ts +202 -174
  61. package/dist/types.d.ts.map +1 -1
  62. package/dist/types.js +37 -100
  63. package/dist/types.js.map +1 -1
  64. package/package.json +11 -33
  65. package/dist/ai-sdk/index.d.ts +0 -68
  66. package/dist/ai-sdk/index.d.ts.map +0 -1
  67. package/dist/ai-sdk/index.js +0 -375
  68. package/dist/ai-sdk/index.js.map +0 -1
  69. package/dist/anthropic/index.d.ts +0 -102
  70. package/dist/anthropic/index.d.ts.map +0 -1
  71. package/dist/anthropic/index.js +0 -281
  72. package/dist/anthropic/index.js.map +0 -1
  73. package/dist/components/index.d.ts +0 -147
  74. package/dist/components/index.d.ts.map +0 -1
  75. package/dist/components/index.js +0 -181
  76. package/dist/components/index.js.map +0 -1
  77. package/dist/components/summary.d.ts +0 -90
  78. package/dist/components/summary.d.ts.map +0 -1
  79. package/dist/components/summary.js +0 -118
  80. package/dist/components/summary.js.map +0 -1
  81. package/dist/components/vector-search.d.ts +0 -70
  82. package/dist/components/vector-search.d.ts.map +0 -1
  83. package/dist/components/vector-search.js.map +0 -1
  84. package/dist/dsl.d.ts +0 -202
  85. package/dist/dsl.d.ts.map +0 -1
  86. package/dist/dsl.js +0 -320
  87. package/dist/dsl.js.map +0 -1
  88. package/dist/jsx/index.d.ts +0 -6
  89. package/dist/jsx/index.d.ts.map +0 -1
  90. package/dist/jsx/index.js +0 -7
  91. package/dist/jsx/index.js.map +0 -1
  92. package/dist/jsx/jsx-dev-runtime.d.ts +0 -2
  93. package/dist/jsx/jsx-dev-runtime.d.ts.map +0 -1
  94. package/dist/jsx/jsx-dev-runtime.js +0 -3
  95. package/dist/jsx/jsx-dev-runtime.js.map +0 -1
  96. package/dist/jsx/jsx-runtime.d.ts +0 -40
  97. package/dist/jsx/jsx-runtime.d.ts.map +0 -1
  98. package/dist/jsx/jsx-runtime.js +0 -40
  99. package/dist/jsx/jsx-runtime.js.map +0 -1
  100. package/dist/openai/index.d.ts +0 -73
  101. package/dist/openai/index.d.ts.map +0 -1
  102. package/dist/openai/index.js +0 -306
  103. package/dist/openai/index.js.map +0 -1
  104. package/dist/renderers/markdown.d.ts +0 -3
  105. package/dist/renderers/markdown.d.ts.map +0 -1
  106. package/dist/renderers/markdown.js +0 -43
  107. package/dist/renderers/markdown.js.map +0 -1
  108. package/dist/renderers/shared.d.ts +0 -82
  109. package/dist/renderers/shared.d.ts.map +0 -1
  110. package/dist/renderers/shared.js +0 -156
  111. package/dist/renderers/shared.js.map +0 -1
  112. package/dist/snapshot.d.ts +0 -47
  113. package/dist/snapshot.d.ts.map +0 -1
  114. package/dist/snapshot.js +0 -144
  115. package/dist/snapshot.js.map +0 -1
  116. package/dist/tokenizers.d.ts +0 -14
  117. package/dist/tokenizers.d.ts.map +0 -1
  118. package/dist/tokenizers.js +0 -45
  119. 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 PromptElement, type PromptRenderer, type Tokenizer } from "./types";
2
- export interface RenderOptions {
3
- tokenizer?: Tokenizer;
4
- /** Token budget. Omit for unlimited. */
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
- renderer?: PromptRenderer<unknown>;
7
- hooks?: RenderHooks;
12
+ hooks?: RenderHooks<TToolIO>;
8
13
  }
9
- export interface FitStartEvent {
10
- element: PromptElement;
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: PromptElement;
21
- result: PromptElement | null;
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: PromptElement | null;
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
- type RenderOutput<TOptions extends RenderOptions> = TOptions extends {
44
- renderer: PromptRenderer<infer TOutput>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,QAAQ,EACR,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EAEnB,KAAK,SAAS,EACf,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACnC,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,aAAa,CAAC;IACvB,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;IACnC,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,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;IAC1B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAClE,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IACxE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAChE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CAC3D;AAED,KAAK,YAAY,CAAC,QAAQ,SAAS,aAAa,IAAI,QAAQ,SAAS;IACnE,QAAQ,EAAE,cAAc,CAAC,MAAM,OAAO,CAAC,CAAC;CACzC,GACG,OAAO,GACP,MAAM,CAAC;AAEX,wBAAsB,MAAM,CAAC,QAAQ,SAAS,aAAa,EACzD,OAAO,EAAE,YAAY,CAAC,aAAa,CAAC,EACpC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,QAAQ,GAC/C,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CA4CjC"}
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, { tokenizer, budget, renderer, hooks }) {
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
- * Builders and the optional JSX runtime both return a PromptElement (or Promise).
6
- * render() awaits the root value and does not walk/normalize children here.
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 resolvedRenderer = (renderer ?? markdownRenderer);
11
- // Skip fitting if no budget specified (unlimited)
12
- if (budget === undefined || budget === null) {
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
- if (budget <= 0) {
16
- return resolvedRenderer.empty();
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
- const tokenizerResolution = resolveTokenizer(resolvedElement, tokenizer);
19
- if (!tokenizerResolution) {
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
- const tokenizerFn = tokenizerResolution.tokenizer;
23
- const fitted = await fitToBudget(resolvedElement, budget, tokenizerFn, resolvedRenderer.tokenString, hooks);
24
- if (!fitted) {
25
- return resolvedRenderer.empty();
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 (await resolvedRenderer.render(fitted));
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 resolveTokenizer(element, override) {
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
- return { tokenizer: override, source: "options" };
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
- const providerResolution = findProviderTokenizer(element);
40
- if (providerResolution) {
41
- return { ...providerResolution, source: "provider" };
147
+ if (providers.length === 0) {
148
+ throw new Error("Rendering requires a provider with a renderer.");
42
149
  }
43
- return null;
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
- for (const child of element.children) {
54
- if (typeof child === "string") {
55
- continue;
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 found = findProviderTokenizer(child);
58
- if (found) {
59
- return found;
166
+ const provider = node.context?.provider;
167
+ if (provider && !found.includes(provider)) {
168
+ found.push(provider);
60
169
  }
61
- }
62
- return null;
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, tokenizer, tokenString, hooks) {
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 = tokenizer(tokenString(element));
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, {}, // Start with empty context at the root
105
- hooks, iteration);
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 ? tokenizer(tokenString(current)) : 0;
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(element) {
134
- let maxPriority = element.strategy ? element.priority : null;
135
- for (const child of element.children) {
136
- if (typeof child === "string") {
137
- continue;
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
- // Merge this element's context with inherited context
155
- // Element context overrides inherited context
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;
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}