# A2aAgentServer

## ``autogen.a2a.A2aAgentServer``

```
A2aAgentServer(agent, *, url='http://localhost:8000', agent_card=None, card_modifier=None, extended_agent_card=None, extended_card_modifier=None)
```

A server wrapper for running an AG2 agent via the A2A protocol.

This class provides functionality to wrap an AG2 ConversableAgent into an A2A server that can be used to interact with the agent through A2A requests.

### Initialize the A2aAgentServer.

| PARAMETER           | DESCRIPTION                                                                                                                                      |
|---------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|
| `agent`             | The Autogen ConversableAgent to serve.<br>**TYPE:**`ConversableAgent`                                                                                   |
| `url`               | The base URL for the A2A server.<br>**TYPE:**`str | None`**DEFAULT:**`'http://localhost:8000'`                                                |
| `agent_card`       | Configuration for the base agent card.<br>**TYPE:**`CardSettings | None`**DEFAULT:**`None`                                                        |
| `card_modifier`     | Function to modify the base agent card.<br>**TYPE:**`Callable[[AgentCard], AgentCard] | None`**DEFAULT:**`None`                             |
| `extended_agent_card` | Configuration for the extended agent card.<br>**TYPE:**`CardSettings | None`**DEFAULT:**`None`                                                |
| `extended_card_modifier` | Function to modify the extended agent card.<br>**TYPE:**`Callable[[AgentCard, ServerCallContext], AgentCard] | None`**DEFAULT:**`None` |

Source code in `autogen/a2a/server.py`

|     |     |
| --- | --- |
| ```<br> 93<br> 94<br> 95<br> 96<br> 97<br> 98<br> 99<br>100<br>101<br>102<br>103<br>104<br>105<br>106<br>107<br>108<br>109<br>110<br>111<br>112<br>113<br>114<br>115<br>116<br>117<br>118<br>119<br>120<br>121<br>122<br>123<br>124<br>125<br>126<br>127<br>128<br>129<br>130<br>131<br>132<br>133<br>134<br>135<br>136<br>137<br>138<br>139<br>140<br>141<br>142<br>143<br>144<br>145<br>146<br>147<br>148<br>149<br>150<br>151<br>152<br>153<br>154<br>155<br>156<br>157<br>158<br>159<br>160<br>161<br>162<br>163<br>164<br>165<br>166<br>167<br>168<br>169<br>170<br>171<br>172<br>173<br>174<br>175<br>176<br>177<br>178<br>179<br>180<br>181<br>182<br>183<br>184<br>``` | ```<br>def __init__(<br>    self,<br>    agent: "ConversableAgent",<br>    *,<br>    url: str | None = "http://localhost:8000",<br>    agent_card: CardSettings | None = None,<br>    card_modifier: Callable[["AgentCard"], "AgentCard"] | None = None,<br>    extended_agent_card: CardSettings | None = None,<br>    extended_card_modifier: Callable[["AgentCard", "ServerCallContext"], "AgentCard"] | None = None,<br>) -> None:<br>    """Initialize the A2aAgentServer.<br>    Args:<br>        agent: The Autogen ConversableAgent to serve.<br>        url: The base URL for the A2A server.<br>        agent_card: Configuration for the base agent card.<br>        card_modifier: Function to modify the base agent card.<br>        extended_agent_card: Configuration for the extended agent card.<br>        extended_card_modifier: Function to modify the extended agent card.<br>    """<br>    self.agent = agent<br>    if not agent_card:<br>        agent_card = CardSettings()<br>    if agent_card.url and url != "http://localhost:8000":<br>        warnings.warn(<br>            (<br>                "You can't use `agent_card.url` and `url` options in the same time. "<br>                f"`agent_card.url` has a higher priority, so `{agent_card.url}` will be used."<br>            ),<br>            RuntimeWarning,<br>            stacklevel=2,<br>        )<br>    self.card = AgentCard.model_validate({<br>        # use agent options by default<br>        "name": agent.name,<br>        "description": agent.description,<br>        "url": url,<br>        "supports_authenticated_extended_card": extended_agent_card is not None,<br>        # exclude name and description if not provided<br>        **agent_card.model_dump(exclude_none=True),<br>    })<br>    self.extended_agent_card: AgentCard | None = None<br>    if extended_agent_card:<br>        if extended_agent_card.url and url != "http://localhost:8000":<br>            warnings.warn(<br>                (<br>                    "You can't use `extended_agent_card.url` and `url` options in the same time. "<br>                    f"`agent_card.url` has a higher priority, so `{extended_agent_card.url}` will be used."<br>                ),<br>                RuntimeWarning,<br>                stacklevel=2,<br>            )<br>        self.extended_agent_card = AgentCard.model_validate({<br>            "name": agent.name,<br>            "description": agent.description,<br>            "url": url,<br>            **extended_agent_card.model_dump(exclude_none=True),<br>        })<br>    # Auto-add A2UI extension to card if wrapping an A2UIAgent.<br>    # Declares the extension URI and supportedCatalogIds in the agent card<br>    # so clients know what A2UI version and catalogs this agent supports.<br>    try:<br>        from autogen.agents.experimental.a2ui import A2UIAgent<br>        from autogen.agents.experimental.a2ui.a2a_helpers import A2UI_EXTENSION_URI<br>        if isinstance(agent, A2UIAgent):<br>            existing_extensions = list(self.card.capabilities.extensions or [])<br>            if not any(e.uri == A2UI_EXTENSION_URI for e in existing_extensions):<br>                # Build params with supportedCatalogIds per A2UI extension spec<br>                params: dict[str, Any] = {<br>                    "supportedCatalogIds": [agent.catalog_id],<br>                }<br>                existing_extensions.append(<br>                    AgentExtension(<br>                        uri=A2UI_EXTENSION_URI,<br>                        description="Provides agent-driven UI using the A2UI v0.9 JSON format.",<br>                        params=params,<br>                    )<br>                )<br>                self.card.capabilities.extensions = existing_extensions<br>    except (ImportError, NameError):<br>        pass<br>    self.card_modifier = card_modifier<br>    self.extended_card_modifier = extended_card_modifier<br>    self.middlewares: list[tuple[BaseHTTPMiddleware, dict[str, Any]]] = []<br>``` |

