# Migration Patterns - Microsoft AI Platforms

**Last updated:** 2026-01 (research via microsoft-learn MCP)

---

## Oversikt

Denne referansen dekker vanlige migrasjonsveier mellom Microsoft AI-plattformer og fra eksterne plattformer til Microsoft AI. Målet er å hjelpe arkitekter med å planlegge, gjennomføre og validere migrasjoner på en strukturert måte.

---

## Migrasjonsmatrise

| Fra | Til | Innsats | Risiko | Anbefalt tidslinje |
|-----|-----|---------|--------|-------------------|
| OpenAI API direkte | Azure OpenAI | Lav | Lav | 1-2 uker |
| Azure AI Inference SDK | OpenAI SDK | Lav | Lav | 1-2 uker |
| Azure AI Studio | Microsoft Foundry | Lav-Middels | Lav | 2-4 uker |
| Power Virtual Agents | Copilot Studio | Middels | Middels | 4-8 uker |
| Custom chatbot | Copilot Studio | Middels-Høy | Middels | 8-12 uker |
| AWS Bedrock/SageMaker | Microsoft Foundry | Høy | Høy | 12-16 uker |
| GCP Vertex AI | Microsoft Foundry | Høy | Høy | 12-16 uker |
| Semantic Kernel | Microsoft Agent Framework | Lav-Middels | Lav | 2-4 uker |
| Azure Cognitive Search | Azure AI Search | Minimal | Minimal | Rebranding (ingen kodeendring) |
| Basic RAG | Azure AI Search enhanced RAG | Middels | Lav-Middels | 4-6 uker |

**Forklaring:**
- **Innsats:** Estimert utviklerarbeid (Lav < 40t, Middels 40-160t, Høy > 160t)
- **Risiko:** Sannsynlighet for uventede problemer eller datatap
- **Tidslinje:** Fra planlegging til produksjonsdrift

---

## Detaljerte migrасjonsmønstre

### 1. OpenAI API → Azure OpenAI

**Scenario:** Du bruker OpenAI API direkte (via openai.com) og ønsker å migrere til Azure for bedre kontroll, compliance eller integrering med eksisterende Azure-ressurser.

#### Hvorfor migrere?
- Data residency i EU/Norge for GDPR-compliance
- SLA på 99,9% (vs. best effort hos OpenAI)
- Integrering med Microsoft Entra ID
- Private endpoints og VNet-integrering
- Azure Policy og Cost Management

#### Migrasjonssteg

1. **Forberedelse (Uke 1)**
   - Opprett Azure OpenAI resource i ønsket region
   - Deploy modeller (gpt-4o, gpt-4o-mini, text-embedding-3-large)
   - Konfigurer nettverk (VNet, private endpoint ved behov)
   - Sett opp RBAC roller (Cognitive Services OpenAI User)

2. **Kodeendringer (Uke 1-2)**

   **Før (OpenAI direkte):**
   ```python
   import openai

   client = openai.OpenAI(api_key="sk-...")

   response = client.chat.completions.create(
       model="gpt-4o",
       messages=[{"role": "user", "content": "Hello"}]
   )
   ```

   **Etter (Azure OpenAI):**
   ```python
   import openai

   client = openai.AzureOpenAI(
       api_key="<azure-api-key>",
       api_version="2024-10-21",
       azure_endpoint="https://<resource>.openai.azure.com"
   )

   response = client.chat.completions.create(
       model="gpt-4o-deployment",  # Deployment name, ikke model name
       messages=[{"role": "user", "content": "Hello"}]
   )
   ```

   **Viktige endringer:**
   - `api_version` er påkrevd (bruk nyeste stable: `2024-10-21`)
   - `model` parameter er **deployment name** i Azure, ikke OpenAI model name
   - Endpoint URL endres til Azure-format

3. **Testing (Uke 2)**
   - Funksjonstesting: Verifiser at alle API-kall fungerer
   - Ytelsestesting: Sammenlign responstider og throughput
   - Kostnadsanalyse: Sammenlign faktisk forbruk med estimater
   - Failover-testing: Test retry-logikk og error handling

4. **Deployment (Uke 2)**
   - Blue-green deployment anbefales
   - Gradvis trafikk-overgang (canary: 10% → 50% → 100%)
   - Overvåk med Application Insights

#### Rollback-strategi
- Behold OpenAI API key i 30 dager post-migrering
- Implementer feature flag for å bytte mellom providers
- Overvåk error rates og reverter ved > 5% økning

#### Kostnadsforskjeller
- Azure OpenAI: Fast pris per 1K tokens (varierer per region)
- OpenAI direkte: Lik pricing, men uten SLA
- Husk Azure-kostnader for networking (VNet, egress)

#### Vanlige fallgruver
- ❌ Bruke model name i stedet for deployment name
- ❌ Glemme å oppdatere `api_version` parameter
- ❌ Ikke teste rate limits (Azure har andre grenser)
- ❌ Ikke konfigurere retry-logikk for Azure-spesifikke feil

---

### 2. Azure AI Studio → Microsoft Foundry

