einox

module
v0.5.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 7, 2026 License: Apache-2.0

README

einox

Go Version Status

Not an agent but an agent factory: an embeddable runtime on cloudwego/eino where each system assembles its own agent — tools, approvals and prompts stay first-class code in its repo, and delivery form (single binary, multi-tenant server, mobile thin client) is an assembly decision, not an architectural fork.

在 eino 之上提供 agent 运行时:循环引擎、会话、HITL 审批、沙箱、检查点、skill、多代理编排、通用工具族。einox 是可嵌入的运行时库:contract 是端口面,engine.Options 是组装根(构造期装配、nil 即不生效),业务只装配、不扩展。

einox 是独立的第三方开源项目,与 CloudWeGo / ByteDance 无隶属关系。

为什么需要 einox

agent 的价值来自嵌入领域系统后获得的数据、权限与流程;通用聊天框中这三者都要外挂补齐。einox 面向「每个系统各自智能化」:交互形态与业务面归应用,机制归基座。

三层栈:eino(LLM 应用框架)→ einox(agent 运行时基座)→ 业务 agent。会话生命周期、HITL 审批、沙箱执行、网络容错、上下文整形等运行时关切不在 eino 的能力面内,也不应在每个业务系统重复实现——einox 将其收敛为机制,一次实现、处处装配:一份基座服务多套业务系统,机制单点修复、策略互不渗透。选型论证见 docs/01,分层与场景适配见 docs/02

核心能力

  • 循环引擎:ReAct 主循环、失控护栏、确定性拓扑(supervisor/deep)选配
  • 会话域:会话归属与快照、续聊、排队消息、运行中改向(steering)、TTL 清理
  • HITL 审批:三档模式(manual 逐写审批 / plan 计划卡 / auto 直过)、参数级强制审批(任何模式不豁免)、fail-closed
  • 沙箱:Linux Landlock + seccomp、Windows restricted token、macOS Seatbelt;出口治理(私网默认阻断 + DNS pinning)
  • 网络容错:流式空闲哨兵、错误分类(致命停机/可重试)、有界重连
  • harness:出站上下文经济(超长结果外置换指针)、长会话摘要、子代理编排(同步/后台派生)、动态工具装载
  • 通用工具族:apply_patch / 文件面 / 命令执行 / 代码仓 worktree / 网页提取 / docx·xlsx 等
  • 消息渠道:渠道编排机制核(入站分流/常驻事件订阅/决议续流/主动推送——传输无关)+ 官方飞书件(长连接+卡片)+ 语音供应商口占位;自定义渠道长在业务仓
  • 测试假模型llmtest 无需真实端点即可跑通引擎与工具循环

全量清单见 docs/03-capabilities.md

快速开始

要求 Go 1.26+。einox 是库不是应用:在业务模块中 import 子包(根包无 Go 代码),依赖随 go mod tidy 进入 go.mod。最小装配四项必填:

import (
    "path/filepath"

    "github.com/jumeng/einox/engine"
    "github.com/jumeng/einox/llm"
    "github.com/jumeng/einox/session"
)

reg := session.NewRegistry(store) // store 实现 session.Store(落盘归应用)

m, err := engine.NewManager(reg, engine.Options{
    Providers:     func() []llm.ProviderSpec { return llm.ResolveMerged(cfg) },
    Instruction:   func(b engine.SessionBrief) string { return myInstruction(b) },
    CheckPoints:   func(operator, sid string) engine.CheckPointStore { return myStore(operator, sid) },
    WorkspaceRoot: func(owner, sid string) string { return filepath.Join(dataDir, owner, "workspaces", sid) },
})

// 事件经回调扇出(SSE/WebSocket/CLI 传输归应用),同时落会话记录
m.Run(ctx, sess, userMsg, attachments, func(ev session.Event) { /* 编码转发 */ })

四项必填之外全部可选(nil 即不生效);运行面全貌(Resume/FlushQueue)、业务工具与审批接入见 docs/04-assembly.md。完整可运行示例见 einox-examples(最小装配 / hitl 审批续流 / 多轮与跨进程续聊,剧本假模型驱动、零端点零密钥可跑)。

AI 装配(einox-assemble)

不必手写装配样板:让 AI 编码代理按装配知识层(skill + 清单格式 + 规则 + 预设 + 套路)引导选型并生成 agent 内核。知识层随 module 分发——import 即有,无需克隆本仓

go list -m -f '{{.Dir}}' github.com/jumeng/einox   # 知识层在 <dir>/assemble/

推荐在业务仓 AGENTS.md 贴入一行,代理常驻知晓:

本仓基于 einox 开发 agent。装配走 einox-assemble 知识层:经 go list -m -f '{{.Dir}}' github.com/jumeng/einox 定位 einox 后,读 <dir>/assemble/SKILL.md 并按其流程执行。

流程:选预设组合(minimal/coding/support/data-analysis)打底 → 九域逐项确认(可随时问详情)→ 产出 einox.agent.yaml 能力装配清单 → 按套路样板生成内核 → go build + 清单对账验收。要 skill 常驻(/einox-assemble 引导式)见 assemble/SKILL.md 安装节。

文档

关注点 文档
为什么是 eino docs/01-why-eino.md
为什么需要 einox docs/02-why-einox.md
能力清单 docs/03-capabilities.md
装配 docs/04-assembly.md
沙箱 docs/05-sandbox.md

布局

目录 职责
contract/ 契约面(零 eino import,业务只见此面)
engine/ 循环引擎
session/ 会话与快照
hitl/ 人在环审批
mid/ 工具中间件链
llm/ 模型工厂与网络容错
checkpoint/ 检查点
skills/ skill 机制
workspace/ 工作区
tools/ 通用工具族
sandbox/ 命令执行沙箱(OS 级后端)
prompts/ 内置提示词
einoext/ eino 双向桥
channels/ 官方渠道件(feishu 飞书 / voice 语音占位)——机制核在 engine
llmtest/ 测试假模型

状态

早期开发中,API 不稳定,可能随时破坏兼容。欢迎 issue 与试用反馈。

贡献

仓库工作说明(命令、架构约定、许可与溯源)见 AGENTS.md;提交前 go build ./... && go test ./... 需全绿。

许可

Apache-2.0(见 LICENSE);仓库含改编自第三方开源项目的部分,署名见 NOTICE.md

Directories

