You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from fastapi import Request
|
|
|
|
from app.config import Settings
|
|
|
|
|
|
def build_agent_card(settings: Settings, request: Request) -> dict[str, Any]:
|
|
base_url = _resolve_base_url(settings=settings, request=request)
|
|
return {
|
|
"name": settings.a2a_agent_name,
|
|
"description": settings.a2a_agent_description,
|
|
"url": f"{base_url}/a2a/rpc",
|
|
"version": "0.1.0",
|
|
"protocolVersion": "1.0",
|
|
"defaultInputModes": ["application/json"],
|
|
"defaultOutputModes": ["application/json"],
|
|
"capabilities": {
|
|
"streaming": False,
|
|
"pushNotifications": False,
|
|
"stateTransitionHistory": False,
|
|
},
|
|
"securitySchemes": {
|
|
"bearerAuth": {
|
|
"type": "http",
|
|
"scheme": "bearer",
|
|
"description": "Use the same Bearer/API key auth as the REST API.",
|
|
}
|
|
},
|
|
"security": [{"bearerAuth": []}],
|
|
"skills": [
|
|
{
|
|
"id": "availability.query",
|
|
"name": "Check Availability",
|
|
"description": "Checks Google Calendar availability for a given time range.",
|
|
"tags": ["calendar", "availability", "scheduling"],
|
|
"examples": [
|
|
"Is calendar primary free from 2026-03-10T09:00:00+01:00 to 2026-03-10T10:00:00+01:00?"
|
|
],
|
|
"inputModes": ["application/json"],
|
|
"outputModes": ["application/json"],
|
|
}
|
|
],
|
|
}
|
|
|
|
|
|
def _resolve_base_url(*, settings: Settings, request: Request) -> str:
|
|
if settings.a2a_public_base_url:
|
|
return settings.a2a_public_base_url.rstrip("/")
|
|
return str(request.base_url).rstrip("/")
|