@sqlrooms/ai-core 0.26.0-rc.3 → 0.26.0-rc.5

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/AiSlice.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { AiSliceConfig, AnalysisResultSchema, AnalysisSessionSchema } from '@sqlrooms/ai-config';
2
- import { BaseRoomConfig, RoomState, type StateCreator } from '@sqlrooms/room-store';
3
- import { UIMessage, DefaultChatTransport, LanguageModel } from 'ai';
2
+ import { BaseRoomConfig, type StateCreator } from '@sqlrooms/room-store';
3
+ import { DefaultChatTransport, LanguageModel, UIMessage } from 'ai';
4
4
  import { OpenAssistantToolSet } from '@openassistant/utils';
5
5
  type ExtendedChatOnToolCallCallback = (args: {
6
6
  toolCall: any;
@@ -13,6 +13,7 @@ export type AiSliceState = {
13
13
  isRunningAnalysis: boolean;
14
14
  tools: OpenAssistantToolSet;
15
15
  analysisAbortController?: AbortController;
16
+ setConfig: (config: AiSliceConfig) => void;
16
17
  setAnalysisPrompt: (prompt: string) => void;
17
18
  addAnalysisResult: (message: UIMessage) => void;
18
19
  startAnalysis: (sendMessage: (message: {
@@ -77,6 +78,6 @@ export interface AiSliceOptions {
77
78
  chatHeaders?: Record<string, string>;
78
79
  }
79
80
  export declare function createAiSlice<PC extends BaseRoomConfig>(params: AiSliceOptions): StateCreator<AiSliceState>;
80
- export declare function useStoreWithAi<T, PC extends BaseRoomConfig, S extends RoomState<PC> & AiSliceState>(selector: (state: S) => T): T;
81
+ export declare function useStoreWithAi<T>(selector: (state: AiSliceState) => T): T;
81
82
  export {};
82
83
  //# sourceMappingURL=AiSlice.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AiSlice.d.ts","sourceRoot":"","sources":["../src/AiSlice.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AiSlice.d.ts","sourceRoot":"","sources":["../src/AiSlice.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EAEtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,cAAc,EAGd,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAC,oBAAoB,EAAE,aAAa,EAAE,SAAS,EAAC,MAAM,IAAI,CAAC;AAGlE,OAAO,EAAC,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AAS1D,KAAK,8BAA8B,GAAG,CAAC,IAAI,EAAE;IAC3C,QAAQ,EAAE,GAAG,CAAC;IACd,aAAa,CAAC,EAAE,GAAG,CAAC;CACrB,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAEzB,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE;QACF,MAAM,EAAE,aAAa,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,OAAO,CAAC;QAC3B,KAAK,EAAE,oBAAoB,CAAC;QAC5B,uBAAuB,CAAC,EAAE,eAAe,CAAC;QAC1C,SAAS,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;QAC3C,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;QAC5C,iBAAiB,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC;QAChD,aAAa,EAAE,CACb,WAAW,EAAE,CAAC,OAAO,EAAE;YAAC,IAAI,EAAE,MAAM,CAAA;SAAC,KAAK,IAAI,KAC3C,OAAO,CAAC,IAAI,CAAC,CAAC;QACnB,cAAc,EAAE,MAAM,IAAI,CAAC;QAC3B,UAAU,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;QAC3D,aAAa,EAAE,CACb,IAAI,CAAC,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,EACtB,KAAK,CAAC,EAAE,MAAM,KACX,IAAI,CAAC;QACV,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;QAC3C,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QACzD,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;QAC3C,iBAAiB,EAAE,MAAM,qBAAqB,GAAG,SAAS,CAAC;QAC3D,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;QAC3E,4BAA4B,EAAE,CAC5B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,OAAO,KACpB,IAAI,CAAC;QACV,kBAAkB,EAAE,MAAM,oBAAoB,EAAE,CAAC;QACjD,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;QACpE,wBAAwB,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC;QAC3E,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;QACzE,qBAAqB,EAAE,MAAM,MAAM,CAAC;QACpC,sBAAsB,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;QACjD,uBAAuB,EAAE,MAAM,MAAM,CAAC;QACtC,mBAAmB,EAAE,MAAM,MAAM,CAAC;QAElC,qBAAqB,EAAE,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAC7D,kFAAkF;QAClF,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC7B,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACrC,cAAc,EAAE,8BAA8B,CAAC;QAC/C,UAAU,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,CAAC;QACpC,YAAY,EAAE,CAAC,IAAI,EAAE;YACnB,OAAO,EAAE,SAAS,CAAC;YACnB,QAAQ,EAAE,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,EAAE,OAAO,CAAC;SACnB,KAAK,IAAI,CAAC;QACX,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;KACvC,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC,sDAAsD;IACtD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,uCAAuC;IACvC,KAAK,EAAE,oBAAoB,CAAC;IAE5B;;;OAGG;IACH,eAAe,EAAE,MAAM,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;IAC1B,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,wBAAgB,aAAa,CAAC,EAAE,SAAS,cAAc,EACrD,MAAM,EAAE,cAAc,GACrB,YAAY,CAAC,YAAY,CAAC,CAwiB5B;AAYD,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,CAAC,GAAG,CAAC,CAEzE"}
package/dist/AiSlice.js CHANGED
@@ -1,18 +1,23 @@
1
1
  import { createId } from '@paralleldrive/cuid2';
2
2
  import { createDefaultAiConfig, } from '@sqlrooms/ai-config';
3
- import { createBaseSlice, useBaseRoomStore, } from '@sqlrooms/room-store';
3
+ import { createSlice, useBaseRoomStore, } from '@sqlrooms/room-store';
4
4
  import { produce } from 'immer';
5
- import { createLocalChatTransportFactory, createRemoteChatTransportFactory, createChatHandlers, } from './chatTransport';
5
+ import { createChatHandlers, createLocalChatTransportFactory, createRemoteChatTransportFactory, } from './chatTransport';
6
6
  import { hasAiSettingsConfig } from './hasAiSettingsConfig';
7
7
  export function createAiSlice(params) {
8
8
  const { initialAnalysisPrompt = '', tools, getApiKey, getBaseUrl, maxSteps = 50, getInstructions, defaultProvider = 'openai', defaultModel = 'gpt-4.1', getCustomModel, chatEndPoint = '', chatHeaders = {}, } = params;
9
- return createBaseSlice((set, get, store) => {
9
+ return createSlice((set, get, store) => {
10
10
  return {
11
11
  ai: {
12
12
  config: createDefaultAiConfig(params.config),
13
13
  analysisPrompt: initialAnalysisPrompt,
14
14
  isRunningAnalysis: false,
15
15
  tools,
16
+ setConfig: (config) => {
17
+ set((state) => produce(state, (draft) => {
18
+ draft.ai.config = config;
19
+ }));
20
+ },
16
21
  setAnalysisPrompt: (prompt) => {
17
22
  set((state) => produce(state, (draft) => {
18
23
  draft.ai.analysisPrompt = prompt;
@@ -1 +1 @@
1
- {"version":3,"file":"AiSlice.js","sourceRoot":"","sources":["../src/AiSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {\n AiSliceConfig,\n AnalysisResultSchema,\n AnalysisSessionSchema,\n createDefaultAiConfig,\n} from '@sqlrooms/ai-config';\nimport {\n BaseRoomConfig,\n createBaseSlice,\n RoomState,\n useBaseRoomStore,\n type StateCreator,\n} from '@sqlrooms/room-store';\nimport {produce} from 'immer';\nimport {UIMessage, DefaultChatTransport, LanguageModel} from 'ai';\n\nimport {\n createLocalChatTransportFactory,\n createRemoteChatTransportFactory,\n createChatHandlers,\n} from './chatTransport';\nimport {hasAiSettingsConfig} from './hasAiSettingsConfig';\nimport {OpenAssistantToolSet} from '@openassistant/utils';\n\n// Custom type for onChatToolCall that includes addToolResult\ntype ExtendedChatOnToolCallCallback = (args: {\n toolCall: any;\n addToolResult?: any;\n}) => Promise<any> | any;\n\nexport type AiSliceState = {\n ai: {\n config: AiSliceConfig;\n analysisPrompt: string;\n isRunningAnalysis: boolean;\n tools: OpenAssistantToolSet;\n analysisAbortController?: AbortController;\n setAnalysisPrompt: (prompt: string) => void;\n addAnalysisResult: (message: UIMessage) => void;\n startAnalysis: (\n sendMessage: (message: {text: string}) => void,\n ) => Promise<void>;\n cancelAnalysis: () => void;\n setAiModel: (modelProvider: string, model: string) => void;\n createSession: (\n name?: string,\n modelProvider?: string,\n model?: string,\n ) => void;\n switchSession: (sessionId: string) => void;\n renameSession: (sessionId: string, name: string) => void;\n deleteSession: (sessionId: string) => void;\n getCurrentSession: () => AnalysisSessionSchema | undefined;\n setSessionUiMessages: (sessionId: string, uiMessages: UIMessage[]) => void;\n setSessionToolAdditionalData: (\n sessionId: string,\n toolCallId: string,\n additionalData: unknown,\n ) => void;\n getAnalysisResults: () => AnalysisResultSchema[];\n deleteAnalysisResult: (sessionId: string, resultId: string) => void;\n getAssistantMessageParts: (analysisResultId: string) => UIMessage['parts'];\n findToolComponent: (toolName: string) => React.ComponentType | undefined;\n getApiKeyFromSettings: () => string;\n getBaseUrlFromSettings: () => string | undefined;\n getMaxStepsFromSettings: () => number;\n getFullInstructions: () => string;\n // Chat transport for useChat hook\n getLocalChatTransport: () => DefaultChatTransport<UIMessage>;\n /** Optional remote endpoint to use for chat; if empty, local transport is used */\n chatEndPoint: string;\n chatHeaders: Record<string, string>;\n getRemoteChatTransport: (\n endpoint: string,\n headers?: Record<string, string>,\n ) => DefaultChatTransport<UIMessage>;\n onChatToolCall: ExtendedChatOnToolCallCallback;\n onChatData: (dataPart: any) => void;\n onChatFinish: (args: {\n message: UIMessage;\n messages: UIMessage[];\n isError?: boolean;\n }) => void;\n onChatError: (error: unknown) => void;\n };\n};\n\n/**\n * Configuration options for creating an AI slice\n */\nexport interface AiSliceOptions {\n config?: Partial<AiSliceConfig>;\n /** Initial prompt to display in the analysis input */\n initialAnalysisPrompt?: string;\n /** Tools to add to the AI assistant */\n tools: OpenAssistantToolSet;\n\n /**\n * Function to get custom instructions for the AI assistant\n * @returns The instructions string to use\n */\n getInstructions: () => string;\n defaultProvider?: string;\n defaultModel?: string;\n /** Provide a pre-configured model client for a provider (e.g., Azure). */\n getCustomModel?: () => LanguageModel | undefined;\n maxSteps?: number;\n getApiKey?: (modelProvider: string) => string;\n getBaseUrl?: () => string;\n /** Optional remote endpoint to use for chat; if empty, local transport is used */\n chatEndPoint?: string;\n /** Optional headers to send with remote endpoint */\n chatHeaders?: Record<string, string>;\n}\n\nexport function createAiSlice<PC extends BaseRoomConfig>(\n params: AiSliceOptions,\n): StateCreator<AiSliceState> {\n const {\n initialAnalysisPrompt = '',\n tools,\n getApiKey,\n getBaseUrl,\n maxSteps = 50,\n getInstructions,\n defaultProvider = 'openai',\n defaultModel = 'gpt-4.1',\n getCustomModel,\n chatEndPoint = '',\n chatHeaders = {},\n } = params;\n\n return createBaseSlice<PC, AiSliceState>((set, get, store) => {\n return {\n ai: {\n config: createDefaultAiConfig(params.config),\n analysisPrompt: initialAnalysisPrompt,\n isRunningAnalysis: false,\n tools,\n\n setAnalysisPrompt: (prompt: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.analysisPrompt = prompt;\n }),\n );\n },\n\n /**\n * Set the AI model for the current session\n * @param model - The model to set\n */\n setAiModel: (modelProvider: string, model: string) => {\n set((state) =>\n produce(state, (draft) => {\n const currentSession = getCurrentSessionFromState(draft);\n if (currentSession) {\n currentSession.modelProvider = modelProvider;\n currentSession.model = model;\n }\n }),\n );\n },\n\n /**\n * Get the current active session\n */\n getCurrentSession: () => {\n const state = get();\n const {currentSessionId, sessions} = state.ai.config;\n return sessions.find((session) => session.id === currentSessionId);\n },\n\n /**\n * Create a new session with the given name and model settings\n */\n createSession: (\n name?: string,\n modelProvider?: string,\n model?: string,\n ) => {\n const currentSession = get().ai.getCurrentSession();\n const newSessionId = createId();\n\n // Generate a default name if none is provided\n let sessionName = name;\n if (!sessionName) {\n // Generate a human-readable date and time for the session name\n const now = new Date();\n const formattedDate = now.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n const formattedTime = now.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: 'numeric',\n hour12: true,\n });\n sessionName = `Session ${formattedDate} at ${formattedTime}`;\n }\n\n set((state) =>\n produce(state, (draft) => {\n // Add to AI sessions\n draft.ai.config.sessions.unshift({\n id: newSessionId,\n name: sessionName,\n modelProvider:\n modelProvider || currentSession?.modelProvider || 'openai',\n model: model || currentSession?.model || 'gpt-4.1',\n analysisResults: [],\n createdAt: new Date(),\n uiMessages: [],\n toolAdditionalData: {},\n messagesRevision: 0,\n });\n draft.ai.config.currentSessionId = newSessionId;\n }),\n );\n },\n\n /**\n * Switch to a different session\n */\n switchSession: (sessionId: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.config.currentSessionId = sessionId;\n }),\n );\n },\n\n /**\n * Rename an existing session\n */\n renameSession: (sessionId: string, name: string) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n session.name = name;\n }\n }),\n );\n },\n\n /**\n * Delete a session\n */\n deleteSession: (sessionId: string) => {\n set((state) =>\n produce(state, (draft) => {\n const sessionIndex = draft.ai.config.sessions.findIndex(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (sessionIndex !== -1) {\n // Don't delete the last session\n if (draft.ai.config.sessions.length > 1) {\n draft.ai.config.sessions.splice(sessionIndex, 1);\n // If we deleted the current session, switch to another one\n if (draft.ai.config.currentSessionId === sessionId) {\n // Make sure there's at least one session before accessing its id\n if (draft.ai.config.sessions.length > 0) {\n const firstSession = draft.ai.config.sessions[0];\n if (firstSession) {\n draft.ai.config.currentSessionId = firstSession.id;\n }\n }\n }\n }\n }\n }),\n );\n },\n\n /**\n * Save the Ai SDK UI messages for a session\n */\n setSessionUiMessages: (sessionId: string, uiMessages: UIMessage[]) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n // store the latest UI messages from the chat hook\n // Create a deep copy to avoid read-only property issues\n session.uiMessages = JSON.parse(JSON.stringify(uiMessages));\n }\n }),\n );\n },\n\n /**\n * Save additional data for a session\n */\n setSessionToolAdditionalData: (\n sessionId: string,\n toolCallId: string,\n additionalData: unknown,\n ) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s) => s.id === sessionId,\n );\n if (session) {\n if (!session.toolAdditionalData) {\n session.toolAdditionalData = {};\n }\n session.toolAdditionalData[toolCallId] = additionalData;\n }\n }),\n );\n },\n\n findToolComponent: (toolName: string) => {\n return get().ai.tools[toolName]?.component as React.ComponentType;\n },\n\n getBaseUrlFromSettings: () => {\n // First try the getBaseUrl function if provided\n const baseUrlFromFunction = getBaseUrl?.();\n if (baseUrlFromFunction) {\n return baseUrlFromFunction;\n }\n\n // Fall back to settings\n const store = get();\n if (hasAiSettingsConfig(store)) {\n const currentSession = getCurrentSessionFromState(store);\n if (currentSession) {\n if (currentSession.modelProvider === 'custom') {\n const customModel = store.aiSettings.config.customModels.find(\n (m: {modelName: string}) =>\n m.modelName === currentSession.model,\n );\n return customModel?.baseUrl;\n }\n const provider =\n store.aiSettings.config.providers[currentSession.modelProvider];\n return provider?.baseUrl;\n }\n }\n return undefined;\n },\n\n getApiKeyFromSettings: () => {\n const store = get();\n const currentSession = getCurrentSessionFromState(store);\n if (currentSession) {\n // First try the getApiKey function if provided\n const apiKeyFromFunction = getApiKey?.(\n currentSession.modelProvider || 'openai',\n );\n if (apiKeyFromFunction) {\n return apiKeyFromFunction;\n }\n\n // Fall back to settings\n if (hasAiSettingsConfig(store)) {\n if (currentSession.modelProvider === 'custom') {\n const customModel = store.aiSettings.config.customModels.find(\n (m: {modelName: string}) =>\n m.modelName === currentSession.model,\n );\n return customModel?.apiKey || '';\n } else {\n const provider =\n store.aiSettings.config.providers?.[\n currentSession.modelProvider\n ];\n return provider?.apiKey || '';\n }\n }\n }\n return '';\n },\n\n getMaxStepsFromSettings: () => {\n const store = get();\n // First try the maxSteps parameter if provided\n if (maxSteps && Number.isFinite(maxSteps) && maxSteps > 0) {\n return maxSteps;\n }\n\n // Fall back to settings\n if (hasAiSettingsConfig(store)) {\n const settingsMaxSteps =\n store.aiSettings.config.modelParameters.maxSteps;\n if (Number.isFinite(settingsMaxSteps) && settingsMaxSteps > 0) {\n return settingsMaxSteps;\n }\n }\n return 50;\n },\n\n getFullInstructions: () => {\n const store = get();\n\n let instructions = getInstructions();\n\n // Fall back to settings\n if (hasAiSettingsConfig(store)) {\n // get additional instructions from settings\n const {additionalInstruction} =\n store.aiSettings.config.modelParameters;\n if (additionalInstruction) {\n instructions = `${instructions}\\n\\nAdditional Instructions:\\n\\n${additionalInstruction}`;\n }\n }\n return instructions;\n },\n\n /**\n * Start the analysis\n * TODO: how to pass the history analysisResults?\n */\n startAnalysis: async (\n sendMessage: (message: {text: string}) => void,\n ) => {\n const abortController = new AbortController();\n const currentSession = get().ai.getCurrentSession();\n\n if (!currentSession) {\n console.error('No current session found');\n return;\n }\n\n const promptText = get().ai.analysisPrompt;\n\n set((state) =>\n produce(state, (draft) => {\n draft.ai.analysisAbortController = abortController;\n draft.ai.isRunningAnalysis = true;\n\n // Add incomplete analysis result to session immediately for instant UI rendering\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === currentSession.id,\n );\n if (session) {\n // Add incomplete analysis result with a temporary ID\n // This will be updated in onChatFinish with the actual user message ID\n session.analysisResults.push({\n id: '__pending__',\n prompt: promptText,\n isCompleted: false,\n });\n }\n }),\n );\n\n // The pending analysis result will be updated in onChatFinish with the correct message ID\n sendMessage({text: promptText});\n },\n\n cancelAnalysis: () => {\n const currentSession = get().ai.getCurrentSession();\n set((state) =>\n produce(state, (draft) => {\n draft.ai.isRunningAnalysis = false;\n\n // Remove pending analysis result if it exists\n if (currentSession) {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === currentSession.id,\n );\n if (session) {\n const pendingIndex = session.analysisResults.findIndex(\n (result: AnalysisResultSchema) =>\n result.id === '__pending__',\n );\n if (pendingIndex !== -1) {\n session.analysisResults.splice(pendingIndex, 1);\n }\n }\n }\n }),\n );\n get().ai.analysisAbortController?.abort('Analysis cancelled');\n },\n\n /**\n * Get the assistant message parts for a given analysis result ID\n * @param analysisResultId - The ID of the analysis result (user message ID)\n * @returns Array of message parts from the assistant's response\n */\n getAssistantMessageParts: (analysisResultId: string) => {\n const currentSession = get().ai.getCurrentSession();\n if (!currentSession) return [];\n\n const uiMessages = currentSession.uiMessages as UIMessage[];\n // Find the user message with analysisResultId\n const userMessageIndex = uiMessages.findIndex(\n (msg) => msg.id === analysisResultId && msg.role === 'user',\n );\n if (userMessageIndex === -1) return [];\n\n // Find the next assistant message after this user message\n for (let i = userMessageIndex + 1; i < uiMessages.length; i++) {\n const msg = uiMessages[i];\n if (msg?.role === 'assistant') {\n return msg.parts;\n }\n if (msg?.role === 'user') {\n // Hit next user message without finding assistant response\n break;\n }\n }\n return [];\n },\n\n /**\n * Delete an analysis result from a session\n * - remove the corresponding prompt-response pair from uiMessages\n * - remove the associated toolAdditionalData\n */\n deleteAnalysisResult: (sessionId: string, resultId: string) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n session.analysisResults = session.analysisResults.filter(\n (r: AnalysisResultSchema) => r.id !== resultId,\n );\n // Remove corresponding prompt-response pair from uiMessages\n const uiMessages = session.uiMessages as UIMessage[];\n const userMessageIndex = uiMessages.findIndex(\n (msg) => msg.id === resultId && msg.role === 'user',\n );\n\n if (userMessageIndex !== -1) {\n // Find the next user message (or end of array) to determine response boundary\n let nextUserIndex = userMessageIndex + 1;\n const toolCallIdsToDelete: Set<string> = new Set();\n\n while (\n nextUserIndex < uiMessages.length &&\n uiMessages[nextUserIndex]?.role !== 'user'\n ) {\n const msg = uiMessages[nextUserIndex];\n // Extract toolCallId from message parts\n if (msg?.parts) {\n for (const part of msg.parts) {\n // Check for tool-* or dynamic-tool parts that have toolCallId\n if (\n 'toolCallId' in part &&\n typeof part.toolCallId === 'string'\n ) {\n toolCallIdsToDelete.add(part.toolCallId);\n }\n }\n }\n nextUserIndex++;\n }\n\n // Remove the user message and all assistant messages until the next user message\n session.uiMessages.splice(\n userMessageIndex,\n nextUserIndex - userMessageIndex,\n );\n\n // Increment messagesRevision to force useChat reset\n session.messagesRevision =\n (session.messagesRevision || 0) + 1;\n\n // Clean up toolAdditionalData for deleted messages\n if (session.toolAdditionalData) {\n // Remove data keyed by the toolCallId from the deleted messages\n toolCallIdsToDelete.forEach((toolCallId) => {\n if (session.toolAdditionalData![toolCallId]) {\n delete session.toolAdditionalData![toolCallId];\n }\n });\n }\n }\n }\n }),\n );\n },\n\n /**\n * Get analysis results for the current session by transforming UI messages\n * into structured analysis results (user prompt → AI response pairs).\n *\n * @returns Array of analysis results for the current session\n */\n getAnalysisResults: (): AnalysisResultSchema[] => {\n const currentSession = get().ai.getCurrentSession();\n if (!currentSession) return [];\n\n return currentSession.analysisResults;\n },\n\n /**\n * Add an analysis result to the current session\n * - add the message to the uiMessages\n * - add the analysis result to the analysisResults\n */\n addAnalysisResult: (message: UIMessage) => {\n const currentSession = get().ai.getCurrentSession();\n if (!currentSession) {\n console.error('No current session found');\n return;\n }\n set((state) =>\n produce(state, (draft) => {\n // Extract text content from message parts\n const textContent =\n message.parts\n ?.filter((part) => part.type === 'text')\n ?.map((part) => (part as {text: string}).text)\n ?.join('') || '';\n\n draft.ai.config.sessions\n .find((s: AnalysisSessionSchema) => s.id === currentSession?.id)\n ?.analysisResults.push({\n id: message.id,\n prompt: textContent,\n isCompleted: true,\n });\n }),\n );\n },\n\n // Chat transport configuration\n chatEndPoint,\n chatHeaders,\n\n getLocalChatTransport: () => {\n const state = get();\n return createLocalChatTransportFactory({\n store,\n defaultProvider: defaultProvider,\n defaultModel: defaultModel,\n apiKey: state.ai.getApiKeyFromSettings(),\n baseUrl: state.ai.getBaseUrlFromSettings(),\n getInstructions: () => store.getState().ai.getFullInstructions(),\n getCustomModel,\n })();\n },\n\n getRemoteChatTransport: (\n endpoint: string,\n headers?: Record<string, string>,\n ) =>\n createRemoteChatTransportFactory({\n store,\n defaultProvider,\n defaultModel,\n })(endpoint, headers),\n\n ...createChatHandlers({store}),\n },\n };\n });\n}\n\n/**\n * Helper function to get the current session from state\n */\nfunction getCurrentSessionFromState(\n state: AiSliceState,\n): AnalysisSessionSchema | undefined {\n const {currentSessionId, sessions} = state.ai.config;\n return sessions.find((session) => session.id === currentSessionId);\n}\n\nexport function useStoreWithAi<\n T,\n PC extends BaseRoomConfig,\n S extends RoomState<PC> & AiSliceState,\n>(selector: (state: S) => T): T {\n return useBaseRoomStore<PC, RoomState<PC>, T>((state) =>\n selector(state as unknown as S),\n );\n}\n"]}
1
+ {"version":3,"file":"AiSlice.js","sourceRoot":"","sources":["../src/AiSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {\n AiSliceConfig,\n AnalysisResultSchema,\n AnalysisSessionSchema,\n createDefaultAiConfig,\n} from '@sqlrooms/ai-config';\nimport {\n BaseRoomConfig,\n createSlice,\n useBaseRoomStore,\n type StateCreator,\n} from '@sqlrooms/room-store';\nimport {DefaultChatTransport, LanguageModel, UIMessage} from 'ai';\nimport {produce} from 'immer';\n\nimport {OpenAssistantToolSet} from '@openassistant/utils';\nimport {\n createChatHandlers,\n createLocalChatTransportFactory,\n createRemoteChatTransportFactory,\n} from './chatTransport';\nimport {hasAiSettingsConfig} from './hasAiSettingsConfig';\n\n// Custom type for onChatToolCall that includes addToolResult\ntype ExtendedChatOnToolCallCallback = (args: {\n toolCall: any;\n addToolResult?: any;\n}) => Promise<any> | any;\n\nexport type AiSliceState = {\n ai: {\n config: AiSliceConfig;\n analysisPrompt: string;\n isRunningAnalysis: boolean;\n tools: OpenAssistantToolSet;\n analysisAbortController?: AbortController;\n setConfig: (config: AiSliceConfig) => void;\n setAnalysisPrompt: (prompt: string) => void;\n addAnalysisResult: (message: UIMessage) => void;\n startAnalysis: (\n sendMessage: (message: {text: string}) => void,\n ) => Promise<void>;\n cancelAnalysis: () => void;\n setAiModel: (modelProvider: string, model: string) => void;\n createSession: (\n name?: string,\n modelProvider?: string,\n model?: string,\n ) => void;\n switchSession: (sessionId: string) => void;\n renameSession: (sessionId: string, name: string) => void;\n deleteSession: (sessionId: string) => void;\n getCurrentSession: () => AnalysisSessionSchema | undefined;\n setSessionUiMessages: (sessionId: string, uiMessages: UIMessage[]) => void;\n setSessionToolAdditionalData: (\n sessionId: string,\n toolCallId: string,\n additionalData: unknown,\n ) => void;\n getAnalysisResults: () => AnalysisResultSchema[];\n deleteAnalysisResult: (sessionId: string, resultId: string) => void;\n getAssistantMessageParts: (analysisResultId: string) => UIMessage['parts'];\n findToolComponent: (toolName: string) => React.ComponentType | undefined;\n getApiKeyFromSettings: () => string;\n getBaseUrlFromSettings: () => string | undefined;\n getMaxStepsFromSettings: () => number;\n getFullInstructions: () => string;\n // Chat transport for useChat hook\n getLocalChatTransport: () => DefaultChatTransport<UIMessage>;\n /** Optional remote endpoint to use for chat; if empty, local transport is used */\n chatEndPoint: string;\n chatHeaders: Record<string, string>;\n getRemoteChatTransport: (\n endpoint: string,\n headers?: Record<string, string>,\n ) => DefaultChatTransport<UIMessage>;\n onChatToolCall: ExtendedChatOnToolCallCallback;\n onChatData: (dataPart: any) => void;\n onChatFinish: (args: {\n message: UIMessage;\n messages: UIMessage[];\n isError?: boolean;\n }) => void;\n onChatError: (error: unknown) => void;\n };\n};\n\n/**\n * Configuration options for creating an AI slice\n */\nexport interface AiSliceOptions {\n config?: Partial<AiSliceConfig>;\n /** Initial prompt to display in the analysis input */\n initialAnalysisPrompt?: string;\n /** Tools to add to the AI assistant */\n tools: OpenAssistantToolSet;\n\n /**\n * Function to get custom instructions for the AI assistant\n * @returns The instructions string to use\n */\n getInstructions: () => string;\n defaultProvider?: string;\n defaultModel?: string;\n /** Provide a pre-configured model client for a provider (e.g., Azure). */\n getCustomModel?: () => LanguageModel | undefined;\n maxSteps?: number;\n getApiKey?: (modelProvider: string) => string;\n getBaseUrl?: () => string;\n /** Optional remote endpoint to use for chat; if empty, local transport is used */\n chatEndPoint?: string;\n /** Optional headers to send with remote endpoint */\n chatHeaders?: Record<string, string>;\n}\n\nexport function createAiSlice<PC extends BaseRoomConfig>(\n params: AiSliceOptions,\n): StateCreator<AiSliceState> {\n const {\n initialAnalysisPrompt = '',\n tools,\n getApiKey,\n getBaseUrl,\n maxSteps = 50,\n getInstructions,\n defaultProvider = 'openai',\n defaultModel = 'gpt-4.1',\n getCustomModel,\n chatEndPoint = '',\n chatHeaders = {},\n } = params;\n\n return createSlice<AiSliceState>((set, get, store) => {\n return {\n ai: {\n config: createDefaultAiConfig(params.config),\n analysisPrompt: initialAnalysisPrompt,\n isRunningAnalysis: false,\n tools,\n\n setConfig: (config: AiSliceConfig) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.config = config;\n }),\n );\n },\n\n setAnalysisPrompt: (prompt: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.analysisPrompt = prompt;\n }),\n );\n },\n\n /**\n * Set the AI model for the current session\n * @param model - The model to set\n */\n setAiModel: (modelProvider: string, model: string) => {\n set((state) =>\n produce(state, (draft) => {\n const currentSession = getCurrentSessionFromState(draft);\n if (currentSession) {\n currentSession.modelProvider = modelProvider;\n currentSession.model = model;\n }\n }),\n );\n },\n\n /**\n * Get the current active session\n */\n getCurrentSession: () => {\n const state = get();\n const {currentSessionId, sessions} = state.ai.config;\n return sessions.find((session) => session.id === currentSessionId);\n },\n\n /**\n * Create a new session with the given name and model settings\n */\n createSession: (\n name?: string,\n modelProvider?: string,\n model?: string,\n ) => {\n const currentSession = get().ai.getCurrentSession();\n const newSessionId = createId();\n\n // Generate a default name if none is provided\n let sessionName = name;\n if (!sessionName) {\n // Generate a human-readable date and time for the session name\n const now = new Date();\n const formattedDate = now.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n const formattedTime = now.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: 'numeric',\n hour12: true,\n });\n sessionName = `Session ${formattedDate} at ${formattedTime}`;\n }\n\n set((state) =>\n produce(state, (draft) => {\n // Add to AI sessions\n draft.ai.config.sessions.unshift({\n id: newSessionId,\n name: sessionName,\n modelProvider:\n modelProvider || currentSession?.modelProvider || 'openai',\n model: model || currentSession?.model || 'gpt-4.1',\n analysisResults: [],\n createdAt: new Date(),\n uiMessages: [],\n toolAdditionalData: {},\n messagesRevision: 0,\n });\n draft.ai.config.currentSessionId = newSessionId;\n }),\n );\n },\n\n /**\n * Switch to a different session\n */\n switchSession: (sessionId: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.config.currentSessionId = sessionId;\n }),\n );\n },\n\n /**\n * Rename an existing session\n */\n renameSession: (sessionId: string, name: string) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n session.name = name;\n }\n }),\n );\n },\n\n /**\n * Delete a session\n */\n deleteSession: (sessionId: string) => {\n set((state) =>\n produce(state, (draft) => {\n const sessionIndex = draft.ai.config.sessions.findIndex(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (sessionIndex !== -1) {\n // Don't delete the last session\n if (draft.ai.config.sessions.length > 1) {\n draft.ai.config.sessions.splice(sessionIndex, 1);\n // If we deleted the current session, switch to another one\n if (draft.ai.config.currentSessionId === sessionId) {\n // Make sure there's at least one session before accessing its id\n if (draft.ai.config.sessions.length > 0) {\n const firstSession = draft.ai.config.sessions[0];\n if (firstSession) {\n draft.ai.config.currentSessionId = firstSession.id;\n }\n }\n }\n }\n }\n }),\n );\n },\n\n /**\n * Save the Ai SDK UI messages for a session\n */\n setSessionUiMessages: (sessionId: string, uiMessages: UIMessage[]) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n // store the latest UI messages from the chat hook\n // Create a deep copy to avoid read-only property issues\n session.uiMessages = JSON.parse(JSON.stringify(uiMessages));\n }\n }),\n );\n },\n\n /**\n * Save additional data for a session\n */\n setSessionToolAdditionalData: (\n sessionId: string,\n toolCallId: string,\n additionalData: unknown,\n ) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s) => s.id === sessionId,\n );\n if (session) {\n if (!session.toolAdditionalData) {\n session.toolAdditionalData = {};\n }\n session.toolAdditionalData[toolCallId] = additionalData;\n }\n }),\n );\n },\n\n findToolComponent: (toolName: string) => {\n return get().ai.tools[toolName]?.component as React.ComponentType;\n },\n\n getBaseUrlFromSettings: () => {\n // First try the getBaseUrl function if provided\n const baseUrlFromFunction = getBaseUrl?.();\n if (baseUrlFromFunction) {\n return baseUrlFromFunction;\n }\n\n // Fall back to settings\n const store = get();\n if (hasAiSettingsConfig(store)) {\n const currentSession = getCurrentSessionFromState(store);\n if (currentSession) {\n if (currentSession.modelProvider === 'custom') {\n const customModel = store.aiSettings.config.customModels.find(\n (m: {modelName: string}) =>\n m.modelName === currentSession.model,\n );\n return customModel?.baseUrl;\n }\n const provider =\n store.aiSettings.config.providers[currentSession.modelProvider];\n return provider?.baseUrl;\n }\n }\n return undefined;\n },\n\n getApiKeyFromSettings: () => {\n const store = get();\n const currentSession = getCurrentSessionFromState(store);\n if (currentSession) {\n // First try the getApiKey function if provided\n const apiKeyFromFunction = getApiKey?.(\n currentSession.modelProvider || 'openai',\n );\n if (apiKeyFromFunction) {\n return apiKeyFromFunction;\n }\n\n // Fall back to settings\n if (hasAiSettingsConfig(store)) {\n if (currentSession.modelProvider === 'custom') {\n const customModel = store.aiSettings.config.customModels.find(\n (m: {modelName: string}) =>\n m.modelName === currentSession.model,\n );\n return customModel?.apiKey || '';\n } else {\n const provider =\n store.aiSettings.config.providers?.[\n currentSession.modelProvider\n ];\n return provider?.apiKey || '';\n }\n }\n }\n return '';\n },\n\n getMaxStepsFromSettings: () => {\n const store = get();\n // First try the maxSteps parameter if provided\n if (maxSteps && Number.isFinite(maxSteps) && maxSteps > 0) {\n return maxSteps;\n }\n\n // Fall back to settings\n if (hasAiSettingsConfig(store)) {\n const settingsMaxSteps =\n store.aiSettings.config.modelParameters.maxSteps;\n if (Number.isFinite(settingsMaxSteps) && settingsMaxSteps > 0) {\n return settingsMaxSteps;\n }\n }\n return 50;\n },\n\n getFullInstructions: () => {\n const store = get();\n\n let instructions = getInstructions();\n\n // Fall back to settings\n if (hasAiSettingsConfig(store)) {\n // get additional instructions from settings\n const {additionalInstruction} =\n store.aiSettings.config.modelParameters;\n if (additionalInstruction) {\n instructions = `${instructions}\\n\\nAdditional Instructions:\\n\\n${additionalInstruction}`;\n }\n }\n return instructions;\n },\n\n /**\n * Start the analysis\n * TODO: how to pass the history analysisResults?\n */\n startAnalysis: async (\n sendMessage: (message: {text: string}) => void,\n ) => {\n const abortController = new AbortController();\n const currentSession = get().ai.getCurrentSession();\n\n if (!currentSession) {\n console.error('No current session found');\n return;\n }\n\n const promptText = get().ai.analysisPrompt;\n\n set((state) =>\n produce(state, (draft) => {\n draft.ai.analysisAbortController = abortController;\n draft.ai.isRunningAnalysis = true;\n\n // Add incomplete analysis result to session immediately for instant UI rendering\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === currentSession.id,\n );\n if (session) {\n // Add incomplete analysis result with a temporary ID\n // This will be updated in onChatFinish with the actual user message ID\n session.analysisResults.push({\n id: '__pending__',\n prompt: promptText,\n isCompleted: false,\n });\n }\n }),\n );\n\n // The pending analysis result will be updated in onChatFinish with the correct message ID\n sendMessage({text: promptText});\n },\n\n cancelAnalysis: () => {\n const currentSession = get().ai.getCurrentSession();\n set((state) =>\n produce(state, (draft) => {\n draft.ai.isRunningAnalysis = false;\n\n // Remove pending analysis result if it exists\n if (currentSession) {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === currentSession.id,\n );\n if (session) {\n const pendingIndex = session.analysisResults.findIndex(\n (result: AnalysisResultSchema) =>\n result.id === '__pending__',\n );\n if (pendingIndex !== -1) {\n session.analysisResults.splice(pendingIndex, 1);\n }\n }\n }\n }),\n );\n get().ai.analysisAbortController?.abort('Analysis cancelled');\n },\n\n /**\n * Get the assistant message parts for a given analysis result ID\n * @param analysisResultId - The ID of the analysis result (user message ID)\n * @returns Array of message parts from the assistant's response\n */\n getAssistantMessageParts: (analysisResultId: string) => {\n const currentSession = get().ai.getCurrentSession();\n if (!currentSession) return [];\n\n const uiMessages = currentSession.uiMessages as UIMessage[];\n // Find the user message with analysisResultId\n const userMessageIndex = uiMessages.findIndex(\n (msg) => msg.id === analysisResultId && msg.role === 'user',\n );\n if (userMessageIndex === -1) return [];\n\n // Find the next assistant message after this user message\n for (let i = userMessageIndex + 1; i < uiMessages.length; i++) {\n const msg = uiMessages[i];\n if (msg?.role === 'assistant') {\n return msg.parts;\n }\n if (msg?.role === 'user') {\n // Hit next user message without finding assistant response\n break;\n }\n }\n return [];\n },\n\n /**\n * Delete an analysis result from a session\n * - remove the corresponding prompt-response pair from uiMessages\n * - remove the associated toolAdditionalData\n */\n deleteAnalysisResult: (sessionId: string, resultId: string) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n session.analysisResults = session.analysisResults.filter(\n (r: AnalysisResultSchema) => r.id !== resultId,\n );\n // Remove corresponding prompt-response pair from uiMessages\n const uiMessages = session.uiMessages as UIMessage[];\n const userMessageIndex = uiMessages.findIndex(\n (msg) => msg.id === resultId && msg.role === 'user',\n );\n\n if (userMessageIndex !== -1) {\n // Find the next user message (or end of array) to determine response boundary\n let nextUserIndex = userMessageIndex + 1;\n const toolCallIdsToDelete: Set<string> = new Set();\n\n while (\n nextUserIndex < uiMessages.length &&\n uiMessages[nextUserIndex]?.role !== 'user'\n ) {\n const msg = uiMessages[nextUserIndex];\n // Extract toolCallId from message parts\n if (msg?.parts) {\n for (const part of msg.parts) {\n // Check for tool-* or dynamic-tool parts that have toolCallId\n if (\n 'toolCallId' in part &&\n typeof part.toolCallId === 'string'\n ) {\n toolCallIdsToDelete.add(part.toolCallId);\n }\n }\n }\n nextUserIndex++;\n }\n\n // Remove the user message and all assistant messages until the next user message\n session.uiMessages.splice(\n userMessageIndex,\n nextUserIndex - userMessageIndex,\n );\n\n // Increment messagesRevision to force useChat reset\n session.messagesRevision =\n (session.messagesRevision || 0) + 1;\n\n // Clean up toolAdditionalData for deleted messages\n if (session.toolAdditionalData) {\n // Remove data keyed by the toolCallId from the deleted messages\n toolCallIdsToDelete.forEach((toolCallId) => {\n if (session.toolAdditionalData![toolCallId]) {\n delete session.toolAdditionalData![toolCallId];\n }\n });\n }\n }\n }\n }),\n );\n },\n\n /**\n * Get analysis results for the current session by transforming UI messages\n * into structured analysis results (user prompt → AI response pairs).\n *\n * @returns Array of analysis results for the current session\n */\n getAnalysisResults: (): AnalysisResultSchema[] => {\n const currentSession = get().ai.getCurrentSession();\n if (!currentSession) return [];\n\n return currentSession.analysisResults;\n },\n\n /**\n * Add an analysis result to the current session\n * - add the message to the uiMessages\n * - add the analysis result to the analysisResults\n */\n addAnalysisResult: (message: UIMessage) => {\n const currentSession = get().ai.getCurrentSession();\n if (!currentSession) {\n console.error('No current session found');\n return;\n }\n set((state) =>\n produce(state, (draft) => {\n // Extract text content from message parts\n const textContent =\n message.parts\n ?.filter((part) => part.type === 'text')\n ?.map((part) => (part as {text: string}).text)\n ?.join('') || '';\n\n draft.ai.config.sessions\n .find((s: AnalysisSessionSchema) => s.id === currentSession?.id)\n ?.analysisResults.push({\n id: message.id,\n prompt: textContent,\n isCompleted: true,\n });\n }),\n );\n },\n\n // Chat transport configuration\n chatEndPoint,\n chatHeaders,\n\n getLocalChatTransport: () => {\n const state = get();\n return createLocalChatTransportFactory({\n store,\n defaultProvider: defaultProvider,\n defaultModel: defaultModel,\n apiKey: state.ai.getApiKeyFromSettings(),\n baseUrl: state.ai.getBaseUrlFromSettings(),\n getInstructions: () => store.getState().ai.getFullInstructions(),\n getCustomModel,\n })();\n },\n\n getRemoteChatTransport: (\n endpoint: string,\n headers?: Record<string, string>,\n ) =>\n createRemoteChatTransportFactory({\n store,\n defaultProvider,\n defaultModel,\n })(endpoint, headers),\n\n ...createChatHandlers({store}),\n },\n };\n });\n}\n\n/**\n * Helper function to get the current session from state\n */\nfunction getCurrentSessionFromState(\n state: AiSliceState,\n): AnalysisSessionSchema | undefined {\n const {currentSessionId, sessions} = state.ai.config;\n return sessions.find((session) => session.id === currentSessionId);\n}\n\nexport function useStoreWithAi<T>(selector: (state: AiSliceState) => T): T {\n return useBaseRoomStore<AiSliceState, T>((state) => selector(state));\n}\n"]}
@@ -1,11 +1,10 @@
1
- import { RoomState } from '@sqlrooms/room-store';
2
1
  import { AiSettingsSliceConfig } from '@sqlrooms/ai-config';
3
2
  /**
4
3
  * Helper function to type guard the store config if we have aiSettings
5
4
  * @param store
6
5
  * @returns
7
6
  */
8
- export declare function hasAiSettingsConfig<S extends RoomState<any>>(store: S): store is S & {
7
+ export declare function hasAiSettingsConfig<S extends object>(store: S): store is S & {
9
8
  aiSettings: {
10
9
  config: AiSettingsSliceConfig;
11
10
  };
@@ -1 +1 @@
1
- {"version":3,"file":"hasAiSettingsConfig.d.ts","sourceRoot":"","sources":["../src/hasAiSettingsConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAC,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,CAAC,EAC1D,KAAK,EAAE,CAAC,GACP,KAAK,IAAI,CAAC,GAAG;IAAC,UAAU,EAAE;QAAC,MAAM,EAAE,qBAAqB,CAAA;KAAC,CAAA;CAAC,CAQ5D"}
1
+ {"version":3,"file":"hasAiSettingsConfig.d.ts","sourceRoot":"","sources":["../src/hasAiSettingsConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAClD,KAAK,EAAE,CAAC,GACP,KAAK,IAAI,CAAC,GAAG;IAAC,UAAU,EAAE;QAAC,MAAM,EAAE,qBAAqB,CAAA;KAAC,CAAA;CAAC,CAQ5D"}
@@ -1 +1 @@
1
- {"version":3,"file":"hasAiSettingsConfig.js","sourceRoot":"","sources":["../src/hasAiSettingsConfig.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAQ;IAER,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,YAAY,IAAI,KAAK;QACrB,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;QAC1B,QAAQ,IAAI,KAAK,CAAC,UAAU;QAC5B,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAClC,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,GAAY;IAC5B,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC;AACjD,CAAC","sourcesContent":["import {RoomState} from '@sqlrooms/room-store';\nimport {AiSettingsSliceConfig} from '@sqlrooms/ai-config';\n\n/**\n * Helper function to type guard the store config if we have aiSettings\n * @param store\n * @returns\n */\nexport function hasAiSettingsConfig<S extends RoomState<any>>(\n store: S,\n): store is S & {aiSettings: {config: AiSettingsSliceConfig}} {\n return (\n isObject(store) &&\n 'aiSettings' in store &&\n isObject(store.aiSettings) &&\n 'config' in store.aiSettings &&\n isObject(store.aiSettings.config)\n );\n}\n\nfunction isObject(val: unknown): val is object {\n return typeof val === 'object' && val !== null;\n}\n"]}
1
+ {"version":3,"file":"hasAiSettingsConfig.js","sourceRoot":"","sources":["../src/hasAiSettingsConfig.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAQ;IAER,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,YAAY,IAAI,KAAK;QACrB,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;QAC1B,QAAQ,IAAI,KAAK,CAAC,UAAU;QAC5B,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAClC,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,GAAY;IAC5B,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC;AACjD,CAAC","sourcesContent":["import {AiSettingsSliceConfig} from '@sqlrooms/ai-config';\n\n/**\n * Helper function to type guard the store config if we have aiSettings\n * @param store\n * @returns\n */\nexport function hasAiSettingsConfig<S extends object>(\n store: S,\n): store is S & {aiSettings: {config: AiSettingsSliceConfig}} {\n return (\n isObject(store) &&\n 'aiSettings' in store &&\n isObject(store.aiSettings) &&\n 'config' in store.aiSettings &&\n isObject(store.aiSettings.config)\n );\n}\n\nfunction isObject(val: unknown): val is object {\n return typeof val === 'object' && val !== null;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqlrooms/ai-core",
3
- "version": "0.26.0-rc.3",
3
+ "version": "0.26.0-rc.5",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "module": "dist/index.js",
@@ -23,12 +23,12 @@
23
23
  "@ai-sdk/react": "^2.0.44",
24
24
  "@openassistant/utils": "1.0.0-alpha.0",
25
25
  "@paralleldrive/cuid2": "^2.2.2",
26
- "@sqlrooms/ai-config": "0.26.0-rc.3",
27
- "@sqlrooms/monaco-editor": "0.26.0-rc.3",
28
- "@sqlrooms/room-config": "0.26.0-rc.3",
29
- "@sqlrooms/room-store": "0.26.0-rc.3",
30
- "@sqlrooms/ui": "0.26.0-rc.3",
31
- "@sqlrooms/utils": "0.26.0-rc.3",
26
+ "@sqlrooms/ai-config": "0.26.0-rc.5",
27
+ "@sqlrooms/monaco-editor": "0.26.0-rc.5",
28
+ "@sqlrooms/room-config": "0.26.0-rc.5",
29
+ "@sqlrooms/room-store": "0.26.0-rc.5",
30
+ "@sqlrooms/ui": "0.26.0-rc.5",
31
+ "@sqlrooms/utils": "0.26.0-rc.5",
32
32
  "ai": "^5.0.44",
33
33
  "immer": "^10.1.1",
34
34
  "lucide-react": "^0.475.0",
@@ -48,5 +48,5 @@
48
48
  "typecheck": "tsc --noEmit",
49
49
  "typedoc": "typedoc"
50
50
  },
51
- "gitHead": "536764b2aa924e5bb6650fe0bc674113179ff444"
51
+ "gitHead": "dc1c3b765718c8748aa11cce3cc83f907d3e5963"
52
52
  }