eca59cef9e
Two bugs in the peer call, both found in review. message_id was context_id + peer name, so every call in a conversation carried the same id. A2A wants one id per message; a peer treating the second call as a replay of the first would have looked like a stale answer rather than a bug. The peer's context_id was derived from hash(subject_token), which was wrong twice over. hash() on a str is salted per process, so a restart changed the key — the reported bug. And a fresh token is minted every turn, so the key changed every turn anyway, which is worse: the peer started a new thread on each call and lost anything it had parked, the opposite of what the key exists for. It is now the conversation id, which is what 'one conversation per peer' meant. Not changed: output_type=[str, DeferredToolRequests], also raised in review. OutputSpec is declared as , so a list is the API's own form and not a union written badly. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
43 lines
1.6 KiB
TOML
43 lines
1.6 KiB
TOML
[project]
|
|
name = "classic-models-agent-catalogue"
|
|
version = "0.3.1"
|
|
description = "Product management agent for the Classic Models catalog domain"
|
|
requires-python = ">=3.12"
|
|
|
|
# Pinned to what was current on 2026-08-28 and resolved together in one
|
|
# environment. Ranges rather than exact pins so patch-level security fixes are
|
|
# picked up, capped below the next major so an upgrade is a deliberate act.
|
|
dependencies = [
|
|
# The A2A facade. The official SDK rather than FastA2A: this estate exists
|
|
# to prove A2A interoperability across five runtimes, so the reference
|
|
# implementation is the safer base for the others to interoperate with.
|
|
"a2a-sdk[http-server]>=1.1.2,<2",
|
|
# Reasoning and tool calling. -slim keeps the dependency surface to the
|
|
# providers actually used; [openai] because the LLM endpoint speaks the
|
|
# OpenAI protocol, [mcp] for the MCP client.
|
|
"pydantic-ai-slim[openai,mcp]>=2.35.3,<3",
|
|
"httpx2>=2.12.0,<3",
|
|
# httpx 0.x as well, and not redundantly: fastmcp builds its own
|
|
# transport client and hands us an httpx.AsyncClient to configure.
|
|
"httpx>=0.28.1,<1",
|
|
"pydantic-settings>=2.7",
|
|
# pydantic_ai.retries ships in pydantic-ai-slim but imports tenacity,
|
|
# which the slim extras do not pull. Needed for the LLM gateway's 429s.
|
|
"tenacity>=9.1,<10",
|
|
"uvicorn>=0.52.4",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
dev = ["pytest>=8", "pytest-asyncio>=0.24", "pydantic-evals>=2.35.3,<3"]
|
|
|
|
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[tool.hatch.build.targets.wheel]
|
|
packages = ["src/catalogue_agent"]
|
|
|
|
[tool.pytest.ini_options]
|
|
asyncio_mode = "auto"
|
|
testpaths = ["tests"]
|