[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MMCRX0XRAMRQGXR8MSGEFE":3,"skill-same:01M6MMCRX0XRAMRQGXR8MSGEFE":76},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":50,"repositoryHtmlUrl":51,"repositoryHomepageUrl":52,"ownerHtmlUrl":53,"ownerBlogUrl":54,"ownerDescription":55,"updatedAt":56,"install":57,"resources":69},"01M6MMCRX0XRAMRQGXR8MSGEFE","runtype-external-agents",null,"Connect agents that run outside Runtype (Flue, Cloudflare Agents SDK, Vercel AI SDK, LangGraph, OpenAI Agents SDK, Mastra, OpenClaw, Hermes, Pi, custom loops) through OpenTelemetry\u002FOTLP trace export or an A2A or runtype-stream endpoint, to get runs, traces, eval capture, Persona chat, or surfaces; not Runtype-hosted execution.","hashgraph-online\u002Fawesome-codex-plugins","hashgraph-online","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F160371962?v=4","01M6CNB6NRJVNNGN14TR01Q6D3","HOL (Hashgraph Online)","01M6JT1HSKKG9V68KQAQGBA7XP",1554,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fruntypelabs\u002Fskills\u002Fskills\u002Fruntype-external-agents\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"runtype","runtype external agents","eval","connect agents","you","chat ui","loops","get","vercel ai sdk","surfaces","export","openclaw","persona","OpenTelemetry","ai sdk","ui","cloudflare","openai","run","connect","agents sdk","2026-11-10 10:12:30",false,"---\nname: runtype-external-agents\ndescription: 'Connect agents that run outside Runtype (Flue, Cloudflare Agents SDK, Vercel AI SDK, LangGraph, OpenAI Agents SDK, Mastra, OpenClaw, Hermes, Pi, custom loops) through OpenTelemetry\u002FOTLP trace export or an A2A or runtype-stream endpoint, to get runs, traces, eval capture, Persona chat, or surfaces; not Runtype-hosted execution.'\nuser-invocable: true\nargument-hint: '[framework and what you want from Runtype: traces, evals, chat UI]'\n---\n\n# Runtype for agents that run elsewhere\n\nRuntype is a suite of components, not only a hosted runtime. An agent that runs on the\nuser's own infrastructure can still use Runtype's Runs and Logs, trace trees, cost\nestimates, eval capture, Persona chat UI, surfaces, and the MCP-driven improvement loop.\nPick the lane that serves what the user wants, set it up, and say plainly what each lane\ndoes not do.\n\nIf the Runtype MCP server is connected, read\n`get_platform_documentation(topic=\"external-agents\")` first. It is the live version of\nthis skill. Public docs: `https:\u002F\u002Fdocs.runtype.com\u002Fdeveloper-guides\u002Fguides\u002Fbring-your-own-agent`.\n\n## Pick a lane (they compose)\n\n| User wants                                                                | Lane                                                                                                 |\n| ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| See runs, traces, tokens, cost; capture real runs as eval cases           | **A. Push telemetry in** (OTLP to `https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel`)                                 |\n| Test the agent from Runtype, put a Persona chat or surface in front of it | **B. Let Runtype call the agent** (`external` agent, `runtype-stream` or A2A endpoint)               |\n| Run an agent authored in Runtype on their own cloud                       | **C. Export** (`export_agent_runtime`, Enterprise plan; do not propose for hackathons or free tiers) |\n\nAn exported agent (lane C) reports its runs to Runtype over OTLP with no extra code. Set\n`RUNTYPE_API_KEY` (a `TELEMETRY:WRITE` key) on the deployment. `RUNTYPE_TELEMETRY=off`\nstops reporting, and `RUNTYPE_TELEMETRY_CONTENT=off` drops messages and tool payloads. The\nexport call itself needs a key with `RUNTIME:EXPORT`. Guide:\n`https:\u002F\u002Fdocs.runtype.com\u002Fdeveloper-guides\u002Fguides\u002Fself-hosting`.\n\nCapability matrix to state plainly:\n\n- Eval **capture** (`add_eval_case_from_execution`) needs a transcript on the run: message\n  content on the spans (`gen_ai.input.messages` \u002F `gen_ai.output.messages`, or a supported\n  framework's own attributes). `@runtypelabs\u002Fflue-otel` 0.5 and later sends it by default\n  (`content: false` turns it off). Version 0.4 and earlier never did.\n- OpenClaw, Hermes, and the Pi coding agent send no conversation content by default. Set\n  `RUNTYPE_CAPTURE_CONTENT=true` for OpenClaw and Pi or\n  `RUNTYPE_OTEL_CAPTURE_CONTENT=true` for Hermes. If the plugin receives no\n  content, the run has no transcript to capture as an eval case. The Pi durable\n  binding sends content unless `content: false`.\n- Eval **re-run** (`run_eval_suite`) needs Runtype to be able to call the agent. An\n  `external` agent over A2A works (recorded-tool replay cases are skipped).\n  `runtype-stream` endpoints are not eval targets. Telemetry-only runs cannot be re-run.\n- The \"fix\" step is a change in the user's repository, never `update_agent`.\n- `POST \u002Fv1\u002Fexecutions\u002Fingest` accepts JSON and produces the same run and trace tree as\n  OTLP. Use it only when the agent cannot export OpenTelemetry spans.\n\n## Prerequisites\n\n1. **Fastest path:** the dashboard's **Connect an existing agent** page (`\u002Fagents\u002Fconnect`)\n   creates or picks the agent, creates a telemetry key, and shows copy-ready setup for each\n   framework. Its **Copy setup prompt** action gives the same setup as markdown for a\n   coding agent, with a placeholder instead of the key.\n2. Otherwise, an agent record that owns the runs: `create_agent` (a plain agent with a\n   model is a fine attribution target) or an `external` agent for lane B. Read the\n   `agent_...` id back from `list_agents`.\n3. A telemetry API key with the **Telemetry Ingest** permission group (`TELEMETRY:WRITE`,\n   append-only), created on the dashboard **API Keys** page (`\u002Fsettings\u002Fapi`) or on the\n   connect page. Keys with `AGENTS:WRITE` also work. No MCP tool creates API keys. Where the\n   account offers `request_api_key`, calling it with `[\"TELEMETRY:WRITE\"]` files a request\n   that a human approves. Never paste key values into chat. Write them to `.dev.vars`,\n   `wrangler secret put`, or the user's secret store.\n\n## Lane A recipes\n\n**Flue on Cloudflare Workers (zero code).** Workers Observability traces a Flue v2 app\ndeployed with `@flue\u002Fvite` and `@cloudflare\u002Fvite-plugin` automatically. It emits\n`invoke_agent`, `chat`, and `execute_tool` spans in GenAI semantic conventions, with\nconversation content on by default. Export them to Runtype:\n\n1. In the Cloudflare dashboard, open **Workers Observability** and add a destination: type\n   Traces, endpoint `https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel\u002Fv1\u002Ftraces`, headers\n   `Authorization: Bearer rt_...` and `x-runtype-agent-id: agent_...`. OTLP export needs a\n   Workers Paid plan.\n2. In `wrangler.jsonc`:\n   `{ \"observability\": { \"traces\": { \"enabled\": true, \"destinations\": [\"runtype\"], \"head_sampling_rate\": 1 } } }`\n3. Run `npx vite build && npx wrangler deploy`, run one conversation, and confirm it with\n   `list_runs` (filter `agent_id`) and `trace_execution`.\n\nTo keep prompts and tool payloads out of the export, add\n`instrument(createCloudflareTracing({ content: false }))` from `@flue\u002Fruntime\u002Fcloudflare`\nat module scope in `app.ts`. Tell the user this also removes eval capture. Think apps use\nthe same destination. They store no payloads unless the agent class sets\n`storeMessages = true` and `storeTools = true`.\n\n**Cloudflare Agents SDK (`agents`).** Runtype has no dedicated adapter for it. Use the\ngeneric OpenTelemetry setup under **Any other OpenTelemetry-instrumented agent**.\n\n**OpenClaw native plugin.** The plugin sends OTLP itself. Do not add a separate\nOpenTelemetry SDK. Review the package and its requested capabilities before\ngranting conversation access. Install it with\n`openclaw plugins install @runtypelabs\u002Fopenclaw-adapter`.\n\nSet `RUNTYPE_AGENT_ID` and a `TELEMETRY:WRITE` key in `RUNTYPE_API_KEY` on the\nGateway process. `RUNTYPE_OTLP_URL` changes the full OTLP trace URL from its\n`https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel\u002Fv1\u002Ftraces` default. Use only a trusted\nreceiver because it receives the telemetry key. Run\n`openclaw plugins enable runtype` and\n`openclaw config set plugins.entries.runtype.hooks.allowConversationAccess true --strict-json`,\nthen restart the Gateway. JSON inspection can expose environment values. Run\n`openclaw plugins inspect runtype --runtime` without `--json`.\n\nThe `chat` span represents an OpenClaw attempt, not each provider call. The plugin\nwaits up to one second for pending `llm_output` after `agent_end`, but it has no\ndurable retry queue. Content is off by default. With `RUNTYPE_CAPTURE_CONTENT=true`, the\nplugin sends bounded, redacted messages and tool payloads only when OpenClaw\nsupplies them. It omits a content value over 32 KiB after redaction, but the\nredactor cannot identify every secret. A run without a transcript cannot\nbecome an eval case. This plugin does not make OpenClaw callable from Runtype.\n\n**Hermes native plugin.** The Hermes observer plugin sends OTLP itself. Do not add\na separate OpenTelemetry SDK. Install and enable it with\n`hermes plugins install runtypelabs\u002Fhermes-runtype-otel --enable`. Set `RUNTYPE_AGENT_ID`\nand a `TELEMETRY:WRITE` key in `RUNTYPE_OTEL_API_KEY` on the Hermes process.\n`RUNTYPE_OTEL_ENDPOINT` changes the full OTLP trace URL from its\n`https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel\u002Fv1\u002Ftraces` default. Use only a trusted\nreceiver because it receives the telemetry key. Restart a running gateway with\n`hermes gateway restart`. For a CLI test, run\n`hermes chat --oneshot -q \"Reply with one sentence\"`.\n\nContent is off by default. `RUNTYPE_OTEL_CAPTURE_CONTENT=true` sends bounded,\nredacted messages and tool payloads for transcripts and eval capture. The plugin\nlimits message text and tool results to 4,096 characters and model input to the\nlast 16 messages. It omits tool arguments whose redacted JSON exceeds 4,096\ncharacters. The filter cannot identify every secret. This plugin does not make\nHermes callable from Runtype. Hermes can return a provider error before it emits\n`on_session_end`; `api_request_error` may recover, so a long-running gateway\ncannot immediately export that failed turn as terminal.\n\n**Pi (`@runtypelabs\u002Fpi-otel`).** One package, two bindings. Both send OTLP\u002FJSON\nthemselves; do not add an OpenTelemetry SDK. Each Pi run becomes one Runtype run\n(`invoke_agent`, one `chat` per model response, one `execute_tool` per tool result), and\nRuntype prices it from the model name. The pi-durable peer is minor-locked to `~1.0.0`, and\npi-durable and `PiHarness` are experimental\u002Fbeta upstream.\n\n- Pi coding agent: `pi install npm:@runtypelabs\u002Fpi-otel`. Set `RUNTYPE_API_KEY`\n  (`TELEMETRY:WRITE`) and `RUNTYPE_AGENT_ID` in the shell that starts `pi`;\n  `RUNTYPE_OTLP_URL` overrides the full trace URL. Content is off by default because\n  sessions carry source code; `RUNTYPE_CAPTURE_CONTENT=true` turns on transcripts and\n  eval capture. A run is one prompt until `agent_settled`. `RUNTYPE_DEBUG=true` prints\n  why nothing is sent.\n- pi-durable, including Cloudflare `PiHarness`: `npm install @runtypelabs\u002Fpi-otel`, then\n  `observePiDurable(harness, { agentId, apiKey, harnessId })` from `@runtypelabs\u002Fpi-otel\u002Fdurable`\n  (`harnessId` is a stable id for the storage, e.g. `ctx.id.toString()` in a Durable Object)\n  right after `Harness.open`, then `await observer.recover(context)` before work resumes\n  so a run a restart interrupted stays in the same trace. With `PiHarness`, do both\n  inside the harness factory before returning the harness; never via `harness.pi()`,\n  which resolves after resumed work has started. In the Worker call\n  `ctx.waitUntil(observer.flush())` after each prompt. One input submission is one\n  run; `unanswered` is a failed run. Content is on by default; `content: false`, per-kind\n  switches, `maxChars` and `redact` narrow it.\n\nReport each Pi run through one producer only, or Runtype counts its tokens twice. Neither\nbinding makes the agent callable from Runtype.\n\n**Flue on Node, Cloud Run, or another host.** Point exactly one Flue instrumentation at\nRuntype. Two would double the tokens and cost.\n\n- `@runtypelabs\u002Fflue-otel` 0.5 or later: `instrument(createRuntypeFlueInstrumentation())`.\n  By default it sends the transcript, the system prompt, and tool arguments and results.\n  Each kind has an off switch, and `content: false` sends none. It also sends an exact\n  iteration count, a run-level stop reason, and summed usage. Prefer this package: it gives\n  eval capture and exact loop structure together.\n- `@flue\u002Fopentelemetry`: `instrument(createOpenTelemetryInstrumentation())`. It exports the\n  conversation by default. Runtype derives the loop structure from Flue's `flue.*`\n  attributes, without the exact iteration count or run-level stop reason.\n\nThe app owns the OTel SDK: `NodeTracerProvider`, `BatchSpanProcessor`, and\n`OTLPTraceExporter({ url: 'https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel\u002Fv1\u002Ftraces', headers: { Authorization: 'Bearer ' + key } })`.\nCall `provider.register()`, or every span becomes its own trace. Attribute runs with\n`runtypeFlueResourceAttributes({ agentId })` or the `x-runtype-agent-id` header. Call\n`await provider.forceFlush()` before a serverless handler returns. `forceFlush()` rejects\nwhen the export fails or times out, so catch it:\n`await provider.forceFlush().catch(console.error)`. An uncaught rejection in a `finally`\nblock fails the handler after the agent's own work succeeded. The app also installs\n`@flue\u002Fruntime` itself, which needs Node 22.19 or later.\n\n**Frameworks with OpenTelemetry instrumentation.** Each framework in this table\nneeds an OpenTelemetry provider and exporter behind its instrumentation.\nInstrumentation alone emits spans that nothing sends, and the run never appears.\nRuntype reads each framework's own attributes, so no `gen_ai.*` code is needed.\nSet the exporter with the env vars below, except for Mastra.\n\n| Framework         | Install                                                                                                      | Enable                                                                                                                                                                                                     |\n| ----------------- | ------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Vercel AI SDK     | `@opentelemetry\u002Fsdk-node`, `@opentelemetry\u002Fexporter-trace-otlp-proto`                                        | `const sdk = new NodeSDK({ traceExporter: new OTLPTraceExporter() }); sdk.start()`, shut the SDK down before exit, and pass `experimental_telemetry: { isEnabled: true, functionId: 'my-agent' }` per call |\n| LangGraph         | `openinference-instrumentation-langchain`, `opentelemetry-exporter-otlp-proto-http`                          | `LangChainInstrumentor().instrument(tracer_provider=provider)`                                                                                                                                             |\n| OpenAI Agents SDK | `openinference-instrumentation-openai-agents`, `opentelemetry-exporter-otlp-proto-http`                      | `OpenAIAgentsInstrumentor().instrument(tracer_provider=provider)`                                                                                                                                          |\n| Mastra            | `@mastra\u002Fcore`, `@mastra\u002Fobservability`, `@mastra\u002Fotel-exporter`, `@opentelemetry\u002Fexporter-trace-otlp-proto` | An `OtelExporter` in the `Mastra` constructor's `observability` config, and `await mastra.shutdown()` in a `finally` around the run                                                                        |\n\nMastra's exporter ignores `OTEL_EXPORTER_OTLP_ENDPOINT` and `OTEL_EXPORTER_OTLP_HEADERS`.\nPass `endpoint` (the full `https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel\u002Fv1\u002Ftraces` path) and `headers`\nto `OtelExporter` directly. For `http\u002Fprotobuf`, install\n`@opentelemetry\u002Fexporter-trace-otlp-proto` too. Without it, the exporter logs one console\nerror and sends nothing.\n\n**Any other OpenTelemetry-instrumented agent.** Use the stock env vars, HTTP only (no gRPC):\n\n```bash\nOTEL_EXPORTER_OTLP_ENDPOINT=https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel\nOTEL_EXPORTER_OTLP_HEADERS=authorization=Bearer rt_...,x-runtype-agent-id=agent_...\nOTEL_EXPORTER_OTLP_PROTOCOL=http\u002Fprotobuf\n```\n\nRuntype reads spans whose `gen_ai.operation.name` is `invoke_agent`, `chat`, or\n`execute_tool` (an HTTP root span above them is fine), and the GenAI content attributes.\nAttribution per trace, in order: the `runtype.agent.id` resource attribute, the\n`x-runtype-agent-id` header, then `runtype.agent.id` on the `invoke_agent` span. Keep one\nagent invocation per trace.\n\nTraces create runs. OTLP logs are kept in **Logs** only when they name an agent (resource\nattribute or header); unattributed log records get a `partial_success` and are dropped.\nMetrics are acknowledged but not stored.\n\nThe run detail shows a telemetry chip: **Structure**, **Transcript**, or **Full detail**.\nTranscript needs message content on the spans, which eval capture also needs. Full detail\nalso needs `runtype.adapter.version` and `runtype.tools.reported` on the exporter.\n\n## Lane B recipe\n\nRegister the endpoint so Runtype can call it. `create_agent` (MCP) input:\n\n```json\n{\n  \"name\": \"Support agent (Flue)\",\n  \"agent_type\": \"external\",\n  \"external_config\": {\n    \"endpoint\": \"https:\u002F\u002Fmy-worker.example.workers.dev\u002Fdispatch\",\n    \"protocol\": \"runtype-stream\",\n    \"framework\": \"flue\",\n    \"auth\": { \"type\": \"bearer\", \"credentials\": \"{{secret:MY_AGENT_TOKEN}}\" },\n    \"timeoutMs\": 120000\n  }\n}\n```\n\nThe REST API (`POST \u002Fv1\u002Fagents`) and SDK take `agentType` and `externalConfig`; the fields\ninside `externalConfig` are the same.\n\n- `auth.type` is `none`, `bearer`, `api_key` (sent in `headerName`, default `X-API-Key`),\n  or `basic` (`credentials` goes after `Basic ` as given, so pass the encoded value).\n- `timeoutMs` (1,000 to 300,000; default 30,000) covers the connection and the whole\n  streamed response. Set it above the slowest turn, or long turns fail partway through.\n- `retryCount` (0 to 10; default 3) retries the connection only, never a stream that has\n  started.\n- `framework` is a descriptive label (`flue`, `langchain`, `vercel_ai`, `crewai`,\n  `cloudflare`, `autogen`, or `custom`). It does not change the wire protocol.\n\n**Where to register.** The dashboard's **Connect External** tab on the new-agent page\nregisters A2A endpoints only. Register a `runtype-stream` agent with `create_agent` or\n`POST \u002Fv1\u002Fagents`.\n\n**`runtype-stream` endpoints.** Runtype sends `POST {endpoint}` with\n`{ \"messages\": [...], \"context\": { \"conversationId\": \"...\" }, \"metadata\": {...} }`.\n`messages` holds the full conversation history (`role` and `content`) on every call. An\nendpoint that keeps its own session state, such as a Flue session keyed by\n`conversationId`, must dispatch only the newest user message.\n\nThe endpoint streams `text\u002Fevent-stream` frames in Runtype's unified vocabulary:\n`execution_start` first, then text and tool frames, then one terminal\n`execution_complete` or `execution_error`. Each frame's `id:` mirrors a 0-based `seq`. The\nschemas are the `ExecutionStreamEvent` union in the public OpenAPI spec, the same stream\n`execute_agent` returns for a hosted agent. Report cost and tokens as `totalCost` and\n`totalTokens` on `execution_complete`; the run shows no cost or tokens otherwise. In a\nFlue 2 app, the route runs the turn with `init(agent, { id: conversationId })` and\n`handle.dispatch(message)`, and maps each chunk from `handle.read(receipt, { onEvent })`\nonto a frame.\n\n**A2A endpoints.** Omit `protocol` (or set `\"a2a\"`). The endpoint's origin must serve an\nagent card at `\u002F.well-known\u002Fagent-card.json`, or set `agentCardUrl`. Registration fetches\nthe card and fails with `502` if it cannot. `runtype-stream` endpoints skip this step.\n\nThen run `execute_agent` to test, add the agent to a product as a capability, or run\n`generate_persona_embed_code` for a chat widget.\n\n## Improvement loop for an external agent\n\n1. Observe: `list_runs` with the owning agent's `agent_id` (ingested runs have `otel-...`\n   execution ids and `source: \"ingested\"`; timings and cost are what the agent reported),\n   or `list_logs`.\n2. Diagnose: `trace_execution`. Quote the failing iteration, tool call, or model turn.\n3. Capture: `get_eval_capture_preview`, then `add_eval_case_from_execution`\n   (`create_eval_suite` first if needed). No capturable content means the export lacks\n   message content.\n4. Fix: propose the change in the user's agent code and show it.\n5. Verify: `run_eval_suite` when Runtype can call the agent over A2A. Otherwise, re-run the\n   scenario against the redeployed agent and inspect the new run. The captured cases stay\n   the regression record either way.\n\n## Troubleshooting\n\nLane A (OTLP export):\n\n- `curl -X POST https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel\u002Fv1\u002Ftraces -H \"Authorization: Bearer $KEY\" -H \"Content-Type: application\u002Fjson\" -d '{\"resourceSpans\":[]}'`\n  returns `200 {}` when the key and endpoint are right.\n- `401`: the key is invalid. `403`: the credential is not an API key, or the key has\n  neither `TELEMETRY:WRITE` nor `AGENTS:WRITE`.\n- `413`: the export is over 8 MiB after decompression, or has more than 10,000 spans or more\n  than 100 traces. Lower the exporter's max export batch size.\n- `415`: use `http\u002Fprotobuf` or JSON, with gzip, deflate, or no compression.\n- `429`: the account's ingest rate or concurrency limit is reached. Retry after `Retry-After`.\n- `503`: Runtype could not accept the export right now, and it was not stored. Retry.\n- `200` means Runtype accepted the export; the run can take a short time to appear. If it\n  never appears, call `GET \u002Fv1\u002Ftelemetry\u002Fingest-health?traceId=\u003Chex>` with a separate key\n  that has `ANALYTICS:READ` or `AGENTS:READ`. A `TELEMETRY:WRITE` key cannot read it.\n- Run stuck \"in flight\": the closing `invoke_agent` span was never flushed.\n- `ambiguous_agent_attribution`: two invocations in one trace, or no attribution source.\n  Set the resource attribute or header.\n- No run after an attributed export: the trace has no GenAI operation, model or inference\n  signal, or recognized Runtype execution telemetry. Runtype keeps the trace in Logs.\n- Doubled tokens and cost: two instrumentations export to the same endpoint.\n- Tool calls appear without arguments or results: tool content capture is off on the\n  producer. Check its `content` or tools option.\n- `partial_success` in the exporter log: some traces named an agent the key cannot use.\n  The other traces were stored.\n\nLane B (`runtype-stream`):\n\n- \"External agent stream is not conformant: [CODE] ...\": the stream breaks the event\n  structure. The code names the rule, for example `NO_EXECUTION_START_FIRST`,\n  `SEQ_NOT_MONOTONIC`, `EVENT_AFTER_TERMINAL`, or `NO_TERMINAL`. Check the event order and\n  `seq`.\n- \"External agent stream ended without a terminal event\": send `execution_complete` or\n  `execution_error` last.\n- Output missing with no error: Runtype drops frames that fail schema validation. Validate\n  each frame against `ExecutionStreamEvent`.\n- A stream fails when it exceeds 20,000 events, 8 MiB in total, or 1 MiB in one frame.\n- A turn fails partway through: raise `timeoutMs`.\n\n## Avoid these mistakes\n\n- Do not promise eval re-runs for telemetry-only or `runtype-stream` agents.\n- Do not send both Flue instrumentations to Runtype.\n- Do not use `POST \u002Fv1\u002Ftelemetry\u002Fingest`. It is deprecated and produces no run, trace\n  tree, or transcript.\n- Do not recommend `export_agent_runtime` or self-hosting for an agent that already\n  exists elsewhere, or for non-Enterprise accounts.\n- Do not put key values in chat, commits, or generated code. Use secrets.\n","# Runtype for agents that run elsewhere\n\nRuntype is a suite of components, not only a hosted runtime. An agent that runs on the\nuser's own infrastructure can still use Runtype's Runs and Logs, trace trees, cost\nestimates, eval capture, Persona chat UI, surfaces, and the MCP-driven improvement loop.\nPick the lane that serves what the user wants, set it up, and say plainly what each lane\ndoes not do.\n\nIf the Runtype MCP server is connected, read\n`get_platform_documentation(topic=\"external-agents\")` first. It is the live version of\nthis skill. Public docs: `https:\u002F\u002Fdocs.runtype.com\u002Fdeveloper-guides\u002Fguides\u002Fbring-your-own-agent`.\n\n## Pick a lane (they compose)\n\n| User wants                                                                | Lane                                                                                                 |\n| ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| See runs, traces, tokens, cost; capture real runs as eval cases           | **A. Push telemetry in** (OTLP to `https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel`)                                 |\n| Test the agent from Runtype, put a Persona chat or surface in front of it | **B. Let Runtype call the agent** (`external` agent, `runtype-stream` or A2A endpoint)               |\n| Run an agent authored in Runtype on their own cloud                       | **C. Export** (`export_agent_runtime`, Enterprise plan; do not propose for hackathons or free tiers) |\n\nAn exported agent (lane C) reports its runs to Runtype over OTLP with no extra code. Set\n`RUNTYPE_API_KEY` (a `TELEMETRY:WRITE` key) on the deployment. `RUNTYPE_TELEMETRY=off`\nstops reporting, and `RUNTYPE_TELEMETRY_CONTENT=off` drops messages and tool payloads. The\nexport call itself needs a key with `RUNTIME:EXPORT`. Guide:\n`https:\u002F\u002Fdocs.runtype.com\u002Fdeveloper-guides\u002Fguides\u002Fself-hosting`.\n\nCapability matrix to state plainly:\n\n- Eval **capture** (`add_eval_case_from_execution`) needs a transcript on the run: message\n  content on the spans (`gen_ai.input.messages` \u002F `gen_ai.output.messages`, or a supported\n  framework's own attributes). `@runtypelabs\u002Fflue-otel` 0.5 and later sends it by default\n  (`content: false` turns it off). Version 0.4 and earlier never did.\n- OpenClaw, Hermes, and the Pi coding agent send no conversation content by default. Set\n  `RUNTYPE_CAPTURE_CONTENT=true` for OpenClaw and Pi or\n  `RUNTYPE_OTEL_CAPTURE_CONTENT=true` for Hermes. If the plugin receives no\n  content, the run has no transcript to capture as an eval case. The Pi durable\n  binding sends content unless `content: false`.\n- Eval **re-run** (`run_eval_suite`) needs Runtype to be able to call the agent. An\n  `external` agent over A2A works (recorded-tool replay cases are skipped).\n  `runtype-stream` endpoints are not eval targets. Telemetry-only runs cannot be re-run.\n- The \"fix\" step is a change in the user's repository, never `update_agent`.\n- `POST \u002Fv1\u002Fexecutions\u002Fingest` accepts JSON and produces the same run and trace tree as\n  OTLP. Use it only when the agent cannot export OpenTelemetry spans.\n\n## Prerequisites\n\n1. **Fastest path:** the dashboard's **Connect an existing agent** page (`\u002Fagents\u002Fconnect`)\n   creates or picks the agent, creates a telemetry key, and shows copy-ready setup for each\n   framework. Its **Copy setup prompt** action gives the same setup as markdown for a\n   coding agent, with a placeholder instead of the key.\n2. Otherwise, an agent record that owns the runs: `create_agent` (a plain agent with a\n   model is a fine attribution target) or an `external` agent for lane B. Read the\n   `agent_...` id back from `list_agents`.\n3. A telemetry API key with the **Telemetry Ingest** permission group (`TELEMETRY:WRITE`,\n   append-only), created on the dashboard **API Keys** page (`\u002Fsettings\u002Fapi`) or on the\n   connect page. Keys with `AGENTS:WRITE` also work. No MCP tool creates API keys. Where the\n   account offers `request_api_key`, calling it with `[\"TELEMETRY:WRITE\"]` files a request\n   that a human approves. Never paste key values into chat. Write them to `.dev.vars`,\n   `wrangler secret put`, or the user's secret store.\n\n## Lane A recipes\n\n**Flue on Cloudflare Workers (zero code).** Workers Observability traces a Flue v2 app\ndeployed with `@flue\u002Fvite` and `@cloudflare\u002Fvite-plugin` automatically. It emits\n`invoke_agent`, `chat`, and `execute_tool` spans in GenAI semantic conventions, with\nconversation content on by default. Export them to Runtype:\n\n1. In the Cloudflare dashboard, open **Workers Observability** and add a destination: type\n   Traces, endpoint `https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel\u002Fv1\u002Ftraces`, headers\n   `Authorization: Bearer rt_...` and `x-runtype-agent-id: agent_...`. OTLP export needs a\n   Workers Paid plan.\n2. In `wrangler.jsonc`:\n   `{ \"observability\": { \"traces\": { \"enabled\": true, \"destinations\": [\"runtype\"], \"head_sampling_rate\": 1 } } }`\n3. Run `npx vite build && npx wrangler deploy`, run one conversation, and confirm it with\n   `list_runs` (filter `agent_id`) and `trace_execution`.\n\nTo keep prompts and tool payloads out of the export, add\n`instrument(createCloudflareTracing({ content: false }))` from `@flue\u002Fruntime\u002Fcloudflare`\nat module scope in `app.ts`. Tell the user this also removes eval capture. Think apps use\nthe same destination. They store no payloads unless the agent class sets\n`storeMessages = true` and `storeTools = true`.\n\n**Cloudflare Agents SDK (`agents`).** Runtype has no dedicated adapter for it. Use the\ngeneric OpenTelemetry setup under **Any other OpenTelemetry-instrumented agent**.\n\n**OpenClaw native plugin.** The plugin sends OTLP itself. Do not add a separate\nOpenTelemetry SDK. Review the package and its requested capabilities before\ngranting conversation access. Install it with\n`openclaw plugins install @runtypelabs\u002Fopenclaw-adapter`.\n\nSet `RUNTYPE_AGENT_ID` and a `TELEMETRY:WRITE` key in `RUNTYPE_API_KEY` on the\nGateway process. `RUNTYPE_OTLP_URL` changes the full OTLP trace URL from its\n`https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel\u002Fv1\u002Ftraces` default. Use only a trusted\nreceiver because it receives the telemetry key. Run\n`openclaw plugins enable runtype` and\n`openclaw config set plugins.entries.runtype.hooks.allowConversationAccess true --strict-json`,\nthen restart the Gateway. JSON inspection can expose environment values. Run\n`openclaw plugins inspect runtype --runtime` without `--json`.\n\nThe `chat` span represents an OpenClaw attempt, not each provider call. The plugin\nwaits up to one second for pending `llm_output` after `agent_end`, but it has no\ndurable retry queue. Content is off by default. With `RUNTYPE_CAPTURE_CONTENT=true`, the\nplugin sends bounded, redacted messages and tool payloads only when OpenClaw\nsupplies them. It omits a content value over 32 KiB after redaction, but the\nredactor cannot identify every secret. A run without a transcript cannot\nbecome an eval case. This plugin does not make OpenClaw callable from Runtype.\n\n**Hermes native plugin.** The Hermes observer plugin sends OTLP itself. Do not add\na separate OpenTelemetry SDK. Install and enable it with\n`hermes plugins install runtypelabs\u002Fhermes-runtype-otel --enable`. Set `RUNTYPE_AGENT_ID`\nand a `TELEMETRY:WRITE` key in `RUNTYPE_OTEL_API_KEY` on the Hermes process.\n`RUNTYPE_OTEL_ENDPOINT` changes the full OTLP trace URL from its\n`https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel\u002Fv1\u002Ftraces` default. Use only a trusted\nreceiver because it receives the telemetry key. Restart a running gateway with\n`hermes gateway restart`. For a CLI test, run\n`hermes chat --oneshot -q \"Reply with one sentence\"`.\n\nContent is off by default. `RUNTYPE_OTEL_CAPTURE_CONTENT=true` sends bounded,\nredacted messages and tool payloads for transcripts and eval capture. The plugin\nlimits message text and tool results to 4,096 characters and model input to the\nlast 16 messages. It omits tool arguments whose redacted JSON exceeds 4,096\ncharacters. The filter cannot identify every secret. This plugin does not make\nHermes callable from Runtype. Hermes can return a provider error before it emits\n`on_session_end`; `api_request_error` may recover, so a long-running gateway\ncannot immediately export that failed turn as terminal.\n\n**Pi (`@runtypelabs\u002Fpi-otel`).** One package, two bindings. Both send OTLP\u002FJSON\nthemselves; do not add an OpenTelemetry SDK. Each Pi run becomes one Runtype run\n(`invoke_agent`, one `chat` per model response, one `execute_tool` per tool result), and\nRuntype prices it from the model name. The pi-durable peer is minor-locked to `~1.0.0`, and\npi-durable and `PiHarness` are experimental\u002Fbeta upstream.\n\n- Pi coding agent: `pi install npm:@runtypelabs\u002Fpi-otel`. Set `RUNTYPE_API_KEY`\n  (`TELEMETRY:WRITE`) and `RUNTYPE_AGENT_ID` in the shell that starts `pi`;\n  `RUNTYPE_OTLP_URL` overrides the full trace URL. Content is off by default because\n  sessions carry source code; `RUNTYPE_CAPTURE_CONTENT=true` turns on transcripts and\n  eval capture. A run is one prompt until `agent_settled`. `RUNTYPE_DEBUG=true` prints\n  why nothing is sent.\n- pi-durable, including Cloudflare `PiHarness`: `npm install @runtypelabs\u002Fpi-otel`, then\n  `observePiDurable(harness, { agentId, apiKey, harnessId })` from `@runtypelabs\u002Fpi-otel\u002Fdurable`\n  (`harnessId` is a stable id for the storage, e.g. `ctx.id.toString()` in a Durable Object)\n  right after `Harness.open`, then `await observer.recover(context)` before work resumes\n  so a run a restart interrupted stays in the same trace. With `PiHarness`, do both\n  inside the harness factory before returning the harness; never via `harness.pi()`,\n  which resolves after resumed work has started. In the Worker call\n  `ctx.waitUntil(observer.flush())` after each prompt. One input submission is one\n  run; `unanswered` is a failed run. Content is on by default; `content: false`, per-kind\n  switches, `maxChars` and `redact` narrow it.\n\nReport each Pi run through one producer only, or Runtype counts its tokens twice. Neither\nbinding makes the agent callable from Runtype.\n\n**Flue on Node, Cloud Run, or another host.** Point exactly one Flue instrumentation at\nRuntype. Two would double the tokens and cost.\n\n- `@runtypelabs\u002Fflue-otel` 0.5 or later: `instrument(createRuntypeFlueInstrumentation())`.\n  By default it sends the transcript, the system prompt, and tool arguments and results.\n  Each kind has an off switch, and `content: false` sends none. It also sends an exact\n  iteration count, a run-level stop reason, and summed usage. Prefer this package: it gives\n  eval capture and exact loop structure together.\n- `@flue\u002Fopentelemetry`: `instrument(createOpenTelemetryInstrumentation())`. It exports the\n  conversation by default. Runtype derives the loop structure from Flue's `flue.*`\n  attributes, without the exact iteration count or run-level stop reason.\n\nThe app owns the OTel SDK: `NodeTracerProvider`, `BatchSpanProcessor`, and\n`OTLPTraceExporter({ url: 'https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel\u002Fv1\u002Ftraces', headers: { Authorization: 'Bearer ' + key } })`.\nCall `provider.register()`, or every span becomes its own trace. Attribute runs with\n`runtypeFlueResourceAttributes({ agentId })` or the `x-runtype-agent-id` header. Call\n`await provider.forceFlush()` before a serverless handler returns. `forceFlush()` rejects\nwhen the export fails or times out, so catch it:\n`await provider.forceFlush().catch(console.error)`. An uncaught rejection in a `finally`\nblock fails the handler after the agent's own work succeeded. The app also installs\n`@flue\u002Fruntime` itself, which needs Node 22.19 or later.\n\n**Frameworks with OpenTelemetry instrumentation.** Each framework in this table\nneeds an OpenTelemetry provider and exporter behind its instrumentation.\nInstrumentation alone emits spans that nothing sends, and the run never appears.\nRuntype reads each framework's own attributes, so no `gen_ai.*` code is needed.\nSet the exporter with the env vars below, except for Mastra.\n\n| Framework         | Install                                                                                                      | Enable                                                                                                                                                                                                     |\n| ----------------- | ------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Vercel AI SDK     | `@opentelemetry\u002Fsdk-node`, `@opentelemetry\u002Fexporter-trace-otlp-proto`                                        | `const sdk = new NodeSDK({ traceExporter: new OTLPTraceExporter() }); sdk.start()`, shut the SDK down before exit, and pass `experimental_telemetry: { isEnabled: true, functionId: 'my-agent' }` per call |\n| LangGraph         | `openinference-instrumentation-langchain`, `opentelemetry-exporter-otlp-proto-http`                          | `LangChainInstrumentor().instrument(tracer_provider=provider)`                                                                                                                                             |\n| OpenAI Agents SDK | `openinference-instrumentation-openai-agents`, `opentelemetry-exporter-otlp-proto-http`                      | `OpenAIAgentsInstrumentor().instrument(tracer_provider=provider)`                                                                                                                                          |\n| Mastra            | `@mastra\u002Fcore`, `@mastra\u002Fobservability`, `@mastra\u002Fotel-exporter`, `@opentelemetry\u002Fexporter-trace-otlp-proto` | An `OtelExporter` in the `Mastra` constructor's `observability` config, and `await mastra.shutdown()` in a `finally` around the run                                                                        |\n\nMastra's exporter ignores `OTEL_EXPORTER_OTLP_ENDPOINT` and `OTEL_EXPORTER_OTLP_HEADERS`.\nPass `endpoint` (the full `https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel\u002Fv1\u002Ftraces` path) and `headers`\nto `OtelExporter` directly. For `http\u002Fprotobuf`, install\n`@opentelemetry\u002Fexporter-trace-otlp-proto` too. Without it, the exporter logs one console\nerror and sends nothing.\n\n**Any other OpenTelemetry-instrumented agent.** Use the stock env vars, HTTP only (no gRPC):\n\n```bash\nOTEL_EXPORTER_OTLP_ENDPOINT=https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel\nOTEL_EXPORTER_OTLP_HEADERS=authorization=Bearer rt_...,x-runtype-agent-id=agent_...\nOTEL_EXPORTER_OTLP_PROTOCOL=http\u002Fprotobuf\n```\n\nRuntype reads spans whose `gen_ai.operation.name` is `invoke_agent`, `chat`, or\n`execute_tool` (an HTTP root span above them is fine), and the GenAI content attributes.\nAttribution per trace, in order: the `runtype.agent.id` resource attribute, the\n`x-runtype-agent-id` header, then `runtype.agent.id` on the `invoke_agent` span. Keep one\nagent invocation per trace.\n\nTraces create runs. OTLP logs are kept in **Logs** only when they name an agent (resource\nattribute or header); unattributed log records get a `partial_success` and are dropped.\nMetrics are acknowledged but not stored.\n\nThe run detail shows a telemetry chip: **Structure**, **Transcript**, or **Full detail**.\nTranscript needs message content on the spans, which eval capture also needs. Full detail\nalso needs `runtype.adapter.version` and `runtype.tools.reported` on the exporter.\n\n## Lane B recipe\n\nRegister the endpoint so Runtype can call it. `create_agent` (MCP) input:\n\n```json\n{\n  \"name\": \"Support agent (Flue)\",\n  \"agent_type\": \"external\",\n  \"external_config\": {\n    \"endpoint\": \"https:\u002F\u002Fmy-worker.example.workers.dev\u002Fdispatch\",\n    \"protocol\": \"runtype-stream\",\n    \"framework\": \"flue\",\n    \"auth\": { \"type\": \"bearer\", \"credentials\": \"{{secret:MY_AGENT_TOKEN}}\" },\n    \"timeoutMs\": 120000\n  }\n}\n```\n\nThe REST API (`POST \u002Fv1\u002Fagents`) and SDK take `agentType` and `externalConfig`; the fields\ninside `externalConfig` are the same.\n\n- `auth.type` is `none`, `bearer`, `api_key` (sent in `headerName`, default `X-API-Key`),\n  or `basic` (`credentials` goes after `Basic ` as given, so pass the encoded value).\n- `timeoutMs` (1,000 to 300,000; default 30,000) covers the connection and the whole\n  streamed response. Set it above the slowest turn, or long turns fail partway through.\n- `retryCount` (0 to 10; default 3) retries the connection only, never a stream that has\n  started.\n- `framework` is a descriptive label (`flue`, `langchain`, `vercel_ai`, `crewai`,\n  `cloudflare`, `autogen`, or `custom`). It does not change the wire protocol.\n\n**Where to register.** The dashboard's **Connect External** tab on the new-agent page\nregisters A2A endpoints only. Register a `runtype-stream` agent with `create_agent` or\n`POST \u002Fv1\u002Fagents`.\n\n**`runtype-stream` endpoints.** Runtype sends `POST {endpoint}` with\n`{ \"messages\": [...], \"context\": { \"conversationId\": \"...\" }, \"metadata\": {...} }`.\n`messages` holds the full conversation history (`role` and `content`) on every call. An\nendpoint that keeps its own session state, such as a Flue session keyed by\n`conversationId`, must dispatch only the newest user message.\n\nThe endpoint streams `text\u002Fevent-stream` frames in Runtype's unified vocabulary:\n`execution_start` first, then text and tool frames, then one terminal\n`execution_complete` or `execution_error`. Each frame's `id:` mirrors a 0-based `seq`. The\nschemas are the `ExecutionStreamEvent` union in the public OpenAPI spec, the same stream\n`execute_agent` returns for a hosted agent. Report cost and tokens as `totalCost` and\n`totalTokens` on `execution_complete`; the run shows no cost or tokens otherwise. In a\nFlue 2 app, the route runs the turn with `init(agent, { id: conversationId })` and\n`handle.dispatch(message)`, and maps each chunk from `handle.read(receipt, { onEvent })`\nonto a frame.\n\n**A2A endpoints.** Omit `protocol` (or set `\"a2a\"`). The endpoint's origin must serve an\nagent card at `\u002F.well-known\u002Fagent-card.json`, or set `agentCardUrl`. Registration fetches\nthe card and fails with `502` if it cannot. `runtype-stream` endpoints skip this step.\n\nThen run `execute_agent` to test, add the agent to a product as a capability, or run\n`generate_persona_embed_code` for a chat widget.\n\n## Improvement loop for an external agent\n\n1. Observe: `list_runs` with the owning agent's `agent_id` (ingested runs have `otel-...`\n   execution ids and `source: \"ingested\"`; timings and cost are what the agent reported),\n   or `list_logs`.\n2. Diagnose: `trace_execution`. Quote the failing iteration, tool call, or model turn.\n3. Capture: `get_eval_capture_preview`, then `add_eval_case_from_execution`\n   (`create_eval_suite` first if needed). No capturable content means the export lacks\n   message content.\n4. Fix: propose the change in the user's agent code and show it.\n5. Verify: `run_eval_suite` when Runtype can call the agent over A2A. Otherwise, re-run the\n   scenario against the redeployed agent and inspect the new run. The captured cases stay\n   the regression record either way.\n\n## Troubleshooting\n\nLane A (OTLP export):\n\n- `curl -X POST https:\u002F\u002Fapi.runtype.com\u002Fv1\u002Fotel\u002Fv1\u002Ftraces -H \"Authorization: Bearer $KEY\" -H \"Content-Type: application\u002Fjson\" -d '{\"resourceSpans\":[]}'`\n  returns `200 {}` when the key and endpoint are right.\n- `401`: the key is invalid. `403`: the credential is not an API key, or the key has\n  neither `TELEMETRY:WRITE` nor `AGENTS:WRITE`.\n- `413`: the export is over 8 MiB after decompression, or has more than 10,000 spans or more\n  than 100 traces. Lower the exporter's max export batch size.\n- `415`: use `http\u002Fprotobuf` or JSON, with gzip, deflate, or no compression.\n- `429`: the account's ingest rate or concurrency limit is reached. Retry after `Retry-After`.\n- `503`: Runtype could not accept the export right now, and it was not stored. Retry.\n- `200` means Runtype accepted the export; the run can take a short time to appear. If it\n  never appears, call `GET \u002Fv1\u002Ftelemetry\u002Fingest-health?traceId=\u003Chex>` with a separate key\n  that has `ANALYTICS:READ` or `AGENTS:READ`. A `TELEMETRY:WRITE` key cannot read it.\n- Run stuck \"in flight\": the closing `invoke_agent` span was never flushed.\n- `ambiguous_agent_attribution`: two invocations in one trace, or no attribution source.\n  Set the resource attribute or header.\n- No run after an attributed export: the trace has no GenAI operation, model or inference\n  signal, or recognized Runtype execution telemetry. Runtype keeps the trace in Logs.\n- Doubled tokens and cost: two instrumentations export to the same endpoint.\n- Tool calls appear without arguments or results: tool content capture is off on the\n  producer. Check its `content` or tools option.\n- `partial_success` in the exporter log: some traces named an agent the key cannot use.\n  The other traces were stored.\n\nLane B (`runtype-stream`):\n\n- \"External agent stream is not conformant: [CODE] ...\": the stream breaks the event\n  structure. The code names the rule, for example `NO_EXECUTION_START_FIRST`,\n  `SEQ_NOT_MONOTONIC`, `EVENT_AFTER_TERMINAL`, or `NO_TERMINAL`. Check the event order and\n  `seq`.\n- \"External agent stream ended without a terminal event\": send `execution_complete` or\n  `execution_error` last.\n- Output missing with no error: Runtype drops frames that fail schema validation. Validate\n  each frame against `ExecutionStreamEvent`.\n- A stream fails when it exceeds 20,000 events, 8 MiB in total, or 1 MiB in one frame.\n- A turn fails partway through: raise `timeoutMs`.\n\n## Avoid these mistakes\n\n- Do not promise eval re-runs for telemetry-only or `runtype-stream` agents.\n- Do not send both Flue instrumentations to Runtype.\n- Do not use `POST \u002Fv1\u002Ftelemetry\u002Fingest`. It is deprecated and produces no run, trace\n  tree, or transcript.\n- Do not recommend `export_agent_runtime` or self-hosting for an agent that already\n  exists elsewhere, or for non-Enterprise accounts.\n- Do not put key values in chat, commits, or generated code. Use secrets.\n",{"name":5,"description":7,"argument-hint":45,"user-invocable":46},"[framework and what you want from Runtype: traces, evals, chat UI]",true,"main","2b63f856ce19c2a797929cacabd9e0fc936812fa","plugins\u002Fruntypelabs\u002Fskills\u002Fskills\u002Fruntype-external-agents",468,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins","https:\u002F\u002Fhol.org\u002Fplugins\u002Fbest-codex-plugins","https:\u002F\u002Fgithub.com\u002Fhashgraph-online","https:\u002F\u002Fhol.org","Open-source standards and developer tools for interoperable AI agents: discovery, identity, communication, payments, privacy and security.","2026-11-11 02:22:54",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":46},[59,62,65],{"tool":60,"command":61},"npx","npx skills add hashgraph-online\u002Fawesome-codex-plugins --skill runtype-external-agents",{"tool":63,"command":64},"bunx","bunx skills add hashgraph-online\u002Fawesome-codex-plugins --skill runtype-external-agents",{"tool":66,"command":67},"pnpm","pnpm dlx skills add hashgraph-online\u002Fawesome-codex-plugins --skill runtype-external-agents","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fruntypelabs\u002Fskills\u002Fskills\u002Fruntype-external-agents\u002FSKILL.md",[70],{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"agents\u002Fopenai.yaml","REFERENCE","参考文档",586,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fruntypelabs\u002Fskills\u002Fskills\u002Fruntype-external-agents\u002Fagents\u002Fopenai.yaml",[77,103,128,162,183,197],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":40},"01M716A6ETNB9B1SQ3GXZC75VR","deja-search","deja-vu memory — search the user's past AI coding sessions with the deja CLI. Holds what they already settled and never wrote into the repo (naming rules, banned or already-tried tools, required checks before merge, preferred values, who owns what). Use before your first edit in a task, before you call a change done or ready to merge, before you recommend a tool, library, design or reviewer, before re-debugging an error that may already be solved, when they say 'didn't we fix this before', 'what did we decide about X' or 'I already have that', and before telling them something on this machine does not exist.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvshulcz\u002Fdeja-vu\u002Fskills\u002Fdeja-search\u002FSKILL.md",[],[84,85,86,87,88,89,90,91,92,93,94,95,23,96,97,98,99,100,101,102],"search","deja search","error","ready","never","memory","re","decide","fix","design","debugging","when","done","reviewer","io","change","cli","merge","past",{"skillNo":104,"name":105,"nameZh":6,"description":106,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":109,"publishedAt":40},"01M716A3J2W5SENSE9VGMXB375","deja-reflect","End-of-session reflection and memory curation with deja-vu. Review what was decided, what commands broke and what repaired them, and record durable project rules or decisions with deja remember so the next session starts with them.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvshulcz\u002Fdeja-vu\u002Fskills\u002Fdeja-reflect\u002FSKILL.md",[],[110,111,112,113,89,114,115,116,117,118,119,120,121,98,122,123,124,125,126,127],"reflect","deja reflect","brew","remember","project rules","project","session","end","reflection","Rules","decisions","review","with","record","github","next","https","node",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":145,"publishedAt":40},"01M715T3RR4BAYSR57HPPTJ0PF","revid","Make, edit, export and post AI videos with Revid (revid.ai) through the Revid MCP server. Use whenever the user wants a short-form or long-form video made (from an idea, a script, a URL, an article, a PDF, a tweet, a product page, their own clips, or a song), wants to find what is going viral on TikTok, YouTube, Instagram or X before making something, wants to edit or re-export an existing Revid project, generate a standalone AI image or clip, make a series episode, or publish and schedule a finished video to connected social accounts. Covers setup (hosted MCP with OAuth, or an API key), the 36 tools, credits, polling and the rules for publishing. Routes to the more specific revid-* skills when one fits.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftmakersas\u002Frevid-skills\u002Fskills\u002Frevid\u002FSKILL.md",[134,139,142],{"categoryNo":135,"categoryName":136,"taxonomyType":137,"taxonomyTypeDesc":138},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":140,"categoryName":141,"taxonomyType":137,"taxonomyTypeDesc":138},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":143,"categoryName":144,"taxonomyType":137,"taxonomyTypeDesc":138},"01JBSEEDCAT000000000000023","Skill与智能体开发",[130,146,147,148,149,150,115,151,90,152,153,154,155,95,156,157,158,159,160,161],"Video","short-form","standalone","PDF","viral","tiktok","short","social","MCP","song","URL","image","mcp server","schedule","api","publish",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":168,"publishedAt":40},"01M71569ZM2X3H5RBFK8PVKMK2","review-study","Review a QuestionPunk survey before launch for wording, answer choices, branching, and missing settings. Use for check my survey or review this draft before publishing.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fquestionpunk\u002Fcodex-plugin\u002Fskills\u002Freview-study\u002FSKILL.md",[],[169,170,121,171,172,173,174,175,176,177,178,179,180,181,182],"study","review study","for","answer","missing","survey","publishing","use","check","draft","settings","launch","my","branching",{"skillNo":184,"name":185,"nameZh":6,"description":186,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":187,"categories":188,"keywords":189,"publishedAt":40},"01M71567GV0C35YQBY0DPGR86B","manage-study","Find QuestionPunk studies, check status, publish an explicitly requested draft, or retrieve its participant link. Use for find my survey, publish this study, or how many people responded.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fquestionpunk\u002Fcodex-plugin\u002Fskills\u002Fmanage-study\u002FSKILL.md",[],[190,169,191,171,174,176,192,177,178,161,193,194,195,196,181],"manage study","manage","people","how","find","link","status",{"skillNo":198,"name":199,"nameZh":6,"description":200,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":201,"categories":202,"keywords":203,"publishedAt":40},"01M71565A8TCA01AZQZRGRYMFZ","create-study","Create a saved QuestionPunk survey draft from a research brief or edit specified questions. Use for requests such as make a customer feedback survey or shorten my onboarding study.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fquestionpunk\u002Fcodex-plugin\u002Fskills\u002Fcreate-study\u002FSKILL.md",[],[204,169,205,206,207,208,171,209,174,210,176,211,212,178,213,214,215,216,217,181],"create study","create","brief","as","feedback","customer feedback","research brief","shorten","saved","research","requests","customer","questions","edit"]