当前位置: 首页 > article >正文

从PySide6到Rich+FastAPI:如意Agent终端版架构重构全记录

我是张大鹏做了十多年人工智能带过不少项目。说实话最难的不是把功能做出来是在需求变化时让架构跟得上。最近如意Agent经历了一次彻底的架构转型——从桌面GUI全面转向终端版采用前后端分离架构。本文记录这次重构的完整思路和实现细节。一、为什么要推倒重来如意Agent最初是基于PySide6的桌面应用。PySide6确实好用信号槽机制成熟QSS样式灵活我们甚至做了8套主题皮肤。但跑了几个月后问题逐渐暴露问题具体表现影响打包体积PyInstaller Qt 依赖单文件 180MB分发困难更新成本高跨平台Windows/Mac/Linux 表现不一致维护三套UI代码远程使用必须在本地运行无法远程调用服务器场景完全不可用测试成本GUI自动化测试脆弱CI/CD 难集成每次发版手工验证资源占用运行时内存 200MB低配机器卡顿明显最致命的是部署场景。有用户想在服务器上跑如意Agent作为后台服务但桌面GUI在 headless 环境下直接报错。我们不得不告诉他们“先装个桌面环境。”这显然不合理。二、新架构的核心思路重构目标很明确让Agent回归服务本质UI只是多种消费方式之一。新架构采用“共享后端 多端前端”模式┌─────────────────┐ HTTP/WebSocket ┌─────────────────┐ │ ruyi-cli │ ◄──────────────────────► │ ruyi-server │ │ (Rich终端UI) │ │ (FastAPI服务) │ └─────────────────┘ └────────┬────────┘ │ ┌────────────────────────────┼────┐ │ │ │ ┌─────┴─────┐ ┌──────┴───┐ │ │ Web │ │ Mobile │ │ │ (Vue3) │ │ (未来) │ │ └───────────┘ └──────────┘ │ │ ┌─────────────┴─────┐ │ Core Agent │ │ (agentmain.py) │ └───────────────────┘技术选型层级技术选型理由后端服务FastAPI Uvicorn异步支持好自动API文档WebSocket原生支持终端UIRich TyperPython终端渲染天花板比很多GUI还好看配置管理YAML人机双友好注释支持层级清晰进程通信HTTP WebSocket松耦合支持远程调试方便三、后端服务层实现后端是独立进程负责承载核心Agent和对外提供API。3.1 FastAPI应用入口ruyi-server/src/server/app.pyfromfastapiimportFastAPIfromfastapi.middleware.corsimportCORSMiddlewareimportuvicornimportthreadingfromserver.configimportload_server_configfromserver.routesimportchat,system,llmfromagentmainimportGeneraticAgentfromstorage.chatimportmake_chat_repo# 加载配置configload_server_config()# 创建FastAPI应用appFastAPI(title如意Agent API,version0.1.5,description如意Agent 后端服务 API)# CORS配置支持跨域调用app.add_middleware(CORSMiddleware,allow_originsconfig[cors][allow_origins],allow_credentialsTrue,allow_methods[*],allow_headers[*],)# 全局状态管理classAppState:def__init__(self):self.agent:GeneraticAgent|NoneNoneself.chat_repoNoneself.active_tasks:dict{}app.state.app_stateAppState()# 注册路由app.include_router(chat.router)app.include_router(system.router)app.include_router(llm.router)app.on_event(startup)asyncdefstartup_event():应用启动时初始化AgentagentGeneraticAgent()chat_repomake_chat_repo()agent.set_chat_persistence(chat_repo)# 后台线程运行Agentthreading.Thread(targetagent.run,daemonTrue).start()app.state.app_state.agentagent app.state.app_state.chat_repochat_repoprint(f[Server] Agent 初始化完成当前模型:{agent.get_llm_name()})关键点Agent运行在后台线程主线程处理HTTP请求互不阻塞全局状态通过app.state共享避免全局变量污染CORS全开放方便前端开发和跨域调用3.2 配置分离服务端配置独立为config/server.yamlserver:host:0.0.0.0port:8000workers:1cors:allow_origins:[*]allow_credentials:trueallow_methods:[*]allow_headers:[*]llm:default_provider:kimifallback_providers:[openai,deepseek]storage:chat_db_path:data/chat.dblog_level:INFO配置加载用标准YAML解析约30行代码importyamlfrompathlibimportPathdefload_server_config(config_path:str|NoneNone)-dict:ifconfig_pathisNone:config_pathconfig/server.yamlwithopen(Path(config_path),r,encodingutf-8)asf:returnyaml.safe_load(f)3.3 Chat路由设计聊天是核心功能支持两种模式同步模式REST APIrouter.post(/send)asyncdefsend_message(request:SendMessageRequest)-dict[str,str]:stateapp.state.app_stateifstate.agentisNone:raiseHTTPException(status_code503,detailAgent未初始化)conv_idrequest.conversation_idorstr(uuid.uuid4())task_idstr(uuid.uuid4())# 异步处理任务asyncdefprocess_task()-None:display_queuestate.agent.put_task(request.message,sourceapi)whileTrue:try:chunkdisplay_queue.get(timeout0.1)ifchunkisNone:break# 收集响应片段state.active_tasks[task_id][chunks].append(str(chunk))exceptqueue.Empty:ifnotstate.agent.is_running:breakawaitasyncio.sleep(0.05)asyncio.create_task(process_task())return{task_id:task_id,conversation_id:conv_id}流式模式WebSocketrouter.websocket(/ws/{task_id})asyncdefwebsocket_endpoint(websocket:WebSocket,task_id:str):awaitwebsocket.accept()stateapp.state.app_statetry:whileTrue:iftask_idinstate.active_tasks:taskstate.active_tasks[task_id]# 发送已收集的chunkschunkstask[chunks]forchunkinchunks:awaitwebsocket.send_text(chunk)iftask[status]completed:awaitwebsocket.send_text([DONE])breakawaitasyncio.sleep(0.1)exceptWebSocketDisconnect:print(f[WebSocket] 客户端断开:{task_id})WebSocket的设计很务实Agent内部用Queue生产数据WebSocket循环消费并推送给客户端。不追求零延迟保证不丢消息、不乱序。四、终端客户端实现终端版不是简陋的print而是基于Rich的现代化TUI。4.1 为什么选RichRich的能力远超预期Markdown渲染代码高亮、表格、引用块全部原生支持Panel布局消息气泡、系统提示用Panel轻松实现Spinner/ProgressAgent思考时显示动画体验接近GUI颜色主题256色支持暗色主题下的显示效果非常舒服4.2 三段式流式显示这是终端版最核心的UX创新。Agent的响应分为三个阶段# thinking 阶段 正在分析问题...# summary 阶段 关键结论建议采用方案B因为...# answer 阶段详细解释...代码示例...Rich的Live组件让流式更新很流畅fromrich.liveimportLivefromrich.panelimportPanelfromrich.markdownimportMarkdownwithLive(consoleconsole,refresh_per_second10)aslive:forchunkinstream_response():ifchunk[type]thinking:contentf{chunk[content]}elifchunk[type]summary:contentf{chunk[content]}else:contentchunk[content]live.update(Panel(Markdown(content),title如意Agent))4.3 CLI命令结构用Typer构建命令行入口importtyperfromrich.consoleimportConsole apptyper.Typer(help如意Agent 终端客户端)consoleConsole()app.command()defchat(server:strtyper.Option(http://localhost:8000,--server,-s),model:strtyper.Option(None,--model,-m)):启动交互式聊天会话clientRuyiClient(base_urlserver)sessionChatSession(client,modelmodel)session.run()app.command()defstatus(server:strtyper.Option(http://localhost:8000,--server,-s)):查看Agent运行状态clientRuyiClient(base_urlserver)infoclient.get_status()console.print(f模型:{info[model]})console.print(f状态:{info[status]})if__name____main__:app()五、重构过程中的关键决策5.1 为什么不是TUI框架TextualTextual确实更强大但我们评估后放弃维度RichTextual学习成本低熟悉print即可上手高需要理解组件树、事件循环调试难度低print可辅助调试高屏幕刷新会覆盖print灵活性高自由控制输出中受框架约束包体积小核心仅依赖大额外依赖Rich的增强版print哲学更符合我们的需求渐进增强随时可回退到基础模式。5.2 进程间通信为什么不用gRPCgRPC性能更好但HTTP/JSON在调试和开发体验上碾压curl直接测试API浏览器打开http://localhost:8000/docs看Swagger文档错误信息JSON可直接阅读对于AI Agent场景开发效率 极致性能。瓶颈在LLM API调用不在内部通信。5.3 保留的核心资产重构不是重写核心层完全保留agentmain.py—— Agent主逻辑llmcore.py—— LLM路由与调用agent_loop.py—— 执行循环storage/—— 持久化层刚做完chat.db迁移logstack/—— 结构化日志memory/—— 记忆系统删除的只有UI层src/desktop/、src/pet/、src/frontends/。六、重构收益指标重构前桌面版重构后终端版变化打包体积180MB15MB-92%启动时间3-5秒1秒-80%内存占用200MB40MB-80%CI/CD集成困难原生支持质变远程部署不支持开箱即用质变跨平台需分别测试Python标准库质变最意外的收获是测试覆盖率。终端版可以全量跑E2E测试桌面版只能测核心逻辑。重构后测试从 600 提升到785 passed0 skipped。总结维度内容核心思路共享后端 多端前端Agent回归服务本质关键技术FastAPI后端、RichTyper终端、YAML配置关键决策HTTP/JSON优于gRPCRich优于Textual保留核心层注意事项终端版适合服务器/开发场景桌面版可基于Web技术重建这次重构验证了一个原则架构要服务于场景不要服务于技术栈本身。PySide6不是不好是不适合如意Agent当前的发展阶段。当用户从本地尝鲜转向生产部署时轻量、可远程、可集成的架构才是正解。参考资料FastAPI官方文档Rich文档Typer文档如意Agent终端版实施计划docs/superpowers/plans/2026-05-06-terminal-version.md作者张大鹏日期2026-05-06团队大鹏AI教育GitHub项目地址含完整源码相关推荐如意Agent六边形架构改造从单体巨石到端口适配器如意Agent对话持久化与滚动记忆引擎设计

相关文章:

从PySide6到Rich+FastAPI:如意Agent终端版架构重构全记录

我是张大鹏,做了十多年人工智能,带过不少项目。说实话,最难的不是把功能做出来,是在需求变化时让架构跟得上。最近如意Agent经历了一次彻底的架构转型——从桌面GUI全面转向终端版,采用前后端分离架构。本文记录这次重…...

数据科学监控告警:构建智能系统健康监测的终极指南

数据科学监控告警:构建智能系统健康监测的终极指南 【免费下载链接】data-science 📊 Path to a free self-taught education in Data Science! 项目地址: https://gitcode.com/gh_mirrors/da/data-science GitHub 加速计划 / da / data-science …...

智能批量照片水印处理工具:自动化EXIF信息标注与品牌展示解决方案

智能批量照片水印处理工具:自动化EXIF信息标注与品牌展示解决方案 【免费下载链接】semi-utils 一个批量添加相机机型和拍摄参数的工具,后续「可能」添加其他功能。 项目地址: https://gitcode.com/gh_mirrors/se/semi-utils Semi-Utils是一款面向…...

NBTExplorer:我的世界数据编辑的终极图形化解决方案

NBTExplorer:我的世界数据编辑的终极图形化解决方案 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer 你是否曾想过像编辑普通文件一样修改《我的世界》的…...

Z-Image-LM权重验证效果展示:LM系列在跨域prompt(中西建筑融合)下表现

Z-Image-LM权重验证效果展示:LM系列在跨域prompt(中西建筑融合)下表现 1. 工具介绍与核心能力 Z-Image-LM是一款基于阿里云通义Z-Image架构开发的Transformer权重可视化测试工具,专门为LM系列自定义权重设计。这个工具解决了模型…...

紧急预警:Docker 27.1将废弃--link参数,所有依赖可视化编排的低代码平台(如简道云、明道云)容器化方案需立即重构——附向后兼容迁移路径图

更多请点击: https://intelliparadigm.com 第一章:Docker 27.1废弃--link参数的底层动因与影响全景 Docker 自 27.1 版本起正式移除 --link 参数,这一变更并非简单功能删除,而是容器网络模型演进的关键节点。其核心动因在于 --li…...

TDR阻抗测试仪Bamtone H系列深度评测

在高速数字设计、射频工程和精密线缆制造中,当信号速率跃升至Gbps级别,或传输距离延长时,哪怕微小的阻抗失配都可能引发严重的信号反射、抖动和衰减,导致系统失效。因此,选择一台精准、可靠、高效的时域反射&#xff0…...

Docker 27 医疗容器认证避坑指南:为什么83%的HIS系统容器化项目因OCI运行时配置失败被驳回?

更多请点击: https://intelliparadigm.com 第一章:Docker 27 医疗容器合规认证全景图 医疗行业对容器化应用的合规性要求极为严苛,Docker 27 引入了面向 HIPAA、GDPR 和中国《医疗器械软件注册审查指导原则》的原生合规增强机制。其核心在于…...

RepoAgent:基于大语言模型的智能代码仓库分析与自动化文档生成

1. 项目概述:当代码仓库遇上智能体最近在折腾一个挺有意思的项目,叫 RepoAgent。这名字听起来就挺“代理”的,没错,它的核心定位就是一个专门用来“阅读”和理解代码仓库的智能体。简单来说,你可以把它想象成一个超级用…...

ProseMirror View 插件生态系统分析:常用插件及其实现原理

ProseMirror View 插件生态系统分析:常用插件及其实现原理 【免费下载链接】prosemirror-view ProseMirrors view component 项目地址: https://gitcode.com/gh_mirrors/pr/prosemirror-view ProseMirror View 作为 ProseMirror 编辑器的核心组件&#xff0c…...

从零构建智能网页向量索引系统:原理、实现与优化

1. 项目概述:从“网页”到“向量”的智能索引革命如果你和我一样,每天需要处理海量的网页信息,无论是做市场调研、竞品分析,还是构建自己的知识库,都会面临一个核心痛点:信息是找到了,但怎么才能…...

HALCON深度学习模型部署新选择:一份详细的OpenVINO 2021.4 LTS集成与配置避坑指南

HALCON深度学习模型部署新选择:OpenVINO 2021.4 LTS集成与配置避坑指南 当机器视觉工程师首次尝试将HALCON与OpenVINO结合时,往往会陷入版本兼容性迷宫和环境配置陷阱。本文将从实际工业场景出发,手把手解决集成过程中的典型痛点,…...

Nez精灵图集打包器:自动化管理游戏资源的终极指南

Nez精灵图集打包器:自动化管理游戏资源的终极指南 【免费下载链接】Nez Nez is a free 2D focused framework that works with MonoGame and FNA 项目地址: https://gitcode.com/gh_mirrors/ne/Nez Nez精灵图集打包器是Nez游戏框架中一款强大的工具&#xff…...

TranslucentTB完整指南:3步轻松打造个性化Windows任务栏

TranslucentTB完整指南:3步轻松打造个性化Windows任务栏 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 想让你的Windows桌面…...

Smara全栈框架解析:文件路由、服务端函数与类型安全实践

1. 项目概述:一个面向未来的全栈应用开发框架最近在GitHub上闲逛,发现了一个名为smara-io/smara的项目,它的star数增长得挺快,引起了我的注意。作为一个在Web开发领域摸爬滚打了十多年的老码农,我对各种框架、工具链的…...

DownKyi哔哩下载姬:3分钟学会下载B站8K超高清视频的终极指南

DownKyi哔哩下载姬:3分钟学会下载B站8K超高清视频的终极指南 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等…...

pandas-gpt:基于LLM工具调用架构的智能数据分析副驾驶

1. 项目概述与核心价值最近在数据处理的圈子里,一个名为rvanasa/pandas-gpt的项目引起了我的注意。乍一看这个名字,可能会觉得它又是一个简单的“AI包装器”,无非是把大语言模型(LLM)的API套在Pandas上,生成…...

YGOPro 卡牌特效实现原理:连锁处理与状态管理机制

YGOPro 卡牌特效实现原理:连锁处理与状态管理机制 【免费下载链接】ygopro A script engine for "yu-gi-oh!" and sample gui 项目地址: https://gitcode.com/gh_mirrors/yg/ygopro YGOPro 作为一款开源的卡牌游戏引擎,其核心魅力在于精…...

基于MCP协议的AI语音对话系统:VoiceMode架构解析与实战部署

1. 项目概述:解放双手的AI语音对话新范式作为一名长期与代码和命令行打交道的开发者,我深知长时间盯着屏幕、双手离不开键盘的疲惫感。很多时候,一个灵光乍现的想法,或者一段复杂的逻辑梳理,恰恰发生在你无法立刻坐下敲…...

Unity3D的Material 物理材质

Material 物理材质 这个选项用于模拟物体表面的物理材质,对于地面而言,比如冰面、木板、水泥板这些。对于物体本身而言,比如物理自身的弹性,物理自身的平滑度之类的,都会直接影响到物理模拟的效果。创建物理材质和创建…...

别再手动配置了!用Docker Compose 5分钟搞定ChirpStack v4物联网服务器

5分钟极速部署ChirpStack v4:Docker Compose实战指南 在物联网项目快速迭代的今天,LoRaWAN服务器的部署效率直接关系到整个项目的推进速度。传统的手动配置方式往往需要数小时甚至更长时间,而借助Docker Compose,我们完全可以在5分…...

Taotoken 的 API Key 管理与访问控制如何保障企业调用安全

Taotoken 的 API Key 管理与访问控制如何保障企业调用安全 1. 企业级 API Key 管理架构 在规模化使用大模型的企业环境中,API Key 的集中管理是安全调用的第一道防线。Taotoken 平台为企业管理员提供了分层级的密钥管理体系,支持通过控制台批量创建、禁…...

Phi-3.5-Mini-Instruct多场景落地:跨境电商客服话术生成+多语言翻译辅助

Phi-3.5-Mini-Instruct多场景落地:跨境电商客服话术生成多语言翻译辅助 1. 项目背景与价值 在跨境电商运营中,客服话术生成和多语言翻译是两大核心痛点。传统解决方案往往需要分别使用不同工具,效率低下且成本高昂。微软Phi-3.5-Mini-Instr…...

四大科技巨头狂砸7250亿美元:AI算力军备竞赛白热化

早上刷新闻的时候,看到一个数字让我愣住了——7250亿美元。 这不是某家公司的市值,也不是某个国家的GDP,而是谷歌、亚马逊、微软、Meta这四家科技巨头,计划在2026年投入的AI基础设施总预算。 同比增长77%。 这个数字背后&#xff…...

AI智能体如何通过RAG技术实现基于文件内容的自动化任务规划

1. 项目概述:当AI规划器学会“看”文件最近在折腾AI智能体(Agent)和自动化流程时,我遇到了一个挺有意思的项目:copaw-planning-with-files。光看名字,copaw这个组合词就挺有辨识度的,它很可能是…...

从日文小白到创作大师:HS2-HF_Patch如何重塑你的《Honey Select 2》游戏体验

从日文小白到创作大师:HS2-HF_Patch如何重塑你的《Honey Select 2》游戏体验 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 你是否曾经面对《Honey…...

Python爬虫实战:手把手教你如何抓取农作物品种名录,构建标准化种业索引数据库!

㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~ ㊙️本期爬虫难度指数:⭐ (基础入门篇) 🉐福利: 一次订阅后,专栏内的所有文章可永久免费看,持续更新中,保底1000+(篇)硬核实战内容。 全文目录: 🌟 开篇…...

手机SoC低功耗设计的幕后:UPF如何让你的手机续航更久?从DVFS到电源门控的完整工作流

手机SoC低功耗设计的幕后:UPF如何让你的手机续航更久?从DVFS到电源门控的完整工作流 当你滑动手机屏幕解锁的瞬间,数十亿晶体管在纳米尺度下开始精密协作。但很少有人注意到,真正决定用户体验的往往是那些看不见的功耗控制技术——…...

java基础总结笔记(2026.05.06)

javase注释/** 多行注释*/ ​ //JavaDoc:文档注释 ​ /** Description Helloworld* Author thr*/标识符关键字所有的标识符都应该以大写字母或者小写字母、美元符号💲、下划线开始的。首字符之后可以是大写字母或者小写字母、美元符号💲、下划…...

IAPWS Python库:工业级热力学计算与工程分析的终极解决方案

IAPWS Python库:工业级热力学计算与工程分析的终极解决方案 【免费下载链接】iapws python libray for IAPWS standard calculation of water and steam properties 项目地址: https://gitcode.com/gh_mirrors/ia/iapws 你是否曾为复杂的热力学计算而头疼&am…...