@fastpaca/cria 0.0.1 → 1.0.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.
Files changed (140) hide show
  1. package/README.md +93 -106
  2. package/dist/ai-sdk/index.d.ts +43 -0
  3. package/dist/ai-sdk/index.d.ts.map +1 -0
  4. package/dist/ai-sdk/index.js +303 -0
  5. package/dist/ai-sdk/index.js.map +1 -0
  6. package/dist/ai-sdk/index.test.d.ts +2 -0
  7. package/dist/ai-sdk/index.test.d.ts.map +1 -0
  8. package/dist/ai-sdk/index.test.js +101 -0
  9. package/dist/ai-sdk/index.test.js.map +1 -0
  10. package/dist/anthropic/index.d.ts +74 -0
  11. package/dist/anthropic/index.d.ts.map +1 -0
  12. package/dist/anthropic/index.js +238 -0
  13. package/dist/anthropic/index.js.map +1 -0
  14. package/dist/anthropic/index.test.d.ts +2 -0
  15. package/dist/anthropic/index.test.d.ts.map +1 -0
  16. package/dist/anthropic/index.test.js +115 -0
  17. package/dist/anthropic/index.test.js.map +1 -0
  18. package/dist/components/additional.test.d.ts +2 -0
  19. package/dist/components/additional.test.d.ts.map +1 -0
  20. package/dist/components/additional.test.js +31 -0
  21. package/dist/components/additional.test.js.map +1 -0
  22. package/dist/components/index.d.ts +148 -0
  23. package/dist/components/index.d.ts.map +1 -0
  24. package/dist/components/index.js +184 -0
  25. package/dist/components/index.js.map +1 -0
  26. package/dist/components/summary.d.ts +91 -0
  27. package/dist/components/summary.d.ts.map +1 -0
  28. package/dist/components/summary.js +118 -0
  29. package/dist/components/summary.js.map +1 -0
  30. package/dist/components/summary.test.d.ts +2 -0
  31. package/dist/components/summary.test.d.ts.map +1 -0
  32. package/dist/components/summary.test.js +101 -0
  33. package/dist/components/summary.test.js.map +1 -0
  34. package/dist/components/vector-search.d.ts +70 -0
  35. package/dist/components/vector-search.d.ts.map +1 -0
  36. package/dist/components/vector-search.js +110 -0
  37. package/dist/components/vector-search.js.map +1 -0
  38. package/dist/components/vector-search.test.d.ts +2 -0
  39. package/dist/components/vector-search.test.d.ts.map +1 -0
  40. package/dist/components/vector-search.test.js +113 -0
  41. package/dist/components/vector-search.test.js.map +1 -0
  42. package/dist/index.d.ts +12 -5
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +9 -5
  45. package/dist/index.js.map +1 -1
  46. package/dist/instrumentation/otel.d.ts +19 -0
  47. package/dist/instrumentation/otel.d.ts.map +1 -0
  48. package/dist/instrumentation/otel.js +102 -0
  49. package/dist/instrumentation/otel.js.map +1 -0
  50. package/dist/instrumentation/otel.test.d.ts +2 -0
  51. package/dist/instrumentation/otel.test.d.ts.map +1 -0
  52. package/dist/instrumentation/otel.test.js +116 -0
  53. package/dist/instrumentation/otel.test.js.map +1 -0
  54. package/dist/jsx-dev-runtime.d.ts +2 -0
  55. package/dist/jsx-dev-runtime.d.ts.map +1 -0
  56. package/dist/jsx-dev-runtime.js +2 -0
  57. package/dist/jsx-dev-runtime.js.map +1 -0
  58. package/dist/jsx-runtime.d.ts +30 -8
  59. package/dist/jsx-runtime.d.ts.map +1 -1
  60. package/dist/jsx-runtime.js +13 -10
  61. package/dist/jsx-runtime.js.map +1 -1
  62. package/dist/memory/chroma/index.d.ts +59 -0
  63. package/dist/memory/chroma/index.d.ts.map +1 -0
  64. package/dist/memory/chroma/index.js +172 -0
  65. package/dist/memory/chroma/index.js.map +1 -0
  66. package/dist/memory/index.d.ts +4 -0
  67. package/dist/memory/index.d.ts.map +1 -0
  68. package/dist/memory/index.js +2 -0
  69. package/dist/memory/index.js.map +1 -0
  70. package/dist/memory/key-value.d.ts +71 -0
  71. package/dist/memory/key-value.d.ts.map +1 -0
  72. package/dist/memory/key-value.js +34 -0
  73. package/dist/memory/key-value.js.map +1 -0
  74. package/dist/memory/postgres.d.ts +71 -0
  75. package/dist/memory/postgres.d.ts.map +1 -0
  76. package/dist/memory/postgres.js +109 -0
  77. package/dist/memory/postgres.js.map +1 -0
  78. package/dist/memory/qdrant/index.d.ts +64 -0
  79. package/dist/memory/qdrant/index.d.ts.map +1 -0
  80. package/dist/memory/qdrant/index.js +136 -0
  81. package/dist/memory/qdrant/index.js.map +1 -0
  82. package/dist/memory/redis.d.ts +70 -0
  83. package/dist/memory/redis.d.ts.map +1 -0
  84. package/dist/memory/redis.js +100 -0
  85. package/dist/memory/redis.js.map +1 -0
  86. package/dist/memory/vector.d.ts +53 -0
  87. package/dist/memory/vector.d.ts.map +1 -0
  88. package/dist/memory/vector.js +2 -0
  89. package/dist/memory/vector.js.map +1 -0
  90. package/dist/openai/index.d.ts +46 -0
  91. package/dist/openai/index.d.ts.map +1 -0
  92. package/dist/openai/index.js +260 -0
  93. package/dist/openai/index.js.map +1 -0
  94. package/dist/openai/index.test.d.ts +2 -0
  95. package/dist/openai/index.test.d.ts.map +1 -0
  96. package/dist/openai/index.test.js +204 -0
  97. package/dist/openai/index.test.js.map +1 -0
  98. package/dist/providers/index.d.ts +2 -0
  99. package/dist/providers/index.d.ts.map +1 -0
  100. package/dist/providers/index.js +2 -0
  101. package/dist/providers/index.js.map +1 -0
  102. package/dist/providers/types.d.ts +2 -0
  103. package/dist/providers/types.d.ts.map +1 -0
  104. package/dist/providers/types.js +2 -0
  105. package/dist/providers/types.js.map +1 -0
  106. package/dist/render.d.ts +44 -40
  107. package/dist/render.d.ts.map +1 -1
  108. package/dist/render.js +162 -148
  109. package/dist/render.js.map +1 -1
  110. package/dist/render.test.js +146 -28
  111. package/dist/render.test.js.map +1 -1
  112. package/dist/renderers/markdown.d.ts +3 -0
  113. package/dist/renderers/markdown.d.ts.map +1 -0
  114. package/dist/renderers/markdown.js +43 -0
  115. package/dist/renderers/markdown.js.map +1 -0
  116. package/dist/renderers/shared.d.ts +82 -0
  117. package/dist/renderers/shared.d.ts.map +1 -0
  118. package/dist/renderers/shared.js +156 -0
  119. package/dist/renderers/shared.js.map +1 -0
  120. package/dist/snapshot.d.ts +47 -0
  121. package/dist/snapshot.d.ts.map +1 -0
  122. package/dist/snapshot.js +140 -0
  123. package/dist/snapshot.js.map +1 -0
  124. package/dist/snapshot.test.d.ts +2 -0
  125. package/dist/snapshot.test.d.ts.map +1 -0
  126. package/dist/snapshot.test.js +68 -0
  127. package/dist/snapshot.test.js.map +1 -0
  128. package/dist/tokenizers.d.ts +14 -0
  129. package/dist/tokenizers.d.ts.map +1 -0
  130. package/dist/tokenizers.js +45 -0
  131. package/dist/tokenizers.js.map +1 -0
  132. package/dist/types.d.ts +212 -84
  133. package/dist/types.d.ts.map +1 -1
  134. package/dist/types.js +109 -0
  135. package/dist/types.js.map +1 -1
  136. package/package.json +88 -3
  137. package/dist/components.d.ts +0 -78
  138. package/dist/components.d.ts.map +0 -1
  139. package/dist/components.js +0 -98
  140. package/dist/components.js.map +0 -1
