Skip to content

feat: add topic AI chat - #405

Open
jo32 wants to merge 3 commits into
BugenZhao:mainfrom
jo32:codex/topic-ai-chat-upstream
Open

feat: add topic AI chat#405
jo32 wants to merge 3 commits into
BugenZhao:mainfrom
jo32:codex/topic-ai-chat-upstream

Conversation

@jo32

@jo32 jo32 commented Aug 7, 2026

Copy link
Copy Markdown

功能概述

  • 新增可复用的 OpenAI 兼容 ChatSDK,支持流式回复、结构化工具调用、工具执行边界控制,以及由钥匙串保护的 API 凭据
  • 在帖子详情中新增可调整高度的 AI 聊天面板,以当前已加载的帖子快照作为稳定上下文;关闭再打开面板时保留会话,并从流式输出开始持续渲染 Markdown,避免结束时发生布局切换
  • 提供只读的 MNGA 领域工具,包括帖子与版块搜索、帖子详情加载、版块帖子与热门帖子列表、用户查询,以及用户主题和回复历史;工具参数、结果和执行状态均可展开查看
  • 优化提示缓存:保持稳定前缀、生成确定性缓存键、支持服务商缓存断点、展示缓存 Token,并在兼容服务不支持扩展参数时自动降级;同时适配 DeepSeek 的自动上下文缓存和工具调用行为
  • 只有当前保存的 Base URL、模型和 API Key 组合通过连接测试后,其他 AI 功能入口才会显示;修改配置后需要重新测试

设计原因

NGA 的长帖通常包含大量楼层,适合通过交互式总结和追问来阅读。将聊天传输、流式解析和工具循环整理为独立 ChatSDK,可以让这套能力在后续其他页面复用;帖子聊天层只负责提供当前帖子的领域上下文与只读工具。

连接验证门禁可以避免在服务尚不可用时展示无法工作的入口。API Key 始终存储在钥匙串中,连接测试日志会对敏感内容进行脱敏。

用户体验

用户可以在设置中填写任意 OpenAI 兼容接口并发送一个小请求进行验证。验证并保存成功后,帖子页面会显示 AI 聊天入口。助手首先使用当前已加载楼层作为上下文,必要时可通过带有可见调用痕迹的只读工具查询更多公开 MNGA 数据。

聊天以可调整高度的 Action Sheet 呈现;会话在同一帖子详情生命周期内保留,切换帖子后清空。回复支持流式 Markdown,工具调用可展开查看参数、结果、状态、耗时和复用次数。

安全与边界

  • API Key 存储在 Keychain,不会写入日志或仓库
  • AI 入口绑定到已验证配置的指纹,Base URL、模型或 Key 发生变化后不会复用旧验证状态
  • 仅注册读取类 MNGA 工具,不向 AI 暴露发帖、回复、关注等写操作
  • 限制工具调用轮数、参数结构和结果大小,并在单次回复中复用完全相同的调用

验证

  • make tuist
  • make logic-sim
  • xcodebuild -workspace app/MNGA.xcworkspace -scheme MNGA -configuration Debug -destination "platform=iOS Simulator,id=57E8D85B-28E1-4E28-BA6B-F9406FBFE511" ONLY_ACTIVE_ARCH=YES CODE_SIGNING_ALLOWED=NO build
  • plutil -lint app/Shared/Localization/zh-Hans.lproj/Localizable.strings
  • 扫描已提交的 App 源码,确认没有包含 API Key

已执行 make swiftformat,但当前本地环境未安装 SwiftFormat,因此该步骤由项目脚本自动跳过。

@jo32

jo32 commented Aug 7, 2026

Copy link
Copy Markdown
Author
image

@jo32
jo32 marked this pull request as ready for review August 8, 2026 16:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant