@@ -6,9 +6,9 @@ import { createStore, useStore, type StoreApi } from 'zustand';
66import { ThreadAdapter , AttachmentAdapter , DictationAdapter } from "./types/adapters" ;
77import { emptyStorageThreadAdapter } from "./adapters/empty-storage-adapter" ;
88import { Thread , Threads } from "./types/entities" ;
9- import { useChat , UseChatOptions } from "@ai-sdk/react" ;
9+ import { UseChatOptions } from "@ai-sdk/react" ;
1010import { AiChatEventHandler , AiChatEvents } from "./primitives/events" ;
11- import type { Toolkit } from "./types/toolbox " ;
11+ import { UITool } from "./types/tools-types " ;
1212
1313type LanguageModelV1CallSettings = {
1414 maxTokens ?: number ;
@@ -26,6 +26,7 @@ type LanguageModelConfig = {
2626 modelName ?: string ;
2727} ;
2828
29+
2930export type AiContextType = {
3031 adapters ?: {
3132 attachment ?: AttachmentAdapter ;
@@ -34,18 +35,19 @@ export type AiContextType = {
3435 }
3536 priority ?: number | undefined ;
3637 system ?: string | undefined ;
37- tools ?: Record < string , Tool < any , any > > | undefined ;
38- toolkit ?: Toolkit | undefined ;
3938 callSettings ?: LanguageModelV1CallSettings | undefined ;
4039 config ?: LanguageModelConfig | undefined ;
4140 selectedModel : string | null ;
4241 setSelectedModel : ( selectedModel : string | null ) => void ;
43- disabledTools : string [ ] ;
44- setDisabledTools : ( disabledTools : string [ ] ) => void ;
4542 chatOptions ?: Omit < UseChatOptions < Thread [ 'messages' ] [ 0 ] > & ChatInit < Thread [ 'messages' ] [ 0 ] > , 'id' | 'transport' > & {
4643 transportOptions ?: HttpChatTransportInitOptions < Thread [ 'messages' ] [ 0 ] >
4744 }
4845 eventHandler : AiChatEventHandler
46+
47+ tools : Record < string , UITool < any , any > >
48+ upsertTool : (
49+ tool : UITool < any , any >
50+ ) => void ;
4951} ;
5052
5153const AiContextStoreCtx = React . createContext < StoreApi < AiContextType > | null > ( null ) ;
@@ -72,16 +74,24 @@ export const useAiEvent = <TEvent extends keyof AiChatEvents>(name: TEvent, p: (
7274 } , [ eventHandler , name , p ] )
7375} ;
7476
75- export function AiProvider ( { children, ...value } : { children : React . ReactNode } & Omit < AiContextType , 'eventHandler' | 'selectedModel' | 'disabledTools ' | 'setSelectedModel' | 'setDisabledTools' > & Partial < Pick < AiContextType , 'selectedModel' | 'disabledTools' > > ) {
77+ export function AiProvider ( { children, ...value } : { children : React . ReactNode } & Omit < AiContextType , 'eventHandler' | 'selectedModel' | 'tools ' | 'upsertTool' > ) {
7678 // Create store once
7779 const storeRef = useRef < StoreApi < AiContextType > | null > ( null ) ;
7880 if ( storeRef . current === null ) {
7981 storeRef . current = createStore < AiContextType > ( ( set ) => ( {
8082 ...value ,
81- selectedModel : value . selectedModel ?? null ,
83+ selectedModel : null ,
8284 setSelectedModel : ( selectedModel ) => set ( { selectedModel } ) ,
83- disabledTools : value . disabledTools ?? [ ] ,
84- setDisabledTools : ( disabledTools ) => set ( { disabledTools } ) ,
85+ tools : { } ,
86+ upsertTool : ( tool ) => {
87+ const toolName = tool . toolName ;
88+ set ( ( prev ) => ( {
89+ tools : {
90+ ...prev . tools ,
91+ [ toolName ] : tool ,
92+ } ,
93+ } ) ) ;
94+ } ,
8595 eventHandler : new AiChatEventHandler ( ) ,
8696 } ) ) ;
8797 }
0 commit comments