chore: bump version to 0.1.1
参加 MoonBit 2026开源大赛,目标是智能体可观测。 本人项目内容包含:
智能体插桩库已发布到 MoonBit 官方包仓库 mooncakes.io,在本仓库中作为submodule。
视频:https://www.bilibili.com/video/BV1n4EZ61EmU
Agent基础交互,包含多轮对话和工具调用:
使用OTEL_STDOUT开启遥测信号回显:
使用CAPTURE_CONTENT开启对用户输入和LLM响应的采集:
使用 GreptimeDB + Grafana 部署的完整可观测性面板,覆盖 Traces、Metrics、Logs 三大支柱:
部署方式见 deploy/greptime/README.md。
deploy/greptime/README.md
flowchart TD User["👤 User / API"] subgraph Agent["🧠 Agent"] direction TB A1["多轮对话状态管理"] A2["上下文窗口累积"] A3["自动 Tool Call 闭环(≤10 轮)"] A4["工具执行记录返回"] end subgraph Client["🔌 Client(LLMGateway)"] C1["通用 GenAI 提供商封装"] C2["HTTP RPC 调用"] C3["请求 / 响应 JSON 序列化"] C4["OpenTelemetry GenAI 插桩"] end API["☁️ GenAI Provider API(默认 StepFun)"] subgraph TR["🔧 ToolRegistry"] T1["工具注册与路由"] T2["参数解析与执行"] T3["安全策略(命令白名单)"] end subgraph Tools["🛠️ External Tools"] TW["🌤️ get_weather / lookup_city(QWeather)"] TC["💻 execute_command(安全受限)"] end OTel["📊 OpenTelemetrytrace / span / event 插桩"] User --> Agent Agent --> Client Client --> API Agent --> TR TR --> Tools OTel -.->|全链路插桩| Agent OTel -.->|GenAI 语义约定| Client OTel -.-> TR
agent.mbt
llm.mbt
tools.mbt
settings.mbt
Settings
from_env()
agent-telemetry/
cmd/main/main.mbt
build-essential
复制示例配置并编辑:
cp .env.example .env # 编辑 .env,填入你的 API Key
支持的配置项(环境变量或 .env 文件均可):
.env
LLM_API_KEY
LLM_PROVIDER
stepfun
LLM_BASE_URL
https://api.stepfun.com/v1
LLM_MODEL
step-3.7-flash
LLM_MAX_TOKENS
1024
AGENT_MAX_TOOL_TURNS
10
OTEL_STDOUT
false
CAPTURE_CONTENT
QWEATHER_TOKEN
QWEATHER_API_KEY
QWEATHER_API_HOST
https://api.qweather.com
https://devapi.qweather.com
所有配置在运行时被加载到 Settings 结构体中,随后传递给 Client 与 Agent,避免在业务代码中散落环境变量读取逻辑。QWEATHER_* 配置由 tools.mbt 在工具执行时读取。
Client
Agent
QWEATHER_*
# 检查类型 moon check # 运行 REPL moon run cmd/main # 非交互式单次运行(适合 CI / 演示 / 脚本) moon run cmd/main -- --ask "北京今天天气怎么样?"
# 运行所有 async test moon test
项目提供了最小化的本地 Collector + Jaeger 组合:
cd deploy/minimum docker compose up -d
启动后:
http://localhost:4318
http://localhost:4317
http://localhost:16686
运行 REPL 并导出 trace 到 Collector(保持 .env 中 OTEL_STDOUT=false 或直接覆盖环境变量):
OTEL_STDOUT=false
OTEL_STDOUT=false moon run cmd/main
发送一条消息后,打开 http://localhost:16686 即可在 Jaeger 中查看 trace。Service 名称为 agent-observability(可通过 OTEL_SERVICE_NAME 环境变量覆盖)。
agent-observability
OTEL_SERVICE_NAME
Batch Span Processor 针对交互式 REPL 做了调优,你也可以通过标准环境变量覆盖:
OTEL_BSP_MAX_QUEUE_SIZE
64
OTEL_BSP_MAX_EXPORT_BATCH_SIZE
16
OTEL_BSP_SCHEDULE_DELAY
1000
OTEL_BSP_EXPORT_TIMEOUT
5000
agent-telemetry
仓库中的 agent-telemetry/ 是一个独立的 MoonBit 包,封装了 Agent/LLM/Tool 场景的 OpenTelemetry 插桩。原 agent-observability 应用已改用此库实现。
安装方式:moon add cybershang/agent-telemetry
moon add cybershang/agent-telemetry
详细 API 文档与使用示例请参见 agent-telemetry/README.md。
agent-telemetry/README.md
agent-observability/ ├── agent-telemetry/ # 独立 MoonBit 插桩库(已发布到 mooncakes.io) │ # 封装 OTel 初始化、tracer、GenAI/Tool/Agent 语义 helper ├── cmd/main/ # REPL 可执行入口 ├── deploy/ # 一键部署配置 │ ├── minimum/ # 本地 Collector + Jaeger(docker-compose) │ └── greptime/ # 生产级 GreptimeDB + Grafana 栈 ├── docs/ # 文档 │ ├── instrumentation.md # 插桩位置与 Span 命名详解 │ └── findings.md # 开发过程中的技术发现记录 ├── scripts/ # 辅助脚本 ├── proposal.md # 比赛申报书 ├── report.md # 结项报告 ├── AGENTS.md # 开发指南与约定 ├── .env.example # 环境变量配置模板 └── moon.work # 工作区定义(根包 + agent-telemetry)
moonbitlang/async
moon check
unused_package
运行 moon check 时可能会出现若干 unused_package 警告,不影响功能,原因如下:
async fn
async test
@async.xxx
@sdk
moon.pkg
moon.work
cybershang/agent-telemetry
opentelemetry/otlp
async/http
async/socket
preferred_target = "native"
MoonBit 目前不支持文件级导入或独立的测试子包,因此这些警告在当前结构下无法消除。CI 已移除 --deny-warn 以避免因此失败。
--deny-warn
本项目采用 木兰宽松许可证,第 2 版(Mulan PSL v2)开源许可。 Copyright (c) 2026 Yingjie Shang
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
Agent Observability Demo
参加 MoonBit 2026开源大赛,目标是智能体可观测。 本人项目内容包含:
智能体插桩库已发布到 MoonBit 官方包仓库 mooncakes.io,在本仓库中作为submodule。
演示Demo
实现了基础的交互和LLM插桩
视频:https://www.bilibili.com/video/BV1n4EZ61EmU
Agent基础交互,包含多轮对话和工具调用:
使用OTEL_STDOUT开启遥测信号回显:
使用CAPTURE_CONTENT开启对用户输入和LLM响应的采集:
Grafana 仪表盘
使用 GreptimeDB + Grafana 部署的完整可观测性面板,覆盖 Traces、Metrics、Logs 三大支柱:
部署方式见
deploy/greptime/README.md。Agent架构
flowchart TD User["👤 User / API"] subgraph Agent["🧠 Agent"] direction TB A1["多轮对话状态管理"] A2["上下文窗口累积"] A3["自动 Tool Call 闭环(≤10 轮)"] A4["工具执行记录返回"] end subgraph Client["🔌 Client(LLMGateway)"] C1["通用 GenAI 提供商封装"] C2["HTTP RPC 调用"] C3["请求 / 响应 JSON 序列化"] C4["OpenTelemetry GenAI 插桩"] end API["☁️ GenAI Provider API(默认 StepFun)"] subgraph TR["🔧 ToolRegistry"] T1["工具注册与路由"] T2["参数解析与执行"] T3["安全策略(命令白名单)"] end subgraph Tools["🛠️ External Tools"] TW["🌤️ get_weather / lookup_city(QWeather)"] TC["💻 execute_command(安全受限)"] end OTel["📊 OpenTelemetry
trace / span / event 插桩"] User --> Agent Agent --> Client Client --> API Agent --> TR TR --> Tools OTel -.->|全链路插桩| Agent OTel -.->|GenAI 语义约定| Client OTel -.-> TR
核心模块
agent.mbtllm.mbttools.mbtsettings.mbtSettingsstruct +from_env()agent-telemetry/cmd/main/main.mbt快速开始
依赖
build-essential(提供 C 头文件用于 native 编译)配置
复制示例配置并编辑:
支持的配置项(环境变量或
.env文件均可):LLM_API_KEYLLM_PROVIDERstepfunLLM_BASE_URLhttps://api.stepfun.com/v1LLM_MODELstep-3.7-flashLLM_MAX_TOKENS1024AGENT_MAX_TOOL_TURNS10OTEL_STDOUTfalseCAPTURE_CONTENTfalseQWEATHER_TOKENQWEATHER_API_KEYQWEATHER_TOKEN的 fallback)QWEATHER_API_HOSThttps://api.qweather.com,开发版用https://devapi.qweather.comhttps://devapi.qweather.com所有配置在运行时被加载到
Settings结构体中,随后传递给Client与Agent,避免在业务代码中散落环境变量读取逻辑。QWEATHER_*配置由tools.mbt在工具执行时读取。运行
测试
本地可观测性栈
项目提供了最小化的本地 Collector + Jaeger 组合:
启动后:
http://localhost:4318http://localhost:4317http://localhost:16686运行 REPL 并导出 trace 到 Collector(保持
.env中OTEL_STDOUT=false或直接覆盖环境变量):发送一条消息后,打开 http://localhost:16686 即可在 Jaeger 中查看 trace。Service 名称为
agent-observability(可通过OTEL_SERVICE_NAME环境变量覆盖)。Batch Span Processor 针对交互式 REPL 做了调优,你也可以通过标准环境变量覆盖:
OTEL_BSP_MAX_QUEUE_SIZE64OTEL_BSP_MAX_EXPORT_BATCH_SIZE16OTEL_BSP_SCHEDULE_DELAY1000OTEL_BSP_EXPORT_TIMEOUT5000agent-telemetry库仓库中的
agent-telemetry/是一个独立的 MoonBit 包,封装了 Agent/LLM/Tool 场景的 OpenTelemetry 插桩。原agent-observability应用已改用此库实现。安装方式:
moon add cybershang/agent-telemetry详细 API 文档与使用示例请参见
agent-telemetry/README.md。项目结构
技术栈
moonbitlang/async— 原生异步运行时已知问题
moon check中的unused_package警告运行
moon check时可能会出现若干unused_package警告,不影响功能,原因如下:moonbitlang/async报 unused:async fn/async test语法需要此包,但编译器只检测@async.xxx显式调用,不把关键字本身算作”使用”。@sdk等):这些包在测试文件中使用,但 MoonBit 的moon.pkg是包级配置,编译器不把测试文件中的使用算作”库的使用”。agent-telemetry包与根应用通过moon.work组成工作区;根应用导入本地cybershang/agent-telemetry包。agent-telemetry默认后端为 native:opentelemetry/otlp依赖的async/http、async/socket接口只在 native 后端可用,因此库模块声明了preferred_target = "native"。MoonBit 目前不支持文件级导入或独立的测试子包,因此这些警告在当前结构下无法消除。CI 已移除
--deny-warn以避免因此失败。许可证
本项目采用 木兰宽松许可证,第 2 版(Mulan PSL v2)开源许可。 Copyright (c) 2026 Yingjie Shang