# 停止生成功能修复文档
## 问题描述
1. **按钮点击无效**:确认/停止按钮点击没有响应
2. **停止逻辑不生效**:即使调用了 `stopGeneration()`,流式输出仍在继续
## 参考实现
参考了 Cherry Studio 中的 **PAUSED** 状态设计理念。
## 修复内容
### 1. 修复按钮点击事件绑定
**问题**:原代码使用三元表达式直接绑定函数引用
```vue
@click="store.state.isSending ? handleStopGeneration : handleSendMessage"
```
**修复**:改为调用统一的处理函数
```vue
@click="handleButtonClick"
```
```typescript
const handleButtonClick = () => {
if (store.state.isSending) {
handleStopGeneration()
} else {
handleSendMessage()
}
}
```
### 2. 添加 PAUSED 消息状态
**文件**:`web/src/types/chat.ts`
```typescript
// 添加 'paused' 状态
export type MessageStatus = 'pending' | 'sending' | 'success' | 'error' | 'paused'
// 添加 'paused' 事件类型
export interface StreamEvent {
type: 'start' | 'delta' | 'end' | 'error' | 'paused'
// ...
}
```
### 3. 优化错误处理逻辑
**文件**:`web/src/services/chatService.ts`
```typescript
catch (error) {
const isAborted = error instanceof Error && error.name === 'AbortError'
if (isAborted) {
// 用户主动停止,保留已生成的内容
assistantMessage.status = 'paused'
assistantMessage.error = undefined
onChunk({ type: 'paused', messageId: assistantMessage.id })
} else {
// 其他错误
assistantMessage.status = 'error'
assistantMessage.error = error instanceof Error ? error.message : '发送失败'
onChunk({ type: 'error', error: assistantMessage.error, messageId: assistantMessage.id })
}
}
```
### 4. 在流式读取中检查中止信号
**文件**:`web/src/services/modelServiceManager.ts`
```typescript
while (true) {
// 检查是否被中止
if (signal?.aborted) {
console.log('🛑 [makeChatRequestStream] 检测到中止信号,停止读取流')
reader.cancel()
throw new DOMException('用户中止操作', 'AbortError')
}
const { done, value } = await reader.read()
if (done) break
// ... 处理数据
}
```
### 5. UI 显示优化
**文件**:`web/src/components/Chat/ChatLayout.vue`
```vue