**Scenario:** Rebranding-migrasjon fra "Azure AI Studio" til "Microsoft Foundry". Dette er primært en portalendring, men med nye funksjoner.

#### Hvorfor migrere?
- Tilgang til nye AI-modeller (DeepSeek, Grok, osv.)
- Unified API (OpenAI v1 format for alle modeller)
- Bedre integrering med Azure AI Services
- Ny portal-opplevelse med bedre UX

#### Migrasjonssteg

1. **Forberedelse (Uke 1-2)**
   - Lag inventarliste over eksisterende AI Studio resources
   - Identifiser avhengigheter (Storage, Key Vault, osv.)
   - Verifiser region-tilgjengelighet for Foundry

2. **Migrasjon (Uke 2-3)**

   **Alternativ A: Behold eksisterende resources**
   - Eksisterende Azure AI resources fungerer direkte i Foundry-portalen
   - Ingen kodeendringer nødvendig
   - Oppdater dokumentasjon til nye portal-URLer

   **Alternativ B: Opprett nye Foundry resources**
   - Opprett ny Foundry resource i Azure Portal
   - Migrer deployments til ny resource
   - Oppdater connection strings i applikasjoner

3. **SDK-oppdatering (Uke 3-4)**

   Hvis du bruker Azure AI Inference SDK, vurder å migrere til OpenAI SDK for bredere modellstøtte:

   **Før (Azure AI Inference SDK):**
   ```python
   from azure.ai.inference import ChatCompletionsClient

   client = ChatCompletionsClient(
       endpoint="https://<resource>.services.ai.azure.com/models",
       credential=AzureKeyCredential(api_key)
   )

   response = client.complete(
       messages=[...],
       model="gpt-4o"  # Valgfritt for single-model endpoints
   )
   ```

   **Etter (OpenAI SDK):**
   ```python
   from openai import OpenAI

   client = OpenAI(
       api_key=api_key,
       base_url="https://<resource>.openai.azure.com/openai/v1/"
   )

   response = client.chat.completions.create(
       model="gpt-4o-deployment",  # Alltid påkrevd
       messages=[...]
   )
   ```

4. **Validering (Uke 4)**
   - Test alle endpoints
   - Verifiser at custom models fungerer
   - Valider at logging og monitoring fortsatt virker

#### Risikofaktorer
- **Lav risiko:** Hovedsakelig UI-endring
- **Vær oppmerksom på:** Custom integrasjoner med AI Studio API
- **Breaking change:** Hvis du bruker AI Inference SDK, må `model` parameter alltid spesifiseres i OpenAI SDK

#### Rollback
- Ikke nødvendig for Alternativ A (samme backend)
- For Alternativ B: Behold gamle resources i 60 dager

---

### 3. Power Virtual Agents → Copilot Studio

**Scenario:** Oppgradering fra Power Virtual Agents (PVA) classic til Copilot Studio unified authoring.

#### Hvorfor migrere?
- Generative AI-funksjoner (boosted conversations)
- Power Fx for variable management
- YAML-basert code view for utviklere
- Event-drevne triggere
- Bedre integrering med M365 Copilot

#### Migrasjonssteg

1. **Eligibilitet-sjekk (Uke 1)**

   **Bots som IKKE kan klones automatisk:**
   - Språk utenom engelsk
   - Handoff til Omnichannel for Customer Service
   - Knowledge Management extensions

   For disse: Manuell re-build nødvendig.

2. **Kloning (Uke 1-2)**

   **I Copilot Studio portal:**
   1. Åpne klassisk bot
   2. På Overview-siden: Klikk "Copy this chatbot"
   3. Velg "Copy and convert this bot"
   4. Vent på kloning (kan ta 5-30 min avhengig av størrelse)
   5. Åpne den nye agenten i Copilot Studio

   **Hva blir klonet:**
   - ✅ Topics bygget i web canvas
   - ✅ Entities og synonymer
   - ✅ Power Automate flows (men må testes!)
   - ❌ Authorization settings (må rekonfigureres)
   - ❌ Channels (må rekonfigureres)
   - ❌ Security settings (må rekonfigureres)
   - ❌ Bot Framework Skills (må reconnectes)

3. **Rekonfigurering (Uke 2-4)**

   **Authorization:**
   - Sett opp OAuth providers på nytt
   - Verifiser at Single Sign-On fungerer

   **Channels:**
   - Rekonfigurer Teams-integrering
   - Sett opp Web Chat på nytt
   - Test alle publiseringskanaler

   **Power Automate:**
   - Test alle flows grundig
   - Verifiser data mappings
   - Sjekk at connections er aktive

4. **Testing (Uke 4-6)**

   **Bruk Copilot Studio Testing Framework:**
   ```yaml
   # test-cases.yaml
   - scenario: "Greeting flow"
     user_input: "Hello"
     expected_topic: "Greeting"
     expected_response_contains: "How can I help"

   - scenario: "Authentication required"
     user_input: "Show my orders"
     expected_auth: true
     expected_topic: "Order Status"
   ```

   **Test-områder:**
   - Funksjonell testing (alle topics)
   - Integrasjonstesting (flows, auth, channels)
   - Ytelsestesting (responstid, concurrent users)
   - Sikkerhets-testing (auth, data leakage)

5. **Deployment (Uke 6-8)**

   **Anbefalt tilnærming:**
   - Publiser ny agent til Test-miljø først
   - Kjør parallelt med gammel bot i 2-4 uker
   - Gradvis overgang av brukere
   - Overvåk brukeropplevelse og feilrate

   **Deployment pipeline-oppdateringer:**
   ```yaml
   # azure-pipelines.yml (før)
   - task: PowerPlatformToolInstaller@0
   - task: PowerPlatformExportSolution@2
     inputs:
       SolutionName: 'PVABot'

   # azure-pipelines.yml (etter)
   - task: PowerPlatformToolInstaller@2
   - task: PowerPlatformExportSolution@2
     inputs:
       SolutionName: 'CopilotStudioAgent'  # Nytt bot ID!
   ```

6. **Post-migration (Uke 8+)**
   - Oppdater dokumentasjon
   - Tren support-team på ny UI
   - Vurder nye funksjoner (boosted conversations, Power Fx)
   - Planlegg oppgradering til generative AI-funksjoner

#### Risikofaktorer
- **Middels risiko:** Custom canvas-komponenter må testes grundig
- **Høy risiko:** Handoff til Omnichannel (krever manuell migrering)
- **Data risiko:** Conversation history bevares ikke automatisk

#### Rollback
- Behold klassisk bot i 90 dager
- Kan reverter trafikk ved kritiske feil
- Vurder parallell drift ved høy business-kritikalitet

#### Kostnadsforskjeller
- Copilot Studio: Per session pricing (billed sessions)
- PVA classic: Per session pricing (samme modell)
- Nytt: Generative AI-funksjoner har tilleggskostnad (per message)

#### Vanlige fallgruver
- ❌ Ikke teste Power Automate flows grundig nok
- ❌ Glemme å oppdatere deployment pipelines (nytt bot ID)
- ❌ Ikke kommunisere UI-endringer til sluttbrukere
- ❌ Forvente at alle features fungerer identisk (noen oppførselsendringer)

---

### 4. Custom Chatbot → Copilot Studio

**Scenario:** Du har en custom-bygget chatbot (Python/Node.js/C#) og ønsker å migrere til Copilot Studio for enklere vedlikehold og generative AI-funksjoner.

#### Hvorfor migrere?
- Redusert vedlikeholdsbyrde (no-code/low-code)
- Innebygd generative AI (GPT-4o)
- Managed infrastruktur (ingen server-drift)
- Power Platform-integrering (Dataverse, Power Automate)

#### Migrasjonssteg

1. **Kartlegging (Uke 1-2)**

   **Lag inventar over eksisterende funksjoner:**
   ```json
   {
     "intents": [
       {"name": "greeting", "utterances": 150},
       {"name": "faq_product", "utterances": 80},
       {"name": "order_status", "utterances": 120}
     ],
     "entities": [
       {"name": "product_name", "type": "list", "values": 45},
       {"name": "order_id", "type": "regex"}
     ],
     "integrations": [
       {"type": "CRM", "api": "Salesforce REST"},
       {"type": "ERP", "api": "SAP OData"}
     ],
     "channels": ["Web", "Teams", "Slack"]
   }
   ```

2. **Gap-analyse (Uke 2-3)**

   **Sjekk om Copilot Studio støtter dine behov:**

   | Feature | Custom bot | Copilot Studio | Gap? |
   |---------|-----------|----------------|------|
   | NLU | LUIS/Custom | GPT-4o | ✅ Bedre |
   | Custom logic | Python/Node | Power Fx | ⚠️ Mindre fleksibelt |
   | API-integrasjon | REST direkte | Power Automate | ⚠️ Ekstra lag |
   | WebSocket | Ja | Nei | ❌ Må re-designes |
   | Custom UI | Full kontroll | Adaptive Cards | ⚠️ Begrenset |

   **Avgjør:** Kan alle features reimplementeres? Eller trenger du hybrid-løsning?

3. **Design (Uke 3-4)**

   **Map intents til Topics:**
   ```yaml
   # greeting.topic.yaml
   kind: AdaptiveDialog
   beginDialog:
     kind: OnRecognizedIntent
     intent:
       displayName: Greeting
       triggerPhrases:
         - "Hello"
         - "Hi"
         - "Hey there"
     actions:
       - kind: SendActivity
         activity: "Hello! How can I help you today?"
   ```

   **Map entities til Copilot Studio entities:**
   - Simple lists → List entities
   - Regex patterns → Regex entities
   - ML-basert → Generative AI extraction (GPT-4o)

4. **Implementering (Uke 4-10)**

   **Fase 1: Core flows (Uke 4-6)**
   - Re-build top 5 mest brukte intents som Topics
   - Implementer basic entities
   - Sett opp test-miljø

   **Fase 2: Integrasjoner (Uke 6-8)**
   - Bygg Power Automate flows for API-kall
   - Test data mappings
   - Implementer error handling

   **Fase 3: Avansert logikk (Uke 8-10)**
   - Implementer complex workflows med Power Fx
   - Sett opp multi-turn conversations
   - Bygg custom Adaptive Cards for UI

5. **Testing (Uke 10-12)**

   **Regression testing:**
   - Kjør samme test cases som custom bot
   - Sammenlign NLU-accuracy (intent recognition rate)
   - Verifiser at API-integrasjoner fungerer
   - Test edge cases og error scenarios

6. **Deployment (Uke 12-14)**

   **Parallel run:**
   - Deploy Copilot Studio bot til prod
   - Kjør parallelt med custom bot i 2-4 uker
   - Bruk feature flag for å styre hvilken bot som brukes
   - Samle feedback fra brukere

   **Cutover:**
   - Velg dato for full overgang
   - Redirect all trafikk til Copilot Studio
   - Behold custom bot som fallback i 30 dager
   - Decomission custom infrastructure

#### Datamigrering
- **Conversation history:** Ikke automatisk migrerbar
- **Analytics:** Eksporter historikk til Data Lake før decomission
- **User profiles:** Migrer til Dataverse om nødvendig

#### Risikofaktorer
- **Høy risiko:** Custom logic som ikke kan gjenskapes i Power Fx
- **Middels risiko:** Komplekse API-integrasjoner
- **Lav risiko:** Basic FAQ og intent routing

#### Rollback
- Behold custom bot-infrastruktur i 60 dager
- Ha deployment scripts klare for rask re-deploy
- Overvåk metrics tett første 2 uker

#### Kostnadsforskjeller
- **Custom bot:** EC2/App Service ($100-500/mnd) + utviklertid
- **Copilot Studio:** Per session pricing ($200-1000/mnd avhengig av volum)
- **ROI:** Typisk break-even etter 6-12 mnd grunnet redusert vedlikehold

---

### 5. AWS Bedrock/SageMaker → Microsoft Foundry

**Scenario:** Du kjører LLM-workloads på AWS og ønsker å migrere til Azure for multi-cloud strategi eller bedre integrering med Microsoft 365.

#### Hvorfor migrere?
- Unified AI platform (Microsoft Foundry)
- Integrering med M365 Copilot
- Bedre GDPR-compliance for EU-kunder
- Single-vendor strategi (Azure + Microsoft AI)

#### Migrasjonssteg

1. **Arkitektur-mapping (Uke 1-4)**

   **AWS → Azure ekvivalenter:**

   | AWS Service | Azure Service | Merk |
   |-------------|---------------|------|
   | Bedrock (Claude, Titan) | Azure OpenAI / AI Foundry | Modell-tilgjengelighet varierer |
   | SageMaker Endpoints | Azure ML Endpoints | Custom models |
   | S3 (data) | Blob Storage | Samme objekt-paradigme |
   | Lambda (serverless) | Azure Functions | Samme trigger-modell |
   | Step Functions | Logic Apps / Durable Functions | Workflow orchestration |
   | CloudWatch | Application Insights + Log Analytics | Logging og monitoring |
   | IAM | Microsoft Entra ID + RBAC | Identity management |

2. **Data migration (Uke 2-6)**

   **Strategi A: Batch migration**
   ```bash
   # Bruk AzCopy for stor data
   azcopy copy \
     's3://my-bucket/*' \
     'https://mystorageaccount.blob.core.windows.net/container?[SAS]' \
     --recursive
   ```

   **Strategi B: Continuous sync**
   - Bruk AWS DataSync → Azure Data Factory
   - Sync kun nye data under migreringen
   - Reduserer downtime

3. **Model migration (Uke 4-8)**

   **For managed models (Bedrock):**
   - Map Bedrock models til Azure OpenAI / Foundry ekvivalenter
   - Eksempel: Claude 3 (Bedrock) → GPT-4o (Azure OpenAI)
   - **Viktig:** Test nøye, modellene er ikke identiske!

   **For custom models (SageMaker):**
   - Re-train på Azure ML om nødvendig
   - Eller: Deploy eksisterende model som container på Azure ML
   - Konverter training scripts fra SageMaker til Azure ML SDK v2

   **Før (SageMaker):**
   ```python
   import sagemaker

   estimator = sagemaker.estimator.Estimator(
       image_uri='...',
       role=role,
       instance_count=1,
       instance_type='ml.p3.2xlarge'
   )
   estimator.fit({'training': 's3://bucket/data'})
   ```

   **Etter (Azure ML):**
   ```python
   from azure.ai.ml import MLClient, command

   job = command(
       code='./src',
       command='python train.py',
       environment='azureml:custom-env:1',
       compute='gpu-cluster',
       inputs={'training_data': Input(path='azureml://datastores/data')}
   )
   ml_client.jobs.create_or_update(job)
   ```

4. **Application migration (Uke 6-12)**

   **Endpoint URL-endringer:**
   ```python
   # Før (AWS Bedrock)
   import boto3

   bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')
   response = bedrock.invoke_model(
       modelId='anthropic.claude-v2',
       body=json.dumps({"prompt": "Hello"})
   )

   # Etter (Azure OpenAI)
   from openai import AzureOpenAI

   client = AzureOpenAI(
       api_key=api_key,
       api_version='2024-10-21',
       azure_endpoint='https://<resource>.openai.azure.com'
   )
   response = client.chat.completions.create(
       model='gpt-4o',
       messages=[{"role": "user", "content": "Hello"}]
   )
   ```

   **Oppdater alle:**
   - Endpoint URLs
   - Authentication (AWS IAM → Azure Entra ID)
   - Request/response formats (Bedrock → OpenAI schema)
   - Error handling (ulike feilkoder)

5. **Infrastructure as Code (Uke 8-10)**

   **Hvis du bruker Terraform:**
   ```hcl
   # Før (AWS)
   resource "aws_bedrock_model" "claude" {
     model_id = "anthropic.claude-v2"
   }

   # Etter (Azure)
   resource "azurerm_cognitive_account" "openai" {
     name                = "my-openai"
     resource_group_name = azurerm_resource_group.rg.name
     location            = "eastus"
     kind                = "OpenAI"
     sku_name            = "S0"
   }

   resource "azurerm_cognitive_deployment" "gpt4o" {
     name                 = "gpt-4o"
     cognitive_account_id = azurerm_cognitive_account.openai.id
     model {
       format  = "OpenAI"
       name    = "gpt-4o"
       version = "2024-05-13"
     }
     sku {
       name     = "Standard"
       capacity = 10
     }
   }
   ```

6. **Testing og validering (Uke 10-14)**

   **Performance testing:**
   - Sammenlign latency (AWS vs Azure)
   - Test throughput (requests/second)
   - Valider at rate limits er tilstrekkelige

   **Functional testing:**
   - Re-kjør all existing test suite
   - Verifiser at model outputs er akseptable (kan variere!)
   - Test failover og disaster recovery

7. **Cutover (Uke 14-16)**

   **Blue-green deployment:**
   - Deploy komplett Azure stack (grønn)
   - Kjør parallelt med AWS (blå) i 2 uker
   - Gradvis shift trafikk (10% → 50% → 100%)
   - Overvåk cost, performance, errors
   - Decomission AWS etter successful cutover

#### Identity og tilgangskontroll
- **AWS IAM roles** → **Azure Managed Identities**
- **AWS IAM policies** → **Azure RBAC roles**
- Bruk Azure Policy for governance
- Sett opp Conditional Access for ekstra sikkerhet

#### Kostnadsforskjeller
- **AWS Bedrock:** Per-token pricing (varierer per modell)
- **Azure OpenAI:** Per-token pricing (ofte sammenlignbart)
- **Husk:** Data egress charges (AWS → Azure migrering kan være dyrt)
- **Optimalisering:** Bruk Azure Reservations for 30-70% rabatt

#### Vanlige fallgruver
- ❌ Ikke budsjettere for data egress costs fra AWS
- ❌ Forvente identisk model behavior (Claude ≠ GPT-4o)
- ❌ Ikke teste rate limits før prod-trafikk
- ❌ Glemme å oppdatere monitoring og alerting

#### Rollback-strategi
- Behold AWS infrastructure i 90 dager
- Ha Terraform/IaC klar for rask re-deploy
- Bruk DNS for rask trafikk-switching
- Document rollback prosedyre i detalj

---

### 6. Semantic Kernel → Microsoft Agent Framework

**Scenario:** Du bruker Semantic Kernel for AI orchestration og ønsker å oppgradere til Microsoft Agent Framework for multi-agent capabilities.

#### Hvorfor migrere?
- Multi-agent orchestration (AutoGen integrering)
- Bedre plugin management
- Unified API for agents
- Alignment med Microsoft 365 Agents SDK

#### Migrasjonssteg

1. **Forberedelse (Uke 1)**

   **Installer Agent Framework:**
   ```bash
   # Python
   pip install semantic-kernel[agents] --upgrade

   # .NET
   dotnet add package Microsoft.SemanticKernel.Agents
   ```

2. **Kodeendringer (Uke 1-2)**

   **Før (Semantic Kernel):**
   ```python
   from semantic_kernel import Kernel
   from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion

   kernel = Kernel()
   kernel.add_service(
       AzureChatCompletion(
           deployment_name="gpt-4o",
           endpoint=endpoint,
           api_key=api_key
       )
   )

   # Kjør funksjon
   result = await kernel.invoke(
       function_name="MyPlugin-MyFunction",
       input="Hello world"
   )
   ```

   **Etter (Agent Framework):**
   ```python
   from semantic_kernel.agents import ChatCompletionAgent
   from semantic_kernel.agents import AgentThread
   from semantic_kernel import Kernel

   # Opprett agent (erstatter kernel)
   agent = ChatCompletionAgent(
       service_id="agent-gpt4o",
       kernel=kernel,
       name="MyAgent",
       instructions="You are a helpful assistant"
   )

   # Opprett thread (erstatter direkte invoke)
   thread = AgentThread()

   # Få respons
   async for response in agent.invoke(
       thread=thread,
       messages=[{"role": "user", "content": "Hello world"}]
   ):
       print(response.message.content)
   ```

   **Nøkkelforskjeller:**
   - `Kernel` object eksisterer fortsatt, men wrappes av `Agent`
   - `invoke()` returnerer nå `AgentResponseItem` (ikke bare string)
   - Threads må håndteres eksplisitt (bedre for multi-turn conversations)

3. **Plugin migration (Uke 2)**

   **Semantic Kernel plugins fungerer fortsatt!**
   ```python
   # Register plugin (samme som før)
   kernel.add_plugin(
       MyPlugin(),
       plugin_name="MyPlugin"
   )

   # Agent Framework bruker samme plugins automatisk
   agent = ChatCompletionAgent(
       kernel=kernel,  # Plugins er tilgjengelige via kernel
       name="PluginAgent"
   )
   ```

4. **Multi-agent orchestration (Uke 2-4)**

   **Nytt i Agent Framework:**
   ```python
   from semantic_kernel.agents import AgentGroupChat

   # Opprett flere agents
   researcher = ChatCompletionAgent(
       kernel=kernel,
       name="Researcher",
       instructions="You research topics thoroughly"
   )

   writer = ChatCompletionAgent(
       kernel=kernel,
       name="Writer",
       instructions="You write engaging content"
   )

   # Orchestrer agents
   chat = AgentGroupChat(
       agents=[researcher, writer],
       selection_strategy=SequentialSelectionStrategy()
   )

   # Kjør multi-agent workflow
   async for response in chat.invoke(
       messages=[{"role": "user", "content": "Write article about AI"}]
   ):
       print(f"{response.agent.name}: {response.message.content}")
   ```

5. **Testing (Uke 3-4)**
   - Test at eksisterende Semantic Kernel plugins fungerer
   - Valider multi-agent workflows
   - Verifiser at thread state håndteres korrekt
   - Test error handling og retry logic

#### Breaking changes (Python 1.26.1+)
- ❌ `agent.chat_history` er fjernet → Bruk `thread` i stedet
- ❌ Import paths endret: `semantic_kernel.agents.autogen` → `semantic_kernel.agents`
- ⚠️ `invoke()` returnerer `AgentResponseItem`, ikke `ChatMessageContent` direkte

#### Rollback
- Minimal risiko (Semantic Kernel fortsatt tilgjengelig)
- Kan kjøre begge frameworks parallelt
- Pinne til eldre versjon ved behov: `semantic_kernel==1.25.0`

#### Kostnadsforskjeller
- Ingen prising-forskjell (samme LLM-forbruk)
- Mulig økning ved multi-agent workflows (flere LLM-kall)

---

### 7. Basic RAG → Azure AI Search Enhanced RAG

**Scenario:** Du har en basic RAG-implementasjon (LangChain + vector DB) og ønsker å oppgradere til Azure AI Search for bedre search quality og managed infrastructure.

#### Hvorfor migrere?
- Hybrid search (vector + keyword + semantic)
- Managed service (ingen vector DB å drifte)
- AI-powered document cracking
- Integrering med Azure OpenAI

#### Migrasjonssteg

1. **Forberedelse (Uke 1-2)**

   **Opprett Azure AI Search resource:**
   ```bash
   az search service create \
     --name my-search-service \
     --resource-group my-rg \
     --sku Standard \
     --location norwayeast
   ```

2. **Data indexing (Uke 2-4)**

   **Før (Basic RAG med LangChain):**
   ```python
   from langchain.vectorstores import Chroma
   from langchain.embeddings import AzureOpenAIEmbeddings

   # Manuell document processing
   embeddings = AzureOpenAIEmbeddings()
   vectorstore = Chroma.from_documents(
       documents=docs,
       embedding=embeddings
   )
   ```

   **Etter (Azure AI Search):**
   ```python
   from azure.search.documents import SearchClient
   from azure.search.documents.indexes import SearchIndexClient
   from azure.search.documents.indexes.models import (
       SearchIndex,
       SearchField,
       VectorSearch,
       HnswAlgorithmConfiguration
   )

   # Definer index med vector search
   fields = [
       SearchField(name="id", type="Edm.String", key=True),
       SearchField(name="content", type="Edm.String", searchable=True),
       SearchField(name="content_vector", type="Collection(Edm.Single)",
                  searchable=True, vector_search_dimensions=1536,
                  vector_search_profile_name="vector-profile")
   ]

   vector_search = VectorSearch(
       algorithms=[HnswAlgorithmConfiguration(name="hnsw-config")],
       profiles=[VectorSearchProfile(name="vector-profile",
                                    algorithm_configuration_name="hnsw-config")]
   )

   index = SearchIndex(name="my-index", fields=fields, vector_search=vector_search)
   index_client.create_or_update_index(index)
   ```

3. **Document ingestion (Uke 3-4)**

   **Bruk AI Search indexers for automatisk processing:**
   ```python
   from azure.search.documents.indexes.models import (
       SearchIndexer,
       IndexingSchedule,
       FieldMapping
   )

   # Opprett indexer som crawler Blob Storage
   indexer = SearchIndexer(
       name="blob-indexer",
       data_source_name="blob-datasource",
       target_index_name="my-index",
       schedule=IndexingSchedule(interval="PT2H"),  # Hver 2. time
       field_mappings=[
           FieldMapping(source_field_name="metadata_storage_path",
                       target_field_name="id")
       ]
   )
   ```

4. **Search implementation (Uke 4-5)**

   **Hybrid search (vector + keyword):**
   ```python
   from azure.search.documents.models import VectorizedQuery

   # Generer vector fra query
   query_vector = embeddings.embed_query("What is RAG?")

   # Hybrid search
   results = search_client.search(
       search_text="RAG retrieval augmented generation",  # Keyword
       vector_queries=[VectorizedQuery(
           vector=query_vector,
           k_nearest_neighbors=5,
           fields="content_vector"
       )],
       select=["id", "content"],
       top=5
   )

   for result in results:
       print(f"Score: {result['@search.score']}")
       print(f"Content: {result['content']}")
   ```

5. **RAG integration (Uke 5-6)**

   **Integrer med Azure OpenAI:**
   ```python
   from openai import AzureOpenAI

   # Hent context fra AI Search
   search_results = list(search_client.search(...))
   context = "\n\n".join([r["content"] for r in search_results])

   # Send til LLM med grounding
   client = AzureOpenAI(...)
   response = client.chat.completions.create(
       model="gpt-4o",
       messages=[
           {"role": "system", "content": f"Use this context:\n{context}"},
           {"role": "user", "content": "What is RAG?"}
       ],
       extra_body={
           "data_sources": [{
               "type": "azure_search",
               "parameters": {
                   "endpoint": search_endpoint,
                   "index_name": "my-index",
                   "authentication": {"type": "api_key", "key": search_key}
               }
           }]
       }
   )
   ```

6. **Testing (Uke 6)**
   - Sammenlign search relevance (basic RAG vs AI Search)
   - Test hybrid search vs pure vector search
   - Valider at citations fungerer
   - Performance testing (latency, throughput)

#### Avanserte features
- **Semantic ranking:** Bruk L2 re-ranking for bedre relevance
- **Document cracking:** Automatisk parsing av PDF, Word, etc.
- **Skillsets:** AI-powered enrichment (entity extraction, OCR)

#### Kostnadsforskjeller
- **Basic RAG:** Vector DB hosting ($50-200/mnd) + compute
- **Azure AI Search:** $250-2000/mnd avhengig av SKU og volum
- **ROI:** Break-even ved > 100GB data eller kompleks search logic

#### Rollback
- Behold gammel vector DB i 60 dager
- Kan kjøre parallelt for A/B testing
- Export data fra AI Search ved behov (via REST API)

---

## Data migration best practices

### 1. Pre-migration validation
```python
# Sjekklist før data-migrering
validation_checks = {
    "data_volume": "< 10TB OK for batch, > 10TB vurder streaming",
    "data_format": "Støttes av target platform?",
    "data_quality": "Kjør data profiling først",
    "data_sensitivity": "PII-data? Kryptering nødvendig?",
    "dependencies": "Kartlegg alle data consumers",
    "backup": "Full backup tatt og testet?"
}
```

### 2. Migration strategies

| Strategi | Bruk når | Downtime | Risiko |
|----------|----------|----------|--------|
| Big Bang | < 100GB, lav kritikalitet | 4-24t | Høy |
| Trickle | Continuous sync nødvendig | Minimal | Lav |
| Phased | > 1TB, høy kritikalitet | Per fase | Middels |
| Parallel Run | Business-critical, null downtime | Ingen | Lav |

### 3. Verktøy for datamigrering

**Azure Data Factory:**
```json
{
  "name": "MigrateBlobToAzure",
  "type": "Copy",
  "inputs": [{"referenceName": "AWSBlobDataset"}],
  "outputs": [{"referenceName": "AzureBlobDataset"}],
  "typeProperties": {
    "source": {"type": "BlobSource"},
    "sink": {"type": "BlobSink"},
    "enableStaging": true,
    "parallelCopies": 32
  }
}
```

**AzCopy (for store volumes):**
```bash
# AWS S3 → Azure Blob
azcopy copy \
  's3://source-bucket/*' \
  'https://dest.blob.core.windows.net/container?[SAS]' \
  --recursive \
  --s3-request-concurrency=64
```

---

## Identity og tilgangskontroll migration

### AWS IAM → Azure RBAC

| AWS | Azure | Merk |
|-----|-------|------|
| IAM User | User (Entra ID) | Centralisert identity |
| IAM Role | Managed Identity | Service-to-service auth |
| IAM Policy | RBAC Role | Coarser-grained i Azure |
| Resource Policy | Resource-level RBAC | Lignende konsept |

**Migrasjonssteg:**
1. Map AWS IAM policies til Azure RBAC roles
2. Opprett custom roles for spesialbehov
3. Bruk Managed Identities i stedet for service accounts
4. Implementer Conditional Access for ekstra sikkerhet

---

## Testing og validering checklist

### Pre-migration testing
- [ ] Backup av alle data tatt og verifisert
- [ ] Rollback-prosedyre dokumentert og testet
- [ ] Stakeholders informert om tidsplan
- [ ] DR-plan oppdatert

### Post-migration testing
- [ ] Funksjonell testing (100% feature parity)
- [ ] Performance testing (latency, throughput)
- [ ] Security testing (auth, data encryption)
- [ ] Integrasjonstesting (upstream/downstream systems)
- [ ] User acceptance testing (UAT)
- [ ] Load testing (peak traffic scenarios)
- [ ] Disaster recovery testing (failover, backup restore)

### Monitoring post-migration
- [ ] Error rates < baseline + 5%
- [ ] Latency p95 < baseline + 20%
- [ ] Cost tracking (versus estimate)
- [ ] User feedback collection
- [ ] Incident log (første 30 dager)

---

## Vanlige fallgruver og lessons learned

### Planlegging
❌ **Ikke estimere effort korrekt**
- Multipliser initial estimate med 1.5-2x
- Inkluder buffer for uventede issues

❌ **Ikke involvere stakeholders tidlig nok**
- Inkluder business, security, compliance fra dag 1
- Kommuniser risiko og impact tydelig

### Implementering
❌ **Ikke teste grundig nok før prod**
- Minimum 2 ukers UAT i staging-miljø
- Test edge cases og failure scenarios

❌ **Forsøke å migrere alt samtidig**
- Start med non-critical workloads
- Gradvis overgang reduserer risiko

### Data
❌ **Undervurdere data egress costs**
- AWS → Azure data transfer kan være dyrt ($0.09/GB)
- Budsjetter for dette i advance

❌ **Ikke validere data integrity post-migration**
- Kjør checksums på migrert data
- Sammenlign record counts

### Sikkerhet
❌ **Glemme å oppdatere security policies**
- Revurder IAM/RBAC settings på nytt
- Audit tilganger post-migration

❌ **Ikke kryptere data in-transit**
- Bruk TLS/SSL for all data-overføring
- Spesielt viktig for sensitive data

---

## Effort estimation guidelines

### Estimeringsformel
```
Total effort (timer) =
  (Kartlegging: 10-20%) +
  (Design: 15-25%) +
  (Implementering: 40-50%) +
  (Testing: 20-30%) +
  (Deployment: 5-10%)
```

### Kompleksitetsfaktorer

| Faktor | Multiplikator |
|--------|---------------|
| Data volume > 1TB | +30% |
| Custom ML models | +50% |
| Høy business-kritikalitet | +40% |
| Compliance-krav (GDPR, HIPAA) | +25% |
| Legacy integrasjoner | +35% |
| Multi-region deployment | +60% |

### Eksempel-estimat: AWS Bedrock → Azure OpenAI
```
Base effort: 200 timer
+ Data volume (2TB): +60t (30%)
+ Custom models: +100t (50%)
+ GDPR compliance: +50t (25%)
= Total: 410 timer (~10 uker med 2 FTE)
```

---

## Rollback-plan template

```markdown
# Rollback Plan: [Migration Name]

## Trigger conditions
- Error rate > X%
- Latency p95 > Yms
- Data integrity issues detected
- Critical security vulnerability
- Business decision

## Rollback steps
1. [ ] Stop new traffic to new platform (ETA: 5 min)
2. [ ] Redirect traffic to old platform (ETA: 10 min)
3. [ ] Verify old platform is healthy (ETA: 15 min)
4. [ ] Communicate to stakeholders (ETA: 30 min)
5. [ ] Post-incident review (within 24h)

## Rollback readiness
- [ ] Old platform still running and tested
- [ ] DNS/load balancer configured for quick switch
- [ ] Rollback tested in staging
- [ ] All team members trained on rollback procedure
- [ ] Backup verified and accessible

## Data sync strategy
- How to sync data created in new platform back to old?
- Acceptable data loss window: [X hours/days]
```

---

## Ressurser og verktøy

### Microsoft Learn
- [Azure Migration Guide](https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/)
- [Copilot Studio Migration](https://learn.microsoft.com/microsoft-copilot-studio/unified-authoring-conversion)
- [Microsoft Foundry Documentation](https://learn.microsoft.com/azure/foundry/)

### Verktøy
- **Azure Migrate:** Assessment og migrering av workloads
- **Azure Data Factory:** Data ingestion og ETL
- **AzCopy:** Bulk data transfer
- **Azure DevOps:** CI/CD for migrations
- **Terraform:** Infrastructure as Code for både AWS og Azure

### Community
- [Microsoft Tech Community](https://techcommunity.microsoft.com/)
- [Azure AI Discord](https://discord.gg/azureai)
- [Power Platform Community](https://powerusers.microsoft.com/)

---

## Oppsummering: Velg riktig migrasjonsstrategi

| Scenario | Anbefalt tilnærming | Timeline |
|----------|---------------------|----------|
| Proof of Concept | Big Bang (rask migrering) | 2-4 uker |
| Produksjon (lav traffic) | Phased migration | 6-12 uker |
| Produksjon (høy traffic) | Parallel run → gradual cutover | 12-16 uker |
| Business-critical | Parallel run (extended) → validert cutover | 16-24 uker |

**Husk:** Beste praksis er alltid å starte smått, teste grundig, og skalere gradvis. Ingen migrering er for liten til å planlegges ordentlig.
