From f8b45f8aa6329e060d0984554c6513a7346acde7 Mon Sep 17 00:00:00 2001 From: Nicholas Sarvi Date: Tue, 6 Aug 2024 10:56:41 -0400 Subject: [PATCH 1/2] Expose metadata for use in react assistant API --- .../docs/07-reference/ai-sdk-ui/20-use-assistant.mdx | 6 ++++++ packages/react/src/use-assistant.ts | 11 +++++++++++ packages/ui-utils/src/types.ts | 9 +++++++++ 3 files changed, 26 insertions(+) diff --git a/content/docs/07-reference/ai-sdk-ui/20-use-assistant.mdx b/content/docs/07-reference/ai-sdk-ui/20-use-assistant.mdx index 1284f0ca3a4e..3013946923e3 100644 --- a/content/docs/07-reference/ai-sdk-ui/20-use-assistant.mdx +++ b/content/docs/07-reference/ai-sdk-ui/20-use-assistant.mdx @@ -113,6 +113,12 @@ This works in conjunction with [`AssistantResponse`](./assistant-response) in th description: "Set the current thread ID. Specifying a thread ID will switch to that thread, if it exists. If set to 'undefined', a new thread will be created. For both cases, `threadId` will be updated with the new value and `messages` will be cleared.", }, + // Lines 117-121 have been added by Hypercontext for internal use + [ + name: 'sendMessageMetadata', + type: 'boolean', + description: 'An optional flag to send metadata in the message object. Defaults to `false`.', + ], { name: 'input', type: 'string', diff --git a/packages/react/src/use-assistant.ts b/packages/react/src/use-assistant.ts index 7a366f451fe3..57cc6cf34ca7 100644 --- a/packages/react/src/use-assistant.ts +++ b/packages/react/src/use-assistant.ts @@ -89,6 +89,13 @@ Abort the current request immediately, keep the generated tokens if any. * The error thrown during the assistant message processing, if any. */ error: undefined | Error; + + /** + * Added by Hypercontext for internal use + * + * An optional flag to retrieve metadata of each message + */ + sendMessageMetadata?: boolean; }; export function useAssistant({ @@ -99,6 +106,7 @@ export function useAssistant({ body, onError, fetch, + sendMessageMetadata, // Added by Hypercontext for internal use }: UseAssistantOptions): UseAssistantHelpers { const [messages, setMessages] = useState([]); const [input, setInput] = useState(''); @@ -187,6 +195,7 @@ export function useAssistant({ id: value.id, role: value.role, content: value.content[0].text.value, + ...(sendMessageMetadata ? { metadata: value.metadata} : {}), // Added by Hypercontext for internal use }, ]); break; @@ -202,6 +211,7 @@ export function useAssistant({ id: lastMessage.id, role: lastMessage.role, content: lastMessage.content + value, + metadata: lastMessage.metadata, // Added by Hypercontext for internal use }, ]; }); @@ -285,6 +295,7 @@ export function useAssistant({ setMessages, threadId: currentThreadId, setThreadId, + sendMessageMetadata, // Added by Hypercontext for internal use input, setInput, handleInputChange, diff --git a/packages/ui-utils/src/types.ts b/packages/ui-utils/src/types.ts index bdeec8a3767e..f1bbb778b662 100644 --- a/packages/ui-utils/src/types.ts +++ b/packages/ui-utils/src/types.ts @@ -160,6 +160,14 @@ Text content of the message. */ content: string; + /** + * Added by Hypercontext for internal use + * + * If the sendMessageMetadata flag is enabled, this could be defined. + * Otherwise it should be null + */ + metadata?: unknown; + /** * Additional attachments to be sent along with the message. */ @@ -609,6 +617,7 @@ export type AssistantMessage = { value: string; }; }>; + metadata?: unknown; // Added by Hypercontext for internal use }; /* From 2ce77e1bf7b396256eda1ed86c9ac880074a6ff7 Mon Sep 17 00:00:00 2001 From: Nicholas Sarvi Date: Tue, 6 Aug 2024 14:01:18 -0400 Subject: [PATCH 2/2] Add necessary package.json changes --- package.json | 5 +++-- packages/ai/react/index.ts | 4 ++-- packages/react/src/use-assistant.ts | 4 ++-- packages/ui-utils/src/use-assistant-types.ts | 7 +++++++ 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 7539f80705f2..0f164eeb9d57 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "@playwright/test": "^1.44.1", "chalk": "^5.3.0", "eslint": "^7.32.0", - "eslint-config-vercel-ai": "workspace:*", + "eslint-config-vercel-ai": "tools/eslint-config", "husky": "^8.0.0", "lint-staged": "^15.2.4", "next": "15.0.0-canary.23", @@ -57,5 +57,6 @@ "singleQuote": true, "arrowParens": "avoid", "trailingComma": "all" - } + }, + "workspaces": ["tools/eslint-config"] } diff --git a/packages/ai/react/index.ts b/packages/ai/react/index.ts index de286167ca50..cc4504b720f4 100644 --- a/packages/ai/react/index.ts +++ b/packages/ai/react/index.ts @@ -3,7 +3,7 @@ import { useCompletion as useCompletionReact, useAssistant as useAssistantReact, experimental_useObject as experimental_useObjectReact, -} from '@ai-sdk/react'; +} from '../../react/src'; export const useChat = useChatReact; export const useCompletion = useCompletionReact; @@ -14,4 +14,4 @@ export type { Message, UseChatOptions, UseChatHelpers, -} from '@ai-sdk/react'; +} from '../../react/src'; diff --git a/packages/react/src/use-assistant.ts b/packages/react/src/use-assistant.ts index 57cc6cf34ca7..293e9763779a 100644 --- a/packages/react/src/use-assistant.ts +++ b/packages/react/src/use-assistant.ts @@ -1,4 +1,4 @@ -import { isAbortError } from '@ai-sdk/provider-utils'; +import { isAbortError } from '../../provider-utils/src'; import { AssistantStatus, CreateMessage, @@ -6,7 +6,7 @@ import { UseAssistantOptions, generateId, readDataStream, -} from '@ai-sdk/ui-utils'; +} from '../../ui-utils/src'; import { useCallback, useRef, useState } from 'react'; // use function to allow for mocking in tests: diff --git a/packages/ui-utils/src/use-assistant-types.ts b/packages/ui-utils/src/use-assistant-types.ts index ed33e1c37bf2..73db67ef3cc2 100644 --- a/packages/ui-utils/src/use-assistant-types.ts +++ b/packages/ui-utils/src/use-assistant-types.ts @@ -43,4 +43,11 @@ Custom fetch implementation. You can use it as a middleware to intercept request or to provide a custom fetch implementation for e.g. testing. */ fetch?: FetchFunction; + + /** + * Added by Hypercontext for internal use + * + * An optional flag to retrieve metadata of each message + */ + sendMessageMetadata?: boolean; };