首页 / 资讯中心 / 文章详情

DeepSeek-Agent-Harness-2026终极指南-第15章第69节-从demo到产品-打磨DeepPilot:CLI交互与rich美化

DeepSeek-Agent-Harness-2026终极指南-第15章第69节-从demo到产品-打磨DeepPilot:CLI交互与rich美化 ★ FEATURED ARTICLE
打磨 DeepPilotCLI 交互与 rich 美化能跑和好用之间差了一个 rich。这一节把 DeepPilot 从 demo 打磨成产品让它成为你日常愿意打开的 CLI 工具。本文导航从 demo 到产品的差距rich 美化三板斧进度条、表格、语法高亮argparse 命令行参数设计REPL 交互循环v1.0 完整使用体验小结从 demo 到产品的差距到目前为止DeepPilot 跑任务靠python -c ...输出是纯文本流。这在开发阶段没问题但要让用户日常使用还差维度demo 阶段产品阶段启动方式python -c ...deeppilot run 任务描述进度反馈无进度条 状态提示输出格式纯文本语法高亮 表格交互模式一次性REPL 多轮对话错误提示traceback友好错误信息这一节逐一解决。rich 美化三板斧进度条、表格、语法高亮安装uv pipinstallrich进度条工具调用可视化# deep_pilot/ui.py —— 进度展示fromrich.progressimportProgress,SpinnerColumn,TextColumn,BarColumn,TimeElapsedColumnfromrich.consoleimportConsole consoleConsole()defcreate_tool_progress():创建工具调用进度条returnProgress(SpinnerColumn(),TextColumn([bold blue]{task.description}),BarColumn(),TextColumn([progress.percentage]{task.percentage:3.0f}%),TimeElapsedColumn(),consoleconsole,)# 在 Agent Loop 中使用defrun_agent_with_ui(prompt:str):带 UI 的 Agent 运行console.print(f\n[bold green]DeepPilot[/] 处理:{prompt}\n)withcreate_tool_progress()asprogress:taskprogress.add_task(思考中...,totalNone)# 未知总量defon_tool_call(tool_name:str):工具调用回调progress.update(task,descriptionf[yellow]调用工具:{tool_name})defon_tool_done(tool_name:str,result:str):工具完成回调progress.update(task,descriptionf[green]✓{tool_name}完成)console.print(f [dim]{result[:100]}...[/dim])resultrun_agent_loop(prompt,on_tool_callon_tool_call,on_tool_doneon_tool_done)# 输出最终结果console.print(\n[bold]结果:[/bold])console.print(result[final_output])表格调用统计展示fromrich.tableimportTabledefprint_call_summary_table(report:dict):用表格展示调用统计tableTable(titleDeepPilot 调用统计,show_headerTrue,header_stylebold magenta)table.add_column(指标,stylecyan)table.add_column(数值,justifyright,stylegreen)table.add_row(总调用次数,str(report[total_calls]))table.add_row(输入 token (avg),f{report[avg_input_tokens]:.0f})table.add_row(输出 token (avg),f{report[avg_output_tokens]:.0f})table.add_row(平均耗时,f{report[avg_duration]:.2f}s)table.add_row(总成本,f¥{report[total_cost]:.4f})console.print(table)效果┌──────────────────┬────────────┐ │ DeepPilot 调用统计 │ ├──────────────────┼────────────┤ │ 指标 │ 数值 │ ├──────────────────┼────────────┤ │ 总调用次数 │ 42 │ │ 输入 token (avg) │ 1250 │ │ 输出 token (avg) │ 380 │ │ 平均耗时 │ 2.35s │ │ 总成本 │ ¥0.0523 │ └──────────────────┴────────────┘语法高亮代码输出美化fromrich.syntaximportSyntaxfromrich.panelimportPaneldefprint_code_block(code:str,language:strpython):语法高亮输出代码syntaxSyntax(code,language,thememonokai,line_numbersTrue)console.print(Panel(syntax,titlef[bold]{language}[/bold],border_styleblue))效果带行号、语法高亮、边框的代码面板。argparse 命令行参数设计# deep_pilot/cli.py —— 命令行入口importargparseimportsysfromrich.consoleimportConsole consoleConsole()defmain():parserargparse.ArgumentParser(progdeeppilot,descriptionDeepPilot - AI 编程助手,)subparsersparser.add_subparsers(destcommand,help子命令)# run 命令一次性任务run_parsersubparsers.add_parser(run,help执行一次性任务)run_parser.add_argument(prompt,help任务描述)run_parser.add_argument(--model,defaultdeepseek-flash,help模型选择)run_parser.add_argument(--workspace,default.,help工作目录)run_parser.add_argument(--max-iterations,typeint,default50,help最大迭代次数)run_parser.add_argument(--verbose,-v,actionstore_true,help详细输出)# chat 命令交互模式chat_parsersubparsers.add_parser(chat,help进入交互模式)chat_parser.add_argument(--workspace,default.,help工作目录)chat_parser.add_argument(--model,defaultdeepseek-flash,help模型选择)# stats 命令查看统计stats_parsersubparsers.add_parser(stats,help查看调用统计)stats_parser.add_argument(--period,defaulttoday,choices[today,week,month],help统计周期)argsparser.parse_args()ifargs.commandrun:cmd_run(args)elifargs.commandchat:cmd_chat(args)elifargs.commandstats:cmd_stats(args)else:parser.print_help()sys.exit(1)defcmd_run(args):执行一次性任务fromdeep_pilot.agent_loopimportrun_agent_loop console.print(f[bold green]DeepPilot[/] v1.0)console.print(f模型:{args.model}| 工作目录:{args.workspace}\n)try:resultrun_agent_loop(promptargs.prompt,workspaceargs.workspace,modelargs.model,max_iterationsargs.max_iterations,verboseargs.verbose,)console.print(f\n[bold]结果:[/bold]\n{result[final_output]})exceptKeyboardInterrupt:console.print(\n[yellow]已中断[/yellow])sys.exit(130)exceptExceptionase:console.print(f\n[bold red]错误:[/bold]{e})sys.exit(1)defcmd_chat(args):进入交互模式fromdeep_pilot.replimportrun_repl run_repl(workspaceargs.workspace,modelargs.model)defcmd_stats(args):查看调用统计fromdeep_pilot.call_trackerimporttrackerfromdeep_pilot.uiimportprint_call_summary_table reporttracker.get_usage_report(periodargs.period)print_call_summary_table(report)if__name____main__:main()命令行使用示例# 一次性任务uv run deeppilot run读取 main.py 并找出所有 TODO 注释# 指定模型和工作目录uv run deeppilot run重构 utils.py--modeldeepseek-reasoner--workspace./my-project# 交互模式uv run deeppilot chat--workspace./my-project# 查看统计uv run deeppilot stats--periodtodayREPL 交互循环# deep_pilot/repl.py —— 交互模式fromrich.consoleimportConsolefromrich.promptimportPromptfromrich.markdownimportMarkdown consoleConsole()defrun_repl(workspace:str.,model:strdeepseek-flash):REPL 交互循环console.print([bold green]DeepPilot[/] v1.0 交互模式)console.print(f工作目录:{workspace}| 模型:{model})console.print(输入 [bold]/help[/] 查看命令[bold]/quit[/] 退出\n)messages[]# 多轮对话历史whileTrue:try:user_inputPrompt.ask([bold cyan][/bold cyan])except(EOFError,KeyboardInterrupt):console.print(\n[dim]再见[/dim])breakifnotuser_input.strip():continue# 内置命令ifuser_input.startswith(/):ifhandle_command(user_input):continueelse:break# 调用 Agentmessages.append({role:user,content:user_input})withconsole.status([bold green]思考中...):resultrun_agent_loop(promptuser_input,messagesmessages,workspaceworkspace,modelmodel,)# 输出结果outputresult[final_output]messages.append({role:assistant,content:output})# 尝试渲染为 Markdownifany(cinoutputforcin[#,,- ]):console.print(Markdown(output))else:console.print(output)# 显示统计console.print(f[dim] (tokens:{result[input_tokens]}→{result[output_tokens]}, f耗时:{result[duration]:.1f}s)[/dim]\n)defhandle_command(cmd:str)-bool:处理内置命令返回 False 表示退出cmdcmd.strip().lower()ifcmdin(/quit,/exit,/q):console.print([dim]再见[/dim])returnFalseelifcmd/help:console.print( [bold]内置命令:[/bold] /help 显示帮助 /clear 清空对话历史 /stats 显示当前会话统计 /model 切换模型 /quit 退出 )elifcmd/clear:console.print([dim]对话历史已清空[/dim])elifcmd/stats:fromdeep_pilot.call_trackerimporttracker reporttracker.get_session_report()console.print(f本次会话:{report[total_calls]}次调用, f{report[total_tokens]}tokens, f¥{report[cost]:.4f})returnTruev1.0 完整使用体验# 安装第 71 节会上架 PyPIuv pipinstalldeeppilot# 一次性任务$ deeppilot run找出所有未使用的 import 语句DeepPilot v1.0 模型: deepseek-flash|工作目录:.⠋ 调用工具: glob(*.py)✓ glob 完成 找到12个 Python 文件 ⠋ 调用工具: grep(import,files12)✓grep完成 分析import语句... 结果: 发现3处未使用的 import1. utils.py:5 -importos未使用2. main.py:12 - from typingimportList未使用3. config.py:3 -importsys未使用(tokens:850→320, 耗时:3.2s)# 交互模式$ deeppilot chat DeepPilot v1.0 交互模式 工作目录:.|模型: deepseek-flash 输入 /help 查看命令/quit 退出帮我看看这个项目结构 ⠋ 调用工具: file_tree(.)✓ file_tree 完成 DeepPilot/ ├── deep_pilot/ │ ├── __init__.py │ ├── agent_loop.py │ ├── client.py │ └──... ├── tests/ └── pyproject.toml 这是一个标准的 Python 项目结构...(tokens:1200→450, 耗时:2.8s)/stats 本次会话:2次调用,2020tokens, ¥0.0020/quit 再见小结rich 三板斧进度条工具调用可视化、表格统计展示、语法高亮代码美化。argparse 设计run一次性、chat交互、stats统计三个子命令。REPL 交互循环多轮对话、内置命令/help /clear /stats /quit、Markdown 渲染。产品化关键友好错误提示、进度反馈、统计可视化。DeepPilot v1.0 从 demo 毕业成为一个你愿意日常打开的 CLI 工具。下节预告CLI 好用了但每个用户都想自定义。下一节做配置化与插件化工具/技能/角色的目录约定式自动发现、用户自定义配置层、第三方工具接入协议——让用户不用改源码就能扩展 DeepPilot。如果觉得本文对你有帮助欢迎点赞、收藏、关注三连本系列持续更新中关注不迷路~
阅读完成 · 觉得有帮助?
咨询建站