Go to file
Yingjie Shang 0990f4c592
Check & Test / check-and-test (push) Failing after 1m19s Details
Publish to mooncakes.io / publish (push) Failing after 1m19s Details
chore: bump version to 0.1.1
2026-07-08 11:23:55 +08:00
.github ci: add mooncakes.io publish workflow 2026-07-08 10:29:45 +08:00
agent-telemetry@4f0ca57037 chore: update agent-telemetry submodule - sync pkg.generated.mbti 2026-07-05 23:40:55 +08:00
assets docs: replace .avif screenshots with .png and clean up image references 2026-07-08 11:04:40 +08:00
cmd/main feat(agent): respect CAPTURE_CONTENT for agent.turn span attributes 2026-07-08 10:58:52 +08:00
deploy rename: cybershang/agent-observability -> cybershang/agent-o11y-demo 2026-07-08 10:23:30 +08:00
docs chore: update agent-telemetry submodule to latest 2026-07-02 12:44:31 +08:00
scripts feat(greptime): 接入 GreptimeDB 后端并统一 OTel GenAI 语义约定 2026-06-22 11:45:59 +08:00
.env.example fix(tools): use current QWeather API endpoints/auth and add lookup_city tool 2026-06-22 20:03:14 +08:00
.gitignore chore: ignore .vscode/settings.json 2026-07-08 11:04:36 +08:00
.gitmodules fix: update agent-telemetry submodule URL to HTTPS and fix pointer 2026-06-27 19:45:48 +08:00
AGENTS.md rename: cybershang/agent-observability -> cybershang/agent-o11y-demo 2026-07-08 10:23:30 +08:00
LICENSE chore: add Mulan PSL v2 license headers and copyright notices 2026-06-11 06:33:03 +08:00
README.md docs: replace .avif screenshots with .png and clean up image references 2026-07-08 11:04:40 +08:00
TODO.md docs: update TODO - remove completed branch tasks, mark as done 2026-07-02 10:41:35 +08:00
agent.mbt feat(agent): respect CAPTURE_CONTENT for agent.turn span attributes 2026-07-08 10:58:52 +08:00
agent_test.mbt chore: apply moon fmt formatting normalization 2026-06-27 11:53:56 +08:00
llm.mbt rename: cybershang/agent-observability -> cybershang/agent-o11y-demo 2026-07-08 10:23:30 +08:00
llm_test.mbt style: apply moon fmt formatting 2026-06-11 19:07:08 +08:00
llm_wbtest.mbt style: apply moon fmt formatting 2026-06-11 19:07:08 +08:00
moon.mod chore: bump version to 0.1.1 2026-07-08 11:23:55 +08:00
moon.pkg fix: eliminate unused_package warnings by moving test-only deps to test/wbtest imports 2026-06-21 18:42:32 +08:00
moon.work fix: remove agent-telemetry from moon.work workspace members 2026-07-08 10:04:12 +08:00
pkg.generated.mbti feat(tools): tighten execute_command security with 3-layer defense 2026-07-08 11:23:26 +08:00
proposal.md docs: add competition documents (proposal, report, TODO) 2026-07-01 15:56:27 +08:00
report.md rename: cybershang/agent-observability -> cybershang/agent-o11y-demo 2026-07-08 10:23:30 +08:00
settings.mbt feat: make OTLP endpoint configurable via env/.env, default to localhost:4318 2026-06-11 16:04:25 +08:00
settings_test.mbt test: add comprehensive unit and white-box tests 2026-06-11 19:03:56 +08:00
tools.mbt feat(tools): tighten execute_command security with 3-layer defense 2026-07-08 11:23:26 +08:00
tools_test.mbt fix(tools): use current QWeather API endpoints/auth and add lookup_city tool 2026-06-22 20:03:14 +08:00
tools_wbtest.mbt feat(tools): tighten execute_command security with 3-layer defense 2026-07-08 11:23:26 +08:00

README.md

Agent Observability Demo

Check & Test

参加 MoonBit 2026开源大赛目标是智能体可观测。 本人项目内容包含:

智能体插桩库已发布到 MoonBit 官方包仓库 mooncakes.io在本仓库中作为submodule。

演示Demo

实现了基础的交互和LLM插桩

视频:https://www.bilibili.com/video/BV1n4EZ61EmU

Agent基础交互包含多轮对话和工具调用: Agent interactive

使用OTEL_STDOUT开启遥测信号回显 agent otel echo

使用CAPTURE_CONTENT开启对用户输入和LLM响应的采集 agent content capture

Grafana 仪表盘

使用 GreptimeDB + Grafana 部署的完整可观测性面板,覆盖 Traces、Metrics、Logs 三大支柱:

Grafana Dashboard

部署方式见 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["🔌 ClientLLMGateway"]
        C1["通用 GenAI 提供商封装"]
        C2["HTTP RPC 调用"]
        C3["请求 / 响应 JSON 序列化"]
        C4["OpenTelemetry GenAI 插桩"]
    end

    API["☁️ GenAI Provider API<br/>(默认 StepFun"]

    subgraph TR["🔧 ToolRegistry"]
        T1["工具注册与路由"]
        T2["参数解析与执行"]
        T3["安全策略(命令白名单)"]
    end

    subgraph Tools["🛠️ External Tools"]
        TW["🌤️ get_weather / lookup_cityQWeather"]
        TC["💻 execute_command安全受限"]
    end

    OTel["📊 OpenTelemetry<br/>trace / span / event 插桩"]

    User --> Agent
    Agent --> Client
    Client --> API
    Agent --> TR
    TR --> Tools

    OTel -.->|全链路插桩| Agent
    OTel -.->|GenAI 语义约定| Client
    OTel -.-> TR

核心模块

模块 文件 职责
Agent agent.mbt 对话编排:维护消息历史、自动 tool call 循环、返回结构化结果
Client llm.mbt 通用 GenAI 客户端:封装 HTTP 调用、管理消息类型、OTel GenAI 插桩
ToolRegistry tools.mbt 工具定义表,供 Agent 注册到 LLM
Settings settings.mbt 集中管理所有运行时配置:Settings struct + from_env()
Telemetry Lib agent-telemetry/ 可复用插桩库provider 初始化、tracer、GenAI/Tool/Agent 语义 helper
REPL 入口 cmd/main/main.mbt 配置加载、初始化 OTel、启动交互循环

快速开始

依赖

  • MoonBit 工具链
  • Linux 系统需安装 build-essential(提供 C 头文件用于 native 编译)

配置

复制示例配置并编辑:

cp .env.example .env
# 编辑 .env填入你的 API Key

支持的配置项(环境变量或 .env 文件均可):

变量 说明 默认值
LLM_API_KEY GenAI 提供商 API Key 必填
LLM_PROVIDER 提供商标识(用于 OTel stepfun
LLM_BASE_URL 聊天补全 API 基础 URL https://api.stepfun.com/v1
LLM_MODEL 模型名称 step-3.7-flash
LLM_MAX_TOKENS 每次请求最大 token 数 1024
AGENT_MAX_TOOL_TURNS Agent 自动 tool call 最大轮数 10
OTEL_STDOUT 是否输出 OTel trace 到 stdout false
CAPTURE_CONTENT 是否在 span 中采集用户/助手消息内容 false
QWEATHER_TOKEN 和风天气 JWT Token新 Platform API 必填
QWEATHER_API_KEY 和风天气旧版 Web API Key作为 QWEATHER_TOKEN 的 fallback -
QWEATHER_API_HOST 和风天气 API 主机,标准订阅用 https://api.qweather.com,开发版用 https://devapi.qweather.com https://devapi.qweather.com

所有配置在运行时被加载到 Settings 结构体中,随后传递给 ClientAgent,避免在业务代码中散落环境变量读取逻辑。QWEATHER_* 配置由 tools.mbt 在工具执行时读取。

运行

# 检查类型
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

启动后:

  • OTLP HTTP receiver: http://localhost:4318
  • OTLP gRPC receiver: http://localhost:4317
  • Jaeger UI: http://localhost:16686

运行 REPL 并导出 trace 到 Collector保持 .envOTEL_STDOUT=false 或直接覆盖环境变量):

OTEL_STDOUT=false moon run cmd/main

发送一条消息后,打开 http://localhost:16686 即可在 Jaeger 中查看 trace。Service 名称为 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

详细 API 文档与使用示例请参见 agent-telemetry/README.md

项目结构

agent-observability/
├── agent-telemetry/         # 独立 MoonBit 插桩库(已发布到 mooncakes.io
│                            # 封装 OTel 初始化、tracer、GenAI/Tool/Agent 语义 helper
├── cmd/main/                # REPL 可执行入口
├── deploy/                  # 一键部署配置
│   ├── minimum/             #   本地 Collector + Jaegerdocker-compose
│   └── greptime/            #   生产级 GreptimeDB + Grafana 栈
├── docs/                    # 文档
│   ├── instrumentation.md   #   插桩位置与 Span 命名详解
│   └── findings.md          #   开发过程中的技术发现记录
├── scripts/                 # 辅助脚本
├── proposal.md              # 比赛申报书
├── report.md                # 结项报告
├── AGENTS.md                # 开发指南与约定
├── .env.example             # 环境变量配置模板
└── moon.work                # 工作区定义(根包 + agent-telemetry

技术栈

层级 技术
语言 MoonBit
运行时 moonbitlang/async — 原生异步运行时
构建目标 Native
默认 LLM 提供商 StepFun API
可观测性 OpenTelemetry已实现

已知问题

moon check 中的 unused_package 警告

运行 moon check 时可能会出现若干 unused_package 警告,不影响功能,原因如下:

  1. moonbitlang/async 报 unusedasync fn / async test 语法需要此包,但编译器只检测 @async.xxx 显式调用,不把关键字本身算作"使用"。
  2. 测试依赖报 unused@sdk 等):这些包在测试文件中使用,但 MoonBit 的 moon.pkg 是包级配置,编译器不把测试文件中的使用算作"库的使用"。
  3. agent-telemetry 包与根应用通过 moon.work 组成工作区;根应用导入本地 cybershang/agent-telemetry 包。
  4. agent-telemetry 默认后端为 nativeopentelemetry/otlp 依赖的 async/httpasync/socket 接口只在 native 后端可用,因此库模块声明了 preferred_target = "native"

MoonBit 目前不支持文件级导入或独立的测试子包因此这些警告在当前结构下无法消除。CI 已移除 --deny-warn 以避免因此失败。

许可证

本项目采用 木兰宽松许可证,第 2 版Mulan PSL v2开源许可。 Copyright (c) 2026 Yingjie Shang