[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M699PH702CDMYBHF1BQ2HGTN":3,"skill-same:01M699PH702CDMYBHF1BQ2HGTN":62},{"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},"01M699PH702CDMYBHF1BQ2HGTN","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\u002Fnl\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# Migreer Python-apps van Azure OpenAI Chat Completions naar Responses API\n\n> **OFFICIËLE RICHTLIJNEN — VOLG PRECIES**\n>\n> Deze skill migreert Python-codebases die Azure OpenAI Chat Completions gebruiken\n> naar de uniforme Responses API. Volg deze instructies nauwkeurig.\n> Improviseer geen parameter-mappingen of bedenk geen API-structuren.\n\n---\n\n## Triggers\n\nActiveer deze skill wanneer de gebruiker wil:\n- Een Python-app migreren van Azure OpenAI Chat Completions naar Responses API\n- Gebruik van Python OpenAI SDK upgraden naar de nieuwste API-structuur tegen Azure OpenAI\n- Python-code voorbereiden voor GPT-5 of nieuwere modellen die Responses op Azure vereisen\n- Overschakelen van `AzureOpenAI`\u002F`AsyncAzureOpenAI` naar de standaard `OpenAI`\u002F`AsyncOpenAI` client met de v1 endpoint\n- Deprecation-waarschuwingen oplossen gerelateerd aan `AzureOpenAI` constructors of `api_version`\n\n---\n\n## ⚠️ Modelcompatibiliteit — EERST CONTROLEREN\n\n> **Controleer vóór migratie of je Azure OpenAI deployment de Responses API ondersteunt.**\n\n### 1. Voer een snelle test uit op je deployment (snelste)\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> **Opmerking**: `max_output_tokens` heeft een **minimum van 16** op Azure OpenAI. Waarden lager dan 16 geven een 400-fout. Gebruik voor snelle tests 50+.\n\nAls dit een 404 retourneert, ondersteunt het model van de deployment Responses nog niet — controleer de referentie hieronder of herdeploy met een ondersteund model.\n\n### 2. Controleer beschikbare modellen in je regio (aanbevolen)\n\nVoer de ingebouwde modelcompatibiliteitstool uit om te zien wat beschikbaar is met Responses API-ondersteuning in jouw specifieke regio:\n\n```bash\npython migrate.py models --subscription YOUR_SUB_ID --location YOUR_REGION\n```\n\nDit vraagt Azure ARM live op en toont een compatibiliteitsmatrix — welke modellen Responses, gestructureerde output, tools etc. ondersteunen. Gebruik `--filter gpt-5.1,gpt-5.2` om resultaten te filteren of `--json` voor scripting.\n\n### 3. Volledige modelondersteuning referentie\n\n- **Live query**: `python migrate.py models` (zie hierboven — regio-specifiek, altijd up-to-date)\n- **Bekijk beschikbaarheid**: [Modeloverzichtstabel en regio-beschikbaarheid](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 & richtlijnen**: **https:\u002F\u002Faka.ms\u002Fopenai\u002Fstart**\n\n### ⚠️ Beperkingen van oudere modellen\n\n> **WAARSCHUWING**: Oudere modellen (voor `gpt-4.1`) ondersteunen mogelijk niet alle functies van de Responses API volledig.\n>\n> Bekende beperkingen van oudere modellen:\n> - **`reasoning` parameter**: Niet ondersteund op veel niet-redenerende modellen. Migreer `reasoning` alleen als het al in de originele code aanwezig was.\n> - **`seed` parameter**: Helemaal niet ondersteund in Responses API — verwijder uit alle verzoeken.\n> - **Gestructureerde output via `text.format`**: Oudere modellen kunnen `strict: true` JSON-schema's mogelijk niet betrouwbaar afdwingen.\n> - **Toolorkestratie**: GPT-5+ orkestreert toolaanroepen als onderdeel van interne reasoning. Oudere modellen op Responses werken nog steeds maar missen deze diepe integratie.\n> - **Temperatuurbeperkingen**: Bij migratie naar `gpt-5` moet temperatuur worden weggelaten of op `1` gezet. Oudere modellen hebben hier geen beperking.\n\n### O-serie reasoning modellen (o1, o3-mini, o3, o4-mini)\n\nO-serie modellen hebben unieke parameterbeperkingen. Bij migratie van apps die o-serie modellen gebruiken:\n\n- **`temperature`**: Moet `1` zijn (of weggelaten). O-serie modellen accepteren geen andere waarden.\n- **`max_completion_tokens` → `max_output_tokens`**: Apps die de Azure-specifieke `max_completion_tokens` gebruiken moeten overstappen op `max_output_tokens`. Stel hoge waarden (4096+) in omdat reasoning-tokens meetellen voor de limiet.\n- **`reasoning_effort`**: Als de app `reasoning_effort` gebruikt (laag\u002Fmiddel\u002Fhoog), behoud het — Responses API ondersteunt deze parameter voor o-serie modellen.\n- **Streaming-gedrag**: O-serie modellen kunnen output bufferen tot reasoning voltooid is voor ze tekst-delta gebeurtenissen uitsturen. Streaming werkt nog steeds, maar de eerste `response.output_text.delta` kan later arriveren dan bij GPT-modellen.\n- **`top_p`**: Niet ondersteund op o-serie — verwijder indien aanwezig.\n- **Toolgebruik**: O-serie modellen ondersteunen tools via Responses API net als GPT modellen, maar kwaliteit van tool-aanroeporkestratie varieert per model.\n\n**Actie — proactieve modeladviezen**: Tijdens de scanfase controleren welk model de app target (deploymentnamen, omgevingsvariabelen, configuratie). Als het model ouder is dan `gpt-4.1` (dus niet gpt-4.1+), vertel de gebruiker proactief:\n- De migratie werkt voor basis tekst, chat, streaming en tools op het huidige model.\n- Nieuwere modellen (`gpt-5.1`, `gpt-5.2`) bieden betere toolorkestratie, afdwingen van gestructureerde output, reasoning, en cross-region beschikbaarheid.\n- Ze zouden hun deployment kunnen upgraden als ze willen — het blokkeert de migratie niet.\n\nBlokkeer of weiger niet te migreren op basis van modelversie. Het advies is informatief.\n\n### GitHub Models ondersteunt WELKE Responses API NIET\n\n> **GitHub Models (`models.github.ai`, `models.inference.ai.azure.com`) ondersteunt de Responses API NIET.**\n\nAls de codebase een GitHub Models codepad heeft (zoek naar `base_url` die wijst naar `models.github.ai` of `models.inference.ai.azure.com`), **verwijder dit volledig** tijdens migratie. De Responses API vereist Azure OpenAI, OpenAI, of een compatibele lokale endpoint (bijv. Ollama met Responses ondersteuning).\n\nActie tijdens scan:\n- Markeer alle GitHub Models codepaden voor verwijdering.\n\n---\n\n## Framework-migratie\n\nVeel apps gebruiken hogere frameworks bovenop OpenAI. Bij migratie hiervan verandert ook de eigen API van het framework — niet alleen de onderliggende OpenAI-aanroepen.\n\n### Microsoft Agent Framework (MAF)\n\n**Controleer eerst je MAF-versie** — migratie hangt af van of je MAF 1.0.0+ of een pre-1.0.0 beta\u002Frc gebruikt.\n\n#### MAF 1.0.0+ (agent-framework-openai >= 1.0.0)\n\n`OpenAIChatClient` **gebruikt al de Responses API** — migratie niet nodig. Als de codebase de legacy `OpenAIChatCompletionClient` gebruikt (met `chat.completions.create`), vervang dit door `OpenAIChatClient`.\n\n| Voor | Na |\n|--------|-------|\n| `from agent_framework.openai import OpenAIChatCompletionClient` | `from agent_framework.openai import OpenAIChatClient` |\n| `OpenAIChatCompletionClient(...)` | `OpenAIChatClient(...)` |\n\nOm versie te controleren: `python -c \"import agent_framework_openai; print(agent_framework_openai.__version__)\"`\n\n#### MAF pre-1.0.0 (beta\u002Frc releases)\n\nIn pre-1.0.0 MAF gebruikte `OpenAIChatClient` Chat Completions. Upgrade naar `agent-framework-openai>=1.0.0` waar `OpenAIChatClient` standaard Responses API gebruikt.\n\nGeen andere veranderingen nodig — `Agent` en tool APIs blijven ongewijzigd.\n\n### LangChain (`langchain-openai`)\n\nVoeg `use_responses_api=True` toe aan `ChatOpenAI()`. Update ook response-access van `.content` naar `.text`.\n\n| Voor | Na |\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\nVoor volledige voor\u002Fna codevoorbeelden, zie [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Frontend Migratie Richtlijnen\n\n> **De Responses API is een server-side aangelegenheid.** Migreer je Python backend; het HTTP-contract van de frontend moet ongewijzigd blijven tenzij je backend een lichte doorgeeflaag is — overweeg dan de Responses request-structuur te adopteren om een vertaallaag te elimineren. Als de frontend OpenAI direct aanroept met een client-side sleutel, verplaats die aanroepen eerst naar een backend.\n\n### `@microsoft\u002Fai-chat-protocol` deprecieerd\n\nHet `@microsoft\u002Fai-chat-protocol` npm-pakket is deprecated en moet vervangen worden door [`ndjson-readablestream`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fndjson-readablestream). Als je het in een frontend tegenkomt:\n\n1. Vervang het CDN script-tag:\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. Verwijder de instantie van `AIChatProtocolClient` (`new ChatProtocol.AIChatProtocolClient(\"\u002Fchat\")`).\n3. Vervang `client.getStreamedCompletion(messages)` door een rechtstreekse `fetch()` call naar de backend streaming endpoint.\n4. Vervang `for await (const response of result)` door `for await (const chunk of readNDJSONStream(response.body))`.\n5. Update property-toegang van `response.delta.content` \u002F `response.error` naar `chunk.delta.content` \u002F `chunk.error`.\n\n---\n\n## Doelen\n\n- Alle Python aanroepplaatsen enumereren die Chat Completions of legacy Completions tegen Azure OpenAI gebruiken.\n- Een migratieplan en ordening voor de Python-codebase voorstellen.\n- Veilige, minimale aanpassingen doorvoeren om over te schakelen naar Responses API.\n- Aanroepen bijwerken om de Responses output-schema te consumeren; geen backcompat wrappers.\n- Tests\u002Flints uitvoeren; triviale breuken door migratie oplossen.\n- Kleine, reviewbare wijzigingssets voorbereiden en een eindoverzicht met diffs leveren (niet commiten).\n\n---\n\n## Beveiligingen\n\n- Alleen bestanden binnen de git workspace wijzigen. Nooit buiten schrijven.\n- Bewaar geen backward compatibiliteit shims; migreer code naar de nieuwe API-structuur.\n- Laat geen grafsteen-\u002Ftransitiecommentaren of backupbestanden achter.\n- Streaming-semantiek behouden indien eerder gebruikt; anders niet-streaming gebruiken.\n- Vraag goedkeuring vóór het uitvoeren van commando's of netwerk-aanroepen als je in goedkeuringsmodus bent.\n- Voer geen `git add`\u002F`git commit`\u002F`git push` uit; lever alleen werkende-tree wijzigingen.\n\n---\n\n## Stap 0: Azure OpenAI Client Migratie (Vereiste)\n\nAls de codebase `AzureOpenAI` of `AsyncAzureOpenAI` constructors gebruikt, migreer dan eerst naar de standaard `OpenAI` \u002F `AsyncOpenAI` constructors. De Azure-specifieke constructors zijn deprecated in `openai>=1.108.1`.\n\n### Waarom het v1 API-pad?\n\nHet nieuwe `\u002Fopenai\u002Fv1` endpoint gebruikt de standaard `OpenAI()` client in plaats van `AzureOpenAI()`, vereist geen `api_version` parameter, en werkt identiek op OpenAI en Azure OpenAI. Dezelfde client-code is toekomstbestendig — geen versiebeheer nodig.\n\n### Belangrijkste wijzigingen\n\n| Voor | Na |\n|--------|-------|\n| `AzureOpenAI` | `OpenAI` |\n| `AsyncAzureOpenAI` | `AsyncOpenAI` |\n| `azure_endpoint` | `base_url` |\n| `azure_ad_token_provider` | `api_key` |\n| `api_version=...` | Helemaal verwijderen |\n\n### Opschoonchecklist\n\n- Verwijder het `api_version` argument uit client-constructie.\n- Verwijder `AZURE_OPENAI_VERSION` \u002F `AZURE_OPENAI_API_VERSION` omgevingsvariabelen uit `.env`, app-instellingen en Bicep\u002Finfra-bestanden.\n- Hernoem `AZURE_OPENAI_CLIENT_ID` → `AZURE_CLIENT_ID` in `.env`, app-instellingen, Bicep\u002Finfra, en testfixtures (standaard Azure Identity SDK conventie).\n- Zorg dat `openai>=1.108.1` in `requirements.txt` of `pyproject.toml` staat.\n\n### Migratie van omgevingsvariabelen\n\n| Oude env var | Actie | Opmerkingen |\n|-------------|--------|-----------|\n| `AZURE_OPENAI_VERSION` | **Verwijderen** | Geen `api_version` nodig met v1 endpoint |\n| `AZURE_OPENAI_API_VERSION` | **Verwijderen** | Zelfde als hierboven |\n| `AZURE_OPENAI_CLIENT_ID` | **Hernoemen** → `AZURE_CLIENT_ID` | Standaard Azure Identity SDK conventie voor `ManagedIdentityCredential(client_id=...)` |\n| `AZURE_OPENAI_ENDPOINT` | **Behoud** | Nog steeds nodig voor `base_url` constructie |\n| `AZURE_OPENAI_CHAT_DEPLOYMENT` | **Behoud** | Wordt gebruikt als `model` parameter in `responses.create` |\n| `AZURE_OPENAI_API_KEY` | **Behoud** | Wordt gebruikt als `api_key` voor sleutelgebaseerde authenticatie |\n\nVoor client-setup codevoorbeelden (sync, async, EntraID, API key, multi-tenant), zie [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Stap 1: Legacy aanroepplaatsen detecteren\n\nVoer het script [detect_legacy.py](..\u002F..\u002F..\u002F..\u002F..\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py) uit om alle aanroepplaatsen te vinden die migratie nodig hebben:\n\n```bash\npython skills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py .\n```\n\nOf voer deze zoekopdrachten handmatig uit — elke match is een migratiedoel:\n\n```bash\n# Legacy API-aanroepen (moeten herschreven worden)\nrg \"chat\\.completions\\.create\"\nrg \"ChatCompletion\\.create\"\nrg \"Completion\\.create\"\n\n# Verouderde Azure clientconstructors (moeten vervangen worden)\nrg \"AzureOpenAI\\(\"\nrg \"AsyncAzureOpenAI\\(\"\n\n# Toegangsmodellen voor responsvorm (moeten bijgewerkt worden)\nrg \"choices\\[0\\]\\.message\\.content\"\nrg \"choices\\[0\\]\\.delta\\.content\"\nrg \"choices\\[0\\]\\.message\\.function_call\"\nrg \"choices\\[0\\]\\.message\\.tool_calls\"\n\n# Tooldefinities in oud genest formaat (moeten worden afgevlakt)\nrg '\"function\":\\s*{\\s*\"name\"'\nrg \"pydantic_function_tool\"\n\n# Toolresultaten in oud formaat (moeten worden geconverteerd naar function_call_output)\nrg '\"role\":\\s*\"tool\"'\nrg '\"tool_call_id\"'\n\n# Verouderde parameters (moeten verwijderd of hernoemd worden)\nrg \"response_format\"\nrg \"max_tokens\\b\"        # hernoem naar max_output_tokens\nrg \"['\\\"]seed['\\\"]\"      # remove entirely\n\n# Verouderde omgevingsvariabelen (opruimen)\nrg \"AZURE_OPENAI_API_VERSION|AZURE_OPENAI_VERSION\"\nrg \"AZURE_OPENAI_CLIENT_ID\"  # zou AZURE_CLIENT_ID moeten zijn\n\n# GitHub Models endpoints (moeten verwijderd worden — Responses API niet ondersteund)\nrg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"\n\n# Framework-niveau legacy patronen (moeten bijgewerkt worden)\nrg \"OpenAIChatCompletionClient\"  # MAF 1.0.0+: vervang door OpenAIChatClient\nrg \"ChatOpenAI\\(\" | grep -v \"use_responses_api\"  # LangChain: vereist use_responses_api=True\n\n# Testinfrastructuur (moet worden bijgewerkt)\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# Toegang tot contentfilterfout body (moet worden bijgewerkt — structuur gewijzigd)\nrg 'innererror.*content_filter_result|error\\.body\\[\"innererror\"\\]'\nrg \"content_filter_result\\[\" # oud enkelvoud — nu content_filter_results (meervoud) binnen content_filters array\n\n# Rauwe HTTP-aanroepen naar Chat Completions endpoint (moeten URL bijwerken)\nrg \"\u002Fopenai\u002Fdeployments\u002F.*\u002Fchat\u002Fcompletions\"\nrg \"api-version=\"\n```\n\n### Heuristieken (detecteren en herschrijven)\n\n- **Chat Completions client**: `client.chat.completions.create` → `client.responses.create(...)`.\n\n- **Azure client constructors**: `AzureOpenAI(...)` → `OpenAI(base_url=..., api_key=...)`.\n- **Tools**: converteer functie-aanroep tooldefinities van genest formaat (`{\"type\": \"function\", \"function\": {\"name\": ...}}`) naar vlak Responses-formaat (`{\"type\": \"function\", \"name\": ...}`); gebruik `tool_choice`; retourneer toolresultaten als `{\"type\": \"function_call_output\", \"call_id\": ..., \"output\": ...}` items (niet `{\"role\": \"tool\", ...}`).\n- **Tool round-trips**: wanneer het model functie-aanroepen retourneert, voeg dan `response.output` items toe aan het gesprek (niet een handmatige `{\"role\": \"assistant\", \"tool_calls\": [...]}` dict), voeg daarna `function_call_output` items toe voor elk resultaat.\n- **Few-shot tool voorbeelden**: als het gesprek hardcoded toolaanroep voorbeelden bevat, converteer ze dan naar `{\"type\": \"function_call\", \"id\": \"fc_...\", \"call_id\": \"fc_...\", ...}` + `{\"type\": \"function_call_output\", ...}` items. IDs moeten beginnen met `fc_`.\n- **`pydantic_function_tool()`**: deze helper genereert nog steeds het oude geneste formaat en is **niet compatibel** met `responses.create()`. Vervang door handmatige tooldefinities of een flattening-wrapper.\n- **Multi-turn**: onderhoud de gespreksgeschiedenis in de app; geef eerdere beurten door via `input` items.\n- **Formatting**: vervang Chats top-level `response_format` door `text.format` in Responses. Canonieke vorm: `text={\"format\": {\"type\": \"json_schema\", \"name\": \"Output\", \"strict\": True, \"schema\": {...}}}`.\n- **Content items**: vervang Chat `content[].type: \"text\"` door Responses `content[].type: \"input_text\"` voor gebruiker\u002Fsysteem beurten.\n- **Image content items**: vervang Chat `content[].type: \"image_url\"` door Responses `content[].type: \"input_image\"`. Het `image_url` veld verandert van een genest object `{\"url\": \"...\"}` naar een vlakke string. Zie de cheat sheet voor voor- en na voorbeelden.\n- **Reasoning effort**: **migreer alleen `reasoning` als het al in de originele code bestaat**.\n- **Content filter foutafhandeling**: de structuur van de foutbody is veranderd. Chat Completions gebruikte `error.body[\"innererror\"][\"content_filter_result\"]` (enkelvoud); Responses API gebruikt `error.body[\"content_filters\"][0][\"content_filter_results\"]` (meervoud, in een array). Code die `innererror` aanroept veroorzaakt een `KeyError`. Herschrijf om het nieuwe pad te gebruiken.\n- **Raw HTTP calls**: als de app direct de Azure OpenAI REST API aanroept (via `requests`, `httpx`, enz.) met `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions?api-version=...`, herschrijf deze naar `\u002Fopenai\u002Fv1\u002Fresponses`. De request body verandert: `messages` → `input`, voeg `max_output_tokens` en `store: false` toe, verwijder de `api-version` query param. De response body verandert: `choices[0].message.content` → `output[0].content[0].text` (let op: `output_text` is een SDK-convenience property die niet in de ruwe REST JSON staat).\n\n---\n\n## Stap 2: Pas migratie toe\n\n### Migratienotities (Chat Completions → Responses)\n\n- **Waarom migreren**: Responses is de uniforme API voor tekst, tools en streaming; Chat Completions is legacy. Met GPT-5 is Responses vereist voor optimale prestaties.\n- **HTTP**: Azure endpoint schakelt van `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions` naar `\u002Fopenai\u002Fv1\u002Fresponses`.\n- **Velden**: `messages` → `input`, `max_tokens` → `max_output_tokens`. `temperature` blijft gelijk.\n- **Formatting**: `response_format` → `text.format` met een correct object.\n- **Content items**: vervang Chat `content[].type: \"text\"` door Responses `content[].type: \"input_text\"` voor systeem\u002Fgebruiker beurten.\n- **Image content items**: vervang Chat `content[].type: \"image_url\"` door Responses `content[].type: \"input_image\"`. Vlak het `image_url` veld af van `{\"image_url\": {\"url\": \"...\"}}` naar `{\"image_url\": \"...\"}` (een gewone string — een HTTPS URL of een `data:image\u002F...;base64,...` data URI).\n\n### Parameter mapping referentie\n\n| Chat Completions | Responses API |\n|-----------------|---------------|\n| `prompt` | `input` |\n| `messages` | `input` (array van items) |\n| `max_tokens` | `max_output_tokens` |\n| `response_format` | `text.format` (object) |\n| `temperature` | `temperature` (onveranderd) |\n| `stop` | `stop` (onveranderd) |\n| `frequency_penalty` | `frequency_penalty` (onveranderd) |\n| `presence_penalty` | `presence_penalty` (onveranderd) |\n| `tools` \u002F functie-aanroepen | `tools` (onveranderd) |\n| `seed` | **Verwijderen** (niet ondersteund) |\n| `store` | `store` (instellen op `false`) |\n| `content[].type: \"text\"` | `content[].type: \"input_text\"` |\n| `content[].type: \"image_url\"` | `content[].type: \"input_image\"` |\n| `\"image_url\": {\"url\": \"...\"}` | `\"image_url\": \"...\"` (platte string) |\n\nVoor volledige code-voor-na voorbeelden, zie [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\nVoor test infrastructuur migratie (mocks, snapshots, assertions), zie [test-migration.md](.\u002Freferences\u002Ftest-migration.md).\n\nVoor probleemoplossing bij fouten en valkuilen, zie [troubleshooting.md](.\u002Freferences\u002Ftroubleshooting.md).\n\n---\n\n## Gegevensbewaring & Status\n\n- Zet `store: false` op alle Responses-aanroepen.\n- Vertrouw niet op eerdere bericht-ID’s of context die op de server opgeslagen is; houd status client-managed en minimaliseer metadata.\n\n---\n\n## Acceptatiecriteria\n\n### Code-niveau poorten (alle moeten slagen)\n\n- [ ] Geen matches voor `rg \"chat\\.completions\\.create|ChatCompletion\\.create|Completion\\.create\"` in gemigreerde bestanden.\n- [ ] Geen matches voor `rg \"AzureOpenAI\\(|AsyncAzureOpenAI\\(\"` — alle constructors gebruiken `OpenAI`\u002F`AsyncOpenAI` met de v1 endpoint.\n- [ ] Geen matches voor `rg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"` — GitHub Models code paths verwijderd.\n- [ ] Geen matches voor `rg \"OpenAIChatCompletionClient\"` — MAF 1.0.0+ code gebruikt `OpenAIChatClient` (die Responses API gebruikt). Upgrade naar `agent-framework-openai>=1.0.0` in pre-1.0.0.\n- [ ] Alle `ChatOpenAI(...)` aanroepen bevatten `use_responses_api=True`.\n- [ ] Geen matches voor `rg \"choices\\[0\\]\"` — alle response toegang gebruikt `resp.output_text` of de Responses output schema.\n- [ ] Geen `response_format` op topniveau; alle gestructureerde output gebruikt `text={\"format\": {...}}`.\n- [ ] `openai>=1.108.1` en `azure-identity` in `requirements.txt` of `pyproject.toml`; dependencies opnieuw geïnstalleerd.\n- [ ] `store=False` ingesteld op elke `responses.create` aanroep.\n- [ ] Geen `api_version` in clientconstructie; `AZURE_OPENAI_API_VERSION` verwijderd uit env-bestanden en infra.\n\n### Test infrastructuur poorten (alle moeten slagen)\n\n- [ ] Geen matches voor `rg \"ChatCompletionChunk|AsyncCompletions\\.create|chat\\.completions\" tests\u002F`.\n- [ ] Geen matches voor `rg \"_azure_ad_token_provider\" tests\u002F` — assertions geüpdatet om `isinstance(client, AsyncOpenAI)` of `base_url` te controleren.\n- [ ] Geen matches voor `rg \"prompt_filter_results|content_filter_results\" tests\u002F` — Azure-specifieke filter mocks verwijderd.\n- [ ] Mock fixtures gebruiken `kwargs.get(\"input\")` niet `kwargs.get(\"messages\")`.\n- [ ] Snapshot \u002F golden files aangepast aan Responses streaming vorm (geen `choices[0]`, `function_call`, `logprobs`, etc.).\n- [ ] `pytest` slaagt met nul fouten na alle testupdates.\n\n### Gedrags poorten (verifieer handmatig of via testomgeving)\n\n- [ ] **Basis completion**: niet-streaming `responses.create` retourneert niet-lege `output_text`.\n- [ ] **Stream pariteit**: als de originele code streaming gebruikte, streamt de gemigreerde code en levert `response.output_text.delta` events met niet-lege deltas.\n- [ ] **Gestructureerde output**: als `text.format` met `json_schema` gebruikt wordt, slaagt `json.loads(resp.output_text)` en komt overeen met het schema.\n- [ ] **Tool-aanroep lus**: als tools gebruikt worden, doet het model tool-aanroepen, voert de app ze uit, en de vervolg-aanroep retourneert een finale `output_text` (geen oneindige lus).\n- [ ] **Async pariteit**: als `AsyncAzureOpenAI` werd gebruikt, werkt `AsyncOpenAI` equivalent met `await`.\n- [ ] **Foutenpercentage**: geen nieuwe 400\u002F401\u002F404 fouten vergeleken met de pre-migratie baseline.\n\n### Oplevering\n\n- Samenvatting bevat bewerkte bestanden, voor\u002Fna tellingen van legacy aanroep locaties en volgende stappen.\n- Wijzigingen zijn alleen werkboom edits (geen commits).\n\n---\n\n## SDK Versievereisten\n\n| Pakket | Minimale Versie |\n|---------|----------------|\n| `openai` | `>=1.108.1` |\n| `azure-identity` | Laatste (voor EntraID authenticatie) |\n\n---\n\n## Referenties\n\n- [Spiekbrief — alle codefragmenten](.\u002Freferences\u002Fcheat-sheet.md)\n- [Test migratie — mocks, snapshots, assertions](.\u002Freferences\u002Ftest-migration.md)\n- [Probleemoplossing — fouten, risicotabel, valkuilen](.\u002Freferences\u002Ftroubleshooting.md)\n- [detect_legacy.py — geautomatiseerde 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 docs](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fhow-to\u002Fresponses)\n- [Azure OpenAI API versie levenscyclus](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 referentie](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fresponses)\n\n---\n\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Disclaimer**:\nDit document is vertaald met behulp van de AI vertaaldienst [Co-op Translator](https:\u002F\u002Fgithub.com\u002FAzure\u002Fco-op-translator). Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER END -->","# Migreer Python-apps van Azure OpenAI Chat Completions naar Responses API\n\n> **OFFICIËLE RICHTLIJNEN — VOLG PRECIES**\n>\n> Deze skill migreert Python-codebases die Azure OpenAI Chat Completions gebruiken\n> naar de uniforme Responses API. Volg deze instructies nauwkeurig.\n> Improviseer geen parameter-mappingen of bedenk geen API-structuren.\n\n---\n\n## Triggers\n\nActiveer deze skill wanneer de gebruiker wil:\n- Een Python-app migreren van Azure OpenAI Chat Completions naar Responses API\n- Gebruik van Python OpenAI SDK upgraden naar de nieuwste API-structuur tegen Azure OpenAI\n- Python-code voorbereiden voor GPT-5 of nieuwere modellen die Responses op Azure vereisen\n- Overschakelen van `AzureOpenAI`\u002F`AsyncAzureOpenAI` naar de standaard `OpenAI`\u002F`AsyncOpenAI` client met de v1 endpoint\n- Deprecation-waarschuwingen oplossen gerelateerd aan `AzureOpenAI` constructors of `api_version`\n\n---\n\n## ⚠️ Modelcompatibiliteit — EERST CONTROLEREN\n\n> **Controleer vóór migratie of je Azure OpenAI deployment de Responses API ondersteunt.**\n\n### 1. Voer een snelle test uit op je deployment (snelste)\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> **Opmerking**: `max_output_tokens` heeft een **minimum van 16** op Azure OpenAI. Waarden lager dan 16 geven een 400-fout. Gebruik voor snelle tests 50+.\n\nAls dit een 404 retourneert, ondersteunt het model van de deployment Responses nog niet — controleer de referentie hieronder of herdeploy met een ondersteund model.\n\n### 2. Controleer beschikbare modellen in je regio (aanbevolen)\n\nVoer de ingebouwde modelcompatibiliteitstool uit om te zien wat beschikbaar is met Responses API-ondersteuning in jouw specifieke regio:\n\n```bash\npython migrate.py models --subscription YOUR_SUB_ID --location YOUR_REGION\n```\n\nDit vraagt Azure ARM live op en toont een compatibiliteitsmatrix — welke modellen Responses, gestructureerde output, tools etc. ondersteunen. Gebruik `--filter gpt-5.1,gpt-5.2` om resultaten te filteren of `--json` voor scripting.\n\n### 3. Volledige modelondersteuning referentie\n\n- **Live query**: `python migrate.py models` (zie hierboven — regio-specifiek, altijd up-to-date)\n- **Bekijk beschikbaarheid**: [Modeloverzichtstabel en regio-beschikbaarheid](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 & richtlijnen**: **https:\u002F\u002Faka.ms\u002Fopenai\u002Fstart**\n\n### ⚠️ Beperkingen van oudere modellen\n\n> **WAARSCHUWING**: Oudere modellen (voor `gpt-4.1`) ondersteunen mogelijk niet alle functies van de Responses API volledig.\n>\n> Bekende beperkingen van oudere modellen:\n> - **`reasoning` parameter**: Niet ondersteund op veel niet-redenerende modellen. Migreer `reasoning` alleen als het al in de originele code aanwezig was.\n> - **`seed` parameter**: Helemaal niet ondersteund in Responses API — verwijder uit alle verzoeken.\n> - **Gestructureerde output via `text.format`**: Oudere modellen kunnen `strict: true` JSON-schema's mogelijk niet betrouwbaar afdwingen.\n> - **Toolorkestratie**: GPT-5+ orkestreert toolaanroepen als onderdeel van interne reasoning. Oudere modellen op Responses werken nog steeds maar missen deze diepe integratie.\n> - **Temperatuurbeperkingen**: Bij migratie naar `gpt-5` moet temperatuur worden weggelaten of op `1` gezet. Oudere modellen hebben hier geen beperking.\n\n### O-serie reasoning modellen (o1, o3-mini, o3, o4-mini)\n\nO-serie modellen hebben unieke parameterbeperkingen. Bij migratie van apps die o-serie modellen gebruiken:\n\n- **`temperature`**: Moet `1` zijn (of weggelaten). O-serie modellen accepteren geen andere waarden.\n- **`max_completion_tokens` → `max_output_tokens`**: Apps die de Azure-specifieke `max_completion_tokens` gebruiken moeten overstappen op `max_output_tokens`. Stel hoge waarden (4096+) in omdat reasoning-tokens meetellen voor de limiet.\n- **`reasoning_effort`**: Als de app `reasoning_effort` gebruikt (laag\u002Fmiddel\u002Fhoog), behoud het — Responses API ondersteunt deze parameter voor o-serie modellen.\n- **Streaming-gedrag**: O-serie modellen kunnen output bufferen tot reasoning voltooid is voor ze tekst-delta gebeurtenissen uitsturen. Streaming werkt nog steeds, maar de eerste `response.output_text.delta` kan later arriveren dan bij GPT-modellen.\n- **`top_p`**: Niet ondersteund op o-serie — verwijder indien aanwezig.\n- **Toolgebruik**: O-serie modellen ondersteunen tools via Responses API net als GPT modellen, maar kwaliteit van tool-aanroeporkestratie varieert per model.\n\n**Actie — proactieve modeladviezen**: Tijdens de scanfase controleren welk model de app target (deploymentnamen, omgevingsvariabelen, configuratie). Als het model ouder is dan `gpt-4.1` (dus niet gpt-4.1+), vertel de gebruiker proactief:\n- De migratie werkt voor basis tekst, chat, streaming en tools op het huidige model.\n- Nieuwere modellen (`gpt-5.1`, `gpt-5.2`) bieden betere toolorkestratie, afdwingen van gestructureerde output, reasoning, en cross-region beschikbaarheid.\n- Ze zouden hun deployment kunnen upgraden als ze willen — het blokkeert de migratie niet.\n\nBlokkeer of weiger niet te migreren op basis van modelversie. Het advies is informatief.\n\n### GitHub Models ondersteunt WELKE Responses API NIET\n\n> **GitHub Models (`models.github.ai`, `models.inference.ai.azure.com`) ondersteunt de Responses API NIET.**\n\nAls de codebase een GitHub Models codepad heeft (zoek naar `base_url` die wijst naar `models.github.ai` of `models.inference.ai.azure.com`), **verwijder dit volledig** tijdens migratie. De Responses API vereist Azure OpenAI, OpenAI, of een compatibele lokale endpoint (bijv. Ollama met Responses ondersteuning).\n\nActie tijdens scan:\n- Markeer alle GitHub Models codepaden voor verwijdering.\n\n---\n\n## Framework-migratie\n\nVeel apps gebruiken hogere frameworks bovenop OpenAI. Bij migratie hiervan verandert ook de eigen API van het framework — niet alleen de onderliggende OpenAI-aanroepen.\n\n### Microsoft Agent Framework (MAF)\n\n**Controleer eerst je MAF-versie** — migratie hangt af van of je MAF 1.0.0+ of een pre-1.0.0 beta\u002Frc gebruikt.\n\n#### MAF 1.0.0+ (agent-framework-openai >= 1.0.0)\n\n`OpenAIChatClient` **gebruikt al de Responses API** — migratie niet nodig. Als de codebase de legacy `OpenAIChatCompletionClient` gebruikt (met `chat.completions.create`), vervang dit door `OpenAIChatClient`.\n\n| Voor | Na |\n|--------|-------|\n| `from agent_framework.openai import OpenAIChatCompletionClient` | `from agent_framework.openai import OpenAIChatClient` |\n| `OpenAIChatCompletionClient(...)` | `OpenAIChatClient(...)` |\n\nOm versie te controleren: `python -c \"import agent_framework_openai; print(agent_framework_openai.__version__)\"`\n\n#### MAF pre-1.0.0 (beta\u002Frc releases)\n\nIn pre-1.0.0 MAF gebruikte `OpenAIChatClient` Chat Completions. Upgrade naar `agent-framework-openai>=1.0.0` waar `OpenAIChatClient` standaard Responses API gebruikt.\n\nGeen andere veranderingen nodig — `Agent` en tool APIs blijven ongewijzigd.\n\n### LangChain (`langchain-openai`)\n\nVoeg `use_responses_api=True` toe aan `ChatOpenAI()`. Update ook response-access van `.content` naar `.text`.\n\n| Voor | Na |\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\nVoor volledige voor\u002Fna codevoorbeelden, zie [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Frontend Migratie Richtlijnen\n\n> **De Responses API is een server-side aangelegenheid.** Migreer je Python backend; het HTTP-contract van de frontend moet ongewijzigd blijven tenzij je backend een lichte doorgeeflaag is — overweeg dan de Responses request-structuur te adopteren om een vertaallaag te elimineren. Als de frontend OpenAI direct aanroept met een client-side sleutel, verplaats die aanroepen eerst naar een backend.\n\n### `@microsoft\u002Fai-chat-protocol` deprecieerd\n\nHet `@microsoft\u002Fai-chat-protocol` npm-pakket is deprecated en moet vervangen worden door [`ndjson-readablestream`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fndjson-readablestream). Als je het in een frontend tegenkomt:\n\n1. Vervang het CDN script-tag:\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. Verwijder de instantie van `AIChatProtocolClient` (`new ChatProtocol.AIChatProtocolClient(\"\u002Fchat\")`).\n3. Vervang `client.getStreamedCompletion(messages)` door een rechtstreekse `fetch()` call naar de backend streaming endpoint.\n4. Vervang `for await (const response of result)` door `for await (const chunk of readNDJSONStream(response.body))`.\n5. Update property-toegang van `response.delta.content` \u002F `response.error` naar `chunk.delta.content` \u002F `chunk.error`.\n\n---\n\n## Doelen\n\n- Alle Python aanroepplaatsen enumereren die Chat Completions of legacy Completions tegen Azure OpenAI gebruiken.\n- Een migratieplan en ordening voor de Python-codebase voorstellen.\n- Veilige, minimale aanpassingen doorvoeren om over te schakelen naar Responses API.\n- Aanroepen bijwerken om de Responses output-schema te consumeren; geen backcompat wrappers.\n- Tests\u002Flints uitvoeren; triviale breuken door migratie oplossen.\n- Kleine, reviewbare wijzigingssets voorbereiden en een eindoverzicht met diffs leveren (niet commiten).\n\n---\n\n## Beveiligingen\n\n- Alleen bestanden binnen de git workspace wijzigen. Nooit buiten schrijven.\n- Bewaar geen backward compatibiliteit shims; migreer code naar de nieuwe API-structuur.\n- Laat geen grafsteen-\u002Ftransitiecommentaren of backupbestanden achter.\n- Streaming-semantiek behouden indien eerder gebruikt; anders niet-streaming gebruiken.\n- Vraag goedkeuring vóór het uitvoeren van commando's of netwerk-aanroepen als je in goedkeuringsmodus bent.\n- Voer geen `git add`\u002F`git commit`\u002F`git push` uit; lever alleen werkende-tree wijzigingen.\n\n---\n\n## Stap 0: Azure OpenAI Client Migratie (Vereiste)\n\nAls de codebase `AzureOpenAI` of `AsyncAzureOpenAI` constructors gebruikt, migreer dan eerst naar de standaard `OpenAI` \u002F `AsyncOpenAI` constructors. De Azure-specifieke constructors zijn deprecated in `openai>=1.108.1`.\n\n### Waarom het v1 API-pad?\n\nHet nieuwe `\u002Fopenai\u002Fv1` endpoint gebruikt de standaard `OpenAI()` client in plaats van `AzureOpenAI()`, vereist geen `api_version` parameter, en werkt identiek op OpenAI en Azure OpenAI. Dezelfde client-code is toekomstbestendig — geen versiebeheer nodig.\n\n### Belangrijkste wijzigingen\n\n| Voor | Na |\n|--------|-------|\n| `AzureOpenAI` | `OpenAI` |\n| `AsyncAzureOpenAI` | `AsyncOpenAI` |\n| `azure_endpoint` | `base_url` |\n| `azure_ad_token_provider` | `api_key` |\n| `api_version=...` | Helemaal verwijderen |\n\n### Opschoonchecklist\n\n- Verwijder het `api_version` argument uit client-constructie.\n- Verwijder `AZURE_OPENAI_VERSION` \u002F `AZURE_OPENAI_API_VERSION` omgevingsvariabelen uit `.env`, app-instellingen en Bicep\u002Finfra-bestanden.\n- Hernoem `AZURE_OPENAI_CLIENT_ID` → `AZURE_CLIENT_ID` in `.env`, app-instellingen, Bicep\u002Finfra, en testfixtures (standaard Azure Identity SDK conventie).\n- Zorg dat `openai>=1.108.1` in `requirements.txt` of `pyproject.toml` staat.\n\n### Migratie van omgevingsvariabelen\n\n| Oude env var | Actie | Opmerkingen |\n|-------------|--------|-----------|\n| `AZURE_OPENAI_VERSION` | **Verwijderen** | Geen `api_version` nodig met v1 endpoint |\n| `AZURE_OPENAI_API_VERSION` | **Verwijderen** | Zelfde als hierboven |\n| `AZURE_OPENAI_CLIENT_ID` | **Hernoemen** → `AZURE_CLIENT_ID` | Standaard Azure Identity SDK conventie voor `ManagedIdentityCredential(client_id=...)` |\n| `AZURE_OPENAI_ENDPOINT` | **Behoud** | Nog steeds nodig voor `base_url` constructie |\n| `AZURE_OPENAI_CHAT_DEPLOYMENT` | **Behoud** | Wordt gebruikt als `model` parameter in `responses.create` |\n| `AZURE_OPENAI_API_KEY` | **Behoud** | Wordt gebruikt als `api_key` voor sleutelgebaseerde authenticatie |\n\nVoor client-setup codevoorbeelden (sync, async, EntraID, API key, multi-tenant), zie [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Stap 1: Legacy aanroepplaatsen detecteren\n\nVoer het script [detect_legacy.py](..\u002F..\u002F..\u002F..\u002F..\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py) uit om alle aanroepplaatsen te vinden die migratie nodig hebben:\n\n```bash\npython skills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py .\n```\n\nOf voer deze zoekopdrachten handmatig uit — elke match is een migratiedoel:\n\n```bash\n# Legacy API-aanroepen (moeten herschreven worden)\nrg \"chat\\.completions\\.create\"\nrg \"ChatCompletion\\.create\"\nrg \"Completion\\.create\"\n\n# Verouderde Azure clientconstructors (moeten vervangen worden)\nrg \"AzureOpenAI\\(\"\nrg \"AsyncAzureOpenAI\\(\"\n\n# Toegangsmodellen voor responsvorm (moeten bijgewerkt worden)\nrg \"choices\\[0\\]\\.message\\.content\"\nrg \"choices\\[0\\]\\.delta\\.content\"\nrg \"choices\\[0\\]\\.message\\.function_call\"\nrg \"choices\\[0\\]\\.message\\.tool_calls\"\n\n# Tooldefinities in oud genest formaat (moeten worden afgevlakt)\nrg '\"function\":\\s*{\\s*\"name\"'\nrg \"pydantic_function_tool\"\n\n# Toolresultaten in oud formaat (moeten worden geconverteerd naar function_call_output)\nrg '\"role\":\\s*\"tool\"'\nrg '\"tool_call_id\"'\n\n# Verouderde parameters (moeten verwijderd of hernoemd worden)\nrg \"response_format\"\nrg \"max_tokens\\b\"        # hernoem naar max_output_tokens\nrg \"['\\\"]seed['\\\"]\"      # remove entirely\n\n# Verouderde omgevingsvariabelen (opruimen)\nrg \"AZURE_OPENAI_API_VERSION|AZURE_OPENAI_VERSION\"\nrg \"AZURE_OPENAI_CLIENT_ID\"  # zou AZURE_CLIENT_ID moeten zijn\n\n# GitHub Models endpoints (moeten verwijderd worden — Responses API niet ondersteund)\nrg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"\n\n# Framework-niveau legacy patronen (moeten bijgewerkt worden)\nrg \"OpenAIChatCompletionClient\"  # MAF 1.0.0+: vervang door OpenAIChatClient\nrg \"ChatOpenAI\\(\" | grep -v \"use_responses_api\"  # LangChain: vereist use_responses_api=True\n\n# Testinfrastructuur (moet worden bijgewerkt)\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# Toegang tot contentfilterfout body (moet worden bijgewerkt — structuur gewijzigd)\nrg 'innererror.*content_filter_result|error\\.body\\[\"innererror\"\\]'\nrg \"content_filter_result\\[\" # oud enkelvoud — nu content_filter_results (meervoud) binnen content_filters array\n\n# Rauwe HTTP-aanroepen naar Chat Completions endpoint (moeten URL bijwerken)\nrg \"\u002Fopenai\u002Fdeployments\u002F.*\u002Fchat\u002Fcompletions\"\nrg \"api-version=\"\n```\n\n### Heuristieken (detecteren en herschrijven)\n\n- **Chat Completions client**: `client.chat.completions.create` → `client.responses.create(...)`.\n\n- **Azure client constructors**: `AzureOpenAI(...)` → `OpenAI(base_url=..., api_key=...)`.\n- **Tools**: converteer functie-aanroep tooldefinities van genest formaat (`{\"type\": \"function\", \"function\": {\"name\": ...}}`) naar vlak Responses-formaat (`{\"type\": \"function\", \"name\": ...}`); gebruik `tool_choice`; retourneer toolresultaten als `{\"type\": \"function_call_output\", \"call_id\": ..., \"output\": ...}` items (niet `{\"role\": \"tool\", ...}`).\n- **Tool round-trips**: wanneer het model functie-aanroepen retourneert, voeg dan `response.output` items toe aan het gesprek (niet een handmatige `{\"role\": \"assistant\", \"tool_calls\": [...]}` dict), voeg daarna `function_call_output` items toe voor elk resultaat.\n- **Few-shot tool voorbeelden**: als het gesprek hardcoded toolaanroep voorbeelden bevat, converteer ze dan naar `{\"type\": \"function_call\", \"id\": \"fc_...\", \"call_id\": \"fc_...\", ...}` + `{\"type\": \"function_call_output\", ...}` items. IDs moeten beginnen met `fc_`.\n- **`pydantic_function_tool()`**: deze helper genereert nog steeds het oude geneste formaat en is **niet compatibel** met `responses.create()`. Vervang door handmatige tooldefinities of een flattening-wrapper.\n- **Multi-turn**: onderhoud de gespreksgeschiedenis in de app; geef eerdere beurten door via `input` items.\n- **Formatting**: vervang Chats top-level `response_format` door `text.format` in Responses. Canonieke vorm: `text={\"format\": {\"type\": \"json_schema\", \"name\": \"Output\", \"strict\": True, \"schema\": {...}}}`.\n- **Content items**: vervang Chat `content[].type: \"text\"` door Responses `content[].type: \"input_text\"` voor gebruiker\u002Fsysteem beurten.\n- **Image content items**: vervang Chat `content[].type: \"image_url\"` door Responses `content[].type: \"input_image\"`. Het `image_url` veld verandert van een genest object `{\"url\": \"...\"}` naar een vlakke string. Zie de cheat sheet voor voor- en na voorbeelden.\n- **Reasoning effort**: **migreer alleen `reasoning` als het al in de originele code bestaat**.\n- **Content filter foutafhandeling**: de structuur van de foutbody is veranderd. Chat Completions gebruikte `error.body[\"innererror\"][\"content_filter_result\"]` (enkelvoud); Responses API gebruikt `error.body[\"content_filters\"][0][\"content_filter_results\"]` (meervoud, in een array). Code die `innererror` aanroept veroorzaakt een `KeyError`. Herschrijf om het nieuwe pad te gebruiken.\n- **Raw HTTP calls**: als de app direct de Azure OpenAI REST API aanroept (via `requests`, `httpx`, enz.) met `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions?api-version=...`, herschrijf deze naar `\u002Fopenai\u002Fv1\u002Fresponses`. De request body verandert: `messages` → `input`, voeg `max_output_tokens` en `store: false` toe, verwijder de `api-version` query param. De response body verandert: `choices[0].message.content` → `output[0].content[0].text` (let op: `output_text` is een SDK-convenience property die niet in de ruwe REST JSON staat).\n\n---\n\n## Stap 2: Pas migratie toe\n\n### Migratienotities (Chat Completions → Responses)\n\n- **Waarom migreren**: Responses is de uniforme API voor tekst, tools en streaming; Chat Completions is legacy. Met GPT-5 is Responses vereist voor optimale prestaties.\n- **HTTP**: Azure endpoint schakelt van `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions` naar `\u002Fopenai\u002Fv1\u002Fresponses`.\n- **Velden**: `messages` → `input`, `max_tokens` → `max_output_tokens`. `temperature` blijft gelijk.\n- **Formatting**: `response_format` → `text.format` met een correct object.\n- **Content items**: vervang Chat `content[].type: \"text\"` door Responses `content[].type: \"input_text\"` voor systeem\u002Fgebruiker beurten.\n- **Image content items**: vervang Chat `content[].type: \"image_url\"` door Responses `content[].type: \"input_image\"`. Vlak het `image_url` veld af van `{\"image_url\": {\"url\": \"...\"}}` naar `{\"image_url\": \"...\"}` (een gewone string — een HTTPS URL of een `data:image\u002F...;base64,...` data URI).\n\n### Parameter mapping referentie\n\n| Chat Completions | Responses API |\n|-----------------|---------------|\n| `prompt` | `input` |\n| `messages` | `input` (array van items) |\n| `max_tokens` | `max_output_tokens` |\n| `response_format` | `text.format` (object) |\n| `temperature` | `temperature` (onveranderd) |\n| `stop` | `stop` (onveranderd) |\n| `frequency_penalty` | `frequency_penalty` (onveranderd) |\n| `presence_penalty` | `presence_penalty` (onveranderd) |\n| `tools` \u002F functie-aanroepen | `tools` (onveranderd) |\n| `seed` | **Verwijderen** (niet ondersteund) |\n| `store` | `store` (instellen op `false`) |\n| `content[].type: \"text\"` | `content[].type: \"input_text\"` |\n| `content[].type: \"image_url\"` | `content[].type: \"input_image\"` |\n| `\"image_url\": {\"url\": \"...\"}` | `\"image_url\": \"...\"` (platte string) |\n\nVoor volledige code-voor-na voorbeelden, zie [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\nVoor test infrastructuur migratie (mocks, snapshots, assertions), zie [test-migration.md](.\u002Freferences\u002Ftest-migration.md).\n\nVoor probleemoplossing bij fouten en valkuilen, zie [troubleshooting.md](.\u002Freferences\u002Ftroubleshooting.md).\n\n---\n\n## Gegevensbewaring & Status\n\n- Zet `store: false` op alle Responses-aanroepen.\n- Vertrouw niet op eerdere bericht-ID’s of context die op de server opgeslagen is; houd status client-managed en minimaliseer metadata.\n\n---\n\n## Acceptatiecriteria\n\n### Code-niveau poorten (alle moeten slagen)\n\n- [ ] Geen matches voor `rg \"chat\\.completions\\.create|ChatCompletion\\.create|Completion\\.create\"` in gemigreerde bestanden.\n- [ ] Geen matches voor `rg \"AzureOpenAI\\(|AsyncAzureOpenAI\\(\"` — alle constructors gebruiken `OpenAI`\u002F`AsyncOpenAI` met de v1 endpoint.\n- [ ] Geen matches voor `rg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"` — GitHub Models code paths verwijderd.\n- [ ] Geen matches voor `rg \"OpenAIChatCompletionClient\"` — MAF 1.0.0+ code gebruikt `OpenAIChatClient` (die Responses API gebruikt). Upgrade naar `agent-framework-openai>=1.0.0` in pre-1.0.0.\n- [ ] Alle `ChatOpenAI(...)` aanroepen bevatten `use_responses_api=True`.\n- [ ] Geen matches voor `rg \"choices\\[0\\]\"` — alle response toegang gebruikt `resp.output_text` of de Responses output schema.\n- [ ] Geen `response_format` op topniveau; alle gestructureerde output gebruikt `text={\"format\": {...}}`.\n- [ ] `openai>=1.108.1` en `azure-identity` in `requirements.txt` of `pyproject.toml`; dependencies opnieuw geïnstalleerd.\n- [ ] `store=False` ingesteld op elke `responses.create` aanroep.\n- [ ] Geen `api_version` in clientconstructie; `AZURE_OPENAI_API_VERSION` verwijderd uit env-bestanden en infra.\n\n### Test infrastructuur poorten (alle moeten slagen)\n\n- [ ] Geen matches voor `rg \"ChatCompletionChunk|AsyncCompletions\\.create|chat\\.completions\" tests\u002F`.\n- [ ] Geen matches voor `rg \"_azure_ad_token_provider\" tests\u002F` — assertions geüpdatet om `isinstance(client, AsyncOpenAI)` of `base_url` te controleren.\n- [ ] Geen matches voor `rg \"prompt_filter_results|content_filter_results\" tests\u002F` — Azure-specifieke filter mocks verwijderd.\n- [ ] Mock fixtures gebruiken `kwargs.get(\"input\")` niet `kwargs.get(\"messages\")`.\n- [ ] Snapshot \u002F golden files aangepast aan Responses streaming vorm (geen `choices[0]`, `function_call`, `logprobs`, etc.).\n- [ ] `pytest` slaagt met nul fouten na alle testupdates.\n\n### Gedrags poorten (verifieer handmatig of via testomgeving)\n\n- [ ] **Basis completion**: niet-streaming `responses.create` retourneert niet-lege `output_text`.\n- [ ] **Stream pariteit**: als de originele code streaming gebruikte, streamt de gemigreerde code en levert `response.output_text.delta` events met niet-lege deltas.\n- [ ] **Gestructureerde output**: als `text.format` met `json_schema` gebruikt wordt, slaagt `json.loads(resp.output_text)` en komt overeen met het schema.\n- [ ] **Tool-aanroep lus**: als tools gebruikt worden, doet het model tool-aanroepen, voert de app ze uit, en de vervolg-aanroep retourneert een finale `output_text` (geen oneindige lus).\n- [ ] **Async pariteit**: als `AsyncAzureOpenAI` werd gebruikt, werkt `AsyncOpenAI` equivalent met `await`.\n- [ ] **Foutenpercentage**: geen nieuwe 400\u002F401\u002F404 fouten vergeleken met de pre-migratie baseline.\n\n### Oplevering\n\n- Samenvatting bevat bewerkte bestanden, voor\u002Fna tellingen van legacy aanroep locaties en volgende stappen.\n- Wijzigingen zijn alleen werkboom edits (geen commits).\n\n---\n\n## SDK Versievereisten\n\n| Pakket | Minimale Versie |\n|---------|----------------|\n| `openai` | `>=1.108.1` |\n| `azure-identity` | Laatste (voor EntraID authenticatie) |\n\n---\n\n## Referenties\n\n- [Spiekbrief — alle codefragmenten](.\u002Freferences\u002Fcheat-sheet.md)\n- [Test migratie — mocks, snapshots, assertions](.\u002Freferences\u002Ftest-migration.md)\n- [Probleemoplossing — fouten, risicotabel, valkuilen](.\u002Freferences\u002Ftroubleshooting.md)\n- [detect_legacy.py — geautomatiseerde 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 docs](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fhow-to\u002Fresponses)\n- [Azure OpenAI API versie levenscyclus](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 referentie](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fresponses)\n\n---\n\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Disclaimer**:\nDit document is vertaald met behulp van de AI vertaaldienst [Co-op Translator](https:\u002F\u002Fgithub.com\u002FAzure\u002Fco-op-translator). Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER END -->",{"name":5,"license":14},"main","f09e94ffe170f8af6d3db7c42987bbe4db227723","translations\u002Fnl\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\u002Fnl\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002FSKILL.md",true,[48,54,58],{"path":49,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":52,"sourceHtmlUrl":53},"references\u002Fcheat-sheet.md","REFERENCE","参考文档",29127,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fnl\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",7405,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fnl\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Freferences\u002Ftest-migration.md",{"path":59,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":60,"sourceHtmlUrl":61},"references\u002Ftroubleshooting.md",15875,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fnl\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Freferences\u002Ftroubleshooting.md",[63,81,92,100,108,115],{"skillNo":64,"name":65,"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":66,"categories":67,"keywords":78,"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",[68,73],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000039","教师与教育","PROFESSION","适用职业",[79,80],"testing","testing course samples",{"skillNo":82,"name":83,"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":84,"categories":85,"keywords":89,"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",[86],{"categoryNo":87,"categoryName":88,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000023","Skill与智能体开发",[90,8,91],"docs","microsoft docs",{"skillNo":93,"name":94,"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":95,"categories":96,"keywords":97,"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",[],[98,99],"ai agents","local ai agents",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":106,"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",[],[107],"jupyter notebook",{"skillNo":109,"name":110,"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":111,"categories":112,"keywords":113,"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",[],[114],"deploying scalable agents",{"skillNo":116,"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":117,"categories":118,"keywords":119,"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]]