Path Synopsis
Package channels 官方通用渠道件目录(对标 llm 供应商「内置目录 + 自定义」 两层模式):feishu 实装、voice 占位。
Package channels 官方通用渠道件目录(对标 llm 供应商「内置目录 + 自定义」 两层模式):feishu 实装、voice 占位。
feishu
client.go SDK 边界真实实现:长连接(ws)事件 → 处理闭包;卡片消息收发。
client.go SDK 边界真实实现:长连接(ws)事件 → 处理闭包;卡片消息收发。
voice
Package voice 流型语音渠道占位(方案接口,零实现——留待后续落地)。
Package voice 流型语音渠道占位(方案接口,零实现——留待后续落地)。
Package checkpoint 是会话检查点的文件存储(adk Get/Set 两方法;自产品 internal/agent/checkpoint.go 迁入)。
Package checkpoint 是会话检查点的文件存储(adk Get/Set 两方法;自产品 internal/agent/checkpoint.go 迁入)。
Package contract 是 einox 对应用层暴露的最小契约面:工具/事件/审批/ 挂起/上下文注入协议(event.go/tool.go/hitl.go/suspend.go)+ 会话域载荷 (session.go:UserPrefs/Attachment/Participant/QueuedMsg)+ 横切常量与 小函数(错误码封闭词表、effort 归一、参数错误翻译)。
Package contract 是 einox 对应用层暴露的最小契约面:工具/事件/审批/ 挂起/上下文注入协议(event.go/tool.go/hitl.go/suspend.go)+ 会话域载荷 (session.go:UserPrefs/Attachment/Participant/QueuedMsg)+ 横切常量与 小函数(错误码封闭词表、effort 归一、参数错误翻译)。
Package einoext 是 eino 组件双向桥:Adapt 把契约工具(contract.Tool)适配 为 eino 工具供引擎组装消费;Bridge 把 eino/eino-ext 组件接入契约面(第三方 件依赖与适配归基座)。
Package einoext 是 eino 组件双向桥:Adapt 把契约工具(contract.Tool)适配 为 eino 工具供引擎组装消费;Bridge 把 eino/eino-ext 组件接入契约面(第三方 件依赖与适配归基座)。
channel 渠道编排机制核(传输无关):外部渠道(即时通信机器人 / 实时语音 / 任意消息入口)与引擎之间的会话编排——入站消息分流(空闲起轮 / 运行中排队 / 挂起接决议续流)、常驻事件订阅出站(覆盖挂起期与后台通知——live 回调 fn 生命周期绑定 Run/Resume 调用的既有缺口由订阅面补齐)、停止与主动推送。
channel 渠道编排机制核(传输无关):外部渠道(即时通信机器人 / 实时语音 / 任意消息入口)与引擎之间的会话编排——入站消息分流(空闲起轮 / 运行中排队 / 挂起接决议续流)、常驻事件订阅出站(覆盖挂起期与后台通知——live 回调 fn 生命周期绑定 Run/Resume 调用的既有缺口由订阅面补齐)、停止与主动推送。
Package hitl 是审批包装器(挂起-续流 HITL 机制;自产品 internal/agent interrupt.go 迁入,对齐官方 approval_wrapper 形态 + fail-closed 语义)。
Package hitl 是审批包装器(挂起-续流 HITL 机制;自产品 internal/agent interrupt.go 迁入,对齐官方 approval_wrapper 形态 + fail-closed 语义)。
internal
calendar
Package calendar ISO 周界单点(engine.DayHeader 与 currenttime 工具共用 ——审查 P3-4:周界数学曾两处各写,时区/年边修正需双改)。
Package calendar ISO 周界单点(engine.DayHeader 与 currenttime 工具共用 ——审查 P3-4:周界数学曾两处各写,时区/年边修正需双改)。
shortid
Package shortid 短标识生成(前缀 + crypto/rand hex)——仓内各域 ID 的 单点实现。
Package shortid 短标识生成(前缀 + crypto/rand hex)——仓内各域 ID 的 单点实现。
strutil
Package strutil 仓内横切字符串小件单点。
Package strutil 仓内横切字符串小件单点。
tstore
Package tstore 是基座测试用会话存储(tmpdir 目录实现 session.Store 与 checkpoint.UserStore——布局约定同产品 FileStore:users/<op>/<rel> 子树 + .tmp 临时域 + 数据根)。
Package tstore 是基座测试用会话存储(tmpdir 目录实现 session.Store 与 checkpoint.UserStore——布局约定同产品 FileStore:users/<op>/<rel> 子树 + .tmp 临时域 + 数据根)。
Package llmtest 提供剧本化假模型(应用侧测试注入——公开面零 eino 类型, 业务测试不 import eino 即可模拟模型行为)。
Package llmtest 提供剧本化假模型(应用侧测试注入——公开面零 eino 类型, 业务测试不 import eino 即可模拟模型行为)。
Package mid 是工具中间件链(guard / errFeed):业务错误回喂模型自纠、 防死循环提醒、单工具执行硬上限。
Package mid 是工具中间件链(guard / errFeed):业务错误回喂模型自纠、 防死循环提醒、单工具执行硬上限。
Package prompts 自研通用提示词资产(业务无关——对位 ext/tools 的提示词 层;将来抽仓随 ext 同走)。
Package prompts 自研通用提示词资产(业务无关——对位 ext/tools 的提示词 层;将来抽仓随 ext 同走)。
Linux 后端编排:施加序与探测子进程(真源 §2.1/§1.3)。
Linux 后端编排:施加序与探测子进程(真源 §2.1/§1.3)。
Package session 是会话域(自产品 internal/agent/session.go 迁入):内存 注册表 + users/<op>/sessions/<sid>/session.json 落盘(用户隔离)。
Package session 是会话域(自产品 internal/agent/session.go 迁入):内存 注册表 + users/<op>/sessions/<sid>/session.json 落盘(用户隔离)。
Package skills 是 skill 挂载机制件:把物化好的 skill 目录经只读 OS backend 接入官方 skill middleware(注册 skill 发现工具、注入使用指令)。
Package skills 是 skill 挂载机制件:把物化好的 skill 目录经只读 OS backend 接入官方 skill middleware(注册 skill 发现工具、注入使用指令)。
Package tools 是 einox 通用工具面基设:类型化工具构造(InferTool——结构体 反射出参数 JSON Schema,schema 推断复用 eino 反射器保证与既有工具面完全 同构)与通用工具族(fs/todo/web/时间/问答/命令/补丁,自原 ext/tools 迁入)。
Package tools 是 einox 通用工具面基设:类型化工具构造(InferTool——结构体 反射出参数 JSON Schema,schema 推断复用 eino 反射器保证与既有工具面完全 同构)与通用工具族(fs/todo/web/时间/问答/命令/补丁,自原 ext/tools 迁入)。
applypatch
Package applypatch 提供 apply_patch 工具:codex `*** Begin Patch` 格式的 解析与应用(多文件 增/改/删/改名,事务性——任一失败全部不落盘)。
Package applypatch 提供 apply_patch 工具:codex `*** Begin Patch` 格式的 解析与应用(多文件 增/改/删/改名,事务性——任一失败全部不落盘)。
askuser
Package askuser 提供 ask_user 工具:长任务中途向用户结构化提问(单选/ 多选/自由文本),经挂起-续流通道(contract.Suspend 哨兵 → 适配层转引擎 Interrupt×Resume)。
Package askuser 提供 ask_user 工具:长任务中途向用户结构化提问(单选/ 多选/自由文本),经挂起-续流通道(contract.Suspend 哨兵 → 适配层转引擎 Interrupt×Resume)。
currenttime
Package currenttime 提供 get_current_time 工具:时钟/周界语义——周报周期 与 deadline 计算的正确性底线。
Package currenttime 提供 get_current_time 工具:时钟/周界语义——周报周期 与 deadline 计算的正确性底线。
egress
Package egress 提供工具层网络出口治理(Phase S-9——2026-08-26 沙箱设计定案 §9;移植蓝本 = nanobot nanobot/security/network.py,344 行 Python 的 Go 直译 收敛)。
Package egress 提供工具层网络出口治理(Phase S-9——2026-08-26 沙箱设计定案 §9;移植蓝本 = nanobot nanobot/security/network.py,344 行 Python 的 Go 直译 收敛)。
fsutil
Package fsutil 提供工作区文件工具四件:read_file / list_dir / search_files / delete_file(读-搜为主 + 显式删除——删除走审批卡直白话,比拼 rm 命令可控; 内容写面归 applypatch / str_replace_editor / runcommand)。
Package fsutil 提供工作区文件工具四件:read_file / list_dir / search_files / delete_file(读-搜为主 + 显式删除——删除走审批卡直白话,比拼 rm 命令可控; 内容写面归 applypatch / str_replace_editor / runcommand)。
office
Package office 提供 office 文档读写工具族(2026-08-25 裁决:office 读写是 通用能力,归基座):read_xlsx / write_xlsx / read_docx / write_docx / read_pptx。
Package office 提供 office 文档读写工具族(2026-08-25 裁决:office 读写是 通用能力,归基座):read_xlsx / write_xlsx / read_docx / write_docx / read_pptx。
plan
Package plan 提供 submit_plan 工具:计划文档提交(用户域 plans/<sid>/ <seq>.md 持久落盘)+ 挂起送审(Suspend → 引擎转 plan_request 事件卡 → approve 端点决议 → Resume 消费)。
Package plan 提供 submit_plan 工具:计划文档提交(用户域 plans/<sid>/ <seq>.md 持久落盘)+ 挂起送审(Suspend → 引擎转 plan_request 事件卡 → approve 端点决议 → Resume 消费)。
runcommand
Package runcommand 提供 run_command 工具:工作区内 shell 命令执行(P1b 简版——超时/输出头尾截断/cwd 圈进工作区;后台任务形态 P2 随编码子代理)。
Package runcommand 提供 run_command 工具:工作区内 shell 命令执行(P1b 简版——超时/输出头尾截断/cwd 圈进工作区;后台任务形态 P2 随编码子代理)。
todo
Package todo 提供 todo_write 任务清单工具:多步任务的自跟踪与用户可见 进度。
Package todo 提供 todo_write 任务清单工具:多步任务的自跟踪与用户可见 进度。
webfetch
Package webfetch 提供 web_fetch 工具:URL → 正文 markdown 提取(httprequest 只回裸 HTML,真实网页数百 KB 直接爆上下文——本工具做「提取」而非「全文」)。
Package webfetch 提供 web_fetch 工具:URL → 正文 markdown 提取(httprequest 只回裸 HTML,真实网页数百 KB 直接爆上下文——本工具做「提取」而非「全文」)。
Package ui 是官方通用界面件(T9 装配式默认界面的服务端件):只读回放面 (REST + SSE)+ embed 单页回放组件。
Package ui 是官方通用界面件(T9 装配式默认界面的服务端件):只读回放面 (REST + SSE)+ embed 单页回放组件。
Package workspace 是会话工作区模型(用户域):一轮任务一清的临时 落盘面——spill 溢出、编码循环中间产物;持久子区(顶层目录,如仓挂载、 参考资料区)由装配层经 Wipe 的 keep 参数声明豁免。
Package workspace 是会话工作区模型(用户域):一轮任务一清的临时 落盘面——spill 溢出、编码循环中间产物;持久子区(顶层目录,如仓挂载、 参考资料区)由装配层经 Wipe 的 keep 参数声明豁免。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL