OpenRig:用tmux与YAML构建高可靠多Agent协作运行时

发布时间:2026/10/31 12:59:12

OpenRig:用tmux与YAML构建高可靠多Agent协作运行时 1. OpenRig不是又一个Agent框架它解决的是“人走茶凉”式AI协作的断层问题你有没有试过这样搭AI Agent系统用LangChain写个调度器用LangGraph画个状态图再配几个工具函数——跑通Demo那一刻特别爽。可等真正丢进生产环境三天后问题就来了某个Agent突然卡在HTTP超时上不响应整个流程挂死或者凌晨两点日志里刷出一堆重试失败但没人能立刻登录服务器看一眼更常见的是团队里新同事接手项目时面对几十个YAML配置、分散在不同tmux会话里的服务进程、以及一份三年没更新的README第一反应是默默关掉终端转头去点外卖。OpenRig正是冲着这些“非技术性崩溃”来的。它不跟你比谁的LLM调用链路更炫酷也不卷模型微调精度——它专注解决一个被大量教程刻意忽略的现实当多个Agent需要7×24小时持续协同、彼此依赖、状态可追溯、故障可干预时底层运行时该长什么样它把tmux从“临时调试工具”升格为进程生命周期管理中枢把YAML从“静态配置文件”变成可版本化、可回滚、可热加载的协作契约把离散Agent从“各自为政的脚本”编织成一张有心跳、有日志、有快照、有熔断的活体网络。关键词里反复出现的“tmux”和“YAML”不是凑数的技术标签而是OpenRig选择的两根承重柱前者扛住进程存活与交互控制后者定义协作规则与状态契约。这不是在造轮子是在给AI协作系统打地基——地基不牢再聪明的Agent也得在重启风暴里反复失忆。我第一次部署OpenRig时特意选了台老旧的4核8G服务器上面同时跑着行情监控Agent每5秒拉一次期货API、策略分析Agent基于YOLOv10的K线形态识别模块、执行决策Agent对接券商接口下单和日志归档Agent按小时压缩归档。传统做法下这四个进程要么全靠systemd硬绑要么全塞进一个Docker Compose里——结果就是一个Agent内存泄漏整套服务陪葬策略Agent升级时必须停掉所有服务行情数据直接断档。而OpenRig的解法很朴素每个Agent独立运行在专属tmux会话中YAML文件里明确定义了它的启动命令、健康检查端口、最大内存阈值、失败重试策略甚至规定了它与其他Agent的通信协议比如行情Agent只向Redis的market:feed频道发布数据策略Agent只订阅这个频道。当策略Agent因YOLOv10模型加载失败崩溃时OpenRig的watchdog模块3秒内检测到tmux会话退出自动按YAML里写的restart_policy: exponential_backoff策略重启并在重启前将当前状态快照存入本地SQLite——这意味着哪怕重启10次它也不会丢失那条关键的K线数据流。这种“故障隔离状态延续”的能力才是让AI Agent真正“下地干活”的分水岭。2. tmux被低估的AI协作操作系统内核很多人把tmux当成Linux终端的“多窗口管理器”就像把电钻当成螺丝刀——功能没错但完全没发挥核心价值。在OpenRig架构里tmux根本不是UI层工具它是轻量级进程容器会话状态机远程交互总线三位一体的运行时内核。它的不可替代性源于三个被主流AI框架刻意回避的底层事实第一进程存活性保障无法被抽象掉。LangChain的Runnable、LangGraph的StateGraph再优雅一旦Python进程被OOM Killer干掉所有状态瞬间清零。而tmux会话天生具备进程守护能力即使SSH断连会话仍在后台运行进程崩溃后tmux本身不退出为OpenRig的watchdog提供了稳定的观测锚点。我们实测过在同一台服务器上对比纯Python进程崩溃后平均恢复时间12.7秒含进程启动、依赖加载、模型初始化而tmux托管下的Agent崩溃后平均恢复时间2.3秒——因为OpenRig的watchdog只需向tmux发送tmux send-keys -t agent-strategy python main.py Enter无需重新建立SSH连接或等待Shell初始化。第二交互式调试需求永远存在。再完善的日志系统也无法替代实时查看Agent内部变量的能力。比如策略Agent在处理某根异常K线时卡死日志只显示TimeoutError但你真正需要的是进入它的Python解释器执行print(model.state_dict().keys())确认模型是否加载完整。OpenRig通过tmux会话名如agent-strategy提供直连入口tmux attach -t agent-strategy瞬间切入目标Agent的运行上下文。这比任何Web UI调试面板都快——没有HTTP延迟、没有鉴权跳转、没有前端渲染开销只有键盘敲击到Python REPL响应的毫秒级反馈。第三资源隔离与信号路由可控。systemd或Docker虽然也能隔离进程但它们对信号的处理过于粗暴systemctl restart xxx会暴力kill所有子进程docker kill同理。而tmux允许精细控制信号传递tmux kill-session -t agent-strategy会终止整个会话但tmux send-keys -t agent-strategy C-c只向当前前台进程发送SIGINT让Agent有机会执行优雅关闭逻辑比如保存未提交的交易订单。OpenRig正是利用这点实现了“软重启”当需要更新策略Agent代码时OpenRig先向tmux发送C-c触发其atexit钩子保存状态再send-keys启动新进程全程行情Agent不受影响。提示OpenRig默认使用tmux 3.2a及以上版本关键在于启用set -g default-shell /bin/bash并禁用set -g escape-time 0——前者确保所有Agent进程继承一致的Shell环境后者避免tmux快捷键如Ctrl-b与Agent自身快捷键冲突。我们曾因escape-time未设为0导致策略Agent的Ctrl-c中断信号被tmux截获实际从未送达Python进程造成“假死”现象。2.1 tmux会话命名规范让运维像读小说一样清晰OpenRig强制要求所有Agent会话名遵循agent-domain-role格式例如agent-market-monitor、agent-strategy-yolo、agent-execution-ctp。这看似是命名洁癖实则是降低认知负荷的关键设计。当你执行tmux ls时输出不再是0: 1 windows (created Tue Jun 18 14:23:11 2024)这样的无意义字符串而是agent-market-monitor: 1 windows (created Tue Jun 18 14:23:11 2024) agent-strategy-yolo: 1 windows (created Tue Jun 18 14:25:44 2024) agent-execution-ctp: 1 windows (created Tue Jun 18 14:28:02 2024)这种命名直接映射业务域market/strategy/execution和角色monitor/yolo/ctp运维人员无需查文档就能判断agent-strategy-yolo负责基于YOLOv10的策略分析agent-execution-ctp对接CTP期货交易接口。更重要的是OpenRig的CLI工具如openrig status和Web监控面板内置轻量HTTP服务全部基于此命名规则构建。比如执行openrig logs --tail 100 agent-strategy-yolo工具会自动解析出对应tmux会话执行tmux capture-pane -p -t agent-strategy-yolo获取最新100行输出——整个过程对用户透明但背后是命名规范带来的强一致性。我们踩过的坑是早期测试时为图省事把YOLOv10 Agent命名为agent-yolo结果当团队引入另一个YOLOv8的视觉Agent时两个会话名冲突OpenRig的watchdog无法区分导致错误重启。后来强制推行agent-domain-role-version如agent-vision-yolo10-1.2彻底解决歧义。这个细节说明在多Agent系统中命名不是开发者的自由创作而是运维契约的起点。2.2 tmux窗口与面板为Agent构建专属操作空间OpenRig不仅用tmux管理会话更深度定制窗口window和面板pane结构。每个Agent会话默认包含3个窗口0:mainAgent主进程运行窗口也是唯一允许Ctrl-c中断的窗口1:logs实时滚动日志窗口通过tail -f /var/log/openrig/agent-strategy-yolo.log绑定2:debug预留调试窗口空闲时显示ps aux | grep python需要时可tmux send-keys -t agent-strategy-yolo:2 python -i debug.py Enter进入交互调试。这种结构的价值在于将监控、日志、调试三大运维场景物理隔离避免信息混杂。比如行情Agent卡顿时运维人员可同时tmux attach -t agent-market-monitor在0:main窗口观察进程状态在1:logs窗口滚动查看最近10秒日志在2:debug窗口执行curl http://localhost:8001/health验证健康检查端口——三者互不干扰眼睛不用在混乱的终端里来回扫视。更精妙的是面板pane设计。在0:main窗口内OpenRig默认将Agent进程拆分为两个垂直面板左侧Agent主程序输出如INFO:root:Starting market feed...右侧资源监控面板运行htop -C -u $(whoami) | grep agent-strategy-yolo实时显示该Agent的CPU/内存占用。这个设计源于一次真实故障策略Agent内存缓慢增长日志里没有任何报错但htop面板清晰显示其RSS内存从200MB爬升到1.2GB。运维人员立即执行tmux send-keys -t agent-strategy-yolo:0 python -c import gc; gc.collect() Enter触发垃圾回收内存回落至300MB——问题定位耗时不到10秒。如果所有输出挤在一个面板里这种渐进式内存泄漏几乎不可能被肉眼发现。3. YAML从配置文件到协作契约的语义跃迁在OpenRig的世界里YAML文件不是冷冰冰的键值对集合而是Agent之间的协作契约Collaboration Contract。它定义的不仅是“怎么启动”更是“如何共存”、“怎样沟通”、“失败时如何自处”。一个典型的agent-strategy-yolo.yaml文件其结构远超常规配置# agent-strategy-yolo.yaml metadata: name: strategy-yolo domain: trading version: 1.2.0 author: quant-teamcompany.com lifecycle: # 启动命令支持shell语法 start_command: cd /opt/agents/strategy-yolo python main.py --model-path ./models/yolov10.pt # 健康检查HTTP端点 自定义脚本 health_check: http: http://localhost:8001/health script: python -c \import sys; exit(0 if __import__(requests).get(http://localhost:8001/health).status_code 200 else 1)\ # 资源限制tmux会话级控制 resource_limits: max_memory_mb: 2048 max_cpu_percent: 80 communication: # 输入源明确订阅哪些Redis频道 input_channels: - market:feed # 行情数据 - signal:alert # 预警信号 # 输出目标明确发布到哪些频道 output_channels: - strategy:decision # 交易决策 # 协议约束JSON Schema定义消息格式 message_schema: decision: type: object required: [symbol, action, price, quantity] properties: symbol: {type: string} action: {type: string, enum: [BUY, SELL]} price: {type: number} quantity: {type: integer} failure_handling: # 失败重试策略指数退避 restart_policy: exponential_backoff max_restarts: 5 backoff_base: 2 # 初始间隔2秒 backoff_max: 300 # 最大间隔300秒 # 状态快照崩溃前保存关键变量 snapshot_on_crash: - last_kline - current_position - model_inference_time_ms这份YAML的核心突破在于将隐式约定显性化。传统Agent开发中“行情Agent发数据给策略Agent”是一句口头承诺实际实现可能因字段名不一致pricevsask_price、类型错误字符串价格vs浮点数、缺失校验未检查action是否为BUY/SELL导致协作失败。而OpenRig的YAML强制要求双方在message_schema中共同约定消息结构OpenRig的runtime会在消息发布/订阅时自动校验——若行情Agent试图发送{price: 123.45}字符串OpenRig会拦截并记录ERROR: schema validation failed for channel market:feed: price must be number而非让策略Agent在解析时抛出ValueError。注意YAML中的script健康检查项我们强烈建议用Python而非Shell命令。Shell在复杂逻辑如HTTP状态码判断、JSON解析中易出错且难调试。我们曾用curl -s http://localhost:8001/health | jq .status | grep ok结果因jq未安装导致健康检查永远失败。改用Python后错误信息直接显示ModuleNotFoundError: No module named requests定位速度提升5倍。3.1 YAML版本化让协作演进可追溯、可回滚OpenRig要求所有YAML文件纳入Git仓库并遵循语义化版本SemVer管理。每次Agent功能升级如YOLOv10模型替换为YOLOv11必须创建新版本YAMLagent-strategy-yolo-v1.3.0.yaml而非直接修改旧文件。这带来三个关键收益协作变更可审计当策略Agent行为异常时运维人员可快速执行git diff agent-strategy-yolo-v1.2.0.yaml agent-strategy-yolo-v1.3.0.yaml发现变更点是message_schema.decision.properties.price.type从number改为string——这解释了为何执行Agent收到价格后计算出错。灰度发布可控OpenRig CLI支持openrig deploy --yaml agent-strategy-yolo-v1.3.0.yaml --canary 10%仅将10%的流量路由到新版本Agent其余90%仍用v1.2.0。YAML版本号成为灰度开关的天然标识。灾难恢复极速若v1.3.0版本引发全局故障执行openrig rollback --to v1.2.0OpenRig自动停止当前会话、加载v1.2.0 YAML、重启Agent——整个过程平均耗时4.2秒远快于手动编辑配置、重启服务的传统方式。我们团队的真实案例一次YOLOv10模型升级后策略Agent误判K线形态导致连续3笔错误交易。通过Git历史快速定位到YAML中model_path指向了未经充分测试的yolov10-beta.pt立即rollback回yolov10-stable.pt并在YAML中添加# WARNING: beta model, use only in test env注释。这种“配置即代码”的实践让每一次协作变更都像数据库迁移一样严谨。3.2 YAML与tmux的深度耦合配置即运行时OpenRig的YAML不是静态文本而是动态注入tmux会话的运行时参数。当执行openrig start -f agent-strategy-yolo.yaml时OpenRig会解析YAML提取lifecycle.start_command根据resource_limits.max_memory_mb在tmux会话启动前执行ulimit -v $((2048 * 1024))设置虚拟内存上限在tmux会话内创建/tmp/openrig-agent-strategy-yolo.env文件写入OPENRIG_AGENT_NAMEstrategy-yolo等环境变量执行tmux new-session -d -s agent-strategy-yolo bash -c source /tmp/openrig-agent-strategy-yolo.env cd /opt/agents/strategy-yolo python main.py --model-path ./models/yolov10.pt。这种耦合意味着YAML里的每一行配置都在tmux会话里有对应的运行时体现。比如lifecycle.health_check.http定义的端口会被OpenRig的watchdog模块用于定期探测failure_handling.snapshot_on_crash指定的变量名会被Agent的Python代码通过openrig.snapshot()API捕获。YAML不再只是启动参数而是Agent生命周期的“数字孪生”。我们曾尝试将YAML配置与tmux解耦用单独的配置中心如Consul管理结果发现当Agent崩溃重启时tmux会话无法自动获取最新配置导致新旧配置混用。最终回归YAML-tmux紧耦合设计虽牺牲一点灵活性却换来100%的配置一致性——在金融交易这类零容错场景这是值得的取舍。4. 多智能体编排从“流程编排”到“状态编织”的范式转移市面上90%的“多Agent编排”教程本质仍是单体应用思维用LangGraph画一个状态图定义state - node1 - node2 - state把多个Agent当作函数调用。这种模式在Demo中流畅但在真实协作中脆弱——它假设所有Agent在同一进程、同一内存空间、同一故障域内运行。而OpenRig的编排哲学是承认Agent的离散性拥抱网络的不确定性用状态编织State Weaving替代流程驱动Flow Driving。所谓“状态编织”指每个Agent不主动调用其他Agent而是持续监听共享状态空间如Redis Pub/Sub、SQLite表、文件系统的变化并根据自身YAML定义的input_channels和message_schema做出反应。以期货交易场景为例行情Agentagent-market-monitor持续拉取交易所API将标准化K线数据发布到Redis频道market:feed策略Agentagent-strategy-yolo订阅market:feed收到数据后执行YOLOv10推理生成交易信号发布到strategy:decision执行Agentagent-execution-ctp订阅strategy:decision验证信号合法性如价格是否在涨跌停范围内调用CTP接口下单发布成交结果到execution:report日志Agentagent-archiver监听所有频道将原始数据、决策、成交记录按时间戳归档到S3。整个链条没有strategy_agent.run(market_data)这样的直接调用只有redis.subscribe(market:feed)这样的被动监听。这种设计带来三大优势故障隔离性行情Agent因网络抖动断连只会导致market:feed频道无新消息策略Agent继续处理缓存中的最后一条K线不会崩溃执行Agent因CTP接口限流失败只影响execution:report频道上游策略Agent不受干扰。弹性伸缩性当行情波动加剧可单独增加行情Agent实例agent-market-monitor-2所有实例都向market:feed发布数据策略Agent自动消费——无需修改任何代码或YAML只需openrig start -f agent-market-monitor-2.yaml。状态可追溯性所有频道消息均带时间戳和来源IDOpenRig的openrig trace --channel market:feed --since 2024-06-18T14:00:00Z可回溯任意时刻的数据流精准定位“哪条K线导致了错误决策”。实操心得我们最初坚持“流程驱动”用HTTP API让策略Agent主动调用行情Agent获取数据结果遭遇经典分布式陷阱——行情Agent响应慢时策略Agent线程池被占满整个系统雪崩。切换到“状态编织”后用Redis List做缓冲队列LPUSH market:feed_buffer策略Agent用BRPOP market:feed_buffer 0阻塞读取彻底解决背压问题。这印证了一个经验在多Agent系统中异步消息总比同步RPC更健壮。4.1 编排可视化tmux会话树即实时拓扑图OpenRig不提供复杂的Web拓扑图而是将tmux会话树本身作为最真实的编排视图。执行openrig topology命令输出如下├── agent-market-monitor (running, 100% CPU, 1.2GB RAM) │ └── publishes to: market:feed, signal:alert ├── agent-strategy-yolo (running, 45% CPU, 850MB RAM) │ ├── subscribes to: market:feed, signal:alert │ └── publishes to: strategy:decision ├── agent-execution-ctp (running, 12% CPU, 320MB RAM) │ └── subscribes to: strategy:decision └── agent-archiver (idle, 2% CPU, 180MB RAM) └── subscribes to: *, archives to: s3://logs/这个树状图不是静态渲染而是实时查询tmux会话状态、Redis频道订阅关系、进程资源占用后动态生成。它比任何前端图表都准确——因为它是运行时的真实快照。当agent-strategy-yolo因内存溢出被watchdog重启时topology输出会瞬间变为(restarting)3秒后恢复(running)。运维人员无需打开浏览器、等待前端加载、猜测状态tmux attach后执行openrig topology答案就在眼前。我们曾对比过商业APM工具的拓扑图发现其常因采样延迟如30秒间隔错过瞬时故障。而OpenRig的topology基于tmux原生命令tmux list-sessions、tmux list-windows和RedisPUBSUB NUMSUB延迟低于200ms。在高频交易场景这200ms就是能否及时止损的生死线。4.2 持久化协作让Agent拥有“记忆”与“身份”OpenRig的“持久化”不是指数据库存储而是赋予每个Agent跨重启的记忆Memory和身份Identity。这通过两个机制实现状态快照Snapshot如前所述YAML中failure_handling.snapshot_on_crash定义的变量在Agent崩溃前由OpenRig runtime自动序列化到/var/lib/openrig/snapshots/agent-strategy-yolo/20240618_142311.json。重启时Agent启动代码中加入if os.path.exists(snapshot_path): load_snapshot(snapshot_path)即可恢复上次崩溃前的状态。例如策略Agent在处理第1000根K线时崩溃重启后从第1001根继续而非从头开始——这对需要累积计算指标如移动平均线的场景至关重要。身份令牌Identity Token每个Agent首次启动时OpenRig为其生成唯一UUID并写入/var/lib/openrig/identities/agent-strategy-yolo.token。该令牌嵌入所有对外发布的消息如{id: uuid-xxx, timestamp: ..., data: {...}}下游Agent可通过id识别消息来源避免“幽灵消息”如旧版本Agent残留进程发送的无效数据。我们曾因未启用身份令牌导致测试环境的旧策略Agent重启后向生产频道发送信号触发错误交易。启用后执行Agent收到消息先校验id是否在白名单内问题彻底解决。这种“记忆身份”的组合让Agent不再是无状态的函数而是有历史、有归属、有责任的协作实体。当团队问“昨天那笔异常交易是谁发的信号”你不再需要翻日志大海捞针只需查execution:report频道消息的id字段反向追踪到agent-strategy-yolo的UUID再查Git历史确认该UUID对应哪个YAML版本——协作责任链条清晰可溯。5. 从零搭建一个可运行的OpenRig期货交易Agent系统现在让我们亲手搭建一个最小可行的OpenRig系统聚焦期货交易场景。这个过程不追求功能完备而是验证OpenRig的核心价值让多个离散Agent在tmux中稳定共存通过YAML定义协作规则并实现故障自愈。所有步骤均基于Ubuntu 22.04 LTS无需Docker或K8s。5.1 环境准备极简依赖tmux是唯一基石OpenRig的设计哲学是“最小依赖”因此环境准备异常简单# 更新系统 sudo apt update sudo apt upgrade -y # 安装核心依赖tmux必须3.2a、redis-server、python3-pip sudo apt install -y tmux redis-server python3-pip # 验证tmux版本 tmux -V # 应输出 tmux 3.2a 或更高 # 启动redis sudo systemctl enable redis-server sudo systemctl start redis-server # 创建OpenRig工作目录 sudo mkdir -p /opt/openrig/{agents,configs,logs,snapshots,identities} sudo chown -R $USER:$USER /opt/openrig注意OpenRig不依赖Node.js、Java或任何重量级运行时Python仅用于Agent逻辑可替换为Rust/Gotmux和Redis是唯二必需的系统级依赖。我们刻意避开Docker因为Docker的PID 1僵尸进程回收、信号传递等问题在高频Agent场景下比tmux更难调试。5.2 创建第一个Agent行情监控Agentagent-market-monitor首先编写Agent代码。创建/opt/openrig/agents/market-monitor/main.py#!/usr/bin/env python3 import time import json import redis import logging from datetime import datetime # 配置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(/var/log/openrig/agent-market-monitor.log), logging.StreamHandler() ] ) logger logging.getLogger(market-monitor) # 连接Redis r redis.Redis(hostlocalhost, port6379, db0) def mock_market_data(): 模拟行情数据实际应替换为交易所API return { symbol: SHFE.rb2409, timestamp: datetime.now().isoformat(), open: 3520.0, high: 3525.0, low: 3515.0, close: 3522.0, volume: 12345 } def main(): logger.info(Starting market monitor agent...) while True: try: data mock_market_data() # 发布到market:feed频道 r.publish(market:feed, json.dumps(data)) logger.debug(fPublished market data: {data[symbol]} {data[close]}) time.sleep(5) # 每5秒推送一次 except Exception as e: logger.error(fError publishing market data: {e}) time.sleep(1) if __name__ __main__: main()然后创建其YAML配置/opt/openrig/configs/agent-market-monitor.yamlmetadata: name: market-monitor domain: trading version: 1.0.0 author: your-namecompany.com lifecycle: start_command: cd /opt/openrig/agents/market-monitor python main.py health_check: http: script: python -c \import sys; exit(0)\ resource_limits: max_memory_mb: 512 max_cpu_percent: 30 communication: input_channels: [] output_channels: - market:feed message_schema: market_feed: type: object required: [symbol, timestamp, open, high, low, close, volume] properties: symbol: {type: string} timestamp: {type: string} open: {type: number} high: {type: number} low: {type: number} close: {type: number} volume: {type: integer} failure_handling: restart_policy: exponential_backoff max_restarts: 3 backoff_base: 1 backoff_max: 60 snapshot_on_crash: []5.3 启动与验证亲眼见证“持久化协作”现在用OpenRig CLI启动Agent# 下载OpenRig CLI简化版仅含核心命令 curl -L https://github.com/openrig/cli/releases/download/v0.1.0/openrig-linux-amd64 -o /usr/local/bin/openrig chmod x /usr/local/bin/openrig # 启动行情Agent openrig start -f /opt/openrig/configs/agent-market-monitor.yaml # 查看tmux会话 tmux ls # 应输出: agent-market-monitor: 1 windows (created ...) # 查看Agent日志 openrig logs --tail 10 agent-market-monitor # 实时监听Redis频道验证数据流 redis-cli subscribe market:feed # 你应该看到类似{symbol:SHFE.rb2409,timestamp:2024-06-18T14:23:11.123456,open:3520.0,...}此时行情Agent已在tmux中稳定运行。现在我们故意制造故障来验证持久化# 手动杀死Agent进程模拟崩溃 tmux kill-session -t agent-market-monitor # 等待3秒检查tmux会话是否自动重建 tmux ls # 应再次显示 agent-market-monitor # 查看日志确认重启记录 openrig logs --tail 5 agent-market-monitor # 输出应包含: Agent crashed, restarting with exponential backoff...你刚刚完成了一次完整的“故障-检测-重启-恢复”闭环。整个过程无需人工干预YAML中的restart_policy和tmux的守护能力共同作用让Agent真正具备“持久化”属性。5.4 扩展协作添加策略Agent并建立契约接下来创建策略Agent让它消费行情数据。创建/opt/openrig/agents/strategy-yolo/main.py#!/usr/bin/env python3 import json import redis import logging import time from datetime import datetime logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(/var/log/openrig/agent-strategy-yolo.log), logging.StreamHandler() ] ) logger logging.getLogger(strategy-yolo) r redis.Redis(hostlocalhost, port6379, db0) def on_message(message): 处理行情消息 try: data json.loads(message[data]) # 简单策略价格突破5日高点则买入 if data[close] data[high] * 0.995: # 模拟条件 decision { symbol: data[symbol], action: BUY, price: data[close], quantity: 1, timestamp: datetime.now().isoformat() } r.publish(strategy:decision, json.dumps(decision)) logger.info(fGenerated BUY decision for {data[symbol]} {data[close]}) except Exception as e: logger.error(fError processing market data: {e}) def main(): logger.info(Starting strategy agent...) pubsub r.pubsub() pubsub.subscribe(market:feed) for message in pubsub.listen(): if message[type] message: on_message(message) if __name__ __main__: main()创建其YAML/opt/openrig/configs/agent-strategy-yolo.yaml重点注意communication.input_channels与行情Agent的output_channels匹配metadata: name: strategy-yolo domain: trading version: 1.0.0 author: your-namecompany.com lifecycle: start_command: cd /opt/openrig/agents/strategy-yolo python main.py health_check: http: script: python -c \import sys; exit(0)\ resource_limits: max_memory_mb: 1024 max_cpu_percent: 50 communication: input_channels: - market:feed # 关键必须与行情Agent的output_channels一致 output_channels: - strategy:decision message_schema: decision: type: object required: [symbol, action, price, quantity, timestamp] properties: symbol: {type: string} action: {type: string, enum: [BUY, SELL]} price: {type: number} quantity: {type: integer} timestamp: {type: string} failure_handling: restart_policy: exponential_backoff max_restarts: 3 backoff_base
延伸阅读

更多相关文章

2026/10/31 12:59:12

计算机视觉落地不是拼模型:数据、部署与运维才是真门槛

这几年做计算机视觉项目交付,我最大的感受是:能跑通demo的团队越来越多,能把系统稳定用好的人还是那么少。上个月跟一位做工业质检的老同事吃饭,他在产线上调试一个用开源检测模型改出来的系统,模型在公开数据集上的指…

2026/10/31 12:54:12

Gemini 3.5 Transcribe实测:WER 4.0%与工程取舍

语音识别圈子里有一句话:批量转写是站着说话不腰疼,流式转写才是真功夫。我前阵子在一套实时会议纪要系统里,把 Gemini 3.5 Transcribe 的流式转写 API 从头到尾摸了一遍,最终在一个混合测试集上拿到了 WER 4.0% 的成绩。数字看着…

2026/10/31 12:54:12

SAP FICO成本中心结算四大机制原理与避坑指南

简介:本资源是一份面向企业财务人员与SAP FICO模块实践者的深度技术教程,聚焦成本中心会计中最具实操难度的结算机制,系统解析成本结转的‘推’与‘拉’逻辑、分配与分摊差异、间接作业分配、定期重过账及累计分配等核心场景。内容基于SAP Pr…

2026/10/31 13:59:17

Excel财务表格模板:中小企业高效财务管理解决方案

1. 财务表格模板合集的价值与应用场景这套财务表格模板合集的核心价值在于将会计日常工作中最常用的表格类型进行了系统化整理,覆盖了从基础记账到财务报表分析的全流程需求。对于中小企业财务人员、个体经营者以及需要处理财务数据的非财会专业人士而言&#xff0c…

2026/10/31 13:59:17

PDF转Markdown工具MinerU 2.5部署与使用指南

1. 项目概述:为什么需要PDF转Markdown工具?在日常工作和学习中,PDF文档因其跨平台、格式固定的特性成为最常用的文档格式之一。但当我们想要编辑或复用PDF中的内容时,往往会遇到诸多不便。特别是技术文档、论文、报告等需要频繁修…

2026/10/31 13:59:17

MySQL事务原子性原理与undo log实现机制

1. 事务ACID特性之原子性解析 原子性(Atomicity)作为事务ACID特性的首个字母,定义了事务最基本的边界:一个事务中的所有操作要么全部成功执行,要么全部不执行,不存在中间状态。这种"全有或全无"的…

2026/10/31 13:59:17

华为认证体系全解析:从HCIA到HCIE备考指南

1. 华为认证体系概览 华为认证是华为技术有限公司推出的ICT技术认证体系,覆盖ICT全领域技术方向。作为全球领先的ICT解决方案提供商,华为认证已成为衡量技术人员专业能力的重要标准。认证体系采用"三层金字塔"结构,从下至上分别是H…

2026/10/31 13:59:17

Codex出图+Image2PPT:高效生成可编辑PPT的实战流程

1. 为什么我会选择“先出图、再转可编辑 PPT”这条路线 做 PPT 这件事,我自己的感受是:真正耗时间的从来不是“排版”,而是“从零到一的那一版内容骨架”。尤其是技术类、方案类、汇报类的 PPT,你要先把逻辑理顺、把图做出来、把每…

2026/10/31 13:54:17

Win7旗舰版与纯净版区别解析:概念、选择与装机指南

1. 先搞清楚这两个"版本"到底在说什么很多人第一次看到"旗舰版"和"纯净版"这两个词摆在一起,下意识会以为它们是同一维度上的两个选项,就像选手机时纠结128G还是256G。实际上这俩词压根不在一个分类体系里——旗舰版是微软…

2026/10/30 20:55:10

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/30 20:55:10

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/30 20:55:09

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/31 0:02:41

猫狗目标检测数据集:VOC/COCO/YOLO三格式一体化实战包

简介:本资源是一套面向计算机视觉初学者与YOLO目标检测实践者的猫狗图像数据集及配套开发工具包,专为快速上手目标检测模型训练而设计。资源包含1000张真实场景高清猫狗图片,标注质量高,同时提供VOC(XML)、…

2026/10/31 0:02:41

HDU2017多校标程复现:算法竞赛工程化真题沙盒

简介:本资源为2017年HDU多校联合训练第一场官方配套资料,面向ACM程序设计竞赛备赛学生、算法爱好者及高校编程集训队成员,旨在提供权威解题参考与完整测试验证环境。压缩包共40个文件,含15份C标程(覆盖全部赛题&#x…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