{"_id":"@anyway-sh/anyway-openclaw","_rev":"4-3a0f9e9c086994888ec065ee8c9015cb","name":"@anyway-sh/anyway-openclaw","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@anyway-sh/anyway-openclaw","version":"0.1.0","_id":"@anyway-sh/anyway-openclaw@0.1.0","maintainers":[{"name":"davidz_anyway","email":"david@anyway.sh"}],"homepage":"https://github.com/anyway-platform/anyway-openclaw#readme","bugs":{"url":"https://github.com/anyway-platform/anyway-openclaw/issues"},"dist":{"shasum":"c8e4ff81e38f7e75723140f5f0234ae6a2ff6acb","tarball":"https://registry.npmjs.org/@anyway-sh/anyway-openclaw/-/anyway-openclaw-0.1.0.tgz","fileCount":60,"integrity":"sha512-z+nHcMF5RPjybjbqMaPHbITbMRxzkYlLByR972TMl+QVXV9IbN1dPcFfJQ2teAjK7yZg6QPURP0n/kAu/i/zog==","signatures":[{"sig":"MEUCIHUMLG4pnEWONDGQPj7weL1n5LKTfIDS3jAcaHITTOZlAiEA+upeIHaAbabWJOo860vmhEFDYvTzZxt4Y6cWMGBuO80=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90440},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"722e0a523931b873c847153d35f50e82c3a96048","scripts":{"dev":"tsc --watch","test":"tsx test/run-all.ts","build":"tsc","prepare":"npm run build","test:npm":"docker compose -f test/docker-compose.yml run --rm --build npm-install","test:diag":"tsx test/diag-run.ts","test:shell":"docker compose -f test/docker-compose.yml run --rm --build --service-ports shell","test:docker":"docker compose -f test/docker-compose.yml run --rm --build test"},"_npmUser":{"name":"davidz_anyway","email":"david@anyway.sh"},"openclaw":{"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/anyway-platform/anyway-openclaw.git","type":"git"},"_npmVersion":"11.6.2","description":"OpenLLMetry-style LLM observability plugin for OpenClaw","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@opentelemetry/api":"^1.9.0","@opentelemetry/resources":"^2.5.1","@opentelemetry/sdk-trace-base":"^2.5.1","@opentelemetry/semantic-conventions":"^1.40.0","@opentelemetry/exporter-trace-otlp-http":"^0.212.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","openclaw":"^2026.3.2","typescript":"^5.7.0","@types/node":"^22.0.0"},"peerDependencies":{"openclaw":">=2026.1.26"},"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/anyway-openclaw_0.1.0_1772626845942_0.5205597460167468","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@anyway-sh/anyway-openclaw","version":"0.1.1","_id":"@anyway-sh/anyway-openclaw@0.1.1","maintainers":[{"name":"davidz_anyway","email":"david@anyway.sh"}],"homepage":"https://github.com/anyway-platform/anyway-openclaw#readme","bugs":{"url":"https://github.com/anyway-platform/anyway-openclaw/issues"},"dist":{"shasum":"b0bd1ba84790a0d0e46f9aacea44276d29bed8b8","tarball":"https://registry.npmjs.org/@anyway-sh/anyway-openclaw/-/anyway-openclaw-0.1.1.tgz","fileCount":60,"integrity":"sha512-3He/t9NalW3BDz0lW3B0ebBg5H/0YX1DOdZnL7CqACVskl8UvBhNQ4RBjS47S4dXwWrwf0fMg/ewEYqGtqyCaQ==","signatures":[{"sig":"MEQCICsNKGgg2onosVYFAW6wheDEC4YWMwuQFsiPDZ6RI/gqAiB6PjLQxW6fqG/OHhGBGX06s2T+/fQZhF7TnLym7oeHvg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87710},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"e4eff37c4e48ec9fbc88c704e91e17d891c3e34b","scripts":{"dev":"tsc --watch","test":"tsx test/run-all.ts","build":"tsc","prepare":"npm run build","test:diag":"tsx test/diag-run.ts","test:shell":"docker compose -f test/docker-compose.yml run --rm --build --service-ports shell","test:docker":"docker compose -f test/docker-compose.yml run --rm --build test","test:openclaw-install-e2e":"docker compose -f test/docker-compose.yml run --rm --build openclaw-install-e2e"},"_npmUser":{"name":"davidz_anyway","email":"david@anyway.sh"},"openclaw":{"extensions":["./dist/index.js"]},"repository":{"url":"git+https://github.com/anyway-platform/anyway-openclaw.git","type":"git"},"_npmVersion":"11.6.2","description":"Agent observability and outcome-based pricing for OpenClaw — track costs, latency, and response quality","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@opentelemetry/api":"^1.9.0","@opentelemetry/resources":"^2.5.1","@opentelemetry/sdk-trace-base":"^2.5.1","@opentelemetry/semantic-conventions":"^1.40.0","@opentelemetry/exporter-trace-otlp-http":"^0.212.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","openclaw":"^2026.3.2","typescript":"^5.7.0","@types/node":"^22.0.0"},"peerDependencies":{"openclaw":">=2026.1.26"},"peerDependenciesMeta":{"openclaw":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/anyway-openclaw_0.1.1_1772631955719_0.5457369038667488","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-03-04T12:20:45.836Z","modified":"2026-04-09T02:15:27.361Z","0.1.0":"2026-03-04T12:20:46.067Z","0.1.1":"2026-03-04T13:45:55.858Z"},"bugs":{"url":"https://github.com/anyway-platform/anyway-openclaw/issues"},"homepage":"https://github.com/anyway-platform/anyway-openclaw#readme","repository":{"url":"git+https://github.com/anyway-platform/anyway-openclaw.git","type":"git"},"description":"Agent observability and outcome-based pricing for OpenClaw — track costs, latency, and response quality","maintainers":[{"email":"david@anyway.sh","name":"davidz_anyway"},{"email":"seven@anyway.sh","name":"seven_anyway"},{"email":"jeremy@anyway.sh","name":"jt-any"}],"readme":"# @anyway-sh/anyway-openclaw\n\n[OpenClaw](https://github.com/nicepkg/openclaw) 的 LLM 可观测性插件，基于 [OpenTelemetry](https://opentelemetry.io/) 语义规范（`gen_ai.*`），将 LLM 管道的完整 trace 数据上报至任意 OTLP 兼容的 collector。\n\n> **English version:** [README.md](./README.md)\n\n## 功能概览\n\n- 自动追踪 Session、Agent、LLM 调用、Tool 调用、Subagent、Message 的完整生命周期\n- 支持 span 层级关系：`session → agent → llm → tool`\n- 遵循 `gen_ai.*` 语义规范，兼容主流可观测性平台\n- 可选捕获 prompt/completion 内容和 tool 输入输出\n- 支持采样率、批量上报、自定义 headers（用于鉴权）\n- 自动清理超时的孤儿 span\n\n## 前置要求\n\n- [OpenClaw](https://github.com/nicepkg/openclaw) >= 2026.1.26\n- Node.js >= 22\n\n## 安装\n\n```bash\nopenclaw plugins install @anyway-sh/anyway-openclaw\n```\n\n本地开发时，可使用 link 模式（修改后即时生效，无需重新安装）：\n\n```bash\nopenclaw plugins install -l .\n```\n\n## 配置\n\n插件配置保存在 `~/.openclaw/openclaw.json` 的 `plugins.entries` 下：\n\n```json\n{\n  \"plugins\": {\n    \"entries\": {\n      \"anyway-openclaw\": {\n        \"config\": {\n          \"endpoint\": \"https://your-collector.example.com\",\n          \"headers\": {\n            \"Authorization\": \"Bearer your-access-key\"\n          },\n          \"serviceName\": \"my-app\",\n          \"captureContent\": true,\n          \"sampleRate\": 1.0,\n          \"flushIntervalMs\": 5000\n        }\n      }\n    }\n  }\n}\n```\n\n### 方式二：环境变量\n\n遵循 OpenTelemetry 标准环境变量，作为插件配置的 fallback：\n\n| 环境变量 | 说明 | 示例 |\n|---|---|---|\n| `OTEL_EXPORTER_OTLP_ENDPOINT` | Collector 地址 | `https://your-collector.example.com` |\n| `OTEL_EXPORTER_OTLP_HEADERS` | HTTP headers（含 access key） | `Authorization=Bearer sk_xxx` |\n| `OTEL_SERVICE_NAME` | 服务名称 | `my-app` |\n| `OTEL_TRACES_SAMPLER_ARG` | 采样率（0-1） | `0.5` |\n| `ANYWAY_OPENCLAW_CAPTURE_CONTENT` | 是否捕获内容（设为 `false` 关闭） | `false` |\n\n## 配置项说明\n\n| 配置项 | 类型 | 默认值 | 说明 |\n|---|---|---|---|\n| `endpoint` | `string` | `\"https://trace-dev-collector.anyway.sh/\"` | OTLP HTTP collector 地址 |\n| `headers` | `Record<string, string>` | — | 自定义 HTTP headers，用于传递 access key 等鉴权信息 |\n| `serviceName` | `string` | `\"my-openclaw\"` | 上报的服务名称 |\n| `protocol` | `string` | `\"http/protobuf\"` | 传输协议，支持 protobuf 和 JSON |\n| `sampleRate` | `number` | `1.0` | 采样率，`0` 到 `1` 之间 |\n| `captureContent` | `boolean` | `true` | 是否捕获 prompt/completion 文本内容 |\n| `captureToolIO` | `boolean` | `false` | 是否捕获 tool 调用的输入输出 |\n| `maxContentLength` | `number` | `4096` | 捕获内容的最大字符数 |\n| `flushIntervalMs` | `number` | `5000` | 批量上报的刷新间隔（毫秒） |\n| `spanTimeoutMs` | `number` | `300000` | 孤儿 span 超时清理时间（毫秒） |\n| `spans.sessions` | `boolean` | `true` | 是否追踪 session |\n| `spans.agents` | `boolean` | `true` | 是否追踪 agent |\n| `spans.llm` | `boolean` | `true` | 是否追踪 LLM 调用 |\n| `spans.tools` | `boolean` | `true` | 是否追踪 tool 调用 |\n| `spans.messages` | `boolean` | `false` | 是否追踪 message |\n| `spans.subagents` | `boolean` | `true` | 是否追踪 subagent |\n\n## Span 层级结构\n\n```\nopenclaw.session\n  └── openclaw.agent\n        ├── {provider}.chat              (LLM 调用)\n        │     └── openclaw.tool.{name}   (Tool 调用)\n        └── openclaw.subagent            (子 Agent)\n  └── openclaw.message                   (消息，独立通道)\n```\n\n## 语义属性\n\n### OpenTelemetry 标准属性（`gen_ai.*`）\n\n- `gen_ai.provider.name` — LLM 提供商\n- `gen_ai.request.model` / `gen_ai.response.model` — 请求/响应模型\n- `gen_ai.usage.input_tokens` / `gen_ai.usage.output_tokens` — token 用量\n- `gen_ai.usage.cache_read.input_tokens` / `gen_ai.usage.cache_creation.input_tokens` — 缓存 token 用量\n- `gen_ai.prompt.0.content` / `gen_ai.completion.0.content` — prompt/completion 内容\n- `gen_ai.conversation.id` — 会话标识\n- `gen_ai.agent.id` — Agent 标识\n- `gen_ai.tool.name` / `gen_ai.tool.call.arguments` / `gen_ai.tool.call.result` — Tool 调用详情\n\n### OpenClaw 扩展属性（`openclaw.*`）\n\n- `openclaw.session.key` — 会话路由 key\n- `openclaw.cost.usd` — 调用费用\n- `openclaw.context.used` / `openclaw.context.limit` — 上下文用量\n\n## 许可证\n\nMIT\n","readmeFilename":"README.zh-CN.md"}