Skip to main content

agentops-rpc

Shared Pydantic wire types for the AgentOps SDK and controlplane.

Both the SDK (komodor-agentops) and the controlplane import models from this package, giving build-time (mypy) and runtime (Pydantic v2) type safety across the wire boundary.

Install

pip install agentops-rpc

Quick Start

from agentops_rpc import RunEventIn, IngestRunEventsRequest, HOOK_EVENT_TYPE_MAP

event = RunEventIn(
    event_type="span.started",
    span_id="span_abc",
    kind="tool",
    name="Bash",
    hook_event_type="tool.start",
)
event.model_dump()  # JSON-safe dict

request = IngestRunEventsRequest(worker_id="wrk_1", events=[event])

Exported Models

types.py -- Literal type aliases

Type Values
EventType run.started, run.completed, run.failed, span.started, span.ended, message.created, log.created, token.created, custom.created, output.updated
RunStatus queued, claimed, running, succeeded, failed
SpanKind agent, llm, tool, chain, generation
HookEventName SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, PostToolUseFailure, SubagentStart, SubagentStop, Notification, Stop, SessionEnd, PermissionRequest, PreCompact, PostCompact
HookEventType session.start, prompt.submit, tool.start, tool.end, tool.error, subagent.start, subagent.end, notification, session.stop, compaction.start, compaction.end
AgentStatus online, offline
RunTransport polling, api_sync, api_sse, a2a

events.py -- Event ingest models

  • RunEventIn -- unified event sent SDK -> controlplane
  • TraceEventIn, LogEventIn -- structured events for DB tables
  • IngestRunEventsRequest / IngestRunEventsResponse
  • BatchEventsRequest
  • TraceEventResponse, LogEventResponse, RunMessageResponse

runs.py -- Run lifecycle models

  • CreateRunRequest, RunSummary, RunDetail, RunJob
  • PollNextRunRequest, ClaimRunResponse
  • StartRunRequest, StartRunDirectRequest
  • CompleteRunRequest, FailRunRequest, UpdateRunOutputRequest
  • InvokeAgentRequest / InvokeAgentResponse
  • WorkerInvokeRequest / WorkerInvokeResponse

agents.py -- Agent registration models

  • AgentManifest, HeartbeatRequest, HeartbeatResponse
  • AgentInstanceResponse

hook_types.py -- Hook event mapping

  • HOOK_EVENT_TYPE_MAP -- maps Claude Code HookEventName to HookEventType

a2a.py -- A2A protocol wire types

  • A2AMessage, A2AMessagePart
  • A2AMessageRequest, A2ATaskResponse

Type Safety Guarantees

Layer Protection
Build-time (mypy) SDK and controlplane import the same Pydantic models -- field mismatches caught at type-check
Runtime (Pydantic) Every event validated at construction and at API boundary
Wire (JSON) model_dump() / model_validate() guarantee JSON matches schema
Hook events HookEventType literal -- typos fail both type-check and runtime

Adding a CP↔worker frame type

Four steps, none of them a Python edit. schemas/frames.schema.json is the hand-authored source of truth; Python, Go and TypeScript are all generated from it, and no language is privileged.

  1. Add the payload to $defs, and bind it in x-agentops-frames ("my_frame": "MyFramePayload"). Leave additionalProperties out rather than setting it true — the schema's own description explains why the two differ in generated Go.
  2. Declare how it travels in x-agentops-delivery — control (send now or fail now) or at-least-once (buffered, retried, may deliver twice, ordered per stream). There is no default and the generator refuses to run without one, because either default is wrong for half the types.
  3. Add a fixture under schemas/fixtures/ (and fixtures/invalid/ if the type has a constraint worth proving). A per-type coverage guard fails without one.
  4. Run make generate-frames. This writes the Python models and registry, the Go wire types, and the TypeScript bindings together — plus the MY_FRAME constant and the package's __all__, so from agentops_rpc.wire import MY_FRAME, MyFramePayload works with no further edit. make check-frames is the CI guard that the committed artifacts match the schema.

The one thing that does still cost a Python line is a payload with an inline sub-schema: the registry binds top-level payload schemas, so a shape nested inside one is invisible to the generator and each language names it differently. wire/__init__.py aliases it once (see Event as RunEvent). A payload built only from $defs and scalars needs nothing.

Everything after that is feature code: a Router.on(MY_FRAME) handler on the worker side, a caller on the control-plane side. See docs/reference/cp-worker-protocol.md for how frames reach a worker and how a reply is correlated.

Dependencies

Only pydantic>=2.0. Zero internal dependencies.

Metadata

Release files for agentops-rpc 0.4.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for agentops-rpc 0.4.3
File Size Uploaded
agentops_rpc-0.4.3.tar.gz 172.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for agentops-rpc 0.4.3
File Interpreter ABI Platform
agentops_rpc-0.4.3-py3-none-any.whl Python 3 none any Details

Total release size: 341.9 kB

Release files / agentops_rpc-0.4.3.tar.gz

Download URL agentops_rpc-0.4.3.tar.gz
Size 172.4 kB
Tags Source
SHA-256 checksum
How to use checksums
c0ae6b9df64855ec04340f860fb935fa4389218bff56a9b23f7ca08cfd604460
BLAKE2b-256 checksum
How to use checksums
0247645989ded73105a6cee13c6ebb32dee5b62211a3362293b78f27ef893f6f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / agentops_rpc-0.4.3-py3-none-any.whl

Download URL agentops_rpc-0.4.3-py3-none-any.whl
Size 169.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c725332bec1b83043a616f850ada345366243ad6690b7b667b51867304ae48a6
BLAKE2b-256 checksum
How to use checksums
19013f0a7ead1708624f59241adcc84cfbbc8cb86796c6cfd9eccf167efbb906
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.4.3 This release

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.30

2 release files

0.3.29

2 release files

0.3.28

2 release files

0.3.27

2 release files

0.3.26

2 release files

0.3.25

2 release files

0.3.24

2 release files

0.3.23

2 release files

0.3.22

2 release files

0.3.21

2 release files

0.3.20

2 release files

0.3.19

2 release files

0.3.18

2 release files

0.3.12

2 release files

0.3.11

2 release files

0.3.10

2 release files

0.3.9

2 release files

0.3.8

2 release files

0.3.7

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page