ms-ai-architect/skills/ms-ai-advisor/references/development/agent-framework.md
Kjell Tore Guttormsen a583599ab1 feat(ms-ai-architect): R20 — Category-backfill på 25 kategorisløse ref-filer via insertMetaField [skip-docs]
Ny testet primitiv transform.insertMetaField (anker + 500B-back-off som insertHeaderFields, idempotent på eksakt label, body byte-identisk; 6 tester) + backfill-category.mjs (deterministisk folder->category-regel, hard per-fil-invariant, insert-only, aborterer for skriving ved avvik).

Fordeling: 14 Solution Architecture & Advisory (architecture/), 6 Microsoft AI Platforms (platforms/+development/), 4 Responsible AI & Governance, 1 MLOps & GenAIOps. Label = engelsk Category (322 vs 42 Kategori). Eksisterende recommended-mcp-servers/rag-maturity-model urort.

Roadmap: R20 done + R21 (Status/Last-updated not-due) encoded. Verifisering: 0 kategorislose filer (var 25); diff +25/-0; idempotent re-run; suite 764/764 exit 0.
2026-07-06 07:39:54 +02:00

527 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Microsoft Agent Framework - Knowledge Base
**Last updated:** 2026-06-24
**Status:** Generelt tilgjengelig (kjerne-SDK). Multi-agent workflows/orkestrering er under aktiv utvikling — deler er i preview/experimental.
**Category:** Microsoft AI Platforms
> **Verifisert 2026-06-24 mot Microsoft Learn (`learn.microsoft.com/agent-framework/`).** Hele API-flaten er korrigert: tidligere utgaver av denne filen brukte oppdiktede imports (`azure.ai.agent`, `azure.ai.foundry.FoundryClient/FoundryTools`, `Swarm`/`Handoff`, `Memory`, `@checkpoint`, `enable_tracing`). Det korrekte SDK-et er pakken `agent-framework` (Python) / `Microsoft.Agents.AI` (.NET).
---
## Hva er Microsoft Agent Framework?
Microsoft Agent Framework (MAF) er Microsofts åpne SDK for å bygge AI-agenter i kode. Det er den **direkte etterfølgeren til BÅDE Semantic Kernel OG AutoGen** — laget av de samme teamene. MAF kombinerer AutoGens enkle agent-abstraksjoner (single- og multi-agent) med Semantic Kernels enterprise-funksjoner (session-basert state, type-sikkerhet, middleware/filtre, telemetri, bred modell-/embedding-støtte), og legger til **graf-baserte Workflows** for eksplisitt kontroll over multi-agent-eksekvering.
**Nøkkelegenskaper:**
- Enhetlig agent-abstraksjon (`Agent` / `ChatClientAgent`) på tvers av modell-leverandører
- Tool/function calling med automatisk skjema-generering
- Session-basert samtalehistorikk (stateless agent som default)
- Streaming og async
- Graf-baserte Workflows for multi-agent-orkestrering
- Innebygd OpenTelemetry-observability
- Native Microsoft Foundry-integrasjon
**Språk:** Python (`agent-framework`), .NET/C# (`Microsoft.Agents.AI`). En .NET-pakke bygger på `Microsoft.Extensions.AI` for kjerne-meldings- og innholdstyper.
**Installasjon (Python):**
```bash
pip install agent-framework
```
Meta-pakken installerer kjernen (`agent-framework-core`) pluss de vanligste leverandørpakkene. Når du vet hva du trenger, kan du installere kun delene du bruker, f.eks. `pip install agent-framework-foundry agent-framework-mem0` (kjernen er en avhengighet og følger med). Andre provider-pakker: `agent-framework-openai`, `agent-framework-copilotstudio`.
---
## Forhold til Semantic Kernel og AutoGen
MAF er ikke et namespace inni Semantic Kernel — det er et eget SDK som erstatter begge forløperne. **Det finnes ikke noe `Kernel`-objekt** i Agent Framework.
| Aspekt | Semantic Kernel | AutoGen | Microsoft Agent Framework |
|--------|-----------------|---------|---------------------------|
| **Rolle** | Forløper (vedlikeholdes) | Forløper (vedlikeholdes) | Direkte etterfølger til begge |
| **Kjerneobjekt** | `Kernel` + `ChatCompletionAgent` | `AssistantAgent` | `Agent` / `ChatClientAgent` (ingen `Kernel`) |
| **Multi-agent** | Orchestration (preview) | GroupChat / Magentic | Graf-baserte Workflows + orkestrering |
| **State** | `ChatHistoryAgentThread` | Innebygd i agent | `AgentSession`/thread (stateless default) |
| **Verktøy** | `@kernel_function` + plugin + Kernel | `FunctionTool` | `@tool` / vanlig funksjon, registreres direkte |
**Anbefaling:** Bruk Microsoft Agent Framework for nye prosjekter. Eksisterende Semantic Kernel-kode kan migreres gradvis — og `KernelFunction`-instanser kan gjenbrukes direkte som MAF-verktøy via `.as_agent_framework_tool` (krever `semantic-kernel` ≥ 1.38), se [Migrasjon fra Semantic Kernel](#migrasjon-fra-semantic-kernel).
Offisielle migrasjonsguider: [fra Semantic Kernel](https://learn.microsoft.com/agent-framework/migration-guide/from-semantic-kernel/) · [fra AutoGen](https://learn.microsoft.com/agent-framework/migration-guide/from-autogen/).
---
## Kjernekomponenter
### Agent
En agent settes sammen av tre kjerneelementer: en **client** (modell-backend), **instructions** (systemprompt) og **tools** (kapabiliteter utover tekstgenerering). Agenten opprettes direkte med klienten:
```python
from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
agent = Agent(
client=FoundryChatClient(
project_endpoint="https://<project>.services.ai.azure.com",
model="gpt-4o",
credential=AzureCliCredential(),
),
name="ResearchAgent",
instructions="Du er en forskningsassistent som finner fakta.",
tools=[search_web, read_file],
)
response = await agent.run("Finn de nyeste tallene for norsk kraftproduksjon.")
print(response.text)
```
Du kan også bruke klientens convenience-metode `as_agent()` (kaller `Agent(...)` internt med et subsett av parametre):
```python
agent = FoundryChatClient(
project_endpoint="https://<project>.services.ai.azure.com",
model="gpt-4o",
credential=AzureCliCredential(),
).as_agent(instructions="Du er en hjelpsom assistent.")
```
Samme mønster fungerer mot andre backends — f.eks. `from agent_framework.openai import OpenAIChatClient` for Azure OpenAI / OpenAI.
### Tools
Et verktøy er bare en Python-funksjon. Funksjonsnavnet blir verktøynavnet og docstring-en blir beskrivelsen. Du registrerer det direkte i `tools`-parameteren — det finnes ingen plugin-/Kernel-innpakning:
```python
from typing import Annotated
from agent_framework import tool
@tool
def search_web(
query: Annotated[str, "Søketekst"]
) -> str:
"""Søk på nettet etter informasjon."""
# Implementasjon
return results
# Dekoratøren er valgfri — en ren funksjon med docstring fungerer også:
def read_file(path: Annotated[str, "Sti til filen"]) -> str:
"""Les innholdet i en fil."""
return content
```
`@tool` brukes når du vil overstyre navn/beskrivelse eller sette egenskaper som godkjenningskrav (se [Human-in-the-Loop](#pattern-3-human-in-the-loop)). `tools`-parameteren finnes både ved agent-opprettelse og på `run()`.
### Memory / samtalehistorikk
En agent er **stateless som default** — hvert `agent.run(...)`-kall starter uten historikk. For flertur-samtaler ber du agenten lage en tråd og gjenbruker den:
```python
agent = Agent(client=client, instructions="...")
thread = agent.get_new_thread()
await agent.run("Mitt navn er Kari.", thread)
response = await agent.run("Hva heter jeg?", thread) # husker konteksten
print(response.text)
```
Tråden lagres in-memory som default. For leverandører med tjenestesidig tråd (f.eks. Foundry Agents) holdes historikken på tjenestesiden. For persistent eller eksternt minne brukes provider-pakker som `agent-framework-mem0`, eller du dytter trådhistorikken inn i Redis / Cosmos DB i produksjon.
### Multi-Agent Orchestration (Workflows)
MAF orkestrerer flere agenter via **graf-baserte Workflows**. Du bygger grafen med `WorkflowBuilder` (eksplisitte noder/kanter) eller med høynivå-byggere som `SequentialBuilder`:
```python
from agent_framework import WorkflowBuilder
researcher = client.as_agent(name="Researcher", instructions="Finn fakta...")
writer = client.as_agent(name="Writer", instructions="Skriv innhold...")
# Eksplisitt graf: output flyter fra researcher til writer
workflow = (
WorkflowBuilder(start_executor=researcher)
.add_edge(researcher, writer)
.build()
)
events = await workflow.run("Skriv en rapport om AI-trender")
outputs = events.get_outputs()
if outputs:
print(outputs[0].text)
```
For en rein pipeline finnes `SequentialBuilder`, som også kan begrense hva hver agent ser av historikken (`chain_only_agent_responses=True`):
```python
from agent_framework.orchestrations import SequentialBuilder
workflow = SequentialBuilder(
participants=[writer, translator, reviewer],
chain_only_agent_responses=True,
).build()
```
Andre innebygde orkestreringsmønstre: **concurrent** (parallell), **handoff** (agenter overfører full kontroll seg imellom) og **Magentic** (manager-ledet, etterfølger til AutoGens MagenticOneGroupChat). Se [Workflows-dokumentasjonen](https://learn.microsoft.com/agent-framework/workflows/).
---
## Microsoft Foundry-integrasjon
MAF er native integrert med **Microsoft Foundry Agent Service**. `FoundryChatClient` peker mot et Foundry-prosjekt og lar agenten bruke prosjektets modeller og verktøy:
```python
import os
from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
agent = Agent(
client=FoundryChatClient(
project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
model=os.environ["FOUNDRY_MODEL"],
credential=AzureCliCredential(),
),
instructions="Du er en hjelpsom assistent.",
)
```
Foundry Agent Service kan **hoste** agenter på tjenestesiden (persistente agenter med tjenestesidig tråd) — i motsetning til lokalt kjørte agenter. Hosting, skalering og livssyklus styres av Foundry Agent Service, ikke av en klientside-`deploy()`-metode.
### Foundry-verktøykatalog
Foundry Agent Service tilbyr en katalog av innebygde verktøy som kan kobles på agenten i prosjektet:
| Kategori | Verktøy |
|----------|---------|
| **Kunnskap (privat)** | Azure AI Search, File Search, SharePoint, Microsoft Fabric (Fabric Data Agent) |
| **Kunnskap (web)** | Grounding with Bing Search, Web Search |
| **Handling/automatisering** | Azure Logic Apps, Azure Functions, OpenAPI, MCP, Computer Use, Browser Automation |
| **Generering/kjøring** | Code Interpreter, Image Generation |
| **Agent-til-agent** | Agent2Agent (A2A) |
Verktøystøtte varierer per modell og region — se den autoritative matrisen i [Tool best practices for Foundry Agent Service](https://learn.microsoft.com/azure/foundry/agents/concepts/tool-best-practice). **Azure Logic Apps-verktøyet** gir agenten tilgang til Logic Apps' connector-økosystem (SharePoint, e-post, linjeforretningssystemer m.m.).
---
## Patterns
### Pattern 1: RAG Agent
```python
from typing import Annotated
from agent_framework import Agent, tool
from azure.search.documents import SearchClient
search_client = SearchClient(...)
@tool
def search_documents(
query: Annotated[str, "Søketekst mot kunnskapsbasen"]
) -> str:
"""Søk i kunnskapsbasen og returner relevante utdrag."""
results = search_client.search(query, top=5)
return "\n".join(r["content"] for r in results)
rag_agent = Agent(
client=client,
name="KnowledgeAgent",
instructions=(
"Du er en kunnskapsassistent. Bruk search_documents for å finne "
"relevant informasjon før du svarer. Siter alltid kilder."
),
tools=[search_documents],
)
```
> For Foundry-hostede agenter kan du i stedet bruke det innebygde **Azure AI Search**-verktøyet fra verktøykatalogen i stedet for et egendefinert tool.
### Pattern 2: Supervisor-Worker (orkestrering)
Bygg spesialiserte agenter og koordiner dem i en workflow:
```python
from agent_framework import WorkflowBuilder
researcher = client.as_agent(name="Researcher", instructions="Finn fakta...")
writer = client.as_agent(name="Writer", instructions="Skriv innhold...")
reviewer = client.as_agent(name="Reviewer", instructions="Kvalitetssjekk...")
workflow = (
WorkflowBuilder(start_executor=researcher)
.add_edge(researcher, writer)
.add_edge(writer, reviewer)
.build()
)
events = await workflow.run("Lag et faktanotat om AI Act for offentlig sektor.")
```
For en manager-ledet variant (en koordinator som dynamisk velger neste agent) brukes **Magentic**-orkestrering.
### Pattern 3: Human-in-the-Loop (tool-godkjenning)
Marker verktøy som krever menneskelig godkjenning med `approval_mode`. Når agenten forsøker å kalle verktøyet, pauser workflowen og emitter en `request_info`-hendelse du håndterer eksternt:
```python
from agent_framework import tool, Agent
from agent_framework.orchestrations import SequentialBuilder
@tool(approval_mode="always_require")
def execute_database_query(query: str) -> str:
"""Kjør en database-spørring (krever godkjenning)."""
return f"Spørring utført: {query}"
database_agent = Agent(
client=client,
name="DatabaseAgent",
instructions="Du er en database-assistent.",
tools=[execute_database_query],
)
workflow = SequentialBuilder(participants=[database_agent]).build()
# Workflowen pauser på request_info-hendelsen og venter på godkjenning.
```
### Pattern 4: Streaming Response
```python
agent = Agent(client=client, instructions="...")
# Streaming for responsivt UI
async for update in agent.run("Forklar kvantefysikk", stream=True):
if update.text:
print(update.text, end="", flush=True)
```
---
## Observability
MAF integrerer med **OpenTelemetry** og emitterer traces, logs og metrics etter [OpenTelemetry GenAI Semantic Conventions](https://opentelemetry.io/docs/specs/semconv/gen-ai/). `opentelemetry-api`/`-sdk` følger med; **exportere installeres separat** (for å unngå unødvendige avhengigheter).
### Foundry + Azure Monitor
For Foundry-prosjekter konfigureres observability direkte fra `FoundryChatClient`:
```bash
pip install azure-monitor-opentelemetry
```
```python
# Krever at Foundry-prosjektet er koblet til en Application Insights-ressurs
client = FoundryChatClient(
project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
model=os.environ["FOUNDRY_MODEL"],
credential=AzureCliCredential(),
)
client.configure_azure_monitor() # setter connection string + resource automatisk
```
Traces vises i Foundry-portalen under **Observability → Traces** (typisk 25 min etterslep), og i den koblede Application Insights-ressursen.
### Lokal utvikling (Aspire Dashboard)
For lokal utvikling uten Azure kan du sende telemetri til [Aspire Dashboard](https://learn.microsoft.com/dotnet/aspire/fundamentals/dashboard/standalone) via OTLP:
```bash
export ENABLE_INSTRUMENTATION=true
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
```
For andre backends (Jaeger, Zipkin, Datadog, Grafana, New Relic) installeres en OTLP-exporter, f.eks. `opentelemetry-exporter-otlp-proto-grpc`.
---
## Security
### Managed Identity
```python
from azure.identity import DefaultAzureCredential
client = FoundryChatClient(
project_endpoint="https://<project>.services.ai.azure.com",
model="gpt-4o",
credential=DefaultAzureCredential(), # ingen secrets i koden
)
```
> `DefaultAzureCredential` er praktisk i utvikling, men i produksjon bør du bruke en spesifikk credential (f.eks. `ManagedIdentityCredential`) for å unngå latens, utilsiktet credential-probing og sikkerhetsrisiko fra fallback-kjeden. (Microsofts egen anbefaling i migrasjonsguiden.)
### Content Safety
Innholdsfiltrering kan gjøres via Azure AI Content Safety (eget SDK) eller via Foundry-prosjektets innebygde guardrails:
```python
from azure.ai.contentsafety import ContentSafetyClient
from azure.ai.contentsafety.models import AnalyzeTextOptions
safety = ContentSafetyClient(endpoint, credential)
@tool
def safe_generate(prompt: Annotated[str, "Brukerprompt"]) -> str:
"""Generer svar med innholdssjekk på input og output."""
result = safety.analyze_text(AnalyzeTextOptions(text=prompt))
if any(c.severity > 2 for c in result.categories_analysis):
raise ValueError("Skadelig input oppdaget")
# ... generer og sjekk output tilsvarende
return response
```
### Tool-godkjenning (scoping)
Sensitive verktøy markeres med godkjenningskrav i stedet for å kjøres automatisk:
```python
@tool(approval_mode="always_require")
def read_sensitive_file(path: str) -> str:
"""Les en sensitiv fil — krever menneskelig godkjenning før kjøring."""
...
```
---
## Migrasjon fra Semantic Kernel
De viktigste endringene fra Semantic Kernel til Agent Framework (Python). Merk: **ingen `Kernel`** lenger.
### Pakke og import
```python
# Semantic Kernel
from semantic_kernel import Kernel
from semantic_kernel.agents import ChatCompletionAgent
# Agent Framework
from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
```
### Agent-opprettelse (Kernel → client)
```python
# Semantic Kernel — hver agent avhenger av et Kernel
agent = ChatCompletionAgent(
service=OpenAIChatCompletion(),
name="Support",
instructions="Svar i én setning.",
)
# Agent Framework — ingen Kernel; klienten gis direkte
agent = Agent(
client=FoundryChatClient(credential=AzureCliCredential()),
instructions="Svar i én setning.",
)
```
### Plugins → Tools
```python
# Semantic Kernel — @kernel_function + plugin-klasse + Kernel
from semantic_kernel.functions import kernel_function
class SpecialsPlugin:
@kernel_function(name="specials", description="List dagens retter")
def specials(self) -> str:
return "Fiskesuppe, Cæsarsalat"
# Agent Framework — funksjon registreres direkte
from agent_framework import tool
@tool(name="specials", description="List dagens retter")
def specials() -> str:
return "Fiskesuppe, Cæsarsalat"
agent = client.as_agent(instructions="...", tools=[specials])
```
### Invocation (`invoke` → `run`)
```python
# Semantic Kernel — async-iterator
async for response in agent.invoke(messages=user_input, thread=thread):
print(response)
# Agent Framework — ett AgentResponse
response = await agent.run(user_input, thread)
print(response.text)
```
### Kompatibilitet: gjenbruk `KernelFunction` som MAF-verktøy
Eksisterende `KernelFunction`-instanser (fra prompt-maler eller metoder, inkl. VectorStore `create_search_function`) kan konverteres til Agent Framework-verktøy med `.as_agent_framework_tool` — en gradvis migrasjonsbro:
```python
# Krever semantic-kernel >= 1.38
agent_tool = kernel_function.as_agent_framework_tool(kernel=kernel)
agent = OpenAIChatClient(model="gpt-4o").as_agent(tools=agent_tool)
```
### .NET-ekvivalent
```csharp
using Microsoft.Extensions.AI;
using Microsoft.Agents.AI;
// Ingen Kernel — base-typen er AIAgent, konsolidert i ChatClientAgent
AIAgent agent = chatClient.AsAIAgent(
instructions: "Svar i én setning.",
tools: [AIFunctionFactory.Create(GetWeather)]);
AgentResponse response = await agent.RunAsync(userInput, session);
Console.WriteLine(response.Text);
```
---
## Beslutningsveiledning
### Når anbefale Agent Framework
1. **Utviklerteam** som bygger AI-applikasjoner i kode (Python/.NET)
2. **Multi-agent systemer** med kompleks orkestrering (Workflows)
3. **Tight Azure-integrasjon** via Foundry Agent Service
4. **Custom logic** som krever kode
5. **Produksjonskrav** (observability, sessions, sikkerhet, type-sikkerhet)
### Når anbefale Copilot Studio i stedet
1. **Citizen developers** uten kodeerfaring
2. **Rask prototyping** av chatbots
3. **Standard scenarioer** (Q&A, IT-helpdesk)
4. **Power Platform-økosystem** allerede i bruk
### Når anbefale direkte Azure OpenAI i stedet
1. **Enkle API-kall** uten orkestrering
2. **Minimal kompleksitet** påkrevd
3. **Eksisterende SDK-integrasjon** (OpenAI SDK)
### Spørsmål å stille kunden
1. "Har dere utviklere som kan skrive Python eller C#?"
2. "Trenger dere at flere agenter samarbeider?"
3. "Hvilke systemer må agenten integrere med?"
4. "Hva er kravene til observability og logging?"
5. "Skal løsningen kjøre i Azure, on-prem, eller hybrid?"
> **Eksisterende Semantic Kernel- eller AutoGen-kode?** MAF er den offisielle etterfølgeren til begge. Migrasjon kan skje gradvis — SK-`KernelFunction`-er kan gjenbrukes direkte via `.as_agent_framework_tool`.
---
## Ressurser
- [Agent Framework — oversikt](https://learn.microsoft.com/agent-framework/overview/)
- [Kom i gang: din første agent](https://learn.microsoft.com/agent-framework/get-started/your-first-agent)
- [Workflows (multi-agent-orkestrering)](https://learn.microsoft.com/agent-framework/workflows/)
- [Observability](https://learn.microsoft.com/agent-framework/agents/observability)
- [Migrasjonsguide fra Semantic Kernel](https://learn.microsoft.com/agent-framework/migration-guide/from-semantic-kernel/)
- [Migrasjonsguide fra AutoGen](https://learn.microsoft.com/agent-framework/migration-guide/from-autogen/)
- [Microsoft Foundry Agent Service](https://learn.microsoft.com/azure/foundry/agents/overview)
- [GitHub: microsoft/agent-framework](https://github.com/microsoft/agent-framework)
---
*Sist oppdatert: Juni 2026 (API re-verifisert mot Microsoft Learn 2026-06-24)*