- Renamed `check_environment` to `check_api_key_configured` for clarity, simplifying the API key validation logic. - Removed the blocking behavior of the API key check during application startup, allowing the app to run while providing a prompt for configuration. - Updated `LocalAgentApp` to accept an `api_configured` parameter, enabling conditional messaging for API key setup. - Enhanced the `SandboxRunner` to support backup management and improved execution result handling with detailed metrics. - Integrated data governance strategies into the `HistoryManager`, ensuring compliance and improved data management. - Added privacy settings and metrics tracking across various components to enhance user experience and application safety.
5.5 KiB
5.5 KiB
P1-01 配置保存与客户端单例冲突问题 - 解决方案
问题描述
设置页写入 .env 后未刷新 LLMClient 单例,旧 API Key/URL 可能继续使用,用户感知为"保存不生效"。
影响分析
- 配置变更失败
- 调用报错
- 支持成本上升
- 用户体验差
解决方案
1. 客户端单例重置机制
文件: llm/client.py
新增功能:
reset_client(): 重置全局客户端单例,强制下次调用时使用新配置test_connection(): 测试 API 连接是否正常,返回详细的错误信息
def reset_client() -> None:
"""重置 LLM 客户端单例(配置变更后调用)"""
global _client
_client = None
def test_connection(timeout: int = 10) -> tuple[bool, str]:
"""测试 API 连接是否正常"""
# 发送测试请求,返回 (是否成功, 消息)
2. 设置保存流程优化
文件: ui/settings_view.py
保存配置后的处理流程:
- 保存配置到
.env文件 - 更新环境变量
os.environ - 重置客户端单例
reset_client() - 进行连通性测试
test_connection() - 向用户反馈测试结果
- 记录配置变更度量
def _save_config(self) -> None:
# ... 保存配置 ...
# 重置客户端单例
from llm.client import reset_client, test_connection
reset_client()
# 连通性测试
success, message = test_connection(timeout=15)
# 反馈结果
if success:
messagebox.showinfo("成功", f"配置已保存并生效!\n\n{message}")
else:
messagebox.showwarning("配置已保存", f"配置已保存,但连接测试失败:\n\n{message}")
3. 配置变更度量跟踪
文件: llm/config_metrics.py (新增)
跟踪指标:
- 配置变更总次数
- 首次调用成功率
- 平均重试次数
- 连接测试成功率
- 从配置变更到首次成功调用的时间
class ConfigMetricsManager:
def mark_config_changed(self, connection_test_success: bool):
"""标记配置已变更"""
def record_first_call(self, success: bool, error_message: Optional[str] = None):
"""记录配置变更后的首次调用"""
def increment_retry(self):
"""增加重试计数"""
def get_statistics(self) -> Dict[str, Any]:
"""获取统计信息"""
4. Agent 集成
文件: app/agent.py
- 在首次 LLM 调用时记录成功/失败度量
- 在重试时增加重试计数
- 设置保存后更新 API 配置状态
工作流程
用户修改配置
↓
保存到 .env
↓
更新 os.environ
↓
reset_client() ← 重置单例
↓
test_connection() ← 连通性测试
↓
记录度量 (mark_config_changed)
↓
反馈用户
↓
用户发起调用
↓
get_client() ← 创建新实例(使用新配置)
↓
记录首次调用结果 (record_first_call)
关键改进点
✅ 配置立即生效
- 保存后立即重置客户端单例
- 下次调用自动使用新配置
✅ 连通性校验反馈
- 保存后自动测试连接
- 详细的错误信息提示
- 区分配置错误、网络错误、认证错误等
✅ 度量指标跟踪
- 首次调用成功率
- 平均重试次数
- 连接测试成功率
- 响应时间统计
✅ 用户体验优化
- 明确的成功/失败反馈
- 具体的错误原因说明
- 配置生效状态提示
测试验证
运行测试脚本:
python test_config_refresh.py
测试内容:
- 加载初始配置
- 创建客户端实例
- 重置客户端单例
- 验证新实例使用新配置
- 测试 API 连接
- 查看度量统计
度量指标
建议监控指标
-
保存后首次调用成功率
- 目标: ≥ 95%
- 计算: 成功次数 / 总配置变更次数
-
配置修改后重试次数
- 目标: ≤ 0.5 次/配置变更
- 计算: 总重试次数 / 总配置变更次数
-
连接测试成功率
- 目标: ≥ 90%
- 计算: 测试成功次数 / 总配置变更次数
-
配置生效时间
- 目标: ≤ 2 秒
- 计算: 从保存到首次成功调用的时间
查看度量数据
度量数据保存在:workspace/.metrics/config_metrics.json
可通过代码查看:
from llm.config_metrics import get_config_metrics
metrics = get_config_metrics(workspace)
stats = metrics.get_statistics()
print(stats)
影响范围
修改的文件
llm/client.py- 新增重置和测试功能ui/settings_view.py- 集成重置和测试流程app/agent.py- 记录度量数据llm/config_metrics.py- 新增度量模块
新增的文件
llm/config_metrics.py- 配置度量管理test_config_refresh.py- 测试脚本docs/P1-01-solution.md- 本文档
后续优化建议
- 异步连通性测试: 避免阻塞 UI 线程
- 配置版本管理: 记录配置变更历史
- 自动配置修复: 检测到错误时提供修复建议
- 批量配置验证: 保存前验证所有配置项的有效性
- 配置模板: 提供常用 API 服务的配置模板
总结
通过引入客户端单例重置机制、连通性校验和度量跟踪,彻底解决了配置保存后不生效的问题。用户现在可以:
- ✅ 保存配置后立即生效
- ✅ 获得明确的连接测试反馈
- ✅ 了解配置是否正确
- ✅ 减少配置错误导致的调用失败
预期效果:
- 配置相关支持请求减少 80%+
- 首次调用成功率提升至 95%+
- 用户满意度显著提升