2025-10-22 22:02:29 +02:00
|
|
|
import { ContentTypes, QueryKeys, Constants } from 'librechat-data-provider';
|
🎉 feat: Code Interpreter API and Agents Release (#4860)
* feat: Code Interpreter API & File Search Agent Uploads
chore: add back code files
wip: first pass, abstract key dialog
refactor: influence checkbox on key changes
refactor: update localization keys for 'execute code' to 'run code'
wip: run code button
refactor: add throwError parameter to loadAuthValues and getUserPluginAuthValue functions
feat: first pass, API tool calling
fix: handle missing toolId in callTool function and return 404 for non-existent tools
feat: show code outputs
fix: improve error handling in callTool function and log errors
fix: handle potential null value for filepath in attachment destructuring
fix: normalize language before rendering and prevent null return
fix: add loading indicator in RunCode component while executing code
feat: add support for conditional code execution in Markdown components
feat: attachments
refactor: remove bash
fix: pass abort signal to graph/run
refactor: debounce and rate limit tool call
refactor: increase debounce delay for execute function
feat: set code output attachments
feat: image attachments
refactor: apply message context
refactor: pass `partIndex`
feat: toolCall schema/model/methods
feat: block indexing
feat: get tool calls
chore: imports
chore: typing
chore: condense type imports
feat: get tool calls
fix: block indexing
chore: typing
refactor: update tool calls mapping to support multiple results
fix: add unique key to nav link for rendering
wip: first pass, tool call results
refactor: update query cache from successful tool call mutation
style: improve result switcher styling
chore: note on using \`.toObject()\`
feat: add agent_id field to conversation schema
chore: typing
refactor: rename agentMap to agentsMap for consistency
feat: Agent Name as chat input placeholder
chore: bump agents
📦 chore: update @langchain dependencies to latest versions to match agents package
📦 chore: update @librechat/agents dependency to version 1.8.0
fix: Aborting agent stream removes sender; fix(bedrock): completion removes preset name label
refactor: remove direct file parameter to use req.file, add `processAgentFileUpload` for image uploads
feat: upload menu
feat: prime message_file resources
feat: implement conversation access validation in chat route
refactor: remove file parameter from processFileUpload and use req.file instead
feat: add savedMessageIds set to track saved message IDs in BaseClient, to prevent unnecessary double-write to db
feat: prevent duplicate message saves by checking savedMessageIds in AgentController
refactor: skip legacy RAG API handling for agents
feat: add files field to convoSchema
refactor: update request type annotations from Express.Request to ServerRequest in file processing functions
feat: track conversation files
fix: resendFiles, addPreviousAttachments handling
feat: add ID validation for session_id and file_id in download route
feat: entity_id for code file uploads/downloads
fix: code file edge cases
feat: delete related tool calls
feat: add stream rate handling for LLM configuration
feat: enhance system content with attached file information
fix: improve error logging in resource priming function
* WIP: PoC, sequential agents
WIP: PoC Sequential Agents, first pass content data + bump agents package
fix: package-lock
WIP: PoC, o1 support, refactor bufferString
feat: convertJsonSchemaToZod
fix: form issues and schema defining erroneous model
fix: max length issue on agent form instructions, limit conversation messages to sequential agents
feat: add abort signal support to createRun function and AgentClient
feat: PoC, hide prior sequential agent steps
fix: update parameter naming from config to metadata in event handlers for clarity, add model to usage data
refactor: use only last contentData, track model for usage data
chore: bump agents package
fix: content parts issue
refactor: filter contentParts to include tool calls and relevant indices
feat: show function calls
refactor: filter context messages to exclude tool calls when no tools are available to the agent
fix: ensure tool call content is not undefined in formatMessages
feat: add agent_id field to conversationPreset schema
feat: hide sequential agents
feat: increase upload toast duration to 10 seconds
* refactor: tool context handling & update Code API Key Dialog
feat: toolContextMap
chore: skipSpecs -> useSpecs
ci: fix handleTools tests
feat: API Key Dialog
* feat: Agent Permissions Admin Controls
feat: replace label with button for prompt permission toggle
feat: update agent permissions
feat: enable experimental agents and streamline capability configuration
feat: implement access control for agents and enhance endpoint menu items
feat: add welcome message for agent selection in localization
feat: add agents permission to access control and update version to 0.7.57
* fix: update types in useAssistantListMap and useMentions hooks for better null handling
* feat: mention agents
* fix: agent tool resource race conditions when deleting agent tool resource files
* feat: add error handling for code execution with user feedback
* refactor: rename AdminControls to AdminSettings for clarity
* style: add gap to button in AdminSettings for improved layout
* refactor: separate agent query hooks and check access to enable fetching
* fix: remove unused provider from agent initialization options, creates issue with custom endpoints
* refactor: remove redundant/deprecated modelOptions from AgentClient processes
* chore: update @librechat/agents to version 1.8.5 in package.json and package-lock.json
* fix: minor styling issues + agent panel uniformity
* fix: agent edge cases when set endpoint is no longer defined
* refactor: remove unused cleanup function call from AppService
* fix: update link in ApiKeyDialog to point to pricing page
* fix: improve type handling and layout calculations in SidePanel component
* fix: add missing localization string for agent selection in SidePanel
* chore: form styling and localizations for upload filesearch/code interpreter
* fix: model selection placeholder logic in AgentConfig component
* style: agent capabilities
* fix: add localization for provider selection and improve dropdown styling in ModelPanel
* refactor: use gpt-4o-mini > gpt-3.5-turbo
* fix: agents configuration for loadDefaultInterface and update related tests
* feat: DALLE Agents support
2024-12-04 15:48:13 -05:00
|
|
|
import type { TMessage, TMessageContentParts } from 'librechat-data-provider';
|
2025-10-22 22:02:29 +02:00
|
|
|
import type { QueryClient } from '@tanstack/react-query';
|
2024-05-30 18:39:21 -04:00
|
|
|
|
2025-10-10 11:22:16 +03:00
|
|
|
export const TEXT_KEY_DIVIDER = '|||';
|
2024-05-30 18:39:21 -04:00
|
|
|
|
2024-09-10 12:56:19 -04:00
|
|
|
export const getLatestText = (message?: TMessage | null, includeIndex?: boolean): string => {
|
2024-05-30 18:39:21 -04:00
|
|
|
if (!message) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
if (message.text) {
|
|
|
|
|
return message.text;
|
|
|
|
|
}
|
2024-08-22 17:09:05 -04:00
|
|
|
if (message.content && message.content.length > 0) {
|
2024-05-30 18:39:21 -04:00
|
|
|
for (let i = message.content.length - 1; i >= 0; i--) {
|
🎉 feat: Code Interpreter API and Agents Release (#4860)
* feat: Code Interpreter API & File Search Agent Uploads
chore: add back code files
wip: first pass, abstract key dialog
refactor: influence checkbox on key changes
refactor: update localization keys for 'execute code' to 'run code'
wip: run code button
refactor: add throwError parameter to loadAuthValues and getUserPluginAuthValue functions
feat: first pass, API tool calling
fix: handle missing toolId in callTool function and return 404 for non-existent tools
feat: show code outputs
fix: improve error handling in callTool function and log errors
fix: handle potential null value for filepath in attachment destructuring
fix: normalize language before rendering and prevent null return
fix: add loading indicator in RunCode component while executing code
feat: add support for conditional code execution in Markdown components
feat: attachments
refactor: remove bash
fix: pass abort signal to graph/run
refactor: debounce and rate limit tool call
refactor: increase debounce delay for execute function
feat: set code output attachments
feat: image attachments
refactor: apply message context
refactor: pass `partIndex`
feat: toolCall schema/model/methods
feat: block indexing
feat: get tool calls
chore: imports
chore: typing
chore: condense type imports
feat: get tool calls
fix: block indexing
chore: typing
refactor: update tool calls mapping to support multiple results
fix: add unique key to nav link for rendering
wip: first pass, tool call results
refactor: update query cache from successful tool call mutation
style: improve result switcher styling
chore: note on using \`.toObject()\`
feat: add agent_id field to conversation schema
chore: typing
refactor: rename agentMap to agentsMap for consistency
feat: Agent Name as chat input placeholder
chore: bump agents
📦 chore: update @langchain dependencies to latest versions to match agents package
📦 chore: update @librechat/agents dependency to version 1.8.0
fix: Aborting agent stream removes sender; fix(bedrock): completion removes preset name label
refactor: remove direct file parameter to use req.file, add `processAgentFileUpload` for image uploads
feat: upload menu
feat: prime message_file resources
feat: implement conversation access validation in chat route
refactor: remove file parameter from processFileUpload and use req.file instead
feat: add savedMessageIds set to track saved message IDs in BaseClient, to prevent unnecessary double-write to db
feat: prevent duplicate message saves by checking savedMessageIds in AgentController
refactor: skip legacy RAG API handling for agents
feat: add files field to convoSchema
refactor: update request type annotations from Express.Request to ServerRequest in file processing functions
feat: track conversation files
fix: resendFiles, addPreviousAttachments handling
feat: add ID validation for session_id and file_id in download route
feat: entity_id for code file uploads/downloads
fix: code file edge cases
feat: delete related tool calls
feat: add stream rate handling for LLM configuration
feat: enhance system content with attached file information
fix: improve error logging in resource priming function
* WIP: PoC, sequential agents
WIP: PoC Sequential Agents, first pass content data + bump agents package
fix: package-lock
WIP: PoC, o1 support, refactor bufferString
feat: convertJsonSchemaToZod
fix: form issues and schema defining erroneous model
fix: max length issue on agent form instructions, limit conversation messages to sequential agents
feat: add abort signal support to createRun function and AgentClient
feat: PoC, hide prior sequential agent steps
fix: update parameter naming from config to metadata in event handlers for clarity, add model to usage data
refactor: use only last contentData, track model for usage data
chore: bump agents package
fix: content parts issue
refactor: filter contentParts to include tool calls and relevant indices
feat: show function calls
refactor: filter context messages to exclude tool calls when no tools are available to the agent
fix: ensure tool call content is not undefined in formatMessages
feat: add agent_id field to conversationPreset schema
feat: hide sequential agents
feat: increase upload toast duration to 10 seconds
* refactor: tool context handling & update Code API Key Dialog
feat: toolContextMap
chore: skipSpecs -> useSpecs
ci: fix handleTools tests
feat: API Key Dialog
* feat: Agent Permissions Admin Controls
feat: replace label with button for prompt permission toggle
feat: update agent permissions
feat: enable experimental agents and streamline capability configuration
feat: implement access control for agents and enhance endpoint menu items
feat: add welcome message for agent selection in localization
feat: add agents permission to access control and update version to 0.7.57
* fix: update types in useAssistantListMap and useMentions hooks for better null handling
* feat: mention agents
* fix: agent tool resource race conditions when deleting agent tool resource files
* feat: add error handling for code execution with user feedback
* refactor: rename AdminControls to AdminSettings for clarity
* style: add gap to button in AdminSettings for improved layout
* refactor: separate agent query hooks and check access to enable fetching
* fix: remove unused provider from agent initialization options, creates issue with custom endpoints
* refactor: remove redundant/deprecated modelOptions from AgentClient processes
* chore: update @librechat/agents to version 1.8.5 in package.json and package-lock.json
* fix: minor styling issues + agent panel uniformity
* fix: agent edge cases when set endpoint is no longer defined
* refactor: remove unused cleanup function call from AppService
* fix: update link in ApiKeyDialog to point to pricing page
* fix: improve type handling and layout calculations in SidePanel component
* fix: add missing localization string for agent selection in SidePanel
* chore: form styling and localizations for upload filesearch/code interpreter
* fix: model selection placeholder logic in AgentConfig component
* style: agent capabilities
* fix: add localization for provider selection and improve dropdown styling in ModelPanel
* refactor: use gpt-4o-mini > gpt-3.5-turbo
* fix: agents configuration for loadDefaultInterface and update related tests
* feat: DALLE Agents support
2024-12-04 15:48:13 -05:00
|
|
|
const part = message.content[i] as TMessageContentParts | undefined;
|
|
|
|
|
if (part && part.type !== ContentTypes.TEXT) {
|
2024-09-10 12:56:19 -04:00
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-06 17:30:16 -04:00
|
|
|
const text = (typeof part?.text === 'string' ? part.text : part?.text?.value) ?? '';
|
2024-09-10 12:56:19 -04:00
|
|
|
if (text.length > 0) {
|
2024-08-22 17:09:05 -04:00
|
|
|
if (includeIndex === true) {
|
2024-07-20 01:51:59 -04:00
|
|
|
return `${text}-${i}`;
|
|
|
|
|
} else {
|
|
|
|
|
return text;
|
|
|
|
|
}
|
🚧 chore: merge latest dev build to main repo (#3844)
* agents - phase 1 (#30)
* chore: copy assistant files
* feat: frontend and data-provider
* feat: backend get endpoint test
* fix(MessageEndpointIcon): switched to AgentName and AgentAvatar
* fix: small fixes
* fix: agent endpoint config
* fix: show Agent Builder
* chore: install agentus
* chore: initial scaffolding for agents
* fix: updated Assistant logic to Agent Logic for some Agent components
* WIP first pass, demo of agent package
* WIP: initial backend infra for agents
* fix: agent list error
* wip: agents routing
* chore: Refactor useSSE hook to handle different data events
* wip: correctly emit events
* chore: Update @librechat/agentus npm dependency to version 1.0.9
* remove comment
* first pass: streaming agent text
* chore: Remove @librechat/agentus root-level workspace npm dependency
* feat: Agent Schema and Model
* fix: content handling fixes
* fix: content message save
* WIP: new content data
* fix: run step issue with tool calls
* chore: Update @librechat/agentus npm dependency to version 1.1.5
* feat: update controller and agent routes
* wip: initial backend tool and tool error handling support
* wip: tool chunks
* chore: Update @librechat/agentus npm dependency to version 1.1.7
* chore: update tool_call typing, add test conditions and logs
* fix: create agent
* fix: create agent
* first pass: render completed content parts
* fix: remove logging, fix step handler typing
* chore: Update @librechat/agentus npm dependency to version 1.1.9
* refactor: cleanup maps on unmount
* chore: Update BaseClient.js to safely count tokens for string, number, and boolean values
* fix: support subsequent messages with tool_calls
* chore: export order
* fix: select agent
* fix: tool call types and handling
* chore: switch to anthropic for testing
* fix: AgentSelect
* refactor: experimental: OpenAIClient to use array for intermediateReply
* fix(useSSE): revert old condition for streaming legacy client tokens
* fix: lint
* revert `agent_id` to `id`
* chore: update localization keys for agent-related components
* feat: zod schema handling for actions
* refactor(actions): if no params, no zodSchema
* chore: Update @librechat/agentus npm dependency to version 1.2.1
* feat: first pass, actions
* refactor: empty schema for actions without params
* feat: Update createRun function to accept additional options
* fix: message payload formatting; feat: add more client options
* fix: ToolCall component rendering when action has no args but has output
* refactor(ToolCall): allow non-stringy args
* WIP: first pass, correctly formatted tool_calls between providers
* refactor: Remove duplicate import of 'roles' module
* refactor: Exclude 'vite.config.ts' from TypeScript compilation
* refactor: fix agent related types
> - no need to use endpoint/model fields for identifying agent metadata
> - add `provider` distinction for agent-configured 'endpoint'
- no need for agent-endpoint map
- reduce complexity of tools as functions into tools as string[]
- fix types related to above changes
- reduce unnecessary variables for queries/mutations and corresponding react-query keys
* refactor: Add tools and tool_kwargs fields to agent schema
* refactor: Remove unused code and update dependencies
* refactor: Update updateAgentHandler to use req.body directly
* refactor: Update AgentSelect component to use localized hooks
* refactor: Update agent schema to include tools and provider fields
* refactor(AgentPanel): add scrollbar gutter, add provider field to form, fix agent schema required values
* refactor: Update AgentSwitcher component to use selectedAgentId instead of selectedAgent
* refactor: Update AgentPanel component to include alternateName import and defaultAgentFormValues
* refactor(SelectDropDown): allow setting value as option while still supporting legacy usage (string values only)
* refactor: SelectDropdown changes - Only necessary when the available values are objects with label/value fields and the selected value is expected to be a string.
* refactor: TypeError issues and handle provider as option
* feat: Add placeholder for provider selection in AgentPanel component
* refactor: Update agent schema to include author and provider fields
* fix: show expected 'create agent' placeholder when creating agent
* chore: fix localization strings, hide capabilities form for now
* chore: typing
* refactor: import order and use compact agents schema for now
* chore: typing
* refactor: Update AgentForm type to use AgentCapabilities
* fix agent form agent selection issues
* feat: responsive agent selection
* fix: Handle cancelled fetch in useSelectAgent hook
* fix: reset agent form on accordion close/open
* feat: Add agent_id to default conversation for agents endpoint
* feat: agents endpoint request handling
* refactor: reset conversation model on agent select
* refactor: add `additional_instructions` to conversation schema, organize other fields
* chore: casing
* chore: types
* refactor(loadAgentTools): explicitly pass agent_id, do not pass `model` to loadAgentTools for now, load action sets by agent_id
* WIP: initial draft of real agent client initialization
* WIP: first pass, anthropic agent requests
* feat: remember last selected agent
* feat: openai and azure connected
* fix: prioritize agent model for runs unless an explicit override model is passed from client
* feat: Agent Actions
* fix: save agent id to convo
* feat: model panel (#29)
* feat: model panel
* bring back comments
* fix: method still null
* fix: AgentPanel FormContext
* feat: add more parameters
* fix: style issues; refactor: Agent Controller
* fix: cherry-pick
* fix: Update AgentAvatar component to use AssistantIcon instead of BrainCircuit
* feat: OGDialog for delete agent; feat(assistant): update Agent types, introduced `model_parameters`
* feat: icon and general `model_parameters` update
* feat: use react-hook-form better
* fix: agent builder form reset issue when switching panels
* refactor: modularize agent builder form
---------
Co-authored-by: Danny Avila <danny@librechat.ai>
* fix: AgentPanel and ModelPanel type issues and use `useFormContext` and `watch` instead of `methods` directly and `useWatch`.
* fix: tool call issues due to invalid input (anthropic) of empty string
* fix: handle empty text in Part component
---------
Co-authored-by: Marco Beretta <81851188+berry-13@users.noreply.github.com>
* refactor: remove form ModelPanel and fixed nested ternary expressions in AgentConfig
* fix: Model Parameters not saved correctly
* refactor: remove console log
* feat: avatar upload and get for Agents (#36)
Co-authored-by: Marco Beretta <81851188+berry-13@users.noreply.github.com>
* chore: update to public package
* fix: typing, optional chaining
* fix: cursor not showing for content parts
* chore: conditionally enable agents
* ci: fix azure test
* ci: fix frontend tests, fix eslint api
* refactor: Remove unused errorContentPart variable
* continue of the agent message PR (#40)
* last fixes
* fix: agentMap
* pr merge test (#41)
* fix: model icon not fetching correctly
* remove console logs
* feat: agent name
* refactor: pass documentsMap as a prop to allow re-render of assistant form
* refactor: pass documentsMap as a prop to allow re-render of assistant form
* chore: Bump version to 0.7.419
* fix: TypeError: Cannot read properties of undefined (reading 'id')
* refactor: update AgentSwitcher component to use ControlCombobox instead of Combobox
---------
Co-authored-by: Marco Beretta <81851188+berry-13@users.noreply.github.com>
2024-08-31 16:33:51 -04:00
|
|
|
} else {
|
|
|
|
|
continue;
|
2024-05-30 18:39:21 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return '';
|
|
|
|
|
};
|
2024-07-20 01:51:59 -04:00
|
|
|
|
2024-09-10 19:00:27 -04:00
|
|
|
export const getAllContentText = (message?: TMessage | null): string => {
|
|
|
|
|
if (!message) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (message.text) {
|
|
|
|
|
return message.text;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (message.content && message.content.length > 0) {
|
|
|
|
|
return message.content
|
|
|
|
|
.filter((part) => part.type === ContentTypes.TEXT)
|
2025-10-06 17:30:16 -04:00
|
|
|
.map((part) => {
|
|
|
|
|
if (!('text' in part)) return '';
|
|
|
|
|
const text = part.text;
|
|
|
|
|
if (typeof text === 'string') return text;
|
|
|
|
|
return text?.value || '';
|
|
|
|
|
})
|
2024-09-10 19:00:27 -04:00
|
|
|
.filter((text) => text.length > 0)
|
|
|
|
|
.join('\n');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return '';
|
|
|
|
|
};
|
|
|
|
|
|
2025-10-10 11:22:16 +03:00
|
|
|
const getLatestContentForKey = (message: TMessage): string => {
|
|
|
|
|
const formatText = (str: string, index: number): string => {
|
|
|
|
|
if (str.length === 0) {
|
|
|
|
|
return '0';
|
|
|
|
|
}
|
|
|
|
|
const length = str.length;
|
|
|
|
|
const lastChars = str.slice(-16);
|
|
|
|
|
return `${length}${TEXT_KEY_DIVIDER}${lastChars}${TEXT_KEY_DIVIDER}${index}`;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (message.text) {
|
|
|
|
|
return formatText(message.text, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!message.content || message.content.length === 0) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (let i = message.content.length - 1; i >= 0; i--) {
|
|
|
|
|
const part = message.content[i] as TMessageContentParts | undefined;
|
|
|
|
|
if (!part?.type) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const type = part.type;
|
|
|
|
|
let text = '';
|
|
|
|
|
|
|
|
|
|
// Handle THINK type - extract think content
|
|
|
|
|
if (type === ContentTypes.THINK && 'think' in part) {
|
|
|
|
|
text = typeof part.think === 'string' ? part.think : (part.think?.value ?? '');
|
|
|
|
|
}
|
|
|
|
|
// Handle TEXT type
|
|
|
|
|
else if (type === ContentTypes.TEXT && 'text' in part) {
|
|
|
|
|
text = typeof part.text === 'string' ? part.text : (part.text?.value ?? '');
|
|
|
|
|
}
|
|
|
|
|
// Handle ERROR type
|
|
|
|
|
else if (type === ContentTypes.ERROR && 'error' in part) {
|
|
|
|
|
text = String(part.error || 'err').slice(0, 30);
|
|
|
|
|
}
|
|
|
|
|
// Handle TOOL_CALL - use simple marker with type
|
|
|
|
|
else if (type === ContentTypes.TOOL_CALL && 'tool_call' in part) {
|
|
|
|
|
const tcType = part.tool_call?.type || 'x';
|
|
|
|
|
const tcName = String(part.tool_call?.['name'] || 'unknown').slice(0, 20);
|
|
|
|
|
const tcArgs = String(part.tool_call?.['args'] || 'none').slice(0, 20);
|
|
|
|
|
const tcOutput = String(part.tool_call?.['output'] || 'none').slice(0, 20);
|
|
|
|
|
text = `tc_${tcType}_${tcName}_${tcArgs}_${tcOutput}`;
|
|
|
|
|
}
|
|
|
|
|
// Handle IMAGE_FILE - use simple marker with file_id suffix
|
|
|
|
|
else if (type === ContentTypes.IMAGE_FILE && 'image_file' in part) {
|
|
|
|
|
const fileId = part.image_file?.file_id || 'x';
|
|
|
|
|
text = `if_${fileId.slice(-8)}`;
|
|
|
|
|
}
|
|
|
|
|
// Handle IMAGE_URL - use simple marker
|
|
|
|
|
else if (type === ContentTypes.IMAGE_URL) {
|
|
|
|
|
text = 'iu';
|
|
|
|
|
}
|
|
|
|
|
// Handle AGENT_UPDATE - use simple marker with agentId suffix
|
|
|
|
|
else if (type === ContentTypes.AGENT_UPDATE && 'agent_update' in part) {
|
|
|
|
|
const agentId = String(part.agent_update?.agentId || 'x').slice(0, 30);
|
|
|
|
|
text = `au_${agentId}`;
|
|
|
|
|
} else {
|
|
|
|
|
text = type;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (text.length > 0) {
|
|
|
|
|
return formatText(text, i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return '';
|
|
|
|
|
};
|
|
|
|
|
|
2024-07-20 01:51:59 -04:00
|
|
|
export const getTextKey = (message?: TMessage | null, convoId?: string | null) => {
|
|
|
|
|
if (!message) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
2025-10-10 11:22:16 +03:00
|
|
|
const contentKey = getLatestContentForKey(message);
|
|
|
|
|
return `${(message.messageId as string | null) ?? ''}${TEXT_KEY_DIVIDER}${contentKey}${TEXT_KEY_DIVIDER}${message.conversationId ?? convoId}`;
|
2024-07-20 01:51:59 -04:00
|
|
|
};
|
2024-08-08 14:52:12 -04:00
|
|
|
|
2024-08-18 19:02:46 -04:00
|
|
|
export const scrollToEnd = (callback?: () => void) => {
|
2024-08-09 15:17:13 -04:00
|
|
|
const messagesEndElement = document.getElementById('messages-end');
|
|
|
|
|
if (messagesEndElement) {
|
|
|
|
|
messagesEndElement.scrollIntoView({ behavior: 'instant' });
|
2024-08-18 19:02:46 -04:00
|
|
|
if (callback) {
|
|
|
|
|
callback();
|
|
|
|
|
}
|
2024-08-09 15:17:13 -04:00
|
|
|
}
|
2024-08-08 14:52:12 -04:00
|
|
|
};
|
2025-10-22 22:02:29 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Clears messages for both the specified conversation ID and the NEW_CONVO query key.
|
|
|
|
|
* This ensures that messages are properly cleared in all contexts, preventing stale data
|
|
|
|
|
* from persisting in the NEW_CONVO cache.
|
|
|
|
|
*
|
|
|
|
|
* @param queryClient - The React Query client instance
|
|
|
|
|
* @param conversationId - The conversation ID to clear messages for
|
|
|
|
|
*/
|
|
|
|
|
export const clearMessagesCache = (
|
|
|
|
|
queryClient: QueryClient,
|
|
|
|
|
conversationId: string | undefined | null,
|
|
|
|
|
): void => {
|
|
|
|
|
const convoId = conversationId ?? Constants.NEW_CONVO;
|
|
|
|
|
|
|
|
|
|
// Clear messages for the current conversation
|
|
|
|
|
queryClient.setQueryData<TMessage[]>([QueryKeys.messages, convoId], []);
|
|
|
|
|
|
|
|
|
|
// Also clear NEW_CONVO messages if we're not already on NEW_CONVO
|
|
|
|
|
if (convoId !== Constants.NEW_CONVO) {
|
|
|
|
|
queryClient.setQueryData<TMessage[]>([QueryKeys.messages, Constants.NEW_CONVO], []);
|
|
|
|
|
}
|
|
|
|
|
};
|