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

龙虾-OpenClaw一文详细了解-手搓OpenClaw-1

龙虾-OpenClaw一文详细了解-手搓OpenClaw-1

这一系列我会用 Python 一步步手搓一个“可运行、可扩展、可解释”的 OpenClaw 简化版。
第一篇先不追求功能多,而是先搭好最重要的骨架:服务入口、会话并发模型、最小 Agent Loop。

0. 为什么要手搓 OpenClaw

OpenClaw 很强,但完整工程体量也很大。对于大多数开发者来说,直接阅读全量代码会有三个痛点:

  • 模块多:Gateway、Agent、Tools、Sessions、Channels 互相耦合
  • 路径长:一条消息从输入到回复,跨越多个子系统
  • 调试难:没有自己的“最小版本”,很难定位问题

所以这个系列采用一个更实用的学习路径:
先做最小闭环,再逐步补齐能力。


1. 目标

用 Python 从 0 到 1 复现 OpenClaw 的核心能力:

  • Agent Loop(工具调用 + 多轮推理)
  • Session 与并发隔离
  • 记忆系统(短期 + 长期)
  • Skills 系统(分层加载)
  • Web/Telegram 等渠道接入

第一篇的阶段目标是:

  • 跑起 FastAPI 服务
  • 打通一个最小/v1/chat对话接口
  • 具备会话隔离与并发控制(每会话锁 + 全局信号量)

2. 目标架构

用户输入: CLI/Web/Telegram/Discord

Gateway Server

SessionManager

Session Lock + Global Semaphore

Agent Loop

Prompt Builder

LLM Provider Adapter

Tool Runtime

exec/web/search/read/write...

Memory Manager

短期会话历史

长期记忆: MEMORY.md + 日志

Knowledge RAG

BM25 + Embedding + RRF + Rerank

Skill Registry

L1 元数据

L2 指令加载

L3 资源加载

Cron Scheduler


3. 技术选型

  • 语言:Python 3.11+
  • 服务框架:FastAPI(Web/Dashboard/API 一体)
  • 模型接入:先用简化 Provider 抽象,后续切真实 OpenAI Compatible
  • 并发模型:asyncio+ 每会话Lock+ 全局Semaphore
  • 配置与数据模型:Pydantic v2+pydantic-settings
  • 日志:标准logging(后续可升级 JSON 结构化日志)
  • 任务调度:APScheduler(后续阶段引入)
  • 数据库:第一篇先不强依赖,阶段二引入PostgreSQL + pgvector

4. 第一篇完成了什么

本篇配套工程目录:openclaw_py下载地址:https://gitee.com/wisdomfriend/openclaw_py

已经有这些关键模块:

  • app/main.py:FastAPI 启动入口
  • app/api/routes_chat.py:最小聊天接口
  • app/session/manager.py:会话复用 + 并发控制
  • app/core/agent.py:最小 Agent Loop(先支持 echo 与工具占位)
  • app/core/tools.py:工具注册与调用骨架
  • run.py:一键启动uvicorn
  • .envrequirements.txt:本地运行基础配置

5. 如何运行(可复制)

cdopenclaw_py python-mvenv .venv .venv\Scripts\activate pipinstall-rrequirements.txt python run.py

服务启动后:

  • 健康检查:http://127.0.0.1:7788/health
  • OpenAPI 文档:http://127.0.0.1:7788/docs

测试聊天接口(PowerShell):

curl-XPOST"http://127.0.0.1:7788/v1/chat"^-H"Content-Type: application/json"^-d"{\"session_id\":\"demo\",\"message\":\"hello\"}"

6. 设计细节:为什么 SessionManager 要先做

很多人一开始只关心 LLM 调用,但真实系统更容易先死在并发上。
如果同一个session_id同时进两条消息,不加锁就会出现:

  • 历史消息交错写入
  • 上下文错乱,回复“串台”
  • 工具调用顺序被打乱

所以第一篇就把这一层打好:

  • 同一会话:串行(asyncio.Lock
  • 全局会话:限流(asyncio.Semaphore

这一步是后面做“记忆系统”和“多渠道接入”的地基。

from__future__importannotationsimportasynciofromcontextlibimportasynccontextmanagerfromtypingimportAsyncIteratorfromapp.configimportsettingsfromapp.core.agentimportAgentclassSessionManager:def__init__(self,max_concurrent:int=4)->None:self._sessions:dict[str,Agent]={}self._locks:dict[str,asyncio.Lock]={}self._semaphore=asyncio.Semaphore(max_concurrent)defget_or_create(self,session_id:str)->Agent:ifsession_idnotinself._sessions:self._sessions[session_id]=Agent()returnself._sessions[session_id]defget_lock(self,session_id:str)->asyncio.Lock:ifsession_idnotinself._locks:self._locks[session_id]=asyncio.Lock()returnself._locks[session_id]@asynccontextmanagerasyncdefacquire(self,session_id:str)->AsyncIterator[None]:lock=self.get_lock(session_id)asyncwithlock:asyncwithself._semaphore:yielddef__len__(self)->int:returnlen(self._sessions)_session_manager=SessionManager(max_concurrent=settings.max_concurrent_agents)defget_session_manager()->SessionManager:return_session_manager

7. 这篇没做什么

为了保证节奏清晰,第一篇有意不做:

  • 不接真实大模型 API(先保留 Provider 接口)
  • 不做复杂工具协议(先保留 Tool Runtime 骨架)
  • 不做数据库与向量检索(留给阶段二)
  • 不做 Telegram/Discord 真接入(留给阶段三)

8. 常见坑与排查

  • 端口占用:把.env里的PORT改掉
  • 全局环境依赖冲突:优先用.venv,不要直接污染系统 Python

9. 下一篇预告

下一篇我会接入真实的OpenAI-Compatible Provider,把当前的EchoProvider替换掉,内容包括:

  • .env增加OPENAI_API_KEYOPENAI_BASE_URL
  • Provider 抽象如何兼容不同模型厂商
  • 超时、重试、错误映射的最小实现

到那时,这个项目就会从“骨架”进化成“真能聊天的 Agent”。

http://www.jsqmd.com/news/612064/

相关文章:

  • 从SSR到DeltaK:群体结构分析的完整流程与可视化实践
  • MTools AI智能工具实测:50页PDF快速摘要,附带原文引用
  • 北京墨想空间艺术装饰有限公司联系方式查询:高端墙面地面艺术饰面系统服务商的合作渠道与选用参考 - 品牌推荐
  • 如何突破信息壁垒?Bypass Paywalls Clean的全方位应用指南
  • Llama-3.2-3B保姆级教程:Ollama一键部署,小白也能玩转文本生成
  • 解锁Wallpaper Engine的宝藏:RePKG让你的创意资源触手可及
  • Steam Achievement Manager:Steam成就管理的全能工具
  • CCMusic企业级部署指南:SpringBoot微服务集成音乐分类API
  • 为什么峰值电流控制不适合Boost PFC
  • 如何快速打造个性化DOL游戏体验:新手完整配置指南
  • 2026自贡医养结合养老院性价比推荐榜:自贡失能失智养老院/自贡康养中心/自贡护理养老院/自贡老年公寓/自贡舒适养老院/选择指南 - 优质品牌商家
  • 如何通过XXMI启动器一站式解决多游戏模组管理难题
  • 卡梅德生物技术快报|重组蛋白昆虫表达培养基对比与工艺选型
  • [Python] 跨越平台鸿沟:在Linux上成功部署IsaacGym的完整实践
  • 北京墨想空间艺术装饰有限公司联系方式查询:高端墙面地面艺术饰面系统服务商的合作路径与选择考量 - 品牌推荐
  • 从平面波到球面波:ISAC近场技术如何重塑无线通信与感知
  • 用LTspice复刻经典电源设计:LM2596降压电路仿真全记录(含WEBENCH对比)
  • 工业相机数据传输协议对比:Camera Link、GigE、USB3.0的性能与适用场景
  • RimWorld模组管理终极指南:从混乱到秩序的专业解决方案
  • LightOnOCR-2-1B GPU算力方案:单卡A10部署 vs 双卡T4分片部署成本效益对比
  • 联想拯救者性能优化工具完整指南:释放笔记本潜力的终极解决方案
  • DDR核心机制解析:Burst与Prefetch如何协同提升内存效率
  • 南北阁Nanbeige 4.1-3B实战:模拟互联网公开数据抓取与合规性分析
  • 视频剪辑效率提升80%:JianYingApi自动化解决方案深度剖析
  • OpenClaw技能库怎么用?从获取、下载到添加使用一篇讲清
  • CI/CD 平台选型对比:与 Jenkins 同类的方案
  • 项目的CI持续集成和cd持续部署测试是怎么做的?
  • 微信聊天记录导出完整指南:三步永久保存你的珍贵回忆
  • docker容器进程探究
  • DeEAR语音情感识别惊艳效果:专业配音员 vs 素人语音在自然度维度的显著区分