@anvia/react 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +83 -1
- package/dist/index.js +287 -18
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,81 @@ type ChatMessage = {
|
|
|
13
13
|
content: string;
|
|
14
14
|
metadata?: unknown;
|
|
15
15
|
};
|
|
16
|
+
type ToolApprovalStatus = "pending" | "approved" | "rejected" | "timed_out";
|
|
17
|
+
type ToolApproval = {
|
|
18
|
+
id: string;
|
|
19
|
+
runId?: string;
|
|
20
|
+
agentId?: string;
|
|
21
|
+
sessionId?: string;
|
|
22
|
+
toolName: string;
|
|
23
|
+
callId?: string;
|
|
24
|
+
internalCallId?: string;
|
|
25
|
+
args?: string;
|
|
26
|
+
status: ToolApprovalStatus;
|
|
27
|
+
requestedAt?: string;
|
|
28
|
+
resolvedAt?: string;
|
|
29
|
+
reason?: string;
|
|
30
|
+
};
|
|
31
|
+
type ToolQuestionStatus = "pending" | "answered";
|
|
32
|
+
type ToolQuestionChoice = {
|
|
33
|
+
label: string;
|
|
34
|
+
value: string;
|
|
35
|
+
};
|
|
36
|
+
type ToolQuestionPrompt = {
|
|
37
|
+
id: string;
|
|
38
|
+
question: string;
|
|
39
|
+
choices: ToolQuestionChoice[];
|
|
40
|
+
};
|
|
41
|
+
type ToolQuestionAnswer = {
|
|
42
|
+
questionId: string;
|
|
43
|
+
answer: string;
|
|
44
|
+
choice?: string;
|
|
45
|
+
custom?: boolean;
|
|
46
|
+
};
|
|
47
|
+
type ToolQuestion = {
|
|
48
|
+
id: string;
|
|
49
|
+
runId?: string;
|
|
50
|
+
agentId?: string;
|
|
51
|
+
sessionId?: string;
|
|
52
|
+
toolName: string;
|
|
53
|
+
callId?: string;
|
|
54
|
+
internalCallId?: string;
|
|
55
|
+
args?: string;
|
|
56
|
+
questions: ToolQuestionPrompt[];
|
|
57
|
+
status: ToolQuestionStatus;
|
|
58
|
+
requestedAt?: string;
|
|
59
|
+
answeredAt?: string;
|
|
60
|
+
answers?: ToolQuestionAnswer[];
|
|
61
|
+
};
|
|
62
|
+
type ToolApprovalDecisionInput = {
|
|
63
|
+
approvalId: string;
|
|
64
|
+
approved: boolean;
|
|
65
|
+
reason?: string;
|
|
66
|
+
approval?: ToolApproval;
|
|
67
|
+
};
|
|
68
|
+
type ToolQuestionAnswerInput = {
|
|
69
|
+
questionId: string;
|
|
70
|
+
answers: ToolQuestionAnswer[];
|
|
71
|
+
question?: ToolQuestion;
|
|
72
|
+
};
|
|
73
|
+
type HumanInputOptions<TEvent = unknown> = {
|
|
74
|
+
endpoint?: string | URL;
|
|
75
|
+
fetch?: typeof fetch;
|
|
76
|
+
eventToApproval?: (event: TEvent) => ToolApproval | undefined;
|
|
77
|
+
eventToQuestion?: (event: TEvent) => ToolQuestion | undefined;
|
|
78
|
+
decideApproval?: (decision: ToolApprovalDecisionInput) => Promise<ToolApproval | undefined>;
|
|
79
|
+
answerQuestion?: (answer: ToolQuestionAnswerInput) => Promise<ToolQuestion | undefined>;
|
|
80
|
+
};
|
|
81
|
+
type HumanInputState = {
|
|
82
|
+
approvals: {
|
|
83
|
+
all: ToolApproval[];
|
|
84
|
+
pending: ToolApproval[];
|
|
85
|
+
};
|
|
86
|
+
questions: {
|
|
87
|
+
all: ToolQuestion[];
|
|
88
|
+
pending: ToolQuestion[];
|
|
89
|
+
};
|
|
90
|
+
};
|
|
16
91
|
type DefaultChatRequest = {
|
|
17
92
|
message: string;
|
|
18
93
|
history: ChatMessage[];
|
|
@@ -27,6 +102,7 @@ type UseChatOptions<TRequest = DefaultChatRequest, TEvent = unknown, TMessage ex
|
|
|
27
102
|
createRequest?: (input: string, messages: TMessage[]) => TRequest;
|
|
28
103
|
eventToDelta?: (event: TEvent) => string | undefined;
|
|
29
104
|
eventToFinal?: (event: TEvent) => string | undefined;
|
|
105
|
+
humanInput?: HumanInputOptions<TEvent>;
|
|
30
106
|
onEvent?: (event: TEvent) => void;
|
|
31
107
|
onError?: (error: unknown) => void;
|
|
32
108
|
};
|
|
@@ -41,6 +117,12 @@ type UseChatResult<TEvent = unknown, TMessage extends ChatMessage = ChatMessage>
|
|
|
41
117
|
status: UseChatStatus;
|
|
42
118
|
error: unknown;
|
|
43
119
|
text: string;
|
|
120
|
+
humanInput: HumanInputState;
|
|
121
|
+
decidingApprovals: Set<string>;
|
|
122
|
+
answeringQuestions: Set<string>;
|
|
123
|
+
approveTool(approvalId: string, reason?: string): Promise<void>;
|
|
124
|
+
rejectTool(approvalId: string, reason?: string): Promise<void>;
|
|
125
|
+
answerToolQuestion(questionId: string, answers: ToolQuestionAnswer[]): Promise<void>;
|
|
44
126
|
};
|
|
45
127
|
|
|
46
128
|
declare function createDirectTransport<TRequest, TEvent>(handler: (request: TRequest) => AsyncIterable<TEvent>): EventTransport<TRequest, TEvent>;
|
|
@@ -102,4 +184,4 @@ type UseCompletionResult = {
|
|
|
102
184
|
};
|
|
103
185
|
declare function useCompletion<TEvent = unknown>(options?: UseCompletionOptions<TEvent>): UseCompletionResult;
|
|
104
186
|
|
|
105
|
-
export { type ChatMessage, type ChatRole, type CreateFetchTransportOptions, type DefaultChatRequest, type EventStreamFormat, EventStreamHttpError, type EventTransport, type FetchEventStreamOptions, type TransportOptions, type UseChatOptions, type UseChatResult, type UseChatStatus, type UseCompletionOptions, type UseCompletionRequest, type UseCompletionResult, type UseCompletionStatus, createChatTransport, createDirectTransport, createFetchTransport, fetchEventStream, readJsonlStream, readSseStream, useChat, useCompletion };
|
|
187
|
+
export { type ChatMessage, type ChatRole, type CreateFetchTransportOptions, type DefaultChatRequest, type EventStreamFormat, EventStreamHttpError, type EventTransport, type FetchEventStreamOptions, type HumanInputOptions, type HumanInputState, type ToolApproval, type ToolApprovalDecisionInput, type ToolApprovalStatus, type ToolQuestion, type ToolQuestionAnswer, type ToolQuestionAnswerInput, type ToolQuestionChoice, type ToolQuestionPrompt, type ToolQuestionStatus, type TransportOptions, type UseChatOptions, type UseChatResult, type UseChatStatus, type UseCompletionOptions, type UseCompletionRequest, type UseCompletionResult, type UseCompletionStatus, createChatTransport, createDirectTransport, createFetchTransport, fetchEventStream, readJsonlStream, readSseStream, useChat, useCompletion };
|
package/dist/index.js
CHANGED
|
@@ -249,6 +249,117 @@ function isRecord(value) {
|
|
|
249
249
|
return typeof value === "object" && value !== null;
|
|
250
250
|
}
|
|
251
251
|
|
|
252
|
+
// src/human-input.ts
|
|
253
|
+
function defaultEventToApproval(event) {
|
|
254
|
+
if (!isRecord2(event)) {
|
|
255
|
+
return void 0;
|
|
256
|
+
}
|
|
257
|
+
if (event.type !== "tool_approval_request" && event.type !== "tool_approval_result") {
|
|
258
|
+
return void 0;
|
|
259
|
+
}
|
|
260
|
+
return isToolApproval(event.approval) ? event.approval : void 0;
|
|
261
|
+
}
|
|
262
|
+
function defaultEventToQuestion(event) {
|
|
263
|
+
if (!isRecord2(event)) {
|
|
264
|
+
return void 0;
|
|
265
|
+
}
|
|
266
|
+
if (event.type !== "tool_question_request" && event.type !== "tool_question_result") {
|
|
267
|
+
return void 0;
|
|
268
|
+
}
|
|
269
|
+
return isToolQuestion(event.question) ? event.question : void 0;
|
|
270
|
+
}
|
|
271
|
+
async function defaultDecideApproval(input, options) {
|
|
272
|
+
const endpoint = requireEndpoint(options.endpoint, "decideApproval");
|
|
273
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
274
|
+
if (fetchImpl === void 0) {
|
|
275
|
+
throw new Error("humanInput approval decisions require a fetch implementation");
|
|
276
|
+
}
|
|
277
|
+
const response = await fetchImpl(
|
|
278
|
+
endpointUrl(endpoint, `approvals/${input.approvalId}/decision`),
|
|
279
|
+
{
|
|
280
|
+
method: "POST",
|
|
281
|
+
headers: { "content-type": "application/json" },
|
|
282
|
+
body: JSON.stringify({
|
|
283
|
+
approved: input.approved,
|
|
284
|
+
...input.reason === void 0 ? {} : { reason: input.reason }
|
|
285
|
+
})
|
|
286
|
+
}
|
|
287
|
+
);
|
|
288
|
+
if (!response.ok) {
|
|
289
|
+
throw new Error(`Tool approval decision failed with status ${response.status}`);
|
|
290
|
+
}
|
|
291
|
+
return responseJson(response);
|
|
292
|
+
}
|
|
293
|
+
async function defaultAnswerQuestion(input, options) {
|
|
294
|
+
const endpoint = requireEndpoint(options.endpoint, "answerQuestion");
|
|
295
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
296
|
+
if (fetchImpl === void 0) {
|
|
297
|
+
throw new Error("humanInput question answers require a fetch implementation");
|
|
298
|
+
}
|
|
299
|
+
const response = await fetchImpl(endpointUrl(endpoint, `questions/${input.questionId}/answer`), {
|
|
300
|
+
method: "POST",
|
|
301
|
+
headers: { "content-type": "application/json" },
|
|
302
|
+
body: JSON.stringify({ answers: input.answers })
|
|
303
|
+
});
|
|
304
|
+
if (!response.ok) {
|
|
305
|
+
throw new Error(`Tool question answer failed with status ${response.status}`);
|
|
306
|
+
}
|
|
307
|
+
return responseJson(response);
|
|
308
|
+
}
|
|
309
|
+
function upsertById(items, item) {
|
|
310
|
+
const index = items.findIndex((current) => current.id === item.id);
|
|
311
|
+
if (index === -1) {
|
|
312
|
+
return [...items, item];
|
|
313
|
+
}
|
|
314
|
+
const next = [...items];
|
|
315
|
+
next[index] = item;
|
|
316
|
+
return next;
|
|
317
|
+
}
|
|
318
|
+
function requireEndpoint(endpoint, operation) {
|
|
319
|
+
if (endpoint === void 0) {
|
|
320
|
+
throw new Error(`humanInput.${operation} requires endpoint or a custom handler`);
|
|
321
|
+
}
|
|
322
|
+
return endpoint;
|
|
323
|
+
}
|
|
324
|
+
function endpointUrl(endpoint, path) {
|
|
325
|
+
const suffix = path.replace(/^\/+/, "");
|
|
326
|
+
if (endpoint instanceof URL) {
|
|
327
|
+
const url = new URL(endpoint.toString());
|
|
328
|
+
url.pathname = joinPath(url.pathname, suffix);
|
|
329
|
+
return url;
|
|
330
|
+
}
|
|
331
|
+
if (/^[a-z][a-z\d+\-.]*:\/\//i.test(endpoint)) {
|
|
332
|
+
const url = new URL(endpoint);
|
|
333
|
+
url.pathname = joinPath(url.pathname, suffix);
|
|
334
|
+
return url.toString();
|
|
335
|
+
}
|
|
336
|
+
return joinPath(endpoint, suffix);
|
|
337
|
+
}
|
|
338
|
+
function joinPath(base, suffix) {
|
|
339
|
+
const trimmedBase = base.replace(/\/+$/, "");
|
|
340
|
+
const trimmedSuffix = suffix.replace(/^\/+/, "");
|
|
341
|
+
if (trimmedBase.length === 0) {
|
|
342
|
+
return `/${trimmedSuffix}`;
|
|
343
|
+
}
|
|
344
|
+
return `${trimmedBase}/${trimmedSuffix}`;
|
|
345
|
+
}
|
|
346
|
+
async function responseJson(response) {
|
|
347
|
+
const text = await response.text();
|
|
348
|
+
if (text.trim().length === 0) {
|
|
349
|
+
return void 0;
|
|
350
|
+
}
|
|
351
|
+
return JSON.parse(text);
|
|
352
|
+
}
|
|
353
|
+
function isToolApproval(value) {
|
|
354
|
+
return isRecord2(value) && typeof value.id === "string" && typeof value.toolName === "string" && typeof value.status === "string";
|
|
355
|
+
}
|
|
356
|
+
function isToolQuestion(value) {
|
|
357
|
+
return isRecord2(value) && typeof value.id === "string" && typeof value.toolName === "string" && typeof value.status === "string" && Array.isArray(value.questions);
|
|
358
|
+
}
|
|
359
|
+
function isRecord2(value) {
|
|
360
|
+
return typeof value === "object" && value !== null;
|
|
361
|
+
}
|
|
362
|
+
|
|
252
363
|
// src/use-chat.ts
|
|
253
364
|
function useChat(options = {}) {
|
|
254
365
|
const [messages, setMessages] = useState(() => [...options.initialMessages ?? []]);
|
|
@@ -256,11 +367,31 @@ function useChat(options = {}) {
|
|
|
256
367
|
const [input, setInput] = useState("");
|
|
257
368
|
const [status, setStatus] = useState("idle");
|
|
258
369
|
const [error, setError] = useState();
|
|
370
|
+
const [approvals, setApprovals] = useState([]);
|
|
371
|
+
const [questions, setQuestions] = useState([]);
|
|
372
|
+
const [decidingApprovals, setDecidingApprovals] = useState(() => /* @__PURE__ */ new Set());
|
|
373
|
+
const [answeringQuestions, setAnsweringQuestions] = useState(() => /* @__PURE__ */ new Set());
|
|
259
374
|
const abortRef = useRef(void 0);
|
|
260
375
|
const messagesRef = useRef(messages);
|
|
376
|
+
const approvalsRef = useRef(approvals);
|
|
377
|
+
const questionsRef = useRef(questions);
|
|
378
|
+
const decidingApprovalsRef = useRef(decidingApprovals);
|
|
379
|
+
const answeringQuestionsRef = useRef(answeringQuestions);
|
|
261
380
|
useEffect(() => {
|
|
262
381
|
messagesRef.current = messages;
|
|
263
382
|
}, [messages]);
|
|
383
|
+
useEffect(() => {
|
|
384
|
+
approvalsRef.current = approvals;
|
|
385
|
+
}, [approvals]);
|
|
386
|
+
useEffect(() => {
|
|
387
|
+
questionsRef.current = questions;
|
|
388
|
+
}, [questions]);
|
|
389
|
+
useEffect(() => {
|
|
390
|
+
decidingApprovalsRef.current = decidingApprovals;
|
|
391
|
+
}, [decidingApprovals]);
|
|
392
|
+
useEffect(() => {
|
|
393
|
+
answeringQuestionsRef.current = answeringQuestions;
|
|
394
|
+
}, [answeringQuestions]);
|
|
264
395
|
useEffect(() => {
|
|
265
396
|
return () => {
|
|
266
397
|
abortRef.current?.abort();
|
|
@@ -281,6 +412,33 @@ function useChat(options = {}) {
|
|
|
281
412
|
const createRequest = options.createRequest ?? defaultCreateRequest;
|
|
282
413
|
const eventToDelta = options.eventToDelta ?? defaultEventToDelta;
|
|
283
414
|
const eventToFinal = options.eventToFinal ?? defaultEventToFinal;
|
|
415
|
+
const humanInputOptions = options.humanInput;
|
|
416
|
+
const eventToApproval = humanInputOptions?.eventToApproval ?? defaultEventToApproval;
|
|
417
|
+
const eventToQuestion = humanInputOptions?.eventToQuestion ?? defaultEventToQuestion;
|
|
418
|
+
const updateApproval = useCallback((approval) => {
|
|
419
|
+
setApprovals((current) => {
|
|
420
|
+
const next = upsertById(current, approval);
|
|
421
|
+
approvalsRef.current = next;
|
|
422
|
+
return next;
|
|
423
|
+
});
|
|
424
|
+
}, []);
|
|
425
|
+
const updateQuestion = useCallback((question) => {
|
|
426
|
+
setQuestions((current) => {
|
|
427
|
+
const next = upsertById(current, question);
|
|
428
|
+
questionsRef.current = next;
|
|
429
|
+
return next;
|
|
430
|
+
});
|
|
431
|
+
}, []);
|
|
432
|
+
const clearHumanInput = useCallback(() => {
|
|
433
|
+
approvalsRef.current = [];
|
|
434
|
+
questionsRef.current = [];
|
|
435
|
+
decidingApprovalsRef.current = /* @__PURE__ */ new Set();
|
|
436
|
+
answeringQuestionsRef.current = /* @__PURE__ */ new Set();
|
|
437
|
+
setApprovals([]);
|
|
438
|
+
setQuestions([]);
|
|
439
|
+
setDecidingApprovals(/* @__PURE__ */ new Set());
|
|
440
|
+
setAnsweringQuestions(/* @__PURE__ */ new Set());
|
|
441
|
+
}, []);
|
|
284
442
|
const appendAssistantText = useCallback((assistantId, text2) => {
|
|
285
443
|
setMessages(
|
|
286
444
|
(current) => current.map(
|
|
@@ -315,10 +473,21 @@ function useChat(options = {}) {
|
|
|
315
473
|
setError(void 0);
|
|
316
474
|
setStatus("streaming");
|
|
317
475
|
setEvents([]);
|
|
476
|
+
clearHumanInput();
|
|
318
477
|
setMessages([...requestMessages, assistantMessage]);
|
|
319
478
|
try {
|
|
320
479
|
for await (const event of transport.send(request, { signal: abortController.signal })) {
|
|
321
480
|
setEvents((current) => [...current, event]);
|
|
481
|
+
if (humanInputOptions !== void 0) {
|
|
482
|
+
const approval = eventToApproval(event);
|
|
483
|
+
if (approval !== void 0) {
|
|
484
|
+
updateApproval(approval);
|
|
485
|
+
}
|
|
486
|
+
const question = eventToQuestion(event);
|
|
487
|
+
if (question !== void 0) {
|
|
488
|
+
updateQuestion(question);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
322
491
|
options.onEvent?.(event);
|
|
323
492
|
const delta = eventToDelta(event);
|
|
324
493
|
if (delta !== void 0 && delta.length > 0) {
|
|
@@ -349,30 +518,115 @@ function useChat(options = {}) {
|
|
|
349
518
|
[
|
|
350
519
|
appendAssistantText,
|
|
351
520
|
createRequest,
|
|
521
|
+
clearHumanInput,
|
|
352
522
|
eventToDelta,
|
|
353
523
|
eventToFinal,
|
|
524
|
+
eventToApproval,
|
|
525
|
+
eventToQuestion,
|
|
526
|
+
humanInputOptions,
|
|
354
527
|
input,
|
|
355
528
|
options,
|
|
356
529
|
replaceAssistantText,
|
|
357
|
-
transport
|
|
530
|
+
transport,
|
|
531
|
+
updateApproval,
|
|
532
|
+
updateQuestion
|
|
358
533
|
]
|
|
359
534
|
);
|
|
535
|
+
const decideToolApproval = useCallback(
|
|
536
|
+
async (approvalId, approved, reason) => {
|
|
537
|
+
if (humanInputOptions === void 0) {
|
|
538
|
+
throw new Error("useChat humanInput is not configured");
|
|
539
|
+
}
|
|
540
|
+
if (decidingApprovalsRef.current.has(approvalId)) {
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
const nextDeciding = new Set(decidingApprovalsRef.current).add(approvalId);
|
|
544
|
+
decidingApprovalsRef.current = nextDeciding;
|
|
545
|
+
setDecidingApprovals(nextDeciding);
|
|
546
|
+
try {
|
|
547
|
+
const approval = approvalsRef.current.find((item) => item.id === approvalId);
|
|
548
|
+
const input2 = {
|
|
549
|
+
approvalId,
|
|
550
|
+
approved,
|
|
551
|
+
...reason === void 0 ? {} : { reason },
|
|
552
|
+
...approval === void 0 ? {} : { approval }
|
|
553
|
+
};
|
|
554
|
+
const result = humanInputOptions.decideApproval === void 0 ? await defaultDecideApproval(input2, humanInputOptions) : await humanInputOptions.decideApproval(input2);
|
|
555
|
+
if (result !== void 0) {
|
|
556
|
+
updateApproval(result);
|
|
557
|
+
}
|
|
558
|
+
} finally {
|
|
559
|
+
const next = new Set(decidingApprovalsRef.current);
|
|
560
|
+
next.delete(approvalId);
|
|
561
|
+
decidingApprovalsRef.current = next;
|
|
562
|
+
setDecidingApprovals(next);
|
|
563
|
+
}
|
|
564
|
+
},
|
|
565
|
+
[humanInputOptions, updateApproval]
|
|
566
|
+
);
|
|
567
|
+
const approveTool = useCallback(
|
|
568
|
+
async (approvalId, reason) => {
|
|
569
|
+
await decideToolApproval(approvalId, true, reason);
|
|
570
|
+
},
|
|
571
|
+
[decideToolApproval]
|
|
572
|
+
);
|
|
573
|
+
const rejectTool = useCallback(
|
|
574
|
+
async (approvalId, reason) => {
|
|
575
|
+
await decideToolApproval(approvalId, false, reason);
|
|
576
|
+
},
|
|
577
|
+
[decideToolApproval]
|
|
578
|
+
);
|
|
579
|
+
const answerToolQuestion = useCallback(
|
|
580
|
+
async (questionId, answers) => {
|
|
581
|
+
if (humanInputOptions === void 0) {
|
|
582
|
+
throw new Error("useChat humanInput is not configured");
|
|
583
|
+
}
|
|
584
|
+
if (answeringQuestionsRef.current.has(questionId)) {
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
const nextAnswering = new Set(answeringQuestionsRef.current).add(questionId);
|
|
588
|
+
answeringQuestionsRef.current = nextAnswering;
|
|
589
|
+
setAnsweringQuestions(nextAnswering);
|
|
590
|
+
try {
|
|
591
|
+
const question = questionsRef.current.find((item) => item.id === questionId);
|
|
592
|
+
const input2 = {
|
|
593
|
+
questionId,
|
|
594
|
+
answers,
|
|
595
|
+
...question === void 0 ? {} : { question }
|
|
596
|
+
};
|
|
597
|
+
const result = humanInputOptions.answerQuestion === void 0 ? await defaultAnswerQuestion(input2, humanInputOptions) : await humanInputOptions.answerQuestion(input2);
|
|
598
|
+
if (result !== void 0) {
|
|
599
|
+
updateQuestion(result);
|
|
600
|
+
}
|
|
601
|
+
} finally {
|
|
602
|
+
const next = new Set(answeringQuestionsRef.current);
|
|
603
|
+
next.delete(questionId);
|
|
604
|
+
answeringQuestionsRef.current = next;
|
|
605
|
+
setAnsweringQuestions(next);
|
|
606
|
+
}
|
|
607
|
+
},
|
|
608
|
+
[humanInputOptions, updateQuestion]
|
|
609
|
+
);
|
|
360
610
|
const stop = useCallback(() => {
|
|
361
611
|
abortRef.current?.abort();
|
|
362
612
|
abortRef.current = void 0;
|
|
363
613
|
setStatus("idle");
|
|
364
614
|
}, []);
|
|
365
|
-
const reset = useCallback(
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
615
|
+
const reset = useCallback(
|
|
616
|
+
(nextMessages) => {
|
|
617
|
+
const resetMessages = nextMessages ?? [];
|
|
618
|
+
messagesRef.current = resetMessages;
|
|
619
|
+
abortRef.current?.abort();
|
|
620
|
+
abortRef.current = void 0;
|
|
621
|
+
setMessages(resetMessages);
|
|
622
|
+
setEvents([]);
|
|
623
|
+
clearHumanInput();
|
|
624
|
+
setError(void 0);
|
|
625
|
+
setInput("");
|
|
626
|
+
setStatus("idle");
|
|
627
|
+
},
|
|
628
|
+
[clearHumanInput]
|
|
629
|
+
);
|
|
376
630
|
const text = messages.filter((message) => message.role === "assistant").map((message) => message.content).join("");
|
|
377
631
|
return {
|
|
378
632
|
messages,
|
|
@@ -384,7 +638,22 @@ function useChat(options = {}) {
|
|
|
384
638
|
reset,
|
|
385
639
|
status,
|
|
386
640
|
error,
|
|
387
|
-
text
|
|
641
|
+
text,
|
|
642
|
+
humanInput: {
|
|
643
|
+
approvals: {
|
|
644
|
+
all: approvals,
|
|
645
|
+
pending: approvals.filter((approval) => approval.status === "pending")
|
|
646
|
+
},
|
|
647
|
+
questions: {
|
|
648
|
+
all: questions,
|
|
649
|
+
pending: questions.filter((question) => question.status === "pending")
|
|
650
|
+
}
|
|
651
|
+
},
|
|
652
|
+
decidingApprovals,
|
|
653
|
+
answeringQuestions,
|
|
654
|
+
approveTool,
|
|
655
|
+
rejectTool,
|
|
656
|
+
answerToolQuestion
|
|
388
657
|
};
|
|
389
658
|
}
|
|
390
659
|
function isAbortError(error) {
|
|
@@ -396,28 +665,28 @@ import { useCallback as useCallback2, useEffect as useEffect2, useMemo as useMem
|
|
|
396
665
|
|
|
397
666
|
// src/completion-defaults.ts
|
|
398
667
|
function defaultCompletionEventToDelta(event) {
|
|
399
|
-
if (!
|
|
668
|
+
if (!isRecord3(event)) {
|
|
400
669
|
return void 0;
|
|
401
670
|
}
|
|
402
671
|
return event.type === "text_delta" && typeof event.delta === "string" ? event.delta : void 0;
|
|
403
672
|
}
|
|
404
673
|
function defaultCompletionEventToFinal(event) {
|
|
405
|
-
if (!
|
|
674
|
+
if (!isRecord3(event) || event.type !== "final") {
|
|
406
675
|
return void 0;
|
|
407
676
|
}
|
|
408
677
|
const response = event.response;
|
|
409
|
-
if (!
|
|
678
|
+
if (!isRecord3(response) || !Array.isArray(response.choice)) {
|
|
410
679
|
return void 0;
|
|
411
680
|
}
|
|
412
681
|
const parts = [];
|
|
413
682
|
for (const item of response.choice) {
|
|
414
|
-
if (
|
|
683
|
+
if (isRecord3(item) && item.type === "text" && typeof item.text === "string") {
|
|
415
684
|
parts.push(item.text);
|
|
416
685
|
}
|
|
417
686
|
}
|
|
418
687
|
return parts.length > 0 ? parts.join("") : void 0;
|
|
419
688
|
}
|
|
420
|
-
function
|
|
689
|
+
function isRecord3(value) {
|
|
421
690
|
return typeof value === "object" && value !== null;
|
|
422
691
|
}
|
|
423
692
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/direct.ts","../src/streams.ts","../src/fetch.ts","../src/transport.ts","../src/use-chat.ts","../src/chat-defaults.ts","../src/use-completion.ts","../src/completion-defaults.ts"],"sourcesContent":["import type { EventTransport } from \"./types\";\n\nexport function createDirectTransport<TRequest, TEvent>(\n handler: (request: TRequest) => AsyncIterable<TEvent>,\n): EventTransport<TRequest, TEvent> {\n return {\n async *send(request, options) {\n const iterable = handler(request);\n const iterator = iterable[Symbol.asyncIterator]();\n try {\n while (true) {\n if (options?.signal?.aborted) {\n break;\n }\n\n const next = await iterator.next();\n if (next.done) {\n break;\n }\n\n yield next.value;\n }\n } finally {\n await iterator.return?.();\n }\n },\n };\n}\n","export async function* readJsonlStream<TEvent>(\n stream: ReadableStream<Uint8Array>,\n): AsyncIterable<TEvent> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const next = await reader.read();\n if (next.done === true) {\n break;\n }\n\n buffer += decoder.decode(next.value, { stream: true });\n const lines = buffer.split(/\\r?\\n/);\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length > 0) {\n yield JSON.parse(trimmed) as TEvent;\n }\n }\n }\n\n buffer += decoder.decode();\n const trimmed = buffer.trim();\n if (trimmed.length > 0) {\n yield JSON.parse(trimmed) as TEvent;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport async function* readSseStream<TEvent>(\n stream: ReadableStream<Uint8Array>,\n): AsyncIterable<TEvent> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let event = createEmptySseEvent();\n\n try {\n while (true) {\n const next = await reader.read();\n if (next.done === true) {\n break;\n }\n\n buffer += decoder.decode(next.value, { stream: true });\n const lines = buffer.split(/\\r?\\n/);\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const parsed = parseSseLine(line, event);\n event = parsed.event;\n if (parsed.complete === true && parsed.data !== undefined) {\n yield JSON.parse(parsed.data) as TEvent;\n }\n }\n }\n\n buffer += decoder.decode();\n if (buffer.length > 0) {\n const parsed = parseSseLine(buffer, event);\n event = parsed.event;\n if (parsed.complete === true && parsed.data !== undefined) {\n yield JSON.parse(parsed.data) as TEvent;\n }\n }\n const data = flushSseEvent(event);\n if (data !== undefined) {\n yield JSON.parse(data) as TEvent;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction createEmptySseEvent(): { data: string[] } {\n return { data: [] };\n}\n\nfunction parseSseLine(\n line: string,\n event: { data: string[] },\n): { event: { data: string[] }; complete?: true; data?: string } {\n if (line === \"\") {\n const data = flushSseEvent(event);\n return data === undefined\n ? { event: createEmptySseEvent(), complete: true }\n : { event: createEmptySseEvent(), complete: true, data };\n }\n\n if (line.startsWith(\":\")) {\n return { event };\n }\n\n const separator = line.indexOf(\":\");\n const field = separator === -1 ? line : line.slice(0, separator);\n const value = separator === -1 ? \"\" : line.slice(separator + 1).replace(/^ /, \"\");\n\n if (field === \"data\") {\n event.data.push(value);\n }\n\n return { event };\n}\n\nfunction flushSseEvent(event: { data: string[] }): string | undefined {\n if (event.data.length === 0) {\n return undefined;\n }\n\n return event.data.join(\"\\n\");\n}\n","import { readJsonlStream, readSseStream } from \"./streams\";\nimport type { EventStreamFormat } from \"./types\";\n\nexport type FetchEventStreamOptions = Omit<RequestInit, \"headers\"> & {\n format?: EventStreamFormat;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n};\n\nexport class EventStreamHttpError extends Error {\n constructor(\n readonly response: Response,\n readonly body: string,\n ) {\n super(`Event stream request failed with status ${response.status}`);\n this.name = \"EventStreamHttpError\";\n }\n}\n\nexport async function* fetchEventStream<TEvent>(\n input: string | URL | Request,\n options: FetchEventStreamOptions = {},\n): AsyncIterable<TEvent> {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (fetchImpl === undefined) {\n throw new Error(\"fetchEventStream requires a fetch implementation\");\n }\n\n const response = await fetchImpl(input, fetchOptions(options));\n if (!response.ok) {\n throw new EventStreamHttpError(response, await response.text());\n }\n if (response.body === null) {\n throw new Error(\"Event stream response does not include a body\");\n }\n\n const format = options.format ?? inferEventStreamFormat(response.headers.get(\"content-type\"));\n if (format === \"sse\") {\n yield* readSseStream<TEvent>(response.body);\n return;\n }\n\n yield* readJsonlStream<TEvent>(response.body);\n}\n\nfunction fetchOptions(options: FetchEventStreamOptions): RequestInit {\n const { format: _format, fetch: _fetch, ...init } = options;\n return init;\n}\n\nfunction inferEventStreamFormat(contentType: string | null): EventStreamFormat {\n return contentType?.toLowerCase().includes(\"text/event-stream\") ? \"sse\" : \"jsonl\";\n}\n","import { type FetchEventStreamOptions, fetchEventStream } from \"./fetch\";\nimport type { EventStreamFormat, EventTransport } from \"./types\";\n\nexport type CreateFetchTransportOptions<TRequest, TEvent> = {\n endpoint: string | URL | ((request: TRequest) => string | URL);\n method?: string;\n format?: EventStreamFormat;\n fetch?: typeof fetch;\n headers?: HeadersInit | ((request: TRequest) => HeadersInit | Promise<HeadersInit>);\n body?: (request: TRequest) => BodyInit | null | undefined | Promise<BodyInit | null | undefined>;\n init?: Omit<RequestInit, \"body\" | \"headers\" | \"method\" | \"signal\">;\n mapEvent?: (event: unknown) => TEvent;\n};\n\nexport function createFetchTransport<TRequest, TEvent = unknown>(\n options: CreateFetchTransportOptions<TRequest, TEvent>,\n): EventTransport<TRequest, TEvent> {\n return {\n async *send(request, transportOptions = {}) {\n const endpoint =\n typeof options.endpoint === \"function\" ? options.endpoint(request) : options.endpoint;\n const requestHeaders = await resolveHeaders(options.headers, request);\n const headers = mergeHeaders(requestHeaders, transportOptions.headers);\n const method = options.method ?? \"POST\";\n const body = await resolveBody(options.body, request, headers);\n const init: FetchEventStreamOptions = {\n ...(options.init ?? {}),\n method,\n headers,\n format: options.format ?? \"jsonl\",\n };\n\n if (body !== undefined) {\n init.body = body;\n }\n if (transportOptions.signal !== undefined) {\n init.signal = transportOptions.signal;\n }\n if (options.fetch !== undefined) {\n init.fetch = options.fetch;\n }\n\n for await (const event of fetchEventStream<unknown>(endpoint, init)) {\n yield options.mapEvent === undefined ? (event as TEvent) : options.mapEvent(event);\n }\n },\n };\n}\n\nexport function createChatTransport<TRequest, TEvent = unknown>(\n options: CreateFetchTransportOptions<TRequest, TEvent>,\n): EventTransport<TRequest, TEvent> {\n return createFetchTransport(options);\n}\n\nasync function resolveHeaders<TRequest>(\n headers: CreateFetchTransportOptions<TRequest, unknown>[\"headers\"],\n request: TRequest,\n): Promise<HeadersInit | undefined> {\n return typeof headers === \"function\" ? headers(request) : headers;\n}\n\nasync function resolveBody<TRequest>(\n body: CreateFetchTransportOptions<TRequest, unknown>[\"body\"],\n request: TRequest,\n headers: Headers,\n): Promise<BodyInit | null | undefined> {\n if (body !== undefined) {\n return body(request);\n }\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n return JSON.stringify(request);\n}\n\nfunction mergeHeaders(...values: (HeadersInit | undefined)[]): Headers {\n const headers = new Headers();\n\n for (const value of values) {\n if (value === undefined) {\n continue;\n }\n new Headers(value).forEach((headerValue, key) => {\n headers.set(key, headerValue);\n });\n }\n\n return headers;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n createMessage,\n defaultCreateRequest,\n defaultEventToDelta,\n defaultEventToFinal,\n} from \"./chat-defaults\";\nimport { createChatTransport } from \"./transport\";\nimport type { ChatMessage, DefaultChatRequest, UseChatOptions, UseChatResult } from \"./types\";\n\nexport function useChat<\n TRequest = DefaultChatRequest,\n TEvent = unknown,\n TMessage extends ChatMessage = ChatMessage,\n>(options: UseChatOptions<TRequest, TEvent, TMessage> = {}): UseChatResult<TEvent, TMessage> {\n const [messages, setMessages] = useState<TMessage[]>(() => [...(options.initialMessages ?? [])]);\n const [events, setEvents] = useState<TEvent[]>([]);\n const [input, setInput] = useState(\"\");\n const [status, setStatus] = useState<UseChatResult<TEvent, TMessage>[\"status\"]>(\"idle\");\n const [error, setError] = useState<unknown>();\n const abortRef = useRef<AbortController | undefined>(undefined);\n const messagesRef = useRef(messages);\n\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n const transport = useMemo(() => {\n if (options.transport !== undefined) {\n return options.transport;\n }\n if (options.endpoint === undefined) {\n return undefined;\n }\n\n return createChatTransport<TRequest, TEvent>({\n endpoint: options.endpoint,\n format: options.format ?? \"jsonl\",\n });\n }, [options.transport, options.endpoint, options.format]);\n\n const createRequest = options.createRequest ?? defaultCreateRequest<TRequest, TMessage>;\n const eventToDelta = options.eventToDelta ?? defaultEventToDelta<TEvent>;\n const eventToFinal = options.eventToFinal ?? defaultEventToFinal<TEvent>;\n\n const appendAssistantText = useCallback((assistantId: string, text: string) => {\n setMessages((current) =>\n current.map((message) =>\n message.id === assistantId\n ? ({ ...message, content: `${message.content}${text}` } as TMessage)\n : message,\n ),\n );\n }, []);\n\n const replaceAssistantText = useCallback((assistantId: string, text: string) => {\n setMessages((current) =>\n current.map((message) =>\n message.id === assistantId ? ({ ...message, content: text } as TMessage) : message,\n ),\n );\n }, []);\n\n const send = useCallback(\n async (nextInput?: string) => {\n if (transport === undefined) {\n throw new Error(\"useChat requires either transport or endpoint\");\n }\n\n const content = nextInput ?? input;\n if (content.trim().length === 0) {\n return;\n }\n\n abortRef.current?.abort();\n const abortController = new AbortController();\n abortRef.current = abortController;\n\n const userMessage = createMessage<TMessage>(\"user\", content);\n const assistantMessage = createMessage<TMessage>(\"assistant\", \"\");\n const requestMessages = [...messagesRef.current, userMessage];\n const request = createRequest(content, requestMessages);\n\n setInput(\"\");\n setError(undefined);\n setStatus(\"streaming\");\n setEvents([]);\n setMessages([...requestMessages, assistantMessage]);\n\n try {\n for await (const event of transport.send(request, { signal: abortController.signal })) {\n setEvents((current) => [...current, event]);\n options.onEvent?.(event);\n\n const delta = eventToDelta(event);\n if (delta !== undefined && delta.length > 0) {\n appendAssistantText(assistantMessage.id, delta);\n }\n\n const final = eventToFinal(event);\n if (final !== undefined) {\n replaceAssistantText(assistantMessage.id, final);\n }\n }\n\n if (!abortController.signal.aborted) {\n setStatus(\"idle\");\n }\n } catch (caught) {\n if (isAbortError(caught)) {\n setStatus(\"idle\");\n return;\n }\n\n setError(caught);\n setStatus(\"error\");\n options.onError?.(caught);\n } finally {\n if (abortRef.current === abortController) {\n abortRef.current = undefined;\n }\n }\n },\n [\n appendAssistantText,\n createRequest,\n eventToDelta,\n eventToFinal,\n input,\n options,\n replaceAssistantText,\n transport,\n ],\n );\n\n const stop = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = undefined;\n setStatus(\"idle\");\n }, []);\n\n const reset = useCallback((nextMessages?: TMessage[]) => {\n const resetMessages = nextMessages ?? [];\n messagesRef.current = resetMessages;\n abortRef.current?.abort();\n abortRef.current = undefined;\n setMessages(resetMessages);\n setEvents([]);\n setError(undefined);\n setInput(\"\");\n setStatus(\"idle\");\n }, []);\n\n const text = messages\n .filter((message) => message.role === \"assistant\")\n .map((message) => message.content)\n .join(\"\");\n\n return {\n messages,\n events,\n input,\n setInput,\n send,\n stop,\n reset,\n status,\n error,\n text,\n };\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === \"AbortError\";\n}\n","import type { ChatMessage, ChatRole, DefaultChatRequest } from \"./types\";\n\nexport function defaultCreateRequest<TRequest, TMessage extends ChatMessage>(\n input: string,\n messages: TMessage[],\n): TRequest {\n return {\n message: input,\n history: messages.slice(0, -1),\n stream: true,\n } as DefaultChatRequest as TRequest;\n}\n\nexport function createMessage<TMessage extends ChatMessage>(\n role: ChatRole,\n content: string,\n): TMessage {\n return {\n id: createId(),\n role,\n content,\n } as TMessage;\n}\n\nexport function defaultEventToDelta<TEvent>(event: TEvent): string | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n\n return event.type === \"text_delta\" && typeof event.delta === \"string\" ? event.delta : undefined;\n}\n\nexport function defaultEventToFinal<TEvent>(event: TEvent): string | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n\n return event.type === \"final\" && typeof event.output === \"string\" ? event.output : undefined;\n}\n\nfunction createId(): string {\n return globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n defaultCompletionEventToDelta,\n defaultCompletionEventToFinal,\n} from \"./completion-defaults\";\nimport { createFetchTransport } from \"./transport\";\nimport type { EventStreamFormat, EventTransport } from \"./types\";\n\nexport type UseCompletionRequest = {\n prompt: string;\n stream: true;\n};\n\nexport type UseCompletionStatus = \"idle\" | \"streaming\" | \"error\";\n\nexport type UseCompletionOptions<TEvent = unknown> = {\n transport?: EventTransport<UseCompletionRequest, TEvent>;\n endpoint?: string | URL;\n format?: EventStreamFormat;\n initialCompletion?: string;\n eventToDelta?: (event: TEvent) => string | undefined;\n eventToFinal?: (event: TEvent) => string | undefined;\n onEvent?: (event: TEvent) => void;\n onError?: (error: unknown) => void;\n};\n\nexport type UseCompletionResult = {\n completion: string;\n input: string;\n setInput(input: string): void;\n complete(prompt?: string): Promise<void>;\n stop(): void;\n reset(completion?: string): void;\n status: UseCompletionStatus;\n error: unknown;\n};\n\nexport function useCompletion<TEvent = unknown>(\n options: UseCompletionOptions<TEvent> = {},\n): UseCompletionResult {\n const [completion, setCompletion] = useState(options.initialCompletion ?? \"\");\n const [input, setInput] = useState(\"\");\n const [status, setStatus] = useState<UseCompletionStatus>(\"idle\");\n const [error, setError] = useState<unknown>();\n const abortRef = useRef<AbortController | undefined>(undefined);\n const completionRef = useRef(completion);\n\n useEffect(() => {\n completionRef.current = completion;\n }, [completion]);\n\n useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n const transport = useMemo(() => {\n if (options.transport !== undefined) {\n return options.transport;\n }\n if (options.endpoint === undefined) {\n return undefined;\n }\n\n return createFetchTransport<UseCompletionRequest, TEvent>({\n endpoint: options.endpoint,\n format: options.format ?? \"jsonl\",\n });\n }, [options.transport, options.endpoint, options.format]);\n\n const eventToDelta = options.eventToDelta ?? defaultCompletionEventToDelta<TEvent>;\n const eventToFinal = options.eventToFinal ?? defaultCompletionEventToFinal<TEvent>;\n\n const complete = useCallback(\n async (nextInput?: string) => {\n if (transport === undefined) {\n throw new Error(\"useCompletion requires either transport or endpoint\");\n }\n\n const prompt = nextInput ?? input;\n if (prompt.trim().length === 0) {\n return;\n }\n\n abortRef.current?.abort();\n const abortController = new AbortController();\n abortRef.current = abortController;\n\n const request: UseCompletionRequest = { prompt, stream: true };\n\n setInput(\"\");\n setError(undefined);\n setStatus(\"streaming\");\n setCompletion(\"\");\n\n try {\n for await (const event of transport.send(request, { signal: abortController.signal })) {\n options.onEvent?.(event);\n\n const delta = eventToDelta(event);\n if (delta !== undefined && delta.length > 0) {\n setCompletion((current) => `${current}${delta}`);\n }\n\n const final = eventToFinal(event);\n if (final !== undefined) {\n setCompletion(final);\n }\n }\n\n if (!abortController.signal.aborted) {\n setStatus(\"idle\");\n }\n } catch (caught) {\n if (isAbortError(caught)) {\n setStatus(\"idle\");\n return;\n }\n\n setError(caught);\n setStatus(\"error\");\n options.onError?.(caught);\n } finally {\n if (abortRef.current === abortController) {\n abortRef.current = undefined;\n }\n }\n },\n [eventToDelta, eventToFinal, input, options, transport],\n );\n\n const stop = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = undefined;\n setStatus(\"idle\");\n }, []);\n\n const reset = useCallback((nextCompletion?: string) => {\n abortRef.current?.abort();\n abortRef.current = undefined;\n setCompletion(nextCompletion ?? \"\");\n setError(undefined);\n setInput(\"\");\n setStatus(\"idle\");\n }, []);\n\n return {\n completion,\n input,\n setInput,\n complete,\n stop,\n reset,\n status,\n error,\n };\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === \"AbortError\";\n}\n","export function defaultCompletionEventToDelta<TEvent>(event: TEvent): string | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n\n return event.type === \"text_delta\" && typeof event.delta === \"string\" ? event.delta : undefined;\n}\n\nexport function defaultCompletionEventToFinal<TEvent>(event: TEvent): string | undefined {\n if (!isRecord(event) || event.type !== \"final\") {\n return undefined;\n }\n\n const response = event.response;\n if (!isRecord(response) || !Array.isArray(response.choice)) {\n return undefined;\n }\n\n const parts: string[] = [];\n for (const item of response.choice) {\n if (isRecord(item) && item.type === \"text\" && typeof item.text === \"string\") {\n parts.push(item.text);\n }\n }\n\n return parts.length > 0 ? parts.join(\"\") : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n"],"mappings":"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","names":["trimmed","text","useCallback","useEffect","useMemo","useRef","useState","isRecord","useState","useRef","useEffect","useMemo","useCallback","isAbortError"]}
|
|
1
|
+
{"version":3,"sources":["../src/direct.ts","../src/streams.ts","../src/fetch.ts","../src/transport.ts","../src/use-chat.ts","../src/chat-defaults.ts","../src/human-input.ts","../src/use-completion.ts","../src/completion-defaults.ts"],"sourcesContent":["import type { EventTransport } from \"./types\";\n\nexport function createDirectTransport<TRequest, TEvent>(\n handler: (request: TRequest) => AsyncIterable<TEvent>,\n): EventTransport<TRequest, TEvent> {\n return {\n async *send(request, options) {\n const iterable = handler(request);\n const iterator = iterable[Symbol.asyncIterator]();\n try {\n while (true) {\n if (options?.signal?.aborted) {\n break;\n }\n\n const next = await iterator.next();\n if (next.done) {\n break;\n }\n\n yield next.value;\n }\n } finally {\n await iterator.return?.();\n }\n },\n };\n}\n","export async function* readJsonlStream<TEvent>(\n stream: ReadableStream<Uint8Array>,\n): AsyncIterable<TEvent> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const next = await reader.read();\n if (next.done === true) {\n break;\n }\n\n buffer += decoder.decode(next.value, { stream: true });\n const lines = buffer.split(/\\r?\\n/);\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length > 0) {\n yield JSON.parse(trimmed) as TEvent;\n }\n }\n }\n\n buffer += decoder.decode();\n const trimmed = buffer.trim();\n if (trimmed.length > 0) {\n yield JSON.parse(trimmed) as TEvent;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport async function* readSseStream<TEvent>(\n stream: ReadableStream<Uint8Array>,\n): AsyncIterable<TEvent> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let event = createEmptySseEvent();\n\n try {\n while (true) {\n const next = await reader.read();\n if (next.done === true) {\n break;\n }\n\n buffer += decoder.decode(next.value, { stream: true });\n const lines = buffer.split(/\\r?\\n/);\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const parsed = parseSseLine(line, event);\n event = parsed.event;\n if (parsed.complete === true && parsed.data !== undefined) {\n yield JSON.parse(parsed.data) as TEvent;\n }\n }\n }\n\n buffer += decoder.decode();\n if (buffer.length > 0) {\n const parsed = parseSseLine(buffer, event);\n event = parsed.event;\n if (parsed.complete === true && parsed.data !== undefined) {\n yield JSON.parse(parsed.data) as TEvent;\n }\n }\n const data = flushSseEvent(event);\n if (data !== undefined) {\n yield JSON.parse(data) as TEvent;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction createEmptySseEvent(): { data: string[] } {\n return { data: [] };\n}\n\nfunction parseSseLine(\n line: string,\n event: { data: string[] },\n): { event: { data: string[] }; complete?: true; data?: string } {\n if (line === \"\") {\n const data = flushSseEvent(event);\n return data === undefined\n ? { event: createEmptySseEvent(), complete: true }\n : { event: createEmptySseEvent(), complete: true, data };\n }\n\n if (line.startsWith(\":\")) {\n return { event };\n }\n\n const separator = line.indexOf(\":\");\n const field = separator === -1 ? line : line.slice(0, separator);\n const value = separator === -1 ? \"\" : line.slice(separator + 1).replace(/^ /, \"\");\n\n if (field === \"data\") {\n event.data.push(value);\n }\n\n return { event };\n}\n\nfunction flushSseEvent(event: { data: string[] }): string | undefined {\n if (event.data.length === 0) {\n return undefined;\n }\n\n return event.data.join(\"\\n\");\n}\n","import { readJsonlStream, readSseStream } from \"./streams\";\nimport type { EventStreamFormat } from \"./types\";\n\nexport type FetchEventStreamOptions = Omit<RequestInit, \"headers\"> & {\n format?: EventStreamFormat;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n};\n\nexport class EventStreamHttpError extends Error {\n constructor(\n readonly response: Response,\n readonly body: string,\n ) {\n super(`Event stream request failed with status ${response.status}`);\n this.name = \"EventStreamHttpError\";\n }\n}\n\nexport async function* fetchEventStream<TEvent>(\n input: string | URL | Request,\n options: FetchEventStreamOptions = {},\n): AsyncIterable<TEvent> {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (fetchImpl === undefined) {\n throw new Error(\"fetchEventStream requires a fetch implementation\");\n }\n\n const response = await fetchImpl(input, fetchOptions(options));\n if (!response.ok) {\n throw new EventStreamHttpError(response, await response.text());\n }\n if (response.body === null) {\n throw new Error(\"Event stream response does not include a body\");\n }\n\n const format = options.format ?? inferEventStreamFormat(response.headers.get(\"content-type\"));\n if (format === \"sse\") {\n yield* readSseStream<TEvent>(response.body);\n return;\n }\n\n yield* readJsonlStream<TEvent>(response.body);\n}\n\nfunction fetchOptions(options: FetchEventStreamOptions): RequestInit {\n const { format: _format, fetch: _fetch, ...init } = options;\n return init;\n}\n\nfunction inferEventStreamFormat(contentType: string | null): EventStreamFormat {\n return contentType?.toLowerCase().includes(\"text/event-stream\") ? \"sse\" : \"jsonl\";\n}\n","import { type FetchEventStreamOptions, fetchEventStream } from \"./fetch\";\nimport type { EventStreamFormat, EventTransport } from \"./types\";\n\nexport type CreateFetchTransportOptions<TRequest, TEvent> = {\n endpoint: string | URL | ((request: TRequest) => string | URL);\n method?: string;\n format?: EventStreamFormat;\n fetch?: typeof fetch;\n headers?: HeadersInit | ((request: TRequest) => HeadersInit | Promise<HeadersInit>);\n body?: (request: TRequest) => BodyInit | null | undefined | Promise<BodyInit | null | undefined>;\n init?: Omit<RequestInit, \"body\" | \"headers\" | \"method\" | \"signal\">;\n mapEvent?: (event: unknown) => TEvent;\n};\n\nexport function createFetchTransport<TRequest, TEvent = unknown>(\n options: CreateFetchTransportOptions<TRequest, TEvent>,\n): EventTransport<TRequest, TEvent> {\n return {\n async *send(request, transportOptions = {}) {\n const endpoint =\n typeof options.endpoint === \"function\" ? options.endpoint(request) : options.endpoint;\n const requestHeaders = await resolveHeaders(options.headers, request);\n const headers = mergeHeaders(requestHeaders, transportOptions.headers);\n const method = options.method ?? \"POST\";\n const body = await resolveBody(options.body, request, headers);\n const init: FetchEventStreamOptions = {\n ...(options.init ?? {}),\n method,\n headers,\n format: options.format ?? \"jsonl\",\n };\n\n if (body !== undefined) {\n init.body = body;\n }\n if (transportOptions.signal !== undefined) {\n init.signal = transportOptions.signal;\n }\n if (options.fetch !== undefined) {\n init.fetch = options.fetch;\n }\n\n for await (const event of fetchEventStream<unknown>(endpoint, init)) {\n yield options.mapEvent === undefined ? (event as TEvent) : options.mapEvent(event);\n }\n },\n };\n}\n\nexport function createChatTransport<TRequest, TEvent = unknown>(\n options: CreateFetchTransportOptions<TRequest, TEvent>,\n): EventTransport<TRequest, TEvent> {\n return createFetchTransport(options);\n}\n\nasync function resolveHeaders<TRequest>(\n headers: CreateFetchTransportOptions<TRequest, unknown>[\"headers\"],\n request: TRequest,\n): Promise<HeadersInit | undefined> {\n return typeof headers === \"function\" ? headers(request) : headers;\n}\n\nasync function resolveBody<TRequest>(\n body: CreateFetchTransportOptions<TRequest, unknown>[\"body\"],\n request: TRequest,\n headers: Headers,\n): Promise<BodyInit | null | undefined> {\n if (body !== undefined) {\n return body(request);\n }\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n return JSON.stringify(request);\n}\n\nfunction mergeHeaders(...values: (HeadersInit | undefined)[]): Headers {\n const headers = new Headers();\n\n for (const value of values) {\n if (value === undefined) {\n continue;\n }\n new Headers(value).forEach((headerValue, key) => {\n headers.set(key, headerValue);\n });\n }\n\n return headers;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n createMessage,\n defaultCreateRequest,\n defaultEventToDelta,\n defaultEventToFinal,\n} from \"./chat-defaults\";\nimport {\n defaultAnswerQuestion,\n defaultDecideApproval,\n defaultEventToApproval,\n defaultEventToQuestion,\n upsertById,\n} from \"./human-input\";\nimport { createChatTransport } from \"./transport\";\nimport type {\n ChatMessage,\n DefaultChatRequest,\n ToolApproval,\n ToolQuestion,\n ToolQuestionAnswer,\n UseChatOptions,\n UseChatResult,\n} from \"./types\";\n\nexport function useChat<\n TRequest = DefaultChatRequest,\n TEvent = unknown,\n TMessage extends ChatMessage = ChatMessage,\n>(options: UseChatOptions<TRequest, TEvent, TMessage> = {}): UseChatResult<TEvent, TMessage> {\n const [messages, setMessages] = useState<TMessage[]>(() => [...(options.initialMessages ?? [])]);\n const [events, setEvents] = useState<TEvent[]>([]);\n const [input, setInput] = useState(\"\");\n const [status, setStatus] = useState<UseChatResult<TEvent, TMessage>[\"status\"]>(\"idle\");\n const [error, setError] = useState<unknown>();\n const [approvals, setApprovals] = useState<ToolApproval[]>([]);\n const [questions, setQuestions] = useState<ToolQuestion[]>([]);\n const [decidingApprovals, setDecidingApprovals] = useState<Set<string>>(() => new Set());\n const [answeringQuestions, setAnsweringQuestions] = useState<Set<string>>(() => new Set());\n const abortRef = useRef<AbortController | undefined>(undefined);\n const messagesRef = useRef(messages);\n const approvalsRef = useRef(approvals);\n const questionsRef = useRef(questions);\n const decidingApprovalsRef = useRef(decidingApprovals);\n const answeringQuestionsRef = useRef(answeringQuestions);\n\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n useEffect(() => {\n approvalsRef.current = approvals;\n }, [approvals]);\n\n useEffect(() => {\n questionsRef.current = questions;\n }, [questions]);\n\n useEffect(() => {\n decidingApprovalsRef.current = decidingApprovals;\n }, [decidingApprovals]);\n\n useEffect(() => {\n answeringQuestionsRef.current = answeringQuestions;\n }, [answeringQuestions]);\n\n useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n const transport = useMemo(() => {\n if (options.transport !== undefined) {\n return options.transport;\n }\n if (options.endpoint === undefined) {\n return undefined;\n }\n\n return createChatTransport<TRequest, TEvent>({\n endpoint: options.endpoint,\n format: options.format ?? \"jsonl\",\n });\n }, [options.transport, options.endpoint, options.format]);\n\n const createRequest = options.createRequest ?? defaultCreateRequest<TRequest, TMessage>;\n const eventToDelta = options.eventToDelta ?? defaultEventToDelta<TEvent>;\n const eventToFinal = options.eventToFinal ?? defaultEventToFinal<TEvent>;\n const humanInputOptions = options.humanInput;\n const eventToApproval = humanInputOptions?.eventToApproval ?? defaultEventToApproval<TEvent>;\n const eventToQuestion = humanInputOptions?.eventToQuestion ?? defaultEventToQuestion<TEvent>;\n\n const updateApproval = useCallback((approval: ToolApproval) => {\n setApprovals((current) => {\n const next = upsertById(current, approval);\n approvalsRef.current = next;\n return next;\n });\n }, []);\n\n const updateQuestion = useCallback((question: ToolQuestion) => {\n setQuestions((current) => {\n const next = upsertById(current, question);\n questionsRef.current = next;\n return next;\n });\n }, []);\n\n const clearHumanInput = useCallback(() => {\n approvalsRef.current = [];\n questionsRef.current = [];\n decidingApprovalsRef.current = new Set();\n answeringQuestionsRef.current = new Set();\n setApprovals([]);\n setQuestions([]);\n setDecidingApprovals(new Set());\n setAnsweringQuestions(new Set());\n }, []);\n\n const appendAssistantText = useCallback((assistantId: string, text: string) => {\n setMessages((current) =>\n current.map((message) =>\n message.id === assistantId\n ? ({ ...message, content: `${message.content}${text}` } as TMessage)\n : message,\n ),\n );\n }, []);\n\n const replaceAssistantText = useCallback((assistantId: string, text: string) => {\n setMessages((current) =>\n current.map((message) =>\n message.id === assistantId ? ({ ...message, content: text } as TMessage) : message,\n ),\n );\n }, []);\n\n const send = useCallback(\n async (nextInput?: string) => {\n if (transport === undefined) {\n throw new Error(\"useChat requires either transport or endpoint\");\n }\n\n const content = nextInput ?? input;\n if (content.trim().length === 0) {\n return;\n }\n\n abortRef.current?.abort();\n const abortController = new AbortController();\n abortRef.current = abortController;\n\n const userMessage = createMessage<TMessage>(\"user\", content);\n const assistantMessage = createMessage<TMessage>(\"assistant\", \"\");\n const requestMessages = [...messagesRef.current, userMessage];\n const request = createRequest(content, requestMessages);\n\n setInput(\"\");\n setError(undefined);\n setStatus(\"streaming\");\n setEvents([]);\n clearHumanInput();\n setMessages([...requestMessages, assistantMessage]);\n\n try {\n for await (const event of transport.send(request, { signal: abortController.signal })) {\n setEvents((current) => [...current, event]);\n if (humanInputOptions !== undefined) {\n const approval = eventToApproval(event);\n if (approval !== undefined) {\n updateApproval(approval);\n }\n const question = eventToQuestion(event);\n if (question !== undefined) {\n updateQuestion(question);\n }\n }\n options.onEvent?.(event);\n\n const delta = eventToDelta(event);\n if (delta !== undefined && delta.length > 0) {\n appendAssistantText(assistantMessage.id, delta);\n }\n\n const final = eventToFinal(event);\n if (final !== undefined) {\n replaceAssistantText(assistantMessage.id, final);\n }\n }\n\n if (!abortController.signal.aborted) {\n setStatus(\"idle\");\n }\n } catch (caught) {\n if (isAbortError(caught)) {\n setStatus(\"idle\");\n return;\n }\n\n setError(caught);\n setStatus(\"error\");\n options.onError?.(caught);\n } finally {\n if (abortRef.current === abortController) {\n abortRef.current = undefined;\n }\n }\n },\n [\n appendAssistantText,\n createRequest,\n clearHumanInput,\n eventToDelta,\n eventToFinal,\n eventToApproval,\n eventToQuestion,\n humanInputOptions,\n input,\n options,\n replaceAssistantText,\n transport,\n updateApproval,\n updateQuestion,\n ],\n );\n\n const decideToolApproval = useCallback(\n async (approvalId: string, approved: boolean, reason?: string) => {\n if (humanInputOptions === undefined) {\n throw new Error(\"useChat humanInput is not configured\");\n }\n if (decidingApprovalsRef.current.has(approvalId)) {\n return;\n }\n\n const nextDeciding = new Set(decidingApprovalsRef.current).add(approvalId);\n decidingApprovalsRef.current = nextDeciding;\n setDecidingApprovals(nextDeciding);\n try {\n const approval = approvalsRef.current.find((item) => item.id === approvalId);\n const input = {\n approvalId,\n approved,\n ...(reason === undefined ? {} : { reason }),\n ...(approval === undefined ? {} : { approval }),\n };\n const result =\n humanInputOptions.decideApproval === undefined\n ? await defaultDecideApproval(input, humanInputOptions)\n : await humanInputOptions.decideApproval(input);\n if (result !== undefined) {\n updateApproval(result);\n }\n } finally {\n const next = new Set(decidingApprovalsRef.current);\n next.delete(approvalId);\n decidingApprovalsRef.current = next;\n setDecidingApprovals(next);\n }\n },\n [humanInputOptions, updateApproval],\n );\n\n const approveTool = useCallback(\n async (approvalId: string, reason?: string) => {\n await decideToolApproval(approvalId, true, reason);\n },\n [decideToolApproval],\n );\n\n const rejectTool = useCallback(\n async (approvalId: string, reason?: string) => {\n await decideToolApproval(approvalId, false, reason);\n },\n [decideToolApproval],\n );\n\n const answerToolQuestion = useCallback(\n async (questionId: string, answers: ToolQuestionAnswer[]) => {\n if (humanInputOptions === undefined) {\n throw new Error(\"useChat humanInput is not configured\");\n }\n if (answeringQuestionsRef.current.has(questionId)) {\n return;\n }\n\n const nextAnswering = new Set(answeringQuestionsRef.current).add(questionId);\n answeringQuestionsRef.current = nextAnswering;\n setAnsweringQuestions(nextAnswering);\n try {\n const question = questionsRef.current.find((item) => item.id === questionId);\n const input = {\n questionId,\n answers,\n ...(question === undefined ? {} : { question }),\n };\n const result =\n humanInputOptions.answerQuestion === undefined\n ? await defaultAnswerQuestion(input, humanInputOptions)\n : await humanInputOptions.answerQuestion(input);\n if (result !== undefined) {\n updateQuestion(result);\n }\n } finally {\n const next = new Set(answeringQuestionsRef.current);\n next.delete(questionId);\n answeringQuestionsRef.current = next;\n setAnsweringQuestions(next);\n }\n },\n [humanInputOptions, updateQuestion],\n );\n\n const stop = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = undefined;\n setStatus(\"idle\");\n }, []);\n\n const reset = useCallback(\n (nextMessages?: TMessage[]) => {\n const resetMessages = nextMessages ?? [];\n messagesRef.current = resetMessages;\n abortRef.current?.abort();\n abortRef.current = undefined;\n setMessages(resetMessages);\n setEvents([]);\n clearHumanInput();\n setError(undefined);\n setInput(\"\");\n setStatus(\"idle\");\n },\n [clearHumanInput],\n );\n\n const text = messages\n .filter((message) => message.role === \"assistant\")\n .map((message) => message.content)\n .join(\"\");\n\n return {\n messages,\n events,\n input,\n setInput,\n send,\n stop,\n reset,\n status,\n error,\n text,\n humanInput: {\n approvals: {\n all: approvals,\n pending: approvals.filter((approval) => approval.status === \"pending\"),\n },\n questions: {\n all: questions,\n pending: questions.filter((question) => question.status === \"pending\"),\n },\n },\n decidingApprovals,\n answeringQuestions,\n approveTool,\n rejectTool,\n answerToolQuestion,\n };\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === \"AbortError\";\n}\n","import type { ChatMessage, ChatRole, DefaultChatRequest } from \"./types\";\n\nexport function defaultCreateRequest<TRequest, TMessage extends ChatMessage>(\n input: string,\n messages: TMessage[],\n): TRequest {\n return {\n message: input,\n history: messages.slice(0, -1),\n stream: true,\n } as DefaultChatRequest as TRequest;\n}\n\nexport function createMessage<TMessage extends ChatMessage>(\n role: ChatRole,\n content: string,\n): TMessage {\n return {\n id: createId(),\n role,\n content,\n } as TMessage;\n}\n\nexport function defaultEventToDelta<TEvent>(event: TEvent): string | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n\n return event.type === \"text_delta\" && typeof event.delta === \"string\" ? event.delta : undefined;\n}\n\nexport function defaultEventToFinal<TEvent>(event: TEvent): string | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n\n return event.type === \"final\" && typeof event.output === \"string\" ? event.output : undefined;\n}\n\nfunction createId(): string {\n return globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","import type {\n ToolApproval,\n ToolApprovalDecisionInput,\n ToolQuestion,\n ToolQuestionAnswerInput,\n} from \"./types\";\n\ntype HumanInputEndpointOptions = {\n endpoint?: string | URL;\n fetch?: typeof fetch;\n};\n\nexport function defaultEventToApproval<TEvent>(event: TEvent): ToolApproval | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n if (event.type !== \"tool_approval_request\" && event.type !== \"tool_approval_result\") {\n return undefined;\n }\n return isToolApproval(event.approval) ? event.approval : undefined;\n}\n\nexport function defaultEventToQuestion<TEvent>(event: TEvent): ToolQuestion | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n if (event.type !== \"tool_question_request\" && event.type !== \"tool_question_result\") {\n return undefined;\n }\n return isToolQuestion(event.question) ? event.question : undefined;\n}\n\nexport async function defaultDecideApproval(\n input: ToolApprovalDecisionInput,\n options: HumanInputEndpointOptions,\n): Promise<ToolApproval | undefined> {\n const endpoint = requireEndpoint(options.endpoint, \"decideApproval\");\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (fetchImpl === undefined) {\n throw new Error(\"humanInput approval decisions require a fetch implementation\");\n }\n\n const response = await fetchImpl(\n endpointUrl(endpoint, `approvals/${input.approvalId}/decision`),\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n approved: input.approved,\n ...(input.reason === undefined ? {} : { reason: input.reason }),\n }),\n },\n );\n if (!response.ok) {\n throw new Error(`Tool approval decision failed with status ${response.status}`);\n }\n return responseJson<ToolApproval>(response);\n}\n\nexport async function defaultAnswerQuestion(\n input: ToolQuestionAnswerInput,\n options: HumanInputEndpointOptions,\n): Promise<ToolQuestion | undefined> {\n const endpoint = requireEndpoint(options.endpoint, \"answerQuestion\");\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (fetchImpl === undefined) {\n throw new Error(\"humanInput question answers require a fetch implementation\");\n }\n\n const response = await fetchImpl(endpointUrl(endpoint, `questions/${input.questionId}/answer`), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ answers: input.answers }),\n });\n if (!response.ok) {\n throw new Error(`Tool question answer failed with status ${response.status}`);\n }\n return responseJson<ToolQuestion>(response);\n}\n\nexport function upsertById<TItem extends { id: string }>(items: TItem[], item: TItem): TItem[] {\n const index = items.findIndex((current) => current.id === item.id);\n if (index === -1) {\n return [...items, item];\n }\n const next = [...items];\n next[index] = item;\n return next;\n}\n\nfunction requireEndpoint(\n endpoint: HumanInputEndpointOptions[\"endpoint\"],\n operation: \"decideApproval\" | \"answerQuestion\",\n): string | URL {\n if (endpoint === undefined) {\n throw new Error(`humanInput.${operation} requires endpoint or a custom handler`);\n }\n return endpoint;\n}\n\nfunction endpointUrl(endpoint: string | URL, path: string): string | URL {\n const suffix = path.replace(/^\\/+/, \"\");\n if (endpoint instanceof URL) {\n const url = new URL(endpoint.toString());\n url.pathname = joinPath(url.pathname, suffix);\n return url;\n }\n if (/^[a-z][a-z\\d+\\-.]*:\\/\\//i.test(endpoint)) {\n const url = new URL(endpoint);\n url.pathname = joinPath(url.pathname, suffix);\n return url.toString();\n }\n return joinPath(endpoint, suffix);\n}\n\nfunction joinPath(base: string, suffix: string): string {\n const trimmedBase = base.replace(/\\/+$/, \"\");\n const trimmedSuffix = suffix.replace(/^\\/+/, \"\");\n if (trimmedBase.length === 0) {\n return `/${trimmedSuffix}`;\n }\n return `${trimmedBase}/${trimmedSuffix}`;\n}\n\nasync function responseJson<T>(response: Response): Promise<T | undefined> {\n const text = await response.text();\n if (text.trim().length === 0) {\n return undefined;\n }\n return JSON.parse(text) as T;\n}\n\nfunction isToolApproval(value: unknown): value is ToolApproval {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n typeof value.toolName === \"string\" &&\n typeof value.status === \"string\"\n );\n}\n\nfunction isToolQuestion(value: unknown): value is ToolQuestion {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n typeof value.toolName === \"string\" &&\n typeof value.status === \"string\" &&\n Array.isArray(value.questions)\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n defaultCompletionEventToDelta,\n defaultCompletionEventToFinal,\n} from \"./completion-defaults\";\nimport { createFetchTransport } from \"./transport\";\nimport type { EventStreamFormat, EventTransport } from \"./types\";\n\nexport type UseCompletionRequest = {\n prompt: string;\n stream: true;\n};\n\nexport type UseCompletionStatus = \"idle\" | \"streaming\" | \"error\";\n\nexport type UseCompletionOptions<TEvent = unknown> = {\n transport?: EventTransport<UseCompletionRequest, TEvent>;\n endpoint?: string | URL;\n format?: EventStreamFormat;\n initialCompletion?: string;\n eventToDelta?: (event: TEvent) => string | undefined;\n eventToFinal?: (event: TEvent) => string | undefined;\n onEvent?: (event: TEvent) => void;\n onError?: (error: unknown) => void;\n};\n\nexport type UseCompletionResult = {\n completion: string;\n input: string;\n setInput(input: string): void;\n complete(prompt?: string): Promise<void>;\n stop(): void;\n reset(completion?: string): void;\n status: UseCompletionStatus;\n error: unknown;\n};\n\nexport function useCompletion<TEvent = unknown>(\n options: UseCompletionOptions<TEvent> = {},\n): UseCompletionResult {\n const [completion, setCompletion] = useState(options.initialCompletion ?? \"\");\n const [input, setInput] = useState(\"\");\n const [status, setStatus] = useState<UseCompletionStatus>(\"idle\");\n const [error, setError] = useState<unknown>();\n const abortRef = useRef<AbortController | undefined>(undefined);\n const completionRef = useRef(completion);\n\n useEffect(() => {\n completionRef.current = completion;\n }, [completion]);\n\n useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n const transport = useMemo(() => {\n if (options.transport !== undefined) {\n return options.transport;\n }\n if (options.endpoint === undefined) {\n return undefined;\n }\n\n return createFetchTransport<UseCompletionRequest, TEvent>({\n endpoint: options.endpoint,\n format: options.format ?? \"jsonl\",\n });\n }, [options.transport, options.endpoint, options.format]);\n\n const eventToDelta = options.eventToDelta ?? defaultCompletionEventToDelta<TEvent>;\n const eventToFinal = options.eventToFinal ?? defaultCompletionEventToFinal<TEvent>;\n\n const complete = useCallback(\n async (nextInput?: string) => {\n if (transport === undefined) {\n throw new Error(\"useCompletion requires either transport or endpoint\");\n }\n\n const prompt = nextInput ?? input;\n if (prompt.trim().length === 0) {\n return;\n }\n\n abortRef.current?.abort();\n const abortController = new AbortController();\n abortRef.current = abortController;\n\n const request: UseCompletionRequest = { prompt, stream: true };\n\n setInput(\"\");\n setError(undefined);\n setStatus(\"streaming\");\n setCompletion(\"\");\n\n try {\n for await (const event of transport.send(request, { signal: abortController.signal })) {\n options.onEvent?.(event);\n\n const delta = eventToDelta(event);\n if (delta !== undefined && delta.length > 0) {\n setCompletion((current) => `${current}${delta}`);\n }\n\n const final = eventToFinal(event);\n if (final !== undefined) {\n setCompletion(final);\n }\n }\n\n if (!abortController.signal.aborted) {\n setStatus(\"idle\");\n }\n } catch (caught) {\n if (isAbortError(caught)) {\n setStatus(\"idle\");\n return;\n }\n\n setError(caught);\n setStatus(\"error\");\n options.onError?.(caught);\n } finally {\n if (abortRef.current === abortController) {\n abortRef.current = undefined;\n }\n }\n },\n [eventToDelta, eventToFinal, input, options, transport],\n );\n\n const stop = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = undefined;\n setStatus(\"idle\");\n }, []);\n\n const reset = useCallback((nextCompletion?: string) => {\n abortRef.current?.abort();\n abortRef.current = undefined;\n setCompletion(nextCompletion ?? \"\");\n setError(undefined);\n setInput(\"\");\n setStatus(\"idle\");\n }, []);\n\n return {\n completion,\n input,\n setInput,\n complete,\n stop,\n reset,\n status,\n error,\n };\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === \"AbortError\";\n}\n","export function defaultCompletionEventToDelta<TEvent>(event: TEvent): string | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n\n return event.type === \"text_delta\" && typeof event.delta === \"string\" ? event.delta : undefined;\n}\n\nexport function defaultCompletionEventToFinal<TEvent>(event: TEvent): string | undefined {\n if (!isRecord(event) || event.type !== \"final\") {\n return undefined;\n }\n\n const response = event.response;\n if (!isRecord(response) || !Array.isArray(response.choice)) {\n return undefined;\n }\n\n const parts: string[] = [];\n for (const item of response.choice) {\n if (isRecord(item) && item.type === \"text\" && typeof item.text === \"string\") {\n parts.push(item.text);\n }\n }\n\n return parts.length > 0 ? parts.join(\"\") : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n"],"mappings":"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","names":["trimmed","isRecord","text","input","useCallback","useEffect","useMemo","useRef","useState","isRecord","useState","useRef","useEffect","useMemo","useCallback","isAbortError"]}
|