ai.matey.react.core 0.2.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.
@@ -0,0 +1,247 @@
1
+ /**
2
+ * useObject Hook
3
+ *
4
+ * React hook for streaming structured objects with streaming support.
5
+ *
6
+ * @module
7
+ */
8
+ import { useState, useCallback, useRef } from 'react';
9
+ /**
10
+ * useObject - React hook for streaming structured objects.
11
+ *
12
+ * Provides state management for streaming JSON objects with
13
+ * partial updates as data arrives.
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * import { useObject } from 'ai.matey.react.core';
18
+ *
19
+ * interface Recipe {
20
+ * name: string;
21
+ * ingredients: string[];
22
+ * instructions: string[];
23
+ * }
24
+ *
25
+ * function RecipeGenerator() {
26
+ * const { object, submit, isLoading } = useObject<Recipe>({
27
+ * api: '/api/generate-recipe',
28
+ * });
29
+ *
30
+ * return (
31
+ * <div>
32
+ * <button onClick={() => submit('Generate a pasta recipe')} disabled={isLoading}>
33
+ * Generate Recipe
34
+ * </button>
35
+ * {object && (
36
+ * <div>
37
+ * <h2>{object.name}</h2>
38
+ * <ul>{object.ingredients?.map((i, idx) => <li key={idx}>{i}</li>)}</ul>
39
+ * </div>
40
+ * )}
41
+ * </div>
42
+ * );
43
+ * }
44
+ * ```
45
+ */
46
+ export function useObject(options = {}) {
47
+ const { api = '/api/object', schema, initialValue, headers = {}, body = {}, onFinish, onError, } = options;
48
+ // State
49
+ const [object, setObject] = useState(initialValue);
50
+ const [isLoading, setIsLoading] = useState(false);
51
+ const [error, setError] = useState(undefined);
52
+ // Refs for abort control
53
+ const abortControllerRef = useRef(null);
54
+ /**
55
+ * Stop current streaming request.
56
+ */
57
+ const stop = useCallback(() => {
58
+ if (abortControllerRef.current) {
59
+ abortControllerRef.current.abort();
60
+ abortControllerRef.current = null;
61
+ }
62
+ }, []);
63
+ /**
64
+ * Submit a prompt to generate an object.
65
+ */
66
+ const submit = useCallback(async (prompt) => {
67
+ try {
68
+ setIsLoading(true);
69
+ setError(undefined);
70
+ setObject(undefined);
71
+ // Create abort controller
72
+ abortControllerRef.current = new AbortController();
73
+ const { signal } = abortControllerRef.current;
74
+ // Prepare request body
75
+ const requestBody = {
76
+ prompt,
77
+ schema,
78
+ ...body,
79
+ };
80
+ // Make request
81
+ const response = await fetch(api, {
82
+ method: 'POST',
83
+ headers: {
84
+ 'Content-Type': 'application/json',
85
+ ...headers,
86
+ },
87
+ body: JSON.stringify(requestBody),
88
+ signal,
89
+ });
90
+ if (!response.ok) {
91
+ throw new Error(`HTTP error! status: ${response.status}`);
92
+ }
93
+ if (!response.body) {
94
+ throw new Error('Response body is null');
95
+ }
96
+ // Handle streaming response
97
+ const reader = response.body.getReader();
98
+ const decoder = new TextDecoder();
99
+ let jsonBuffer = '';
100
+ // Read stream
101
+ while (true) {
102
+ const { done, value } = await reader.read();
103
+ if (done) {
104
+ break;
105
+ }
106
+ const chunk = decoder.decode(value, { stream: true });
107
+ // Parse SSE data format
108
+ const lines = chunk.split('\n');
109
+ for (const line of lines) {
110
+ if (line.startsWith('data: ')) {
111
+ const data = line.slice(6);
112
+ if (data === '[DONE]') {
113
+ break;
114
+ }
115
+ try {
116
+ const parsed = JSON.parse(data);
117
+ if (parsed.object) {
118
+ // Direct object update
119
+ setObject(parsed.object);
120
+ }
121
+ else if (parsed.partial) {
122
+ // Partial JSON string
123
+ jsonBuffer = parsed.partial;
124
+ try {
125
+ const partialObject = JSON.parse(jsonBuffer);
126
+ setObject(partialObject);
127
+ }
128
+ catch {
129
+ // Incomplete JSON, try to parse what we can
130
+ const repaired = tryRepairJson(jsonBuffer);
131
+ if (repaired) {
132
+ setObject(repaired);
133
+ }
134
+ }
135
+ }
136
+ else if (parsed.delta) {
137
+ // Delta update - append to buffer
138
+ jsonBuffer += parsed.delta;
139
+ try {
140
+ const partialObject = JSON.parse(jsonBuffer);
141
+ setObject(partialObject);
142
+ }
143
+ catch {
144
+ // Incomplete JSON
145
+ const repaired = tryRepairJson(jsonBuffer);
146
+ if (repaired) {
147
+ setObject(repaired);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ catch {
153
+ // Ignore parse errors
154
+ }
155
+ }
156
+ }
157
+ }
158
+ // Try to parse final object
159
+ let finalObject;
160
+ if (jsonBuffer) {
161
+ try {
162
+ finalObject = JSON.parse(jsonBuffer);
163
+ setObject(finalObject);
164
+ }
165
+ catch {
166
+ // Keep partial object
167
+ }
168
+ }
169
+ onFinish?.({ object: finalObject, error: undefined });
170
+ }
171
+ catch (err) {
172
+ if (err instanceof Error && err.name === 'AbortError') {
173
+ // Request was aborted
174
+ return;
175
+ }
176
+ const error = err instanceof Error ? err : new Error(String(err));
177
+ setError(error);
178
+ onError?.(error);
179
+ onFinish?.({ object: undefined, error });
180
+ }
181
+ finally {
182
+ setIsLoading(false);
183
+ abortControllerRef.current = null;
184
+ }
185
+ }, [api, body, headers, onError, onFinish, schema]);
186
+ return {
187
+ object,
188
+ submit,
189
+ stop,
190
+ isLoading,
191
+ error,
192
+ };
193
+ }
194
+ /**
195
+ * Try to repair incomplete JSON by closing open brackets.
196
+ */
197
+ function tryRepairJson(json) {
198
+ if (!json.trim()) {
199
+ return null;
200
+ }
201
+ // Count open brackets
202
+ let openBraces = 0;
203
+ let openBrackets = 0;
204
+ let inString = false;
205
+ let escape = false;
206
+ for (const char of json) {
207
+ if (escape) {
208
+ escape = false;
209
+ continue;
210
+ }
211
+ if (char === '\\') {
212
+ escape = true;
213
+ continue;
214
+ }
215
+ if (char === '"') {
216
+ inString = !inString;
217
+ continue;
218
+ }
219
+ if (inString) {
220
+ continue;
221
+ }
222
+ if (char === '{')
223
+ openBraces++;
224
+ if (char === '}')
225
+ openBraces--;
226
+ if (char === '[')
227
+ openBrackets++;
228
+ if (char === ']')
229
+ openBrackets--;
230
+ }
231
+ // Try to close the JSON
232
+ let repaired = json;
233
+ // If we're in a string, close it
234
+ if (inString) {
235
+ repaired += '"';
236
+ }
237
+ // Close brackets and braces
238
+ repaired += ']'.repeat(Math.max(0, openBrackets));
239
+ repaired += '}'.repeat(Math.max(0, openBraces));
240
+ try {
241
+ return JSON.parse(repaired);
242
+ }
243
+ catch {
244
+ return null;
245
+ }
246
+ }
247
+ //# sourceMappingURL=use-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-object.js","sourceRoot":"","sources":["../../src/use-object.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * AI Matey React Core
3
+ *
4
+ * Core React hooks for building AI-powered applications.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ export { useChat } from './use-chat.js';
9
+ export { useCompletion } from './use-completion.js';
10
+ export { useObject } from './use-object.js';
11
+ export type { Message, ToolCall, ToolInvocation, Tool, UseChatOptions, UseChatReturn, ChatRequestOptions, UseCompletionOptions, UseCompletionReturn, CompletionRequestOptions, UseObjectOptions, UseObjectReturn, DirectBackend, DirectModeOptions, DirectToolCallHandler, } from './types.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,YAAY,EACV,OAAO,EACP,QAAQ,EACR,cAAc,EACd,IAAI,EACJ,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EAEf,aAAa,EACb,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,295 @@
1
+ /**
2
+ * React Core Types
3
+ *
4
+ * Type definitions for React hooks and utilities.
5
+ *
6
+ * @module
7
+ */
8
+ import type { IRChatRequest, IRChatResponse, IRStreamChunk, IRParameters, IRTool } from 'ai.matey.types';
9
+ /**
10
+ * Backend adapter interface for direct mode.
11
+ * This allows using a BackendAdapter or Bridge directly without HTTP.
12
+ */
13
+ export interface DirectBackend {
14
+ execute(request: IRChatRequest, signal?: AbortSignal): Promise<IRChatResponse>;
15
+ executeStream?(request: IRChatRequest, signal?: AbortSignal): AsyncGenerator<IRStreamChunk, void, undefined>;
16
+ }
17
+ /**
18
+ * Handler for tool calls in direct mode.
19
+ */
20
+ export type DirectToolCallHandler = (toolName: string, toolInput: Record<string, unknown>, toolId: string) => Promise<string | {
21
+ content: string;
22
+ isError?: boolean;
23
+ }>;
24
+ /**
25
+ * Direct backend mode options.
26
+ */
27
+ export interface DirectModeOptions {
28
+ /**
29
+ * The backend adapter to use (Bridge or BackendAdapter).
30
+ */
31
+ backend: DirectBackend;
32
+ /**
33
+ * System prompt to prepend to conversations.
34
+ */
35
+ systemPrompt?: string | (() => string | Promise<string>);
36
+ /**
37
+ * Default IR parameters for requests.
38
+ */
39
+ defaultParameters?: IRParameters;
40
+ /**
41
+ * Available tools for the conversation.
42
+ */
43
+ tools?: readonly IRTool[];
44
+ /**
45
+ * Handler for tool calls.
46
+ */
47
+ onToolCall?: DirectToolCallHandler;
48
+ /**
49
+ * Auto-execute tools and continue the conversation.
50
+ * @default false
51
+ */
52
+ autoExecuteTools?: boolean;
53
+ /**
54
+ * Maximum tool execution rounds.
55
+ * @default 10
56
+ */
57
+ maxToolRounds?: number;
58
+ }
59
+ /**
60
+ * Message in a chat conversation.
61
+ */
62
+ export interface Message {
63
+ /** Unique message ID */
64
+ id: string;
65
+ /** Message role */
66
+ role: 'user' | 'assistant' | 'system';
67
+ /** Message content */
68
+ content: string;
69
+ /** Creation timestamp */
70
+ createdAt?: Date;
71
+ /** Tool calls made by this message */
72
+ toolCalls?: ToolCall[];
73
+ /** Tool invocations and results */
74
+ toolInvocations?: ToolInvocation[];
75
+ }
76
+ /**
77
+ * Tool call request.
78
+ */
79
+ export interface ToolCall {
80
+ /** Tool call ID */
81
+ id: string;
82
+ /** Tool name */
83
+ name: string;
84
+ /** Tool arguments */
85
+ arguments: Record<string, unknown>;
86
+ }
87
+ /**
88
+ * Tool invocation with result.
89
+ */
90
+ export interface ToolInvocation {
91
+ /** Tool call ID */
92
+ toolCallId: string;
93
+ /** Tool name */
94
+ toolName: string;
95
+ /** Tool arguments */
96
+ args: Record<string, unknown>;
97
+ /** Tool result */
98
+ result?: unknown;
99
+ /** Invocation state */
100
+ state: 'pending' | 'completed' | 'error';
101
+ }
102
+ /**
103
+ * Chat hook options.
104
+ *
105
+ * Supports two modes:
106
+ * 1. HTTP Mode (default): Uses `api` endpoint with fetch
107
+ * 2. Direct Mode: Uses `direct.backend` with wrapper-ir for direct backend access
108
+ */
109
+ export interface UseChatOptions {
110
+ /** Initial messages */
111
+ initialMessages?: Message[];
112
+ /** Initial input value */
113
+ initialInput?: string;
114
+ /** Chat ID for persistence */
115
+ id?: string;
116
+ /** API endpoint for chat */
117
+ api?: string;
118
+ /** Request headers */
119
+ headers?: Record<string, string>;
120
+ /** Request body extras */
121
+ body?: Record<string, unknown>;
122
+ /** Stream protocol */
123
+ streamProtocol?: 'text' | 'data';
124
+ /** Called for each response chunk (HTTP mode only) */
125
+ onResponse?: (response: Response) => void;
126
+ /**
127
+ * Direct backend mode configuration.
128
+ * When provided, bypasses HTTP and uses the backend adapter directly.
129
+ */
130
+ direct?: DirectModeOptions;
131
+ /** Generate unique message IDs */
132
+ generateId?: () => string;
133
+ /** Called when response stream finishes */
134
+ onFinish?: (message: Message) => void;
135
+ /** Called on error */
136
+ onError?: (error: Error) => void;
137
+ /** Keep last message on error */
138
+ keepLastMessageOnError?: boolean;
139
+ /** Max number of automatic tool retries */
140
+ maxToolRoundtrips?: number;
141
+ /** Send extra message fields */
142
+ sendExtraMessageFields?: boolean;
143
+ }
144
+ /**
145
+ * Chat hook return value.
146
+ */
147
+ export interface UseChatReturn {
148
+ /** Chat messages */
149
+ messages: Message[];
150
+ /** Current input value */
151
+ input: string;
152
+ /** Set input value */
153
+ setInput: (input: string) => void;
154
+ /** Handle input change */
155
+ handleInputChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
156
+ /** Handle form submit */
157
+ handleSubmit: (e?: React.FormEvent<HTMLFormElement>, options?: ChatRequestOptions) => void;
158
+ /** Submit message programmatically */
159
+ append: (message: Message | string, options?: ChatRequestOptions) => Promise<string | null | undefined>;
160
+ /** Reload last message */
161
+ reload: (options?: ChatRequestOptions) => Promise<string | null | undefined>;
162
+ /** Stop streaming */
163
+ stop: () => void;
164
+ /** Set messages */
165
+ setMessages: (messages: Message[] | ((messages: Message[]) => Message[])) => void;
166
+ /** Whether currently loading */
167
+ isLoading: boolean;
168
+ /** Error if any */
169
+ error: Error | undefined;
170
+ /** Data from API */
171
+ data?: unknown[];
172
+ }
173
+ /**
174
+ * Chat request options.
175
+ */
176
+ export interface ChatRequestOptions {
177
+ /** Request headers */
178
+ headers?: Record<string, string>;
179
+ /** Request body extras */
180
+ body?: Record<string, unknown>;
181
+ /** Data to send */
182
+ data?: Record<string, string>;
183
+ /** Tools to use */
184
+ tools?: Record<string, Tool>;
185
+ }
186
+ /**
187
+ * Tool definition.
188
+ */
189
+ export interface Tool {
190
+ /** Tool description */
191
+ description?: string;
192
+ /** Tool parameter schema */
193
+ parameters: Record<string, unknown>;
194
+ /** Execute the tool */
195
+ execute?: (args: Record<string, unknown>) => Promise<unknown>;
196
+ }
197
+ /**
198
+ * Completion hook options.
199
+ */
200
+ export interface UseCompletionOptions {
201
+ /** Initial prompt */
202
+ initialInput?: string;
203
+ /** Initial completion */
204
+ initialCompletion?: string;
205
+ /** Completion ID */
206
+ id?: string;
207
+ /** API endpoint */
208
+ api?: string;
209
+ /** Request headers */
210
+ headers?: Record<string, string>;
211
+ /** Request body extras */
212
+ body?: Record<string, unknown>;
213
+ /** Called when completion finishes */
214
+ onFinish?: (prompt: string, completion: string) => void;
215
+ /** Called on error */
216
+ onError?: (error: Error) => void;
217
+ /** Called for each response chunk */
218
+ onResponse?: (response: Response) => void;
219
+ /** Stream protocol */
220
+ streamProtocol?: 'text' | 'data';
221
+ }
222
+ /**
223
+ * Completion hook return value.
224
+ */
225
+ export interface UseCompletionReturn {
226
+ /** Current completion */
227
+ completion: string;
228
+ /** Current input */
229
+ input: string;
230
+ /** Set input */
231
+ setInput: (input: string) => void;
232
+ /** Handle input change */
233
+ handleInputChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
234
+ /** Handle form submit */
235
+ handleSubmit: (e?: React.FormEvent<HTMLFormElement>) => void;
236
+ /** Complete programmatically */
237
+ complete: (prompt: string, options?: CompletionRequestOptions) => Promise<string | null | undefined>;
238
+ /** Stop streaming */
239
+ stop: () => void;
240
+ /** Set completion */
241
+ setCompletion: (completion: string) => void;
242
+ /** Whether currently loading */
243
+ isLoading: boolean;
244
+ /** Error if any */
245
+ error: Error | undefined;
246
+ /** Data from API */
247
+ data?: unknown[];
248
+ }
249
+ /**
250
+ * Completion request options.
251
+ */
252
+ export interface CompletionRequestOptions {
253
+ /** Request headers */
254
+ headers?: Record<string, string>;
255
+ /** Request body extras */
256
+ body?: Record<string, unknown>;
257
+ }
258
+ /**
259
+ * Object hook options.
260
+ */
261
+ export interface UseObjectOptions<T> {
262
+ /** API endpoint */
263
+ api?: string;
264
+ /** Schema for validation */
265
+ schema?: unknown;
266
+ /** Initial object value */
267
+ initialValue?: Partial<T>;
268
+ /** Request headers */
269
+ headers?: Record<string, string>;
270
+ /** Request body extras */
271
+ body?: Record<string, unknown>;
272
+ /** Called on finish */
273
+ onFinish?: (event: {
274
+ object: T | undefined;
275
+ error: Error | undefined;
276
+ }) => void;
277
+ /** Called on error */
278
+ onError?: (error: Error) => void;
279
+ }
280
+ /**
281
+ * Object hook return value.
282
+ */
283
+ export interface UseObjectReturn<T> {
284
+ /** Partial object being streamed */
285
+ object: Partial<T> | undefined;
286
+ /** Submit a prompt */
287
+ submit: (prompt: string) => void;
288
+ /** Stop streaming */
289
+ stop: () => void;
290
+ /** Whether currently loading */
291
+ isLoading: boolean;
292
+ /** Error if any */
293
+ error: Error | undefined;
294
+ }
295
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * useChat Hook
3
+ *
4
+ * React hook for building chat interfaces with streaming support.
5
+ * Supports both HTTP API mode and direct backend mode.
6
+ *
7
+ * @module
8
+ */
9
+ import type { UseChatOptions, UseChatReturn } from './types.js';
10
+ /**
11
+ * useChat - React hook for chat interfaces.
12
+ *
13
+ * Provides state management, streaming, and utilities for building
14
+ * chat applications with AI backends.
15
+ *
16
+ * Supports two modes:
17
+ * 1. HTTP Mode (default): Uses `api` endpoint with fetch
18
+ * 2. Direct Mode: Uses `direct.backend` for direct backend access
19
+ *
20
+ * @example HTTP Mode
21
+ * ```tsx
22
+ * import { useChat } from 'ai.matey.react.core';
23
+ *
24
+ * function ChatComponent() {
25
+ * const { messages, input, handleInputChange, handleSubmit, isLoading } = useChat({
26
+ * api: '/api/chat',
27
+ * });
28
+ *
29
+ * return (
30
+ * <div>
31
+ * {messages.map((m) => (
32
+ * <div key={m.id}>{m.role}: {m.content}</div>
33
+ * ))}
34
+ * <form onSubmit={handleSubmit}>
35
+ * <input value={input} onChange={handleInputChange} />
36
+ * <button type="submit" disabled={isLoading}>Send</button>
37
+ * </form>
38
+ * </div>
39
+ * );
40
+ * }
41
+ * ```
42
+ *
43
+ * @example Direct Mode
44
+ * ```tsx
45
+ * import { useChat } from 'ai.matey.react.core';
46
+ * import { AnthropicBackend } from 'ai.matey.backend/anthropic';
47
+ *
48
+ * const backend = new AnthropicBackend({ apiKey: process.env.ANTHROPIC_API_KEY });
49
+ *
50
+ * function ChatComponent() {
51
+ * const { messages, input, handleInputChange, handleSubmit, isLoading } = useChat({
52
+ * direct: {
53
+ * backend,
54
+ * systemPrompt: 'You are a helpful assistant.',
55
+ * },
56
+ * });
57
+ *
58
+ * return (
59
+ * <div>
60
+ * {messages.map((m) => (
61
+ * <div key={m.id}>{m.role}: {m.content}</div>
62
+ * ))}
63
+ * <form onSubmit={handleSubmit}>
64
+ * <input value={input} onChange={handleInputChange} />
65
+ * <button type="submit" disabled={isLoading}>Send</button>
66
+ * </form>
67
+ * </div>
68
+ * );
69
+ * }
70
+ * ```
71
+ */
72
+ export declare function useChat(options?: UseChatOptions): UseChatReturn;
73
+ //# sourceMappingURL=use-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-chat.d.ts","sourceRoot":"","sources":["../../src/use-chat.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAW,cAAc,EAAE,aAAa,EAAsB,MAAM,YAAY,CAAC;AAmB7F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,wBAAgB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,aAAa,CA6anE"}