mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-19 01:40:15 +01:00
💬 feat: assistant conversation starter (#3699)
* feat: initial UI convoStart
* fix: ConvoStarter UI
* fix: convoStarters bug
* feat: Add input field focus on conversation starters
* style: conversation starter UI update
* feat: apply fixes for starters
* style: update conversationStarters UI and fixed typo
* general UI update
* feat: Add onClick functionality to ConvoStarter component
* fix: quick fix test
* fix(AssistantSelect): remove object check
* fix: updateAssistant `conversation_starters` var
* chore: remove starter autofocus
* fix: no empty conversation starters, always show input, use Constants value for max count
* style: Update defaultTextPropsLabel styles, for a11y placeholder
* refactor: Update ConvoStarter component styles and class names for a11y and theme
* refactor: convostarter, move plus button to within persistent element
* fix: types
* chore: Update landing page assistant description styling with theming
* chore: assistant types
* refactor: documents routes
* refactor: optimize conversation starter mutations/queries
* refactor: Update listAllAssistants return type to Promise<Array<Assistant>>
* feat: edit existing starters
* feat(convo-starters): enhance ConvoStarter component and add animations
- Update ConvoStarter component styling for better visual appeal
- Implement fade-in animation for smoother appearance
- Add hover effect with background color change
- Improve text overflow handling with line-clamp and text-balance
- Ensure responsive design for various screen sizes
* feat(assistant): add conversation starters to assistant builder
- Add localization strings for conversation starters
- Update mobile.css with shake animation for max starters reached
- Enhance user experience with tooltips and dynamic input handling
* refactor: select specific fields for assistant documents fetch
* refactor: remove endpoint query key, fetch all assistant docs for now, add conversation_starters to v1 methods
* refactor: add document filters based on endpoint config
* fix: starters not applied during creation
* refactor: update AssistantSelect component to handle undefined lastSelectedModels
---------
Co-authored-by: Danny Avila <danny@librechat.ai>
This commit is contained in:
parent
63b80c3067
commit
79f9cd5a4d
58 changed files with 602 additions and 214 deletions
|
|
@ -14,6 +14,7 @@ import type { FunctionTool, TConfig, TPlugin } from 'librechat-data-provider';
|
|||
import type { AssistantForm, AssistantPanelProps } from '~/common';
|
||||
import { useCreateAssistantMutation, useUpdateAssistantMutation } from '~/data-provider';
|
||||
import { cn, cardStyle, defaultTextProps, removeFocusOutlines } from '~/utils';
|
||||
import AssistantConversationStarters from './AssistantConversationStarters';
|
||||
import { useAssistantsMapContext, useToastContext } from '~/Providers';
|
||||
import { useSelectAssistant, useLocalize } from '~/hooks';
|
||||
import { ToolSelectDialog } from '~/components/Tools';
|
||||
|
|
@ -31,7 +32,7 @@ import { Panel } from '~/common';
|
|||
const labelClass = 'mb-2 text-token-text-primary block font-medium';
|
||||
const inputClass = cn(
|
||||
defaultTextProps,
|
||||
'flex w-full px-3 py-2 dark:border-gray-800 dark:bg-gray-800',
|
||||
'flex w-full px-3 py-2 dark:border-gray-800 dark:bg-gray-800 rounded-xl mb-2',
|
||||
removeFocusOutlines,
|
||||
);
|
||||
|
||||
|
|
@ -106,6 +107,7 @@ export default function AssistantPanel({
|
|||
});
|
||||
},
|
||||
});
|
||||
|
||||
const create = useCreateAssistantMutation({
|
||||
onSuccess: (data) => {
|
||||
setCurrentAssistantId(data.id);
|
||||
|
|
@ -139,7 +141,7 @@ export default function AssistantPanel({
|
|||
return functionName;
|
||||
} else {
|
||||
const assistant = assistantMap?.[endpoint]?.[assistant_id];
|
||||
const tool = assistant?.tools.find((tool) => tool.function?.name === functionName);
|
||||
const tool = assistant?.tools?.find((tool) => tool.function?.name === functionName);
|
||||
if (assistant && tool) {
|
||||
return tool;
|
||||
}
|
||||
|
|
@ -148,7 +150,6 @@ export default function AssistantPanel({
|
|||
return functionName;
|
||||
});
|
||||
|
||||
console.log(data);
|
||||
if (data.code_interpreter) {
|
||||
tools.push({ type: Tools.code_interpreter });
|
||||
}
|
||||
|
|
@ -163,6 +164,7 @@ export default function AssistantPanel({
|
|||
name,
|
||||
description,
|
||||
instructions,
|
||||
conversation_starters: starters,
|
||||
model,
|
||||
// file_ids, // TODO: add file handling here
|
||||
} = data;
|
||||
|
|
@ -174,6 +176,7 @@ export default function AssistantPanel({
|
|||
name,
|
||||
description,
|
||||
instructions,
|
||||
conversation_starters: starters.filter((starter) => starter.trim() !== ''),
|
||||
model,
|
||||
tools,
|
||||
endpoint,
|
||||
|
|
@ -186,6 +189,7 @@ export default function AssistantPanel({
|
|||
name,
|
||||
description,
|
||||
instructions,
|
||||
conversation_starters: starters.filter((starter) => starter.trim() !== ''),
|
||||
model,
|
||||
tools,
|
||||
endpoint,
|
||||
|
|
@ -239,12 +243,12 @@ export default function AssistantPanel({
|
|||
</button>
|
||||
)}
|
||||
</div>
|
||||
<div className="h-auto bg-white px-4 pb-8 pt-3 dark:bg-transparent">
|
||||
<div className="bg-surface-50 h-auto px-4 pb-8 pt-3 dark:bg-transparent">
|
||||
{/* Avatar & Name */}
|
||||
<div className="mb-4">
|
||||
<AssistantAvatar
|
||||
createMutation={create}
|
||||
assistant_id={assistant_id ?? null}
|
||||
assistant_id={assistant_id}
|
||||
metadata={assistant['metadata'] ?? null}
|
||||
endpoint={endpoint}
|
||||
version={version}
|
||||
|
|
@ -271,7 +275,7 @@ export default function AssistantPanel({
|
|||
name="id"
|
||||
control={control}
|
||||
render={({ field }) => (
|
||||
<p className="h-3 text-xs italic text-text-secondary">{field.value ?? ''}</p>
|
||||
<p className="h-3 text-xs italic text-text-secondary">{field.value}</p>
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
|
|
@ -318,6 +322,23 @@ export default function AssistantPanel({
|
|||
)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Conversation Starters */}
|
||||
<div className="relative mb-6">
|
||||
{/* the label of conversation starters is in the component */}
|
||||
<Controller
|
||||
name="conversation_starters"
|
||||
control={control}
|
||||
defaultValue={[]}
|
||||
render={({ field }) => (
|
||||
<AssistantConversationStarters
|
||||
field={field}
|
||||
inputClass={inputClass}
|
||||
labelClass={labelClass}
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
{/* Model */}
|
||||
<div className="mb-6">
|
||||
<label className={labelClass} htmlFor="model">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue