Dependencies




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<br/>(默认 StepFun)"]
subgraph TR["🔧 ToolRegistry"]
T1["工具注册与路由"]
T2["参数解析与执行"]
T3["安全策略(命令白名单)"]
end
subgraph Tools["🛠️ External Tools"]
TW["🌤️ get_weather / lookup_city(QWeather)"]
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、启动交互循环 |
cp .env.example .env
# 编辑 .env,填入你的 API Key| 变量 | 说明 | 默认值 |
|---|---|---|
| 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 |
# 检查类型
moon check
# 运行 REPL
moon run cmd/main
# 非交互式单次运行(适合 CI / 演示 / 脚本)
moon run cmd/main -- --ask "北京今天天气怎么样?"# 运行所有 async test
moon testcd deploy/minimum
docker compose up -dOTEL_STDOUT=false moon run cmd/main| 变量 | 默认值 |
|---|---|
| OTEL_BSP_MAX_QUEUE_SIZE | 64 |
| OTEL_BSP_MAX_EXPORT_BATCH_SIZE | 16 |
| OTEL_BSP_SCHEDULE_DELAY | 1000 |
| OTEL_BSP_EXPORT_TIMEOUT | 5000 |
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)| 层级 | 技术 |
|---|---|
| 语言 | MoonBit |
| 运行时 | moonbitlang/async — 原生异步运行时 |
| 构建目标 | Native |
| 默认 LLM 提供商 | StepFun API |
| 可观测性 | OpenTelemetry(已实现) |
type ToolHandler = async (String) -> Stringpub struct Client {
provider_name : String
base_url : String
model : String
api_key : String
max_tokens : Int
capture_content : Bool
}pub struct Settings {
provider_name : String
base_url : String
model : String
api_key : String
max_tokens : Int
max_tool_turns : Int
otel_stdout : Bool
otel_endpoint : String
capture_content : Bool
}async fn env(key : String, default? : String) -> Stringfn parse_int(s : String, default : Int) -> Int