@tambo-ai/react 0.55.0 → 0.57.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 +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/__tests__/mcp-client.test.js +52 -6
- package/dist/mcp/__tests__/mcp-client.test.js.map +1 -1
- package/dist/mcp/mcp-client.d.ts +34 -2
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +63 -4
- package/dist/mcp/mcp-client.js.map +1 -1
- package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.d.ts +2 -0
- package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.d.ts.map +1 -0
- package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js +179 -0
- package/dist/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -0
- package/dist/providers/__tests__/tambo-thread-provider.test.js +2 -6
- package/dist/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts +1 -0
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +3 -2
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-thread-provider.d.ts +13 -0
- package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-provider.js +51 -22
- package/dist/providers/tambo-thread-provider.js.map +1 -1
- package/esm/index.d.ts +3 -2
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -1
- package/esm/index.js.map +1 -1
- package/esm/mcp/__tests__/mcp-client.test.js +52 -6
- package/esm/mcp/__tests__/mcp-client.test.js.map +1 -1
- package/esm/mcp/mcp-client.d.ts +34 -2
- package/esm/mcp/mcp-client.d.ts.map +1 -1
- package/esm/mcp/mcp-client.js +63 -4
- package/esm/mcp/mcp-client.js.map +1 -1
- package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.d.ts +2 -0
- package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.d.ts.map +1 -0
- package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js +174 -0
- package/esm/providers/__tests__/tambo-thread-provider-initial-messages.test.js.map +1 -0
- package/esm/providers/__tests__/tambo-thread-provider.test.js +2 -6
- package/esm/providers/__tests__/tambo-thread-provider.test.js.map +1 -1
- package/esm/providers/index.d.ts +1 -1
- package/esm/providers/index.d.ts.map +1 -1
- package/esm/providers/index.js.map +1 -1
- package/esm/providers/tambo-provider.d.ts +1 -0
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +3 -2
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider.d.ts +13 -0
- package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-provider.js +51 -22
- package/esm/providers/tambo-thread-provider.js.map +1 -1
- package/package.json +11 -14
|
@@ -102,11 +102,27 @@ export const TamboThreadContext = createContext({
|
|
|
102
102
|
* @param props - The props for the TamboThreadProvider
|
|
103
103
|
* @param props.children - The children to wrap
|
|
104
104
|
* @param props.streaming - Whether to stream the response by default. Defaults to true.
|
|
105
|
+
* @param props.initialMessages - Initial messages to be included in new threads
|
|
105
106
|
* @returns The TamboThreadProvider component
|
|
106
107
|
*/
|
|
107
|
-
export const TamboThreadProvider = ({ children, streaming = true }) => {
|
|
108
|
+
export const TamboThreadProvider = ({ children, streaming = true, initialMessages = [] }) => {
|
|
109
|
+
// Create placeholder thread with initial messages
|
|
110
|
+
const placeholderThread = useMemo(() => ({
|
|
111
|
+
id: "placeholder",
|
|
112
|
+
messages: initialMessages.map((msg) => ({
|
|
113
|
+
...msg,
|
|
114
|
+
id: msg.id ?? crypto.randomUUID(),
|
|
115
|
+
threadId: "placeholder",
|
|
116
|
+
createdAt: msg.createdAt ?? new Date().toISOString(),
|
|
117
|
+
componentState: msg.componentState ?? {},
|
|
118
|
+
})),
|
|
119
|
+
createdAt: "",
|
|
120
|
+
projectId: "",
|
|
121
|
+
updatedAt: "",
|
|
122
|
+
metadata: {},
|
|
123
|
+
}), [initialMessages]);
|
|
108
124
|
const [threadMap, setThreadMap] = useState({
|
|
109
|
-
[
|
|
125
|
+
[placeholderThread.id]: placeholderThread,
|
|
110
126
|
});
|
|
111
127
|
const client = useTamboClient();
|
|
112
128
|
const queryClient = useTamboQueryClient();
|
|
@@ -114,7 +130,7 @@ export const TamboThreadProvider = ({ children, streaming = true }) => {
|
|
|
114
130
|
const { getAdditionalContext } = useTamboContextHelpers();
|
|
115
131
|
const [ignoreResponse, setIgnoreResponse] = useState(false);
|
|
116
132
|
const ignoreResponseRef = useRef(ignoreResponse);
|
|
117
|
-
const [currentThreadId, setCurrentThreadId] = useState(
|
|
133
|
+
const [currentThreadId, setCurrentThreadId] = useState(placeholderThread.id);
|
|
118
134
|
const currentThread = threadMap[currentThreadId];
|
|
119
135
|
// Generation stage props for GenerationStageProvider
|
|
120
136
|
const currentGenerationStage = currentThread?.generationStage ?? GenerationStage.IDLE;
|
|
@@ -155,10 +171,8 @@ export const TamboThreadProvider = ({ children, streaming = true }) => {
|
|
|
155
171
|
console.warn("Failed to refetch threads list:", error);
|
|
156
172
|
}
|
|
157
173
|
}, [client.beta.projects, queryClient]);
|
|
158
|
-
const fetchThread = useCallback(async (threadId
|
|
159
|
-
const thread = await client.beta.threads.retrieve(threadId
|
|
160
|
-
includeInternal: includeInternalMessages,
|
|
161
|
-
});
|
|
174
|
+
const fetchThread = useCallback(async (threadId) => {
|
|
175
|
+
const thread = await client.beta.threads.retrieve(threadId);
|
|
162
176
|
const threadWithRenderedComponents = {
|
|
163
177
|
...thread,
|
|
164
178
|
messages: thread.messages.map((message) => {
|
|
@@ -186,11 +200,11 @@ export const TamboThreadProvider = ({ children, streaming = true }) => {
|
|
|
186
200
|
}, [client.beta.threads, componentList, currentMessageCache]);
|
|
187
201
|
useEffect(() => {
|
|
188
202
|
if (currentThreadId &&
|
|
189
|
-
currentThreadId !==
|
|
203
|
+
currentThreadId !== placeholderThread.id &&
|
|
190
204
|
!threadMap[currentThreadId]) {
|
|
191
205
|
fetchThread(currentThreadId);
|
|
192
206
|
}
|
|
193
|
-
}, [currentThreadId, fetchThread, threadMap]);
|
|
207
|
+
}, [currentThreadId, fetchThread, threadMap, placeholderThread.id]);
|
|
194
208
|
const addThreadMessage = useCallback(async (message, sendToServer = true, createdAt = new Date().toISOString()) => {
|
|
195
209
|
if (!currentThread) {
|
|
196
210
|
console.warn("Cannot add messages if we do not have a current thread");
|
|
@@ -271,14 +285,14 @@ export const TamboThreadProvider = ({ children, streaming = true }) => {
|
|
|
271
285
|
}
|
|
272
286
|
}, [client.beta.threads.messages]);
|
|
273
287
|
const startNewThread = useCallback(() => {
|
|
274
|
-
setCurrentThreadId(
|
|
288
|
+
setCurrentThreadId(placeholderThread.id);
|
|
275
289
|
setThreadMap((prevMap) => {
|
|
276
290
|
return {
|
|
277
291
|
...prevMap,
|
|
278
|
-
[
|
|
292
|
+
[placeholderThread.id]: placeholderThread,
|
|
279
293
|
};
|
|
280
294
|
});
|
|
281
|
-
}, []);
|
|
295
|
+
}, [placeholderThread]);
|
|
282
296
|
const updateThreadName = useCallback(async (name, threadId) => {
|
|
283
297
|
threadId ??= currentThreadId;
|
|
284
298
|
setThreadMap((prevMap) => {
|
|
@@ -287,17 +301,22 @@ export const TamboThreadProvider = ({ children, streaming = true }) => {
|
|
|
287
301
|
}
|
|
288
302
|
return { ...prevMap, [threadId]: { ...prevMap[threadId], name } };
|
|
289
303
|
});
|
|
290
|
-
if (threadId !==
|
|
304
|
+
if (threadId !== placeholderThread.id) {
|
|
291
305
|
const currentProject = await client.beta.projects.getCurrent();
|
|
292
306
|
await client.beta.threads.update(threadId, {
|
|
293
307
|
name,
|
|
294
308
|
projectId: currentProject.id,
|
|
295
309
|
});
|
|
296
310
|
}
|
|
297
|
-
}, [
|
|
311
|
+
}, [
|
|
312
|
+
currentThreadId,
|
|
313
|
+
client.beta.projects,
|
|
314
|
+
client.beta.threads,
|
|
315
|
+
placeholderThread.id,
|
|
316
|
+
]);
|
|
298
317
|
const generateThreadName = useCallback(async (threadId) => {
|
|
299
318
|
threadId ??= currentThreadId;
|
|
300
|
-
if (threadId ===
|
|
319
|
+
if (threadId === placeholderThread.id) {
|
|
301
320
|
console.warn("Cannot generate name for empty thread");
|
|
302
321
|
return threadMap[threadId];
|
|
303
322
|
}
|
|
@@ -315,9 +334,9 @@ export const TamboThreadProvider = ({ children, streaming = true }) => {
|
|
|
315
334
|
};
|
|
316
335
|
});
|
|
317
336
|
return threadWithGeneratedName;
|
|
318
|
-
}, [client.beta.threads, currentThreadId, threadMap]);
|
|
337
|
+
}, [client.beta.threads, currentThreadId, threadMap, placeholderThread.id]);
|
|
319
338
|
const switchCurrentThread = useCallback(async (threadId, fetch = true) => {
|
|
320
|
-
if (threadId ===
|
|
339
|
+
if (threadId === placeholderThread.id) {
|
|
321
340
|
console.warn("Switching to placeholder thread, may be a bug.");
|
|
322
341
|
return;
|
|
323
342
|
}
|
|
@@ -330,7 +349,7 @@ export const TamboThreadProvider = ({ children, streaming = true }) => {
|
|
|
330
349
|
const updatedThreadMap = {
|
|
331
350
|
...prevMap,
|
|
332
351
|
[threadId]: {
|
|
333
|
-
...prevMap[
|
|
352
|
+
...prevMap[placeholderThread.id],
|
|
334
353
|
id: threadId,
|
|
335
354
|
},
|
|
336
355
|
};
|
|
@@ -339,7 +358,7 @@ export const TamboThreadProvider = ({ children, streaming = true }) => {
|
|
|
339
358
|
if (fetch) {
|
|
340
359
|
await fetchThread(threadId);
|
|
341
360
|
}
|
|
342
|
-
}, [fetchThread]);
|
|
361
|
+
}, [fetchThread, placeholderThread]);
|
|
343
362
|
const updateThreadStatus = useCallback((threadId, stage, statusMessage) => {
|
|
344
363
|
setThreadMap((prevMap) => {
|
|
345
364
|
const updatedThreadMap = {
|
|
@@ -527,7 +546,7 @@ export const TamboThreadProvider = ({ children, streaming = true }) => {
|
|
|
527
546
|
]);
|
|
528
547
|
const sendThreadMessage = useCallback(async (message, options = {}) => {
|
|
529
548
|
setIgnoreResponse(false);
|
|
530
|
-
const { threadId = currentThreadId ??
|
|
549
|
+
const { threadId = currentThreadId ?? placeholderThread.id, streamResponse = streaming, forceToolChoice, contextKey, additionalContext, content, } = options;
|
|
531
550
|
updateThreadStatus(threadId, GenerationStage.FETCHING_CONTEXT);
|
|
532
551
|
// Get additional context from enabled helpers
|
|
533
552
|
const helperContexts = await getAdditionalContext();
|
|
@@ -568,11 +587,19 @@ export const TamboThreadProvider = ({ children, streaming = true }) => {
|
|
|
568
587
|
clientTools: unassociatedTools.map((tool) => mapTamboToolToContextTool(tool)),
|
|
569
588
|
forceToolChoice: forceToolChoice,
|
|
570
589
|
toolCallCounts,
|
|
590
|
+
...(threadId === placeholderThread.id &&
|
|
591
|
+
initialMessages.length > 0 && {
|
|
592
|
+
initialMessages: initialMessages.map((msg) => ({
|
|
593
|
+
content: msg.content,
|
|
594
|
+
role: msg.role,
|
|
595
|
+
additionalContext: msg.additionalContext,
|
|
596
|
+
})),
|
|
597
|
+
}),
|
|
571
598
|
};
|
|
572
599
|
if (streamResponse) {
|
|
573
600
|
let advanceStreamResponse;
|
|
574
601
|
try {
|
|
575
|
-
advanceStreamResponse = await advanceStream(client, params, threadId ===
|
|
602
|
+
advanceStreamResponse = await advanceStream(client, params, threadId === placeholderThread.id ? undefined : threadId);
|
|
576
603
|
}
|
|
577
604
|
catch (error) {
|
|
578
605
|
updateThreadStatus(threadId, GenerationStage.ERROR);
|
|
@@ -588,7 +615,7 @@ export const TamboThreadProvider = ({ children, streaming = true }) => {
|
|
|
588
615
|
}
|
|
589
616
|
let advanceResponse;
|
|
590
617
|
try {
|
|
591
|
-
advanceResponse = await (threadId ===
|
|
618
|
+
advanceResponse = await (threadId === placeholderThread.id
|
|
592
619
|
? client.beta.threads.advance(params)
|
|
593
620
|
: client.beta.threads.advanceByID(threadId, params));
|
|
594
621
|
}
|
|
@@ -674,6 +701,8 @@ export const TamboThreadProvider = ({ children, streaming = true }) => {
|
|
|
674
701
|
handleAdvanceStream,
|
|
675
702
|
streaming,
|
|
676
703
|
getAdditionalContext,
|
|
704
|
+
placeholderThread.id,
|
|
705
|
+
initialMessages,
|
|
677
706
|
onCallUnregisteredTool,
|
|
678
707
|
refetchThreadsList,
|
|
679
708
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-thread-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-thread-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport TamboAI, { advanceStream } from \"@tambo-ai/typescript-sdk\";\nimport { Thread } from \"@tambo-ai/typescript-sdk/resources/beta/threads/threads\";\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n GenerationStage,\n isIdleStage,\n TamboThreadMessage,\n} from \"../model/generate-component-response\";\nimport { TamboThread } from \"../model/tambo-thread\";\nimport { renderComponentIntoMessage } from \"../util/generate-component\";\nimport {\n getAvailableComponents,\n getUnassociatedTools,\n mapTamboToolToContextTool,\n} from \"../util/registry\";\nimport { handleToolCall } from \"../util/tool-caller\";\nimport { useTamboClient, useTamboQueryClient } from \"./tambo-client-provider\";\nimport { useTamboContextHelpers } from \"./tambo-context-helpers-provider\";\nimport { useTamboRegistry } from \"./tambo-registry-provider\";\n\n// Generation Stage Context - separate from thread context to prevent re-renders\nexport interface TamboGenerationStageContextProps {\n generationStage: GenerationStage;\n generationStatusMessage: string;\n isIdle: boolean;\n}\n\nconst TamboGenerationStageContext = createContext<\n TamboGenerationStageContextProps | undefined\n>(undefined);\n\ninterface TamboGenerationStageProviderProps {\n generationStage: GenerationStage;\n statusMessage: string;\n}\n\n/**\n *\n * This provider is used to provide the generation stage context to the descendants of the provider.\n * @param props - The props for the GenerationStageProvider\n * @param props.children - The children to wrap\n * @param props.generationStage - The generation stage to provide\n * @param props.statusMessage - The status message to provide\n * @returns The GenerationStageProvider component\n */\nexport const TamboGenerationStageProvider: React.FC<\n PropsWithChildren<TamboGenerationStageProviderProps>\n> = ({ children, generationStage, statusMessage }) => {\n const isIdle = isIdleStage(generationStage);\n\n const contextValue = useMemo(() => {\n return {\n generationStage,\n generationStatusMessage: statusMessage,\n isIdle,\n };\n }, [generationStage, statusMessage, isIdle]);\n\n return (\n <TamboGenerationStageContext.Provider value={contextValue}>\n {children}\n </TamboGenerationStageContext.Provider>\n );\n};\n\n// Type for partial message updates that requires threadId\ntype PartialTamboThreadMessageWithThreadId = Partial<TamboThreadMessage> & {\n threadId: string;\n};\n\nexport interface TamboThreadContextProps {\n /** The current thread */\n thread: TamboThread;\n /** Switch to a different thread */\n switchCurrentThread: (threadId: string, fetch?: boolean) => void;\n /** Start a new thread */\n startNewThread: () => void;\n /** Update a thread's name */\n updateThreadName: (name: string, threadId?: string) => void;\n /** Let Tambo generate and set a thread's name based on the thread's messages */\n generateThreadName: (threadId?: string) => Promise<Thread>;\n /** Add a message to the current thread */\n addThreadMessage: (\n message: TamboThreadMessage,\n sendToServer: boolean,\n ) => Promise<TamboAI.Beta.Threads.ThreadMessage[]>;\n /** Update a message in the current thread */\n updateThreadMessage: (\n id: string,\n message: PartialTamboThreadMessageWithThreadId,\n sendToServer: boolean,\n ) => Promise<void>;\n /** Cancel a thread */\n cancel: (threadId?: string) => Promise<void>;\n /** Whether the thread is streaming */\n streaming: boolean;\n /** Send a message to the current thread */\n sendThreadMessage: (\n message: string,\n options?: {\n threadId?: string;\n streamResponse?: boolean;\n contextKey?: string;\n forceToolChoice?: string;\n additionalContext?: Record<string, any>;\n content?: TamboAI.Beta.Threads.ChatCompletionContentPart[];\n },\n ) => Promise<TamboThreadMessage>;\n}\n\n// Combined context interface that includes generation stage fields\nexport interface CombinedTamboThreadContextProps\n extends TamboThreadContextProps,\n TamboGenerationStageContextProps {}\n\n/**\n * This is a stub entry for when the thread is not yet created, the first time\n * the user sends a message\n *\n * Note that the consumer needs to be careful never to send `PLACEHOLDER_THREAD.id` to the server,\n * as this doesn't really exist on the server side.\n */\nexport const PLACEHOLDER_THREAD: TamboThread = {\n id: \"placeholder\",\n messages: [],\n createdAt: \"\",\n projectId: \"\",\n updatedAt: \"\",\n metadata: {},\n};\n\nexport const TamboThreadContext = createContext<TamboThreadContextProps>({\n thread: PLACEHOLDER_THREAD,\n /**\n *\n */\n switchCurrentThread: () => {\n throw new Error(\"switchCurrentThread not implemented\");\n },\n /**\n *\n */\n startNewThread: () => {\n throw new Error(\"startNewThread not implemented\");\n },\n /**\n *\n */\n updateThreadName: () => {\n throw new Error(\"updateThreadName not implemented\");\n },\n /**\n *\n */\n generateThreadName: () => {\n throw new Error(\"generateThreadName not implemented\");\n },\n /**\n *\n */\n addThreadMessage: () => {\n throw new Error(\"updateThreadMessageHistory not implemented\");\n },\n streaming: true,\n /**\n *\n */\n updateThreadMessage: () => {\n throw new Error(\"updateThreadMessage not implemented\");\n },\n /**\n *\n */\n sendThreadMessage: () => {\n throw new Error(\"sendThreadMessage not implemented\");\n },\n /**\n *\n */\n cancel: () => {\n throw new Error(\"cancel not implemented\");\n },\n});\n\nexport interface TamboThreadProviderProps {\n /** Whether to stream the response */\n streaming?: boolean;\n}\n\n/**\n * The TamboThreadProvider is a React provider that provides a thread context\n * to the descendants of the provider.\n * @param props - The props for the TamboThreadProvider\n * @param props.children - The children to wrap\n * @param props.streaming - Whether to stream the response by default. Defaults to true.\n * @returns The TamboThreadProvider component\n */\nexport const TamboThreadProvider: React.FC<\n PropsWithChildren<TamboThreadProviderProps>\n> = ({ children, streaming = true }) => {\n const [threadMap, setThreadMap] = useState<Record<string, TamboThread>>({\n [PLACEHOLDER_THREAD.id]: PLACEHOLDER_THREAD,\n });\n const client = useTamboClient();\n const queryClient = useTamboQueryClient();\n const {\n componentList,\n toolRegistry,\n componentToolAssociations,\n onCallUnregisteredTool,\n } = useTamboRegistry();\n const { getAdditionalContext } = useTamboContextHelpers();\n const [ignoreResponse, setIgnoreResponse] = useState(false);\n const ignoreResponseRef = useRef(ignoreResponse);\n const [currentThreadId, setCurrentThreadId] = useState<string>(\n PLACEHOLDER_THREAD.id,\n );\n const currentThread: TamboThread | undefined = threadMap[currentThreadId];\n\n // Generation stage props for GenerationStageProvider\n const currentGenerationStage =\n (currentThread?.generationStage as GenerationStage) ?? GenerationStage.IDLE;\n const currentStatusMessage = currentThread?.statusMessage ?? \"\";\n\n // Use existing messages from the current thread to avoid re-generating any components\n const currentMessageCache = useMemo(() => {\n const messageCache = new Map<string, TamboThreadMessage>();\n if (currentThread) {\n for (const message of currentThread.messages) {\n messageCache.set(message.id, message);\n }\n }\n return messageCache;\n }, [currentThread]);\n\n useEffect(() => {\n ignoreResponseRef.current = ignoreResponse;\n }, [ignoreResponse]);\n\n const refetchThreadsList = useCallback(\n async (threadId: string, contextKey: string | undefined) => {\n try {\n const currentProject = await client.beta.projects.getCurrent();\n\n const optimisticThread = {\n ...PLACEHOLDER_THREAD,\n id: threadId,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n queryClient.setQueryData(\n [\"threads\", currentProject.id, contextKey],\n (old: TamboAI.Beta.Threads.ThreadsOffsetAndLimit | undefined) => {\n return {\n ...old,\n items: [optimisticThread, ...(old?.items ?? [])],\n };\n },\n );\n\n await queryClient.invalidateQueries({\n queryKey: [\"threads\"],\n });\n } catch (error) {\n console.warn(\"Failed to refetch threads list:\", error);\n }\n },\n [client.beta.projects, queryClient],\n );\n\n const fetchThread = useCallback(\n async (threadId: string, includeInternalMessages = true) => {\n const thread = await client.beta.threads.retrieve(threadId, {\n includeInternal: includeInternalMessages,\n });\n const threadWithRenderedComponents = {\n ...thread,\n messages: thread.messages.map((message) => {\n if (currentMessageCache.has(message.id)) {\n const renderedMessage = currentMessageCache.get(message.id);\n return {\n ...renderedMessage,\n ...message,\n };\n }\n if (message.component?.componentName) {\n const messageWithComponent = renderComponentIntoMessage(\n message,\n componentList,\n );\n return messageWithComponent;\n }\n return message;\n }),\n };\n\n setThreadMap((prevMap) => {\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: threadWithRenderedComponents,\n };\n return updatedThreadMap;\n });\n },\n [client.beta.threads, componentList, currentMessageCache],\n );\n\n useEffect(() => {\n if (\n currentThreadId &&\n currentThreadId !== PLACEHOLDER_THREAD.id &&\n !threadMap[currentThreadId]\n ) {\n fetchThread(currentThreadId);\n }\n }, [currentThreadId, fetchThread, threadMap]);\n\n const addThreadMessage = useCallback(\n async (\n message: TamboThreadMessage,\n sendToServer = true,\n createdAt: string = new Date().toISOString(),\n ) => {\n if (!currentThread) {\n console.warn(\"Cannot add messages if we do not have a current thread\");\n return [];\n }\n\n const chatMessage: TamboThreadMessage = {\n ...message,\n createdAt,\n };\n const threadId = message.threadId;\n const messageId = chatMessage.id;\n // optimistically update the thread in the local state\n setThreadMap((prevMap) => {\n if (!threadId) {\n return prevMap;\n }\n const prevMessages = prevMap[threadId]?.messages || [];\n const haveMessage = prevMessages.find((msg) => msg.id === messageId);\n // Update in place if the message already exists\n const updatedMessages = haveMessage\n ? prevMessages.map((msg) => {\n if (msg.id === messageId) {\n return chatMessage;\n }\n return msg;\n })\n : [...prevMessages, chatMessage];\n\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n messages: updatedMessages,\n },\n };\n return updatedThreadMap;\n });\n\n if (sendToServer) {\n // TODO: if this fails, we need to revert the local state update\n await client.beta.threads.messages.create(message.threadId, {\n content: message.content,\n role: message.role,\n additionalContext: chatMessage.additionalContext,\n });\n }\n return threadMap[threadId]?.messages || [];\n },\n [client.beta.threads.messages, currentThread, threadMap],\n );\n\n const updateThreadMessage = useCallback(\n async (\n id: string,\n message: PartialTamboThreadMessageWithThreadId,\n sendToServer = true,\n createdAt: string = new Date().toISOString(),\n ) => {\n setThreadMap((prevMap) => {\n const prevMessages = prevMap[message.threadId]?.messages || [];\n const updatedMessages = prevMessages.map((msg) => {\n if (msg.id === id) {\n // Merge the partial update with the existing message\n const updatedMessage: TamboThreadMessage = {\n ...msg,\n ...message,\n id: msg.id,\n createdAt: message.createdAt ?? msg.createdAt ?? createdAt,\n };\n return updatedMessage;\n }\n return msg;\n });\n return {\n ...prevMap,\n [message.threadId]: {\n ...prevMap[message.threadId],\n messages: updatedMessages,\n },\n };\n });\n\n if (sendToServer && message.content && message.role) {\n // TODO: if this fails, we need to revert the local state update\n await client.beta.threads.messages.create(message.threadId, {\n content: message.content,\n role: message.role,\n additionalContext: message.additionalContext,\n });\n }\n },\n [client.beta.threads.messages],\n );\n\n const startNewThread = useCallback(() => {\n setCurrentThreadId(PLACEHOLDER_THREAD.id);\n setThreadMap((prevMap) => {\n return {\n ...prevMap,\n [PLACEHOLDER_THREAD.id]: PLACEHOLDER_THREAD,\n };\n });\n }, []);\n\n const updateThreadName = useCallback(\n async (name: string, threadId?: string) => {\n threadId ??= currentThreadId;\n\n setThreadMap((prevMap) => {\n if (!prevMap[threadId]) {\n return prevMap;\n }\n return { ...prevMap, [threadId]: { ...prevMap[threadId], name } };\n });\n\n if (threadId !== PLACEHOLDER_THREAD.id) {\n const currentProject = await client.beta.projects.getCurrent();\n await client.beta.threads.update(threadId, {\n name,\n projectId: currentProject.id,\n });\n }\n },\n [currentThreadId, client.beta.projects, client.beta.threads],\n );\n\n const generateThreadName = useCallback(\n async (threadId?: string) => {\n threadId ??= currentThreadId;\n if (threadId === PLACEHOLDER_THREAD.id) {\n console.warn(\"Cannot generate name for empty thread\");\n return threadMap[threadId];\n }\n\n const threadWithGeneratedName =\n await client.beta.threads.generateName(threadId);\n\n setThreadMap((prevMap) => {\n if (!prevMap[threadId]) {\n return prevMap;\n }\n return {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n name: threadWithGeneratedName.name,\n },\n };\n });\n return threadWithGeneratedName;\n },\n [client.beta.threads, currentThreadId, threadMap],\n );\n\n const switchCurrentThread = useCallback(\n async (threadId: string, fetch = true) => {\n if (threadId === PLACEHOLDER_THREAD.id) {\n console.warn(\"Switching to placeholder thread, may be a bug.\");\n return;\n }\n\n setCurrentThreadId(threadId);\n setThreadMap((prevMap) => {\n if (prevMap[threadId]) {\n return prevMap;\n }\n // If this is a new thread, add placeholder thread messages to the thread\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: {\n ...prevMap[PLACEHOLDER_THREAD.id],\n id: threadId,\n },\n };\n return updatedThreadMap;\n });\n\n if (fetch) {\n await fetchThread(threadId);\n }\n },\n [fetchThread],\n );\n\n const updateThreadStatus = useCallback(\n (threadId: string, stage: GenerationStage, statusMessage?: string) => {\n setThreadMap((prevMap) => {\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n generationStage: stage,\n statusMessage: statusMessage,\n },\n };\n return updatedThreadMap;\n });\n },\n [],\n );\n\n const cancel = useCallback(\n async (threadId?: string) => {\n threadId ??= currentThreadId;\n const currentGenerationStage =\n currentThread?.generationStage ?? GenerationStage.IDLE;\n if (isIdleStage(currentGenerationStage as GenerationStage)) {\n return;\n }\n setIgnoreResponse(true);\n setThreadMap((prevMap) => {\n if (!prevMap[threadId]) {\n return prevMap;\n }\n\n return {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n generationStage: GenerationStage.CANCELLED,\n messages: prevMap[threadId].messages.map((message) => {\n if (\n message.id ===\n prevMap[threadId].messages[\n prevMap[threadId].messages.length - 1\n ].id\n ) {\n return {\n ...message,\n isCancelled: true,\n };\n }\n return message;\n }),\n },\n };\n });\n\n await client.beta.threads.cancel(threadId);\n },\n [client.beta.threads, currentThreadId, currentThread?.generationStage],\n );\n\n const handleAdvanceStream = useCallback(\n async (\n stream: AsyncIterable<TamboAI.Beta.Threads.ThreadAdvanceResponse>,\n params: TamboAI.Beta.Threads.ThreadAdvanceParams,\n threadId: string,\n contextKey?: string,\n ): Promise<TamboThreadMessage> => {\n if (ignoreResponseRef.current) {\n setIgnoreResponse(false);\n return {\n threadId: threadId,\n content: [{ type: \"text\", text: \"\" }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n };\n }\n let finalMessage: Readonly<TamboThreadMessage> | undefined;\n let hasSetThreadId = false;\n updateThreadStatus(threadId, GenerationStage.STREAMING_RESPONSE);\n\n for await (const chunk of stream) {\n if (chunk.responseMessageDto.toolCallRequest) {\n // Increment tool call count for this tool\n const toolName = chunk.responseMessageDto.toolCallRequest.toolName;\n if (toolName && params.toolCallCounts) {\n params.toolCallCounts[toolName] =\n (params.toolCallCounts[toolName] ?? 0) + 1;\n }\n\n updateThreadStatus(\n chunk.responseMessageDto.threadId,\n GenerationStage.FETCHING_CONTEXT,\n );\n\n updateThreadMessage(\n chunk.responseMessageDto.id,\n {\n ...chunk.responseMessageDto,\n },\n false,\n );\n\n const toolCallResponse = await handleToolCall(\n chunk.responseMessageDto,\n toolRegistry,\n onCallUnregisteredTool,\n );\n if (ignoreResponseRef.current) {\n setIgnoreResponse(false);\n {\n return {\n threadId: threadId,\n content: [{ type: \"text\", text: \"\" }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n };\n }\n }\n const toolCallResponseString =\n typeof toolCallResponse.result === \"string\"\n ? toolCallResponse.result\n : JSON.stringify(toolCallResponse.result);\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n content: [{ type: \"text\", text: toolCallResponseString }],\n role: \"tool\",\n actionType: \"tool_response\",\n component: chunk.responseMessageDto.component,\n tool_call_id: chunk.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n };\n\n updateThreadMessage(\n chunk.responseMessageDto.id,\n {\n ...chunk.responseMessageDto,\n error: toolCallResponse.error,\n },\n false,\n );\n\n addThreadMessage(\n {\n threadId: chunk.responseMessageDto.threadId,\n content: [{ type: \"text\", text: toolCallResponseString }],\n role: \"tool\",\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n componentState: {},\n actionType: \"tool_response\",\n tool_call_id: chunk.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n false,\n );\n\n updateThreadStatus(\n chunk.responseMessageDto.threadId,\n GenerationStage.STREAMING_RESPONSE,\n );\n const toolCallResponseStream = await advanceStream(\n client,\n toolCallResponseParams,\n chunk.responseMessageDto.threadId,\n );\n\n return await handleAdvanceStream(\n toolCallResponseStream,\n toolCallResponseParams,\n chunk.responseMessageDto.threadId,\n contextKey,\n );\n } else {\n if (ignoreResponseRef.current) {\n setIgnoreResponse(false);\n return (\n finalMessage ?? {\n threadId: threadId,\n content: [{ type: \"text\", text: \"\" }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n }\n );\n }\n if (\n !hasSetThreadId &&\n chunk.responseMessageDto.threadId &&\n chunk.responseMessageDto.threadId !== currentThread?.id\n ) {\n hasSetThreadId = true;\n const wasPlaceholderThread =\n currentThreadId === PLACEHOLDER_THREAD.id;\n await switchCurrentThread(chunk.responseMessageDto.threadId, false);\n\n // If we're switching from placeholder to a real thread\n // this means a new thread was created, so refetch the threads list\n if (wasPlaceholderThread) {\n await refetchThreadsList(\n chunk.responseMessageDto.threadId,\n contextKey,\n );\n }\n }\n\n if (!finalMessage) {\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n await addThreadMessage(finalMessage, false);\n } else {\n // if we start getting a new message mid-stream, put the previous one on screen\n const isNewMessage =\n chunk.responseMessageDto.id !== finalMessage.id;\n\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n\n if (isNewMessage) {\n await addThreadMessage(finalMessage, false);\n } else {\n await updateThreadMessage(finalMessage.id, finalMessage, false);\n }\n }\n }\n }\n\n updateThreadStatus(\n finalMessage?.threadId ?? threadId,\n GenerationStage.COMPLETE,\n );\n return (\n finalMessage ?? {\n threadId: \"\",\n content: [{ type: \"text\", text: `Error processing stream` }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n }\n );\n },\n [\n addThreadMessage,\n client,\n componentList,\n currentThread?.id,\n currentThreadId,\n onCallUnregisteredTool,\n refetchThreadsList,\n switchCurrentThread,\n toolRegistry,\n updateThreadMessage,\n updateThreadStatus,\n ],\n );\n\n const sendThreadMessage = useCallback(\n async (\n message: string,\n options: {\n threadId?: string;\n streamResponse?: boolean;\n forceToolChoice?: string;\n contextKey?: string;\n additionalContext?: Record<string, any>;\n content?: TamboAI.Beta.Threads.ChatCompletionContentPart[];\n } = {},\n ): Promise<TamboThreadMessage> => {\n setIgnoreResponse(false);\n const {\n threadId = currentThreadId ?? PLACEHOLDER_THREAD.id,\n streamResponse = streaming,\n forceToolChoice,\n contextKey,\n additionalContext,\n content,\n } = options;\n updateThreadStatus(threadId, GenerationStage.FETCHING_CONTEXT);\n\n // Get additional context from enabled helpers\n const helperContexts = await getAdditionalContext();\n\n // Combine all contexts\n const combinedContext: Record<string, any> = {\n ...(additionalContext ?? {}),\n };\n\n // Add helper contexts to combinedContext\n for (const helperContext of helperContexts) {\n combinedContext[helperContext.name] = helperContext.context;\n }\n\n // Use provided content or build simple text message\n const messageContent = content ?? [\n { type: \"text\" as const, text: message },\n ];\n\n addThreadMessage(\n {\n content: messageContent as any,\n renderedComponent: null,\n role: \"user\",\n threadId: threadId,\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n componentState: {},\n additionalContext: combinedContext,\n },\n false,\n );\n\n const availableComponents = getAvailableComponents(\n componentList,\n toolRegistry,\n componentToolAssociations,\n );\n const unassociatedTools = getUnassociatedTools(\n toolRegistry,\n componentToolAssociations,\n );\n\n // Track tool call counts for this message processing\n const toolCallCounts: Record<string, number> = {};\n\n const params: TamboAI.Beta.Threads.ThreadAdvanceParams = {\n messageToAppend: {\n content: messageContent as any,\n role: \"user\",\n additionalContext: combinedContext,\n },\n contextKey,\n availableComponents: availableComponents,\n clientTools: unassociatedTools.map((tool) =>\n mapTamboToolToContextTool(tool),\n ),\n forceToolChoice: forceToolChoice,\n toolCallCounts,\n };\n\n if (streamResponse) {\n let advanceStreamResponse: AsyncIterable<TamboAI.Beta.Threads.ThreadAdvanceResponse>;\n try {\n advanceStreamResponse = await advanceStream(\n client,\n params,\n threadId === PLACEHOLDER_THREAD.id ? undefined : threadId,\n );\n } catch (error) {\n updateThreadStatus(threadId, GenerationStage.ERROR);\n throw error;\n }\n try {\n return await handleAdvanceStream(\n advanceStreamResponse,\n params,\n threadId,\n contextKey,\n );\n } catch (error) {\n updateThreadStatus(threadId, GenerationStage.ERROR);\n throw error;\n }\n }\n\n let advanceResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse;\n try {\n advanceResponse = await (threadId === PLACEHOLDER_THREAD.id\n ? client.beta.threads.advance(params)\n : client.beta.threads.advanceByID(threadId, params));\n } catch (error) {\n updateThreadStatus(threadId, GenerationStage.ERROR);\n throw error;\n }\n\n //handle tool calls\n try {\n while (advanceResponse.responseMessageDto.toolCallRequest) {\n // Increment tool call count for this tool\n const toolName =\n advanceResponse.responseMessageDto.toolCallRequest.toolName;\n if (toolName) {\n toolCallCounts[toolName] = (toolCallCounts[toolName] || 0) + 1;\n }\n\n updateThreadStatus(threadId, GenerationStage.FETCHING_CONTEXT);\n const toolCallResponse = await handleToolCall(\n advanceResponse.responseMessageDto,\n toolRegistry,\n onCallUnregisteredTool,\n );\n const toolResponseString =\n typeof toolCallResponse.result === \"string\"\n ? toolCallResponse.result\n : JSON.stringify(toolCallResponse.result);\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n ...params.messageToAppend,\n content: [{ type: \"text\", text: toolResponseString }],\n role: \"tool\",\n actionType: \"tool_response\",\n component: advanceResponse.responseMessageDto.component,\n tool_call_id: advanceResponse.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n };\n if (toolCallResponse.error) {\n //update toolcall message with error\n const toolCallMessage = {\n ...advanceResponse.responseMessageDto,\n error: toolCallResponse.error,\n };\n updateThreadMessage(toolCallMessage.id, toolCallMessage, false);\n }\n updateThreadStatus(threadId, GenerationStage.HYDRATING_COMPONENT);\n addThreadMessage(\n {\n threadId: threadId,\n content: [{ type: \"text\", text: toolResponseString }],\n role: \"tool\",\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n componentState: {},\n actionType: \"tool_response\",\n tool_call_id: advanceResponse.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n false,\n );\n\n advanceResponse = await client.beta.threads.advanceByID(\n advanceResponse.responseMessageDto.threadId,\n toolCallResponseParams,\n );\n }\n } catch (error) {\n updateThreadStatus(\n advanceResponse.responseMessageDto.threadId,\n GenerationStage.ERROR,\n );\n throw error;\n }\n\n const finalMessage = advanceResponse.responseMessageDto.component\n ?.componentName\n ? renderComponentIntoMessage(\n advanceResponse.responseMessageDto,\n componentList,\n )\n : advanceResponse.responseMessageDto;\n const wasPlaceholderThread = currentThreadId === PLACEHOLDER_THREAD.id;\n await switchCurrentThread(advanceResponse.responseMessageDto.threadId);\n\n // If we're switching from placeholder to a real thread\n // this means a new thread was created, so refetch the threads list\n if (wasPlaceholderThread) {\n await refetchThreadsList(\n advanceResponse.responseMessageDto.threadId,\n contextKey,\n );\n }\n updateThreadStatus(\n advanceResponse.responseMessageDto.threadId,\n GenerationStage.COMPLETE,\n );\n return finalMessage;\n },\n [\n componentList,\n toolRegistry,\n componentToolAssociations,\n currentThreadId,\n switchCurrentThread,\n addThreadMessage,\n client,\n updateThreadMessage,\n updateThreadStatus,\n handleAdvanceStream,\n streaming,\n getAdditionalContext,\n onCallUnregisteredTool,\n refetchThreadsList,\n ],\n );\n\n return (\n <TamboThreadContext.Provider\n value={{\n thread: currentThread,\n switchCurrentThread,\n startNewThread,\n updateThreadName,\n generateThreadName,\n addThreadMessage,\n updateThreadMessage,\n streaming,\n cancel,\n sendThreadMessage,\n }}\n >\n <TamboGenerationStageProvider\n generationStage={currentGenerationStage}\n statusMessage={currentStatusMessage}\n >\n {children}\n </TamboGenerationStageProvider>\n </TamboThreadContext.Provider>\n );\n};\n\n/**\n * The useTamboGenerationStage hook provides access to the generation stage context\n * to the descendants of the TamboThreadProvider.\n * @returns The generation stage context\n */\nexport const useTamboGenerationStage = (): TamboGenerationStageContextProps => {\n const generationStageContext = useContext(TamboGenerationStageContext);\n\n if (generationStageContext === undefined) {\n throw new Error(\n \"useTamboGenerationStage must be used within a TamboThreadProvider\",\n );\n }\n\n return generationStageContext;\n};\n\n/**\n * The useTamboThread hook provides access to the current thread context\n * to the descendants of the TamboThreadProvider.\n * @returns All state and actions for the current thread\n */\nexport const useTamboThread = (): CombinedTamboThreadContextProps => {\n const threadContext = useContext(TamboThreadContext);\n const generationStageContext = useContext(TamboGenerationStageContext);\n\n if (threadContext === undefined) {\n throw new Error(\"useTamboThread must be used within a TamboThreadProvider\");\n }\n\n if (generationStageContext === undefined) {\n throw new Error(\"useTamboThread must be used within a TamboThreadProvider\");\n }\n\n return {\n ...threadContext,\n ...generationStageContext,\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"tambo-thread-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-thread-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport TamboAI, { advanceStream } from \"@tambo-ai/typescript-sdk\";\nimport { Thread } from \"@tambo-ai/typescript-sdk/resources/beta/threads/threads\";\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n GenerationStage,\n isIdleStage,\n TamboThreadMessage,\n} from \"../model/generate-component-response\";\nimport { TamboThread } from \"../model/tambo-thread\";\nimport { renderComponentIntoMessage } from \"../util/generate-component\";\nimport {\n getAvailableComponents,\n getUnassociatedTools,\n mapTamboToolToContextTool,\n} from \"../util/registry\";\nimport { handleToolCall } from \"../util/tool-caller\";\nimport { useTamboClient, useTamboQueryClient } from \"./tambo-client-provider\";\nimport { useTamboContextHelpers } from \"./tambo-context-helpers-provider\";\nimport { useTamboRegistry } from \"./tambo-registry-provider\";\n\n// Generation Stage Context - separate from thread context to prevent re-renders\nexport interface TamboGenerationStageContextProps {\n generationStage: GenerationStage;\n generationStatusMessage: string;\n isIdle: boolean;\n}\n\nconst TamboGenerationStageContext = createContext<\n TamboGenerationStageContextProps | undefined\n>(undefined);\n\ninterface TamboGenerationStageProviderProps {\n generationStage: GenerationStage;\n statusMessage: string;\n}\n\n/**\n *\n * This provider is used to provide the generation stage context to the descendants of the provider.\n * @param props - The props for the GenerationStageProvider\n * @param props.children - The children to wrap\n * @param props.generationStage - The generation stage to provide\n * @param props.statusMessage - The status message to provide\n * @returns The GenerationStageProvider component\n */\nexport const TamboGenerationStageProvider: React.FC<\n PropsWithChildren<TamboGenerationStageProviderProps>\n> = ({ children, generationStage, statusMessage }) => {\n const isIdle = isIdleStage(generationStage);\n\n const contextValue = useMemo(() => {\n return {\n generationStage,\n generationStatusMessage: statusMessage,\n isIdle,\n };\n }, [generationStage, statusMessage, isIdle]);\n\n return (\n <TamboGenerationStageContext.Provider value={contextValue}>\n {children}\n </TamboGenerationStageContext.Provider>\n );\n};\n\n// Type for partial message updates that requires threadId\ntype PartialTamboThreadMessageWithThreadId = Partial<TamboThreadMessage> & {\n threadId: string;\n};\n\nexport interface TamboThreadContextProps {\n /** The current thread */\n thread: TamboThread;\n /** Switch to a different thread */\n switchCurrentThread: (threadId: string, fetch?: boolean) => void;\n /** Start a new thread */\n startNewThread: () => void;\n /** Update a thread's name */\n updateThreadName: (name: string, threadId?: string) => void;\n /** Let Tambo generate and set a thread's name based on the thread's messages */\n generateThreadName: (threadId?: string) => Promise<Thread>;\n /** Add a message to the current thread */\n addThreadMessage: (\n message: TamboThreadMessage,\n sendToServer: boolean,\n ) => Promise<TamboAI.Beta.Threads.ThreadMessage[]>;\n /** Update a message in the current thread */\n updateThreadMessage: (\n id: string,\n message: PartialTamboThreadMessageWithThreadId,\n sendToServer: boolean,\n ) => Promise<void>;\n /** Cancel a thread */\n cancel: (threadId?: string) => Promise<void>;\n /** Whether the thread is streaming */\n streaming: boolean;\n /** Send a message to the current thread */\n sendThreadMessage: (\n message: string,\n options?: {\n threadId?: string;\n streamResponse?: boolean;\n contextKey?: string;\n forceToolChoice?: string;\n additionalContext?: Record<string, any>;\n content?: TamboAI.Beta.Threads.ChatCompletionContentPart[];\n },\n ) => Promise<TamboThreadMessage>;\n}\n\n// Combined context interface that includes generation stage fields\nexport interface CombinedTamboThreadContextProps\n extends TamboThreadContextProps,\n TamboGenerationStageContextProps {}\n\n/**\n * This is a stub entry for when the thread is not yet created, the first time\n * the user sends a message\n *\n * Note that the consumer needs to be careful never to send `PLACEHOLDER_THREAD.id` to the server,\n * as this doesn't really exist on the server side.\n */\nexport const PLACEHOLDER_THREAD: TamboThread = {\n id: \"placeholder\",\n messages: [],\n createdAt: \"\",\n projectId: \"\",\n updatedAt: \"\",\n metadata: {},\n};\n\nexport const TamboThreadContext = createContext<TamboThreadContextProps>({\n thread: PLACEHOLDER_THREAD,\n /**\n *\n */\n switchCurrentThread: () => {\n throw new Error(\"switchCurrentThread not implemented\");\n },\n /**\n *\n */\n startNewThread: () => {\n throw new Error(\"startNewThread not implemented\");\n },\n /**\n *\n */\n updateThreadName: () => {\n throw new Error(\"updateThreadName not implemented\");\n },\n /**\n *\n */\n generateThreadName: () => {\n throw new Error(\"generateThreadName not implemented\");\n },\n /**\n *\n */\n addThreadMessage: () => {\n throw new Error(\"updateThreadMessageHistory not implemented\");\n },\n streaming: true,\n /**\n *\n */\n updateThreadMessage: () => {\n throw new Error(\"updateThreadMessage not implemented\");\n },\n /**\n *\n */\n sendThreadMessage: () => {\n throw new Error(\"sendThreadMessage not implemented\");\n },\n /**\n *\n */\n cancel: () => {\n throw new Error(\"cancel not implemented\");\n },\n});\n\nexport type InitialTamboThreadMessage = Pick<\n TamboThreadMessage,\n \"role\" | \"content\"\n> & {\n /** Optional ID - will be auto-generated if not provided */\n id?: string;\n /** Optional creation timestamp - will be auto-generated if not provided */\n createdAt?: string;\n /** Optional additional context to include with the message */\n additionalContext?: Record<string, any>;\n /** Optional component state - will default to empty object if not provided */\n componentState?: Record<string, any>;\n};\n\nexport interface TamboThreadProviderProps {\n /** Whether to stream the response */\n streaming?: boolean;\n /** Initial messages to be included in new threads */\n initialMessages?: InitialTamboThreadMessage[];\n}\n\n/**\n * The TamboThreadProvider is a React provider that provides a thread context\n * to the descendants of the provider.\n * @param props - The props for the TamboThreadProvider\n * @param props.children - The children to wrap\n * @param props.streaming - Whether to stream the response by default. Defaults to true.\n * @param props.initialMessages - Initial messages to be included in new threads\n * @returns The TamboThreadProvider component\n */\nexport const TamboThreadProvider: React.FC<\n PropsWithChildren<TamboThreadProviderProps>\n> = ({ children, streaming = true, initialMessages = [] }) => {\n // Create placeholder thread with initial messages\n const placeholderThread: TamboThread = useMemo(\n () => ({\n id: \"placeholder\",\n messages: initialMessages.map((msg) => ({\n ...msg,\n id: msg.id ?? crypto.randomUUID(),\n threadId: \"placeholder\",\n createdAt: msg.createdAt ?? new Date().toISOString(),\n componentState: msg.componentState ?? {},\n })),\n createdAt: \"\",\n projectId: \"\",\n updatedAt: \"\",\n metadata: {},\n }),\n [initialMessages],\n );\n\n const [threadMap, setThreadMap] = useState<Record<string, TamboThread>>({\n [placeholderThread.id]: placeholderThread,\n });\n const client = useTamboClient();\n const queryClient = useTamboQueryClient();\n const {\n componentList,\n toolRegistry,\n componentToolAssociations,\n onCallUnregisteredTool,\n } = useTamboRegistry();\n const { getAdditionalContext } = useTamboContextHelpers();\n const [ignoreResponse, setIgnoreResponse] = useState(false);\n const ignoreResponseRef = useRef(ignoreResponse);\n const [currentThreadId, setCurrentThreadId] = useState<string>(\n placeholderThread.id,\n );\n const currentThread: TamboThread | undefined = threadMap[currentThreadId];\n\n // Generation stage props for GenerationStageProvider\n const currentGenerationStage =\n (currentThread?.generationStage as GenerationStage) ?? GenerationStage.IDLE;\n const currentStatusMessage = currentThread?.statusMessage ?? \"\";\n\n // Use existing messages from the current thread to avoid re-generating any components\n const currentMessageCache = useMemo(() => {\n const messageCache = new Map<string, TamboThreadMessage>();\n if (currentThread) {\n for (const message of currentThread.messages) {\n messageCache.set(message.id, message);\n }\n }\n return messageCache;\n }, [currentThread]);\n\n useEffect(() => {\n ignoreResponseRef.current = ignoreResponse;\n }, [ignoreResponse]);\n\n const refetchThreadsList = useCallback(\n async (threadId: string, contextKey: string | undefined) => {\n try {\n const currentProject = await client.beta.projects.getCurrent();\n\n const optimisticThread = {\n ...PLACEHOLDER_THREAD,\n id: threadId,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n queryClient.setQueryData(\n [\"threads\", currentProject.id, contextKey],\n (old: TamboAI.Beta.Threads.ThreadsOffsetAndLimit | undefined) => {\n return {\n ...old,\n items: [optimisticThread, ...(old?.items ?? [])],\n };\n },\n );\n\n await queryClient.invalidateQueries({\n queryKey: [\"threads\"],\n });\n } catch (error) {\n console.warn(\"Failed to refetch threads list:\", error);\n }\n },\n [client.beta.projects, queryClient],\n );\n\n const fetchThread = useCallback(\n async (threadId: string) => {\n const thread = await client.beta.threads.retrieve(threadId);\n const threadWithRenderedComponents = {\n ...thread,\n messages: thread.messages.map((message) => {\n if (currentMessageCache.has(message.id)) {\n const renderedMessage = currentMessageCache.get(message.id);\n return {\n ...renderedMessage,\n ...message,\n };\n }\n if (message.component?.componentName) {\n const messageWithComponent = renderComponentIntoMessage(\n message,\n componentList,\n );\n return messageWithComponent;\n }\n return message;\n }),\n };\n\n setThreadMap((prevMap) => {\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: threadWithRenderedComponents,\n };\n return updatedThreadMap;\n });\n },\n [client.beta.threads, componentList, currentMessageCache],\n );\n\n useEffect(() => {\n if (\n currentThreadId &&\n currentThreadId !== placeholderThread.id &&\n !threadMap[currentThreadId]\n ) {\n fetchThread(currentThreadId);\n }\n }, [currentThreadId, fetchThread, threadMap, placeholderThread.id]);\n\n const addThreadMessage = useCallback(\n async (\n message: TamboThreadMessage,\n sendToServer = true,\n createdAt: string = new Date().toISOString(),\n ) => {\n if (!currentThread) {\n console.warn(\"Cannot add messages if we do not have a current thread\");\n return [];\n }\n\n const chatMessage: TamboThreadMessage = {\n ...message,\n createdAt,\n };\n const threadId = message.threadId;\n const messageId = chatMessage.id;\n // optimistically update the thread in the local state\n setThreadMap((prevMap) => {\n if (!threadId) {\n return prevMap;\n }\n const prevMessages = prevMap[threadId]?.messages || [];\n const haveMessage = prevMessages.find((msg) => msg.id === messageId);\n // Update in place if the message already exists\n const updatedMessages = haveMessage\n ? prevMessages.map((msg) => {\n if (msg.id === messageId) {\n return chatMessage;\n }\n return msg;\n })\n : [...prevMessages, chatMessage];\n\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n messages: updatedMessages,\n },\n };\n return updatedThreadMap;\n });\n\n if (sendToServer) {\n // TODO: if this fails, we need to revert the local state update\n await client.beta.threads.messages.create(message.threadId, {\n content: message.content,\n role: message.role,\n additionalContext: chatMessage.additionalContext,\n });\n }\n return threadMap[threadId]?.messages || [];\n },\n [client.beta.threads.messages, currentThread, threadMap],\n );\n\n const updateThreadMessage = useCallback(\n async (\n id: string,\n message: PartialTamboThreadMessageWithThreadId,\n sendToServer = true,\n createdAt: string = new Date().toISOString(),\n ) => {\n setThreadMap((prevMap) => {\n const prevMessages = prevMap[message.threadId]?.messages || [];\n const updatedMessages = prevMessages.map((msg) => {\n if (msg.id === id) {\n // Merge the partial update with the existing message\n const updatedMessage: TamboThreadMessage = {\n ...msg,\n ...message,\n id: msg.id,\n createdAt: message.createdAt ?? msg.createdAt ?? createdAt,\n };\n return updatedMessage;\n }\n return msg;\n });\n return {\n ...prevMap,\n [message.threadId]: {\n ...prevMap[message.threadId],\n messages: updatedMessages,\n },\n };\n });\n\n if (sendToServer && message.content && message.role) {\n // TODO: if this fails, we need to revert the local state update\n await client.beta.threads.messages.create(message.threadId, {\n content: message.content,\n role: message.role,\n additionalContext: message.additionalContext,\n });\n }\n },\n [client.beta.threads.messages],\n );\n\n const startNewThread = useCallback(() => {\n setCurrentThreadId(placeholderThread.id);\n setThreadMap((prevMap) => {\n return {\n ...prevMap,\n [placeholderThread.id]: placeholderThread,\n };\n });\n }, [placeholderThread]);\n\n const updateThreadName = useCallback(\n async (name: string, threadId?: string) => {\n threadId ??= currentThreadId;\n\n setThreadMap((prevMap) => {\n if (!prevMap[threadId]) {\n return prevMap;\n }\n return { ...prevMap, [threadId]: { ...prevMap[threadId], name } };\n });\n\n if (threadId !== placeholderThread.id) {\n const currentProject = await client.beta.projects.getCurrent();\n await client.beta.threads.update(threadId, {\n name,\n projectId: currentProject.id,\n });\n }\n },\n [\n currentThreadId,\n client.beta.projects,\n client.beta.threads,\n placeholderThread.id,\n ],\n );\n\n const generateThreadName = useCallback(\n async (threadId?: string) => {\n threadId ??= currentThreadId;\n if (threadId === placeholderThread.id) {\n console.warn(\"Cannot generate name for empty thread\");\n return threadMap[threadId];\n }\n\n const threadWithGeneratedName =\n await client.beta.threads.generateName(threadId);\n\n setThreadMap((prevMap) => {\n if (!prevMap[threadId]) {\n return prevMap;\n }\n return {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n name: threadWithGeneratedName.name,\n },\n };\n });\n return threadWithGeneratedName;\n },\n [client.beta.threads, currentThreadId, threadMap, placeholderThread.id],\n );\n\n const switchCurrentThread = useCallback(\n async (threadId: string, fetch = true) => {\n if (threadId === placeholderThread.id) {\n console.warn(\"Switching to placeholder thread, may be a bug.\");\n return;\n }\n\n setCurrentThreadId(threadId);\n setThreadMap((prevMap) => {\n if (prevMap[threadId]) {\n return prevMap;\n }\n // If this is a new thread, add placeholder thread messages to the thread\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: {\n ...prevMap[placeholderThread.id],\n id: threadId,\n },\n };\n return updatedThreadMap;\n });\n\n if (fetch) {\n await fetchThread(threadId);\n }\n },\n [fetchThread, placeholderThread],\n );\n\n const updateThreadStatus = useCallback(\n (threadId: string, stage: GenerationStage, statusMessage?: string) => {\n setThreadMap((prevMap) => {\n const updatedThreadMap = {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n generationStage: stage,\n statusMessage: statusMessage,\n },\n };\n return updatedThreadMap;\n });\n },\n [],\n );\n\n const cancel = useCallback(\n async (threadId?: string) => {\n threadId ??= currentThreadId;\n const currentGenerationStage =\n currentThread?.generationStage ?? GenerationStage.IDLE;\n if (isIdleStage(currentGenerationStage as GenerationStage)) {\n return;\n }\n setIgnoreResponse(true);\n setThreadMap((prevMap) => {\n if (!prevMap[threadId]) {\n return prevMap;\n }\n\n return {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n generationStage: GenerationStage.CANCELLED,\n messages: prevMap[threadId].messages.map((message) => {\n if (\n message.id ===\n prevMap[threadId].messages[\n prevMap[threadId].messages.length - 1\n ].id\n ) {\n return {\n ...message,\n isCancelled: true,\n };\n }\n return message;\n }),\n },\n };\n });\n\n await client.beta.threads.cancel(threadId);\n },\n [client.beta.threads, currentThreadId, currentThread?.generationStage],\n );\n\n const handleAdvanceStream = useCallback(\n async (\n stream: AsyncIterable<TamboAI.Beta.Threads.ThreadAdvanceResponse>,\n params: TamboAI.Beta.Threads.ThreadAdvanceParams,\n threadId: string,\n contextKey?: string,\n ): Promise<TamboThreadMessage> => {\n if (ignoreResponseRef.current) {\n setIgnoreResponse(false);\n return {\n threadId: threadId,\n content: [{ type: \"text\", text: \"\" }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n };\n }\n let finalMessage: Readonly<TamboThreadMessage> | undefined;\n let hasSetThreadId = false;\n updateThreadStatus(threadId, GenerationStage.STREAMING_RESPONSE);\n\n for await (const chunk of stream) {\n if (chunk.responseMessageDto.toolCallRequest) {\n // Increment tool call count for this tool\n const toolName = chunk.responseMessageDto.toolCallRequest.toolName;\n if (toolName && params.toolCallCounts) {\n params.toolCallCounts[toolName] =\n (params.toolCallCounts[toolName] ?? 0) + 1;\n }\n\n updateThreadStatus(\n chunk.responseMessageDto.threadId,\n GenerationStage.FETCHING_CONTEXT,\n );\n\n updateThreadMessage(\n chunk.responseMessageDto.id,\n {\n ...chunk.responseMessageDto,\n },\n false,\n );\n\n const toolCallResponse = await handleToolCall(\n chunk.responseMessageDto,\n toolRegistry,\n onCallUnregisteredTool,\n );\n if (ignoreResponseRef.current) {\n setIgnoreResponse(false);\n {\n return {\n threadId: threadId,\n content: [{ type: \"text\", text: \"\" }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n };\n }\n }\n const toolCallResponseString =\n typeof toolCallResponse.result === \"string\"\n ? toolCallResponse.result\n : JSON.stringify(toolCallResponse.result);\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n content: [{ type: \"text\", text: toolCallResponseString }],\n role: \"tool\",\n actionType: \"tool_response\",\n component: chunk.responseMessageDto.component,\n tool_call_id: chunk.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n };\n\n updateThreadMessage(\n chunk.responseMessageDto.id,\n {\n ...chunk.responseMessageDto,\n error: toolCallResponse.error,\n },\n false,\n );\n\n addThreadMessage(\n {\n threadId: chunk.responseMessageDto.threadId,\n content: [{ type: \"text\", text: toolCallResponseString }],\n role: \"tool\",\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n componentState: {},\n actionType: \"tool_response\",\n tool_call_id: chunk.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n false,\n );\n\n updateThreadStatus(\n chunk.responseMessageDto.threadId,\n GenerationStage.STREAMING_RESPONSE,\n );\n const toolCallResponseStream = await advanceStream(\n client,\n toolCallResponseParams,\n chunk.responseMessageDto.threadId,\n );\n\n return await handleAdvanceStream(\n toolCallResponseStream,\n toolCallResponseParams,\n chunk.responseMessageDto.threadId,\n contextKey,\n );\n } else {\n if (ignoreResponseRef.current) {\n setIgnoreResponse(false);\n return (\n finalMessage ?? {\n threadId: threadId,\n content: [{ type: \"text\", text: \"\" }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n }\n );\n }\n if (\n !hasSetThreadId &&\n chunk.responseMessageDto.threadId &&\n chunk.responseMessageDto.threadId !== currentThread?.id\n ) {\n hasSetThreadId = true;\n const wasPlaceholderThread =\n currentThreadId === PLACEHOLDER_THREAD.id;\n await switchCurrentThread(chunk.responseMessageDto.threadId, false);\n\n // If we're switching from placeholder to a real thread\n // this means a new thread was created, so refetch the threads list\n if (wasPlaceholderThread) {\n await refetchThreadsList(\n chunk.responseMessageDto.threadId,\n contextKey,\n );\n }\n }\n\n if (!finalMessage) {\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n await addThreadMessage(finalMessage, false);\n } else {\n // if we start getting a new message mid-stream, put the previous one on screen\n const isNewMessage =\n chunk.responseMessageDto.id !== finalMessage.id;\n\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n\n if (isNewMessage) {\n await addThreadMessage(finalMessage, false);\n } else {\n await updateThreadMessage(finalMessage.id, finalMessage, false);\n }\n }\n }\n }\n\n updateThreadStatus(\n finalMessage?.threadId ?? threadId,\n GenerationStage.COMPLETE,\n );\n return (\n finalMessage ?? {\n threadId: \"\",\n content: [{ type: \"text\", text: `Error processing stream` }],\n role: \"assistant\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n componentState: {},\n }\n );\n },\n [\n addThreadMessage,\n client,\n componentList,\n currentThread?.id,\n currentThreadId,\n onCallUnregisteredTool,\n refetchThreadsList,\n switchCurrentThread,\n toolRegistry,\n updateThreadMessage,\n updateThreadStatus,\n ],\n );\n\n const sendThreadMessage = useCallback(\n async (\n message: string,\n options: {\n threadId?: string;\n streamResponse?: boolean;\n forceToolChoice?: string;\n contextKey?: string;\n additionalContext?: Record<string, any>;\n content?: TamboAI.Beta.Threads.ChatCompletionContentPart[];\n } = {},\n ): Promise<TamboThreadMessage> => {\n setIgnoreResponse(false);\n const {\n threadId = currentThreadId ?? placeholderThread.id,\n streamResponse = streaming,\n forceToolChoice,\n contextKey,\n additionalContext,\n content,\n } = options;\n updateThreadStatus(threadId, GenerationStage.FETCHING_CONTEXT);\n\n // Get additional context from enabled helpers\n const helperContexts = await getAdditionalContext();\n\n // Combine all contexts\n const combinedContext: Record<string, any> = {\n ...(additionalContext ?? {}),\n };\n\n // Add helper contexts to combinedContext\n for (const helperContext of helperContexts) {\n combinedContext[helperContext.name] = helperContext.context;\n }\n\n // Use provided content or build simple text message\n const messageContent = content ?? [\n { type: \"text\" as const, text: message },\n ];\n\n addThreadMessage(\n {\n content: messageContent as any,\n renderedComponent: null,\n role: \"user\",\n threadId: threadId,\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n componentState: {},\n additionalContext: combinedContext,\n },\n false,\n );\n\n const availableComponents = getAvailableComponents(\n componentList,\n toolRegistry,\n componentToolAssociations,\n );\n const unassociatedTools = getUnassociatedTools(\n toolRegistry,\n componentToolAssociations,\n );\n\n // Track tool call counts for this message processing\n const toolCallCounts: Record<string, number> = {};\n\n const params: TamboAI.Beta.Threads.ThreadAdvanceParams = {\n messageToAppend: {\n content: messageContent as any,\n role: \"user\",\n additionalContext: combinedContext,\n },\n contextKey,\n availableComponents: availableComponents,\n clientTools: unassociatedTools.map((tool) =>\n mapTamboToolToContextTool(tool),\n ),\n forceToolChoice: forceToolChoice,\n toolCallCounts,\n ...(threadId === placeholderThread.id &&\n initialMessages.length > 0 && {\n initialMessages: initialMessages.map((msg) => ({\n content: msg.content,\n role: msg.role,\n additionalContext: msg.additionalContext,\n })),\n }),\n };\n\n if (streamResponse) {\n let advanceStreamResponse: AsyncIterable<TamboAI.Beta.Threads.ThreadAdvanceResponse>;\n try {\n advanceStreamResponse = await advanceStream(\n client,\n params,\n threadId === placeholderThread.id ? undefined : threadId,\n );\n } catch (error) {\n updateThreadStatus(threadId, GenerationStage.ERROR);\n throw error;\n }\n try {\n return await handleAdvanceStream(\n advanceStreamResponse,\n params,\n threadId,\n contextKey,\n );\n } catch (error) {\n updateThreadStatus(threadId, GenerationStage.ERROR);\n throw error;\n }\n }\n\n let advanceResponse: TamboAI.Beta.Threads.ThreadAdvanceResponse;\n try {\n advanceResponse = await (threadId === placeholderThread.id\n ? client.beta.threads.advance(params)\n : client.beta.threads.advanceByID(threadId, params));\n } catch (error) {\n updateThreadStatus(threadId, GenerationStage.ERROR);\n throw error;\n }\n\n //handle tool calls\n try {\n while (advanceResponse.responseMessageDto.toolCallRequest) {\n // Increment tool call count for this tool\n const toolName =\n advanceResponse.responseMessageDto.toolCallRequest.toolName;\n if (toolName) {\n toolCallCounts[toolName] = (toolCallCounts[toolName] || 0) + 1;\n }\n\n updateThreadStatus(threadId, GenerationStage.FETCHING_CONTEXT);\n const toolCallResponse = await handleToolCall(\n advanceResponse.responseMessageDto,\n toolRegistry,\n onCallUnregisteredTool,\n );\n const toolResponseString =\n typeof toolCallResponse.result === \"string\"\n ? toolCallResponse.result\n : JSON.stringify(toolCallResponse.result);\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n ...params.messageToAppend,\n content: [{ type: \"text\", text: toolResponseString }],\n role: \"tool\",\n actionType: \"tool_response\",\n component: advanceResponse.responseMessageDto.component,\n tool_call_id: advanceResponse.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n };\n if (toolCallResponse.error) {\n //update toolcall message with error\n const toolCallMessage = {\n ...advanceResponse.responseMessageDto,\n error: toolCallResponse.error,\n };\n updateThreadMessage(toolCallMessage.id, toolCallMessage, false);\n }\n updateThreadStatus(threadId, GenerationStage.HYDRATING_COMPONENT);\n addThreadMessage(\n {\n threadId: threadId,\n content: [{ type: \"text\", text: toolResponseString }],\n role: \"tool\",\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n componentState: {},\n actionType: \"tool_response\",\n tool_call_id: advanceResponse.responseMessageDto.tool_call_id,\n error: toolCallResponse.error,\n },\n false,\n );\n\n advanceResponse = await client.beta.threads.advanceByID(\n advanceResponse.responseMessageDto.threadId,\n toolCallResponseParams,\n );\n }\n } catch (error) {\n updateThreadStatus(\n advanceResponse.responseMessageDto.threadId,\n GenerationStage.ERROR,\n );\n throw error;\n }\n\n const finalMessage = advanceResponse.responseMessageDto.component\n ?.componentName\n ? renderComponentIntoMessage(\n advanceResponse.responseMessageDto,\n componentList,\n )\n : advanceResponse.responseMessageDto;\n const wasPlaceholderThread = currentThreadId === PLACEHOLDER_THREAD.id;\n await switchCurrentThread(advanceResponse.responseMessageDto.threadId);\n\n // If we're switching from placeholder to a real thread\n // this means a new thread was created, so refetch the threads list\n if (wasPlaceholderThread) {\n await refetchThreadsList(\n advanceResponse.responseMessageDto.threadId,\n contextKey,\n );\n }\n updateThreadStatus(\n advanceResponse.responseMessageDto.threadId,\n GenerationStage.COMPLETE,\n );\n return finalMessage;\n },\n [\n componentList,\n toolRegistry,\n componentToolAssociations,\n currentThreadId,\n switchCurrentThread,\n addThreadMessage,\n client,\n updateThreadMessage,\n updateThreadStatus,\n handleAdvanceStream,\n streaming,\n getAdditionalContext,\n placeholderThread.id,\n initialMessages,\n onCallUnregisteredTool,\n refetchThreadsList,\n ],\n );\n\n return (\n <TamboThreadContext.Provider\n value={{\n thread: currentThread,\n switchCurrentThread,\n startNewThread,\n updateThreadName,\n generateThreadName,\n addThreadMessage,\n updateThreadMessage,\n streaming,\n cancel,\n sendThreadMessage,\n }}\n >\n <TamboGenerationStageProvider\n generationStage={currentGenerationStage}\n statusMessage={currentStatusMessage}\n >\n {children}\n </TamboGenerationStageProvider>\n </TamboThreadContext.Provider>\n );\n};\n\n/**\n * The useTamboGenerationStage hook provides access to the generation stage context\n * to the descendants of the TamboThreadProvider.\n * @returns The generation stage context\n */\nexport const useTamboGenerationStage = (): TamboGenerationStageContextProps => {\n const generationStageContext = useContext(TamboGenerationStageContext);\n\n if (generationStageContext === undefined) {\n throw new Error(\n \"useTamboGenerationStage must be used within a TamboThreadProvider\",\n );\n }\n\n return generationStageContext;\n};\n\n/**\n * The useTamboThread hook provides access to the current thread context\n * to the descendants of the TamboThreadProvider.\n * @returns All state and actions for the current thread\n */\nexport const useTamboThread = (): CombinedTamboThreadContextProps => {\n const threadContext = useContext(TamboThreadContext);\n const generationStageContext = useContext(TamboGenerationStageContext);\n\n if (threadContext === undefined) {\n throw new Error(\"useTamboThread must be used within a TamboThreadProvider\");\n }\n\n if (generationStageContext === undefined) {\n throw new Error(\"useTamboThread must be used within a TamboThreadProvider\");\n }\n\n return {\n ...threadContext,\n ...generationStageContext,\n };\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tambo-ai/react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.57.0",
|
|
4
4
|
"description": "React client package for Tambo AI",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -39,9 +39,6 @@
|
|
|
39
39
|
"build": "npm run build:cjs && npm run build:esm",
|
|
40
40
|
"build:cjs": "tsc -p tsconfig.cjs.json",
|
|
41
41
|
"build:esm": "tsc -p tsconfig.esm.json",
|
|
42
|
-
"dev": "concurrently -c blue.bold,green.bold \"npm run dev:cjs\" \"npm run dev:esm\"",
|
|
43
|
-
"dev:cjs": "tsc -p tsconfig.cjs.json --watch",
|
|
44
|
-
"dev:esm": "tsc -p tsconfig.esm.json --watch",
|
|
45
42
|
"check-types": "tsc --noEmit",
|
|
46
43
|
"test": "jest --config jest.config.ts",
|
|
47
44
|
"format": "prettier --write .",
|
|
@@ -67,8 +64,8 @@
|
|
|
67
64
|
"react-dom": "^18.0.0 || ^19.0.0"
|
|
68
65
|
},
|
|
69
66
|
"dependencies": {
|
|
70
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
71
|
-
"@tambo-ai/typescript-sdk": "^0.
|
|
67
|
+
"@modelcontextprotocol/sdk": "^1.19.1",
|
|
68
|
+
"@tambo-ai/typescript-sdk": "^0.73.0",
|
|
72
69
|
"@tanstack/react-query": "^5.90.2",
|
|
73
70
|
"fast-equals": "^5.3.2",
|
|
74
71
|
"partial-json": "^0.1.7",
|
|
@@ -80,10 +77,10 @@
|
|
|
80
77
|
"zod-to-json-schema": "^3.24.6"
|
|
81
78
|
},
|
|
82
79
|
"devDependencies": {
|
|
83
|
-
"@eslint/js": "^9.
|
|
80
|
+
"@eslint/js": "^9.37.0",
|
|
84
81
|
"@tambo-ai/eslint-config": "*",
|
|
85
82
|
"@tambo-ai/typescript-config": "*",
|
|
86
|
-
"@testing-library/jest-dom": "^6.
|
|
83
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
87
84
|
"@testing-library/react": "^16.3.0",
|
|
88
85
|
"@types/jest": "^30.0.0",
|
|
89
86
|
"@types/json-schema": "^7.0.15",
|
|
@@ -91,19 +88,19 @@
|
|
|
91
88
|
"@types/react": "^18.3.23",
|
|
92
89
|
"@types/react-dom": "^18.3.7",
|
|
93
90
|
"concurrently": "^9.2.1",
|
|
94
|
-
"eslint": "^9.
|
|
95
|
-
"eslint-plugin-jsdoc": "^
|
|
91
|
+
"eslint": "^9.37.0",
|
|
92
|
+
"eslint-plugin-jsdoc": "^61.0.1",
|
|
96
93
|
"eslint-plugin-react": "^7.37.5",
|
|
97
|
-
"eslint-plugin-react-hooks": "^
|
|
94
|
+
"eslint-plugin-react-hooks": "^6.1.1",
|
|
98
95
|
"jest": "^30.2.0",
|
|
99
96
|
"jest-environment-jsdom": "^30.2.0",
|
|
100
|
-
"lint-staged": "^16.
|
|
97
|
+
"lint-staged": "^16.2.3",
|
|
101
98
|
"prettier": "^3.6.2",
|
|
102
99
|
"prettier-2": "npm:prettier@^2",
|
|
103
100
|
"react": "^18.3.1",
|
|
104
101
|
"react-dom": "^18.3.1",
|
|
105
102
|
"ts-jest": "^29.4.4",
|
|
106
|
-
"typescript": "^5.9.
|
|
107
|
-
"typescript-eslint": "^8.
|
|
103
|
+
"typescript": "^5.9.3",
|
|
104
|
+
"typescript-eslint": "^8.46.0"
|
|
108
105
|
}
|
|
109
106
|
}
|