问题描述: AI 回答问题后,消息列表没有自动滚动到底部,导致看不到回复。
原因分析:
_scrollToBottom()方法只在用户发送消息时调用- AI 回复消息时没有触发自动滚动机制
解决方案:
- 在
ChatProvider中添加滚动回调机制 - 在
_updateOrAddMessage方法中自动触发滚动 - 实现智能滚动:只在用户接近底部时才自动滚动(避免干扰用户查看历史消息)
修改文件:
lib/presentation/providers/chat_provider.dart: 添加滚动回调lib/presentation/pages/chat_page.dart: 设置滚动回调和智能滚动逻辑
问题描述: 需要确认消息接口是否需要发送历史消息。
分析结果: 不需要发送历史消息
依据:
POST /session/:id/message
body matches ChatInput, returns Message
export const ChatInput = z.object({
sessionID: Identifier.schema("session"),
messageID: Identifier.schema("message").optional(),
providerID: z.string(),
modelID: z.string(),
agent: z.string().optional(),
system: z.string().optional(),
tools: z.record(z.boolean()).optional(),
parts: z.array([...]) // 只包含当前消息的 parts
})- 服务器端维护上下文: OpenCode 服务器会自动维护会话上下文
- sessionID 机制: 通过 sessionID 关联历史对话
- 无历史消息字段: ChatInput 接口中没有历史消息相关字段
- TUI 实现验证: TUI 代码中也只发送当前消息,不包含历史
我们的 Flutter 应用当前实现是正确的:
final input = ChatInput(
messageId: messageId,
providerId: _selectedProviderId ?? 'anthropic',
modelId: _selectedModelId ?? 'claude-3-5-sonnet-20241022',
agent: 'general',
system: '',
tools: const {},
parts: [TextInputPart(text: text)], // 只发送当前消息
);- 会话创建: 通过
POST /session创建会话,获得 sessionID - 消息发送: 每次只发送当前消息到
POST /session/:id/message - 上下文维护: 服务器根据 sessionID 自动维护对话历史
- 消息获取: 通过
GET /session/:id/message获取完整历史
- 减少网络传输: 不需要每次都发送完整历史
- 降低客户端复杂度: 客户端无需管理上下文
- 提高性能: 减少请求体大小,提升响应速度
- 服务器端优化: 服务器可以更好地管理和优化上下文
当前的聊天 API 实现完全正确,符合 OpenCode 的设计理念。两个问题都已经得到妥善解决:
- ✅ 自动滚动功能已实现,支持智能滚动
- ✅ 消息 API 不需要发送历史消息,当前实现正确
应用现在可以正常进行聊天对话,AI 回复后会自动滚动到底部显示最新消息。