Skip to content

Commit 88da0f4

Browse files
committed
Add green agent template
1 parent 704f072 commit 88da0f4

File tree

4 files changed

+78
-32
lines changed

4 files changed

+78
-32
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# A2A Agent Template
22

3-
A minimal template for building [A2A (Agent-to-Agent)](https://a2a-protocol.org/latest/) agents.
3+
A minimal template for building [A2A (Agent-to-Agent)](https://a2a-protocol.org/latest/) green agents compatible with the [AgentBeats](https://agentbeats.dev) platform.
44

55
## Project Structure
66

pyproject.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
[project]
2-
name = "agent-template"
2+
name = "green-agent-template"
33
version = "0.1.0"
4-
description = "A template for A2A agents"
4+
description = "A template for A2A green agents"
55
readme = "README.md"
66
requires-python = ">=3.13"
77
dependencies = [
88
"a2a-sdk[http-server]>=0.3.20",
9+
"pydantic>=2.12.5",
910
"uvicorn>=0.38.0",
1011
]
1112

src/agent.py

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,41 @@
1+
from typing import Any
2+
from pydantic import BaseModel, HttpUrl, ValidationError
13
from a2a.server.tasks import TaskUpdater
2-
from a2a.types import Message, TaskState, Part, TextPart
4+
from a2a.types import Message, TaskState, Part, TextPart, DataPart
35
from a2a.utils import get_message_text, new_agent_text_message
46

57
from messenger import Messenger
68

79

10+
class EvalRequest(BaseModel):
11+
"""Request format sent by the AgentBeats platform to green agents."""
12+
participants: dict[str, HttpUrl] # role -> agent URL
13+
config: dict[str, Any]
14+
15+
816
class Agent:
17+
# Fill in: list of required participant roles, e.g. ["pro_debater", "con_debater"]
18+
required_roles: list[str] = []
19+
# Fill in: list of required config keys, e.g. ["topic", "num_rounds"]
20+
required_config_keys: list[str] = []
21+
922
def __init__(self):
1023
self.messenger = Messenger()
1124
# Initialize other state here
1225

26+
def validate_request(self, request: EvalRequest) -> tuple[bool, str]:
27+
missing_roles = set(self.required_roles) - set(request.participants.keys())
28+
if missing_roles:
29+
return False, f"Missing roles: {missing_roles}"
30+
31+
missing_config_keys = set(self.required_config_keys) - set(request.config.keys())
32+
if missing_config_keys:
33+
return False, f"Missing config keys: {missing_config_keys}"
34+
35+
# Add additional request validation here
36+
37+
return True, "ok"
38+
1339
async def run(self, message: Message, updater: TaskUpdater) -> None:
1440
"""Implement your agent logic here.
1541
@@ -21,12 +47,29 @@ async def run(self, message: Message, updater: TaskUpdater) -> None:
2147
"""
2248
input_text = get_message_text(message)
2349

24-
# Replace this example code with your agent logic
50+
try:
51+
request: EvalRequest = EvalRequest.model_validate_json(input_text)
52+
ok, msg = self.validate_request(request)
53+
if not ok:
54+
await updater.reject(new_agent_text_message(msg))
55+
return
56+
except ValidationError as e:
57+
await updater.reject(new_agent_text_message(f"Invalid request: {e}"))
58+
return
59+
60+
# Replace example code below with your agent logic
61+
# Use request.participants to get participant agent URLs by role
62+
# Use request.config for assessment parameters
2563

2664
await updater.update_status(
2765
TaskState.working, new_agent_text_message("Thinking...")
2866
)
2967
await updater.add_artifact(
30-
parts=[Part(root=TextPart(text=input_text))],
31-
name="Echo",
68+
parts=[
69+
Part(root=TextPart(text="The agent performed well.")),
70+
Part(root=DataPart(data={
71+
# structured assessment results
72+
}))
73+
],
74+
name="Result",
3275
)

uv.lock

Lines changed: 27 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)