### ``agent`instance-attribute``

```
agent = agent
```

### ``card`instance-attribute``

```
card = model_validate({'name': name, 'description': description, 'url': url, 'supports_authenticated_extended_card': extended_agent_card is not None, None: model_dump(exclude_none=True)})
```

### ``extended_agent_card`instance-attribute``

```
extended_agent_card = None
```

### ``card_modifier`instance-attribute``

```
card_modifier = card_modifier
```

### ``extended_card_modifier`instance-attribute``

```
extended_card_modifier = extended_card_modifier
```

### ``middlewares`instance-attribute``

```
middlewares = []
```

### ``executor`property``

```
executor
```

Get the A2A agent executor.

Auto-detects `A2UIAgent` and returns an `A2UIAgentExecutor` that preserves A2UI DataParts in responses and handles extension negotiation.

### ``build`class-attribute``instance-attribute``

```
build = build_starlette_app
```

### ``add_middleware [

```
add_middleware(middleware, **kwargs)
```

Add a middleware to the A2A server.

Source code in `autogen/a2a/server.py`

|     |     |
| --- | --- |
| ```<br>186<br>187<br>188<br>``` | ```<br>def add_middleware(self, middleware: "BaseHTTPMiddleware", **kwargs: Any) -> None:<br>    """Add a middleware to the A2A server."""<br>    self.middlewares.append((middleware, kwargs))<br>``` |

### ``build_request_handler [

```
build_request_handler(*, task_store=None, queue_manager=None, push_config_store=None, push_sender=None, request_context_builder=None)
```

Build a request handler for A2A application.

| PARAMETER           | DESCRIPTION                                                                                                                                      |
|---------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|
| `task_store`        | The task store to use.<br>**TYPE:**`TaskStore | None`**DEFAULT:**`None`                                                                                       |
| `queue_manager`     | The queue manager to use.<br>**TYPE:**`QueueManager | None`**DEFAULT:**`None`                                                                        |
| `push_config_store` | The push notification config store to use.<br>**TYPE:**`PushNotificationConfigStore | None`**DEFAULT:**`None`                                           |
| `push_sender`       | The push notification sender to use.<br>**TYPE:**`PushNotificationSender | None`**DEFAULT:**`None`                                                    |
| `request_context_builder` | The request context builder to use.<br>**TYPE:**`RequestContextBuilder | None`**DEFAULT:**`None`                                              |

| RETURNS             | DESCRIPTION                                                                      |
|---------------------|---------------------------------------------------------------------------------|
| `RequestHandler`    | A configured RequestHandler instance.                                            |

Source code in `autogen/a2a/server.py`

