@fastpaca/cria 0.0.1 → 1.1.3

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 (113) hide show
  1. package/README.md +118 -121
  2. package/dist/ai-sdk/index.d.ts +68 -0
  3. package/dist/ai-sdk/index.d.ts.map +1 -0
  4. package/dist/ai-sdk/index.js +375 -0
  5. package/dist/ai-sdk/index.js.map +1 -0
  6. package/dist/anthropic/index.d.ts +102 -0
  7. package/dist/anthropic/index.d.ts.map +1 -0
  8. package/dist/anthropic/index.js +281 -0
  9. package/dist/anthropic/index.js.map +1 -0
  10. package/dist/components/index.d.ts +147 -0
  11. package/dist/components/index.d.ts.map +1 -0
  12. package/dist/components/index.js +181 -0
  13. package/dist/components/index.js.map +1 -0
  14. package/dist/components/summary.d.ts +90 -0
  15. package/dist/components/summary.d.ts.map +1 -0
  16. package/dist/components/summary.js +118 -0
  17. package/dist/components/summary.js.map +1 -0
  18. package/dist/components/vector-search.d.ts +70 -0
  19. package/dist/components/vector-search.d.ts.map +1 -0
  20. package/dist/components/vector-search.js +110 -0
  21. package/dist/components/vector-search.js.map +1 -0
  22. package/dist/dsl.d.ts +201 -0
  23. package/dist/dsl.d.ts.map +1 -0
  24. package/dist/dsl.js +320 -0
  25. package/dist/dsl.js.map +1 -0
  26. package/dist/index.d.ts +20 -19
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +18 -19
  29. package/dist/index.js.map +1 -1
  30. package/dist/instrumentation/otel.d.ts +19 -0
  31. package/dist/instrumentation/otel.d.ts.map +1 -0
  32. package/dist/instrumentation/otel.js +102 -0
  33. package/dist/instrumentation/otel.js.map +1 -0
  34. package/dist/jsx/index.d.ts +6 -0
  35. package/dist/jsx/index.d.ts.map +1 -0
  36. package/dist/jsx/index.js +7 -0
  37. package/dist/jsx/index.js.map +1 -0
  38. package/dist/jsx/jsx-dev-runtime.d.ts +2 -0
  39. package/dist/jsx/jsx-dev-runtime.d.ts.map +1 -0
  40. package/dist/jsx/jsx-dev-runtime.js +3 -0
  41. package/dist/jsx/jsx-dev-runtime.js.map +1 -0
  42. package/dist/jsx/jsx-runtime.d.ts +40 -0
  43. package/dist/jsx/jsx-runtime.d.ts.map +1 -0
  44. package/dist/{jsx-runtime.js → jsx/jsx-runtime.js} +14 -14
  45. package/dist/jsx/jsx-runtime.js.map +1 -0
  46. package/dist/memory/chroma/index.d.ts +59 -0
  47. package/dist/memory/chroma/index.d.ts.map +1 -0
  48. package/dist/memory/chroma/index.js +172 -0
  49. package/dist/memory/chroma/index.js.map +1 -0
  50. package/dist/memory/index.d.ts +4 -0
  51. package/dist/memory/index.d.ts.map +1 -0
  52. package/dist/memory/index.js +2 -0
  53. package/dist/memory/index.js.map +1 -0
  54. package/dist/memory/key-value.d.ts +71 -0
  55. package/dist/memory/key-value.d.ts.map +1 -0
  56. package/dist/memory/key-value.js +34 -0
  57. package/dist/memory/key-value.js.map +1 -0
  58. package/dist/memory/postgres.d.ts +71 -0
  59. package/dist/memory/postgres.d.ts.map +1 -0
  60. package/dist/memory/postgres.js +124 -0
  61. package/dist/memory/postgres.js.map +1 -0
  62. package/dist/memory/qdrant/index.d.ts +64 -0
  63. package/dist/memory/qdrant/index.d.ts.map +1 -0
  64. package/dist/memory/qdrant/index.js +136 -0
  65. package/dist/memory/qdrant/index.js.map +1 -0
  66. package/dist/memory/redis.d.ts +70 -0
  67. package/dist/memory/redis.d.ts.map +1 -0
  68. package/dist/memory/redis.js +127 -0
  69. package/dist/memory/redis.js.map +1 -0
  70. package/dist/memory/vector.d.ts +53 -0
  71. package/dist/memory/vector.d.ts.map +1 -0
  72. package/dist/memory/vector.js +2 -0
  73. package/dist/memory/vector.js.map +1 -0
  74. package/dist/openai/index.d.ts +73 -0
  75. package/dist/openai/index.d.ts.map +1 -0
  76. package/dist/openai/index.js +306 -0
  77. package/dist/openai/index.js.map +1 -0
  78. package/dist/render.d.ts +44 -40
  79. package/dist/render.d.ts.map +1 -1
  80. package/dist/render.js +174 -148
  81. package/dist/render.js.map +1 -1
  82. package/dist/renderers/markdown.d.ts +3 -0
  83. package/dist/renderers/markdown.d.ts.map +1 -0
  84. package/dist/renderers/markdown.js +43 -0
  85. package/dist/renderers/markdown.js.map +1 -0
  86. package/dist/renderers/shared.d.ts +82 -0
  87. package/dist/renderers/shared.d.ts.map +1 -0
  88. package/dist/renderers/shared.js +156 -0
  89. package/dist/renderers/shared.js.map +1 -0
  90. package/dist/snapshot.d.ts +47 -0
  91. package/dist/snapshot.d.ts.map +1 -0
  92. package/dist/snapshot.js +144 -0
  93. package/dist/snapshot.js.map +1 -0
  94. package/dist/tokenizers.d.ts +14 -0
  95. package/dist/tokenizers.d.ts.map +1 -0
  96. package/dist/tokenizers.js +45 -0
  97. package/dist/tokenizers.js.map +1 -0
  98. package/dist/types.d.ts +221 -85
  99. package/dist/types.d.ts.map +1 -1
  100. package/dist/types.js +116 -2
  101. package/dist/types.js.map +1 -1
  102. package/package.json +111 -5
  103. package/dist/components.d.ts +0 -78
  104. package/dist/components.d.ts.map +0 -1
  105. package/dist/components.js +0 -98
  106. package/dist/components.js.map +0 -1
  107. package/dist/jsx-runtime.d.ts +0 -18
  108. package/dist/jsx-runtime.d.ts.map +0 -1
  109. package/dist/jsx-runtime.js.map +0 -1
  110. package/dist/render.test.d.ts +0 -2
  111. package/dist/render.test.d.ts.map +0 -1
  112. package/dist/render.test.js +0 -49
  113. package/dist/render.test.js.map +0 -1
@@ -0,0 +1,73 @@
1
+ import type OpenAI from "openai";
2
+ import type { ChatCompletionMessageParam } from "openai/resources/chat/completions";
3
+ import type { ResponseInputItem } from "openai/resources/responses/responses";
4
+ import type { CompletionRequest, CompletionResult, ModelProvider, PromptChildren, PromptElement, PromptRenderer, Tokenizer } from "../types";
5
+ /**
6
+ * Renderer that outputs ChatCompletionMessageParam[] for the OpenAI Chat Completions API.
7
+ * Pass this to render() to get messages compatible with client.chat.completions.create().
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { render } from "@fastpaca/cria";
12
+ * import { chatCompletions } from "@fastpaca/cria/openai";
13
+ *
14
+ * const messages = await render(prompt, { tokenizer, budget, renderer: chatCompletions });
15
+ * const response = await openai.chat.completions.create({ model: "gpt-4", messages });
16
+ * ```
17
+ */
18
+ export declare const chatCompletions: PromptRenderer<ChatCompletionMessageParam[]>;
19
+ /**
20
+ * Renderer that outputs ResponseInputItem[] for the OpenAI Responses API.
21
+ * Use this with reasoning models that support native reasoning.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * import { render } from "@fastpaca/cria";
26
+ * import { responses } from "@fastpaca/cria/openai";
27
+ *
28
+ * const input = await render(prompt, { tokenizer, budget, renderer: responses });
29
+ * const response = await openai.responses.create({ model: "o3", input });
30
+ * ```
31
+ */
32
+ export declare const responses: PromptRenderer<ResponseInputItem[]>;
33
+ interface OpenAIProviderProps {
34
+ /** OpenAI client instance */
35
+ client: OpenAI;
36
+ /** Model to use (e.g. "gpt-4o", "gpt-4o-mini") */
37
+ model: string;
38
+ /** Optional tokenizer to use for budgeting; defaults to a tiktoken-based tokenizer */
39
+ tokenizer?: Tokenizer;
40
+ /** Child components that will have access to this provider */
41
+ children?: PromptChildren;
42
+ }
43
+ /**
44
+ * ModelProvider implementation that wraps an OpenAI client.
45
+ * Use this with the DSL's `.provider()` method.
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * import OpenAI from "openai";
50
+ * import { cria } from "@fastpaca/cria";
51
+ * import { Provider } from "@fastpaca/cria/openai";
52
+ *
53
+ * const client = new OpenAI();
54
+ * const provider = new Provider(client, "gpt-4o");
55
+ *
56
+ * const prompt = cria
57
+ * .prompt()
58
+ * .provider(provider, (p) =>
59
+ * p.summary(content, { id: "summary", store })
60
+ * )
61
+ * .build();
62
+ * ```
63
+ */
64
+ export declare class Provider implements ModelProvider {
65
+ readonly name = "openai";
66
+ private readonly client;
67
+ private readonly model;
68
+ constructor(client: OpenAI, model: string);
69
+ completion(request: CompletionRequest): Promise<CompletionResult>;
70
+ }
71
+ export declare function OpenAIProvider({ client, model, tokenizer, children, }: OpenAIProviderProps): PromptElement;
72
+ export {};
73
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/openai/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAEV,0BAA0B,EAK3B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,sCAAsC,CAAC;AAY9C,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,aAAa,EACb,cAAc,EACd,SAAS,EACV,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,0BAA0B,EAAE,CAKxE,CAAC;AAiHF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,EAAE,cAAc,CAAC,iBAAiB,EAAE,CAKzD,CAAC;AA4IF,UAAU,mBAAmB;IAC3B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AA8BD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,QAAS,YAAW,aAAa;IAC5C,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAKnC,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAmBxE;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,KAAK,EACL,SAAS,EACT,QAAa,GACd,EAAE,mBAAmB,GAAG,aAAa,CA8BrC"}
@@ -0,0 +1,306 @@
1
+ import { markdownRenderer } from "../renderers/markdown";
2
+ import { coalesceTextParts, collectMessageNodes, collectSemanticParts, partsToText, safeStringify, } from "../renderers/shared";
3
+ import { tiktokenTokenizer } from "../tokenizers";
4
+ /**
5
+ * Renderer that outputs ChatCompletionMessageParam[] for the OpenAI Chat Completions API.
6
+ * Pass this to render() to get messages compatible with client.chat.completions.create().
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { render } from "@fastpaca/cria";
11
+ * import { chatCompletions } from "@fastpaca/cria/openai";
12
+ *
13
+ * const messages = await render(prompt, { tokenizer, budget, renderer: chatCompletions });
14
+ * const response = await openai.chat.completions.create({ model: "gpt-4", messages });
15
+ * ```
16
+ */
17
+ export const chatCompletions = {
18
+ name: "openai-chat-completions",
19
+ tokenString: markdownRenderer.tokenString,
20
+ render: (element) => renderToChatCompletions(element),
21
+ empty: () => [],
22
+ };
23
+ function renderToChatCompletions(root) {
24
+ const messageNodes = collectMessageNodes(root);
25
+ const result = [];
26
+ for (const messageNode of messageNodes) {
27
+ result.push(...messageNodeToParams(messageNode));
28
+ }
29
+ return result;
30
+ }
31
+ function messageNodeToParams(messageNode) {
32
+ const parts = coalesceTextParts(collectSemanticParts(messageNode.children));
33
+ if (messageNode.role === "system") {
34
+ return [toSystemMessage(parts)];
35
+ }
36
+ if (messageNode.role === "user") {
37
+ return [toUserMessage(parts)];
38
+ }
39
+ // Assistant message: may contain tool calls, and tool results become separate messages
40
+ // Preserve original part ordering - only separate out tool results
41
+ const assistantParts = parts.filter((p) => p.type !== "tool-result");
42
+ const toolResultParts = parts.filter((p) => p.type === "tool-result");
43
+ const result = [];
44
+ if (assistantParts.length > 0 || toolResultParts.length === 0) {
45
+ result.push(toAssistantMessage(assistantParts));
46
+ }
47
+ for (const toolResult of toolResultParts) {
48
+ result.push(toToolMessage(toolResult));
49
+ }
50
+ return result;
51
+ }
52
+ function toSystemMessage(parts) {
53
+ return {
54
+ role: "system",
55
+ content: partsToText(parts, { wrapReasoning: true }),
56
+ };
57
+ }
58
+ function toUserMessage(parts) {
59
+ return {
60
+ role: "user",
61
+ content: partsToText(parts, { wrapReasoning: true }),
62
+ };
63
+ }
64
+ function toAssistantMessage(parts) {
65
+ const textContent = partsToText(parts, { wrapReasoning: true });
66
+ const toolCalls = parts
67
+ .filter((part) => part.type === "tool-call")
68
+ .map((part) => ({
69
+ id: part.toolCallId,
70
+ type: "function",
71
+ function: {
72
+ name: part.toolName,
73
+ arguments: safeStringify(part.input),
74
+ },
75
+ }));
76
+ const result = {
77
+ role: "assistant",
78
+ };
79
+ if (textContent.length > 0) {
80
+ result.content = textContent;
81
+ }
82
+ if (toolCalls.length > 0) {
83
+ result.tool_calls = toolCalls;
84
+ }
85
+ return result;
86
+ }
87
+ function toToolMessage(part) {
88
+ return {
89
+ role: "tool",
90
+ tool_call_id: part.toolCallId,
91
+ content: safeStringify(part.output),
92
+ };
93
+ }
94
+ // ============================================================================
95
+ // Responses API Renderer (for reasoning models)
96
+ // ============================================================================
97
+ /**
98
+ * Renderer that outputs ResponseInputItem[] for the OpenAI Responses API.
99
+ * Use this with reasoning models that support native reasoning.
100
+ *
101
+ * @example
102
+ * ```ts
103
+ * import { render } from "@fastpaca/cria";
104
+ * import { responses } from "@fastpaca/cria/openai";
105
+ *
106
+ * const input = await render(prompt, { tokenizer, budget, renderer: responses });
107
+ * const response = await openai.responses.create({ model: "o3", input });
108
+ * ```
109
+ */
110
+ export const responses = {
111
+ name: "openai-responses",
112
+ tokenString: markdownRenderer.tokenString,
113
+ render: (element) => renderToResponses(element),
114
+ empty: () => [],
115
+ };
116
+ function renderToResponses(root) {
117
+ const result = [];
118
+ collectResponseItems(root, result);
119
+ return result;
120
+ }
121
+ /**
122
+ * Convert a message element's parts into ResponseInputItems.
123
+ * Handles text, reasoning, tool calls, and tool results.
124
+ */
125
+ function collectMessageResponseItems(element, acc) {
126
+ const parts = coalesceTextParts(collectSemanticParts(element.children));
127
+ const role = mapRoleForResponses(element.role);
128
+ let textBuffer = "";
129
+ let reasoningIndex = 0;
130
+ const flushTextBuffer = () => {
131
+ if (textBuffer.length > 0) {
132
+ acc.push({ role, content: textBuffer });
133
+ textBuffer = "";
134
+ }
135
+ };
136
+ for (const part of parts) {
137
+ switch (part.type) {
138
+ case "text":
139
+ textBuffer += part.text;
140
+ break;
141
+ case "reasoning": {
142
+ flushTextBuffer();
143
+ acc.push({
144
+ id: element.id
145
+ ? `${element.id}-reasoning-${reasoningIndex}`
146
+ : `reasoning_${reasoningIndex}`,
147
+ type: "reasoning",
148
+ summary: [{ type: "summary_text", text: part.text }],
149
+ });
150
+ reasoningIndex += 1;
151
+ break;
152
+ }
153
+ case "tool-call":
154
+ flushTextBuffer();
155
+ acc.push({
156
+ type: "function_call",
157
+ call_id: part.toolCallId,
158
+ name: part.toolName,
159
+ arguments: safeStringify(part.input),
160
+ });
161
+ break;
162
+ case "tool-result":
163
+ flushTextBuffer();
164
+ acc.push({
165
+ type: "function_call_output",
166
+ call_id: part.toolCallId,
167
+ output: safeStringify(part.output),
168
+ });
169
+ break;
170
+ default:
171
+ // Exhaustive check - all SemanticPart types handled above
172
+ break;
173
+ }
174
+ }
175
+ flushTextBuffer();
176
+ }
177
+ function collectResponseItems(element, acc) {
178
+ switch (element.kind) {
179
+ case "message": {
180
+ collectMessageResponseItems(element, acc);
181
+ break;
182
+ }
183
+ case "reasoning": {
184
+ // Native reasoning support in Responses API
185
+ if (element.text.length > 0) {
186
+ const reasoningItem = {
187
+ id: element.id ?? `rs_${Date.now()}`,
188
+ type: "reasoning",
189
+ summary: [{ type: "summary_text", text: element.text }],
190
+ };
191
+ acc.push(reasoningItem);
192
+ }
193
+ break;
194
+ }
195
+ case "tool-call": {
196
+ const toolCall = {
197
+ type: "function_call",
198
+ call_id: element.toolCallId,
199
+ name: element.toolName,
200
+ arguments: safeStringify(element.input),
201
+ };
202
+ acc.push(toolCall);
203
+ break;
204
+ }
205
+ case "tool-result": {
206
+ const toolResult = {
207
+ type: "function_call_output",
208
+ call_id: element.toolCallId,
209
+ output: safeStringify(element.output),
210
+ };
211
+ acc.push(toolResult);
212
+ break;
213
+ }
214
+ default: {
215
+ // Recurse into children for regions without semantic kind
216
+ for (const child of element.children) {
217
+ if (typeof child !== "string") {
218
+ collectResponseItems(child, acc);
219
+ }
220
+ }
221
+ }
222
+ }
223
+ }
224
+ const RESPONSE_ROLE_MAP = {
225
+ system: "system",
226
+ developer: "developer",
227
+ user: "user",
228
+ };
229
+ function mapRoleForResponses(role) {
230
+ return RESPONSE_ROLE_MAP[role] ?? "assistant";
231
+ }
232
+ const VALID_OPENAI_ROLES = new Set(["user", "assistant", "system"]);
233
+ /**
234
+ * ModelProvider implementation that wraps an OpenAI client.
235
+ * Use this with the DSL's `.provider()` method.
236
+ *
237
+ * @example
238
+ * ```typescript
239
+ * import OpenAI from "openai";
240
+ * import { cria } from "@fastpaca/cria";
241
+ * import { Provider } from "@fastpaca/cria/openai";
242
+ *
243
+ * const client = new OpenAI();
244
+ * const provider = new Provider(client, "gpt-4o");
245
+ *
246
+ * const prompt = cria
247
+ * .prompt()
248
+ * .provider(provider, (p) =>
249
+ * p.summary(content, { id: "summary", store })
250
+ * )
251
+ * .build();
252
+ * ```
253
+ */
254
+ export class Provider {
255
+ name = "openai";
256
+ client;
257
+ model;
258
+ constructor(client, model) {
259
+ this.client = client;
260
+ this.model = model;
261
+ }
262
+ async completion(request) {
263
+ const messages = request.system
264
+ ? [{ role: "system", content: request.system }]
265
+ : [];
266
+ for (const msg of request.messages) {
267
+ if (VALID_OPENAI_ROLES.has(msg.role)) {
268
+ messages.push({ role: msg.role, content: msg.content });
269
+ }
270
+ }
271
+ const response = await this.client.chat.completions.create({
272
+ model: this.model,
273
+ messages,
274
+ });
275
+ const text = response.choices[0]?.message?.content ?? "";
276
+ return { text };
277
+ }
278
+ }
279
+ export function OpenAIProvider({ client, model, tokenizer, children = [], }) {
280
+ const provider = {
281
+ name: "openai",
282
+ tokenizer: tokenizer ?? tiktokenTokenizer(model),
283
+ async completion(request) {
284
+ const messages = request.system
285
+ ? [{ role: "system", content: request.system }]
286
+ : [];
287
+ for (const msg of request.messages) {
288
+ if (VALID_OPENAI_ROLES.has(msg.role)) {
289
+ messages.push({ role: msg.role, content: msg.content });
290
+ }
291
+ }
292
+ const response = await client.chat.completions.create({
293
+ model,
294
+ messages,
295
+ });
296
+ const text = response.choices[0]?.message?.content ?? "";
297
+ return { text };
298
+ },
299
+ };
300
+ return {
301
+ priority: 0,
302
+ children,
303
+ context: { provider },
304
+ };
305
+ }
306
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openai/index.ts"],"names":[],"mappings":"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"}
package/dist/render.d.ts CHANGED
@@ -1,44 +1,48 @@
1
- import { type PromptElement, type Tokenizer } from "./types";
2
- /** Options for the render function. */
3
- interface RenderOptions {
4
- /** Function to count tokens in a string (e.g., tiktoken) */
5
- tokenizer: Tokenizer;
6
- /** Maximum token count for the final output */
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. */
5
+ budget?: number;
6
+ renderer?: PromptRenderer<unknown>;
7
+ hooks?: RenderHooks;
8
+ }
9
+ export interface FitStartEvent {
10
+ element: PromptElement;
7
11
  budget: number;
12
+ totalTokens: number;
13
+ }
14
+ export interface FitIterationEvent {
15
+ iteration: number;
16
+ priority: number;
17
+ totalTokens: number;
18
+ }
19
+ export interface StrategyAppliedEvent {
20
+ target: PromptElement;
21
+ result: PromptElement | null;
22
+ priority: number;
23
+ iteration: number;
24
+ }
25
+ export interface FitCompleteEvent {
26
+ result: PromptElement | null;
27
+ iterations: number;
28
+ totalTokens: number;
29
+ }
30
+ export interface FitErrorEvent {
31
+ error: FitError;
32
+ iteration: number;
33
+ priority: number;
34
+ totalTokens: number;
35
+ }
36
+ export interface RenderHooks {
37
+ onFitStart?: (event: FitStartEvent) => MaybePromise<void>;
38
+ onFitIteration?: (event: FitIterationEvent) => MaybePromise<void>;
39
+ onStrategyApplied?: (event: StrategyAppliedEvent) => MaybePromise<void>;
40
+ onFitComplete?: (event: FitCompleteEvent) => MaybePromise<void>;
41
+ onFitError?: (event: FitErrorEvent) => MaybePromise<void>;
8
42
  }
