Skip to content

Conversation

zk-b612
Copy link

@zk-b612 zk-b612 commented Sep 16, 2025

📌 简要说明(TLDR)

本次 PR 实现了两大核心能力,旨在提升 非交互模式下 Qwen 工具链在对话连贯性执行透明度方面的体验:

会话持久化(Session Persistence)
新增 --session <ID> 参数,支持跨命令保持对话上下文,用户可进行多轮渐进式对话生码。

增强调试输出(Verbose Output Control)
新增 --verbose-to-stdout 选项,允许将工具调用日志输出至 stdout,便于前端集成、日志归集与流式 UI 展示。

这两项能力共同解决了当前工具在非交互模式下“交互无记忆、执行无过程”的核心痛点,为产品化落地奠定基础。


🧠 深入探讨(Dive Deeper)

1. Session 持久化设计

  • 存储机制:会话数据以 JSON 格式存储于 ~/.qwen_sessions/<ID>.json
  • 数据结构:包含 sessionIdcreatedAtupdatedAthistory(对话记录)、projectPath
  • 智能恢复:首次使用不存在的 session ID 时自动创建;再次使用时自动加载历史并调用 geminiClient.setHistory() 恢复上下文
  • 错误韧性:即使执行出错,仍尝试保存当前 session 状态,避免数据丢失
  • 扩展性预留:支持后续添加 session list/info/delete 等管理命令(已实现)

2. Verbose 输出控制设计

  • 双通道输出
    • --verbose → stderr(默认,适合终端调试)
    • --verbose --verbose-to-stdout → stdout(适合前端/UI/日志系统)
  • 强制依赖--verbose-to-stdout 必须搭配 --verbose 使用,避免误用
  • 底层实现:重定向 console.errorprocess.stdout.write,确保结构化日志与模型响应同流输出
  • 兼容性保障:不影响现有 approval、非交互模式、session 等功能

💡 设计哲学:“黑盒变白盒,一次性变持续性” —— 让开发者不仅看到结果,更掌控过程;不仅执行一次,更能持续对话。


👀 审阅者测试计划(Reviewer Test Plan)

请拉取本分支后,按以下步骤验证功能:

✅ Session 功能测试

# 1. 基础对话延续
qwen --session demo -p "Explain fine-tuning in LLMs"
qwen --session demo -p "Give me a PyTorch code example"

# 2. Session 管理命令
qwen session list
qwen session info demo
qwen session delete demo

# 3. 自动创建 & 恢复
qwen --session newone -p "Hello" --debug  # 应显示创建日志
qwen --session newone -p "Continue?"      # 应延续上下文

# 4. 兼容性验证(不使用 session)
qwen -p "Hello world"  # 行为应与之前完全一致

✅ Verbose 输出控制测试

# 1. 默认 verbose(stderr)
echo "list files" | qwen --verbose -p "" 2> verbose.log
cat verbose.log  # 应包含工具调用详情

# 2. 输出到 stdout
echo "list files" | qwen --verbose --verbose-to-stdout -p "" > all.log
cat all.log      # 应包含模型响应 + 工具调用详情

# 3. 错误用法拦截
qwen --verbose-to-stdout -p "test"  # 应报错:Cannot use without --verbose

# 4. 与 session 结合
qwen --session test --verbose --verbose-to-stdout -p "What is RAG?" > output.txt

🧪 推荐测试用例

  • 多轮复杂对话(如:先问概念 → 再要代码 → 再要求优化)
  • 在不同目录下使用相同 session(验证 projectPath 记录)
  • 在管道中使用 --verbose-to-stdoutgrep 关键词
  • 启用 --debug 查看 session 文件读写日志

✅ 测试矩阵(Testing Matrix)

🍏 macOS 🪟 Windows 🐧 Linux
npm run
npx
Docker
Podman - -
Seatbelt - -

✅ 所有平台均已手动测试通过。Session 文件路径使用 os.homedir() + .qwen_sessions,跨平台兼容。


🔗 关联问题 / bugs

Resolves #628


🎯 预期收益(Impact Summary)

维度 改进前 改进后
用户体验 单次对话、无记忆 多轮对话、上下文延续
产品化能力 仅限终端、难嵌入产品 支持 IDE/Web/CI 集成
可观测性 工具调用黑盒 完整执行链路日志,支持审计调试
社区生态 功能单一,难吸引贡献 清晰交互模型,便于共建工具生态

🧩 实施细节(Implementation Notes)

Session 机制

  • 文件路径:path.join(os.homedir(), '.qwen_sessions', ${sessionId}.json)
  • 自动创建/加载:在 execute() 前拦截并处理 session
  • 历史注入:通过 geminiClient.setHistory(session.history) 实现上下文恢复
  • 安全写入:使用 fs.writeFileSync + try-catch 确保数据不丢失

Verbose 输出控制

  • 参数校验:if (verboseToStdout && !verbose) → 报错退出
  • 输出重定向:封装 logVerbose() 函数,根据标志选择 console.errorprocess.stdout.write
  • 格式统一:保留原 verbose 格式(JSON Lines 或结构化文本),便于前端解析

扩展性设计

  • Session 管理命令已预留接口,后续可扩展 --session clear --older-than 7d
  • 日志结构可后续标准化为 JSON Schema,支持结构化查询

📚 使用示例(补充)

多轮对话生码

qwen --session webapp -p "Create a React counter component"
qwen --session webapp -p "Add TypeScript support"
qwen --session webapp -p "Write unit tests with Jest"

前端集成流式输出

# 前端可监听 stdout 实时渲染模型响应 + 工具调用过程
qwen --session ui-demo --verbose --verbose-to-stdout -p "Build a todo list" | frontend-processor

审计日志归档

qwen --session audit-2024 --verbose --verbose-to-stdout -p "Refactor auth module" > audit.log
# audit.log 包含完整执行轨迹,可用于合规审查

🎉 总结

本 PR 不仅实现了 Issue 中提出的全部功能需求,更在错误处理、跨平台兼容、扩展性设计上做了充分考虑。代码通过完整类型检查,与现有功能 100% 兼容,测试覆盖核心场景。

欢迎 Reviewer 按上述测试计划验证,有任何问题我随时响应!


@github-actions github-actions bot added enhancement New feature or request priority/P1 High priority issue labels Sep 16, 2025
@zk-b612
Copy link
Author

zk-b612 commented Sep 29, 2025 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request priority/P1 High priority issue

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(cli): add session persistence and tool invocation visualization for non-interactive mode

1 participant