@tambo-ai/react 0.12.0 → 0.13.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/hooks/__tests__/use-suggestions.test.d.ts +1 -0
- package/dist/hooks/__tests__/use-suggestions.test.d.ts.map +1 -0
- package/dist/hooks/react-query-hooks.d.ts +1 -0
- package/dist/hooks/react-query-hooks.d.ts.map +1 -0
- package/dist/hooks/use-component-state.d.ts +1 -0
- package/dist/hooks/use-component-state.d.ts.map +1 -0
- package/dist/hooks/use-current-message.d.ts +1 -0
- package/dist/hooks/use-current-message.d.ts.map +1 -0
- package/dist/hooks/use-suggestions.d.ts +1 -0
- package/dist/hooks/use-suggestions.d.ts.map +1 -0
- package/dist/hooks/use-suggestions.js +2 -2
- package/dist/hooks/use-suggestions.js.map +1 -1
- package/dist/hooks/use-tambo-threads.d.ts +1 -0
- package/dist/hooks/use-tambo-threads.d.ts.map +1 -0
- package/dist/hooks/use-thread-input.d.ts +3 -0
- package/dist/hooks/use-thread-input.d.ts.map +1 -0
- package/dist/hooks/use-thread-input.js +2 -1
- package/dist/hooks/use-thread-input.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -1
- package/dist/model/component-metadata.d.ts +1 -0
- package/dist/model/component-metadata.d.ts.map +1 -0
- package/dist/model/generate-component-response.d.ts +1 -0
- package/dist/model/generate-component-response.d.ts.map +1 -0
- package/dist/model/tambo-thread.d.ts +1 -0
- package/dist/model/tambo-thread.d.ts.map +1 -0
- package/dist/model/thread-input-error.d.ts +1 -0
- package/dist/model/thread-input-error.d.ts.map +1 -0
- package/dist/model/validate-input.d.ts +1 -0
- package/dist/model/validate-input.d.ts.map +1 -0
- package/dist/providers/index.d.ts +2 -1
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/tambo-client-provider.d.ts +3 -1
- package/dist/providers/tambo-client-provider.d.ts.map +1 -0
- package/dist/providers/tambo-client-provider.js +9 -2
- package/dist/providers/tambo-client-provider.js.map +1 -1
- package/dist/providers/tambo-component-provider.d.ts +1 -7
- package/dist/providers/tambo-component-provider.d.ts.map +1 -0
- package/dist/providers/tambo-component-provider.js +1 -66
- package/dist/providers/tambo-component-provider.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts +1 -0
- package/dist/providers/tambo-provider.d.ts.map +1 -0
- package/dist/providers/tambo-registry-provider.d.ts +1 -0
- package/dist/providers/tambo-registry-provider.d.ts.map +1 -0
- package/dist/providers/tambo-thread-provider.d.ts +4 -0
- package/dist/providers/tambo-thread-provider.d.ts.map +1 -0
- package/dist/providers/tambo-thread-provider.js +42 -30
- package/dist/providers/tambo-thread-provider.js.map +1 -1
- package/dist/util/generate-component.d.ts +3 -3
- package/dist/util/generate-component.d.ts.map +1 -0
- package/dist/util/generate-component.js +0 -174
- package/dist/util/generate-component.js.map +1 -1
- package/dist/util/messages.d.ts +1 -0
- package/dist/util/messages.d.ts.map +1 -0
- package/dist/util/query-utils.d.ts +1 -0
- package/dist/util/query-utils.d.ts.map +1 -0
- package/dist/util/registry.d.ts +1 -0
- package/dist/util/registry.d.ts.map +1 -0
- package/dist/util/tool-caller.d.ts +1 -0
- package/dist/util/tool-caller.d.ts.map +1 -0
- package/dist/util/tool-caller.js +1 -1
- package/dist/util/tool-caller.js.map +1 -1
- package/esm/hooks/__tests__/use-suggestions.test.d.ts +1 -0
- package/esm/hooks/__tests__/use-suggestions.test.d.ts.map +1 -0
- package/esm/hooks/react-query-hooks.d.ts +1 -0
- package/esm/hooks/react-query-hooks.d.ts.map +1 -0
- package/esm/hooks/use-component-state.d.ts +1 -0
- package/esm/hooks/use-component-state.d.ts.map +1 -0
- package/esm/hooks/use-current-message.d.ts +1 -0
- package/esm/hooks/use-current-message.d.ts.map +1 -0
- package/esm/hooks/use-suggestions.d.ts +1 -0
- package/esm/hooks/use-suggestions.d.ts.map +1 -0
- package/esm/hooks/use-suggestions.js +2 -2
- package/esm/hooks/use-suggestions.js.map +1 -1
- package/esm/hooks/use-tambo-threads.d.ts +1 -0
- package/esm/hooks/use-tambo-threads.d.ts.map +1 -0
- package/esm/hooks/use-thread-input.d.ts +3 -0
- package/esm/hooks/use-thread-input.d.ts.map +1 -0
- package/esm/hooks/use-thread-input.js +2 -1
- package/esm/hooks/use-thread-input.js.map +1 -1
- package/esm/index.d.ts +4 -3
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js.map +1 -1
- package/esm/model/component-metadata.d.ts +1 -0
- package/esm/model/component-metadata.d.ts.map +1 -0
- package/esm/model/generate-component-response.d.ts +1 -0
- package/esm/model/generate-component-response.d.ts.map +1 -0
- package/esm/model/tambo-thread.d.ts +1 -0
- package/esm/model/tambo-thread.d.ts.map +1 -0
- package/esm/model/thread-input-error.d.ts +1 -0
- package/esm/model/thread-input-error.d.ts.map +1 -0
- package/esm/model/validate-input.d.ts +1 -0
- package/esm/model/validate-input.d.ts.map +1 -0
- package/esm/providers/index.d.ts +2 -1
- package/esm/providers/index.d.ts.map +1 -0
- package/esm/providers/index.js.map +1 -1
- package/esm/providers/tambo-client-provider.d.ts +3 -1
- package/esm/providers/tambo-client-provider.d.ts.map +1 -0
- package/esm/providers/tambo-client-provider.js +9 -2
- package/esm/providers/tambo-client-provider.js.map +1 -1
- package/esm/providers/tambo-component-provider.d.ts +1 -7
- package/esm/providers/tambo-component-provider.d.ts.map +1 -0
- package/esm/providers/tambo-component-provider.js +2 -67
- package/esm/providers/tambo-component-provider.js.map +1 -1
- package/esm/providers/tambo-provider.d.ts +1 -0
- package/esm/providers/tambo-provider.d.ts.map +1 -0
- package/esm/providers/tambo-registry-provider.d.ts +1 -0
- package/esm/providers/tambo-registry-provider.d.ts.map +1 -0
- package/esm/providers/tambo-thread-provider.d.ts +4 -0
- package/esm/providers/tambo-thread-provider.d.ts.map +1 -0
- package/esm/providers/tambo-thread-provider.js +43 -31
- package/esm/providers/tambo-thread-provider.js.map +1 -1
- package/esm/util/generate-component.d.ts +3 -3
- package/esm/util/generate-component.d.ts.map +1 -0
- package/esm/util/generate-component.js +1 -174
- package/esm/util/generate-component.js.map +1 -1
- package/esm/util/messages.d.ts +1 -0
- package/esm/util/messages.d.ts.map +1 -0
- package/esm/util/query-utils.d.ts +1 -0
- package/esm/util/query-utils.d.ts.map +1 -0
- package/esm/util/registry.d.ts +1 -0
- package/esm/util/registry.d.ts.map +1 -0
- package/esm/util/tool-caller.d.ts +1 -0
- package/esm/util/tool-caller.d.ts.map +1 -0
- package/esm/util/tool-caller.js +1 -1
- package/esm/util/tool-caller.js.map +1 -1
- package/package.json +8 -6
- package/dist/hooks/use-query-client.d.ts +0 -0
- package/dist/hooks/use-query-client.js +0 -2
- package/dist/hooks/use-query-client.js.map +0 -1
- package/dist/setupTests.d.ts +0 -1
- package/dist/setupTests.js +0 -20
- package/dist/setupTests.js.map +0 -1
- package/esm/hooks/use-query-client.d.ts +0 -0
- package/esm/hooks/use-query-client.js +0 -2
- package/esm/hooks/use-query-client.js.map +0 -1
- package/esm/setupTests.d.ts +0 -1
- package/esm/setupTests.js +0 -18
- package/esm/setupTests.js.map +0 -1
|
@@ -78,6 +78,9 @@ exports.TamboThreadContext = (0, react_1.createContext)({
|
|
|
78
78
|
sendThreadMessage: () => {
|
|
79
79
|
throw new Error("advance not implemented");
|
|
80
80
|
},
|
|
81
|
+
generationStage: generate_component_response_1.GenerationStage.IDLE,
|
|
82
|
+
generationStatusMessage: "",
|
|
83
|
+
isIdle: true,
|
|
81
84
|
});
|
|
82
85
|
const TamboThreadProvider = ({ children, }) => {
|
|
83
86
|
const [threadMap, setThreadMap] = (0, react_1.useState)({
|
|
@@ -87,7 +90,6 @@ const TamboThreadProvider = ({ children, }) => {
|
|
|
87
90
|
const { componentList, toolRegistry, componentToolAssociations } = (0, tambo_registry_provider_1.useTamboRegistry)();
|
|
88
91
|
const [inputValue, setInputValue] = (0, react_1.useState)("");
|
|
89
92
|
const [currentThreadId, setCurrentThreadId] = (0, react_1.useState)(exports.PLACEHOLDER_THREAD.id);
|
|
90
|
-
const [unresolvedThreadId, setUnresolvedThreadId] = (0, react_1.useState)(exports.PLACEHOLDER_THREAD.id);
|
|
91
93
|
const currentThread = threadMap[currentThreadId];
|
|
92
94
|
// Use existing messages from the current thread to avoid re-generating any components
|
|
93
95
|
const currentMessageCache = (0, react_1.useMemo)(() => {
|
|
@@ -199,24 +201,17 @@ const TamboThreadProvider = ({ children, }) => {
|
|
|
199
201
|
});
|
|
200
202
|
}
|
|
201
203
|
}, [client.beta.threads.messages, currentThreadId]);
|
|
202
|
-
(0, react_1.
|
|
203
|
-
if (
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
messages: [...unresolvedThread.messages, ...currentThread.messages],
|
|
214
|
-
},
|
|
215
|
-
};
|
|
216
|
-
});
|
|
217
|
-
setUnresolvedThreadId(undefined);
|
|
218
|
-
}
|
|
219
|
-
}, [currentThreadId, unresolvedThreadId]);
|
|
204
|
+
const deleteThreadMessage = (0, react_1.useCallback)((messageId) => {
|
|
205
|
+
if (!currentThread)
|
|
206
|
+
return;
|
|
207
|
+
setThreadMap((prevMap) => ({
|
|
208
|
+
...prevMap,
|
|
209
|
+
[currentThread.id]: {
|
|
210
|
+
...prevMap[currentThread.id],
|
|
211
|
+
messages: prevMap[currentThread.id].messages.filter((msg) => msg.id !== messageId),
|
|
212
|
+
},
|
|
213
|
+
}));
|
|
214
|
+
}, [currentThread]);
|
|
220
215
|
const switchCurrentThread = (0, react_1.useCallback)(async (threadId) => {
|
|
221
216
|
if (threadId === exports.PLACEHOLDER_THREAD.id) {
|
|
222
217
|
console.warn("Switching to placeholder thread, may be a bug");
|
|
@@ -224,13 +219,15 @@ const TamboThreadProvider = ({ children, }) => {
|
|
|
224
219
|
}
|
|
225
220
|
setCurrentThreadId(threadId);
|
|
226
221
|
if (!threadMap[threadId]) {
|
|
227
|
-
setThreadMap((prevMap) =>
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
222
|
+
setThreadMap((prevMap) => {
|
|
223
|
+
return {
|
|
224
|
+
...prevMap,
|
|
225
|
+
[threadId]: {
|
|
226
|
+
...prevMap[exports.PLACEHOLDER_THREAD.id],
|
|
227
|
+
id: threadId,
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
});
|
|
234
231
|
}
|
|
235
232
|
await fetchThread(threadId);
|
|
236
233
|
}, [fetchThread, threadMap]);
|
|
@@ -254,22 +251,28 @@ const TamboThreadProvider = ({ children, }) => {
|
|
|
254
251
|
};
|
|
255
252
|
});
|
|
256
253
|
};
|
|
257
|
-
const updateThreadStatus = (0, react_1.useCallback)((stage) => {
|
|
254
|
+
const updateThreadStatus = (0, react_1.useCallback)((stage, statusMessage) => {
|
|
258
255
|
setThreadMap((prevMap) => {
|
|
259
256
|
return {
|
|
260
257
|
...prevMap,
|
|
261
258
|
[currentThreadId]: {
|
|
262
259
|
...prevMap[currentThreadId],
|
|
263
260
|
generationStage: stage,
|
|
261
|
+
statusMessage: statusMessage,
|
|
264
262
|
},
|
|
265
263
|
};
|
|
266
264
|
});
|
|
267
265
|
}, [currentThreadId]);
|
|
268
|
-
const handleAdvanceStream = (0, react_1.useCallback)(async (stream, params) => {
|
|
266
|
+
const handleAdvanceStream = (0, react_1.useCallback)(async (stream, params, messageIdToRemove) => {
|
|
269
267
|
let finalMessage;
|
|
270
268
|
let hasSetThreadId = false;
|
|
269
|
+
let isFirstChunk = true;
|
|
271
270
|
updateThreadStatus(generate_component_response_1.GenerationStage.STREAMING_RESPONSE);
|
|
272
271
|
for await (const chunk of stream) {
|
|
272
|
+
if (isFirstChunk && messageIdToRemove) {
|
|
273
|
+
deleteThreadMessage(messageIdToRemove);
|
|
274
|
+
}
|
|
275
|
+
isFirstChunk = false;
|
|
273
276
|
if (chunk.responseMessageDto.toolCallRequest) {
|
|
274
277
|
updateThreadStatus(generate_component_response_1.GenerationStage.FETCHING_CONTEXT);
|
|
275
278
|
const toolCallResponse = await (0, tool_caller_1.handleToolCall)(chunk.responseMessageDto, toolRegistry);
|
|
@@ -285,7 +288,8 @@ const TamboThreadProvider = ({ children, }) => {
|
|
|
285
288
|
};
|
|
286
289
|
updateThreadStatus(generate_component_response_1.GenerationStage.STREAMING_RESPONSE);
|
|
287
290
|
const toolCallResponseStream = await (0, typescript_sdk_1.advanceStream)(client, toolCallResponseParams, chunk.responseMessageDto.threadId);
|
|
288
|
-
|
|
291
|
+
// Pass the current message's ID to be removed when the new stream starts, since we now know it is a tool call request message
|
|
292
|
+
return await handleAdvanceStream(toolCallResponseStream, toolCallResponseParams, finalMessage?.id);
|
|
289
293
|
}
|
|
290
294
|
else {
|
|
291
295
|
if (!hasSetThreadId &&
|
|
@@ -325,6 +329,8 @@ const TamboThreadProvider = ({ children, }) => {
|
|
|
325
329
|
componentList,
|
|
326
330
|
addThreadMessage,
|
|
327
331
|
updateThreadMessage,
|
|
332
|
+
updateThreadStatus,
|
|
333
|
+
deleteThreadMessage,
|
|
328
334
|
]);
|
|
329
335
|
const sendThreadMessage = (0, react_1.useCallback)(async (message, options = {}) => {
|
|
330
336
|
const { threadId, streamResponse } = options;
|
|
@@ -354,7 +360,7 @@ const TamboThreadProvider = ({ children, }) => {
|
|
|
354
360
|
const advanceStreamResponse = await (0, typescript_sdk_1.advanceStream)(client, params, currentThreadId === exports.PLACEHOLDER_THREAD.id
|
|
355
361
|
? undefined
|
|
356
362
|
: currentThreadId);
|
|
357
|
-
return handleAdvanceStream(advanceStreamResponse, params);
|
|
363
|
+
return await handleAdvanceStream(advanceStreamResponse, params);
|
|
358
364
|
}
|
|
359
365
|
let advanceResponse = await (currentThreadId === exports.PLACEHOLDER_THREAD.id
|
|
360
366
|
? client.beta.threads.advance(params)
|
|
@@ -392,6 +398,7 @@ const TamboThreadProvider = ({ children, }) => {
|
|
|
392
398
|
switchCurrentThread,
|
|
393
399
|
addThreadMessage,
|
|
394
400
|
client,
|
|
401
|
+
updateThreadStatus,
|
|
395
402
|
handleAdvanceStream,
|
|
396
403
|
]);
|
|
397
404
|
return (react_1.default.createElement(exports.TamboThreadContext.Provider, { value: {
|
|
@@ -403,6 +410,11 @@ const TamboThreadProvider = ({ children, }) => {
|
|
|
403
410
|
inputValue,
|
|
404
411
|
setInputValue,
|
|
405
412
|
sendThreadMessage,
|
|
413
|
+
generationStage: (currentThread?.generationStage ??
|
|
414
|
+
generate_component_response_1.GenerationStage.IDLE),
|
|
415
|
+
generationStatusMessage: currentThread?.statusMessage ?? "",
|
|
416
|
+
isIdle: (0, generate_component_response_1.isIdleStage)((currentThread?.generationStage ??
|
|
417
|
+
generate_component_response_1.GenerationStage.IDLE)),
|
|
406
418
|
} }, children));
|
|
407
419
|
};
|
|
408
420
|
exports.TamboThreadProvider = TamboThreadProvider;
|
|
@@ -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 React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n GenerationStage,\n TamboThreadMessage,\n} from \"../model/generate-component-response\";\nimport { TamboThread } from \"../model/tambo-thread\";\nimport { renderComponentIntoMessage } from \"../util/generate-component\";\nimport { getAvailableComponents, getClientContext } from \"../util/registry\";\nimport { handleToolCall } from \"../util/tool-caller\";\nimport { useTamboClient } from \"./tambo-client-provider\";\nimport { useTamboRegistry } from \"./tambo-registry-provider\";\n\nexport interface TamboThreadContextProps {\n thread: TamboThread;\n switchCurrentThread: (threadId: string) => void;\n addThreadMessage: (\n message: TamboThreadMessage,\n sendToServer: boolean,\n ) => Promise<TamboAI.Beta.Threads.ThreadMessage[]>;\n updateThreadMessage: (\n id: string,\n message: TamboThreadMessage,\n sendToServer: boolean,\n ) => Promise<void>;\n setLastThreadStatus: (status: GenerationStage) => void;\n inputValue: string;\n setInputValue: (value: string) => void;\n sendThreadMessage: (\n message: string,\n options?: {\n threadId?: string;\n streamResponse?: boolean;\n contextKey?: string;\n },\n ) => Promise<TamboThreadMessage>;\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 switchCurrentThread: () => {\n throw new Error(\"switchCurrentThread not implemented\");\n },\n addThreadMessage: () => {\n throw new Error(\"updateThreadMessageHistory not implemented\");\n },\n setLastThreadStatus: () => {\n throw new Error(\"setLastThreadStatus not implemented\");\n },\n inputValue: \"\",\n setInputValue: () => {\n throw new Error(\"setInputValue not implemented\");\n },\n updateThreadMessage: () => {\n throw new Error(\"updateThreadMessage not implemented\");\n },\n sendThreadMessage: () => {\n throw new Error(\"advance not implemented\");\n },\n});\n\nexport const TamboThreadProvider: React.FC<PropsWithChildren> = ({\n children,\n}) => {\n const [threadMap, setThreadMap] = useState<Record<string, TamboThread>>({\n [PLACEHOLDER_THREAD.id]: PLACEHOLDER_THREAD,\n });\n const client = useTamboClient();\n const { componentList, toolRegistry, componentToolAssociations } =\n useTamboRegistry();\n const [inputValue, setInputValue] = useState(\"\");\n\n const [currentThreadId, setCurrentThreadId] = useState<string>(\n PLACEHOLDER_THREAD.id,\n );\n const [unresolvedThreadId, setUnresolvedThreadId] = useState<\n string | undefined\n >(PLACEHOLDER_THREAD.id);\n const currentThread: TamboThread | undefined = threadMap[currentThreadId];\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 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 ...prevMap,\n [threadId]: threadWithRenderedComponents,\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 const chatMessage: TamboThreadMessage & {\n additionalContext?: string;\n } = {\n ...message,\n additionalContext:\n message.role === \"user\" ? getClientContext() : undefined,\n createdAt,\n };\n const threadId = message.threadId;\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 return {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n messages: [...prevMessages, chatMessage],\n },\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(currentThreadId, {\n content: message.content,\n role: message.role,\n // additionalContext: chatMessage.additionalContext,\n });\n }\n const updatedMessageHistory = [...currentThread.messages, chatMessage];\n\n return updatedMessageHistory;\n },\n [client.beta.threads.messages, currentThread, currentThreadId],\n );\n\n const updateThreadMessage = useCallback(\n async (\n id: string,\n message: TamboThreadMessage,\n sendToServer = true,\n createdAt: string = new Date().toISOString(),\n ) => {\n const chatMessage: TamboThreadMessage = {\n ...message,\n createdAt,\n };\n\n setThreadMap((prevMap) => {\n if (!message.threadId) {\n return prevMap;\n }\n const prevMessages = prevMap[message.threadId]?.messages || [];\n const updatedMessages = prevMessages.map((msg) => {\n if (msg.id === id) {\n return chatMessage;\n }\n return msg;\n });\n return {\n ...prevMap,\n [message.threadId]: {\n ...prevMap[message.threadId],\n messages: updatedMessages,\n },\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(currentThreadId, {\n content: message.content,\n role: message.role,\n // additionalContext: chatMessage.additionalContext,\n });\n }\n },\n [client.beta.threads.messages, currentThreadId],\n );\n\n useEffect(() => {\n if (unresolvedThreadId && currentThreadId !== unresolvedThreadId) {\n setThreadMap((prevMap) => {\n const unresolvedThread = prevMap[unresolvedThreadId];\n const currentThread = prevMap[currentThreadId];\n return {\n ...prevMap,\n [unresolvedThreadId]: PLACEHOLDER_THREAD,\n [currentThreadId]: {\n ...currentThread,\n id: currentThreadId,\n messages: [...unresolvedThread.messages, ...currentThread.messages],\n },\n };\n });\n setUnresolvedThreadId(undefined);\n }\n }, [currentThreadId, unresolvedThreadId]);\n\n const switchCurrentThread = useCallback(\n async (threadId: string) => {\n if (threadId === PLACEHOLDER_THREAD.id) {\n console.warn(\"Switching to placeholder thread, may be a bug\");\n return;\n }\n setCurrentThreadId(threadId);\n if (!threadMap[threadId]) {\n setThreadMap((prevMap) => ({\n ...prevMap,\n [threadId]: {\n ...PLACEHOLDER_THREAD,\n id: threadId,\n },\n }));\n }\n await fetchThread(threadId);\n },\n [fetchThread, threadMap],\n );\n\n const setLastThreadStatus = (status: GenerationStage) => {\n setThreadMap((prevMap) => {\n if (!currentThreadId) {\n return prevMap;\n }\n const headMessages = prevMap[currentThreadId].messages.slice(0, -1);\n const lastMessage =\n prevMap[currentThreadId].messages[\n prevMap[currentThreadId].messages.length - 1\n ];\n const updatedLastMessage = {\n ...lastMessage,\n status,\n };\n return {\n ...prevMap,\n [currentThreadId]: {\n ...prevMap[currentThreadId],\n messages: [...headMessages, updatedLastMessage],\n },\n };\n });\n };\n\n const updateThreadStatus = useCallback(\n (stage: GenerationStage) => {\n setThreadMap((prevMap) => {\n return {\n ...prevMap,\n [currentThreadId]: {\n ...prevMap[currentThreadId],\n generationStage: stage,\n },\n };\n });\n },\n [currentThreadId],\n );\n\n const handleAdvanceStream = useCallback(\n async (\n stream: AsyncIterable<TamboAI.Beta.Threads.ThreadAdvanceResponse>,\n params: TamboAI.Beta.Threads.ThreadAdvanceParams,\n ): Promise<TamboThreadMessage> => {\n let finalMessage: TamboThreadMessage | undefined;\n let hasSetThreadId = false;\n updateThreadStatus(GenerationStage.STREAMING_RESPONSE);\n for await (const chunk of stream) {\n if (chunk.responseMessageDto.toolCallRequest) {\n updateThreadStatus(GenerationStage.FETCHING_CONTEXT);\n const toolCallResponse = await handleToolCall(\n chunk.responseMessageDto,\n toolRegistry,\n );\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n content: [{ type: \"text\", text: \"tool response\" }],\n role: \"tool\",\n actionType: \"tool_response\",\n toolResponse: toolCallResponse,\n component: chunk.responseMessageDto.component,\n },\n };\n updateThreadStatus(GenerationStage.STREAMING_RESPONSE);\n const toolCallResponseStream = await advanceStream(\n client,\n toolCallResponseParams,\n chunk.responseMessageDto.threadId,\n );\n return handleAdvanceStream(\n toolCallResponseStream,\n toolCallResponseParams,\n );\n } else {\n if (\n !hasSetThreadId &&\n chunk.responseMessageDto.threadId &&\n chunk.responseMessageDto.threadId !== currentThread?.id\n ) {\n hasSetThreadId = true;\n switchCurrentThread(chunk.responseMessageDto.threadId);\n }\n\n if (!finalMessage) {\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n addThreadMessage(finalMessage, false);\n } else {\n const previousId = finalMessage.id;\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n updateThreadMessage(previousId, finalMessage, false);\n }\n }\n }\n\n updateThreadStatus(GenerationStage.COMPLETE);\n return (\n finalMessage ?? {\n threadId: \"\",\n content: [{ type: \"text\", text: `Error processing stream` }],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n }\n );\n },\n [\n toolRegistry,\n client,\n currentThread?.id,\n switchCurrentThread,\n componentList,\n addThreadMessage,\n updateThreadMessage,\n ],\n );\n\n const sendThreadMessage = useCallback(\n async (\n message: string,\n options: {\n threadId?: string;\n streamResponse?: boolean;\n contextKey?: string;\n } = {},\n ): Promise<TamboThreadMessage> => {\n const { threadId, streamResponse } = options;\n const currentThreadId = threadId ?? currentThread?.id;\n\n if (currentThreadId !== PLACEHOLDER_THREAD.id) {\n await switchCurrentThread(currentThreadId);\n }\n\n updateThreadStatus(GenerationStage.CHOOSING_COMPONENT);\n\n addThreadMessage(\n {\n content: [{ type: \"text\", text: message }],\n renderedComponent: null,\n role: \"user\",\n threadId: currentThread.id,\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n },\n false,\n );\n\n const availableComponents = getAvailableComponents(\n componentList,\n toolRegistry,\n componentToolAssociations,\n );\n const params: TamboAI.Beta.Threads.ThreadAdvanceParams = {\n messageToAppend: {\n content: [{ type: \"text\", text: message }],\n role: \"user\",\n },\n contextKey: options.contextKey,\n availableComponents: availableComponents,\n };\n\n if (streamResponse) {\n const advanceStreamResponse = await advanceStream(\n client,\n params,\n currentThreadId === PLACEHOLDER_THREAD.id\n ? undefined\n : currentThreadId,\n );\n return handleAdvanceStream(advanceStreamResponse, params);\n }\n let advanceResponse = await (currentThreadId === PLACEHOLDER_THREAD.id\n ? client.beta.threads.advance(params)\n : client.beta.threads.advanceById(currentThreadId, params));\n\n //handle tool calls\n while (advanceResponse.responseMessageDto.toolCallRequest) {\n updateThreadStatus(GenerationStage.FETCHING_CONTEXT);\n const toolCallResponse = await handleToolCall(\n advanceResponse.responseMessageDto,\n toolRegistry,\n );\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n ...params.messageToAppend,\n content: [{ type: \"text\", text: \"tool response\" }],\n role: \"tool\",\n actionType: \"tool_response\",\n toolResponse: toolCallResponse,\n component: advanceResponse.responseMessageDto.component,\n },\n };\n updateThreadStatus(GenerationStage.HYDRATING_COMPONENT);\n advanceResponse = await client.beta.threads.advanceById(\n advanceResponse.responseMessageDto.threadId,\n toolCallResponseParams,\n );\n }\n\n const finalMessage = advanceResponse.responseMessageDto.component\n ?.componentName\n ? renderComponentIntoMessage(\n advanceResponse.responseMessageDto,\n componentList,\n )\n : advanceResponse.responseMessageDto;\n await switchCurrentThread(advanceResponse.responseMessageDto.threadId);\n updateThreadStatus(GenerationStage.COMPLETE);\n return finalMessage;\n },\n [\n componentList,\n toolRegistry,\n componentToolAssociations,\n currentThread,\n switchCurrentThread,\n addThreadMessage,\n client,\n handleAdvanceStream,\n ],\n );\n\n return (\n <TamboThreadContext.Provider\n value={{\n thread: currentThread,\n switchCurrentThread,\n addThreadMessage,\n updateThreadMessage,\n setLastThreadStatus,\n inputValue,\n setInputValue,\n sendThreadMessage,\n }}\n >\n {children}\n </TamboThreadContext.Provider>\n );\n};\n\nexport const useTamboThread = () => {\n const context = useContext(TamboThreadContext);\n if (context === undefined) {\n throw new Error(\"useTamboThread must be used within a TamboThreadProvider\");\n }\n return context;\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 React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\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 { getAvailableComponents, getClientContext } from \"../util/registry\";\nimport { handleToolCall } from \"../util/tool-caller\";\nimport { useTamboClient } from \"./tambo-client-provider\";\nimport { useTamboRegistry } from \"./tambo-registry-provider\";\n\nexport interface TamboThreadContextProps {\n thread: TamboThread;\n switchCurrentThread: (threadId: string) => void;\n addThreadMessage: (\n message: TamboThreadMessage,\n sendToServer: boolean,\n ) => Promise<TamboAI.Beta.Threads.ThreadMessage[]>;\n updateThreadMessage: (\n id: string,\n message: TamboThreadMessage,\n sendToServer: boolean,\n ) => Promise<void>;\n setLastThreadStatus: (status: GenerationStage) => void;\n inputValue: string;\n setInputValue: (value: string) => void;\n sendThreadMessage: (\n message: string,\n options?: {\n threadId?: string;\n streamResponse?: boolean;\n contextKey?: string;\n },\n ) => Promise<TamboThreadMessage>;\n generationStage: GenerationStage;\n generationStatusMessage: string;\n isIdle: boolean;\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 switchCurrentThread: () => {\n throw new Error(\"switchCurrentThread not implemented\");\n },\n addThreadMessage: () => {\n throw new Error(\"updateThreadMessageHistory not implemented\");\n },\n setLastThreadStatus: () => {\n throw new Error(\"setLastThreadStatus not implemented\");\n },\n inputValue: \"\",\n setInputValue: () => {\n throw new Error(\"setInputValue not implemented\");\n },\n updateThreadMessage: () => {\n throw new Error(\"updateThreadMessage not implemented\");\n },\n sendThreadMessage: () => {\n throw new Error(\"advance not implemented\");\n },\n generationStage: GenerationStage.IDLE,\n generationStatusMessage: \"\",\n isIdle: true,\n});\n\nexport const TamboThreadProvider: React.FC<PropsWithChildren> = ({\n children,\n}) => {\n const [threadMap, setThreadMap] = useState<Record<string, TamboThread>>({\n [PLACEHOLDER_THREAD.id]: PLACEHOLDER_THREAD,\n });\n const client = useTamboClient();\n const { componentList, toolRegistry, componentToolAssociations } =\n useTamboRegistry();\n const [inputValue, setInputValue] = useState(\"\");\n\n const [currentThreadId, setCurrentThreadId] = useState<string>(\n PLACEHOLDER_THREAD.id,\n );\n const currentThread: TamboThread | undefined = threadMap[currentThreadId];\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 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 ...prevMap,\n [threadId]: threadWithRenderedComponents,\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 const chatMessage: TamboThreadMessage & {\n additionalContext?: string;\n } = {\n ...message,\n additionalContext:\n message.role === \"user\" ? getClientContext() : undefined,\n createdAt,\n };\n const threadId = message.threadId;\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 return {\n ...prevMap,\n [threadId]: {\n ...prevMap[threadId],\n messages: [...prevMessages, chatMessage],\n },\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(currentThreadId, {\n content: message.content,\n role: message.role,\n // additionalContext: chatMessage.additionalContext,\n });\n }\n const updatedMessageHistory = [...currentThread.messages, chatMessage];\n\n return updatedMessageHistory;\n },\n [client.beta.threads.messages, currentThread, currentThreadId],\n );\n\n const updateThreadMessage = useCallback(\n async (\n id: string,\n message: TamboThreadMessage,\n sendToServer = true,\n createdAt: string = new Date().toISOString(),\n ) => {\n const chatMessage: TamboThreadMessage = {\n ...message,\n createdAt,\n };\n\n setThreadMap((prevMap) => {\n if (!message.threadId) {\n return prevMap;\n }\n const prevMessages = prevMap[message.threadId]?.messages || [];\n const updatedMessages = prevMessages.map((msg) => {\n if (msg.id === id) {\n return chatMessage;\n }\n return msg;\n });\n return {\n ...prevMap,\n [message.threadId]: {\n ...prevMap[message.threadId],\n messages: updatedMessages,\n },\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(currentThreadId, {\n content: message.content,\n role: message.role,\n // additionalContext: chatMessage.additionalContext,\n });\n }\n },\n [client.beta.threads.messages, currentThreadId],\n );\n\n const deleteThreadMessage = useCallback(\n (messageId: string) => {\n if (!currentThread) return;\n\n setThreadMap((prevMap) => ({\n ...prevMap,\n [currentThread.id]: {\n ...prevMap[currentThread.id],\n messages: prevMap[currentThread.id].messages.filter(\n (msg) => msg.id !== messageId,\n ),\n },\n }));\n },\n [currentThread],\n );\n\n const switchCurrentThread = useCallback(\n async (threadId: string) => {\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 if (!threadMap[threadId]) {\n setThreadMap((prevMap) => {\n return {\n ...prevMap,\n [threadId]: {\n ...prevMap[PLACEHOLDER_THREAD.id],\n id: threadId,\n },\n };\n });\n }\n await fetchThread(threadId);\n },\n [fetchThread, threadMap],\n );\n\n const setLastThreadStatus = (status: GenerationStage) => {\n setThreadMap((prevMap) => {\n if (!currentThreadId) {\n return prevMap;\n }\n const headMessages = prevMap[currentThreadId].messages.slice(0, -1);\n const lastMessage =\n prevMap[currentThreadId].messages[\n prevMap[currentThreadId].messages.length - 1\n ];\n const updatedLastMessage = {\n ...lastMessage,\n status,\n };\n return {\n ...prevMap,\n [currentThreadId]: {\n ...prevMap[currentThreadId],\n messages: [...headMessages, updatedLastMessage],\n },\n };\n });\n };\n\n const updateThreadStatus = useCallback(\n (stage: GenerationStage, statusMessage?: string) => {\n setThreadMap((prevMap) => {\n return {\n ...prevMap,\n [currentThreadId]: {\n ...prevMap[currentThreadId],\n generationStage: stage,\n statusMessage: statusMessage,\n },\n };\n });\n },\n [currentThreadId],\n );\n\n const handleAdvanceStream = useCallback(\n async (\n stream: AsyncIterable<TamboAI.Beta.Threads.ThreadAdvanceResponse>,\n params: TamboAI.Beta.Threads.ThreadAdvanceParams,\n messageIdToRemove?: string,\n ): Promise<TamboThreadMessage> => {\n let finalMessage: TamboThreadMessage | undefined;\n let hasSetThreadId = false;\n let isFirstChunk = true;\n updateThreadStatus(GenerationStage.STREAMING_RESPONSE);\n\n for await (const chunk of stream) {\n if (isFirstChunk && messageIdToRemove) {\n deleteThreadMessage(messageIdToRemove);\n }\n isFirstChunk = false;\n\n if (chunk.responseMessageDto.toolCallRequest) {\n updateThreadStatus(GenerationStage.FETCHING_CONTEXT);\n const toolCallResponse = await handleToolCall(\n chunk.responseMessageDto,\n toolRegistry,\n );\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n content: [{ type: \"text\", text: \"tool response\" }],\n role: \"tool\",\n actionType: \"tool_response\",\n toolResponse: toolCallResponse,\n component: chunk.responseMessageDto.component,\n },\n };\n updateThreadStatus(GenerationStage.STREAMING_RESPONSE);\n const toolCallResponseStream = await advanceStream(\n client,\n toolCallResponseParams,\n chunk.responseMessageDto.threadId,\n );\n\n // Pass the current message's ID to be removed when the new stream starts, since we now know it is a tool call request message\n return await handleAdvanceStream(\n toolCallResponseStream,\n toolCallResponseParams,\n finalMessage?.id,\n );\n } else {\n if (\n !hasSetThreadId &&\n chunk.responseMessageDto.threadId &&\n chunk.responseMessageDto.threadId !== currentThread?.id\n ) {\n hasSetThreadId = true;\n switchCurrentThread(chunk.responseMessageDto.threadId);\n }\n\n if (!finalMessage) {\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n addThreadMessage(finalMessage, false);\n } else {\n const previousId = finalMessage.id;\n finalMessage = chunk.responseMessageDto.component?.componentName\n ? renderComponentIntoMessage(\n chunk.responseMessageDto,\n componentList,\n )\n : chunk.responseMessageDto;\n updateThreadMessage(previousId, finalMessage, false);\n }\n }\n }\n\n updateThreadStatus(GenerationStage.COMPLETE);\n return (\n finalMessage ?? {\n threadId: \"\",\n content: [{ type: \"text\", text: `Error processing stream` }],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n }\n );\n },\n [\n toolRegistry,\n client,\n currentThread?.id,\n switchCurrentThread,\n componentList,\n addThreadMessage,\n updateThreadMessage,\n updateThreadStatus,\n deleteThreadMessage,\n ],\n );\n\n const sendThreadMessage = useCallback(\n async (\n message: string,\n options: {\n threadId?: string;\n streamResponse?: boolean;\n contextKey?: string;\n } = {},\n ): Promise<TamboThreadMessage> => {\n const { threadId, streamResponse } = options;\n const currentThreadId = threadId ?? currentThread?.id;\n\n if (currentThreadId !== PLACEHOLDER_THREAD.id) {\n await switchCurrentThread(currentThreadId);\n }\n\n updateThreadStatus(GenerationStage.CHOOSING_COMPONENT);\n\n addThreadMessage(\n {\n content: [{ type: \"text\", text: message }],\n renderedComponent: null,\n role: \"user\",\n threadId: currentThread.id,\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n },\n false,\n );\n\n const availableComponents = getAvailableComponents(\n componentList,\n toolRegistry,\n componentToolAssociations,\n );\n const params: TamboAI.Beta.Threads.ThreadAdvanceParams = {\n messageToAppend: {\n content: [{ type: \"text\", text: message }],\n role: \"user\",\n },\n contextKey: options.contextKey,\n availableComponents: availableComponents,\n };\n\n if (streamResponse) {\n const advanceStreamResponse = await advanceStream(\n client,\n params,\n currentThreadId === PLACEHOLDER_THREAD.id\n ? undefined\n : currentThreadId,\n );\n return await handleAdvanceStream(advanceStreamResponse, params);\n }\n let advanceResponse = await (currentThreadId === PLACEHOLDER_THREAD.id\n ? client.beta.threads.advance(params)\n : client.beta.threads.advanceById(currentThreadId, params));\n\n //handle tool calls\n while (advanceResponse.responseMessageDto.toolCallRequest) {\n updateThreadStatus(GenerationStage.FETCHING_CONTEXT);\n const toolCallResponse = await handleToolCall(\n advanceResponse.responseMessageDto,\n toolRegistry,\n );\n const toolCallResponseParams: TamboAI.Beta.Threads.ThreadAdvanceParams =\n {\n ...params,\n messageToAppend: {\n ...params.messageToAppend,\n content: [{ type: \"text\", text: \"tool response\" }],\n role: \"tool\",\n actionType: \"tool_response\",\n toolResponse: toolCallResponse,\n component: advanceResponse.responseMessageDto.component,\n },\n };\n updateThreadStatus(GenerationStage.HYDRATING_COMPONENT);\n advanceResponse = await client.beta.threads.advanceById(\n advanceResponse.responseMessageDto.threadId,\n toolCallResponseParams,\n );\n }\n\n const finalMessage = advanceResponse.responseMessageDto.component\n ?.componentName\n ? renderComponentIntoMessage(\n advanceResponse.responseMessageDto,\n componentList,\n )\n : advanceResponse.responseMessageDto;\n await switchCurrentThread(advanceResponse.responseMessageDto.threadId);\n updateThreadStatus(GenerationStage.COMPLETE);\n return finalMessage;\n },\n [\n componentList,\n toolRegistry,\n componentToolAssociations,\n currentThread,\n switchCurrentThread,\n addThreadMessage,\n client,\n updateThreadStatus,\n handleAdvanceStream,\n ],\n );\n\n return (\n <TamboThreadContext.Provider\n value={{\n thread: currentThread,\n switchCurrentThread,\n addThreadMessage,\n updateThreadMessage,\n setLastThreadStatus,\n inputValue,\n setInputValue,\n sendThreadMessage,\n generationStage: (currentThread?.generationStage ??\n GenerationStage.IDLE) as GenerationStage,\n generationStatusMessage: currentThread?.statusMessage ?? \"\",\n isIdle: isIdleStage(\n (currentThread?.generationStage ??\n GenerationStage.IDLE) as GenerationStage,\n ),\n }}\n >\n {children}\n </TamboThreadContext.Provider>\n );\n};\n\nexport const useTamboThread = () => {\n const context = useContext(TamboThreadContext);\n if (context === undefined) {\n throw new Error(\"useTamboThread must be used within a TamboThreadProvider\");\n }\n return context;\n};\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import TamboAI from "@tambo-ai/typescript-sdk";
|
|
2
|
-
import { ComponentRegistry
|
|
3
|
-
import {
|
|
4
|
-
export declare function generateAndHydrate(client: TamboAI, componentList: ComponentRegistry, toolRegistry: TamboToolRegistry, toolAssociations: TamboToolAssociations, currentThreadId: string | undefined, content: TamboAI.Beta.Threads.ChatCompletionContentPart[], params: TamboAI.Beta.Components.ComponentGenerateParams, onUpdateState: (state: GenerationStage) => void, stream?: boolean, options?: TamboAI.RequestOptions): Promise<TamboThreadMessage | AsyncIterable<TamboThreadMessage>>;
|
|
2
|
+
import { ComponentRegistry } from "../model/component-metadata";
|
|
3
|
+
import { TamboThreadMessage } from "../model/generate-component-response";
|
|
5
4
|
/**
|
|
6
5
|
* Generate a message that has a component rendered into it, if the message came with one
|
|
7
6
|
*/
|
|
8
7
|
export declare function renderComponentIntoMessage(message: TamboAI.Beta.Threads.ThreadMessage, componentList: ComponentRegistry): TamboThreadMessage;
|
|
8
|
+
//# sourceMappingURL=generate-component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-component.d.ts","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAK/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAG1E;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAC3C,aAAa,EAAE,iBAAiB,GAC/B,kBAAkB,CAiCpB"}
|
|
@@ -3,158 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.generateAndHydrate = generateAndHydrate;
|
|
7
6
|
exports.renderComponentIntoMessage = renderComponentIntoMessage;
|
|
8
|
-
const typescript_sdk_1 = require("@tambo-ai/typescript-sdk");
|
|
9
7
|
const partial_json_1 = require("partial-json");
|
|
10
8
|
const react_1 = __importDefault(require("react"));
|
|
11
9
|
const zod_1 = require("zod");
|
|
12
10
|
const use_current_message_1 = require("../hooks/use-current-message");
|
|
13
|
-
const generate_component_response_1 = require("../model/generate-component-response");
|
|
14
11
|
const registry_1 = require("../util/registry");
|
|
15
|
-
const tool_caller_1 = require("../util/tool-caller");
|
|
16
|
-
async function generateAndHydrate(client, componentList, toolRegistry, toolAssociations, currentThreadId, content, params, onUpdateState, stream = false, options) {
|
|
17
|
-
const availableComponents = (0, registry_1.getAvailableComponents)(componentList, toolRegistry, toolAssociations);
|
|
18
|
-
let threadId = currentThreadId;
|
|
19
|
-
onUpdateState(generate_component_response_1.GenerationStage.CHOOSING_COMPONENT);
|
|
20
|
-
try {
|
|
21
|
-
if (stream) {
|
|
22
|
-
const streamResponse = await (0, typescript_sdk_1.generateStream)(client, {
|
|
23
|
-
availableComponents,
|
|
24
|
-
contextKey: params.contextKey,
|
|
25
|
-
content,
|
|
26
|
-
threadId: params.threadId === "placeholder" ? undefined : params.threadId,
|
|
27
|
-
}, options);
|
|
28
|
-
return processComponentDecisionStream(handleStream(streamResponse), componentList, toolRegistry, onUpdateState, client, options);
|
|
29
|
-
}
|
|
30
|
-
const response = await client.beta.components.generate({
|
|
31
|
-
availableComponents,
|
|
32
|
-
contextKey: params.contextKey,
|
|
33
|
-
content,
|
|
34
|
-
threadId: params.threadId === "placeholder" ? undefined : params.threadId,
|
|
35
|
-
}, options);
|
|
36
|
-
// Capture the current threadId in case the following processComponentDecision fails
|
|
37
|
-
threadId = response.message.threadId;
|
|
38
|
-
return await processComponentDecision(client, componentList, toolRegistry, response.message.threadId, content, response.message, onUpdateState, options);
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
console.error(error);
|
|
42
|
-
onUpdateState(generate_component_response_1.GenerationStage.ERROR);
|
|
43
|
-
// manually create a message with the error
|
|
44
|
-
const errorMessage = `Error generating component: ${error}`;
|
|
45
|
-
try {
|
|
46
|
-
const errorMessageResponse = await client.beta.threads.messages.create(threadId ?? currentThreadId ?? "", {
|
|
47
|
-
content: [{ type: "text", text: errorMessage }],
|
|
48
|
-
role: "hydra",
|
|
49
|
-
});
|
|
50
|
-
return errorMessageResponse;
|
|
51
|
-
}
|
|
52
|
-
catch (errorError) {
|
|
53
|
-
// Log to the console, there's nothing more we can do!
|
|
54
|
-
console.error(`Error creating error message: ${errorError}`);
|
|
55
|
-
console.error("Original error:", error);
|
|
56
|
-
}
|
|
57
|
-
return {
|
|
58
|
-
renderedComponent: null,
|
|
59
|
-
content: [{ type: "text", text: errorMessage }],
|
|
60
|
-
role: "hydra",
|
|
61
|
-
createdAt: new Date().toISOString(),
|
|
62
|
-
id: crypto.randomUUID(),
|
|
63
|
-
threadId: currentThreadId ?? "",
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
async function processComponentDecision(client, componentList, toolRegistry, currentThreadId, content, message, onUpdateState, options) {
|
|
68
|
-
if (!message.component?.componentName) {
|
|
69
|
-
const componentResponse = {
|
|
70
|
-
...message,
|
|
71
|
-
renderedComponent: null,
|
|
72
|
-
};
|
|
73
|
-
// no component to hydrate, just return the message
|
|
74
|
-
onUpdateState(generate_component_response_1.GenerationStage.COMPLETE);
|
|
75
|
-
return componentResponse;
|
|
76
|
-
}
|
|
77
|
-
if (message.toolCallRequest) {
|
|
78
|
-
onUpdateState(generate_component_response_1.GenerationStage.FETCHING_CONTEXT);
|
|
79
|
-
const toolResult = await (0, tool_caller_1.handleToolCall)(message, toolRegistry);
|
|
80
|
-
onUpdateState(generate_component_response_1.GenerationStage.HYDRATING_COMPONENT);
|
|
81
|
-
try {
|
|
82
|
-
const hydrationResponse = await client.beta.components.hydrate({
|
|
83
|
-
component: (0, registry_1.getComponentFromRegistry)(message.component.componentName, componentList),
|
|
84
|
-
threadId: message.threadId,
|
|
85
|
-
toolResponse: toolResult,
|
|
86
|
-
}, options);
|
|
87
|
-
return await processComponentDecision(client, componentList, toolRegistry, currentThreadId, content, hydrationResponse.message, onUpdateState, options);
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
console.error(error);
|
|
91
|
-
onUpdateState(generate_component_response_1.GenerationStage.ERROR);
|
|
92
|
-
return {
|
|
93
|
-
threadId: message.threadId,
|
|
94
|
-
renderedComponent: null,
|
|
95
|
-
content: [
|
|
96
|
-
{ type: "text", text: `Error hydrating component: ${error}` },
|
|
97
|
-
],
|
|
98
|
-
role: "hydra",
|
|
99
|
-
createdAt: new Date().toISOString(),
|
|
100
|
-
id: crypto.randomUUID(),
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
const renderedComponent = react_1.default.createElement((0, registry_1.getComponentFromRegistry)(message.component.componentName, componentList)
|
|
105
|
-
.component, message.component.props);
|
|
106
|
-
const componentResponse = {
|
|
107
|
-
...message,
|
|
108
|
-
renderedComponent: (0, use_current_message_1.wrapWithTamboMessageProvider)(renderedComponent, message.threadId, message.id),
|
|
109
|
-
};
|
|
110
|
-
onUpdateState(generate_component_response_1.GenerationStage.COMPLETE);
|
|
111
|
-
return componentResponse;
|
|
112
|
-
}
|
|
113
|
-
async function* processComponentDecisionStream(stream, componentList, toolRegistry, onUpdateState, client, options) {
|
|
114
|
-
let accumulatedComponentResponse = null;
|
|
115
|
-
for await (const chunk of stream) {
|
|
116
|
-
if (!chunk.component?.componentName) {
|
|
117
|
-
onUpdateState(generate_component_response_1.GenerationStage.STREAMING_RESPONSE);
|
|
118
|
-
accumulatedComponentResponse = {
|
|
119
|
-
...chunk,
|
|
120
|
-
renderedComponent: null,
|
|
121
|
-
};
|
|
122
|
-
yield accumulatedComponentResponse;
|
|
123
|
-
}
|
|
124
|
-
if (chunk.toolCallRequest) {
|
|
125
|
-
if (!chunk.component?.componentName) {
|
|
126
|
-
continue;
|
|
127
|
-
}
|
|
128
|
-
onUpdateState(generate_component_response_1.GenerationStage.FETCHING_CONTEXT);
|
|
129
|
-
const toolResult = await (0, tool_caller_1.handleToolCall)(chunk, toolRegistry);
|
|
130
|
-
onUpdateState(generate_component_response_1.GenerationStage.HYDRATING_COMPONENT);
|
|
131
|
-
const streamResponse = await (0, typescript_sdk_1.hydrateStream)(client, {
|
|
132
|
-
component: (0, registry_1.getComponentFromRegistry)(chunk.component?.componentName ?? "", componentList),
|
|
133
|
-
threadId: chunk.threadId,
|
|
134
|
-
toolResponse: toolResult,
|
|
135
|
-
}, options);
|
|
136
|
-
yield* processComponentDecisionStream(handleStream(streamResponse), componentList, toolRegistry, onUpdateState, client, options);
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
if (chunk.component?.componentName) {
|
|
140
|
-
try {
|
|
141
|
-
onUpdateState(generate_component_response_1.GenerationStage.STREAMING_RESPONSE);
|
|
142
|
-
// Try to parse and validate accumulated component choice props:
|
|
143
|
-
const messageWithComponent = renderComponentIntoMessage(chunk, componentList);
|
|
144
|
-
// TODO: do we have to do this now
|
|
145
|
-
accumulatedComponentResponse = {
|
|
146
|
-
...accumulatedComponentResponse,
|
|
147
|
-
...messageWithComponent,
|
|
148
|
-
};
|
|
149
|
-
yield messageWithComponent;
|
|
150
|
-
}
|
|
151
|
-
catch (error) {
|
|
152
|
-
console.error(error);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
onUpdateState(generate_component_response_1.GenerationStage.COMPLETE);
|
|
157
|
-
}
|
|
158
12
|
/**
|
|
159
13
|
* Generate a message that has a component rendered into it, if the message came with one
|
|
160
14
|
*/
|
|
@@ -178,32 +32,4 @@ function renderComponentIntoMessage(message, componentList) {
|
|
|
178
32
|
renderedComponent: wrappedComponent,
|
|
179
33
|
};
|
|
180
34
|
}
|
|
181
|
-
async function* handleStream(stream) {
|
|
182
|
-
let threadMessage = {
|
|
183
|
-
threadId: "",
|
|
184
|
-
content: [],
|
|
185
|
-
role: "hydra",
|
|
186
|
-
createdAt: new Date().toISOString(),
|
|
187
|
-
id: crypto.randomUUID(),
|
|
188
|
-
};
|
|
189
|
-
try {
|
|
190
|
-
for await (const chunk of stream) {
|
|
191
|
-
threadMessage = {
|
|
192
|
-
...threadMessage,
|
|
193
|
-
...chunk,
|
|
194
|
-
};
|
|
195
|
-
yield threadMessage;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
catch (error) {
|
|
199
|
-
console.error("Error processing stream:", error);
|
|
200
|
-
yield {
|
|
201
|
-
threadId: "",
|
|
202
|
-
content: [{ type: "text", text: `Error processing stream: ${error}` }],
|
|
203
|
-
role: "hydra",
|
|
204
|
-
createdAt: new Date().toISOString(),
|
|
205
|
-
id: crypto.randomUUID(),
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
35
|
//# sourceMappingURL=generate-component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-component.js","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":"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","sourcesContent":["import TamboAI, {\n generateStream,\n hydrateStream,\n} from \"@tambo-ai/typescript-sdk\";\nimport { parse } from \"partial-json\";\nimport React from \"react\";\nimport { z } from \"zod\";\nimport { wrapWithTamboMessageProvider } from \"../hooks/use-current-message\";\nimport {\n ComponentRegistry,\n TamboToolAssociations,\n TamboToolRegistry,\n} from \"../model/component-metadata\";\nimport {\n GenerationStage,\n TamboThreadMessage,\n} from \"../model/generate-component-response\";\nimport {\n getAvailableComponents,\n getComponentFromRegistry,\n} from \"../util/registry\";\nimport { handleToolCall } from \"../util/tool-caller\";\n\nexport async function generateAndHydrate(\n client: TamboAI,\n componentList: ComponentRegistry,\n toolRegistry: TamboToolRegistry,\n toolAssociations: TamboToolAssociations,\n currentThreadId: string | undefined,\n content: TamboAI.Beta.Threads.ChatCompletionContentPart[],\n params: TamboAI.Beta.Components.ComponentGenerateParams,\n onUpdateState: (state: GenerationStage) => void,\n stream = false,\n options?: TamboAI.RequestOptions,\n): Promise<TamboThreadMessage | AsyncIterable<TamboThreadMessage>> {\n const availableComponents = getAvailableComponents(\n componentList,\n toolRegistry,\n toolAssociations,\n );\n let threadId = currentThreadId;\n\n onUpdateState(GenerationStage.CHOOSING_COMPONENT);\n try {\n if (stream) {\n const streamResponse = await generateStream(\n client,\n {\n availableComponents,\n contextKey: params.contextKey,\n content,\n threadId:\n params.threadId === \"placeholder\" ? undefined : params.threadId,\n },\n options,\n );\n\n return processComponentDecisionStream(\n handleStream(\n streamResponse as AsyncIterable<TamboAI.ComponentGenerateResponse>,\n ),\n componentList,\n toolRegistry,\n onUpdateState,\n client,\n options,\n );\n }\n const response = await client.beta.components.generate(\n {\n availableComponents,\n contextKey: params.contextKey,\n content,\n threadId:\n params.threadId === \"placeholder\" ? undefined : params.threadId,\n },\n options,\n );\n // Capture the current threadId in case the following processComponentDecision fails\n threadId = response.message.threadId;\n return await processComponentDecision(\n client,\n componentList,\n toolRegistry,\n response.message.threadId,\n content,\n response.message,\n onUpdateState,\n options,\n );\n } catch (error) {\n console.error(error);\n onUpdateState(GenerationStage.ERROR);\n // manually create a message with the error\n const errorMessage = `Error generating component: ${error}`;\n try {\n const errorMessageResponse = await client.beta.threads.messages.create(\n threadId ?? currentThreadId ?? \"\",\n {\n content: [{ type: \"text\", text: errorMessage }],\n role: \"hydra\",\n },\n );\n return errorMessageResponse;\n } catch (errorError) {\n // Log to the console, there's nothing more we can do!\n console.error(`Error creating error message: ${errorError}`);\n console.error(\"Original error:\", error);\n }\n return {\n renderedComponent: null,\n content: [{ type: \"text\", text: errorMessage }],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n threadId: currentThreadId ?? \"\",\n };\n }\n}\n\nasync function processComponentDecision(\n client: TamboAI,\n componentList: ComponentRegistry,\n toolRegistry: TamboToolRegistry,\n currentThreadId: string,\n content: TamboAI.Beta.Components.ComponentGenerateParams[\"content\"],\n message: TamboAI.Beta.Threads.ThreadMessage,\n onUpdateState: (state: GenerationStage) => void,\n options?: TamboAI.RequestOptions,\n): Promise<TamboThreadMessage> {\n if (!message.component?.componentName) {\n const componentResponse: TamboThreadMessage = {\n ...message,\n renderedComponent: null,\n };\n // no component to hydrate, just return the message\n onUpdateState(GenerationStage.COMPLETE);\n return componentResponse;\n }\n\n if (message.toolCallRequest) {\n onUpdateState(GenerationStage.FETCHING_CONTEXT);\n const toolResult = await handleToolCall(message, toolRegistry);\n onUpdateState(GenerationStage.HYDRATING_COMPONENT);\n try {\n const hydrationResponse = await client.beta.components.hydrate(\n {\n component: getComponentFromRegistry(\n message.component.componentName,\n componentList,\n ),\n threadId: message.threadId,\n\n toolResponse: toolResult,\n },\n options,\n );\n return await processComponentDecision(\n client,\n componentList,\n toolRegistry,\n currentThreadId,\n content,\n hydrationResponse.message,\n onUpdateState,\n options,\n );\n } catch (error) {\n console.error(error);\n onUpdateState(GenerationStage.ERROR);\n return {\n threadId: message.threadId,\n renderedComponent: null,\n content: [\n { type: \"text\", text: `Error hydrating component: ${error}` },\n ],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n };\n }\n }\n\n const renderedComponent = React.createElement(\n getComponentFromRegistry(message.component.componentName, componentList)\n .component,\n message.component.props,\n );\n const componentResponse: TamboThreadMessage = {\n ...message,\n renderedComponent: wrapWithTamboMessageProvider(\n renderedComponent,\n message.threadId,\n message.id,\n ),\n };\n\n onUpdateState(GenerationStage.COMPLETE);\n return componentResponse;\n}\n\nasync function* processComponentDecisionStream(\n stream: AsyncIterable<TamboThreadMessage>,\n componentList: ComponentRegistry,\n toolRegistry: TamboToolRegistry,\n onUpdateState: (state: GenerationStage) => void,\n client: TamboAI,\n options?: TamboAI.RequestOptions,\n): AsyncGenerator<TamboThreadMessage> {\n let accumulatedComponentResponse: TamboThreadMessage | null = null;\n\n for await (const chunk of stream) {\n if (!chunk.component?.componentName) {\n onUpdateState(GenerationStage.STREAMING_RESPONSE);\n accumulatedComponentResponse = {\n ...chunk,\n renderedComponent: null,\n };\n yield accumulatedComponentResponse;\n }\n\n if (chunk.toolCallRequest) {\n if (!chunk.component?.componentName) {\n continue;\n }\n onUpdateState(GenerationStage.FETCHING_CONTEXT);\n const toolResult = await handleToolCall(chunk, toolRegistry);\n onUpdateState(GenerationStage.HYDRATING_COMPONENT);\n const streamResponse = await hydrateStream(\n client,\n {\n component: getComponentFromRegistry(\n chunk.component?.componentName ?? \"\",\n componentList,\n ),\n threadId: chunk.threadId,\n toolResponse: toolResult,\n },\n options,\n );\n\n yield* processComponentDecisionStream(\n handleStream(\n streamResponse as AsyncIterable<TamboAI.ComponentHydrateResponse>,\n ),\n componentList,\n toolRegistry,\n onUpdateState,\n client,\n options,\n );\n return;\n }\n\n if (chunk.component?.componentName) {\n try {\n onUpdateState(GenerationStage.STREAMING_RESPONSE);\n // Try to parse and validate accumulated component choice props:\n const messageWithComponent = renderComponentIntoMessage(\n chunk,\n componentList,\n );\n // TODO: do we have to do this now\n accumulatedComponentResponse = {\n ...accumulatedComponentResponse,\n ...messageWithComponent,\n };\n yield messageWithComponent;\n } catch (error) {\n console.error(error);\n }\n }\n }\n onUpdateState(GenerationStage.COMPLETE);\n}\n\n/**\n * Generate a message that has a component rendered into it, if the message came with one\n */\nexport function renderComponentIntoMessage(\n message: TamboAI.Beta.Threads.ThreadMessage,\n componentList: ComponentRegistry,\n): TamboThreadMessage {\n if (!message.component?.componentName) {\n throw new Error(\"Component not found\");\n }\n const parsedProps = parse(JSON.stringify(message.component.props));\n const registeredComponent = getComponentFromRegistry(\n message.component.componentName,\n componentList,\n );\n\n const validatedProps =\n registeredComponent.props instanceof z.ZodType\n ? registeredComponent.props.parse(parsedProps)\n : parsedProps;\n\n const renderedComponent = React.createElement(\n registeredComponent.component,\n validatedProps,\n );\n const wrappedComponent = wrapWithTamboMessageProvider(\n renderedComponent,\n message.threadId,\n message.id,\n );\n\n return {\n ...message,\n component: {\n ...message.component,\n props: validatedProps,\n },\n renderedComponent: wrappedComponent,\n };\n}\n\nasync function* handleStream(\n stream: AsyncIterable<\n TamboAI.ComponentGenerateResponse | TamboAI.ComponentHydrateResponse\n >,\n): AsyncGenerator<TamboAI.Beta.Threads.ThreadMessage> {\n let threadMessage: TamboAI.Beta.Threads.ThreadMessage = {\n threadId: \"\",\n content: [],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n };\n\n try {\n for await (const chunk of stream) {\n threadMessage = {\n ...threadMessage,\n ...chunk,\n };\n yield threadMessage;\n }\n } catch (error) {\n console.error(\"Error processing stream:\", error);\n yield {\n threadId: \"\",\n content: [{ type: \"text\", text: `Error processing stream: ${error}` }],\n role: \"hydra\",\n createdAt: new Date().toISOString(),\n id: crypto.randomUUID(),\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"generate-component.js","sourceRoot":"","sources":["../../src/util/generate-component.ts"],"names":[],"mappings":";;;;;AAYA,gEAoCC;AA/CD,+CAAqC;AACrC,kDAA0B;AAC1B,6BAAwB;AACxB,sEAA4E;AAG5E,+CAA4D;AAE5D;;GAEG;AACH,SAAgB,0BAA0B,CACxC,OAA2C,EAC3C,aAAgC;IAEhC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,WAAW,GAAG,IAAA,oBAAK,EAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,MAAM,mBAAmB,GAAG,IAAA,mCAAwB,EAClD,OAAO,CAAC,SAAS,CAAC,aAAa,EAC/B,aAAa,CACd,CAAC;IAEF,MAAM,cAAc,GAClB,mBAAmB,CAAC,KAAK,YAAY,OAAC,CAAC,OAAO;QAC5C,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;QAC9C,CAAC,CAAC,WAAW,CAAC;IAElB,MAAM,iBAAiB,GAAG,eAAK,CAAC,aAAa,CAC3C,mBAAmB,CAAC,SAAS,EAC7B,cAAc,CACf,CAAC;IACF,MAAM,gBAAgB,GAAG,IAAA,kDAA4B,EACnD,iBAAiB,EACjB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,EAAE,CACX,CAAC;IAEF,OAAO;QACL,GAAG,OAAO;QACV,SAAS,EAAE;YACT,GAAG,OAAO,CAAC,SAAS;YACpB,KAAK,EAAE,cAAc;SACtB;QACD,iBAAiB,EAAE,gBAAgB;KACpC,CAAC;AACJ,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { parse } from \"partial-json\";\nimport React from \"react\";\nimport { z } from \"zod\";\nimport { wrapWithTamboMessageProvider } from \"../hooks/use-current-message\";\nimport { ComponentRegistry } from \"../model/component-metadata\";\nimport { TamboThreadMessage } from \"../model/generate-component-response\";\nimport { getComponentFromRegistry } from \"../util/registry\";\n\n/**\n * Generate a message that has a component rendered into it, if the message came with one\n */\nexport function renderComponentIntoMessage(\n message: TamboAI.Beta.Threads.ThreadMessage,\n componentList: ComponentRegistry,\n): TamboThreadMessage {\n if (!message.component?.componentName) {\n throw new Error(\"Component not found\");\n }\n const parsedProps = parse(JSON.stringify(message.component.props));\n const registeredComponent = getComponentFromRegistry(\n message.component.componentName,\n componentList,\n );\n\n const validatedProps =\n registeredComponent.props instanceof z.ZodType\n ? registeredComponent.props.parse(parsedProps)\n : parsedProps;\n\n const renderedComponent = React.createElement(\n registeredComponent.component,\n validatedProps,\n );\n const wrappedComponent = wrapWithTamboMessageProvider(\n renderedComponent,\n message.threadId,\n message.id,\n );\n\n return {\n ...message,\n component: {\n ...message.component,\n props: validatedProps,\n },\n renderedComponent: wrappedComponent,\n };\n}\n"]}
|
package/dist/util/messages.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/util/messages.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAE/C,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,0CAU/C"}
|
|
@@ -3,3 +3,4 @@ export type CombinedMutationResult<TData = unknown, TError = unknown, TVariables
|
|
|
3
3
|
export declare function combineMutationResults<TData1, TData2, TError1, TError2>(resultA: UseMutationResult<TData1, TError1, any, any>, resultB: UseMutationResult<TData2, TError2, any, any>): CombinedMutationResult<TData1 | TData2, TError1 | TError2>;
|
|
4
4
|
export type CombinedQueryResult<TData1, TData2, TError1, TError2> = Omit<UseQueryResult<TData1 | TData2, TError1 | TError2>, "data" | "refetch" | "promise">;
|
|
5
5
|
export declare function combineQueryResults<TData1, TData2, TError1, TError2>(resultA: UseQueryResult<TData1, TError1>, resultB: UseQueryResult<TData2, TError2>): CombinedQueryResult<void, void, TError1, TError2>;
|
|
6
|
+
//# sourceMappingURL=query-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-utils.d.ts","sourceRoot":"","sources":["../../src/util/query-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE1E,MAAM,MAAM,sBAAsB,CAChC,KAAK,GAAG,OAAO,EACf,MAAM,GAAG,OAAO,EAChB,UAAU,GAAG,OAAO,EACpB,QAAQ,GAAG,OAAO,IAChB,IAAI,CACN,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EACtD,QAAQ,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CACtE,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,EACrD,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GACpD,sBAAsB,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,CAsB5D;AAED,MAAM,MAAM,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CACtE,cAAc,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,EAClD,MAAM,GAAG,SAAS,GAAG,SAAS,CAC/B,CAAC;AACF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAClE,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,GACvC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAsCnD"}
|
package/dist/util/registry.d.ts
CHANGED
|
@@ -5,3 +5,4 @@ export declare const getComponentFromRegistry: (componentName: string, component
|
|
|
5
5
|
export declare const getDefaultContextAdditions: () => string[];
|
|
6
6
|
export declare const getClientContext: () => string;
|
|
7
7
|
export declare const mapTamboToolToContextTool: (tool: TamboTool) => ComponentContextToolMetadata;
|
|
8
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/util/registry.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAG/C,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,EAEjB,mBAAmB,EACnB,SAAS,EACT,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAErC,eAAO,MAAM,sBAAsB,GACjC,mBAAmB,iBAAiB,EACpC,cAAc,iBAAiB,EAC/B,kBAAkB,qBAAqB,KACtC,OAAO,CAAC,kBAAkB,EAuB5B,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,eAAe,MAAM,EACrB,mBAAmB,iBAAiB,KACnC,mBAUF,CAAC;AAEF,eAAO,MAAM,0BAA0B,QAAO,MAAM,EAMnD,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,MAGnC,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,MAAM,SAAS,KACd,4BAQF,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import TamboAI from "@tambo-ai/typescript-sdk";
|
|
2
2
|
import { TamboToolRegistry } from "../model/component-metadata";
|
|
3
3
|
export declare const handleToolCall: (message: TamboAI.Beta.ThreadMessage, toolRegistry: TamboToolRegistry) => Promise<any>;
|
|
4
|
+
//# sourceMappingURL=tool-caller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-caller.d.ts","sourceRoot":"","sources":["../../src/util/tool-caller.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAEL,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAErC,eAAO,MAAM,cAAc,GACzB,SAAS,OAAO,CAAC,IAAI,CAAC,aAAa,EACnC,cAAc,iBAAiB,iBAUhC,CAAC"}
|
package/dist/util/tool-caller.js
CHANGED
|
@@ -25,6 +25,6 @@ const findTool = (toolName, toolRegistry) => {
|
|
|
25
25
|
const runToolChoice = async (toolCallRequest, tool) => {
|
|
26
26
|
// Assumes parameters are in the order they are defined in the tool
|
|
27
27
|
const parameterValues = toolCallRequest.parameters?.map((param) => param.parameterValue) ?? [];
|
|
28
|
-
return tool.getComponentContext(...parameterValues);
|
|
28
|
+
return await tool.getComponentContext(...parameterValues);
|
|
29
29
|
};
|
|
30
30
|
//# sourceMappingURL=tool-caller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-caller.js","sourceRoot":"","sources":["../../src/util/tool-caller.ts"],"names":[],"mappings":";;;AAKA,yCAAuD;AAChD,MAAM,cAAc,GAAG,KAAK,EACjC,OAAmC,EACnC,YAA+B,EAC/B,EAAE;IACF,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAEtE,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAZW,QAAA,cAAc,kBAYzB;AAEF,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,YAA+B,EAAE,EAAE;IACrE,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,wBAAwB,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,oCAAyB,EAAC,YAAY,CAAC,CAAC;IAC5D,OAAO;QACL,mBAAmB,EAAE,YAAY,CAAC,IAAI;QACtC,UAAU,EAAE,WAAW;KACxB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,KAAK,EACzB,eAAwC,EACxC,IAA0B,EACZ,EAAE;IAChB,mEAAmE;IACnE,MAAM,eAAe,GACnB,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAEzE,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-caller.js","sourceRoot":"","sources":["../../src/util/tool-caller.ts"],"names":[],"mappings":";;;AAKA,yCAAuD;AAChD,MAAM,cAAc,GAAG,KAAK,EACjC,OAAmC,EACnC,YAA+B,EAC/B,EAAE;IACF,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAEtE,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAZW,QAAA,cAAc,kBAYzB;AAEF,MAAM,QAAQ,GAAG,CAAC,QAAgB,EAAE,YAA+B,EAAE,EAAE;IACrE,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,wBAAwB,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,oCAAyB,EAAC,YAAY,CAAC,CAAC;IAC5D,OAAO;QACL,mBAAmB,EAAE,YAAY,CAAC,IAAI;QACtC,UAAU,EAAE,WAAW;KACxB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,KAAK,EACzB,eAAwC,EACxC,IAA0B,EACZ,EAAE;IAChB,mEAAmE;IACnE,MAAM,eAAe,GACnB,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAEzE,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,eAAe,CAAC,CAAC;AAC5D,CAAC,CAAC","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport {\n ComponentContextTool,\n TamboToolRegistry,\n} from \"../model/component-metadata\";\nimport { mapTamboToolToContextTool } from \"./registry\";\nexport const handleToolCall = async (\n message: TamboAI.Beta.ThreadMessage,\n toolRegistry: TamboToolRegistry,\n) => {\n if (!message?.toolCallRequest?.toolName) {\n throw new Error(\"Tool name is required\");\n }\n\n const tool = findTool(message.toolCallRequest.toolName, toolRegistry);\n const toolResult = await runToolChoice(message.toolCallRequest, tool);\n\n return toolResult;\n};\n\nconst findTool = (toolName: string, toolRegistry: TamboToolRegistry) => {\n const registryTool = toolRegistry[toolName];\n\n if (!registryTool) {\n throw new Error(`Tool ${toolName} not found in registry`);\n }\n\n const contextTool = mapTamboToolToContextTool(registryTool);\n return {\n getComponentContext: registryTool.tool,\n definition: contextTool,\n };\n};\n\nconst runToolChoice = async (\n toolCallRequest: TamboAI.ToolCallRequest,\n tool: ComponentContextTool,\n): Promise<any> => {\n // Assumes parameters are in the order they are defined in the tool\n const parameterValues =\n toolCallRequest.parameters?.map((param) => param.parameterValue) ?? [];\n\n return await tool.getComponentContext(...parameterValues);\n};\n"]}
|