|     |     |
| --- | --- |
| ```<br>211<br>212<br>213<br>214<br>215<br>216<br>217<br>218<br>219<br>220<br>221<br>222<br>223<br>224<br>225<br>226<br>227<br>228<br>229<br>230<br>231<br>232<br>233<br>234<br>235<br>236<br>237<br>238<br>239<br>240<br>241<br>242<br>243<br>244<br>245<br>246<br>247<br>248<br>249<br>250<br>251<br>252<br>253<br>254<br>255<br>``` | ```<br>def build_request_handler(<br>    self,<br>    *,<br>    task_store: "TaskStore | None" = None,<br>    queue_manager: "QueueManager | None" = None,<br>    push_config_store: "PushNotificationConfigStore | None" = None,<br>    push_sender: "PushNotificationSender | None" = None,<br>    request_context_builder: "RequestContextBuilder | None" = None,<br>) -> "RequestHandler":<br>    """Build a request handler for A2A application.<br>    Args:<br>        task_store: The task store to use.<br>        queue_manager: The queue manager to use.<br>        push_config_store: The push notification config store to use.<br>        push_sender: The push notification sender to use.<br>        request_context_builder: The request context builder to use.<br>    Returns:<br>        A configured RequestHandler instance.<br>    """<br>    # Bridge our public sync v0.3-pydantic extended_card_modifier to the<br>    # async proto-pydantic-proto signature SDK 1.0 expects, so the user<br>    # callback runs per request with a real ServerCallContext.<br>    extended_card_modifier_bridge = (<br>        make_async_extended_card_modifier(self.extended_card_modifier)<br>        if self.extended_card_modifier is not None<br>        else None<br>    )<br>    return DefaultRequestHandler(<br>        agent_executor=self.executor,<br>        task_store=task_store or InMemoryTaskStore(),<br>        agent_card=_v03_conversions.to_core_agent_card(self.card),<br>        queue_manager=queue_manager,<br>        push_config_store=push_config_store,<br>        push_sender=push_sender,<br>        request_context_builder=request_context_builder,<br>        extended_agent_card=(<br>            _v03_conversions.to_core_agent_card(self.extended_agent_card)<br>            if self.extended_agent_card is not None<br>            else None<br>        ),<br>        extended_card_modifier=extended_card_modifier_bridge,<br>    )<br>``` |

### ``build_starlette_app [

```
build_starlette_app(*, request_handler=None, context_builder=None)
```

Build a Starlette A2A application for ASGI server.

| PARAMETER           | DESCRIPTION                                                                                                                                      |
|---------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|
| `request_handler`    | The request handler to use.<br>**TYPE:**`RequestHandler | None`**DEFAULT:**`None`                                                                                     |
| `context_builder`    | The context builder to use.<br>**TYPE:**`ServerCallContextBuilder | None`**DEFAULT:**`None`                                                                    |

| RETURNS             | DESCRIPTION                                                                      |
|---------------------|---------------------------------------------------------------------------------|
| `Starlette`         | A configured Starlette application instance.                                     |

Source code in `autogen/a2a/server.py`

|     |     |
| --- | --- |
| ```<br>257<br>258<br>259<br>260<br>261<br>262<br>263<br>264<br>265<br>266<br>267<br>268<br>269<br>270<br>271<br>272<br>273<br>274<br>275<br>276<br>277<br>278<br>279<br>280<br>281<br>282<br>283<br>284<br>285<br>286<br>287<br>288<br>289<br>290<br>291<br>292<br>293<br>294<br>295<br>296<br>297<br>298<br>``` | ```<br>def build_starlette_app(<br>    self,<br>    *,<br>    request_handler: "RequestHandler | None" = None,<br>    context_builder: "ServerCallContextBuilder | None" = None,<br>) -> Starlette:<br>    """Build a Starlette A2A application for ASGI server.<br>    Args:<br>        request_handler: The request handler to use.<br>        context_builder: The context builder to use.<br>    Returns:<br>        A configured Starlette application instance.<br>    """<br>    handler = request_handler or self.build_request_handler()<br>    # Bridge sync v0.3-pydantic card_modifier to async proto-pydantic-proto<br>    # so SDK 1.0 invokes it per request when the well-known card is fetched.<br>    card_modifier_bridge = make_async_card_modifier(self.card_modifier) if self.card_modifier is not None else None<br>    routes = list(<br>        create_agent_card_routes(<br>            _v03_conversions.to_core_agent_card(self.card),<br>            card_modifier=card_modifier_bridge,<br>        )<br>    )<br>    routes.extend(<br>        create_jsonrpc_routes(<br>            handler,<br>            rpc_url="/",<br>            context_builder=context_builder,<br>            enable_v0_3_compat=True,<br>        )<br>    )<br>    app = Starlette(routes=routes)<br>    for middleware, kwargs in self.middlewares:<br>        app.add_middleware(middleware, **kwargs)  # type: ignore[arg-type]<br>    return app<br>``` |
