From c40554c03b6915438b9c48c5f34cf922b606a43c Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Thu, 18 Sep 2025 21:05:43 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=8F=AA=20fix:=20Template=20for=20Chats=20?= =?UTF-8?q?Starting=20from=20Agent=20Marketplace=20(#9702)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: correctly build conversation template and preset for chats starting from marketplace * test: enhance AgentDetail tests with additional localization and conversation mocks --- client/src/components/Agents/AgentDetail.tsx | 29 ++++++++++++------- .../Agents/tests/AgentDetail.spec.tsx | 18 ++++++++++-- client/src/locales/en/translation.json | 1 + 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/client/src/components/Agents/AgentDetail.tsx b/client/src/components/Agents/AgentDetail.tsx index f4588fed8..3cbfe330c 100644 --- a/client/src/components/Agents/AgentDetail.tsx +++ b/client/src/components/Agents/AgentDetail.tsx @@ -11,9 +11,9 @@ import { AgentListResponse, } from 'librechat-data-provider'; import type t from 'librechat-data-provider'; +import { useLocalize, useDefaultConvo } from '~/hooks'; import { useChatContext } from '~/Providers'; import { renderAgentAvatar } from '~/utils'; -import { useLocalize } from '~/hooks'; interface SupportContact { name?: string; @@ -34,11 +34,11 @@ interface AgentDetailProps { */ const AgentDetail: React.FC = ({ agent, isOpen, onClose }) => { const localize = useLocalize(); - // const navigate = useNavigate(); - const { conversation, newConversation } = useChatContext(); + const queryClient = useQueryClient(); const { showToast } = useToastContext(); const dialogRef = useRef(null); - const queryClient = useQueryClient(); + const getDefaultConversation = useDefaultConvo(); + const { conversation, newConversation } = useChatContext(); /** * Navigate to chat with the selected agent @@ -62,13 +62,22 @@ const AgentDetail: React.FC = ({ agent, isOpen, onClose }) => ); queryClient.invalidateQueries([QueryKeys.messages]); + /** Template with agent configuration */ + const template = { + conversationId: Constants.NEW_CONVO as string, + endpoint: EModelEndpoint.agents, + agent_id: agent.id, + title: localize('com_agents_chat_with', { name: agent.name || localize('com_ui_agent') }), + }; + + const currentConvo = getDefaultConversation({ + conversation: { ...(conversation ?? {}), ...template }, + preset: template, + }); + newConversation({ - template: { - conversationId: Constants.NEW_CONVO as string, - endpoint: EModelEndpoint.agents, - agent_id: agent.id, - title: `Chat with ${agent.name || 'Agent'}`, - }, + template: currentConvo, + preset: template, }); } }; diff --git a/client/src/components/Agents/tests/AgentDetail.spec.tsx b/client/src/components/Agents/tests/AgentDetail.spec.tsx index 54fa764a8..833405c1e 100644 --- a/client/src/components/Agents/tests/AgentDetail.spec.tsx +++ b/client/src/components/Agents/tests/AgentDetail.spec.tsx @@ -20,6 +20,7 @@ jest.mock('react-router-dom', () => ({ jest.mock('~/hooks', () => ({ useMediaQuery: jest.fn(() => false), // Mock as desktop by default useLocalize: jest.fn(), + useDefaultConvo: jest.fn(), })); jest.mock('@librechat/client', () => ({ @@ -47,7 +48,12 @@ const mockWriteText = jest.fn(); const mockNavigate = jest.fn(); const mockShowToast = jest.fn(); -const mockLocalize = jest.fn((key: string) => key); +const mockLocalize = jest.fn((key: string, values?: Record) => { + if (key === 'com_agents_chat_with' && values?.name) { + return `Chat with ${values.name}`; + } + return key; +}); const mockAgent: t.Agent = { id: 'test-agent-id', @@ -106,8 +112,12 @@ describe('AgentDetail', () => { (useNavigate as jest.Mock).mockReturnValue(mockNavigate); const { useToastContext } = require('@librechat/client'); (useToastContext as jest.Mock).mockReturnValue({ showToast: mockShowToast }); - const { useLocalize } = require('~/hooks'); + const { useLocalize, useDefaultConvo } = require('~/hooks'); (useLocalize as jest.Mock).mockReturnValue(mockLocalize); + (useDefaultConvo as jest.Mock).mockReturnValue(() => ({ + conversationId: Constants.NEW_CONVO, + endpoint: EModelEndpoint.agents, + })); // Mock useChatContext const { useChatContext } = require('~/Providers'); @@ -227,6 +237,10 @@ describe('AgentDetail', () => { template: { conversationId: Constants.NEW_CONVO, endpoint: EModelEndpoint.agents, + }, + preset: { + conversationId: Constants.NEW_CONVO, + endpoint: EModelEndpoint.agents, agent_id: 'test-agent-id', title: 'Chat with Test Agent', }, diff --git a/client/src/locales/en/translation.json b/client/src/locales/en/translation.json index c5f71be49..cc27ef246 100644 --- a/client/src/locales/en/translation.json +++ b/client/src/locales/en/translation.json @@ -9,6 +9,7 @@ "com_agents_all_category": "All", "com_agents_all_description": "Browse all shared agents across all categories", "com_agents_by_librechat": "by LibreChat", + "com_agents_chat_with": "Chat with {{name}}", "com_agents_category_aftersales": "After Sales", "com_agents_category_aftersales_description": "Agents specialized in post-sale support, maintenance, and customer service", "com_agents_category_empty": "No agents found in the {{category}} category",