Files
coder/docs/ai-coder/agents/licensing-usage.md
T
Nick Vigilante b146e6f262 docs: align Coder Agents docs with GA framing and licensing terms (#28571)
Removes early-access-program framing from the Coder Agents docs, drops a
stale `early access` manifest tag, and standardizes the licensing
wording on "Premium license with the Agent Hours entitlement".

- `docs/ai-coder/agents/getting-started.md`: replaces the "collaborative
evaluation between your team and Coder" and customer-specific Slack
channel feedback path with GitHub issues plus normal Coder support
channels, and rewrites the remaining evaluation-period wording to GA
tone. Rollout guidance (pilot group, cost planning, concurrency) is
kept.
- `docs/manifest.json`: removes `"state": ["early access"]` from
`ai-coder/agents/platform-controls/chat-debug-logging.md`, which is not
experiment-gated.
- Licensing terminology aligned across `getting-started.md`,
`licensing-usage.md`, and `platform-controls/index.md`.

No changes to `docs/reference/api/**` and no API path changes.

<details><summary>Analysis evidence</summary>

**Manifest state tag decisions (all `ai-coder/agents` pages)**

| Page | Tag before | Tag after | Why |
|------|-----------|-----------|-----|
| `platform-controls/chat-debug-logging.md` | `["early access"]` | none
| Routes at `coderd/coderd.go` (`GET`/`PUT /debug-logging`, `GET`/`PUT
/user-debug-logging`) sit outside any `RequireExperimentWithDevBypass`
group, there is no matching experiment in the `codersdk.Experiment`
list, and the page body already states the feature is not
experiment-gated. |
| `platform-controls/advisor.md` | `["early access"]` | unchanged |
Gated by `codersdk.ExperimentChatAdvisor` (`chat-advisor`); routes
wrapped in `RequireExperimentWithDevBypass`. |
| `platform-controls/virtual-desktop.md` | `["early access"]` |
unchanged | Gated by `codersdk.ExperimentChatVirtualDesktop`
(`chat-virtual-desktop`); routes wrapped in
`RequireExperimentWithDevBypass`. |
| `platform-controls/spend-management.md` | `["premium"]` | unchanged |
`premium` is a licensing tag, not a maturity tag, and the page states
budget endpoints require a license that includes AI Gateway. Flagging
for awareness rather than changing it. |
| All other `ai-coder/agents` pages | none | none | No maturity tags to
review. |

**Licensing mechanics**

`enterprise/coderd/license/license.go` decodes
`agent_runtime_hours_allocation`, `agent_runtime_hours_limit_soft`, and
`agent_runtime_hours_limit_hard` into
`codersdk.FeatureAgentRuntimeHours` on Premium licenses.
`enterprise/coderd/x/chatd/agentadmission.go` lifts the concurrency cap
only when that feature is enabled and usage is below the hard limit. So
the entitlement, not the license tier alone, is what removes the cap.
Wording is now "Premium license with the Agent Hours entitlement".

`licensing-usage.md` keeps "Agent Time" as the name of the measured
usage metric (matching `runtime_ms` reporting) and now says explicitly
that Agent Time draws down the Agent Hours entitlement. Renaming the
metric itself was left out of scope; flagging in case the product team
wants one name for both.

**Validation**

`pnpm install --frozen-lockfile`, `pnpm run format-docs` (no table
changes), `pnpm run lint-docs` (499 files, 0 errors).

</details>

Linear: DOCS-718 https://linear.app/codercom/issue/DOCS-718

Generated by Coder Agents on behalf of @nickvigilante.
2026-08-25 13:10:03 -04:00

5.4 KiB

title
title
Licensing & Usage

Coder Agents licensing controls concurrent agent activity and Agent Time usage across your deployment.

Community licenses

Community licenses support up to five concurrently active agents deployment-wide. Coder doesn't limit how long those agents can run or how many tasks they complete over time. Agents queue when more than five agents are active at a time. With this agent pool, individuals and small teams can experiment with Coder Agents at no cost.

Premium licenses and Agent Hours

A Premium license includes a preset amount of Agent Time. Agent Time is shared across the deployment, allowing unlimited agents to run concurrently while consuming from a shared pool of purchased working hours. This usage-based model supports enterprise workloads where large development teams, background automation, and API-triggered tasks can create variable bursts of agent activity.

Agent Time measurement

Agent Time is the cumulative duration of model invocations that produce Coder Agents chat messages. Coder measures each invocation from immediately before the request to the model provider opens until the response stream is fully consumed.

Agent Time includes:

  • Assistant generation steps in top-level and subagent chats.
  • Context compaction (summarization) model calls.
  • Model-provider tool execution within a model response.
  • The time streamed or spent executing tools before an interrupt, kept on the partial assistant messages.

Agent Time excludes:

  • Time spent composing or reviewing messages.
  • Time between conversation turns while an agent waits for user input.
  • Time a parent agent spends waiting for a subagent, because the subagent records its own model invocations.
  • Model calls that don't produce chat messages, such as title generation.
  • Failed or retried model calls, which persist no content and record no runtime.
  • Client-executed tools and chats handed off to external coding agents, since that work happens outside the server.

Coder records Agent Time in milliseconds and sums it across all Coder Agents chats in the deployment.

Concurrency and usage limits

Coder handles concurrency and usage limits differently depending on the license you use.

Community concurrency limit

When a Community license deployment reaches its limit of five concurrently active agents, Coder places additional agents in a queue. When an active agent completes its task, the next queued agent begins its work.

Agent Hours exhaustion

Coder sends deployment administrators an in-app soft warning as the deployment approaches its maximum allotted Agent Time, so they can purchase additional Agent Time before the concurrency fallback takes effect.

Agent Time usage reporting

Coder reports Agent Time usage to Tallyman, a Coder-managed server used for billing and reporting. Coder sends the total Coder Agents runtime consumed per UTC hour, in milliseconds, with your deployment ID. Coder doesn't send user-identifiable information or additional chat data to Tallyman. Coder also shares the reported usage with Metronome, a Stripe product and Coder partner for usage-based billing and reporting.

Your Coder deployment must be able to make outbound HTTPS requests to https://tallyman-prod.coder.com to report usage. Coder generates one hb_agent_runtime_v1 event for each UTC hour shortly after the hour ends, then checks for unpublished events approximately every 17 minutes. In steady state, each hour's usage typically reaches Tallyman within about 25 minutes of the hour closing. You can monitor these requests in coderd logs.

A successful request produces a debug log similar to the following example when you enable debug logging with CODER_LOG_FILTER=.*:

[debu] published usage events to tallyman accepted=1 rejected=0

Coder sends the license JWT and deployment ID as request headers. The request body contains one hb_agent_runtime_v1 event for each UTC hour. The runtime_ms value is the total Agent Time recorded during that hour. Idle hours have a value of 0. If the deployment was offline, Coder backfills missed hours for up to seven days, batching up to 100 events per request. Hours missing beyond seven days aren't reported.

The following example reports 1 hour of Agent Time:

POST /api/v1/events/ingest HTTP/1.1
Host: tallyman-prod.coder.com
Content-Type: application/json
Coder-License-Key: <license-jwt>
Coder-Deployment-ID: 8a4e92f1-3b7c-4d5e-9f12-abc123def456

{
  "events": [
    {
      "id": "hb_agent_runtime_v1:2026-08-18_14:00:00",
      "event_type": "hb_agent_runtime_v1",
      "event_data": {
        "runtime_ms": 3600000
      },
      "created_at": "2026-08-18T14:00:00Z"
    }
  ]
}

The event ID contains the start of the UTC hour. The created_at value also identifies the start of that hour, rather than the time when Coder sends the request. Coder sends raw milliseconds without rounding or converting the value to hours.

A failed request produces a warning similar to the following example:

[warn] failed to send publish request to tallyman count=1 error="Post \"https://tallyman-prod.coder.com/api/v1/events/ingest\": dial tcp: lookup tallyman-prod.coder.com: no such host"

Note

Air-gapped deployments and deployments with legal restrictions around usage reporting can contact us to discuss alternative methods.