Observed since 20 Oct, 23:32 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
agent-teams
<!-- ~ Copyright (c) 2025-2026 Datalayer, Inc. ~ ~ BSD 3-Clause License --> [](https://datalayer.ai) [](https://github.com/sponsors/datalayer) # 🤖 👥 Agent Teams [](https://pypi.org/project/agent-teams) [](https://www.npmjs.com/package/@datalayer/agent-teams) ## The demo team `datalayer agent-teams demo` deploys the landing's demo team on Datalayer, under your own account: t
datalayer agent-teams demo deploys the landing's demo team on Datalayer,
under your own account: the members of the agentspecs team
sales-and-accounting that run in the cloud (Accounting) each get a runtime
of yours, serving their application over A2A, open to visitors.
pip install "agent-teams[demo]"
datalayer agent-teams demo deploy --dry-run # what it would launch, and cost
datalayer agent-teams demo deploy # prints demoTeam.accountingA2AUrl for the landing
datalayer agent-teams demo status
datalayer agent-teams demo url
datalayer agent-teams demo stop
With DATALAYER_MAGIC_API_KEY set (the platform's magic key, a secret), the
runtime is launched unmetered: no credits, and it never expires; --dry-run
says unmetered: yes and status shows never for the time left. See the
CLI reference.
agent_teams.a2a (Python) and @datalayer/agent-teams (TypeScript)
implement the Datalayer orchestration
extension — an optional
A2A extension that lets a worker and an orchestrator say the things about
delegated work that A2A leaves unsaid: which execution a delegation is
part of and where it sits in its tree, a budget to decline before
exceeding, a checkpoint to resume from, and instructions delivered to a
turn already in progress.
from agent_teams.a2a import ExecutionRef, build_delegation_meta
meta = build_delegation_meta(
ExecutionRef(execution_id="exec_1", root_execution_id="exec_1", depth=0),
budget={"outputTokens": 4000},
)
import { buildDelegationMeta } from '@datalayer/agent-teams';
const meta = buildDelegationMeta(
{ executionId: 'exec_1', rootExecutionId: 'exec_1', depth: 0 },
{ budget: { outputTokens: 4000 } },
);
Nothing here requires the rest of this package, and nothing here imports
Datalayer's own platform — agent_teams.a2a.orchestration_extension and
@datalayer/agent-teams's src/orchestrationExtension.ts are each a
standalone module (Python built on fasta2a alone; TypeScript with zero
runtime dependencies at all) implementing the identical wire shape, field
for field. A worker implementing none of it still runs; see the normative
specification and its JSON Schema at
docs/extension-v1.md
for the full field-by-field contract both modules implement.
This is distinct from agent_teams.a2a.extensions' own
team-coordination extension (https://datalayer.io/ext/team-coordination/v1)
— member assignment, task dependencies, health and reactions for a team's
own internal coordination. The two extensions are independent and
separately negotiated; a card may advertise either, both, or neither.
agent_teams.a2a.reference_worker is the smallest thing that speaks the
extension correctly: no model, no framework beyond fasta2a, no Datalayer
control plane. Run it standalone —
python -m agent_teams.a2a.reference_worker # serves on :8000
— point any A2A client at it, and its card advertises the extension. It
answers a turn with what it "spent" (a character count, not a model call,
so this needs no API key), declines a delegation whose budget already
reads outputTokens: 0 naming the limit, and answers a pause request by
ending the turn at a checkpoint it makes up on the spot.
tests/test_reference_worker_conformance.py drives it over real ASGI HTTP
(httpx.ASGITransport, no socket) with hand-built JSON-RPC requests
matching docs/extension-v1.md's documented wire shapes — negotiation, a
declined budget, pause and resume — runnable by anyone against their own
worker, with no Datalayer service in the loop.
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
fastapiEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | fastapi>=0.100 | runtime |
httpxEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | httpx>=0.24 | runtime |
pydanticEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pydantic>=2.0 | runtime |
typerEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | typer>=0.9 | runtime |
uvicornEnvironment{
"extras": "standard",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | uvicorn[standard]>=0.20 | runtime |
fasta2aEnvironment{
"extras": "",
"marker": "extra == \"a2a\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | fasta2a<2.1,>=2.0.0; extra == "a2a" | runtime |
datalayer-coreEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | datalayer-core>=1.2.12; extra == "all" | runtime |
fasta2aEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | fasta2a<2.1,>=2.0.0; extra == "all" | runtime |
mcpEnvironment{
"extras": "cli",
"marker": "extra == \"all\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | mcp[cli]>=1.0; extra == "all" | runtime |
pydantic-ai-slimEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pydantic-ai-slim>=1.94.0; extra == "all" | runtime |
pydantic-graphEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pydantic-graph>=1.94.0; extra == "all" | runtime |
datalayer-coreEnvironment{
"extras": "",
"marker": "extra == \"datalayer\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | datalayer-core>=1.2.12; extra == "datalayer" | runtime |
agent-runtimesEnvironment{
"extras": "",
"marker": "extra == \"demo\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | agent-runtimes>=1.3.71; extra == "demo" | runtime |
agentspecsEnvironment{
"extras": "",
"marker": "extra == \"demo\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | agentspecs>=0.0.37; extra == "demo" | runtime |
datalayer-coreEnvironment{
"extras": "",
"marker": "extra == \"demo\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | datalayer-core>=1.2.12; extra == "demo" | runtime |
mdformat-gfmEnvironment{
"extras": "",
"marker": "extra == \"lint\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | mdformat-gfm>=0.3.5; extra == "lint" | runtime |
mdformatEnvironment{
"extras": "",
"marker": "extra == \"lint\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | mdformat>0.7; extra == "lint" | runtime |
ruffEnvironment{
"extras": "",
"marker": "extra == \"lint\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | ruff; extra == "lint" | runtime |
mcpEnvironment{
"extras": "cli",
"marker": "extra == \"mcp\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | mcp[cli]>=1.0; extra == "mcp" | runtime |
pydantic-ai-slimEnvironment{
"extras": "",
"marker": "extra == \"pydantic-ai\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pydantic-ai-slim>=1.94.0; extra == "pydantic-ai" | runtime |
pydantic-graphEnvironment{
"extras": "",
"marker": "extra == \"pydantic-ai\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pydantic-graph>=1.94.0; extra == "pydantic-ai" | runtime |
a2a-sdkEnvironment{
"extras": "all",
"marker": "extra == \"test\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | a2a-sdk[all]==0.3.26; extra == "test" | runtime |
anyioEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | anyio; extra == "test" | runtime |
fasta2aEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | fasta2a<2.1,>=2.0.0; extra == "test" | runtime |
httpx2Environment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | httpx2; extra == "test" | runtime |
httpxEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | httpx>=0.24; extra == "test" | runtime |
pytest-asyncioEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest-asyncio>=0.21; extra == "test" | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"test\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest>=7.0; extra == "test" | runtime |
mypyEnvironment{
"extras": "",
"marker": "extra == \"typing\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | mypy>=0.990; extra == "typing" | runtime |
bdist_wheel · 92.29 KB · Python py3
sdist · 751.01 KB · Python source
Observed since 20 Oct, 23:32 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:1b4727feadc8138f631a235fd22492b86faeb785c372c5f2e3100675e69a2d20