The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the DIEM Agent Workers listing page.
Privacy-first, machine-discoverable micro-work powered by private Venice inference and paid in USDC through x402.
This repository is a fail-closed, agent-first Base mainnet storefront. It exposes six bounded workers over plain HTTP + x402, publishes them to the CDP Bazaar, and adds A2A 1.0, MCP, OpenAPI, llms.txt, and portable-skill discovery surfaces.
Public beta: diem-agent-workers.vercel.app
| Worker | Bounded outcome | Beta price |
|---|---|---|
extract_text_to_json | Caller-schema-valid extraction | $0.020 USDC |
classify_text | Exactly one caller-supplied label | $0.010 USDC |
summarize_text | Structured abstract and key points | $0.020 USDC |
text_to_speech | Up to 1,000 characters as MP3 | $0.010 USDC |
generate_draft_image | One safe-mode 1024px WebP | $0.020 USDC |
transcribe_audio | Up to 60 seconds of verified PCM WAV | $0.015 USDC |
These are fixed prices per successful authorization attempt, not estimates. The public deployment is a low-cap Base mainnet beta: an atomic 0.25 DIEM software budget limits daily inference starts, while the Venice API key retains a separate 1.69 DIEM provider backstop.
The optional USDC-to-DIEM treasury remains disabled in production and is not part of the storefront runtime. No wallet signer or private key is deployed to Vercel.
llms.txt, A2A 1.0 Agent Card, JSON-RPC SendMessage, and Streamable HTTP MCP discoveryThe service is not affiliated with or endorsed by Venice.ai.
Requirements: Node.js 22+ and pnpm.
Add a server-side Venice key to .env:
VENICE_DIEM_EPOCH_CAP publishes the cap in service discovery and must match the native EPOCH consumption limit configured on the Venice API key. Venice enforces the hard stop. Before issuing a 402, the service also checks current epoch access and the exact configured model's online/private/capability state; it never estimates DIEM billing from token counts.
The development server binds to 127.0.0.1:8402.
With PAYMENTS_MODE=off, the worker is callable without payment for local testing:
Production refuses to start unless PAYMENTS_MODE=production, durable delivery credits are enforced, the global compute budget is enforced, and aggregate-only metrics are enabled. The checked-in and local defaults remain PAYMENTS_MODE=off, STOREFRONT_ENABLED=false, AGGREGATE_METRICS_MODE=off, and TREASURY_MODE=disabled.
Import a downloaded CDP Secret API Key without printing its values:
The command tightens both the downloaded key file and .env to owner-only permissions. It refuses to overwrite configured credentials and does not enable payments.
Start on Base Sepolia:
The server uses the address form of the CDP configuration, so payments settle directly to TREASURY_ADDRESS; CDP does not provision or control that wallet. An unpaid request to the worker should return HTTP 402 and a PAYMENT-REQUIRED header.
Mainnet is fail-closed unless durable delivery credits are enforced. Provision an Upstash Redis database through the Vercel Marketplace, then configure:
Agents should generate one unpredictable Idempotency-Key per logical job and
reuse it only with the identical request and payment authorization. Signed paid
attempts without the header fail before settlement. The Redis record contains
only HMAC fingerprints, worker ID, state, lease, and expiry—never request bodies,
provider responses, payer addresses, payment headers, or transaction hashes.
Normal successful delivery consumes the key. If the process is interrupted after
settlement but before delivery completes, the same authorization, key, worker, and
request may redeem one retry without another settlement. Conflicting reuse is
rejected, and storage outages return 503 before settlement.
Production also requires an atomic global compute budget:
The service reserves a conservative amount equal to the job's USDC price after x402 verification but before Venice inference. Delivery retries reserve again because they can consume provider capacity even when the buyer is not charged again. A Redis outage or exhausted budget aborts new payment settlement and blocks inference. Set STOREFRONT_ENABLED=false and redeploy to disable all paid work before payment.
Run the guarded local Base Sepolia settlement test with:
This is an actual testnet transaction: it creates an ephemeral in-memory buyer,
requests faucet USDC, validates the exact quote before signing, pays one worker
call, and reconciles the treasury's test-USDC increase. It refuses to run unless
the saved PAYMENTS_MODE is off and TREASURY_MODE is disabled. Local HTTP
tests are not published to Bazaar; a public HTTPS deployment is required.
Mainnet launch checklist:
/terms.PAYMENTS_MODE=production, keep TREASURY_MODE=disabled, and deploy.The mainnet acceptance harness uses a distinct cents-only buyer kept in macOS Keychain, verifies every payment requirement before signing, and refuses a combined storefront authorization above $0.095 USDC. Select individual workers with MAINNET_X402_TEST_WORKERS or use pnpm test:mainnet:all; multi-worker runs require the exact acknowledgement PAY_UP_TO_0_095_USDC_WITH_DISTINCT_BUYER_ON_BASE. Its output deliberately omits wallet addresses, transaction hashes, request bodies, and provider responses.
The treasury is a deterministic one-shot runner, not a prompt-driven wallet agent.
Create a new dedicated wallet on macOS with:
The command stores the private key in macOS Keychain and writes only the public address and Keychain labels to .env. It refuses to replace an existing wallet and requires payments and treasury execution to be disabled.
For seed-phrase recovery, create a dedicated wallet in a trusted wallet app, keep its seed phrase offline, export only its treasury account private key, and import that key through a hidden local prompt:
Never enter the seed phrase into the project. The import command displays the derived public address for confirmation, stores the account key in macOS Keychain, and replaces the previous disabled treasury configuration only after Keychain readback succeeds.
Verify ownership and read Base balances without revealing the key:
See docs/WALLET_ACCESS.md for the macOS-authenticated recovery and wallet-import path. Never send a private key through chat; if you already control a wallet, share only its public 0x address.
Quote-only mode reads balances and requests an indicative 0x price, but never signs:
Live mode additionally requires the matching dedicated key from macOS Keychain (or a production secret manager) and an exact acknowledgement:
Use a production secret manager rather than a plaintext .env when deployed. The live runner:
TREASURY_ADDRESS0600 JSONL audit records under data/The runner does not sell DIEM, withdraw USDC, bridge assets, select arbitrary tokens, or stake DIEM.
GET /v1/catalog — capabilities, schemas, constraints, priceGET /v1/stats — lifetime aggregate reliability and settlement counters with no caller identities or time seriesGET /.well-known/agent-catalog.json — crawler-friendly catalog aliasGET /openapi.json — OpenAPI 3.1 contractGET /llms.txt — concise agent-readable indexGET /.well-known/agent-card.json — A2A 1.0 Agent CardPOST /a2a — A2A 1.0 JSON-RPC SendMessage adapter at a fixed $0.020 USDC pricePOST /mcp — stateless Streamable HTTP MCP server with free catalog, quote, and call-preparation toolsskills/extract-text-to-json/ — portable agent skillGET /icon.svg — stable service icon used by x402 Bazaar metadataThe MCP adapter intentionally does not accept wallet keys. Agents execute prepared calls with their own x402-capable client or use Coinbase's Bazaar MCP server, which can discover indexed x402 resources.
The remote MCP server is described by server.json under the io.github.coastmancoastman/diem-agent-workers namespace for publication to the official MCP Registry.
Production emits one-line JSON events to the server runtime log. The schema is an explicit allowlist: route category, HTTP status, latency, worker, coarse error class, model, exact settled price, and estimated DIEM cost/margin. Cost estimates use Venice's public model-pricing catalog and do not query account balances or billing history.
Telemetry never includes prompts, outputs, prompt length, token counts, raw URLs, request IDs, IP addresses, user agents, headers, payer identities, transaction hashes, provider request IDs, or credentials. Telemetry failure never blocks a worker response.
Create a local aggregate report from a saved JSONL file:
Or report recent production logs from the linked Vercel project:
The report contains request and payment counts, settled USDC revenue, estimated DIEM cost and gross margin, latency percentiles, and coarse failure counts. It cannot reconstruct individual customer content or identity.
Because serverless runtime logs are not a durable business ledger, production also writes atomic lifetime aggregate counters to the same Upstash database used for safety state. GET /v1/stats publishes completed/failed runs, coarse failure classes, fixed latency buckets, settlements, revenue, and DIEM estimates by worker. The counter key contains no dates or timestamps, and the write API accepts no free-form customer or request fields.
Use of the service is governed by TERMS.md, also published at /terms. Read SECURITY.md and docs/END_USER_TERMS_CHECKLIST.md before accepting third-party work. AI output matching a schema is not proof that its contents are correct. Do not use this worker for high-stakes decisions.
The current production acceptance evidence, including all six Base Sepolia settlement transactions, is recorded in docs/BASE_SEPOLIA_ACCEPTANCE.md.
The live evaluation is opt-in because it consumes Venice capacity. It prints aggregate accuracy and latency only; it does not persist prompts or provider responses.