Modified the prompt part Modified the minapp data part
This commit is contained in:
parent
66210d1d2e
commit
cb068d71ca
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -29,5 +29,6 @@
|
||||
},
|
||||
"[markdown]": {
|
||||
"files.trimTrailingWhitespace": false
|
||||
}
|
||||
},
|
||||
"i18n-ally.localesPaths": ["src/renderer/src/i18n"]
|
||||
}
|
||||
|
||||
@ -90,7 +90,7 @@
|
||||
"remark-math": "^6.0.0",
|
||||
"sass": "^1.77.2",
|
||||
"styled-components": "^6.1.11",
|
||||
"typescript": "^5.3.3",
|
||||
"typescript": "^5.6.2",
|
||||
"uuid": "^10.0.0",
|
||||
"vite": "^5.0.12"
|
||||
},
|
||||
|
||||
@ -40,6 +40,7 @@ export function createMainWindow() {
|
||||
}
|
||||
})
|
||||
|
||||
mainWindow.webContents.openDevTools()
|
||||
mainWindowState.manage(mainWindow)
|
||||
|
||||
mainWindow.webContents.on('context-menu', () => {
|
||||
|
||||
@ -1,8 +1,10 @@
|
||||
import 'emoji-picker-element'
|
||||
|
||||
import { LoadingOutlined, ThunderboltOutlined } from '@ant-design/icons'
|
||||
import EmojiPicker from '@renderer/components/EmojiPicker'
|
||||
import { TopView } from '@renderer/components/TopView'
|
||||
import { useAgents } from '@renderer/hooks/useAgents'
|
||||
import { fetchGenerate } from '@renderer/services/api'
|
||||
import { syncAgentToAssistant } from '@renderer/services/assistant'
|
||||
import { Agent } from '@renderer/types'
|
||||
import { getLeadingEmoji, uuid } from '@renderer/utils'
|
||||
@ -29,6 +31,8 @@ const PopupContainer: React.FC<Props> = ({ agent, resolve }) => {
|
||||
const { addAgent, updateAgent } = useAgents()
|
||||
const formRef = useRef<FormInstance>(null)
|
||||
const [emoji, setEmoji] = useState(agent?.emoji)
|
||||
const [content, setContent] = useState('')
|
||||
const [loading, setLoading] = useState(false)
|
||||
|
||||
const onFinish = (values: FieldType) => {
|
||||
const _emoji = emoji || getLeadingEmoji(values.name)
|
||||
@ -81,6 +85,20 @@ const PopupContainer: React.FC<Props> = ({ agent, resolve }) => {
|
||||
}
|
||||
}, [agent, form])
|
||||
|
||||
const handleButtonClick = async () => {
|
||||
const prompt = `你是一个专业的prompt优化助手,我会给你一段prompt,你需要帮我优化它,仅回复优化后的prompt不要添加任何解释,使用[CRISPE提示框架]回复。`
|
||||
setLoading(true)
|
||||
try {
|
||||
const prefixedContent = `请帮我优化下面这段prompt,使用CRISPE提示框架,请使用Markdown格式回复: ${content}`
|
||||
const generatedText = await fetchGenerate({ prompt, content: prefixedContent })
|
||||
setContent(generatedText)
|
||||
} catch (error) {
|
||||
console.error('Error fetching data:', error)
|
||||
} finally {
|
||||
setLoading(false)
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Modal
|
||||
title={agent ? t('agents.edit.title') : t('agents.add.title')}
|
||||
@ -108,7 +126,24 @@ const PopupContainer: React.FC<Props> = ({ agent, resolve }) => {
|
||||
<Input placeholder={t('agents.add.name.placeholder')} spellCheck={false} allowClear />
|
||||
</Form.Item>
|
||||
<Form.Item name="prompt" label={t('agents.add.prompt')} rules={[{ required: true }]}>
|
||||
<TextArea placeholder={t('agents.add.prompt.placeholder')} spellCheck={false} rows={10} />
|
||||
<div style={{ position: 'relative' }}>
|
||||
<TextArea
|
||||
placeholder={t('agents.add.prompt.placeholder')}
|
||||
spellCheck={false}
|
||||
rows={10}
|
||||
value={content}
|
||||
onChange={(e) => setContent(e.target.value)}
|
||||
/>
|
||||
<Button
|
||||
icon={loading ? <LoadingOutlined /> : <ThunderboltOutlined />}
|
||||
style={{
|
||||
position: 'absolute',
|
||||
top: 8,
|
||||
right: 8
|
||||
}}
|
||||
onClick={handleButtonClick}
|
||||
disabled={loading}></Button>
|
||||
</div>
|
||||
</Form.Item>
|
||||
</Form>
|
||||
</Modal>
|
||||
|
||||
@ -4,23 +4,50 @@ import { Center } from '@renderer/components/Layout'
|
||||
import { getAllMinApps } from '@renderer/config/minapp'
|
||||
import { Empty, Input } from 'antd'
|
||||
import { isEmpty } from 'lodash'
|
||||
import { FC, useState } from 'react'
|
||||
import { FC, useEffect, useState } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import styled from 'styled-components'
|
||||
|
||||
import App from './App'
|
||||
|
||||
const list = getAllMinApps()
|
||||
// 定义应用的类型
|
||||
interface AppType {
|
||||
id: string // 确保 id 是 string 类型
|
||||
name: string
|
||||
url: string
|
||||
logo: string
|
||||
sortOrder?: number // 可选属性
|
||||
}
|
||||
|
||||
const AppsPage: FC = () => {
|
||||
const { t } = useTranslation()
|
||||
const [search, setSearch] = useState('')
|
||||
const [apps, setApps] = useState<AppType[]>([]) // 使用定义的类型
|
||||
|
||||
const apps = search
|
||||
? list.filter(
|
||||
useEffect(() => {
|
||||
const list = getAllMinApps()
|
||||
const processedList: AppType[] = list.map((app, index) => {
|
||||
// 为每个应用添加 id 和排序编号
|
||||
const id = app.id ? String(app.id) : app.name.toLowerCase() // 确保 id 是字符串
|
||||
return {
|
||||
...app,
|
||||
id,
|
||||
sortOrder: index + 1 // 排序编号从 1 开始
|
||||
}
|
||||
})
|
||||
|
||||
// 存储到本地存储
|
||||
localStorage.setItem('minApps', JSON.stringify(processedList))
|
||||
|
||||
// 更新状态
|
||||
setApps(processedList)
|
||||
}, [])
|
||||
|
||||
const filteredApps = search
|
||||
? apps.filter(
|
||||
(app) => app.name.toLowerCase().includes(search.toLowerCase()) || app.url.includes(search.toLowerCase())
|
||||
)
|
||||
: list
|
||||
: apps
|
||||
|
||||
return (
|
||||
<Container>
|
||||
@ -42,10 +69,10 @@ const AppsPage: FC = () => {
|
||||
</Navbar>
|
||||
<ContentContainer>
|
||||
<AppsContainer>
|
||||
{apps.map((app) => (
|
||||
<App key={app.name} app={app} />
|
||||
{filteredApps.map((app) => (
|
||||
<App key={app.id} app={app} />
|
||||
))}
|
||||
{isEmpty(apps) && (
|
||||
{isEmpty(filteredApps) && (
|
||||
<Center style={{ flex: 1 }}>
|
||||
<Empty />
|
||||
</Center>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user