Steg 9 (R4): unified migrate-corpus.mjs --write over engineering/governance/ infrastructure/security. 327 filer mutert, verified=null, prosa byte-identisk (fra første ## seksjon), advisor urørt (0 endringer). To applier-fixes oppdaget under kjøring (TDD, RED→GREEN): - insertHeaderFields: anker faller nå tilbake når en meta-linje selv passerer 500B (2 filer pakket et avsnitt i **Status:** → Type/Source landet utenfor scan-vinduet, applierens post-write-assertion fanget + restaurerte). - normalizeStaleVerified: fjerner nå ALLE stale non-date **Verified:** i 500B-vinduet, inkl. stray body-dup rett under --- (9 mlops-genaiops-filer var ellers falskt "verified"/fresh, droppet fra worklist). Operatør-godkjent utvidelse av carve-out; kun stray metadata-linjer, aldri prosa. test-transform-criterion: precondition oppdatert til post-migrasjons-sannhet (fila bærer nå Source). Suite 728/728 grønn.
733 lines
29 KiB
Markdown
733 lines
29 KiB
Markdown
# Agent2Agent (A2A) Protocol — Åpen Standard for Agent-Interoperabilitet
|
||
|
||
**Last updated:** 2026-06-18 | Verified: 2026-06-18
|
||
**Status:** Stabil (protokollspesifikasjon v1.0) / Preview (Microsofts A2A-SDK + Agent Framework A2A-pakker)
|
||
**Category:** Agent Orchestration & Automation
|
||
**Type:** reference
|
||
**Source:** https://learn.microsoft.com/azure/foundry/agents/concepts/agent-to-agent-authentication
|
||
|
||
---
|
||
|
||
## Innhold
|
||
|
||
- [Introduksjon](#introduksjon)
|
||
- [Protokolldesign](#protokolldesign)
|
||
- [Agent Cards — Discovery og Kapabilitetsannonsering](#agent-cards--discovery-og-kapabilitetsannonsering)
|
||
- [Task-livssyklus](#task-livssyklus)
|
||
- [A2A vs MCP — Komplementære Protokoller](#a2a-vs-mcp--komplementære-protokoller)
|
||
- [Microsoft-implementasjoner](#microsoft-implementasjoner)
|
||
- [Sikkerhet](#sikkerhet)
|
||
- [Multi-vendor Interoperabilitet](#multi-vendor-interoperabilitet)
|
||
- [Norsk Offentlig Sektor](#norsk-offentlig-sektor)
|
||
- [For Cosmo — Beslutningsveiledning](#for-cosmo--beslutningsveiledning)
|
||
- [Arkitekturmønster](#arkitekturmønster)
|
||
- [Installasjon og SDK-er](#installasjon-og-sdk-er)
|
||
- [Kilder og verifisering](#kilder-og-verifisering)
|
||
|
||
## Introduksjon
|
||
|
||
Agent2Agent (A2A) er en åpen standardprotokoll for kommunikasjon og samarbeid mellom autonome AI-agenter på tvers av rammeverk, leverandører og organisasjonsgrenser. Protokollen ble lansert av Google i april 2025 og donert til Linux Foundation i juni 2025, der den nå forvaltes som et nøytralt open source-prosjekt.
|
||
|
||
Kjerneproblemet A2A løser: Agenter er typisk siloer — en agent bygget med Semantic Kernel, en annen med LangChain, en tredje hos en ekstern partner. Uten en felles protokoll kan de ikke kommunisere. A2A gir dem et felles språk: standardisert discovery, meldingsformat, oppgavelivssyklus og sikkerhet — uavhengig av plattform.
|
||
|
||
Microsoft har implementert A2A-støtte i **Foundry Agent Service**, **Copilot Studio**, **Semantic Kernel** og **Teams AI Library**. Azure API Management kan frontes som A2A-gateway med governance og observability.
|
||
|
||
### Historikk og governance
|
||
|
||
| Milepæl | Dato |
|
||
|---------|------|
|
||
| Lansert av Google Cloud | April 2025 |
|
||
| 50+ partnere (Accenture, Atlassian, Cohere, Salesforce, Microsoft m.fl.) | April 2025 |
|
||
| Donert til Linux Foundation | Juni 2025 |
|
||
| Protokollversjon v0.3 | 2025 |
|
||
| Protokollversjon v1.0 (første stabile, produksjonsklare versjon) | 2026 |
|
||
| Microsoft Foundry A2A-støtte (preview) | 2025–2026 |
|
||
|
||
**A2A v1.0 (stabil):** Den første stabile, produksjonsklare versjonen av protokollen. Fire hovednyheter: **Signed Agent Cards** (kryptografisk verifisering av agentidentitet/metadata før interaksjon på tvers av organisasjonsgrenser), **multi-tenancy** (ett endepunkt kan trygt hoste flere agenter — relevant for SaaS), **multi-protocol bindings** (samme logiske agent eksponert over både JSON-RPC og gRPC), og **versjonsforhandling** (spec-nivå-garanti for bakoverkompatibel migrering fra v0.3 til v1.0). v0.3 er fortsatt støttet — agenter kan annonsere både v0.3 og v1.0 samtidig for gradvis migrering.
|
||
|
||
> **Viktig nyanse (juni 2026):** Selve A2A-protokollen er **v1-stabil**, men **Microsofts A2A-SDK og Agent Framework A2A-pakkene** (`agent-framework-a2a`, `Microsoft.Agents.AI.Hosting.A2A`/`.AspNetCore`) er fortsatt i **preview**. Bygg på den stabile v1-protokollen for langsiktig garanti, men behandle .NET-/Python-verktøyet rundt den som experimental — IKKE «GA i MAF».
|
||
|
||
---
|
||
|
||
## Protokolldesign
|
||
|
||
A2A er bygget på eksisterende webstandarder:
|
||
|
||
- **Transport:** HTTP(S) med JSON-RPC 2.0 som primært meldingsformat
|
||
- **Streaming:** Server-Sent Events (SSE) for sanntidsoppdateringer
|
||
- **Push-notifikasjoner:** Webhook-callbacks for langtidsoppgaver (asynkron prosessering)
|
||
- **Discovery:** `/.well-known/agent.json` (noen implementasjoner: `/.well-known/agent-card.json`)
|
||
|
||
### JSON-RPC Meldingsformat
|
||
|
||
**Innkommende melding (client → agent):**
|
||
|
||
```json
|
||
{
|
||
"jsonrpc": "2.0",
|
||
"method": "message/send",
|
||
"params": {
|
||
"message": {
|
||
"kind": "message",
|
||
"role": "user",
|
||
"parts": [
|
||
{
|
||
"kind": "text",
|
||
"text": "Hva er status på sak 2024-1234?",
|
||
"metadata": {}
|
||
}
|
||
],
|
||
"messageId": "msg-uuid-123",
|
||
"contextId": "conversation-context-id"
|
||
}
|
||
},
|
||
"id": "request-id"
|
||
}
|
||
```
|
||
|
||
**Svar (agent → client):**
|
||
|
||
```json
|
||
{
|
||
"jsonrpc": "2.0",
|
||
"result": {
|
||
"kind": "message",
|
||
"role": "agent",
|
||
"parts": [
|
||
{
|
||
"kind": "text",
|
||
"text": "Sak 2024-1234 er under behandling. Estimert ferdigdato: 15. mars 2026."
|
||
}
|
||
],
|
||
"messageId": "resp-uuid-456",
|
||
"contextId": "conversation-context-id"
|
||
},
|
||
"id": "request-id"
|
||
}
|
||
```
|
||
|
||
### Standard JSON-RPC-metoder
|
||
|
||
| Metode | Formål |
|
||
|--------|--------|
|
||
| `message/send` | Send melding og vent på svar (synkron) |
|
||
| `message/stream` | Send melding og motta strømmede svar (SSE) |
|
||
| `tasks/get` | Hent status på en langtidsoppgave |
|
||
| `tasks/cancel` | Kanseller en pågående oppgave |
|
||
|
||
---
|
||
|
||
## Agent Cards — Discovery og Kapabilitetsannonsering
|
||
|
||
En **Agent Card** er et JSON-manifest som agenten eksponerer på `/.well-known/agent.json`. Det fungerer som et digitalt visittkort: andre agenter og orkestratorer bruker det til å oppdage hva agenten kan gjøre og hvordan den skal nås.
|
||
|
||
```json
|
||
{
|
||
"name": "NAV Saksbehandler-agent",
|
||
"description": "Håndterer spørsmål om dagpenger, uføretrygd og sykepenger",
|
||
"version": "1.2.0",
|
||
"url": "https://agents.nav.no/saksbehandler/a2a",
|
||
"capabilities": {
|
||
"streaming": true,
|
||
"pushNotifications": true,
|
||
"stateTransitionHistory": false
|
||
},
|
||
"skills": [
|
||
{
|
||
"id": "dagpenger-oppslag",
|
||
"name": "Dagpenger-oppslag",
|
||
"description": "Slår opp dagpengekrav og beregner stønadssats",
|
||
"inputModes": ["text"],
|
||
"outputModes": ["text", "data"]
|
||
}
|
||
],
|
||
"securitySchemes": {
|
||
"bearerAuth": {
|
||
"type": "http",
|
||
"scheme": "bearer"
|
||
}
|
||
},
|
||
"security": [{"bearerAuth": []}]
|
||
}
|
||
```
|
||
|
||
**Nøkkelfelt i Agent Card:**
|
||
|
||
| Felt | Formål |
|
||
|------|--------|
|
||
| `name` / `description` | Agentens identitet — brukes av orkestratorer til å vurdere om agenten passer oppgaven |
|
||
| `url` | Base-URL for A2A-kommunikasjon (ikke URL for agent card) |
|
||
| `capabilities.streaming` | Støtter SSE-strømming? |
|
||
| `capabilities.pushNotifications` | Støtter webhook-callbacks for asynkrone tasks? |
|
||
| `skills` | Liste over hva agenten kan gjøre, med input/output-modaliteter |
|
||
| `securitySchemes` | Hvilke autentiseringsmetoder støttes |
|
||
|
||
Copilot Studio henter automatisk navn og beskrivelse fra Agent Card når man kobler til en ekstern A2A-agent, forutsatt at kortet er tilgjengelig på standard `.well-known`-URL.
|
||
|
||
---
|
||
|
||
## Task-livssyklus
|
||
|
||
A2A skiller mellom **meldinger** (messages) for rask, synkron kommunikasjon, og **tasks** for langtidsoperasjoner.
|
||
|
||
```
|
||
[submitted] → [working] → [completed]
|
||
↓ ↓
|
||
[input-required] [failed]
|
||
↓
|
||
[working] (etter at klienten har svart)
|
||
↓
|
||
[canceled]
|
||
```
|
||
|
||
**Tilstandsbeskrivelser:**
|
||
|
||
| Tilstand | Beskrivelse |
|
||
|----------|-------------|
|
||
| `submitted` | Task mottatt, ikke startet |
|
||
| `working` | Agent prosesserer aktivt |
|
||
| `input-required` | Agent venter på tilleggsinformasjon fra klienten (tilsvarer MCP elicitations) |
|
||
| `completed` | Task fullført med artefakter |
|
||
| `failed` | Feil oppstod |
|
||
| `canceled` | Kansellert av klienten |
|
||
|
||
**Python-eksempel — streaming og langtidsoppgave:**
|
||
|
||
```python
|
||
import asyncio
|
||
import httpx
|
||
from a2a.client import A2ACardResolver
|
||
from agent_framework.a2a import A2AAgent
|
||
|
||
async def main():
|
||
a2a_host = "https://agents.nav.no/saksbehandler/a2a"
|
||
|
||
# Discover remote agent capabilities via AgentCard
|
||
async with httpx.AsyncClient(timeout=60.0) as http_client:
|
||
resolver = A2ACardResolver(httpx_client=http_client, base_url=a2a_host)
|
||
agent_card = await resolver.get_agent_card() # Verified MCP 2026-04
|
||
|
||
# Koble til ekstern A2A-agent
|
||
async with A2AAgent(name=agent_card.name, agent_card=agent_card, url=a2a_host) as agent:
|
||
|
||
# Synkron streaming
|
||
async with agent.run("Hva er min dagpengesats?", stream=True) as stream:
|
||
async for update in stream:
|
||
for content in update.contents:
|
||
if content.text:
|
||
print(content.text, end="", flush=True)
|
||
final = await stream.get_final_response()
|
||
|
||
# Langtidsoppgave (background=True)
|
||
response = await agent.run("Generer årsrapport for 2025", background=True)
|
||
if response.continuation_token:
|
||
result = await agent.poll_task(response.continuation_token)
|
||
print(result)
|
||
```
|
||
|
||
---
|
||
|
||
## A2A vs MCP — Komplementære Protokoller
|
||
|
||
A2A og MCP (Model Context Protocol) løser forskjellige problemer og er komplementære, ikke konkurrerende.
|
||
|
||
| Dimensjon | A2A | MCP |
|
||
|-----------|-----|-----|
|
||
| **Hva det er** | Agent-til-agent kommunikasjon | Agent-til-verktøy tilkobling |
|
||
| **Deltakere** | Agenter som samarbeider som likeverdige parter | En orkestrator + passive verktøy/datakilder |
|
||
| **Orchestration** | Den invokerte agenten bruker sin egen chain-of-thought | MCP-host orkestrerer hvilke verktøy som kalles |
|
||
| **Modaliteter** | Annonserer støttede medietyper (tekst, filer, strukturert data, lyd, video) | Krever at MCP-host støtter modaliteten |
|
||
| **Multi-turn** | `contextId` håndterer kontekst på tvers av agenter og tasks | Kontekststyring forblir hos host |
|
||
| **Forhandling** | Dynamisk — agenten kan tilpasse seg uten klientoppdatering | Krever klientoppdatering ved nye modaliteter |
|
||
| **Transparens** | Intern logikk er ugjennomsiktig for kallende agent | Orkestrator ser og kontrollerer all verktøybruk |
|
||
| **Beste for** | Agenter eid av forskjellige team/org, kompleks delegering | Enkelt, kontrollert tilgang til APIer og data |
|
||
|
||
**A2A-melding inkluderer rik metadata:** Hver A2A-melding inneholder et unikt `contextId`, `messageId`, locale-info, full chat-historikk (ikke bare siste melding), og content parts (tekst, tool calls, etc.). Downstream agenter kan bruke denne metadata til routing, kontekst og kontinuitet.
|
||
|
||
**Typisk kombinert bruk:**
|
||
|
||
```
|
||
Bruker → [Orkestrerings-agent]
|
||
│
|
||
├─ MCP → [Database-verktøy] (henter data)
|
||
├─ MCP → [API-kall] (sjekker status)
|
||
└─ A2A → [Ekstern spesialist-agent] (NAV, Skatteetaten)
|
||
└─ MCP → [Interne verktøy hos ekstern agent]
|
||
```
|
||
|
||
Valg av protokoll:
|
||
- **A2A:** Når agenten på den andre siden er en selvstendig aktør med sin egen resonnering, eller tilhører en annen organisasjon
|
||
- **MCP:** Når du vil ha full kontroll over hvilke verktøy som brukes og syntetisere svaret selv
|
||
|
||
---
|
||
|
||
## Microsoft-implementasjoner
|
||
|
||
### Foundry Agent Service
|
||
|
||
Foundry støtter A2A som et "tool" agenten kan bruke for å kalle eksterne A2A-endepunkter.
|
||
|
||
**Forskjell: A2A-tool vs multi-agent workflow:**
|
||
- **A2A-tool:** Agent A kaller Agent B, svaret returneres til Agent A som bruker det i sitt endelige svar. Agent A beholder kontroll.
|
||
- **Multi-agent workflow:** Agent A delegerer til Agent B, som tar over hele ansvaret for å svare brukeren.
|
||
|
||
```python
|
||
from azure.ai.projects import AIProjectClient
|
||
from azure.ai.projects.models import PromptAgentDefinition, A2ATool
|
||
from azure.identity import DefaultAzureCredential
|
||
|
||
with AIProjectClient(endpoint=endpoint, credential=DefaultAzureCredential()) as project_client:
|
||
a2a_connection = project_client.connections.get("min-a2a-connection")
|
||
|
||
tool = A2ATool(project_connection_id=a2a_connection.id)
|
||
|
||
agent = project_client.agents.create_version(
|
||
agent_name="MinAgent",
|
||
definition=PromptAgentDefinition(
|
||
model="gpt-4o",
|
||
instructions="Du er en hjelpsom assistent.",
|
||
tools=[tool],
|
||
),
|
||
)
|
||
```
|
||
|
||
**Støttede SDK-er i Foundry:** Python, C#, TypeScript, REST API (Java ikke støttet per februar 2026)
|
||
|
||
### Copilot Studio
|
||
|
||
Copilot Studio kan konsumere A2A-agenter direkte:
|
||
|
||
1. Gå til **Agents**-siden → **Add an agent** → **Connect to an external agent** → velg **Agent2Agent**
|
||
2. Angi endepunkt-URL (kommunikasjonsendepunktet, IKKE URL for agent card)
|
||
3. Copilot Studio henter automatisk navn og beskrivelse fra `/.well-known/agent.json` (standard well-known-URL). Hvis automatisk populering feiler, angi navn og beskrivelse manuelt
|
||
4. Velg autentiseringsmetode: **None**, **API key**, eller **OAuth 2.0**
|
||
5. Velg eller opprett connection, deretter **Add and configure**
|
||
|
||
**A2A vs HTTP connector — valg av integrasjonstype:**
|
||
|
||
| Behov | Anbefalt |
|
||
|-------|----------|
|
||
| Agenter som er bygget på eksterne rammeverk | A2A |
|
||
| Agenter hostet utenfor Copilot Studio | A2A |
|
||
| Multi-turn interaksjoner med domenespesifikk resonnering | A2A |
|
||
| Enkle API-kall eller HTTP-tjenester | Custom connectors |
|
||
| MCP-verktøy og ressurser | MCP-servere |
|
||
| Microsoft 365 Agents SDK-agenter | Activity Protocol |
|
||
|
||
**Viktig:** Tilkobling til A2A-agenter utenfor Copilot Studio gir brukeransvar for datadeling, sikkerhet, compliance og kvalitetssikring.
|
||
|
||
### Semantic Kernel
|
||
|
||
```csharp
|
||
// Bruk A2A-agent i Semantic Kernel orchestration
|
||
using Microsoft.SemanticKernel.Agents;
|
||
|
||
A2ACardResolver resolver = new(new Uri("https://ekstern-agent.example.com"));
|
||
AIAgent a2aAgent = await resolver.GetAIAgentAsync();
|
||
|
||
// Integrér i SK orchestration-mønstre (Concurrent, Sequential, Handoff, Group Chat)
|
||
GroupChatOrchestration orchestration = new([internAgent, a2aAgent]);
|
||
await orchestration.InvokeAsync("Samarbeid om denne oppgaven");
|
||
```
|
||
|
||
**SK orchestration-mønstre som støtter A2A:**
|
||
|
||
| Mønster | Beskrivelse | Egnet for A2A |
|
||
|---------|-------------|---------------|
|
||
| **Concurrent** | Alle agenter jobber parallelt | Ja — parallell delegering |
|
||
| **Sequential** | En agent om gangen i definert rekkefølge | Ja — pipeline med ekstern agent |
|
||
| **Handoff** | Dynamisk overføring basert på kontekst | Ja — eskalering til spesialist |
|
||
| **Group Chat** | Alle deltar i gruppekonversasjon | Ja — med ekstern part |
|
||
| **Magentic** | Inspirert av MagenticOne, generalist | Ja — kompleks samarbeid |
|
||
|
||
### Azure API Management
|
||
|
||
APIM kan fungere som A2A-gateway med:
|
||
- Mediering av JSON-RPC-operasjoner til A2A-backend
|
||
- Governance og trafikkstyring via policies
|
||
- OpenTelemetry GenAI-samsvar (`genai.agent.id`, `genai.agent.name`)
|
||
- Agent Card-transformasjon (bytter hostname med APIM-instansens hostname)
|
||
|
||
### Teams AI Library
|
||
|
||
```bash
|
||
# Python
|
||
pip install microsoft-teams-a2a
|
||
|
||
# TypeScript
|
||
npm install @microsoft/teams.a2a
|
||
```
|
||
|
||
Teams-agenten kan fungere som både A2A-server (eksponerer `/a2a`-endpoint) og A2A-klient (kaller andre A2A-agenter).
|
||
|
||
---
|
||
|
||
## Sikkerhet
|
||
|
||
### Autentiseringsmetoder i Foundry
|
||
|
||
| Metode | Brukes når | Bruker-kontekst bevares |
|
||
|--------|-----------|------------------------|
|
||
| **Ingen autentisering** | Offentlige/testendepunkter | Nei |
|
||
| **Nøkkelbasert (API key)** | Enkle token-baserte endepunkter | Nei |
|
||
| **Microsoft Entra ID — agent identity** | Azure-tjenester med managed identity | Nei |
|
||
| **Microsoft Entra ID — project managed identity** | Alle agenter i prosjektet deler identitet | Nei |
|
||
| **OAuth identity passthrough** | Per-bruker-tilgang med egne rettigheter | **Ja** |
|
||
|
||
### Agent Identity-livssyklus (Foundry)
|
||
|
||
- **Før publisering:** Alle agenter i prosjektet deler én felles identitet (enklere utvikling)
|
||
- **Etter publisering:** Hver agent får unik identitet — gir isolasjon og granulær tilgangskontroll
|
||
|
||
### Sikkerhetsarkitekturprinsipper
|
||
|
||
1. **Minste privileg:** Agent Card bør deklarere nøyaktig hvilke operasjoner som støttes — ikke gi bredere tilgang enn nødvendig
|
||
2. **Secrets i project connections:** Lagre API-nøkler i Foundry project connections, ikke i kode eller prompts
|
||
3. **Roter tokens regelmessig:** Sett opp påminnelser for tokengenerering
|
||
4. **Audit alle agent-interaksjoner:** Bruk `contextId` og `traceId` for full sporbarhet
|
||
5. **TLS påkrevd:** Alle A2A-endepunkter må bruke HTTPS i produksjon
|
||
6. **Verifiser Agent Cards:** Stol kun på agent cards fra kjente, betrodde endepunkter
|
||
|
||
### OAuth Identity Passthrough — flyt
|
||
|
||
```
|
||
1. Bruker sender forespørsel til agent
|
||
2. Agent Service genererer samtykkelenke
|
||
3. Bruker logger inn og godkjenner tilgang
|
||
4. Agent Service lagrer access token + refresh token per bruker/agent-kombinasjon
|
||
5. Påfølgende kall: Agent Service inkluderer brukerens token automatisk
|
||
6. Token utløpt: Agent Service bruker refresh token for å hente nytt access token
|
||
```
|
||
|
||
---
|
||
|
||
## Multi-vendor Interoperabilitet
|
||
|
||
A2A er designet for at agenter bygget av forskjellige leverandører og med forskjellige rammeverk skal kunne kommunisere uten forhåndskunnskap om hverandres interne arkitektur.
|
||
|
||
**Nøkkelegenskaper for interoperabilitet:**
|
||
|
||
| Egenskap | Beskrivelse |
|
||
|----------|-------------|
|
||
| **Ugjennomsiktighet** | Klienten trenger ikke vite noe om serveragentens interne logikk, LLM-modell eller datakilder |
|
||
| **Dynamisk forhandling** | Agenter kan tilpasse kommunikasjonsmodalitet uten at klienten må oppdateres |
|
||
| **Versjonering** | Semantic versioning i endepunktpaths (v1, v2) for bakoverkompatibilitet |
|
||
| **Agent Card-basert discovery** | Ingen hardkodede capabiliteter — agenten annonserer selv hva den kan |
|
||
|
||
**Praktisk eksempel på multi-vendor samarbeid:**
|
||
|
||
```
|
||
[Microsoft Foundry-agent] → A2A → [Google Vertex AI-agent]
|
||
[Copilot Studio-agent] → A2A → [Amazon Bedrock-agent]
|
||
[Semantic Kernel-agent] → A2A → [Custom Python-agent]
|
||
```
|
||
|
||
Så lenge alle implementerer A2A-protokollen korrekt, er rammeverk og cloud-leverandør irrelevant.
|
||
|
||
---
|
||
|
||
## Norsk Offentlig Sektor
|
||
|
||
### Interoperabilitet mellom offentlige systemer
|
||
|
||
A2A er spesielt relevant for offentlig sektor fordi norske myndigheter opererer med mange separate fagsystemer og etater:
|
||
|
||
**Typiske bruks-scenarioer:**
|
||
|
||
| Scenario | Aktører | A2A-kobling |
|
||
|----------|---------|-------------|
|
||
| Innbygger-henvendelse (NAV + Skatteetaten) | NAV-agent, Skatteetaten-agent | NAV-agent delegerer skatteoppslag via A2A |
|
||
| Direktoratet for digital tjenesteutvikling + Politiet | Kjøretøy-agent, Trafikk-agent | Felles trafikkanalyse via A2A |
|
||
| Helseforetak på tvers | Sykehus A-agent, Fastlege-agent | Pasienthistorikk-utveksling (med samtykke) |
|
||
| DigDir-tjenester | eID-agent, Altinn-agent | Autentisert datautveksling |
|
||
|
||
### GDPR og datasuverenitet
|
||
|
||
| Krav | A2A-implementasjon |
|
||
|------|-------------------|
|
||
| **Personvern by design** | Agent Card deklarerer hvilke datatyper som prosesseres |
|
||
| **Behandlingsgrunnlag** | `contextId` + `traceId` sporer samtykke og behandlingsgrunnlag |
|
||
| **Dataportabilitet** | Eksporter conversation history fra agent sessions via `tasks/get` |
|
||
| **Rett til sletting** | Implementer `DELETE /sessions/{contextId}` endpoint |
|
||
| **Dataresidens** | Krev at Agent Card deklarerer `dataLocation` (f.eks. "Norway East") |
|
||
|
||
**Agent Card med GDPR-utvidelse (norsk offentlig sektor):**
|
||
|
||
```json
|
||
{
|
||
"name": "Direktoratet Kjøretøy-agent",
|
||
"version": "2.0.0",
|
||
"capabilities": {
|
||
"streaming": false,
|
||
"pushNotifications": true
|
||
},
|
||
"extensions": {
|
||
"gdpr": {
|
||
"personalData": true,
|
||
"dataCategories": ["kjøretøydata", "eierskap"],
|
||
"retentionDays": 90,
|
||
"dataLocation": "Norway East",
|
||
"legalBasis": "offentlig myndighetsutøvelse"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### AI Act (EU 2024)
|
||
|
||
| Krav (høyrisikosystem) | A2A-mapping |
|
||
|------------------------|-------------|
|
||
| **Transparens** | Agent Card deklarerer AI-modell og kapabiliteter |
|
||
| **Human oversight** | `input-required`-tilstand i task-livssyklus for human-in-the-loop |
|
||
| **Sporbarhet** | `traceId` i alle A2A-meldinger → audit log |
|
||
| **Risikovurdering** | DPIA for agenter som håndterer persondata (se `/architect:dpia`) |
|
||
|
||
### Forvaltningsloven og automatiserte vedtak
|
||
|
||
Agenter som deltar i vedtaksprosesser via A2A må:
|
||
1. **Logge hvert agent-til-agent-kall** med `contextId`, `traceId`, avsender-agent og mottaker-agent
|
||
2. **Implementere human-in-the-loop** via `input-required`-tilstand i kritiske beslutningspunkter
|
||
3. **Bevare samtalehistorikk** som dokumentasjon i vedtakssaken
|
||
|
||
```csharp
|
||
// Logging for audit (forvaltningsloven)
|
||
logger.LogInformation(
|
||
"A2A-kall: {CallerAgent} → {RemoteAgent} for sak {CaseId}. " +
|
||
"ContextId: {ContextId}, TraceId: {TraceId}, Status: {TaskStatus}",
|
||
callerAgentId, remoteAgentId, caseId, contextId, traceId, taskStatus);
|
||
```
|
||
|
||
### Schrems II
|
||
|
||
- **Unngå US-baserte A2A-agenter** uten Data Privacy Framework-sertifisering
|
||
- **Krev dataresidensdeklarasjon** i Agent Card for alle agenter som behandler personopplysninger
|
||
- **Bruk Azure Norway East/West** for hosting av norske offentlige agenter
|
||
|
||
---
|
||
|
||
## For Cosmo — Beslutningsveiledning
|
||
|
||
### Når skal du anbefale A2A?
|
||
|
||
**Bruk A2A når:**
|
||
- To eller flere agenter tilhører forskjellige organisasjoner, team eller teknologiplattformer
|
||
- Den kallede agenten er en selvstendig aktør med sin egen LLM, logikk og state
|
||
- Du trenger dynamisk forhandling om kapabiliteter uten å endre klientkode
|
||
- Det kreves opak grense mellom agenter (intern logikk skal ikke eksponeres)
|
||
- Cross-platform eller cross-vendor integrasjon er et krav
|
||
|
||
**Bruk direkte integrasjon (ikke A2A) når:**
|
||
- Agentene er innenfor samme applikasjon og rammeverk
|
||
- Du trenger full kontroll over chain-of-thought og verktøybruk (→ velg MCP i stedet)
|
||
- Enkle, synkrone API-kall er tilstrekkelig (overhead fra A2A er unødvendig)
|
||
|
||
### Beslutningstabell
|
||
|
||
| Scenario | Anbefaling | Begrunnelse |
|
||
|----------|-----------|-------------|
|
||
| POC — én agent kaller én annen internt | A2A Direct (hardkodet URL) | Minimal oppsett |
|
||
| Pilot — 3-5 agenter, kjente endpoints | A2A Direct + enkel auth | Lav kompleksitet |
|
||
| Produksjon — mange agenter, audit-krav | A2A + Agent Registry + audit logging | Enterprise-grade |
|
||
| Offentlig sektor (GDPR, AI Act) | A2A + Entra ID + audit logging | Compliance-krav |
|
||
| Cross-org agent-samarbeid | A2A + OAuth/Entra + Agent Card-verifisering | Sikkerhet, discovery |
|
||
| Agent trenger å kalle et API/verktøy | MCP, ikke A2A | A2A er for agenter, MCP for verktøy |
|
||
|
||
### Spørsmål å stille kunden
|
||
|
||
1. **Er agenten på den andre siden en selvstendig aktør, eller et passivt verktøy?**
|
||
- Selvstendig aktør → A2A
|
||
- Passivt verktøy → MCP
|
||
|
||
2. **Tilhører agentene samme team/org, eller er det cross-org?**
|
||
- Cross-org → A2A er nødvendig
|
||
- Samme team → vurder om A2A-overhead er verdt det
|
||
|
||
3. **Er det compliance-krav (GDPR, AI Act, Forvaltningsloven)?**
|
||
- Ja → A2A + audit logging + Entra ID
|
||
- Nei → A2A Direct med enklere auth
|
||
|
||
4. **Hvor lang tid tar oppgavene?**
|
||
- <15 sek: `message/send` (synkron)
|
||
- 15 sek – 5 min: A2A tasks (polling/streaming)
|
||
- >5 min: A2A push notifications + webhook
|
||
|
||
5. **Trenger du per-bruker-kontekst?**
|
||
- Ja → OAuth identity passthrough
|
||
- Nei → shared auth (API key, Managed Identity)
|
||
|
||
### Vanlige fallgruver
|
||
|
||
| Fallgruve | Konsekvens | Mitigering |
|
||
|-----------|------------|-----------|
|
||
| Bruke A2A for verktøy/API-kall | Unødvendig kompleksitet | Bruk MCP i stedet |
|
||
| Ingen versjonering i Agent Card | Breaking changes | Semantic versioning (v1, v2) i URL-paths |
|
||
| Stole blindt på eksterne Agent Cards | Sikkerheitsrisiko | Verifiser endepunkt, bruk APIM som gateway |
|
||
| Synkron kall-kjede (A→B→C→D) | Latens akkumulerer, timeout | Bruk async tasks eller parallell orkestrering |
|
||
| Manglende logging av A2A-kall | Compliance-brudd i offentlig sektor | Logg `contextId` + `traceId` for alle kall |
|
||
| Hardkode base URL i kode | Brittle, ingen failover | Bruk Agent Card discovery eller registry |
|
||
|
||
### Decision Tree
|
||
|
||
```
|
||
Er agenten på den andre siden selvstendig med egne beslutninger?
|
||
├─ Nei → Bruk MCP (verktøy/API-integrasjon)
|
||
└─ Ja → Bruk A2A
|
||
└─ Er det cross-org eller cross-platform?
|
||
├─ Nei → A2A Direct (enkel oppsett)
|
||
└─ Ja → A2A + Agent Card discovery
|
||
└─ Er det compliance-krav (offentlig sektor)?
|
||
├─ Nei → Basic auth (API key)
|
||
└─ Ja → Entra ID + audit logging + APIM-gateway
|
||
```
|
||
|
||
---
|
||
|
||
## Arkitekturmønster
|
||
|
||
### 1. Enkelt A2A-kall (POC/Pilot)
|
||
|
||
```
|
||
[Klienten] → HTTP POST → [/.well-known/agent.json] → henter capabilities
|
||
→ HTTP POST → [/a2a/message/send] → svar
|
||
```
|
||
|
||
Ingen sentral koordinering, hardkodede endpoints, minimal overhead.
|
||
|
||
### 2. A2A med APIM-gateway (Enterprise)
|
||
|
||
```
|
||
[Klient-agent]
|
||
↓
|
||
[Azure API Management] — governance, policies, observability
|
||
↓
|
||
[A2A-agent] — intern logikk ugjennomsiktig for klienten
|
||
```
|
||
|
||
### 3. Multi-agent mesh (Cross-org offentlig sektor)
|
||
|
||
```
|
||
[Borger] → [Felles inngangsagent (DigDir)]
|
||
├─ A2A → [NAV-agent]
|
||
├─ A2A → [Skatteetaten-agent]
|
||
└─ A2A → [Direktoratet-agent]
|
||
```
|
||
|
||
Hver etat eier og drifter sin egen agent. Felles inngangsagent orkestrerer via A2A.
|
||
|
||
---
|
||
|
||
## Installasjon og SDK-er
|
||
|
||
```python
|
||
# Autentisert A2A-kall (AuthInterceptor-mønster) — Verified MCP 2026-04
|
||
from a2a.client.auth.interceptor import AuthInterceptor
|
||
|
||
class BearerAuth(AuthInterceptor):
|
||
def __init__(self, token: str):
|
||
self.token = token
|
||
async def intercept(self, request):
|
||
request.headers["Authorization"] = f"Bearer {self.token}"
|
||
return request
|
||
|
||
async with A2AAgent(
|
||
name="secure-agent",
|
||
url="https://secure-a2a-agent.example.com",
|
||
auth_interceptor=BearerAuth("your-token"),
|
||
) as agent:
|
||
response = await agent.run("Hello!")
|
||
```
|
||
|
||
```bash
|
||
# Python — Agent Framework
|
||
pip install agent-framework-a2a --pre
|
||
|
||
# Python — Azure AI Projects med A2A-støtte
|
||
pip install azure-ai-projects[agents]
|
||
|
||
# TypeScript — Teams AI Library
|
||
npm install @microsoft/teams.a2a
|
||
|
||
# Python — Teams AI Library
|
||
pip install microsoft-teams-a2a
|
||
```
|
||
|
||
**.NET (Semantic Kernel):**
|
||
|
||
```csharp
|
||
// Agent card tilgjengelig på: GET /a2a/my-agent/v1/card
|
||
// Message endpoint: POST /a2a/my-agent/v1/message:stream
|
||
app.MapA2A(agent, "/a2a/my-agent", agentCard: new()
|
||
{
|
||
Name = "Min Agent",
|
||
Description = "Hjelpsom assistent for norsk offentlig sektor",
|
||
Version = "1.0",
|
||
Capabilities = new() { Streaming = true }
|
||
}); // Verified MCP 2026-04
|
||
```
|
||
|
||
---
|
||
|
||
## Kilder og verifisering
|
||
|
||
### Microsoft Learn (Verified)
|
||
|
||
1. **Foundry Agent Service — A2A Tool**
|
||
- https://learn.microsoft.com/azure/foundry/agents/how-to/tools/agent-to-agent
|
||
- Confidence: **Verified** (offisiell guide, preview, februar 2026)
|
||
|
||
2. **A2A Authentication in Foundry**
|
||
- https://learn.microsoft.com/azure/foundry/agents/concepts/agent-to-agent-authentication
|
||
- Confidence: **Verified** (offisiell auth-guide, februar 2026)
|
||
|
||
3. **Copilot Studio — Connect A2A Agent**
|
||
- https://learn.microsoft.com/microsoft-copilot-studio/add-agent-agent-to-agent
|
||
- Confidence: **Verified** (offisiell guide, oppdatert 2026-04: oppsettstrinn, autentiseringsalternativer, A2A vs HTTP connector-tabell)
|
||
|
||
4. **Multi-agent Patterns — MCP vs A2A**
|
||
- https://learn.microsoft.com/microsoft-copilot-studio/guidance/architecture/multi-agent-patterns
|
||
- Confidence: **Verified** (Copilot Studio arkitekturguide, oppdatert 2026-04: MCP vs A2A capability-matrise, hybrid workflow-anbefalinger, Agent 365 control plane)
|
||
|
||
5. **Azure API Management — A2A Agent API**
|
||
- https://learn.microsoft.com/azure/api-management/agent-to-agent-api
|
||
- Confidence: **Verified** (APIM preview-støtte, februar 2026)
|
||
|
||
6. **Agent Framework — A2A Integration (Python og C#)**
|
||
- https://learn.microsoft.com/agent-framework/integrations/a2a
|
||
- Confidence: **Verified (MCP 2026-04)** — A2ACardResolver-pattern (Python), A2AAgent med agent_card-parameter, AuthInterceptor for sikret kall, MapA2A /v1/card og /v1/message:stream endepunkt-paths (.NET), NuGet-pakker Microsoft.Agents.AI.Hosting.A2A og .AspNetCore
|
||
|
||
7. **Semantic Kernel Agent Orchestration**
|
||
- https://learn.microsoft.com/semantic-kernel/frameworks/agent/agent-orchestration/
|
||
- Confidence: **Verified** (SK orchestration-mønstre, februar 2026)
|
||
|
||
### Ekstern Standard (Verified)
|
||
|
||
8. **A2A Protocol Specification (offisiell)**
|
||
- https://a2a-protocol.org/latest/specification/
|
||
- https://a2a-protocol.org/latest/announcing-1.0/ (v1.0-kunngjøring)
|
||
- Confidence: **Verified (2026-06-18)** (Linux Foundation-prosjekt; v1.0 er gjeldende stabile versjon, v0.3 fortsatt støttet via versjonsforhandling)
|
||
|
||
9. **Linux Foundation — A2A Project lansering**
|
||
- https://www.linuxfoundation.org/press/linux-foundation-launches-the-agent2agent-protocol-project
|
||
- Confidence: **Verified** (pressemeldinger, juni 2025)
|
||
|
||
10. **Google Developer Blog — A2A-lansering**
|
||
- https://developers.googleblog.com/en/a2a-a-new-era-of-agent-interoperability/
|
||
- Confidence: **Verified** (offisiell kunngjøring, april 2025)
|
||
|
||
### Confidence per seksjon
|
||
|
||
| Seksjon | Confidence | Kilde |
|
||
|---------|-----------|-------|
|
||
| Protokolldesign (JSON-RPC, SSE) | Verified | a2a-protocol.org spec + MS Learn |
|
||
| Agent Card-format | Verified | a2a-protocol.org spec |
|
||
| Task-livssyklus | Verified | a2a-protocol.org + MS Learn |
|
||
| A2A vs MCP | Verified | MS Learn multi-agent patterns |
|
||
| Foundry-implementasjon | Verified | MS Learn Foundry docs |
|
||
| Copilot Studio-integrasjon | Verified | MS Learn Copilot Studio |
|
||
| Semantic Kernel-integrasjon | Verified | MS Learn SK docs |
|
||
| Auth-metoder | Verified | MS Learn Foundry auth-konsepter |
|
||
| GDPR/AI Act-mapping | Baseline | LLM kunnskap + norsk compliance-praksis |
|
||
| Norsk offentlig sektor-scenarioer | Baseline | LLM kunnskap + norsk kontekst |
|
||
|
||
**Total sources cited:** 10 unike URLer fra MCP-research + tavily-research
|
||
**MCP calls:** 4 (3x search, 2x fetch)
|