[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M699BCJQYX466JDX2CGCAMV8":3,"skill-same:01M699BCJQYX466JDX2CGCAMV8":94},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":29,"ownerHtmlUrl":30,"ownerBlogUrl":31,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M699BCJQYX466JDX2CGCAMV8","azure-openai-to-responses",null,"microsoft\u002Fai-agents-for-beginners","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M6998ZK2275KMJE6Y5SEA2X2",79423,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fda\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002FSKILL.md",[],[18],"azure openai to responses","2026-11-10 10:12:30",false,"---\nname: azure-openai-to-responses\nlicense: MIT\n---\n# Migrer Python-apps fra Azure OpenAI Chat Completions til Responses API\n\n> **AUTORITATIV VEJLEDNING — FØLG PRÆCIST**\n>\n> Denne skill migrerer Python-kodebaser, der bruger Azure OpenAI Chat Completions\n> til det samlede Responses API. Følg disse instruktioner præcist.\n> Improvisér ikke parametermappinger eller opfind API-formater.\n\n---\n\n## Udløsere\n\nAktivér denne skill, når brugeren ønsker at:\n- Migrere en Python-app fra Azure OpenAI Chat Completions til Responses API\n- Opgradere Python OpenAI SDK-brug til den nyeste API-form mod Azure OpenAI\n- Forberede Python-kode til GPT-5 eller nyere modeller, der kræver Responses på Azure\n- Skifte fra `AzureOpenAI`\u002F`AsyncAzureOpenAI` til standard `OpenAI`\u002F`AsyncOpenAI` klient med v1-endpointet\n- Løse deprecationsvarsler relateret til `AzureOpenAI` konstruktører eller `api_version`\n\n---\n\n## ⚠️ Modelkompatibilitet — TJEK FØRST\n\n> **Før migration, bekræft at din Azure OpenAI-deployment understøtter Responses API.**\n\n### 1. Røgtest din deployment (hurtigst)\n\n```python\nimport os\nfrom openai import OpenAI\n\nclient = OpenAI(\n    api_key=os.environ[\"AZURE_OPENAI_API_KEY\"],\n    base_url=f\"{os.environ['AZURE_OPENAI_ENDPOINT'].rstrip('\u002F')}\u002Fopenai\u002Fv1\u002F\",\n)\n\ntry:\n    resp = client.responses.create(\n        model=os.environ[\"AZURE_OPENAI_DEPLOYMENT\"],\n        input=\"ping\",\n        max_output_tokens=50,\n        store=False,\n    )\n    print(f\"✅ Deployment supports Responses API: {resp.output_text}\")\nexcept Exception as e:\n    print(f\"❌ Deployment does NOT support Responses API: {e}\")\n```\n\n> **Note**: `max_output_tokens` har en **minimum på 16** på Azure OpenAI. Værdier under 16 giver en 400-fejl. Brug 50+ til røgtest.\n\nHvis dette returnerer 404, understøtter deploymentens model endnu ikke Responses — se reference nedenfor eller deploy igen med en understøttet model.\n\n### 2. Tjek tilgængelige modeller i din region (anbefalet)\n\nKør det indbyggede modelkompatibilitetsværktøj for at se, hvad der er tilgængeligt med Responses API-understøttelse i din specifikke region:\n\n```bash\npython migrate.py models --subscription YOUR_SUB_ID --location YOUR_REGION\n```\n\nDette spørger Azure ARM live og viser en kompatibilitetsmatrix — hvilke modeller der understøtter Responses, struktureret output, værktøjer mv. Brug `--filter gpt-5.1,gpt-5.2` for at indsnævre resultater eller `--json` til scripting.\n\n### 3. Fuldt modelunderstøttelsesreference\n\n- **Live forespørgsel**: `python migrate.py models` (se ovenfor — regionsspecifik, altid opdateret)\n- **Gennemse tilgængelighed**: [Modeloversigtstabel og regions-tilgængelighed](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Ffoundry\u002Ffoundry-models\u002Fconcepts\u002Fmodels-sold-directly-by-azure?tabs=global-standard-aoai%2Cglobal-standard&pivots=azure-openai#model-summary-table-and-region-availability)\n- **Quickstart & vejledning**: **https:\u002F\u002Faka.ms\u002Fopenai\u002Fstart**\n\n### ⚠️ Ældre modelllimitations\n\n> **ADVARSEL**: Ældre modeller (dem før `gpt-4.1`) understøtter måske ikke alle Responses API-funktioner fuldt ud.\n>\n> Kendte begrænsninger med ældre modeller:\n> - **`reasoning`-parameter**: Ikke understøttet på mange ikke-reasoning modeller. Migrer kun `reasoning` hvis den allerede var til stede i originalkoden.\n> - **`seed`-parameter**: Ikke understøttet i Responses API overhovedet — fjern fra alle forespørgsler.\n> - **Struktureret output via `text.format`**: Ældre modeller håndhæver måske ikke `strict: true` JSON-skemaer pålideligt.\n> - **Værktøjsorkestrering**: GPT-5+ orkestrerer værktøjskald som del af intern reasoning. Ældre modeller på Responses fungerer stadig, men mangler denne dybe integration.\n> - **Temperaturbegrænsninger**: Når der migreres til `gpt-5`, skal temperaturen udelades eller sættes til `1`. Ældre modeller har ikke denne begrænsning.\n\n### O-seriens reasoning-modeller (o1, o3-mini, o3, o4-mini)\n\nO-seriens modeller har unikke parameterbegrænsninger. Ved migrering af apps, der målretter o-seriens modeller:\n\n- **`temperature`**: Skal være `1` (eller udelades). O-seriens modeller accepterer ikke andre værdier.\n- **`max_completion_tokens` → `max_output_tokens`**: Apps, der bruger Azure-specifikke `max_completion_tokens`, skal skifte til `max_output_tokens`. Sæt høje værdier (4096+) fordi reasoning tokens tæller mod grænsen.\n- **`reasoning_effort`**: Hvis appen bruger `reasoning_effort` (lav\u002Fmellem\u002Fhøj), behold den — Responses API understøtter denne parameter for o-seriens modeller.\n- **Streaming opførsel**: O-seriens modeller kan bufferere output indtil reasoning er fuldført før tekstdelta events udsendes. Streaming virker stadig, men første `response.output_text.delta` kan komme med længere forsinkelse end med GPT-modeller.\n- **`top_p`**: Ikke understøttet på o-serien — fjern hvis til stede.\n- **Værktøjsbrug**: O-seriens modeller understøtter værktøjer via Responses API på samme måde som GPT-modeller, men kvaliteten af værktøjskaldorkestrering varierer efter model.\n\n**Handling — proaktiv modelrådgivning**: Under scanningsfasen, tjek hvilken model appen målretter (deploymentsnavne, miljøvariabler, konfig). Hvis modellen er før `gpt-4.1` (ikke gpt-4.1+), informer brugeren proaktivt:\n- Migreringen vil fungere til basal tekst, chat, streaming og værktøjer på deres nuværende model.\n- Nyere modeller (`gpt-5.1`, `gpt-5.2`) tilbyder bedre værktøjsorkestrering, håndhævelse af struktureret output, reasoning og regionsovergribende tilgængelighed.\n- De bør overveje at opgradere deres deployment, når de er klar — det blokerer ikke migreringen.\n\nBloker eller afslå ikke migration baseret på modelversion. Rådgivningen er informativ.\n\n### GitHub Models understøtter IKKE Responses API\n\n> **GitHub Models (`models.github.ai`, `models.inference.ai.azure.com`) understøtter ikke Responses API.**\n\nHvis kodebasen har en GitHub Models kodevej (se efter `base_url` der peger på `models.github.ai` eller `models.inference.ai.azure.com`), **fjern den fuldstændigt** under migrationen. Responses API kræver Azure OpenAI, OpenAI eller et kompatibelt lokalt endpoint (fx Ollama med Responses-understøttelse).\n\nHandling under scanning:\n- Marker eventuelle GitHub Models kodeveje til fjernelse.\n\n---\n\n## Framework-migrering\n\nMange apps bruger højere niveau-rammeværk oven på OpenAI. Når disse migreres, ændres rammeværkets eget API — ikke kun de underliggende OpenAI-kald.\n\n### Microsoft Agent Framework (MAF)\n\n**Tjek din MAF-version først** — migreringen afhænger af om du bruger MAF 1.0.0+ eller en pre-1.0.0 beta\u002Frc.\n\n#### MAF 1.0.0+ (agent-framework-openai >= 1.0.0)\n\n`OpenAIChatClient` **bruger allerede Responses API** — ingen migration nødvendig. Hvis kodebasen bruger det gamle `OpenAIChatCompletionClient` (som bruger `chat.completions.create`), erstat det med `OpenAIChatClient`.\n\n| Før | Efter |\n|--------|-------|\n| `from agent_framework.openai import OpenAIChatCompletionClient` | `from agent_framework.openai import OpenAIChatClient` |\n| `OpenAIChatCompletionClient(...)` | `OpenAIChatClient(...)` |\n\nFor at tjekke din version: `python -c \"import agent_framework_openai; print(agent_framework_openai.__version__)\"`\n\n#### MAF pre-1.0.0 (beta\u002Frc-udgivelser)\n\nI pre-1.0.0 MAF brugte `OpenAIChatClient` Chat Completions. Opgrader til `agent-framework-openai>=1.0.0`, hvor `OpenAIChatClient` som standard bruger Responses API.\n\nIngen yderligere ændringer nødvendige — `Agent` og værktøjs-API'erne er uændrede.\n\n### LangChain (`langchain-openai`)\n\nTilføj `use_responses_api=True` til `ChatOpenAI()`. Opdater også adgang til svar fra `.content` til `.text`.\n\n| Før | Efter |\n|--------|-------|\n| `ChatOpenAI(model=..., base_url=..., api_key=...)` | `ChatOpenAI(model=..., base_url=..., api_key=..., use_responses_api=True)` |\n| `result['messages'][-1].content` | `result['messages'][-1].text` |\n\nFor komplette før\u002Fefter kodeeksempler, se [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Frontend-migreringsvejledning\n\n> **Responses API er en server-side bekymring.** Migrer din Python backend; frontendens HTTP-kontrakt bør forblive uændret medmindre din backend er en tynd formidler — i så fald overvej at anvende Responses requestformatet for at eliminere et oversættelseslag. Hvis frontend kalder OpenAI direkte med en klient-side nøgle, flyt disse kald til backend først.\n\n### `@microsoft\u002Fai-chat-protocol` deprecation\n\n`@microsoft\u002Fai-chat-protocol` npm-pakken er deprecated og bør erstattes med [`ndjson-readablestream`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fndjson-readablestream). Hvis du støder på den i en frontend:\n\n1. Erstat CDN script-tagget:\n   ```html\n   \u003C!-- Before -->\n   \u003Cscript src=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002F@microsoft\u002Fai-chat-protocol@...\u002Fdist\u002Fiife\u002Findex.js\">\u003C\u002Fscript>\n   \u003C!-- After -->\n   \u003Cscript src=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002Fndjson-readablestream@1.0.7\u002Fdist\u002Fndjson-readablestream.umd.js\">\u003C\u002Fscript>\n   ```\n2. Fjern `AIChatProtocolClient` instansieringen (`new ChatProtocol.AIChatProtocolClient(\"\u002Fchat\")`).\n3. Erstat `client.getStreamedCompletion(messages)` med et direkte `fetch()` kald til backend streaming endpoint.\n4. Erstat `for await (const response of result)` med `for await (const chunk of readNDJSONStream(response.body))`.\n5. Opdater ejendomsadgang fra `response.delta.content` \u002F `response.error` til `chunk.delta.content` \u002F `chunk.error`.\n\n---\n\n## Mål\n\n- Opregn alle Python-kaldsteder, der bruger Chat Completions eller legacy Completions mod Azure OpenAI.\n- Foreslå en migrationsplan og rækkefølge for Python-kodebasen.\n- Anvend sikre, minimale ændringer for at skifte til Responses API.\n- Opdater kaldere til at konsumere Responses outputskema; ingen bagudkompatible wrappers.\n- Kør tests\u002Flintere; ret trivielle brud forårsaget af migrationen.\n- Forbered små, gennemgåelige ændringssæt og giv en slutopsummering med diffs (commit ikke).\n\n---\n\n## Guardrails\n\n- Ændr kun filer inden for git workspace. Skriv aldrig udenfor.\n- Bevar ikke bagudkompatibilitets-shims; migrer kode til nyt API-format.\n- Efterlad ikke gravsten\u002Fovergangskommentarer eller backupfiler.\n- Bevar streamingsemantik hvis tidligere brugt; ellers brug ikke-streaming.\n- Spørg om godkendelse før kørsel af kommandoer eller netværkskald, hvis i godkendelsestilstand.\n- Kør ikke `git add`\u002F`git commit`\u002F`git push`; lav kun working-tree ændringer.\n\n---\n\n## Trin 0: Azure OpenAI Client Migration (Forudsætning)\n\nHvis kodebasen bruger `AzureOpenAI` eller `AsyncAzureOpenAI` konstruktører, migrer først til standard `OpenAI` \u002F `AsyncOpenAI` konstruktører. Azure-specifikke konstruktører er deprecated i `openai>=1.108.1`.\n\n### Hvorfor v1 API-sti?\n\nDet nye `\u002Fopenai\u002Fv1` endpoint bruger den standard `OpenAI()` klient i stedet for `AzureOpenAI()`, kræver ikke `api_version` parameter og virker ens på både OpenAI og Azure OpenAI. Samme klientkode er fremtidssikret — ingen versionstyring nødvendig.\n\n### Vigtige ændringer\n\n| Før | Efter |\n|--------|-------|\n| `AzureOpenAI` | `OpenAI` |\n| `AsyncAzureOpenAI` | `AsyncOpenAI` |\n| `azure_endpoint` | `base_url` |\n| `azure_ad_token_provider` | `api_key` |\n| `api_version=...` | Fjernes helt |\n\n### Rydde-op tjekliste\n\n- Fjern `api_version` argument fra klientkonstruktion.\n- Fjern `AZURE_OPENAI_VERSION` \u002F `AZURE_OPENAI_API_VERSION` miljøvariabler fra `.env`, appindstillinger og Bicep\u002Finfra filer.\n- Omdøb `AZURE_OPENAI_CLIENT_ID` → `AZURE_CLIENT_ID` i `.env`, appindstillinger, Bicep\u002Finfra og testfixtures (standard Azure Identity SDK-konvention).\n- Sikr `openai>=1.108.1` i `requirements.txt` eller `pyproject.toml`.\n\n### Miljøvariabel-migrering\n\n| Gammel env var | Handling | Noter |\n|-------------|--------|-------|\n| `AZURE_OPENAI_VERSION` | **Fjern** | Ingen `api_version` nødvendig med v1 endpoint |\n| `AZURE_OPENAI_API_VERSION` | **Fjern** | Samme som ovenfor |\n| `AZURE_OPENAI_CLIENT_ID` | **Omdøb** → `AZURE_CLIENT_ID` | Standard Azure Identity SDK-konvention for `ManagedIdentityCredential(client_id=...)` |\n| `AZURE_OPENAI_ENDPOINT` | **Behold** | Stadig nødvendig til `base_url` konstruktion |\n| `AZURE_OPENAI_CHAT_DEPLOYMENT` | **Behold** | Bruges som `model` param i `responses.create` |\n| `AZURE_OPENAI_API_KEY` | **Behold** | Bruges som `api_key` til nøglebaseret auth |\n\nFor klientopsætningskodeeksempler (sync, async, EntraID, API key, multi-tenant), se [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Trin 1: Opdag Legacy Kaldssteder\n\nKør [detect_legacy.py](..\u002F..\u002F..\u002F..\u002F..\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py) scriptet for at finde alle kaldssteder til migration:\n\n```bash\npython skills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py .\n```\n\nEller kør disse søgninger manuelt — hvert match er et migrationsmål:\n\n```bash\n# Gammelt API-kald (skal omskrives)\nrg \"chat\\.completions\\.create\"\nrg \"ChatCompletion\\.create\"\nrg \"Completion\\.create\"\n\n# Forældede Azure-klientkonstruktører (skal erstattes)\nrg \"AzureOpenAI\\(\"\nrg \"AsyncAzureOpenAI\\(\"\n\n# Mønstre for adgang til svarform (skal opdateres)\nrg \"choices\\[0\\]\\.message\\.content\"\nrg \"choices\\[0\\]\\.delta\\.content\"\nrg \"choices\\[0\\]\\.message\\.function_call\"\nrg \"choices\\[0\\]\\.message\\.tool_calls\"\n\n# Værktøjsdefinitioner i gammelt indlejret format (skal flades ud)\nrg '\"function\":\\s*{\\s*\"name\"'\nrg \"pydantic_function_tool\"\n\n# Værktøjsresultater i gammelt format (skal konverteres til function_call_output)\nrg '\"role\":\\s*\"tool\"'\nrg '\"tool_call_id\"'\n\n# Forældede parametre (skal fjernes eller omdøbes)\nrg \"response_format\"\nrg \"max_tokens\\b\"        # omdøb til max_output_tokens\nrg \"['\\\"]seed['\\\"]\"      # remove entirely\n\n# Forældede miljøvariable (ryd op)\nrg \"AZURE_OPENAI_API_VERSION|AZURE_OPENAI_VERSION\"\nrg \"AZURE_OPENAI_CLIENT_ID\"  # bør være AZURE_CLIENT_ID\n\n# GitHub Models endepunkter (skal fjernes — Responses API understøttes ikke)\nrg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"\n\n# Framework-niveau gamle mønstre (skal opdateres)\nrg \"OpenAIChatCompletionClient\"  # MAF 1.0.0+: erstat med OpenAIChatClient\nrg \"ChatOpenAI\\(\" | grep -v \"use_responses_api\"  # LangChain: kræver use_responses_api=True\n\n# Testinfrastruktur (skal opdateres)\nrg \"ChatCompletionChunk|AsyncCompletions\\.create\" tests\u002F\nrg \"_azure_ad_token_provider\" tests\u002F\nrg \"prompt_filter_results|content_filter_results\" tests\u002F\nrg \"choices\\[0\\]\" tests\u002F\n\n# Adgang til fejlindhold i content filter (skal opdateres — struktur ændret)\nrg 'innererror.*content_filter_result|error\\.body\\[\"innererror\"\\]'\nrg \"content_filter_result\\[\" # gammel entalsform — nu content_filter_results (flertal) i content_filters-arrayet\n\n# Rå HTTP-kald til Chat Completions endepunkt (skal opdatere URL)\nrg \"\u002Fopenai\u002Fdeployments\u002F.*\u002Fchat\u002Fcompletions\"\nrg \"api-version=\"\n```\n\n### Heuristikker (opdag og omskriv)\n\n- **Chat Completions klient**: `client.chat.completions.create` → `client.responses.create(...)`.\n\n- **Azure client-konstruktører**: `AzureOpenAI(...)` → `OpenAI(base_url=..., api_key=...)`.\n- **Værktøjer**: konverter funktionskaldsværktøjsdefinitioner fra indlejret format (`{\"type\": \"function\", \"function\": {\"name\": ...}}`) til fladt Responses-format (`{\"type\": \"function\", \"name\": ...}`); brug `tool_choice`; returner værktøjsresultater som `{\"type\": \"function_call_output\", \"call_id\": ..., \"output\": ...}`-elementer (ikke `{\"role\": \"tool\", ...}`).\n- **Værktøj-rundrejser**: når modellen returnerer funktionskald, tilføj `response.output`-elementer til samtalen (ikke en manuel `{\"role\": \"assistant\", \"tool_calls\": [...]}`-ordbog), og tilføj derefter `function_call_output`-elementer for hvert resultat.\n- **Få-skud værktøjseksempler**: hvis samtalen indeholder hårdkodede værktøjskaldseksempler, konverter dem til `{\"type\": \"function_call\", \"id\": \"fc_...\", \"call_id\": \"fc_...\", ...}` + `{\"type\": \"function_call_output\", ...}`-elementer. ID’er skal starte med `fc_`.\n- **`pydantic_function_tool()`**: denne hjælpefunktion genererer stadig det gamle indlejrede format og er **ikke kompatibel** med `responses.create()`. Erstat med manuelle værktøjsdefinitioner eller en fladgørende wrapper.\n- **Multi-turn**: vedligehold samtalehistorik i appen; giv tidligere runder via `input`-elementer.\n- **Formatering**: erstat Chats topniveau `response_format` med `text.format` i Responses. Kanonisk form: `text={\"format\": {\"type\": \"json_schema\", \"name\": \"Output\", \"strict\": True, \"schema\": {...}}}`.\n- **Indholdselementer**: erstat Chats `content[].type: \"text\"` med Responses `content[].type: \"input_text\"` for bruger\u002Fsystem-runder.\n- **Billedeindholdselementer**: erstat Chats `content[].type: \"image_url\"` med Responses `content[].type: \"input_image\"`. Feltet `image_url` ændres fra et indlejret objekt `{\"url\": \"...\"}` til en flad streng. Se snydearket for før\u002Fefter-eksempler.\n- **Begrundelsesindsats**: **migrer kun `reasoning`, hvis det allerede findes i den oprindelige kode**.\n- **Fejlbehandling ved indholdsfilter**: fejlens kropsstruktur ændret. Chat Completion brugte `error.body[\"innererror\"][\"content_filter_result\"]` (ental); Responses API bruger `error.body[\"content_filters\"][0][\"content_filter_results\"]` (flertal, inde i en liste). Kode, der tilgår `innererror`, vil udløse `KeyError`. Omskriv for at bruge den nye sti.\n- **Rå HTTP-kald**: hvis appen kalder Azure OpenAI REST API direkte (via `requests`, `httpx` osv.) med `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions?api-version=...`, omskriv til `\u002Fopenai\u002Fv1\u002Fresponses`. Anmodningsbody ændres: `messages` → `input`, tilføj `max_output_tokens` og `store: false`, fjern `api-version` query-param. Responsbody ændres: `choices[0].message.content` → `output[0].content[0].text` (bemærk: `output_text` er en SDK-bekvemmelighedsegenskab, som ikke findes i rå REST JSON).\n\n---\n\n## Trin 2: Anvend migration\n\n### Migrationsnoter (Chat Completions → Responses)\n\n- **Hvorfor migrere**: Responses er den samlede API for tekst, værktøjer og streaming; Chat Completions er legacy. Med GPT-5 kræves Responses for bedste ydelse.\n- **HTTP**: Azure-endpoint skifter fra `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions` til `\u002Fopenai\u002Fv1\u002Fresponses`.\n- **Felter**: `messages` → `input`, `max_tokens` → `max_output_tokens`. `temperature` forbliver.\n- **Formatering**: `response_format` → `text.format` med et korrekt objekt.\n- **Indholdselementer**: Erstat Chats `content[].type: \"text\"` med Responses `content[].type: \"input_text\"` for system-\u002Fbruger-runder.\n- **Billedeindholdselementer**: Erstat Chats `content[].type: \"image_url\"` med Responses `content[].type: \"input_image\"`. Fladgør `image_url`-feltet fra `{\"image_url\": {\"url\": \"...\"}}` til `{\"image_url\": \"...\"}` (en almindelig streng – enten en HTTPS-URL eller en `data:image\u002F...;base64,...` data-URI).\n\n### Reference for parametermapping\n\n| Chat Completions | Responses API |\n|-----------------|---------------|\n| `prompt` | `input` |\n| `messages` | `input` (array af elementer) |\n| `max_tokens` | `max_output_tokens` |\n| `response_format` | `text.format` (objekt) |\n| `temperature` | `temperature` (uændret) |\n| `stop` | `stop` (uændret) |\n| `frequency_penalty` | `frequency_penalty` (uændret) |\n| `presence_penalty` | `presence_penalty` (uændret) |\n| `tools` \u002F funktion-kald | `tools` (uændret) |\n| `seed` | **Fjern** (ikke understøttet) |\n| `store` | `store` (sættes til `false`) |\n| `content[].type: \"text\"` | `content[].type: \"input_text\"` |\n| `content[].type: \"image_url\"` | `content[].type: \"input_image\"` |\n| `\"image_url\": {\"url\": \"...\"}` | `\"image_url\": \"...\"` (flad streng) |\n\nFor komplette før\u002Fefter kodeeksempler, se [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\nFor testinfrastruktur-migration (mocks, snapshots, assertions), se [test-migration.md](.\u002Freferences\u002Ftest-migration.md).\n\nFor fejlsøgning af fejl og faldgruber, se [troubleshooting.md](.\u002Freferences\u002Ftroubleshooting.md).\n\n---\n\n## Dataopbevaring & Tilstand\n\n- Angiv `store: false` på alle Responses-anmodninger.\n- Stol ikke på tidligere meddelelses-ID’er eller serverlagret kontekst; hold tilstand klientstyret og minimer metadata.\n\n---\n\n## Acceptkriterier\n\n### Kode-niveau porte (alle skal bestås)\n\n- [ ] Ingen match for `rg \"chat\\.completions\\.create|ChatCompletion\\.create|Completion\\.create\"` i migrerede filer.\n- [ ] Ingen match for `rg \"AzureOpenAI\\(|AsyncAzureOpenAI\\(\"` — alle konstruktører bruger `OpenAI`\u002F`AsyncOpenAI` med v1 endpoint.\n- [ ] Ingen match for `rg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"` — GitHub Models kodeveje fjernet.\n- [ ] Ingen match for `rg \"OpenAIChatCompletionClient\"` — MAF 1.0.0+ kode bruger `OpenAIChatClient` (som bruger Responses API). I pre-1.0.0, opgradér til `agent-framework-openai>=1.0.0`.\n- [ ] Alle `ChatOpenAI(...)` kald inkluderer `use_responses_api=True`.\n- [ ] Ingen match for `rg \"choices\\[0\\]\"` — al responsadgang bruger `resp.output_text` eller Responses output-skema.\n- [ ] Intet `response_format` på topniveau; al struktureret output bruger `text={\"format\": {...}}`.\n- [ ] `openai>=1.108.1` og `azure-identity` i `requirements.txt` eller `pyproject.toml`; afhængigheder geninstalleret.\n- [ ] `store=False` sat på hvert `responses.create` kald.\n- [ ] Ingen `api_version` i klientkonstruktion; `AZURE_OPENAI_API_VERSION` fjernet fra miljøfiler og infrastruktur.\n\n### Testinfrastrukturporte (alle skal bestås)\n\n- [ ] Ingen match for `rg \"ChatCompletionChunk|AsyncCompletions\\.create|chat\\.completions\" tests\u002F`.\n- [ ] Ingen match for `rg \"_azure_ad_token_provider\" tests\u002F` — assertions opdateret til at tjekke `isinstance(client, AsyncOpenAI)` eller `base_url`.\n- [ ] Ingen match for `rg \"prompt_filter_results|content_filter_results\" tests\u002F` — Azure-specifikke filtermocks fjernet.\n- [ ] Mock-faciliteter bruger `kwargs.get(\"input\")` ikke `kwargs.get(\"messages\")`.\n- [ ] Snapshot \u002F golden filer opdateret til Responses streaming format (ingen `choices[0]`, `function_call`, `logprobs` osv.).\n- [ ] `pytest` kører uden fejl efter alle testopdateringer.\n\n### Adfærdsporte (verificer manuelt eller via testværktøj)\n\n- [ ] **Basal completion**: ikke-streamende `responses.create` returnerer ikke-tom `output_text`.\n- [ ] **Stream-paritet**: hvis den oprindelige kode brugte streaming, streamer den migrerede kode og udgiver `response.output_text.delta` events med ikke-tomme deltaer.\n- [ ] **Struktureret output**: hvis `text.format` bruges med `json_schema`, lykkes `json.loads(resp.output_text)` og matcher skemaet.\n- [ ] **Værktøjskaldsløkke**: hvis værktøjer bruges, laver modellen værktøjskald, appen udfører dem, og den efterfølgende anmodning returnerer finalt `output_text` (ingen uendelig løkke).\n- [ ] **Async-paritet**: hvis `AsyncAzureOpenAI` blev brugt, fungerer `AsyncOpenAI`-ækvivalent med `await`.\n- [ ] **Fejlrate**: ingen nye 400\u002F401\u002F404 fejl i forhold til før-migrationsbaselinen.\n\n### Leverancer\n\n- Resume omfatter redigerede filer, før\u002Fefter optællinger af legacy-kaldsteder og næste skridt.\n- Ændringer er kun working-tree redigeringer (ingen commits).\n\n---\n\n## SDK Versionskrav\n\n| Pakke | Minimum Version |\n|---------|----------------|\n| `openai` | `>=1.108.1` |\n| `azure-identity` | Seneste (for EntraID-auth) |\n\n---\n\n## Referencer\n\n- [Snydeark — alle kodeudsnit](.\u002Freferences\u002Fcheat-sheet.md)\n- [Testmigration — mocks, snapshots, assertions](.\u002Freferences\u002Ftest-migration.md)\n- [Fejlfinding — fejl, risikotabel, faldgruber](.\u002Freferences\u002Ftroubleshooting.md)\n- [detect_legacy.py — automatisk scanner](..\u002F..\u002F..\u002F..\u002F..\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py)\n- [Azure OpenAI Starter Kit](https:\u002F\u002Faka.ms\u002Fopenai\u002Fstart)\n- [Azure OpenAI Responses API dokumentation](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fhow-to\u002Fresponses)\n- [Azure OpenAI API versionslivscyklus](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fapi-version-lifecycle?view=foundry-classic&tabs=python#api-evolution)\n- [OpenAI Responses API reference](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fresponses)\n\n---\n\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Ansvarsfraskrivelse**:\nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https:\u002F\u002Fgithub.com\u002FAzure\u002Fco-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER END -->","# Migrer Python-apps fra Azure OpenAI Chat Completions til Responses API\n\n> **AUTORITATIV VEJLEDNING — FØLG PRÆCIST**\n>\n> Denne skill migrerer Python-kodebaser, der bruger Azure OpenAI Chat Completions\n> til det samlede Responses API. Følg disse instruktioner præcist.\n> Improvisér ikke parametermappinger eller opfind API-formater.\n\n---\n\n## Udløsere\n\nAktivér denne skill, når brugeren ønsker at:\n- Migrere en Python-app fra Azure OpenAI Chat Completions til Responses API\n- Opgradere Python OpenAI SDK-brug til den nyeste API-form mod Azure OpenAI\n- Forberede Python-kode til GPT-5 eller nyere modeller, der kræver Responses på Azure\n- Skifte fra `AzureOpenAI`\u002F`AsyncAzureOpenAI` til standard `OpenAI`\u002F`AsyncOpenAI` klient med v1-endpointet\n- Løse deprecationsvarsler relateret til `AzureOpenAI` konstruktører eller `api_version`\n\n---\n\n## ⚠️ Modelkompatibilitet — TJEK FØRST\n\n> **Før migration, bekræft at din Azure OpenAI-deployment understøtter Responses API.**\n\n### 1. Røgtest din deployment (hurtigst)\n\n```python\nimport os\nfrom openai import OpenAI\n\nclient = OpenAI(\n    api_key=os.environ[\"AZURE_OPENAI_API_KEY\"],\n    base_url=f\"{os.environ['AZURE_OPENAI_ENDPOINT'].rstrip('\u002F')}\u002Fopenai\u002Fv1\u002F\",\n)\n\ntry:\n    resp = client.responses.create(\n        model=os.environ[\"AZURE_OPENAI_DEPLOYMENT\"],\n        input=\"ping\",\n        max_output_tokens=50,\n        store=False,\n    )\n    print(f\"✅ Deployment supports Responses API: {resp.output_text}\")\nexcept Exception as e:\n    print(f\"❌ Deployment does NOT support Responses API: {e}\")\n```\n\n> **Note**: `max_output_tokens` har en **minimum på 16** på Azure OpenAI. Værdier under 16 giver en 400-fejl. Brug 50+ til røgtest.\n\nHvis dette returnerer 404, understøtter deploymentens model endnu ikke Responses — se reference nedenfor eller deploy igen med en understøttet model.\n\n### 2. Tjek tilgængelige modeller i din region (anbefalet)\n\nKør det indbyggede modelkompatibilitetsværktøj for at se, hvad der er tilgængeligt med Responses API-understøttelse i din specifikke region:\n\n```bash\npython migrate.py models --subscription YOUR_SUB_ID --location YOUR_REGION\n```\n\nDette spørger Azure ARM live og viser en kompatibilitetsmatrix — hvilke modeller der understøtter Responses, struktureret output, værktøjer mv. Brug `--filter gpt-5.1,gpt-5.2` for at indsnævre resultater eller `--json` til scripting.\n\n### 3. Fuldt modelunderstøttelsesreference\n\n- **Live forespørgsel**: `python migrate.py models` (se ovenfor — regionsspecifik, altid opdateret)\n- **Gennemse tilgængelighed**: [Modeloversigtstabel og regions-tilgængelighed](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Ffoundry\u002Ffoundry-models\u002Fconcepts\u002Fmodels-sold-directly-by-azure?tabs=global-standard-aoai%2Cglobal-standard&pivots=azure-openai#model-summary-table-and-region-availability)\n- **Quickstart & vejledning**: **https:\u002F\u002Faka.ms\u002Fopenai\u002Fstart**\n\n### ⚠️ Ældre modelllimitations\n\n> **ADVARSEL**: Ældre modeller (dem før `gpt-4.1`) understøtter måske ikke alle Responses API-funktioner fuldt ud.\n>\n> Kendte begrænsninger med ældre modeller:\n> - **`reasoning`-parameter**: Ikke understøttet på mange ikke-reasoning modeller. Migrer kun `reasoning` hvis den allerede var til stede i originalkoden.\n> - **`seed`-parameter**: Ikke understøttet i Responses API overhovedet — fjern fra alle forespørgsler.\n> - **Struktureret output via `text.format`**: Ældre modeller håndhæver måske ikke `strict: true` JSON-skemaer pålideligt.\n> - **Værktøjsorkestrering**: GPT-5+ orkestrerer værktøjskald som del af intern reasoning. Ældre modeller på Responses fungerer stadig, men mangler denne dybe integration.\n> - **Temperaturbegrænsninger**: Når der migreres til `gpt-5`, skal temperaturen udelades eller sættes til `1`. Ældre modeller har ikke denne begrænsning.\n\n### O-seriens reasoning-modeller (o1, o3-mini, o3, o4-mini)\n\nO-seriens modeller har unikke parameterbegrænsninger. Ved migrering af apps, der målretter o-seriens modeller:\n\n- **`temperature`**: Skal være `1` (eller udelades). O-seriens modeller accepterer ikke andre værdier.\n- **`max_completion_tokens` → `max_output_tokens`**: Apps, der bruger Azure-specifikke `max_completion_tokens`, skal skifte til `max_output_tokens`. Sæt høje værdier (4096+) fordi reasoning tokens tæller mod grænsen.\n- **`reasoning_effort`**: Hvis appen bruger `reasoning_effort` (lav\u002Fmellem\u002Fhøj), behold den — Responses API understøtter denne parameter for o-seriens modeller.\n- **Streaming opførsel**: O-seriens modeller kan bufferere output indtil reasoning er fuldført før tekstdelta events udsendes. Streaming virker stadig, men første `response.output_text.delta` kan komme med længere forsinkelse end med GPT-modeller.\n- **`top_p`**: Ikke understøttet på o-serien — fjern hvis til stede.\n- **Værktøjsbrug**: O-seriens modeller understøtter værktøjer via Responses API på samme måde som GPT-modeller, men kvaliteten af værktøjskaldorkestrering varierer efter model.\n\n**Handling — proaktiv modelrådgivning**: Under scanningsfasen, tjek hvilken model appen målretter (deploymentsnavne, miljøvariabler, konfig). Hvis modellen er før `gpt-4.1` (ikke gpt-4.1+), informer brugeren proaktivt:\n- Migreringen vil fungere til basal tekst, chat, streaming og værktøjer på deres nuværende model.\n- Nyere modeller (`gpt-5.1`, `gpt-5.2`) tilbyder bedre værktøjsorkestrering, håndhævelse af struktureret output, reasoning og regionsovergribende tilgængelighed.\n- De bør overveje at opgradere deres deployment, når de er klar — det blokerer ikke migreringen.\n\nBloker eller afslå ikke migration baseret på modelversion. Rådgivningen er informativ.\n\n### GitHub Models understøtter IKKE Responses API\n\n> **GitHub Models (`models.github.ai`, `models.inference.ai.azure.com`) understøtter ikke Responses API.**\n\nHvis kodebasen har en GitHub Models kodevej (se efter `base_url` der peger på `models.github.ai` eller `models.inference.ai.azure.com`), **fjern den fuldstændigt** under migrationen. Responses API kræver Azure OpenAI, OpenAI eller et kompatibelt lokalt endpoint (fx Ollama med Responses-understøttelse).\n\nHandling under scanning:\n- Marker eventuelle GitHub Models kodeveje til fjernelse.\n\n---\n\n## Framework-migrering\n\nMange apps bruger højere niveau-rammeværk oven på OpenAI. Når disse migreres, ændres rammeværkets eget API — ikke kun de underliggende OpenAI-kald.\n\n### Microsoft Agent Framework (MAF)\n\n**Tjek din MAF-version først** — migreringen afhænger af om du bruger MAF 1.0.0+ eller en pre-1.0.0 beta\u002Frc.\n\n#### MAF 1.0.0+ (agent-framework-openai >= 1.0.0)\n\n`OpenAIChatClient` **bruger allerede Responses API** — ingen migration nødvendig. Hvis kodebasen bruger det gamle `OpenAIChatCompletionClient` (som bruger `chat.completions.create`), erstat det med `OpenAIChatClient`.\n\n| Før | Efter |\n|--------|-------|\n| `from agent_framework.openai import OpenAIChatCompletionClient` | `from agent_framework.openai import OpenAIChatClient` |\n| `OpenAIChatCompletionClient(...)` | `OpenAIChatClient(...)` |\n\nFor at tjekke din version: `python -c \"import agent_framework_openai; print(agent_framework_openai.__version__)\"`\n\n#### MAF pre-1.0.0 (beta\u002Frc-udgivelser)\n\nI pre-1.0.0 MAF brugte `OpenAIChatClient` Chat Completions. Opgrader til `agent-framework-openai>=1.0.0`, hvor `OpenAIChatClient` som standard bruger Responses API.\n\nIngen yderligere ændringer nødvendige — `Agent` og værktøjs-API'erne er uændrede.\n\n### LangChain (`langchain-openai`)\n\nTilføj `use_responses_api=True` til `ChatOpenAI()`. Opdater også adgang til svar fra `.content` til `.text`.\n\n| Før | Efter |\n|--------|-------|\n| `ChatOpenAI(model=..., base_url=..., api_key=...)` | `ChatOpenAI(model=..., base_url=..., api_key=..., use_responses_api=True)` |\n| `result['messages'][-1].content` | `result['messages'][-1].text` |\n\nFor komplette før\u002Fefter kodeeksempler, se [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Frontend-migreringsvejledning\n\n> **Responses API er en server-side bekymring.** Migrer din Python backend; frontendens HTTP-kontrakt bør forblive uændret medmindre din backend er en tynd formidler — i så fald overvej at anvende Responses requestformatet for at eliminere et oversættelseslag. Hvis frontend kalder OpenAI direkte med en klient-side nøgle, flyt disse kald til backend først.\n\n### `@microsoft\u002Fai-chat-protocol` deprecation\n\n`@microsoft\u002Fai-chat-protocol` npm-pakken er deprecated og bør erstattes med [`ndjson-readablestream`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fndjson-readablestream). Hvis du støder på den i en frontend:\n\n1. Erstat CDN script-tagget:\n   ```html\n   \u003C!-- Before -->\n   \u003Cscript src=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002F@microsoft\u002Fai-chat-protocol@...\u002Fdist\u002Fiife\u002Findex.js\">\u003C\u002Fscript>\n   \u003C!-- After -->\n   \u003Cscript src=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002Fndjson-readablestream@1.0.7\u002Fdist\u002Fndjson-readablestream.umd.js\">\u003C\u002Fscript>\n   ```\n2. Fjern `AIChatProtocolClient` instansieringen (`new ChatProtocol.AIChatProtocolClient(\"\u002Fchat\")`).\n3. Erstat `client.getStreamedCompletion(messages)` med et direkte `fetch()` kald til backend streaming endpoint.\n4. Erstat `for await (const response of result)` med `for await (const chunk of readNDJSONStream(response.body))`.\n5. Opdater ejendomsadgang fra `response.delta.content` \u002F `response.error` til `chunk.delta.content` \u002F `chunk.error`.\n\n---\n\n## Mål\n\n- Opregn alle Python-kaldsteder, der bruger Chat Completions eller legacy Completions mod Azure OpenAI.\n- Foreslå en migrationsplan og rækkefølge for Python-kodebasen.\n- Anvend sikre, minimale ændringer for at skifte til Responses API.\n- Opdater kaldere til at konsumere Responses outputskema; ingen bagudkompatible wrappers.\n- Kør tests\u002Flintere; ret trivielle brud forårsaget af migrationen.\n- Forbered små, gennemgåelige ændringssæt og giv en slutopsummering med diffs (commit ikke).\n\n---\n\n## Guardrails\n\n- Ændr kun filer inden for git workspace. Skriv aldrig udenfor.\n- Bevar ikke bagudkompatibilitets-shims; migrer kode til nyt API-format.\n- Efterlad ikke gravsten\u002Fovergangskommentarer eller backupfiler.\n- Bevar streamingsemantik hvis tidligere brugt; ellers brug ikke-streaming.\n- Spørg om godkendelse før kørsel af kommandoer eller netværkskald, hvis i godkendelsestilstand.\n- Kør ikke `git add`\u002F`git commit`\u002F`git push`; lav kun working-tree ændringer.\n\n---\n\n## Trin 0: Azure OpenAI Client Migration (Forudsætning)\n\nHvis kodebasen bruger `AzureOpenAI` eller `AsyncAzureOpenAI` konstruktører, migrer først til standard `OpenAI` \u002F `AsyncOpenAI` konstruktører. Azure-specifikke konstruktører er deprecated i `openai>=1.108.1`.\n\n### Hvorfor v1 API-sti?\n\nDet nye `\u002Fopenai\u002Fv1` endpoint bruger den standard `OpenAI()` klient i stedet for `AzureOpenAI()`, kræver ikke `api_version` parameter og virker ens på både OpenAI og Azure OpenAI. Samme klientkode er fremtidssikret — ingen versionstyring nødvendig.\n\n### Vigtige ændringer\n\n| Før | Efter |\n|--------|-------|\n| `AzureOpenAI` | `OpenAI` |\n| `AsyncAzureOpenAI` | `AsyncOpenAI` |\n| `azure_endpoint` | `base_url` |\n| `azure_ad_token_provider` | `api_key` |\n| `api_version=...` | Fjernes helt |\n\n### Rydde-op tjekliste\n\n- Fjern `api_version` argument fra klientkonstruktion.\n- Fjern `AZURE_OPENAI_VERSION` \u002F `AZURE_OPENAI_API_VERSION` miljøvariabler fra `.env`, appindstillinger og Bicep\u002Finfra filer.\n- Omdøb `AZURE_OPENAI_CLIENT_ID` → `AZURE_CLIENT_ID` i `.env`, appindstillinger, Bicep\u002Finfra og testfixtures (standard Azure Identity SDK-konvention).\n- Sikr `openai>=1.108.1` i `requirements.txt` eller `pyproject.toml`.\n\n### Miljøvariabel-migrering\n\n| Gammel env var | Handling | Noter |\n|-------------|--------|-------|\n| `AZURE_OPENAI_VERSION` | **Fjern** | Ingen `api_version` nødvendig med v1 endpoint |\n| `AZURE_OPENAI_API_VERSION` | **Fjern** | Samme som ovenfor |\n| `AZURE_OPENAI_CLIENT_ID` | **Omdøb** → `AZURE_CLIENT_ID` | Standard Azure Identity SDK-konvention for `ManagedIdentityCredential(client_id=...)` |\n| `AZURE_OPENAI_ENDPOINT` | **Behold** | Stadig nødvendig til `base_url` konstruktion |\n| `AZURE_OPENAI_CHAT_DEPLOYMENT` | **Behold** | Bruges som `model` param i `responses.create` |\n| `AZURE_OPENAI_API_KEY` | **Behold** | Bruges som `api_key` til nøglebaseret auth |\n\nFor klientopsætningskodeeksempler (sync, async, EntraID, API key, multi-tenant), se [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Trin 1: Opdag Legacy Kaldssteder\n\nKør [detect_legacy.py](..\u002F..\u002F..\u002F..\u002F..\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py) scriptet for at finde alle kaldssteder til migration:\n\n```bash\npython skills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py .\n```\n\nEller kør disse søgninger manuelt — hvert match er et migrationsmål:\n\n```bash\n# Gammelt API-kald (skal omskrives)\nrg \"chat\\.completions\\.create\"\nrg \"ChatCompletion\\.create\"\nrg \"Completion\\.create\"\n\n# Forældede Azure-klientkonstruktører (skal erstattes)\nrg \"AzureOpenAI\\(\"\nrg \"AsyncAzureOpenAI\\(\"\n\n# Mønstre for adgang til svarform (skal opdateres)\nrg \"choices\\[0\\]\\.message\\.content\"\nrg \"choices\\[0\\]\\.delta\\.content\"\nrg \"choices\\[0\\]\\.message\\.function_call\"\nrg \"choices\\[0\\]\\.message\\.tool_calls\"\n\n# Værktøjsdefinitioner i gammelt indlejret format (skal flades ud)\nrg '\"function\":\\s*{\\s*\"name\"'\nrg \"pydantic_function_tool\"\n\n# Værktøjsresultater i gammelt format (skal konverteres til function_call_output)\nrg '\"role\":\\s*\"tool\"'\nrg '\"tool_call_id\"'\n\n# Forældede parametre (skal fjernes eller omdøbes)\nrg \"response_format\"\nrg \"max_tokens\\b\"        # omdøb til max_output_tokens\nrg \"['\\\"]seed['\\\"]\"      # remove entirely\n\n# Forældede miljøvariable (ryd op)\nrg \"AZURE_OPENAI_API_VERSION|AZURE_OPENAI_VERSION\"\nrg \"AZURE_OPENAI_CLIENT_ID\"  # bør være AZURE_CLIENT_ID\n\n# GitHub Models endepunkter (skal fjernes — Responses API understøttes ikke)\nrg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"\n\n# Framework-niveau gamle mønstre (skal opdateres)\nrg \"OpenAIChatCompletionClient\"  # MAF 1.0.0+: erstat med OpenAIChatClient\nrg \"ChatOpenAI\\(\" | grep -v \"use_responses_api\"  # LangChain: kræver use_responses_api=True\n\n# Testinfrastruktur (skal opdateres)\nrg \"ChatCompletionChunk|AsyncCompletions\\.create\" tests\u002F\nrg \"_azure_ad_token_provider\" tests\u002F\nrg \"prompt_filter_results|content_filter_results\" tests\u002F\nrg \"choices\\[0\\]\" tests\u002F\n\n# Adgang til fejlindhold i content filter (skal opdateres — struktur ændret)\nrg 'innererror.*content_filter_result|error\\.body\\[\"innererror\"\\]'\nrg \"content_filter_result\\[\" # gammel entalsform — nu content_filter_results (flertal) i content_filters-arrayet\n\n# Rå HTTP-kald til Chat Completions endepunkt (skal opdatere URL)\nrg \"\u002Fopenai\u002Fdeployments\u002F.*\u002Fchat\u002Fcompletions\"\nrg \"api-version=\"\n```\n\n### Heuristikker (opdag og omskriv)\n\n- **Chat Completions klient**: `client.chat.completions.create` → `client.responses.create(...)`.\n\n- **Azure client-konstruktører**: `AzureOpenAI(...)` → `OpenAI(base_url=..., api_key=...)`.\n- **Værktøjer**: konverter funktionskaldsværktøjsdefinitioner fra indlejret format (`{\"type\": \"function\", \"function\": {\"name\": ...}}`) til fladt Responses-format (`{\"type\": \"function\", \"name\": ...}`); brug `tool_choice`; returner værktøjsresultater som `{\"type\": \"function_call_output\", \"call_id\": ..., \"output\": ...}`-elementer (ikke `{\"role\": \"tool\", ...}`).\n- **Værktøj-rundrejser**: når modellen returnerer funktionskald, tilføj `response.output`-elementer til samtalen (ikke en manuel `{\"role\": \"assistant\", \"tool_calls\": [...]}`-ordbog), og tilføj derefter `function_call_output`-elementer for hvert resultat.\n- **Få-skud værktøjseksempler**: hvis samtalen indeholder hårdkodede værktøjskaldseksempler, konverter dem til `{\"type\": \"function_call\", \"id\": \"fc_...\", \"call_id\": \"fc_...\", ...}` + `{\"type\": \"function_call_output\", ...}`-elementer. ID’er skal starte med `fc_`.\n- **`pydantic_function_tool()`**: denne hjælpefunktion genererer stadig det gamle indlejrede format og er **ikke kompatibel** med `responses.create()`. Erstat med manuelle værktøjsdefinitioner eller en fladgørende wrapper.\n- **Multi-turn**: vedligehold samtalehistorik i appen; giv tidligere runder via `input`-elementer.\n- **Formatering**: erstat Chats topniveau `response_format` med `text.format` i Responses. Kanonisk form: `text={\"format\": {\"type\": \"json_schema\", \"name\": \"Output\", \"strict\": True, \"schema\": {...}}}`.\n- **Indholdselementer**: erstat Chats `content[].type: \"text\"` med Responses `content[].type: \"input_text\"` for bruger\u002Fsystem-runder.\n- **Billedeindholdselementer**: erstat Chats `content[].type: \"image_url\"` med Responses `content[].type: \"input_image\"`. Feltet `image_url` ændres fra et indlejret objekt `{\"url\": \"...\"}` til en flad streng. Se snydearket for før\u002Fefter-eksempler.\n- **Begrundelsesindsats**: **migrer kun `reasoning`, hvis det allerede findes i den oprindelige kode**.\n- **Fejlbehandling ved indholdsfilter**: fejlens kropsstruktur ændret. Chat Completion brugte `error.body[\"innererror\"][\"content_filter_result\"]` (ental); Responses API bruger `error.body[\"content_filters\"][0][\"content_filter_results\"]` (flertal, inde i en liste). Kode, der tilgår `innererror`, vil udløse `KeyError`. Omskriv for at bruge den nye sti.\n- **Rå HTTP-kald**: hvis appen kalder Azure OpenAI REST API direkte (via `requests`, `httpx` osv.) med `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions?api-version=...`, omskriv til `\u002Fopenai\u002Fv1\u002Fresponses`. Anmodningsbody ændres: `messages` → `input`, tilføj `max_output_tokens` og `store: false`, fjern `api-version` query-param. Responsbody ændres: `choices[0].message.content` → `output[0].content[0].text` (bemærk: `output_text` er en SDK-bekvemmelighedsegenskab, som ikke findes i rå REST JSON).\n\n---\n\n## Trin 2: Anvend migration\n\n### Migrationsnoter (Chat Completions → Responses)\n\n- **Hvorfor migrere**: Responses er den samlede API for tekst, værktøjer og streaming; Chat Completions er legacy. Med GPT-5 kræves Responses for bedste ydelse.\n- **HTTP**: Azure-endpoint skifter fra `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions` til `\u002Fopenai\u002Fv1\u002Fresponses`.\n- **Felter**: `messages` → `input`, `max_tokens` → `max_output_tokens`. `temperature` forbliver.\n- **Formatering**: `response_format` → `text.format` med et korrekt objekt.\n- **Indholdselementer**: Erstat Chats `content[].type: \"text\"` med Responses `content[].type: \"input_text\"` for system-\u002Fbruger-runder.\n- **Billedeindholdselementer**: Erstat Chats `content[].type: \"image_url\"` med Responses `content[].type: \"input_image\"`. Fladgør `image_url`-feltet fra `{\"image_url\": {\"url\": \"...\"}}` til `{\"image_url\": \"...\"}` (en almindelig streng – enten en HTTPS-URL eller en `data:image\u002F...;base64,...` data-URI).\n\n### Reference for parametermapping\n\n| Chat Completions | Responses API |\n|-----------------|---------------|\n| `prompt` | `input` |\n| `messages` | `input` (array af elementer) |\n| `max_tokens` | `max_output_tokens` |\n| `response_format` | `text.format` (objekt) |\n| `temperature` | `temperature` (uændret) |\n| `stop` | `stop` (uændret) |\n| `frequency_penalty` | `frequency_penalty` (uændret) |\n| `presence_penalty` | `presence_penalty` (uændret) |\n| `tools` \u002F funktion-kald | `tools` (uændret) |\n| `seed` | **Fjern** (ikke understøttet) |\n| `store` | `store` (sættes til `false`) |\n| `content[].type: \"text\"` | `content[].type: \"input_text\"` |\n| `content[].type: \"image_url\"` | `content[].type: \"input_image\"` |\n| `\"image_url\": {\"url\": \"...\"}` | `\"image_url\": \"...\"` (flad streng) |\n\nFor komplette før\u002Fefter kodeeksempler, se [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\nFor testinfrastruktur-migration (mocks, snapshots, assertions), se [test-migration.md](.\u002Freferences\u002Ftest-migration.md).\n\nFor fejlsøgning af fejl og faldgruber, se [troubleshooting.md](.\u002Freferences\u002Ftroubleshooting.md).\n\n---\n\n## Dataopbevaring & Tilstand\n\n- Angiv `store: false` på alle Responses-anmodninger.\n- Stol ikke på tidligere meddelelses-ID’er eller serverlagret kontekst; hold tilstand klientstyret og minimer metadata.\n\n---\n\n## Acceptkriterier\n\n### Kode-niveau porte (alle skal bestås)\n\n- [ ] Ingen match for `rg \"chat\\.completions\\.create|ChatCompletion\\.create|Completion\\.create\"` i migrerede filer.\n- [ ] Ingen match for `rg \"AzureOpenAI\\(|AsyncAzureOpenAI\\(\"` — alle konstruktører bruger `OpenAI`\u002F`AsyncOpenAI` med v1 endpoint.\n- [ ] Ingen match for `rg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"` — GitHub Models kodeveje fjernet.\n- [ ] Ingen match for `rg \"OpenAIChatCompletionClient\"` — MAF 1.0.0+ kode bruger `OpenAIChatClient` (som bruger Responses API). I pre-1.0.0, opgradér til `agent-framework-openai>=1.0.0`.\n- [ ] Alle `ChatOpenAI(...)` kald inkluderer `use_responses_api=True`.\n- [ ] Ingen match for `rg \"choices\\[0\\]\"` — al responsadgang bruger `resp.output_text` eller Responses output-skema.\n- [ ] Intet `response_format` på topniveau; al struktureret output bruger `text={\"format\": {...}}`.\n- [ ] `openai>=1.108.1` og `azure-identity` i `requirements.txt` eller `pyproject.toml`; afhængigheder geninstalleret.\n- [ ] `store=False` sat på hvert `responses.create` kald.\n- [ ] Ingen `api_version` i klientkonstruktion; `AZURE_OPENAI_API_VERSION` fjernet fra miljøfiler og infrastruktur.\n\n### Testinfrastrukturporte (alle skal bestås)\n\n- [ ] Ingen match for `rg \"ChatCompletionChunk|AsyncCompletions\\.create|chat\\.completions\" tests\u002F`.\n- [ ] Ingen match for `rg \"_azure_ad_token_provider\" tests\u002F` — assertions opdateret til at tjekke `isinstance(client, AsyncOpenAI)` eller `base_url`.\n- [ ] Ingen match for `rg \"prompt_filter_results|content_filter_results\" tests\u002F` — Azure-specifikke filtermocks fjernet.\n- [ ] Mock-faciliteter bruger `kwargs.get(\"input\")` ikke `kwargs.get(\"messages\")`.\n- [ ] Snapshot \u002F golden filer opdateret til Responses streaming format (ingen `choices[0]`, `function_call`, `logprobs` osv.).\n- [ ] `pytest` kører uden fejl efter alle testopdateringer.\n\n### Adfærdsporte (verificer manuelt eller via testværktøj)\n\n- [ ] **Basal completion**: ikke-streamende `responses.create` returnerer ikke-tom `output_text`.\n- [ ] **Stream-paritet**: hvis den oprindelige kode brugte streaming, streamer den migrerede kode og udgiver `response.output_text.delta` events med ikke-tomme deltaer.\n- [ ] **Struktureret output**: hvis `text.format` bruges med `json_schema`, lykkes `json.loads(resp.output_text)` og matcher skemaet.\n- [ ] **Værktøjskaldsløkke**: hvis værktøjer bruges, laver modellen værktøjskald, appen udfører dem, og den efterfølgende anmodning returnerer finalt `output_text` (ingen uendelig løkke).\n- [ ] **Async-paritet**: hvis `AsyncAzureOpenAI` blev brugt, fungerer `AsyncOpenAI`-ækvivalent med `await`.\n- [ ] **Fejlrate**: ingen nye 400\u002F401\u002F404 fejl i forhold til før-migrationsbaselinen.\n\n### Leverancer\n\n- Resume omfatter redigerede filer, før\u002Fefter optællinger af legacy-kaldsteder og næste skridt.\n- Ændringer er kun working-tree redigeringer (ingen commits).\n\n---\n\n## SDK Versionskrav\n\n| Pakke | Minimum Version |\n|---------|----------------|\n| `openai` | `>=1.108.1` |\n| `azure-identity` | Seneste (for EntraID-auth) |\n\n---\n\n## Referencer\n\n- [Snydeark — alle kodeudsnit](.\u002Freferences\u002Fcheat-sheet.md)\n- [Testmigration — mocks, snapshots, assertions](.\u002Freferences\u002Ftest-migration.md)\n- [Fejlfinding — fejl, risikotabel, faldgruber](.\u002Freferences\u002Ftroubleshooting.md)\n- [detect_legacy.py — automatisk scanner](..\u002F..\u002F..\u002F..\u002F..\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py)\n- [Azure OpenAI Starter Kit](https:\u002F\u002Faka.ms\u002Fopenai\u002Fstart)\n- [Azure OpenAI Responses API dokumentation](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fhow-to\u002Fresponses)\n- [Azure OpenAI API versionslivscyklus](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fapi-version-lifecycle?view=foundry-classic&tabs=python#api-evolution)\n- [OpenAI Responses API reference](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fresponses)\n\n---\n\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Ansvarsfraskrivelse**:\nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https:\u002F\u002Fgithub.com\u002FAzure\u002Fco-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER END -->",{"name":5,"license":14},"main","f09e94ffe170f8af6d3db7c42987bbe4db227723","translations\u002Fda\u002F.agents\u002Fskills\u002Fazure-openai-to-responses",26019,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners","https:\u002F\u002Faka.ms\u002Fai-agents-beginners","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-07 12:51:12",{"source":7,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add microsoft\u002Fai-agents-for-beginners --skill azure-openai-to-responses",{"tool":40,"command":41},"bunx","bunx skills add microsoft\u002Fai-agents-for-beginners --skill azure-openai-to-responses",{"tool":43,"command":44},"pnpm","pnpm dlx skills add microsoft\u002Fai-agents-for-beginners --skill azure-openai-to-responses","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fda\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002FSKILL.md",true,[48,54,58,62,66,70,74,78,82,86,90],{"path":49,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":52,"sourceHtmlUrl":53},"references\u002Fcheat-sheet.md","REFERENCE","参考文档",28815,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fda\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Freferences\u002Fcheat-sheet.md",{"path":55,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":56,"sourceHtmlUrl":57},"references\u002Ftest-migration.md",7216,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fda\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Freferences\u002Ftest-migration.md",{"path":59,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":60,"sourceHtmlUrl":61},"references\u002Ftroubleshooting.md",15338,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fda\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Freferences\u002Ftroubleshooting.md",{"path":63,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":64,"sourceHtmlUrl":65},"research.template.md",581,"https:\u002F\u002Fgithub.com\u002Fsherryswift1019-gif\u002FAI-DZHT\u002Fblob\u002Fmain\u002F_bmad\u002Fbmm\u002F1-analysis\u002Fresearch\u002Fbmad-technical-research\u002Fresearch.template.md",{"path":67,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":68,"sourceHtmlUrl":69},"technical-steps\u002Fstep-01-init.md",5581,"https:\u002F\u002Fgithub.com\u002Fsherryswift1019-gif\u002FAI-DZHT\u002Fblob\u002Fmain\u002F_bmad\u002Fbmm\u002F1-analysis\u002Fresearch\u002Fbmad-technical-research\u002Ftechnical-steps\u002Fstep-01-init.md",{"path":71,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":72,"sourceHtmlUrl":73},"technical-steps\u002Fstep-02-technical-overview.md",9447,"https:\u002F\u002Fgithub.com\u002Fsherryswift1019-gif\u002FAI-DZHT\u002Fblob\u002Fmain\u002F_bmad\u002Fbmm\u002F1-analysis\u002Fresearch\u002Fbmad-technical-research\u002Ftechnical-steps\u002Fstep-02-technical-overview.md",{"path":75,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":76,"sourceHtmlUrl":77},"technical-steps\u002Fstep-03-integration-patterns.md",9995,"https:\u002F\u002Fgithub.com\u002Fsherryswift1019-gif\u002FAI-DZHT\u002Fblob\u002Fmain\u002F_bmad\u002Fbmm\u002F1-analysis\u002Fresearch\u002Fbmad-technical-research\u002Ftechnical-steps\u002Fstep-03-integration-patterns.md",{"path":79,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":80,"sourceHtmlUrl":81},"technical-steps\u002Fstep-04-architectural-patterns.md",7212,"https:\u002F\u002Fgithub.com\u002Fsherryswift1019-gif\u002FAI-DZHT\u002Fblob\u002Fmain\u002F_bmad\u002Fbmm\u002F1-analysis\u002Fresearch\u002Fbmad-technical-research\u002Ftechnical-steps\u002Fstep-04-architectural-patterns.md",{"path":83,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":84,"sourceHtmlUrl":85},"technical-steps\u002Fstep-05-implementation-research.md",7774,"https:\u002F\u002Fgithub.com\u002Fsherryswift1019-gif\u002FAI-DZHT\u002Fblob\u002Fmain\u002F_bmad\u002Fbmm\u002F1-analysis\u002Fresearch\u002Fbmad-technical-research\u002Ftechnical-steps\u002Fstep-05-implementation-research.md",{"path":87,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":88,"sourceHtmlUrl":89},"technical-steps\u002Fstep-06-research-synthesis.md",21056,"https:\u002F\u002Fgithub.com\u002Fsherryswift1019-gif\u002FAI-DZHT\u002Fblob\u002Fmain\u002F_bmad\u002Fbmm\u002F1-analysis\u002Fresearch\u002Fbmad-technical-research\u002Ftechnical-steps\u002Fstep-06-research-synthesis.md",{"path":91,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":92,"sourceHtmlUrl":93},"workflow.md",2311,"https:\u002F\u002Fgithub.com\u002Fsherryswift1019-gif\u002FAI-DZHT\u002Fblob\u002Fmain\u002F_bmad\u002Fbmm\u002F1-analysis\u002Fresearch\u002Fbmad-technical-research\u002Fworkflow.md",[95,113,124,132,140,147],{"skillNo":96,"name":97,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":110,"publishedAt":19},"01M69A206TRZ8KK0CW0HYJF5V5","testing-course-samples","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fzh-TW\u002F.agents\u002Fskills\u002Ftesting-course-samples\u002FSKILL.md",[100,105],{"categoryNo":101,"categoryName":102,"taxonomyType":103,"taxonomyTypeDesc":104},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":106,"categoryName":107,"taxonomyType":108,"taxonomyTypeDesc":109},"01JBSEEDCAT000000000000039","教师与教育","PROFESSION","适用职业",[111,112],"testing","testing course samples",{"skillNo":114,"name":115,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":121,"publishedAt":19},"01M69A1XRB2SFHYRMEH0K08EKZ","microsoft-docs","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fzh-TW\u002F.agents\u002Fskills\u002Fmicrosoft-docs\u002FSKILL.md",[118],{"categoryNo":119,"categoryName":120,"taxonomyType":103,"taxonomyTypeDesc":104},"01JBSEEDCAT000000000000023","Skill与智能体开发",[122,8,123],"docs","microsoft docs",{"skillNo":125,"name":126,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":19},"01M69A1VPZFJQ1HNGTZQ5P3WSC","local-ai-agents","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fzh-TW\u002F.agents\u002Fskills\u002Flocal-ai-agents\u002FSKILL.md",[],[130,131],"ai agents","local ai agents",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":138,"publishedAt":19},"01M69A1S947N7MM6V9JF85S2E7","jupyter-notebook","當使用者要求建立、搭建或編輯 Jupyter 筆記本（`.ipynb`）用於實驗、探索或教學時使用；優先使用隨附範本並執行輔助腳本 `new_notebook.py` 來產生一個乾淨的起始筆記本。","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fzh-TW\u002F.agents\u002Fskills\u002Fjupyter-notebook\u002FSKILL.md",[],[139],"jupyter notebook",{"skillNo":141,"name":142,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":145,"publishedAt":19},"01M69A1Q8EXPWKZSQK69V6WF22","deploying-scalable-agents","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fzh-TW\u002F.agents\u002Fskills\u002Fdeploying-scalable-agents\u002FSKILL.md",[],[146],"deploying scalable agents",{"skillNo":148,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":151,"publishedAt":19},"01M69A1MHZTH3RH9N8VYSYG74X","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fzh-TW\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002FSKILL.md",[],[18]]