# begin_one **Repository Path**: yangsj/begin_one ## Basic Information - **Project Name**: begin_one - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-11-11 - **Last Updated**: 2026-11-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # BeginOne 客服平台 管理后台 UI 与前端工程约定见 [WEB 管理后台规范](FRONTEND.md)(WEB-ADMIN-UI-1.0,视觉参考 begin_product)。 多平台客服工作台。首期接入**闲鱼**(网页版),后续可扩展其他平台。买家消息自动入库,从关联商品的知识文本匹配回复;默认生成草稿人工审核,可开启自动发送。代码遵循 BeginPython 项目开发规范(BizMemory 业务域 20)。 ## 功能 - **商品列表**:维护原始商品标题、介绍、多张图片和知识文本;图片支持上传本地文件(jpg/png/webp/gif,单张不超过10MB,最多20张)或填写 HTTP(S) 地址,统一保存在 `tb_product.images`;上传根目录可在设置页配置,新文件按 `YYYY/MM` 保存。知识直接保存在 `tb_product.knowledge TEXT NOT NULL DEFAULT ''`,没有独立知识条目 - 商品页采用表格列表,依次展示本地商品编码、封面图片、名字、关联平台及操作;平台按实际有效关联去重展示,同平台多商品显示数量,未关联时明确提示。商品页保留搜索、分页、编辑和删除;同步入口位于平台商品页,窄屏在表格区域横向滚动。 - 商品列表/编辑中的图片点击在浮层画廊展示,支持上一张/下一张、左右方向键、Escape/关闭按钮及遮罩关闭,关闭后恢复触发控件焦点;不再点击图片另开浏览器标签页。 - 平台商品页支持关键词服务端查询(原始商品编码/名称、平台商品编码/标题)、所属平台筛选、Enter查询、重置与分页;同步按钮和同步进度统一放在平台商品页,完成时刷新当前筛选结果,切页后停止前端进度轮询但不取消后台任务。 - **同步闲鱼商品**:在平台商品页一键后台浏览当前登录账号发布的商品,按闲鱼编码新增/更新,采集链接、原始封面、描述和详情图,保留本系统商品知识;详情受验证限制时明确标为部分同步 - **平台商品**:同一原始商品可关联多个平台商品,仅保存双方标识、平台侧标题和所属平台;原始标题实时关联读取,不复制图片、介绍和知识文本 - **智能客服**:闲鱼监听默认关闭,在页面开启后立即开始采集并按间隔轮询;关闭后停止后续采集,与自动发送独立 - **自动回复记录**:智能客服页展示每条买家消息进入自动回复处理后的结果(已自动发送/知识草稿/调用失败/已跳过),跳过时记录具体原因(接口/模型自动回复未开启、商品知识为空、未达到匹配阈值等),存 `tb_auto_reply_log`,接口 `GET /api/v1/conversations/auto-reply-records` - **接口/模型自动回复**:可独立开启,选择远端回复接口或本系统配置模型API(MiniMax/DeepSeek/GLM/Kimi/Qwen),使用相同商品知识与提问,统一code/data.replay/msg后发送;默认关闭,失败不发、不自动重试 - **统一对话**:所有平台会话与消息入库 SQLite,Web 页面统一查看 - **闲鱼接入**:通过本机 begin-chrome 桥接静默读取已登录 IM 页面(不触发已读、不抢焦点),未读只认页面顶部渲染的会话徽标 - **商品知识回复**:知识是一段普通长文本,可用空行分段;客服在关联商品文本中做轻量 bigram 匹配(无向量库),命中生成草稿或按阈值自动发送 - **管理页面**:商品列表(含知识文本编辑) / 平台商品 / 智能客服 / 消息时间线 / 自动回复开关 ## 目录 ``` app/ ├── main.py # FastAPI 入口 + 后台轮询线程 + 静态页面 ├── config.py # YAML + env + dataclass + lru_cache ├── database.py # get_db_cursor()(SQLite 方言,Row→dict) ├── security.py # Bearer token(SHA256 入库,24h TTL) ├── schemas.py # Pydantic v2 集中定义 ├── models/ # 纯 SQL CRUD(product/platform/conversation/message/reply/setting/log/session) ├── routers/ # auth / products / conversations / system └── services/ ├── adapters.py # 平台适配器注册表(新增平台实现 collect/send 即可接入) ├── ingest.py # 消息入库编排 + 自动回复触发 ├── kb_match.py # 关键词 + bigram 匹配打分 └── goofish/ # bridge(MCP HTTP 客户端)/ collector(页面读取)/ sender(页面发送) sql/init.sql # 建表 + 种子(可重复执行) static/ # 管理页面(无构建步骤,vanilla JS,begin_product 浅色墨绿风格) ├── index.html # 单入口(加载 css/js) ├── css/product.css # begin_product 设计 tokens、侧栏和组件样式 └── js/ # core / auth / layout / pages / main tests/ # pytest(mock 外部依赖) ``` ## 本地运行 需要 Python 3.12+ 和本机已运行的 begin-chrome 桥接(Chrome 插件已连接闲鱼)。 ```bash cd /Users/yangshuangjun/learn/begin_one uv sync # 或 pip install -e . fastapi uvicorn pydantic pyyaml uv run uvicorn app.main:app --host 127.0.0.1 --port 8300 ``` 打开 http://127.0.0.1:8300 。`config.yaml` 的 `admin_password` 为空时免登录(仅本机使用)。先维护商品及平台商品关联,再到「智能客服」开启闲鱼监听;监听开关持久化,默认关闭。开启后立即采集,之后默认每 600 秒一轮,也可在智能客服页点击「立即拉取」。关闭等待当前采集结束后返回,之后不再采集。 客服只读取对应平台商品关联的原始商品知识文本;未关联商品或商品知识为空时,不生成知识回复,不会使用其他商品的知识。删除原始商品前须解除平台商品关联,删除时商品和其文本属性一起软删除。 旧版本升级时会自动新增商品 `knowledge` 文本列,并一次性将已关联商品的有效问答条目合并成文本。旧 `tb_knowledge` 改名为 `tb_knowledge_legacy` 只读历史归档(不再被应用使用),无商品归属的通用条目不会自动分配给任何商品。独立 `/api/v1/knowledge` 接口和知识库页面已移除。 接口文档:`/docs`;健康检查:`/api/v1/system/health`。 ### 同步当前账号的闲鱼商品 先在「浏览器插件配置」保存并测试 begin-chrome,然后在 Chrome 登录闲鱼。平台商品页的「同步闲鱼商品」按钮会创建异步任务,并在本页显示同步进度和结果;后台新建专用标签页浏览 `/personal` 自己的宝贝列表、滚动加载,再逐个浏览商品详情;不抢焦点、不使用现有聊天标签页、不点击买家会话、不发布/编辑/下架闲鱼商品,也不改变客服开关。商品列表页只管理本地商品,同步完成后进入该页会显示更新后的数据。 - 编码为闲鱼 `item?id=...` 中的商品ID,以 `source_platform=goofish + external_product_id` 唯一定位;`product_id`仍是本系统标识,二者不混用。同步后列表显示闲鱼编码、来源链接及详情完整性,可按编码搜索。 - 新商品创建原始商品并自动建立平台商品关联。已有该编码的平台关联则沿用关联商品,更新标题、描述、图片和平台侧标题;商品知识 `knowledge` 不修改。冲突关联、已软删除商品不猜测/恢复,跳过并给提示。 - 图片从页面已加载的商品数据中取原始地址和详情图片,不取头像/站点图标/推荐商品/2×2占位图;最多20张,保存HTTP(S)地址而非下载文件。闲鱼CDN HEIC图片能否展示取决于浏览器/CDN支持,不伪造格式。 - 完整详情含商品描述与图片;详情被安全验证/登录/网络阻断时停止进一步详情访问,本轮可继续导入列表标题、编码、原始封面和来源链接,标为“仅列表信息”。新商品此时描述为空,已有商品不被空描述或单封面覆盖完整描述/画廊。后续完成验证后重新同步可补齐。**列表部分导入不等于完整详情同步成功。**不自动处理或绕过安全验证。 - 只读取当前账号自己的商品页,无法确认归属/未登录时失败关闭,不采集首页推荐;当前综合列表可能同时包含在售和已售出商品,以页面展示为准。 - 列表采集每次最多200件、30轮滚动,整个任务最多约10分钟(单个桥接调用仍受超时限制);未确认全部加载则标部分完成。不因未采集到商品而删除本地记录,也不对已售状态自动下架本地商品。 - 进度持久保存在SQLite `tb_product_sync_job`,统计发现/处理/新增/更新/跳过/完整详情/仅列表;重复点击复用当前任务,刷新页面可恢复查询。关闭页面不取消任务;服务重启将未完成任务标中断,已入库数据保留,可重新同步。当前运行方式为单个Uvicorn进程,不支持多进程worker同时驱动同步任务。 - `POST /api/v1/products/sync/goofish`只创建或复用任务;`GET /api/v1/products/sync/goofish?job_id=...`查询进度(无ID读最近任务),均需管理员/本机授权。同步期间不允许修改浏览器凭据,防止同任务切换浏览器。 ## 配置 ### 上传目录与年月归档 在「系统设置 → 文件与图片存储」可填写服务器绝对路径,或点击「选择目录」浏览服务器文件夹,确认后保存。浏览的是后端服务器目录,不是访问后台的客户端电脑;浏览器本地文件选择框不能提供服务器路径。没有的目录可手填,保存时创建并检查写权限。 - 初始目录取环境变量 `UPLOAD_DIR` > `config.yaml upload_dir` > `data/uploads`;页面保存后优先使用数据库 `tb_setting.upload_directory`,立即生效,不重启。新上传位于 `<根目录>/<服务器年份>/<月份>/U<随机UUID>.<扩展名>`,例如 `data/uploads/2026/11/U….png`,URL对应 `/uploads/2026/11/U….png`。 - 默认可选择范围为服务账户主目录和初始上传目录的父目录。生产部署建议显式设置 `UPLOAD_ALLOWED_ROOTS`,多个绝对路径使用操作系统路径分隔符分隔(macOS/Linux为冒号,Windows为分号)。超出范围、隐藏配置目录、文件路径和无权限目录被拒绝;目录选择器只列文件夹,不读文件内容。 - 切换目录只影响新上传,不自动搬移历史文件。`tb_upload_file`记录每个上传文件的原始存储根目录与URL,旧文件继续可访问;旧版本平铺的应用生成图片名在切换时登记保留。不要手工删除旧目录,若需搬迁应同时迁移文件并更新登记记录。 - `/uploads`不再映射整个物理目录,只允许安全格式且已登记的相对路径,拒绝越界/符号链接文件。不是任意文件管理器;未登记文件不会因为目录被选中就暴露。保留旧版本应用图片路径兼容。 - 商品图片上传仍用 `POST /api/v1/uploads/images`;通用附件可用 `POST /api/v1/uploads/files`,支持pdf/txt/csv/zip/docx/xlsx、每次最多20个、单文件10MiB,同样按年月保存;附件以attachment下载、nosniff,不允许HTML/SVG/可执行扩展名。附件公开随机URL并非私有文档权限系统,不上传敏感私密文档。 - 设置与目录浏览API:`GET/PUT /api/v1/system/upload-storage`、`GET /api/v1/system/upload-storage/directories?path=...`,沿用管理员/本机授权和跨站请求限制。文件上传需要登录,读取上传图片保持原有公开链接用途。 优先级:环境变量 > `config.yaml` > 默认值。`config.yaml` 不入库(`.gitignore`),模板见 `config.example.yaml`。 | 配置 | 说明 | | --- | --- | | `sqlite_path` | SQLite 文件路径(默认 `data/begin_one.sqlite3`) | | `admin_password` | 为空则免登录(本地模式) | | `bridge_url` / `bridge_token` | 部署初始值;“浏览器插件配置”页面保存后优先使用页面配置 | | `poll_interval_seconds` | 监听开启时轮询间隔,最少60秒;启停由智能客服页面控制 | | `kb_match_threshold` | 预留匹配配置;当前客服使用管理页面中的自动发送最低匹配分筛选知识文本 | ### 绑定 begin-chrome 浏览器插件 1. 在 Chrome 所在机器安装并启动 begin-chrome,复制插件提供的 MCP 地址和 Token。 2. 打开左侧「浏览器插件配置」,填写地址(默认 `http://127.0.0.1:8765/mcp/browser`)和 Token。支持裸令牌、`Bearer ` 或完整 `Authorization: Bearer `。 3. 点击「测试连接(只读)」确认桥接、所需工具及浏览器标签页可访问,然后保存配置。也可先保存再测试。测试不保存配置、不打开新页面、不点击会话或发送消息,也不保证闲鱼已登录。 4. 到「智能客服」单独开启闲鱼监听;自动发送仍由独立策略控制。修改接入配置前须先关闭监听。 本项目直接使用 **Streamable HTTP(JSON响应)**,不需要填写 stdio 的 Node 路径或启动命令,也不需要安装 OpenCode。MCP请求使用 JSON-RPC、`Content-Type: application/json` 和 `Accept: application/json, text/event-stream`;当前针对 begin-chrome 的无状态 JSON 模式,不是任意 MCP/SSE 服务的通用客户端。 - 页面保存的地址和令牌存入数据库同目录的 `browser-connection.json`,原子写入,POSIX权限 `0600`,数据目录已在 `.gitignore`。Token是本机受权限保护的明文文件,不是加密保险库;生产部署应限制服务账户、挂载目录和备份访问。 - 可用 `BRIDGE_CONFIG_PATH` 指定该文件路径;页面配置优先于 `BRIDGE_URL` / `BRIDGE_TOKEN` 环境变量及YAML。尚未保存页面配置时,保留原有开发配置回退(OpenCode);页面显式清除令牌后不恢复旧回退。 - 页面不回显已存Token;留空保留,清除单独确认;换地址必须重新填写Token,避免泄漏原凭据。凭据不写入审计日志、浏览器localStorage或连接检测响应。 - 接入地址默认限制回环主机、固定 `/mcp/browser` 路径,无账号/查询参数;拒绝重定向和环境HTTP代理。远程只允许HTTPS且主机在部署者设置的 `BRIDGE_ALLOWED_HOSTS` 逗号分隔白名单内,沿用系统证书校验。Docker里的127.0.0.1是容器自身,应单独规划网络/HTTPS桥接,不公开本机控制端口。 - 本机免登录只允许本机配置接入;远程访问配置接口必须设置 `ADMIN_PASSWORD`,反向代理部署也必须设置密码。不要将开发免登录实例暴露到公网。 ## 接入新平台 ### 远端接口自动回复 「智能客服」的自动回复现在支持 `mode=remote`(远端回复接口)和 `mode=model`(本系统直接调用配置好的模型API)二选一。一个总开关控制这两种方式,监听仍是独立开关;每条消息只调用选定来源,不进行隐式模式回退。旧版本配置未提供mode时默认remote。 在「智能客服 → 远端接口自动回复」配置: - 开关:默认关闭,保存开启时二次确认。平台监听也需开启,才会处理之后采集到的新消息。关闭远端功能不会清除地址和Token;不补发历史消息。 - 接口地址:使用HTTP POST JSON,远端必须HTTPS,本机回环地址可用HTTP调试。禁止账号、query、fragment和重定向,不使用环境HTTP代理;内网/保留地址默认拒绝,可由部署者用 `REMOTE_REPLY_ALLOWED_HOSTS` 逗号分隔主机白名单允许受信内网HTTPS服务。生产仍应结合网络出口控制,应用层DNS预检不能替代网络级隔离。 - Token:可选Bearer认证,留空保留,勾选清除可改匿名接口;更换地址不会自动将旧令牌带给新接口。凭据不回显、不写日志或浏览器存储。配置保存在数据目录 `remote-reply.json`,POSIX权限0600、原子保存;可用 `REMOTE_REPLY_CONFIG_PATH` 改位置,属于受权限保护明文文件,并非加密密钥库。 - 标准响应:固定 `code`、`data`、`msg` 三部分;仅整数 `code=200` 为业务成功,回复文本固定读取 `data.replay`(字段拼写是 **replay**,不是reply),`msg` 必须是字符串说明。不再提供自定义回复字段路径,旧配置的 `response_path` 将被忽略并在下次保存时移除。 - 超时:1–60秒,默认20秒;响应体最多256KiB,`data.replay` 须非空文本且最多2000字。code非200、字符串`"200"`、字段缺失、非JSON、空值、超长、HTTP错误或超时均记录失败,绝不把`msg`或错误信息当回复发送。 固定请求体如下,`request_id`同时通过 `Idempotency-Key` 请求头发送。远端需按此协议提供接口,非直接向任意聊天接口发送prompt: ```json { "request_id": "M消息标识", "platform": "goofish", "conversation_id": "C会话标识", "product_id": "I原始商品标识", "product_title": "商品标题", "knowledge": "tb_product.knowledge中的商品知识全文", "question": "本次采集到的用户消息文本" } ``` 标准成功响应: ```json {"code":200,"data":{"replay":"回复给用户的内容"},"msg":"success"} ``` 标准失败响应示例:`{"code":500,"data":null,"msg":"生成回复失败"}`。即使HTTP状态为200,只要业务code不是200也绝不发送;远端msg不会原样透传到买家或失败日志。 开启时优先走远端链路,成功的返回文本直接发给买家,不受本地匹配阈值或本地自动发送开关控制;关闭时完全不调用远端,保留本地匹配生成草稿/按原开关发送。未关联商品或商品知识为空则跳过。不能同时发远端回复和本地匹配回复。 处理状态:`generating → sending → sent`;接口失败为 `failed`,配置/商品关联变化为 `cancelled`,浏览器发送异常或未确认结果为 `unknown`。这些状态在会话里可查看。每条入库消息先事务占用处理记录,接口、模型、本地知识和人工发送协调防重;人工接管取消旧草稿,重复提交被拒绝。失败/未知结果不自动重试,服务启动将遗留的生成中/发送中标为未知。关闭或修改配置会阻止尚未进入浏览器发送的旧结果;已开始的浏览器发送不能撤回。平台消息ID优先去重,摘要使用持久观察游标,不再将“几分钟前”作为去重键,但不能保证平台端严格exactly-once。 当前闲鱼只读采集覆盖已渲染会话的最新消息,不是完整聊天历史。仅当能读取平台消息ID、明确收发方向、完整文本及当前商品标识时,才进入自动回复;只有摘要、方向不明或多条未读但缺少完整上下文时,记录跳过并交人工处理。不会只看最后一句就回复整个未读批次。未渲染会话、已打开会话中不显示未读徽标的新消息仍可能漏采。 发送前核对编辑器所属会话、生成期间是否有更新消息,并保护已有未发送草稿。成功须看到新增的本方消息ID、相同正文和明确的成功发送状态,输入框清空不是成功依据;无法识别页面结构或回执则停止/记录未知,不自动重发。页面内部React字段依赖闲鱼版本,隔离DOM测试不等于真实平台端到端验收,不宣称送达买家。 当前客服应以辅助人工模式使用,尚不能按全天候无人值守验收:需要补完整未读队列采集/游标、受控账号真实回执适配验证,以及单实例部署约束或跨进程发送租约。不要通过增加多个Uvicorn workers扩容浏览器监听。浏览器发送会打开目标会话,可能触发平台已读,只有采集阶段保持只读。 仅开启开关不意味着模型理解或回复质量得到保证;远端负责结合知识和提问生成安全合适的回复。开启前需确认商品知识及用户提问允许传输到该接口。 ### 模型配置与本系统模型API自动回复 “本系统配置模型”不是离线运行模型权重,而是由BeginOne直接用用户填写的API Key调用模型厂商或兼容网关。 1. 进入左侧「模型配置」,选择MiniMax、DeepSeek、GLM、Kimi或Qwen,填写完整Chat Completions地址、账号有权限的模型名称、API Key、生成token预算。 2. 每家单独保存配置,切换服务商不会串用Key。API Key不回显,留空保留,显式清除;更换地址必须重新填Key或明确清除。Key和接口配置沿用`remote-reply.json`原子0600文件保存,不写入日志或localStorage。保存不会触发收费调用,也不会开启自动回复。 3. 到「智能客服」,回复来源选择“本系统配置模型API”,选择已配置的服务商,勾选自动回复并确认保存。缺少模型名/Key无法开启。另需开启平台监听才处理新消息。 4. 所选模型在工作时可修改配置,但更新版本后尚未发送的旧生成结果会取消;正在使用的模型不能直接清空Key,须先关闭自动回复。更换模式不会重发同一条已经处理过的消息。 预置地址为完整HTTP endpoint,可按区域/账号/网关调整,不将模型版本写死: | 服务商 | 预置完整地址 | 官方说明 | | --- | --- | --- | | MiniMax | `https://api.minimax.cn/v1/chat/completions` | [OpenAI兼容](https://platform.minimaxi.com/docs/api-reference/text-openai-api) | | DeepSeek | `https://api.deepseek.com/chat/completions` | [API文档](https://api-docs.deepseek.com/) | | GLM | `https://open.bigmodel.cn/api/paas/v4/chat/completions` | [OpenAI兼容](https://docs.bigmodel.cn/cn/guide/develop/openai/introduction) | | Kimi | `https://api.moonshot.cn/v1/chat/completions` | [快速开始](https://platform.kimi.com/docs/api/quickstart) | | Qwen | `https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions` | [百炼兼容接口](https://help.aliyun.com/zh/model-studio/qwen-api-via-openai-chat-completions) | 2026-11-11核对官方文档:MiniMax官方当前国内文档使用`api.minimax.cn`;国际站/旧站域名与Key可能不同,请按账号控制台填写。Qwen兼容文档建议使用`https://{WorkspaceId}..maas.aliyuncs.com/compatible-mode/v1/chat/completions`的业务空间专属地址;原dashscope域名仍可用,Key必须与地域一致。GLM/Kimi的Coding套餐与常规API不能假定通用。预置地址不代表账号已获模型权限或有免费额度。 模型模式使用非流式OpenAI兼容`chat/completions`,`Authorization: Bearer `。与远端模式相同的request_id/platform/conversation_id/product_id/product_title/knowledge/question整体JSON放入user消息,固定system提示约束只依据商品知识并输出标准: ```json {"code":200,"data":{"replay":"最终客服回复"},"msg":"success"} ``` 厂商原始响应仍是OpenAI的`choices[0].message.content`结构,适配器只解析其中最终文本里的标准JSON,调用同一个code/data.replay/msg校验器;不是假设厂商原生直接返回业务协议。允许完整包裹JSON的代码围栏,其余解释文字/非JSON/错字段/非200/空回复/超长均拒绝,不把普通文本包装成假成功。 仅接受`finish_reason=stop`;截断、拒绝、工具调用、空content都停止发送。`reasoning_content`不会发给买家,未启用工具。MiniMax发送`reasoning_split:true`和`max_completion_tokens`,其他兼容服务使用`max_tokens`;默认预算4096,可在256–32768之间调整。思考token可能消耗预算/超时,模型不遵守JSON并不能被保证修复,系统会记录失败而不是冒险发送。 远端模式Token与五家模型Key分别存储;自动回复开关与两种模式均与旧“本地知识匹配自动发送”不同。关闭接口/模型自动回复会停止这些API调用,但原本地匹配策略仍按系统设置独立生效。模型模式采用同样HTTP地址限制、DNS预检、禁止重定向和代理,不自动重试或切到另一家服务。生产网络出口控制仍有必要。 配置API:`GET /api/v1/system/remote-reply/models`返回五家脱敏配置;`PUT /api/v1/system/remote-reply/models/{provider}`保存`url/model/api_key/clear_api_key/max_tokens`;自动回复原配置额外支持`mode`和`model_provider`。模型处理记录source为`model_api`,远端为`remote_api`,二者共享同消息事务占用,避免换模式重复发送。 ### 新增平台适配器 实现 `collect() -> {ok, loginRequired, rows:[{external_cid, badge, name, summary, ...}]}` 与 `send(external_cid, text) -> {ok}` 的适配器,注册到 `app/services/adapters.py` 的 `ADAPTERS`,并在 `tb_platform` 插入种子数据即可,路由与页面无需改动。 ## 测试 ```bash uv run pytest -v node tests/frontend.cjs node tests/product_collectors.cjs node tests/product_gallery.cjs ``` ## 安全边界 ### 对话记录菜单 左侧「对话记录」独立展示自动回复处理历史,可按买家/商品/提问/回复/会话编码搜索,并按来源(模型API、远端接口、本地知识匹配)、结果(已发送/草稿/跳过/失败/取消/未知等)筛选、分页。点击“完整内容”读取完整提问、回复与说明,点击“查看会话”进入已采集消息时间线;“全部会话”可查看已持久化会话。 新自动回复日志保存完整文本而非120字截断;旧摘要记录优先从已有消息/回复表补读完整正文,不能恢复从未采集过的历史内容。数据在SQLite中持久保存,刷新或重启不丢失。记录查询只读取本系统数据库,不触发闲鱼侧已读/发送;采集依然基于页面实际可见消息摘要,不代表完整平台聊天备份。智能客服页面保留简要自动回复记录,独立菜单用于集中检索和明细查看。 - 平台侧写操作(发送消息)默认**关闭自动发送**(`auto_send_enabled=0`),命中商品知识文本仅生成草稿,需在页面点击「审核并发送」 - 采集阶段为只读;后续处理仅在明确开启本地自动发送或远端自动回复时发送,不能把整轮轮询描述为永远只读 - 登录失效时轮询跳过并在页面拉取结果中提示 `login-required` - 监听默认关闭;只有用户在智能客服页面开启后才调用平台采集。开启监听不修改自动发送策略。