9
- /**
10
- * Renders a PromptElement tree to a fitted string.
11
- *
12
- * This is the main entry point for Cria. Takes a JSX tree and returns a string
13
- * that fits within the specified token budget.
14
- *
15
- * **Pipeline:**
16
- * 1. `flatten`: Walks the tree, collects text into ordered PromptFragment[]
17
- * 2. `fitToBudget`: Applies strategies starting from lowest priority until under budget
18
- * 3. `join`: Concatenates fragment content into final string
19
- *
20
- * @param element - The root PromptElement (from JSX)
21
- * @param options - Tokenizer and budget configuration
22
- * @returns The fitted prompt string
23
- * @throws {FitError} When the prompt cannot fit within budget
24
- *
25
- * @example
26
- * ```tsx
27
- * import { render, Region, Omit } from "@fastpaca/cria";
28
- *
29
- * const prompt = (
30
- * <Region priority={0}>
31
- * System prompt
32
- * <Omit priority={2}>Optional context</Omit>
33
- * </Region>
34
- * );
35
- *
36
- * const result = render(prompt, {
37
- * tokenizer: (text) => Math.ceil(text.length / 4),
38
- * budget: 1000,
39
- * });
40
- * ```
41
- */
42
- export declare function render(element: PromptElement, { tokenizer, budget }: RenderOptions): string;
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>>;
43
47
  export {};
44
48
  //# sourceMappingURL=render.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAIlB,KAAK,SAAS,EACf,MAAM,SAAS,CAAC;AAEjB,uCAAuC;AACvC,UAAU,aAAa;IACrB,4DAA4D;IAC5D,SAAS,EAAE,SAAS,CAAC;IACrB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,MAAM,CACpB,OAAO,EAAE,aAAa,EACtB,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,aAAa,GACnC,MAAM,CAQR"}
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"}