Refresh reviewer runtime visibility
All checks were successful
build / build (push) Successful in 33s
All checks were successful
build / build (push) Successful in 33s
This commit is contained in:
4
a2a.yaml
4
a2a.yaml
@@ -1,6 +1,6 @@
|
|||||||
name: agent-reviewer
|
name: agent-reviewer
|
||||||
version: 0.1.0
|
version: 0.1.1
|
||||||
entrypoint: agent:AgentReviewer
|
entrypoint: agent:AgentReviewer
|
||||||
description: Pre-deploy audit of an A2A agent's source — security, scope, ergonomics.
|
description: Pre-deploy audit of an A2A agent's source — security, scope, ergonomics.
|
||||||
expose:
|
expose:
|
||||||
public: false
|
public: true
|
||||||
|
|||||||
9
agent.py
9
agent.py
@@ -30,7 +30,7 @@ class AgentReviewer(A2AAgent[ReviewerConfig, NoAuth]):
|
|||||||
"repo from Gitea, applies security / best-practice / grant-scope "
|
"repo from Gitea, applies security / best-practice / grant-scope "
|
||||||
"skill bundles, and returns a structured ReviewReport."
|
"skill bundles, and returns a structured ReviewReport."
|
||||||
)
|
)
|
||||||
version = "0.1.0"
|
version = "0.1.1"
|
||||||
|
|
||||||
config_model = ReviewerConfig
|
config_model = ReviewerConfig
|
||||||
auth_model = NoAuth
|
auth_model = NoAuth
|
||||||
@@ -115,6 +115,7 @@ class AgentReviewer(A2AAgent[ReviewerConfig, NoAuth]):
|
|||||||
llm_temperature_mode=creds.temperature_mode,
|
llm_temperature_mode=creds.temperature_mode,
|
||||||
llm_temperature=creds.temperature,
|
llm_temperature=creds.temperature,
|
||||||
llm_extra_body=creds.extra_body,
|
llm_extra_body=creds.extra_body,
|
||||||
|
llm_metadata=getattr(creds, "metadata", None),
|
||||||
),
|
),
|
||||||
completion_box=completion_box,
|
completion_box=completion_box,
|
||||||
)
|
)
|
||||||
@@ -134,6 +135,7 @@ class AgentReviewer(A2AAgent[ReviewerConfig, NoAuth]):
|
|||||||
heartbeat_task = asyncio.create_task(_heartbeat())
|
heartbeat_task = asyncio.create_task(_heartbeat())
|
||||||
last_reply = ""
|
last_reply = ""
|
||||||
try:
|
try:
|
||||||
|
await ctx.emit_progress(f"review graph starting for {gitea_owner}/{agent_name}@{ref}")
|
||||||
async for event in graph.astream_events(
|
async for event in graph.astream_events(
|
||||||
{"messages": [{"role": "user", "content": user_msg}]},
|
{"messages": [{"role": "user", "content": user_msg}]},
|
||||||
version="v2",
|
version="v2",
|
||||||
@@ -168,6 +170,7 @@ class AgentReviewer(A2AAgent[ReviewerConfig, NoAuth]):
|
|||||||
|
|
||||||
report = completion_box.get("report")
|
report = completion_box.get("report")
|
||||||
if report is None:
|
if report is None:
|
||||||
|
await ctx.emit_progress(f"review finished without structured report for {agent_name}@{ref}")
|
||||||
return {
|
return {
|
||||||
"ok": False,
|
"ok": False,
|
||||||
"agent_name": agent_name,
|
"agent_name": agent_name,
|
||||||
@@ -175,6 +178,10 @@ class AgentReviewer(A2AAgent[ReviewerConfig, NoAuth]):
|
|||||||
"warning": "reviewer finished without submitting a structured report",
|
"warning": "reviewer finished without submitting a structured report",
|
||||||
"reply": last_reply[:2000],
|
"reply": last_reply[:2000],
|
||||||
}
|
}
|
||||||
|
await ctx.emit_progress(
|
||||||
|
"review submitted "
|
||||||
|
f"ok={report.ok} findings={len(report.findings)} agent={agent_name}@{ref}"
|
||||||
|
)
|
||||||
return report.model_dump()
|
return report.model_dump()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ class ReviewerContext:
|
|||||||
llm_temperature_mode: str | None = None
|
llm_temperature_mode: str | None = None
|
||||||
llm_temperature: float | None = None
|
llm_temperature: float | None = None
|
||||||
llm_extra_body: dict[str, Any] | None = None
|
llm_extra_body: dict[str, Any] | None = None
|
||||||
|
llm_metadata: dict[str, Any] | None = None
|
||||||
|
|
||||||
|
|
||||||
SYSTEM_PROMPT = """\
|
SYSTEM_PROMPT = """\
|
||||||
@@ -139,6 +140,7 @@ def build_reviewer_graph(
|
|||||||
temperature_mode=ctx.llm_temperature_mode or "default",
|
temperature_mode=ctx.llm_temperature_mode or "default",
|
||||||
temperature=ctx.llm_temperature,
|
temperature=ctx.llm_temperature,
|
||||||
extra_body=dict(ctx.llm_extra_body or {}),
|
extra_body=dict(ctx.llm_extra_body or {}),
|
||||||
|
metadata=dict(ctx.llm_metadata or {}),
|
||||||
)
|
)
|
||||||
|
|
||||||
return create_a2a_deep_agent(
|
return create_a2a_deep_agent(
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
a2a-pack>=0.1.75
|
a2a-pack>=0.1.82
|
||||||
httpx>=0.27
|
httpx>=0.27
|
||||||
deepagents>=0.5.0
|
deepagents>=0.5.0
|
||||||
langchain>=0.3
|
langchain>=0.3
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ from agent_reviewer.config import load_settings # noqa: E402
|
|||||||
|
|
||||||
def test_class_metadata() -> None:
|
def test_class_metadata() -> None:
|
||||||
assert AgentReviewer.name == "agent-reviewer"
|
assert AgentReviewer.name == "agent-reviewer"
|
||||||
assert AgentReviewer.version
|
assert AgentReviewer.version == "0.1.1"
|
||||||
assert AgentReviewer.wants_cp_jwt is True
|
assert AgentReviewer.wants_cp_jwt is True
|
||||||
|
|
||||||
|
|
||||||
@@ -102,6 +102,7 @@ def test_reviewer_graph_uses_forwarded_llm_credentials(
|
|||||||
llm_model="platform-model",
|
llm_model="platform-model",
|
||||||
llm_temperature_mode="omit",
|
llm_temperature_mode="omit",
|
||||||
llm_extra_body={"extra_body": {"thinking": {"type": "disabled"}}},
|
llm_extra_body={"extra_body": {"thinking": {"type": "disabled"}}},
|
||||||
|
llm_metadata={"a2a_grant_id": "grant-1"},
|
||||||
),
|
),
|
||||||
completion_box={},
|
completion_box={},
|
||||||
)
|
)
|
||||||
@@ -113,6 +114,7 @@ def test_reviewer_graph_uses_forwarded_llm_credentials(
|
|||||||
assert getattr(creds, "api_key") == "scoped-grant-token"
|
assert getattr(creds, "api_key") == "scoped-grant-token"
|
||||||
assert getattr(creds, "temperature_mode") == "omit"
|
assert getattr(creds, "temperature_mode") == "omit"
|
||||||
assert getattr(creds, "extra_body") == {"extra_body": {"thinking": {"type": "disabled"}}}
|
assert getattr(creds, "extra_body") == {"extra_body": {"thinking": {"type": "disabled"}}}
|
||||||
|
assert getattr(creds, "metadata") == {"a2a_grant_id": "grant-1"}
|
||||||
|
|
||||||
|
|
||||||
def test_reviewer_graph_rejects_missing_forwarded_llm_credentials(
|
def test_reviewer_graph_rejects_missing_forwarded_llm_credentials(
|
||||||
|
|||||||
Reference in New Issue
Block a user