@@ -0,0 +1,101 @@
1
+ import { jsx as _jsx } from "@fastpaca/cria/jsx-runtime";
2
+ import { expect, test } from "vitest";
3
+ import { render } from "../render";
4
+ import { Messages, renderer } from "./index";
5
+ const tokenizer = (text) => Math.ceil(text.length / 4);
6
+ test("Messages: renders text + dynamic-tool output as tool-call/tool-result", async () => {
7
+ const messages = [
8
+ { id: "u1", role: "user", parts: [{ type: "text", text: "hi" }] },
9
+ {
10
+ id: "a1",
11
+ role: "assistant",
12
+ parts: [
13
+ { type: "text", text: "checking weather" },
14
+ {
15
+ type: "dynamic-tool",
16
+ toolName: "getWeather",
17
+ toolCallId: "w1",
18
+ state: "output-available",
19
+ input: { city: "Paris" },
20
+ output: { type: "json", value: { tempC: 10 } },
21
+ },
22
+ ],
23
+ },
24
+ ];
25
+ const prompt = await render(_jsx(Messages, { messages: messages }), {
26
+ tokenizer,
27
+ budget: 10_000,
28
+ });
29
+ const expected = [
30
+ "User: hi",
31
+ "",
32
+ 'Assistant: checking weather<tool_call name="getWeather">',
33
+ "{",
34
+ ' "city": "Paris"',
35
+ "}",
36
+ "</tool_call>",
37
+ '<tool_result name="getWeather">',
38
+ "{",
39
+ ' "type": "json",',
40
+ ' "value": {',
41
+ ' "tempC": 10',
42
+ " }",
43
+ "}",
44
+ "</tool_result>",
45
+ "",
46
+ "",
47
+ ].join("\n");
48
+ expect(prompt).toBe(expected);
49
+ });
50
+ test("Messages: includeReasoning controls reasoning rendering", async () => {
51
+ const messages = [
52
+ {
53
+ id: "a1",
54
+ role: "assistant",
55
+ parts: [
56
+ { type: "reasoning", text: "secret reasoning" },
57
+ { type: "text", text: "public answer" },
58
+ ],
59
+ },
60
+ ];
61
+ const withoutReasoning = await render(_jsx(Messages, { messages: messages }), {
62
+ tokenizer,
63
+ budget: 10_000,
64
+ });
65
+ expect(withoutReasoning).not.toContain("secret reasoning");
66
+ expect(withoutReasoning).toContain("public answer");
67
+ const withReasoning = await render(_jsx(Messages, { includeReasoning: true, messages: messages }), { tokenizer, budget: 10_000 });
68
+ expect(withReasoning).toContain("<thinking>");
69
+ expect(withReasoning).toContain("secret reasoning");
70
+ expect(withReasoning).toContain("public answer");
71
+ });
72
+ test("renderer: renders semantic IR to ModelMessage[] (tool call + tool result split)", async () => {
73
+ const messages = [
74
+ { id: "u1", role: "user", parts: [{ type: "text", text: "hi" }] },
75
+ {
76
+ id: "a1",
77
+ role: "assistant",
78
+ parts: [
79
+ { type: "text", text: "checking weather" },
80
+ {
81
+ type: "dynamic-tool",
82
+ toolName: "getWeather",
83
+ toolCallId: "w1",
84
+ state: "output-available",
85
+ input: { city: "Paris" },
86
+ output: { type: "json", value: { tempC: 10 } },
87
+ },
88
+ ],
89
+ },
90
+ ];
91
+ const modelMessages = await render(_jsx(Messages, { messages: messages }), {
92
+ tokenizer,
93
+ budget: 10_000,
94
+ renderer,
95
+ });
96
+ expect(modelMessages).toHaveLength(3);
97
+ expect(modelMessages[0]?.role).toBe("user");
98
+ expect(modelMessages[1]?.role).toBe("assistant");
99
+ expect(modelMessages[2]?.role).toBe("tool");
100
+ });
101
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/ai-sdk/index.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import type Anthropic from "@anthropic-ai/sdk";
2
+ import type { MessageParam, Model } from "@anthropic-ai/sdk/resources/messages";
3
+ import type { Child } from "../jsx-runtime";
4
+ import type { PromptElement, PromptRenderer, Tokenizer } from "../types";
5
+ /**
6
+ * Result of rendering to Anthropic format.
7
+ * System messages are extracted separately since Anthropic's API
8
+ * takes them as a separate parameter.
9
+ */
10
+ export interface AnthropicRenderResult {
11
+ system?: string;
12
+ messages: MessageParam[];
13
+ }
14
+ /**
15
+ * Renderer that outputs Anthropic-compatible messages.
16
+ * Use this with the Anthropic SDK.
17
+ *
18
+ * Note: System messages are extracted to a separate `system` field since
19
+ * Anthropic's API takes them as a separate parameter.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * import { render } from "@fastpaca/cria";
24
+ * import { anthropic } from "@fastpaca/cria/anthropic";
25
+ *
26
+ * const { system, messages } = await render(prompt, { tokenizer, budget, renderer: anthropic });
27
+ * const response = await client.messages.create({
28
+ * model: "claude-sonnet-4-20250514",
29
+ * system,
30
+ * messages,
31
+ * });
32
+ * ```
33
+ */
34
+ export declare const anthropic: PromptRenderer<AnthropicRenderResult>;
35
+ interface AnthropicProviderProps {
36
+ /** Anthropic client instance */
37
+ client: Anthropic;
38
+ /** Model to use (e.g. "claude-sonnet-4-20250514", "claude-3-5-haiku-latest") */
39
+ model: Model;
40
+ /** Maximum tokens to generate. Defaults to 1024. */
41
+ maxTokens?: number;
42
+ /** Optional tokenizer to use for budgeting; defaults to a tiktoken-based tokenizer */
43
+ tokenizer?: Tokenizer;
44
+ /** Child components that will have access to this provider */
45
+ children?: Child;
46
+ }
47
+ /**
48
+ * Provider component that injects an Anthropic client into the component tree.
49
+ *
50
+ * Child components like `<Summary>` will automatically use this provider
51
+ * for AI-powered operations when no explicit function is provided.
52
+ *
53
+ * @example
54
+ * ```tsx
55
+ * import Anthropic from "@anthropic-ai/sdk";
56
+ * import { AnthropicProvider } from "@fastpaca/cria/anthropic";
57
+ * import { Summary, render } from "@fastpaca/cria";
58
+ *
59
+ * const client = new Anthropic();
60
+ *
61
+ * const prompt = (
62
+ * <AnthropicProvider client={client} model="claude-sonnet-4-20250514">
63
+ * <Summary id="conv-history" store={store} priority={2}>
64
+ * {conversationHistory}
65
+ * </Summary>
66
+ * </AnthropicProvider>
67
+ * );
68
+ *
69
+ * const result = await render(prompt, { tokenizer, budget: 4000 });
70
+ * ```
71
+ */
72
+ export declare function AnthropicProvider({ client, model, maxTokens, tokenizer, children, }: AnthropicProviderProps): PromptElement;
73
+ export {};
74
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/anthropic/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAEV,YAAY,EACZ,KAAK,EAGN,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAa5C,OAAO,KAAK,EAKV,aAAa,EACb,cAAc,EACd,SAAS,EACV,MAAM,UAAU,CAAC;AAElB;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,SAAS,EAAE,cAAc,CAAC,qBAAqB,CAK3D,CAAC;AA4MF,UAAU,sBAAsB;IAC9B,gCAAgC;IAChC,MAAM,EAAE,SAAS,CAAC;IAClB,gFAAgF;IAChF,KAAK,EAAE,KAAK,CAAC;IACb,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,KAAK,EACL,SAAgB,EAChB,SAAS,EACT,QAAa,GACd,EAAE,sBAAsB,GAAG,aAAa,CAwBxC"}
@@ -0,0 +1,238 @@
1
+ import { markdownRenderer } from "../renderers/markdown";
2
+ import { coalesceTextParts, collectMessageNodes, collectSemanticParts, safeStringify, } from "../renderers/shared";
3
+ import { tiktokenTokenizer } from "../tokenizers";
4
+ /**
5
+ * Renderer that outputs Anthropic-compatible messages.
6
+ * Use this with the Anthropic SDK.
7
+ *
8
+ * Note: System messages are extracted to a separate `system` field since
9
+ * Anthropic's API takes them as a separate parameter.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { render } from "@fastpaca/cria";
14
+ * import { anthropic } from "@fastpaca/cria/anthropic";
15
+ *
16
+ * const { system, messages } = await render(prompt, { tokenizer, budget, renderer: anthropic });
17
+ * const response = await client.messages.create({
18
+ * model: "claude-sonnet-4-20250514",
19
+ * system,
20
+ * messages,
21
+ * });
22
+ * ```
23
+ */
24
+ export const anthropic = {
25
+ name: "anthropic",
26
+ tokenString: markdownRenderer.tokenString,
27
+ render: (element) => renderToAnthropic(element),
28
+ empty: () => ({ messages: [] }),
29
+ };
30
+ function renderToAnthropic(root) {
31
+ const messageNodes = collectMessageNodes(root);
32
+ // Extract system messages
33
+ const systemNodes = messageNodes.filter((m) => m.role === "system");
34
+ const nonSystemNodes = messageNodes.filter((m) => m.role !== "system");
35
+ // Combine all system messages into one string
36
+ const systemText = systemNodes
37
+ .map((m) => collectTextContent(m.children))
38
+ .filter((s) => s.length > 0)
39
+ .join("\n\n");
40
+ // Convert non-system messages
41
+ const messages = convertMessages(nonSystemNodes);
42
+ return {
43
+ ...(systemText.length > 0 ? { system: systemText } : {}),
44
+ messages,
45
+ };
46
+ }
47
+ /**
48
+ * Convert message nodes to Anthropic format.
49
+ * Key quirk: tool results must be in user messages, not assistant messages.
50
+ */
51
+ function convertMessages(nodes) {
52
+ return nodes.flatMap(convertMessageNode);
53
+ }
54
+ function convertMessageNode(node) {
55
+ const parts = coalesceTextParts(collectSemanticParts(node.children));
56
+ if (node.role === "user") {
57
+ return buildUserMessages(parts);
58
+ }
59
+ return buildAssistantMessages(parts);
60
+ }
61
+ function buildUserMessages(parts) {
62
+ const content = buildUserContent(parts);
63
+ if (content.length === 0) {
64
+ return [];
65
+ }
66
+ return [{ role: "user", content }];
67
+ }
68
+ /**
69
+ * Build user content blocks preserving tool result positions.
70
+ * Adjacent text/reasoning parts are coalesced into single text blocks.
71
+ */
72
+ function buildUserContent(parts) {
73
+ const content = [];
74
+ let textBuffer = "";
75
+ const flushTextBuffer = () => {
76
+ if (textBuffer.length > 0) {
77
+ content.push({ type: "text", text: textBuffer });
78
+ textBuffer = "";
79
+ }
80
+ };
81
+ for (const part of parts) {
82
+ if (part.type === "tool-result") {
83
+ flushTextBuffer();
84
+ content.push(toToolResultBlock(part));
85
+ }
86
+ else if (part.type === "text") {
87
+ textBuffer += part.text;
88
+ }
89
+ else if (part.type === "reasoning") {
90
+ textBuffer += `<thinking>\n${part.text}\n</thinking>`;
91
+ }
92
+ // tool-call parts in user messages are ignored
93
+ }
94
+ flushTextBuffer();
95
+ return content;
96
+ }
97
+ function buildAssistantMessages(parts) {
98
+ // Separate tool results (go to user message) from assistant content
99
+ const assistantParts = parts.filter((p) => p.type !== "tool-result");
100
+ const toolResultParts = parts.filter((p) => p.type === "tool-result");
101
+ const content = buildAssistantContent(assistantParts);
102
+ const result = [];
103
+ if (content.length > 0) {
104
+ result.push({ role: "assistant", content });
105
+ }
106
+ if (toolResultParts.length > 0) {
107
+ result.push({
108
+ role: "user",
109
+ content: toolResultParts.map(toToolResultBlock),
110
+ });
111
+ }
112
+ return result;
113
+ }
114
+ /**
115
+ * Build assistant content blocks preserving tool call positions.
116
+ * Adjacent text/reasoning parts are coalesced into single text blocks.
117
+ */
118
+ function buildAssistantContent(parts) {
119
+ const content = [];
120
+ let textBuffer = "";
121
+ const flushTextBuffer = () => {
122
+ if (textBuffer.length > 0) {
123
+ content.push({ type: "text", text: textBuffer });
124
+ textBuffer = "";
125
+ }
126
+ };
127
+ for (const part of parts) {
128
+ if (part.type === "text") {
129
+ textBuffer += part.text;
130
+ }
131
+ else if (part.type === "reasoning") {
132
+ textBuffer += `<thinking>\n${part.text}\n</thinking>`;
133
+ }
134
+ else if (part.type === "tool-call") {
135
+ flushTextBuffer();
136
+ content.push(toToolUseBlock(part));
137
+ }
138
+ // tool-result parts handled separately
139
+ }
140
+ flushTextBuffer();
141
+ return content;
142
+ }
143
+ function collectTextContent(children) {
144
+ let result = "";
145
+ for (const child of children) {
146
+ if (typeof child === "string") {
147
+ result += child;
148
+ continue;
149
+ }
150
+ if (child.kind === undefined) {
151
+ result += collectTextContent(child.children);
152
+ }
153
+ else if (child.kind === "reasoning") {
154
+ result += `<thinking>\n${child.text}\n</thinking>\n`;
155
+ }
156
+ }
157
+ return result;
158
+ }
159
+ function toToolUseBlock(part) {
160
+ return {
161
+ type: "tool_use",
162
+ id: part.toolCallId,
163
+ name: part.toolName,
164
+ input: part.input,
165
+ };
166
+ }
167
+ function toToolResultBlock(part) {
168
+ return {
169
+ type: "tool_result",
170
+ tool_use_id: part.toolCallId,
171
+ content: safeStringify(part.output),
172
+ };
173
+ }
174
+ const VALID_ANTHROPIC_ROLES = new Set(["user", "assistant"]);
175
+ function convertToAnthropicMessages(request) {
176
+ const messages = [];
177
+ for (const msg of request.messages) {
178
+ // System messages are handled separately in Anthropic's API
179
+ if (VALID_ANTHROPIC_ROLES.has(msg.role)) {
180
+ messages.push({ role: msg.role, content: msg.content });
181
+ }
182
+ }
183
+ return messages;
184
+ }
185
+ function extractTextFromResponse(content) {
186
+ return content
187
+ .filter((block) => block.type === "text")
188
+ .map((block) => block.text)
189
+ .join("");
190
+ }
191
+ /**
192
+ * Provider component that injects an Anthropic client into the component tree.
193
+ *
194
+ * Child components like `<Summary>` will automatically use this provider
195
+ * for AI-powered operations when no explicit function is provided.
196
+ *
197
+ * @example
198
+ * ```tsx
199
+ * import Anthropic from "@anthropic-ai/sdk";
200
+ * import { AnthropicProvider } from "@fastpaca/cria/anthropic";
201
+ * import { Summary, render } from "@fastpaca/cria";
202
+ *
203
+ * const client = new Anthropic();
204
+ *
205
+ * const prompt = (
206
+ * <AnthropicProvider client={client} model="claude-sonnet-4-20250514">
207
+ * <Summary id="conv-history" store={store} priority={2}>
208
+ * {conversationHistory}
209
+ * </Summary>
210
+ * </AnthropicProvider>
211
+ * );
212
+ *
213
+ * const result = await render(prompt, { tokenizer, budget: 4000 });
214
+ * ```
215
+ */
216
+ export function AnthropicProvider({ client, model, maxTokens = 1024, tokenizer, children = [], }) {
217
+ const provider = {
218
+ name: "anthropic",
219
+ tokenizer: tokenizer ?? tiktokenTokenizer(model),
220
+ async completion(request) {
221
+ const messages = convertToAnthropicMessages(request);
222
+ const response = await client.messages.create({
223
+ model,
224
+ max_tokens: maxTokens,
225
+ ...(request.system ? { system: request.system } : {}),
226
+ messages,
227
+ });
228
+ const text = extractTextFromResponse(response.content);
229
+ return { text };
230
+ },
231
+ };
232
+ return {
233
+ priority: 0,
234
+ children: children,
235
+ context: { provider },
236
+ };
237
+ }
238
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/anthropic/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/anthropic/index.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,115 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@fastpaca/cria/jsx-runtime";
2
+ import { expect, test } from "vitest";
3
+ import { Message, Reasoning, Region, ToolCall, ToolResult, } from "../components";
4
+ import { render } from "../render";
5
+ import { anthropic } from "./index";
6
+ const tokenizer = (text) => Math.ceil(text.length / 4);
7
+ test("anthropic: extracts system message separately", async () => {
8
+ const prompt = (_jsxs(Region, { priority: 0, children: [_jsx(Message, { messageRole: "system", children: "You are a helpful assistant." }), _jsx(Message, { messageRole: "user", children: "Hello!" })] }));
9
+ const result = await render(prompt, {
10
+ tokenizer,
11
+ budget: 10_000,
12
+ renderer: anthropic,
13
+ });
14
+ expect(result.system).toBe("You are a helpful assistant.");
15
+ expect(result.messages).toHaveLength(1);
16
+ expect(result.messages[0]).toMatchObject({
17
+ role: "user",
18
+ content: [{ type: "text", text: "Hello!" }],
19
+ });
20
+ });
21
+ test("anthropic: renders user and assistant messages", async () => {
22
+ const prompt = (_jsxs(Region, { priority: 0, children: [_jsx(Message, { messageRole: "user", children: "Hello!" }), _jsx(Message, { messageRole: "assistant", children: "Hi there!" })] }));
23
+ const result = await render(prompt, {
24
+ tokenizer,
25
+ budget: 10_000,
26
+ renderer: anthropic,
27
+ });
28
+ expect(result.system).toBeUndefined();
29
+ expect(result.messages).toHaveLength(2);
30
+ expect(result.messages[0]).toMatchObject({
31
+ role: "user",
32
+ content: [{ type: "text", text: "Hello!" }],
33
+ });
34
+ expect(result.messages[1]).toMatchObject({
35
+ role: "assistant",
36
+ content: [{ type: "text", text: "Hi there!" }],
37
+ });
38
+ });
39
+ test("anthropic: renders tool calls as tool_use blocks", async () => {
40
+ const prompt = (_jsx(Region, { priority: 0, children: _jsx(Message, { messageRole: "assistant", children: _jsx(ToolCall, { input: { city: "Paris" }, priority: 1, toolCallId: "call_123", toolName: "getWeather" }) }) }));
41
+ const result = await render(prompt, {
42
+ tokenizer,
43
+ budget: 10_000,
44
+ renderer: anthropic,
45
+ });
46
+ expect(result.messages).toHaveLength(1);
47
+ expect(result.messages[0]).toMatchObject({
48
+ role: "assistant",
49
+ content: [
50
+ {
51
+ type: "tool_use",
52
+ id: "call_123",
53
+ name: "getWeather",
54
+ input: { city: "Paris" },
55
+ },
56
+ ],
57
+ });
58
+ });
59
+ test("anthropic: renders tool results in user messages", async () => {
60
+ const prompt = (_jsx(Region, { priority: 0, children: _jsxs(Message, { messageRole: "assistant", children: [_jsx(ToolCall, { input: { city: "Paris" }, priority: 1, toolCallId: "call_123", toolName: "getWeather" }), _jsx(ToolResult, { output: { temperature: 20 }, priority: 1, toolCallId: "call_123", toolName: "getWeather" })] }) }));
61
+ const result = await render(prompt, {
62
+ tokenizer,
63
+ budget: 10_000,
64
+ renderer: anthropic,
65
+ });
66
+ // Tool result should be moved to a separate user message
67
+ expect(result.messages).toHaveLength(2);
68
+ expect(result.messages[0]?.role).toBe("assistant");
69
+ expect(result.messages[1]?.role).toBe("user");
70
+ expect(result.messages[1]).toMatchObject({
71
+ role: "user",
72
+ content: [
73
+ {
74
+ type: "tool_result",
75
+ tool_use_id: "call_123",
76
+ content: '{"temperature":20}',
77
+ },
78
+ ],
79
+ });
80
+ });
81
+ test("anthropic: full conversation with tool use", async () => {
82
+ const prompt = (_jsxs(Region, { priority: 0, children: [_jsx(Message, { messageRole: "system", children: "You are a weather assistant." }), _jsx(Message, { messageRole: "user", children: "What's the weather in Paris?" }), _jsxs(Message, { messageRole: "assistant", children: ["Let me check.", _jsx(ToolCall, { input: { city: "Paris" }, priority: 1, toolCallId: "call_1", toolName: "getWeather" })] }), _jsx(Message, { messageRole: "user", children: _jsx(ToolResult, { output: { temp: 18 }, priority: 1, toolCallId: "call_1", toolName: "getWeather" }) }), _jsx(Message, { messageRole: "assistant", children: "The temperature in Paris is 18\u00B0C." })] }));
83
+ const result = await render(prompt, {
84
+ tokenizer,
85
+ budget: 10_000,
86
+ renderer: anthropic,
87
+ });
88
+ expect(result.system).toBe("You are a weather assistant.");
89
+ expect(result.messages).toHaveLength(4);
90
+ expect(result.messages[0]?.role).toBe("user");
91
+ expect(result.messages[1]?.role).toBe("assistant");
92
+ expect(result.messages[2]?.role).toBe("user");
93
+ expect(result.messages[3]?.role).toBe("assistant");
94
+ });
95
+ test("anthropic: includes reasoning as text with thinking tags", async () => {
96
+ const prompt = (_jsx(Region, { priority: 0, children: _jsxs(Message, { messageRole: "assistant", children: [_jsx(Reasoning, { priority: 1, text: "Let me think about this..." }), "The answer is 4."] }) }));
97
+ const result = await render(prompt, {
98
+ tokenizer,
99
+ budget: 10_000,
100
+ renderer: anthropic,
101
+ });
102
+ expect(result.messages).toHaveLength(1);
103
+ const content = result.messages[0]?.content;
104
+ expect(Array.isArray(content)).toBe(true);
105
+ if (Array.isArray(content)) {
106
+ const textBlock = content.find((c) => c.type === "text");
107
+ expect(textBlock).toBeDefined();
108
+ if (textBlock && "text" in textBlock) {
109
+ expect(textBlock.text).toContain("<thinking>");
110
+ expect(textBlock.text).toContain("Let me think about this...");
111
+ expect(textBlock.text).toContain("The answer is 4.");
112
+ }
113
+ }
114
+ });
115
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/anthropic/index.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=additional.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"additional.test.d.ts","sourceRoot":"","sources":["../../src/components/additional.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@fastpaca/cria/jsx-runtime";
2
+ import { describe, expect, test } from "vitest";
3
+ import { render } from "../render";
4
+ import { CodeBlock, Examples, Region, Separator } from "./index";
5
+ const tokenizer = (text) => text.length;
6
+ describe("Separator", () => {
7
+ test("inserts separators between children", async () => {
8
+ const element = (_jsxs(Separator, { priority: 0, value: " | ", children: [_jsx(Region, { priority: 0, children: "A" }), _jsx(Region, { priority: 0, children: "B" }), _jsx(Region, { priority: 0, children: "C" })] }));
9
+ const result = await render(element, { tokenizer, budget: 100 });
10
+ expect(result).toBe("A | B | C");
11
+ });
12
+ });
13
+ describe("Examples", () => {
14
+ test("prefixes title and separates examples", async () => {
15
+ const element = (_jsxs(Examples, { priority: 1, separator: "\\n---\\n", title: "Examples:", children: [_jsx(Region, { priority: 0, children: "One" }), _jsx(Region, { priority: 0, children: "Two" })] }));
16
+ const result = await render(element, { tokenizer, budget: 100 });
17
+ expect(result).toContain("Examples:\n");
18
+ expect(result).toContain("One");
19
+ expect(result).toContain("Two");
20
+ expect(result).toContain("---");
21
+ });
22
+ });
23
+ describe("CodeBlock", () => {
24
+ test("renders fenced code", async () => {
25
+ const element = _jsx(CodeBlock, { code: "console.log('hi');", language: "js" });
26
+ const result = await render(element, { tokenizer, budget: 100 });
27
+ expect(result).toContain("```js");
28
+ expect(result).toContain("console.log('hi');");
29
+ });
30
+ });
31
+ //# sourceMappingURL=additional.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"additional.test.js","sourceRoot":"","sources":["../../src/components/additional.test.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEjE,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;AAExD,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,OAAO,GAAG,CACd,MAAC,SAAS,IAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAC,KAAK,aACjC,KAAC,MAAM,IAAC,QAAQ,EAAE,CAAC,kBAAY,EAC/B,KAAC,MAAM,IAAC,QAAQ,EAAE,CAAC,kBAAY,EAC/B,KAAC,MAAM,IAAC,QAAQ,EAAE,CAAC,kBAAY,IACrB,CACb,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,OAAO,GAAG,CACd,MAAC,QAAQ,IAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAC,WAAS,EAAC,KAAK,EAAC,WAAW,aAC1D,KAAC,MAAM,IAAC,QAAQ,EAAE,CAAC,oBAAc,EACjC,KAAC,MAAM,IAAC,QAAQ,EAAE,CAAC,oBAAc,IACxB,CACZ,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,OAAO,GAAG,KAAC,SAAS,IAAC,IAAI,EAAC,oBAAoB,EAAC,QAAQ,EAAC,IAAI,GAAG,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}