Преглед на файлове

fix: 隐藏思考与工具消息操作

samien преди 2 месеца
родител
ревизия
de00daf4e5
променени са 3 файла, в които са добавени 9 реда и са изтрити 2 реда
  1. 5 1
      src/client/components/messages/MessageTimeline.vue
  2. 3 1
      tests/e2e/workspace.spec.ts
  3. 1 0
      tests/fixtures/fake-hermes.mjs

+ 5 - 1
src/client/components/messages/MessageTimeline.vue

@@ -104,6 +104,10 @@ async function copyMessage(message: UiMessage) {
   await navigator.clipboard.writeText(message.content)
 }
 
+function hasConversationActions(message: UiMessage): boolean {
+  return message.role === 'user' || (message.role === 'assistant' && Boolean(message.content.trim()))
+}
+
 watch(() => props.messages.length, async () => {
   if (!pinnedToBottom.value) return
   await nextTick()
@@ -214,7 +218,7 @@ defineExpose({ scrollToMessage, scrollToBottom })
 
             <p v-if="message.error" class="message__error"><AppIcon name="alert" :size="13" />{{ message.error }}</p>
 
-            <div class="message__actions">
+            <div v-if="hasConversationActions(message)" class="message__actions">
               <time v-if="message.role === 'assistant' && !showAssistantIdentity && message.createdAt" class="message__action-time">{{ formatTime(message.createdAt) }}</time>
               <button type="button" title="复制" aria-label="复制消息" @click="copyMessage(message)"><AppIcon name="copy" :size="13" /></button>
               <button type="button" title="引用" aria-label="引用消息" @click="emit('quote', message)"><AppIcon name="quote" :size="13" /></button>

+ 3 - 1
tests/e2e/workspace.spec.ts

@@ -76,7 +76,7 @@ test('renders historical assistant MEDIA as Markdown in chat and group chat', as
 
 test('folds tool result rows into their expandable tool call', async ({ page }) => {
   await page.goto('/chat/session-demo')
-  const tool = page.getByRole('button', { name: /file_search/ })
+  const tool = page.locator('[data-message-id="message-tool-call"]').getByRole('button', { name: /file_search/ })
   await expect(tool).toBeVisible()
   await tool.click()
   await expect(page.locator('.tool-trace pre')).toContainText('/tmp/demo-report.pdf')
@@ -117,6 +117,8 @@ test('keeps the canonical logo and yaoyao-webui composer geometry', async ({ pag
   await expect(page.locator('.message--assistant .message__avatar')).toHaveCount(0)
   await expect(page.locator('.message--assistant .message__meta')).toHaveCount(0)
   await expect(page.locator('.message--assistant-anonymous:not(.message--tool-only) .message__action-time').first()).toBeVisible()
+  await expect(page.locator('.message--tool-only .message__actions')).toHaveCount(0)
+  await expect(page.locator('[data-message-id="message-thinking-tool"] .message__actions')).toHaveCount(0)
   await expect(page.locator('.message--user .message__meta')).toHaveCSS('display', 'none')
   await expect(page.getByRole('button', { name: '会话操作' })).toBeVisible()
   await page.getByRole('button', { name: '会话操作' }).click()

+ 1 - 0
tests/fixtures/fake-hermes.mjs

@@ -41,6 +41,7 @@ const sessions = [
 ]
 const messages = [
   { id: 'message-user', role: 'user', content: '请检查今天生成的产物。MEDIA:/brand/AppIcon-1024.png', timestamp: now() - 180 },
+  { id: 'message-thinking-tool', role: 'assistant', content: '', reasoning_content: '先检索文件,再归纳结果。', tool_calls: [{ id: 'tool-thinking', type: 'function', function: { name: 'file_search', arguments: '{"query":"产物"}' } }], timestamp: now() - 177 },
   { id: 'message-tool-call', role: 'assistant', content: '', tool_calls: [{ id: 'tool-1', type: 'function', function: { name: 'file_search', arguments: '{"query":"产物"}' } }], timestamp: now() - 176 },
   { id: 'message-tool', role: 'tool', tool_name: 'file_search', tool_call_id: 'tool-1', summary: '扫描产物目录', result: { path: '/tmp/demo-report.pdf', count: 1 }, timestamp: now() - 175 },
   { id: 'message-assistant', role: 'assistant', content: '已整理完成。下面是 **验收摘要**:\n\n- 普通聊天已连接\n- 群聊 v2 已就绪\n- [打开报告](https://example.com/report)', reasoning_content: '先核对会话与文件索引。', timestamp: now() - 170 },