feat: 更新前端页面

- Agents, Chat, Skill 页面
- useSkills composable
- package.json 更新

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-11 16:26:10 +08:00
parent 715dc14b38
commit 243a190124
6 changed files with 541 additions and 260 deletions

View File

@@ -1,6 +1,8 @@
<script setup lang="ts">
import { ref, nextTick } from 'vue'
const API_BASE = 'http://localhost:8082'
interface ChatMessage {
id: number
role: 'user' | 'assistant'
@@ -158,31 +160,43 @@ const sendMessage = async () => {
nextTick(() => scrollToBottom())
isLoading.value = true
const fullResponse = `我理解你发送了消息: "${userContent}"
作为 AI 助手,我可以帮助你:
• 回答各种问题
• 编写代码和调试
• 分析和处理数据
• 翻译和写作
• 头脑风暴和创意建议
try {
// 调用后端 API
const response = await fetch(`${API_BASE}/api/agent/chat`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
agent_id: selectedAgent.value?.id || 1,
message: userContent,
}),
})
请告诉我你需要什么帮助?`
const data = await response.json()
const fullResponse = data.reply || data.response || 'No response'
let currentIndex = 0
const words = fullResponse.split('')
// 流式显示回复
let currentIndex = 0
const words = fullResponse.split('')
const streamInterval = setInterval(() => {
if (currentIndex < words.length) {
aiMessage.content += words[currentIndex]
currentIndex++
nextTick(() => scrollToBottom())
} else {
clearInterval(streamInterval)
aiMessage.isStreaming = false
isLoading.value = false
}
}, 30)
const streamInterval = setInterval(() => {
if (currentIndex < words.length) {
aiMessage.content += words[currentIndex]
currentIndex++
nextTick(() => scrollToBottom())
} else {
clearInterval(streamInterval)
aiMessage.isStreaming = false
isLoading.value = false
}
}, 30)
} catch (error: any) {
aiMessage.content = `Error: ${error.message || 'Failed to send message'}`
aiMessage.isStreaming = false
isLoading.value = false
}
}
// 滚动到底部