feat: add undo functionality to agent prompt generation (#5821)

* feat: add undo functionality to agent prompt generation

* feat: add a standalone undo button
This commit is contained in:
saica.go 2025-05-12 21:48:53 +08:00 committed by GitHub
parent 657c3148cb
commit 5200dcfef6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,6 +1,6 @@
import 'emoji-picker-element' import 'emoji-picker-element'
import { CheckOutlined, LoadingOutlined, ThunderboltOutlined } from '@ant-design/icons' import { CheckOutlined, LoadingOutlined, ThunderboltOutlined, RollbackOutlined } from '@ant-design/icons'
import EmojiPicker from '@renderer/components/EmojiPicker' import EmojiPicker from '@renderer/components/EmojiPicker'
import { TopView } from '@renderer/components/TopView' import { TopView } from '@renderer/components/TopView'
import { AGENT_PROMPT } from '@renderer/config/prompts' import { AGENT_PROMPT } from '@renderer/config/prompts'
@ -38,6 +38,8 @@ const PopupContainer: React.FC<Props> = ({ resolve }) => {
const formRef = useRef<FormInstance>(null) const formRef = useRef<FormInstance>(null)
const [emoji, setEmoji] = useState('') const [emoji, setEmoji] = useState('')
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
const [showUndoButton, setShowUndoButton] = useState(false)
const [originalPrompt, setOriginalPrompt] = useState('')
const [tokenCount, setTokenCount] = useState(0) const [tokenCount, setTokenCount] = useState(0)
const knowledgeState = useAppSelector((state) => state.knowledge) const knowledgeState = useAppSelector((state) => state.knowledge)
const showKnowledgeIcon = useSidebarIconShow('knowledge') const showKnowledgeIcon = useSidebarIconShow('knowledge')
@ -98,7 +100,7 @@ const PopupContainer: React.FC<Props> = ({ resolve }) => {
resolve(null) resolve(null)
} }
const handleButtonClick = async () => { const handleGenerateButtonClick = async () => {
const name = formRef.current?.getFieldValue('name') const name = formRef.current?.getFieldValue('name')
const content = formRef.current?.getFieldValue('prompt') const content = formRef.current?.getFieldValue('prompt')
const promptText = content || name const promptText = content || name
@ -112,6 +114,7 @@ const PopupContainer: React.FC<Props> = ({ resolve }) => {
} }
setLoading(true) setLoading(true)
setShowUndoButton(false)
try { try {
const generatedText = await fetchGenerate({ const generatedText = await fetchGenerate({
@ -119,6 +122,8 @@ const PopupContainer: React.FC<Props> = ({ resolve }) => {
content: promptText content: promptText
}) })
form.setFieldsValue({ prompt: generatedText }) form.setFieldsValue({ prompt: generatedText })
setShowUndoButton(true)
setOriginalPrompt(content)
} catch (error) { } catch (error) {
console.error('Error fetching data:', error) console.error('Error fetching data:', error)
} }
@ -126,6 +131,11 @@ const PopupContainer: React.FC<Props> = ({ resolve }) => {
setLoading(false) setLoading(false)
} }
const handleUndoButtonClick = async () => {
form.setFieldsValue({ prompt: originalPrompt })
setShowUndoButton(false)
}
// Compute label width based on the longest label // Compute label width based on the longest label
const labelWidth = [t('agents.add.name'), t('agents.add.prompt'), t('agents.add.knowledge_base')] const labelWidth = [t('agents.add.name'), t('agents.add.prompt'), t('agents.add.knowledge_base')]
.map((labelText) => stringWidth(labelText) * 8) .map((labelText) => stringWidth(labelText) * 8)
@ -155,6 +165,7 @@ const PopupContainer: React.FC<Props> = ({ resolve }) => {
if (changedValues.prompt) { if (changedValues.prompt) {
const count = await estimateTextTokens(changedValues.prompt) const count = await estimateTextTokens(changedValues.prompt)
setTokenCount(count) setTokenCount(count)
setShowUndoButton(false)
} }
}}> }}>
<Form.Item name="name" label="Emoji"> <Form.Item name="name" label="Emoji">
@ -176,10 +187,15 @@ const PopupContainer: React.FC<Props> = ({ resolve }) => {
<TokenCount>Tokens: {tokenCount}</TokenCount> <TokenCount>Tokens: {tokenCount}</TokenCount>
<Button <Button
icon={loading ? <LoadingOutlined /> : <ThunderboltOutlined />} icon={loading ? <LoadingOutlined /> : <ThunderboltOutlined />}
onClick={handleButtonClick} onClick={handleGenerateButtonClick}
style={{ position: 'absolute', top: 8, right: 8 }} style={{ position: 'absolute', top: 8, right: 8 }}
disabled={loading} disabled={loading}
/> />
{showUndoButton && <Button
icon={<RollbackOutlined />}
onClick={handleUndoButtonClick}
style={{ position: 'absolute', top: 8, right: 48 }}
/>}
</div> </div>
{showKnowledgeIcon && ( {showKnowledgeIcon && (
<Form.Item name="knowledge_base_ids" label={t('agents.add.knowledge_base')} rules={[{ required: false }]}> <Form.Item name="knowledge_base_ids" label={t('agents.add.knowledge_base')} rules={[{ required: false }]}>