Catalog PyPI
Back to packageRELEASE DETAILS

1.1.3

PyPI

agent-teams

<!-- ~ Copyright (c) 2025-2026 Datalayer, Inc. ~ ~ BSD 3-Clause License --> [![Datalayer](https://images.datalayer.io/legacy/datalayer-25.svg)](https://datalayer.ai) [![Become a Sponsor](https://img.shields.io/static/v1?label=Become%20a%20Sponsor&message=%E2%9D%A4&logo=GitHub&style=flat&color=1ABC9C)](https://github.com/sponsors/datalayer) # 🤖 👥 Agent Teams [![PyPI - Version](https://img.shields.io/pypi/v/agent-teams)](https://pypi.org/project/agent-teams) [![npm](https://img.shields.io/npm/v/%40datalayer%2Fagent-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

a2aagentsaijupyterorchestrationteams
Published5 Oct 2026
Direct dependencies21
Transitive dependenciesNot calculated

README

Version 1.1.3 documentation

Datalayer

Become a Sponsor

🤖 👥 Agent Teams

PyPI - Version npm

The demo team

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.

The Datalayer orchestration extension

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.

A reference worker, and a public conformance suite

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.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 29

Native requirements
21 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
fastapi
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
fastapi>=0.100runtime
httpx
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
httpx>=0.24runtime
pydantic
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pydantic>=2.0runtime
typer
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
typer>=0.9runtime
uvicorn
Environment
{
  "extras": "standard",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
uvicorn[standard]>=0.20runtime
fasta2a
Environment
{
  "extras": "",
  "marker": "extra == \"a2a\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
fasta2a<2.1,>=2.0.0; extra == "a2a"runtime
datalayer-core
Environment
{
  "extras": "",
  "marker": "extra == \"all\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
datalayer-core>=1.2.12; extra == "all"runtime
fasta2a
Environment
{
  "extras": "",
  "marker": "extra == \"all\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
fasta2a<2.1,>=2.0.0; extra == "all"runtime
mcp
Environment
{
  "extras": "cli",
  "marker": "extra == \"all\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
mcp[cli]>=1.0; extra == "all"runtime
pydantic-ai-slim
Environment
{
  "extras": "",
  "marker": "extra == \"all\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pydantic-ai-slim>=1.94.0; extra == "all"runtime
pydantic-graph
Environment
{
  "extras": "",
  "marker": "extra == \"all\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pydantic-graph>=1.94.0; extra == "all"runtime
datalayer-core
Environment
{
  "extras": "",
  "marker": "extra == \"datalayer\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
datalayer-core>=1.2.12; extra == "datalayer"runtime
agent-runtimes
Environment
{
  "extras": "",
  "marker": "extra == \"demo\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
agent-runtimes>=1.3.71; extra == "demo"runtime
agentspecs
Environment
{
  "extras": "",
  "marker": "extra == \"demo\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
agentspecs>=0.0.37; extra == "demo"runtime
datalayer-core
Environment
{
  "extras": "",
  "marker": "extra == \"demo\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
datalayer-core>=1.2.12; extra == "demo"runtime
mdformat-gfm
Environment
{
  "extras": "",
  "marker": "extra == \"lint\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
mdformat-gfm>=0.3.5; extra == "lint"runtime
mdformat
Environment
{
  "extras": "",
  "marker": "extra == \"lint\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
mdformat>0.7; extra == "lint"runtime
ruff
Environment
{
  "extras": "",
  "marker": "extra == \"lint\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
ruff; extra == "lint"runtime
mcp
Environment
{
  "extras": "cli",
  "marker": "extra == \"mcp\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
mcp[cli]>=1.0; extra == "mcp"runtime
pydantic-ai-slim
Environment
{
  "extras": "",
  "marker": "extra == \"pydantic-ai\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pydantic-ai-slim>=1.94.0; extra == "pydantic-ai"runtime
pydantic-graph
Environment
{
  "extras": "",
  "marker": "extra == \"pydantic-ai\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pydantic-graph>=1.94.0; extra == "pydantic-ai"runtime
a2a-sdk
Environment
{
  "extras": "all",
  "marker": "extra == \"test\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
a2a-sdk[all]==0.3.26; extra == "test"runtime
anyio
Environment
{
  "extras": "",
  "marker": "extra == \"test\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
anyio; extra == "test"runtime
fasta2a
Environment
{
  "extras": "",
  "marker": "extra == \"test\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
fasta2a<2.1,>=2.0.0; extra == "test"runtime
httpx2
Environment
{
  "extras": "",
  "marker": "extra == \"test\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
httpx2; extra == "test"runtime
httpx
Environment
{
  "extras": "",
  "marker": "extra == \"test\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
httpx>=0.24; extra == "test"runtime
pytest-asyncio
Environment
{
  "extras": "",
  "marker": "extra == \"test\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pytest-asyncio>=0.21; extra == "test"runtime
pytest
Environment
{
  "extras": "",
  "marker": "extra == \"test\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pytest>=7.0; extra == "test"runtime
mypy
Environment
{
  "extras": "",
  "marker": "extra == \"typing\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
mypy>=0.990; extra == "typing"runtime

Distribution files

2 collected
agent_teams-1.1.3-py3-none-any.whl

bdist_wheel · 92.29 KB · Python py3

Source file
agent_teams-1.1.3.tar.gz

sdist · 751.01 KB · Python source

Source file

Repository

PENDING
datalayer/agent-teams

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 23:32 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:1b4727feadc8138f631a235fd22492b86faeb785c372c5f2e3100675e69a2d20

Other collected versions

View all collected versions →