[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M699AYSVPSDMW7V413ZQGARW":3,"skill-same:01M699AYSVPSDMW7V413ZQGARW":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},"01M699AYSVPSDMW7V413ZQGARW","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\u002Fcs\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# Migrace Python aplikací z Azure OpenAI Chat Completions na Responses API\n\n> **AUTORITATIVNÍ POKYNY — POSTUPUJTE PŘESNĚ**\n>\n> Tento nástroj migruje Pythonové kódy používající Azure OpenAI Chat Completions\n> na sjednocené Responses API. Postupujte podle těchto pokynů přesně.\n> Nepřidávejte vlastní mapování parametrů ani nevymýšlejte tvary API.\n\n---\n\n## Spouštěče\n\nAktivujte tento nástroj, pokud uživatel chce:\n- Migrovat Python aplikaci z Azure OpenAI Chat Completions na Responses API\n- Aktualizovat používání Python OpenAI SDK na nejnovější tvar API pro Azure OpenAI\n- Připravit Python kód pro modely GPT-5 nebo novější, které vyžadují Responses na Azure\n- Přepnout z `AzureOpenAI`\u002F`AsyncAzureOpenAI` na standardní klienty `OpenAI`\u002F`AsyncOpenAI` s endpointem v1\n- Opravit upozornění na zastaralost týkající se konstruktorů `AzureOpenAI` nebo `api_version`\n\n---\n\n## ⚠️ Kompatibilita modelu — NEJDŘÍVE ZKONTROLUJTE\n\n> **Před migrací ověřte, zda vaše nasazení Azure OpenAI podporuje Responses API.**\n\n### 1. Rychlý test nasazení (nejrychlejší)\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> **Poznámka**: `max_output_tokens` má na Azure OpenAI **minimálně 16**. Hodnoty pod 16 vedou k chybě 400. Pro rychlé testy používejte 50+.\n\nPokud vrátí 404, model nasazení ještě Responses nepodporuje — podívejte se na referenci níže nebo nasazení přenastavte s podporovaným modelem.\n\n### 2. Zkontrolujte dostupné modely ve vaší oblasti (doporučeno)\n\nSpusťte vestavěný nástroj kompatibility modelů, abyste viděli, co je k dispozici s podporou Responses API ve vaší konkrétní oblasti:\n\n```bash\npython migrate.py models --subscription YOUR_SUB_ID --location YOUR_REGION\n```\n\nToto dotazuje Azure ARM v reálném čase a zobrazuje matici kompatibility — které modely podporují Responses, strukturovaný výstup, nástroje atd. Použijte `--filter gpt-5.1,gpt-5.2` pro omezení výsledků nebo `--json` pro skriptování.\n\n### 3. Kompletní reference podpory modelů\n\n- **Dotaz v reálném čase**: `python migrate.py models` (viz výše — specifické pro region, vždy aktuální)\n- **Prohlédnout dostupnost**: [Tabulka přehledu modelů a dostupnost v regionech](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- **Rychlý start & pokyny**: **https:\u002F\u002Faka.ms\u002Fopenai\u002Fstart**\n\n### ⚠️ Omezení starších modelů\n\n> **VAROVÁNÍ**: Starší modely (před `gpt-4.1`) nemusí plně podporovat všechny funkce Responses API.\n>\n> Známá omezení se staršími modely:\n> - **parametr `reasoning`**: Není podporován u mnoha modelů bez reasoning. Migrujte `reasoning` pouze pokud byl již v původním kódu přítomen.\n> - **parametr `seed`**: Není podporován v Responses API vůbec – odstraňte ze všech požadavků.\n> - **Strukturovaný výstup přes `text.format`**: Starší modely nemusejí spolehlivě vynucovat `strict: true` JSON schémata.\n> - **Orchestrace nástrojů**: GPT-5+ řídí volání nástrojů jako součást reasoning. Starší modely v Responses stále fungují, ale nemají tuto hlubokou integraci.\n> - **Omezení teploty**: Při migraci na `gpt-5` musí být teplota vynechána nebo nastavena na `1`. Starší modely nejsou tímto omezeny.\n\n### O-série reasoning modely (o1, o3-mini, o3, o4-mini)\n\nO-série modelů má specifická omezení parametrů. Při migraci aplikací cílených na O-sérii:\n\n- **`temperature`**: Musí být `1` (nebo vynecháno). O-série modely nepřijímají jiné hodnoty.\n- **`max_completion_tokens` → `max_output_tokens`**: Aplikace používající Azure-specifické `max_completion_tokens` musí přejít na `max_output_tokens`. Nastavte vysoké hodnoty (4096+) protože tokeny reasoning se počítají do limitu.\n- **`reasoning_effort`**: Pokud aplikace používá `reasoning_effort` (low\u002Fmedium\u002Fhigh), ponechejte jej — Responses API tento parametr u O-série modelů podporuje.\n- **Chování streamingu**: O-série modely mohou bufferovat výstup, dokud reasoning neskončí, před odesláním delta událostí textu. Streaming stále funguje, ale první `response.output_text.delta` může přijít s delším zpožděním než u GPT modelů.\n- **`top_p`**: Není podporován na O-sérii — odstraňte pokud je přítomen.\n- **Používání nástrojů**: O-série modely podporují nástroje přes Responses API stejně jako GPT modely, ale kvalita orchestrací volání nástrojů se liší podle modelu.\n\n**Akce — proaktivní doporučení ohledně modelu**: Během fáze skenování zkontrolujte, jaký model aplikace používá (názvy nasazení, proměnné prostředí, konfigurace). Pokud model předchází `gpt-4.1` (není gpt-4.1+), proaktivně uživateli sdělte:\n- Migrace bude fungovat pro základní text, chat, streaming a nástroje na jejich aktuálním modelu.\n- Novější modely (`gpt-5.1`, `gpt-5.2`) nabízí lepší orchestraci nástrojů, vynucení strukturovaného výstupu, reasoning a dostupnost v různých regionech.\n- Měli by zvážit upgrade svého nasazení, až budou připraveni — není to ale blokující pro migraci.\n\nNezabraňujte ani neodmítejte migraci na základě verze modelu. Toto doporučení je pouze informativní.\n\n### GitHub Models nepodporuje Responses API\n\n> **GitHub Models (`models.github.ai`, `models.inference.ai.azure.com`) nepodporují Responses API.**\n\nPokud kódová základna obsahuje cestu ke GitHub Models (hledejte `base_url` směřující na `models.github.ai` nebo `models.inference.ai.azure.com`), **odstraňte ji úplně** během migrace. Responses API vyžaduje Azure OpenAI, OpenAI nebo kompatibilní lokální endpoint (např. Ollama s podporou Responses).\n\nAkce během skenování:\n- Označte všechny GitHub Models cesty kódu k odstranění.\n\n---\n\n## Migrace frameworku\n\nMnoho aplikací používá nadstandardní frameworky nad OpenAI. Při migraci těchto se mění API samotného frameworku — nejen podkladové OpenAI volání.\n\n### Microsoft Agent Framework (MAF)\n\n**Nejdříve zkontrolujte svou verzi MAF** — migrace záleží na tom, zda používáte MAF 1.0.0+ nebo před-1.0.0 beta\u002Frc.\n\n#### MAF 1.0.0+ (agent-framework-openai >= 1.0.0)\n\n`OpenAIChatClient` **již používá Responses API** — migrace není potřeba. Pokud kód používá starý `OpenAIChatCompletionClient` (který používá `chat.completions.create`), nahraďte jej `OpenAIChatClient`.\n\n| Před | Po |\n|--------|-------|\n| `from agent_framework.openai import OpenAIChatCompletionClient` | `from agent_framework.openai import OpenAIChatClient` |\n| `OpenAIChatCompletionClient(...)` | `OpenAIChatClient(...)` |\n\nPro kontrolu verze: `python -c \"import agent_framework_openai; print(agent_framework_openai.__version__)\"`\n\n#### MAF před-1.0.0 (beta\u002Frc verze)\n\nV před-1.0.0 MAF `OpenAIChatClient` používal Chat Completions. Upgradujte na `agent-framework-openai>=1.0.0`, kde `OpenAIChatClient` výchozí používá Responses API.\n\nŽádné další změny nejsou potřeba — API `Agent` a nástrojů zůstávají stejné.\n\n### LangChain (`langchain-openai`)\n\nPřidejte `use_responses_api=True` do `ChatOpenAI()`. Také změňte přístup k odpovědi z `.content` na `.text`.\n\n| Před | Po |\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\nKompletní příklady kódu před a po najdete v [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Pokyny pro migraci frontendu\n\n> **Responses API je záležitost serverové strany.** Migrujte svůj Python backend; HTTP kontrakt frontendu by měl zůstat nezměněn, pokud není backend jen tenkým průchodem — v tom případě zvažte přijetí Requests tvaru Responses API k odstranění překladové vrstvy. Pokud frontend volá OpenAI přímo s klíčem na straně klienta, přesuňte tyto volání nejdříve na backend.\n\n### Deprecace `@microsoft\u002Fai-chat-protocol`\n\nNPM balíček `@microsoft\u002Fai-chat-protocol` je zastaralý a měl by být nahrazen [`ndjson-readablestream`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fndjson-readablestream). Pokud ho najdete ve frontendu:\n\n1. Nahraďte CDN tag skriptu:\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. Odstraňte instanci `AIChatProtocolClient` (`new ChatProtocol.AIChatProtocolClient(\"\u002Fchat\")`).\n3. Nahraďte `client.getStreamedCompletion(messages)` přímým voláním `fetch()` na backendový streaming endpoint.\n4. Nahraďte `for await (const response of result)` cyklem `for await (const chunk of readNDJSONStream(response.body))`.\n5. Aktualizujte přístupy k vlastnostem z `response.delta.content` \u002F `response.error` na `chunk.delta.content` \u002F `chunk.error`.\n\n---\n\n## Cíle\n\n- Vypište všechna místa v Python kódu využívající Chat Completions nebo staré Completions vůči Azure OpenAI.\n- Navrhněte plán migrace a pořadí změn pro Python kód.\n- Proveďte bezpečné, minimální úpravy ke změně na Responses API.\n- Aktualizujte volající, aby používali výstupní schéma Responses; bez zpětných kompatibilních obalů.\n- Spusťte testy\u002Flinty; opravte drobné porušení způsobené migrací.\n- Připravte malé, snadno kontrolovatelné změnové sady a poskytněte závěrečné shrnutí s rozdíly (neprovádějte commit).\n\n---\n\n## Zásady\n\n- Měňte pouze soubory uvnitř git workspace. Nikdy nepište mimo něj.\n- Neponechávejte shimové vrstvy zpětné kompatibility; migrujte kód na nový tvar API.\n- Nezanechávejte přechodové komentáře ani záložní soubory.\n- Zachovejte streamovací sémantiku, pokud byla používána; jinak používejte nestreamovací režim.\n- Žádejte schválení před spuštěním příkazů nebo síťových volání v režimu schvalování.\n- Nespouštějte `git add`\u002F`git commit`\u002F`git push`; dělejte pouze úpravy ve stromu pracovního prostoru.\n\n---\n\n## Krok 0: Migrace Azure OpenAI klienta (předpoklad)\n\nPokud kód používá konstruktory `AzureOpenAI` nebo `AsyncAzureOpenAI`, migrujte nejdříve na standardní `OpenAI` \u002F `AsyncOpenAI` konstruktory. Azure-specifické konstruktory jsou zastaralé od `openai>=1.108.1`.\n\n### Proč cesta API v1?\n\nNový endpoint `\u002Fopenai\u002Fv1` používá standardního klienta `OpenAI()` místo `AzureOpenAI()`, nevyžaduje parametr `api_version` a pracuje stejně na OpenAI i Azure OpenAI. Stejný klient je budoucnostově kompatibilní — není potřeba spravovat verze.\n\n### Klíčové změny\n\n| Před | Po |\n|--------|-------|\n| `AzureOpenAI` | `OpenAI` |\n| `AsyncAzureOpenAI` | `AsyncOpenAI` |\n| `azure_endpoint` | `base_url` |\n| `azure_ad_token_provider` | `api_key` |\n| `api_version=...` | Odstranit úplně |\n\n### Kontrolní seznam úklidu\n\n- Odstraňte argument `api_version` z konstrukce klienta.\n- Odstraňte proměnné prostředí `AZURE_OPENAI_VERSION` \u002F `AZURE_OPENAI_API_VERSION` z `.env`, nastavení aplikace i Bicep\u002Finfra souborů.\n- Přejmenujte `AZURE_OPENAI_CLIENT_ID` → `AZURE_CLIENT_ID` v `.env`, nastavení aplikace, Bicep\u002Finfra a testovacích fixturních souborech (standardní konvence Azure Identity SDK).\n- Zajistěte `openai>=1.108.1` v `requirements.txt` nebo `pyproject.toml`.\n\n### Migrace proměnných prostředí\n\n| Starý env var | Akce | Poznámky |\n|-------------|--------|-------|\n| `AZURE_OPENAI_VERSION` | **Odstranit** | S endpointem v1 není třeba `api_version` |\n| `AZURE_OPENAI_API_VERSION` | **Odstranit** | Totéž jako výše |\n| `AZURE_OPENAI_CLIENT_ID` | **Přejmenovat** → `AZURE_CLIENT_ID` | Standardní konvence Azure Identity SDK pro `ManagedIdentityCredential(client_id=...)` |\n| `AZURE_OPENAI_ENDPOINT` | **Zachovat** | Stále potřeba pro konstrukci `base_url` |\n| `AZURE_OPENAI_CHAT_DEPLOYMENT` | **Zachovat** | Používá se jako parametr `model` v `responses.create` |\n| `AZURE_OPENAI_API_KEY` | **Zachovat** | Používá se jako `api_key` pro autentizaci pomocí klíče |\n\nPříklady nastavení klienta (synch, asynch, EntraID, API klíč, multi-tenant) najdete v [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Krok 1: Detekujte stará volání\n\nSpusťte skript [detect_legacy.py](..\u002F..\u002F..\u002F..\u002F..\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py), který najde všechna volání, jež je třeba migrovat:\n\n```bash\npython skills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py .\n```\n\nNebo spusťte tyto vyhledávací dotazy ručně — každý výskyt je cílem migrace:\n\n```bash\n# Volání zastaralého API (nutno přepsat)\nrg \"chat\\.completions\\.create\"\nrg \"ChatCompletion\\.create\"\nrg \"Completion\\.create\"\n\n# Zastaralé konstruktory Azure klientů (nutno nahradit)\nrg \"AzureOpenAI\\(\"\nrg \"AsyncAzureOpenAI\\(\"\n\n# Vzory přístupu ke struktuře odpovědi (nutno aktualizovat)\nrg \"choices\\[0\\]\\.message\\.content\"\nrg \"choices\\[0\\]\\.delta\\.content\"\nrg \"choices\\[0\\]\\.message\\.function_call\"\nrg \"choices\\[0\\]\\.message\\.tool_calls\"\n\n# Definice nástrojů ve starém vnořeném formátu (nutno zploštit)\nrg '\"function\":\\s*{\\s*\"name\"'\nrg \"pydantic_function_tool\"\n\n# Výsledky nástrojů ve starém formátu (nutno převést na function_call_output)\nrg '\"role\":\\s*\"tool\"'\nrg '\"tool_call_id\"'\n\n# Zastaralé parametry (nutno odstranit nebo přejmenovat)\nrg \"response_format\"\nrg \"max_tokens\\b\"        # přejmenovat na max_output_tokens\nrg \"['\\\"]seed['\\\"]\"      # remove entirely\n\n# Zastaralé proměnné prostředí (uklidit)\nrg \"AZURE_OPENAI_API_VERSION|AZURE_OPENAI_VERSION\"\nrg \"AZURE_OPENAI_CLIENT_ID\"  # mělo by být AZURE_CLIENT_ID\n\n# Koncové body GitHub Models (nutno odstranit — Responses API není podporováno)\nrg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"\n\n# Zastaralé vzory na úrovni frameworku (nutno aktualizovat)\nrg \"OpenAIChatCompletionClient\"  # MAF 1.0.0+: nahradit za OpenAIChatClient\nrg \"ChatOpenAI\\(\" | grep -v \"use_responses_api\"  # LangChain: potřeba use_responses_api=True\n\n# Testovací infrastruktura (nutno aktualizovat)\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# Přístup k tělu chyby filtru obsahu (nutno aktualizovat — struktura se změnila)\nrg 'innererror.*content_filter_result|error\\.body\\[\"innererror\"\\]'\nrg \"content_filter_result\\[\" # starý singulární tvar — nyní content_filter_results (množné číslo) uvnitř pole content_filters\n\n# Surová HTTP volání na endpoint Chat Completions (nutno aktualizovat URL)\nrg \"\u002Fopenai\u002Fdeployments\u002F.*\u002Fchat\u002Fcompletions\"\nrg \"api-version=\"\n```\n\n### Heuristika (detekce a přepis)\n\n- **Klient Chat Completions**: `client.chat.completions.create` → `client.responses.create(...)`.\n\n- **Konstruktory klienta Azure**: `AzureOpenAI(...)` → `OpenAI(base_url=..., api_key=...)`.\n- **Nástroje**: převést definice nástrojů pro volání funkcí z vnořeného formátu (`{\"type\": \"function\", \"function\": {\"name\": ...}}`) na plochý formát Responses (`{\"type\": \"function\", \"name\": ...}`); použít `tool_choice`; vracet výsledky nástrojů jako položky `{\"type\": \"function_call_output\", \"call_id\": ..., \"output\": ...}` (nikoli `{\"role\": \"tool\", ...}`).\n- **Návrat nástrojů**: když model vrací volání funkcí, připojit položky `response.output` do konverzace (nikoli ručně `{\"role\": \"assistant\", \"tool_calls\": [...]}` slovník), poté připojit položky `function_call_output` pro každý výsledek.\n- **Příklady nástrojů s několika pokusy**: pokud konverzace obsahuje pevně zakódované příklady volání nástrojů, převést je na položky `{\"type\": \"function_call\", \"id\": \"fc_...\", \"call_id\": \"fc_...\", ...}` + `{\"type\": \"function_call_output\", ...}`. ID musí začínat `fc_`.\n- **`pydantic_function_tool()`**: tento pomocný nástroj stále generuje starý vnořený formát a **není kompatibilní** s `responses.create()`. Nahraďte ručními definicemi nástrojů nebo obalem pro zploštění.\n- **Více kol**: uchovávat historii konverzace v aplikaci; předávat předchozí kola přes položky `input`.\n- **Formátování**: nahradit vrcholové `response_format` v Chatu objektem `text.format` v Responses. Kanonický tvar: `text={\"format\": {\"type\": \"json_schema\", \"name\": \"Output\", \"strict\": True, \"schema\": {...}}}`.\n- **Položky obsahu**: nahradit Chat `content[].type: \"text\"` položkami Responses `content[].type: \"input_text\"` pro tahy uživatele\u002Fsystému.\n- **Položky obrazového obsahu**: nahradit Chat `content[].type: \"image_url\"` položkami Responses `content[].type: \"input_image\"`. Pole `image_url` se mění z vnořeného objektu `{\"url\": \"...\"}` na plochý řetězec. Viz cheat sheet pro příklady před\u002Fpo.\n- **Úsilí o odůvodnění**: **migrujte `reasoning` pouze pokud již existuje v původním kódu**.\n- **Zpracování chyb filtru obsahu**: struktura chybového těla se změnila. Chat Completions používal `error.body[\"innererror\"][\"content_filter_result\"]` (singulár); Responses API používá `error.body[\"content_filters\"][0][\"content_filter_results\"]` (plurál, uvnitř pole). Kód přistupující k `innererror` vyvolá `KeyError`. Přepište na použití nové cesty.\n- **Surová HTTP volání**: pokud aplikace volá přímo Azure OpenAI REST API (pomocí `requests`, `httpx` atd.) přes `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions?api-version=...`, přepište na `\u002Fopenai\u002Fv1\u002Fresponses`. Tělo požadavku se mění: `messages` → `input`, přidat `max_output_tokens` a `store: false`, odstranit query parametr `api-version`. Tělo odpovědi se mění: `choices[0].message.content` → `output[0].content[0].text` (pozn.: `output_text` je vlastnost SDK pro jednodušší přístup, není přítomna v syrovém REST JSON).\n\n---\n\n## Krok 2: Použití migrace\n\n### Poznámky k migraci (Chat Completions → Responses)\n\n- **Proč migrovat**: Responses je sjednocené API pro text, nástroje a streamování; Chat Completions je zastaralé. S GPT-5 je Responses požadováno pro nejlepší výkon.\n- **HTTP**: Azure endpoint se přepíná z `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions` na `\u002Fopenai\u002Fv1\u002Fresponses`.\n- **Pole**: `messages` → `input`, `max_tokens` → `max_output_tokens`. `temperature` zůstává.\n- **Formátování**: `response_format` → `text.format` s vhodným objektem.\n- **Položky obsahu**: nahradit Chat `content[].type: \"text\"` položkami Responses `content[].type: \"input_text\"` pro tahy systému\u002Fuživatele.\n- **Položky obrazového obsahu**: nahradit Chat `content[].type: \"image_url\"` položkami Responses `content[].type: \"input_image\"`. Zploštit pole `image_url` z `{\"image_url\": {\"url\": \"...\"}}` na `{\"image_url\": \"...\"}` (prostý řetězec — HTTPS URL nebo `data:image\u002F...;base64,...` data URI).\n\n### Referenční mapování parametrů\n\n| Chat Completions | Responses API |\n|-----------------|---------------|\n| `prompt` | `input` |\n| `messages` | `input` (pole položek) |\n| `max_tokens` | `max_output_tokens` |\n| `response_format` | `text.format` (objekt) |\n| `temperature` | `temperature` (beze změny) |\n| `stop` | `stop` (beze změny) |\n| `frequency_penalty` | `frequency_penalty` (beze změny) |\n| `presence_penalty` | `presence_penalty` (beze změny) |\n| `tools` \u002F volání funkcí | `tools` (beze změny) |\n| `seed` | **Odstranit** (není podporováno) |\n| `store` | `store` (nastaveno na `false`) |\n| `content[].type: \"text\"` | `content[].type: \"input_text\"` |\n| `content[].type: \"image_url\"` | `content[].type: \"input_image\"` |\n| `\"image_url\": {\"url\": \"...\"}` | `\"image_url\": \"...\"` (plochý řetězec) |\n\nKompletní příklady kódu před a po najdete v [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\nPro migraci testovací infrastruktury (mocks, snapshots, assertions) viz [test-migration.md](.\u002Freferences\u002Ftest-migration.md).\n\nPro řešení problémů a často se vyskytující chyby viz [troubleshooting.md](.\u002Freferences\u002Ftroubleshooting.md).\n\n---\n\n## Uchovávání dat & stav\n\n- Nastavte `store: false` u všech požadavků Responses.\n- Nespoléhejte se na předchozí ID zpráv nebo kontext uložený na serveru; stavební stav spravujte na klientovi a minimalizujte metadata.\n\n---\n\n## Akceptační kritéria\n\n### Kódové kontroly (všechny musí projít)\n\n- [ ] Žádné shody pro `rg \"chat\\.completions\\.create|ChatCompletion\\.create|Completion\\.create\"` v migrovaných souborech.\n- [ ] Žádné shody pro `rg \"AzureOpenAI\\(|AsyncAzureOpenAI\\(\"` — všechny konstruktory používají `OpenAI`\u002F`AsyncOpenAI` s v1 endpointem.\n- [ ] Žádné shody pro `rg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"` — cesty kódu GitHub Models odstraněny.\n- [ ] Žádné shody pro `rg \"OpenAIChatCompletionClient\"` — kód MAF 1.0.0+ používá `OpenAIChatClient` (který používá Responses API). U verzí před 1.0.0 přejděte na `agent-framework-openai>=1.0.0`.\n- [ ] Všechny volání `ChatOpenAI(...)` obsahují `use_responses_api=True`.\n- [ ] Žádné shody pro `rg \"choices\\[0\\]\"` — veškerý přístup k odpovědi používá `resp.output_text` nebo schéma výstupu Responses.\n- [ ] Není žádný `response_format` na nejvyšší úrovni; veškerý strukturovaný výstup používá `text={\"format\": {...}}`.\n- [ ] `openai>=1.108.1` a `azure-identity` v `requirements.txt` nebo `pyproject.toml`; závislosti přebudovány.\n- [ ] Nastaveno `store=False` u každého volání `responses.create`.\n- [ ] Žádná `api_version` při konstrukci klienta; `AZURE_OPENAI_API_VERSION` odstraněn z environmentálních souborů a infrastruktury.\n\n### Kontroly testovací infrastruktury (všechny musí projít)\n\n- [ ] Žádné shody pro `rg \"ChatCompletionChunk|AsyncCompletions\\.create|chat\\.completions\" tests\u002F`.\n- [ ] Žádné shody pro `rg \"_azure_ad_token_provider\" tests\u002F` — assertace aktualizovány tak, aby kontrolovaly `isinstance(client, AsyncOpenAI)` nebo `base_url`.\n- [ ] Žádné shody pro `rg \"prompt_filter_results|content_filter_results\" tests\u002F` — Azure-specifické filtry odebrány.\n- [ ] Mock fixtures používají `kwargs.get(\"input\")` místo `kwargs.get(\"messages\")`.\n- [ ] Soubory snapshot\u002Fgolden aktualizovány na tvar streamování Responses (bez `choices[0]`, `function_call`, `logprobs` atd.).\n- [ ] `pytest` projde bez chyb po všech aktualizacích testů.\n\n### Chování (ověřit ručně nebo pomocí test harness)\n\n- [ ] **Základní dokončení**: ne-streamované `responses.create` vrací neprázdný `output_text`.\n- [ ] **Parita streamu**: pokud původní kód používal streamování, migrovaný kód streamuje a vydává události `response.output_text.delta` s neprázdnými deltami.\n- [ ] **Strukturovaný výstup**: pokud se používá `text.format` s `json_schema`, `json.loads(resp.output_text)` uspěje a odpovídá schématu.\n- [ ] **Smyčka volání nástroje**: pokud jsou použity nástroje, model vydává volání nástroje, aplikace je spouští a následný požadavek vrací konečný `output_text` (bez nekonečné smyčky).\n- [ ] **Async parita**: pokud byl použit `AsyncAzureOpenAI`, funguje ekvivalent `AsyncOpenAI` s `await`.\n- [ ] **Míra chyb**: žádné nové chyby 400\u002F401\u002F404 oproti před-migračnímu základu.\n\n### Výstupy\n\n- Shrnutí obsahuje upravené soubory, počty před\u002Fpo starých voláních a další kroky.\n- Změny jsou pouze úpravy pracovního stromu (žádné commity).\n\n---\n\n## Požadavky na verze SDK\n\n| Balíček | Minimální verze |\n|---------|----------------|\n| `openai` | `>=1.108.1` |\n| `azure-identity` | Nejnovější (pro EntraID autentizaci) |\n\n---\n\n## Reference\n\n- [Cheat Sheet — všechny ukázky kódu](.\u002Freferences\u002Fcheat-sheet.md)\n- [Test Migration — mocky, snapshoty, assertace](.\u002Freferences\u002Ftest-migration.md)\n- [Troubleshooting — chyby, tabulka rizik, nástrahy](.\u002Freferences\u002Ftroubleshooting.md)\n- [detect_legacy.py — automatizovaný skener](..\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- [Životní cyklus verze Azure OpenAI API](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**Prohlášení o omezení odpovědnosti**:\nTento dokument byl přeložen pomocí AI překladatelské služby [Co-op Translator](https:\u002F\u002Fgithub.com\u002FAzure\u002Fco-op-translator). Přestože usilujeme o co největší přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Originální dokument v jeho mateřském jazyce by měl být považován za autoritativní zdroj. Pro kritické informace se doporučuje profesionální lidský překlad. Nejsme odpovědní za jakékoli nedorozumění nebo nesprávné interpretace vzniklé použitím tohoto překladu.\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER END -->","# Migrace Python aplikací z Azure OpenAI Chat Completions na Responses API\n\n> **AUTORITATIVNÍ POKYNY — POSTUPUJTE PŘESNĚ**\n>\n> Tento nástroj migruje Pythonové kódy používající Azure OpenAI Chat Completions\n> na sjednocené Responses API. Postupujte podle těchto pokynů přesně.\n> Nepřidávejte vlastní mapování parametrů ani nevymýšlejte tvary API.\n\n---\n\n## Spouštěče\n\nAktivujte tento nástroj, pokud uživatel chce:\n- Migrovat Python aplikaci z Azure OpenAI Chat Completions na Responses API\n- Aktualizovat používání Python OpenAI SDK na nejnovější tvar API pro Azure OpenAI\n- Připravit Python kód pro modely GPT-5 nebo novější, které vyžadují Responses na Azure\n- Přepnout z `AzureOpenAI`\u002F`AsyncAzureOpenAI` na standardní klienty `OpenAI`\u002F`AsyncOpenAI` s endpointem v1\n- Opravit upozornění na zastaralost týkající se konstruktorů `AzureOpenAI` nebo `api_version`\n\n---\n\n## ⚠️ Kompatibilita modelu — NEJDŘÍVE ZKONTROLUJTE\n\n> **Před migrací ověřte, zda vaše nasazení Azure OpenAI podporuje Responses API.**\n\n### 1. Rychlý test nasazení (nejrychlejší)\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> **Poznámka**: `max_output_tokens` má na Azure OpenAI **minimálně 16**. Hodnoty pod 16 vedou k chybě 400. Pro rychlé testy používejte 50+.\n\nPokud vrátí 404, model nasazení ještě Responses nepodporuje — podívejte se na referenci níže nebo nasazení přenastavte s podporovaným modelem.\n\n### 2. Zkontrolujte dostupné modely ve vaší oblasti (doporučeno)\n\nSpusťte vestavěný nástroj kompatibility modelů, abyste viděli, co je k dispozici s podporou Responses API ve vaší konkrétní oblasti:\n\n```bash\npython migrate.py models --subscription YOUR_SUB_ID --location YOUR_REGION\n```\n\nToto dotazuje Azure ARM v reálném čase a zobrazuje matici kompatibility — které modely podporují Responses, strukturovaný výstup, nástroje atd. Použijte `--filter gpt-5.1,gpt-5.2` pro omezení výsledků nebo `--json` pro skriptování.\n\n### 3. Kompletní reference podpory modelů\n\n- **Dotaz v reálném čase**: `python migrate.py models` (viz výše — specifické pro region, vždy aktuální)\n- **Prohlédnout dostupnost**: [Tabulka přehledu modelů a dostupnost v regionech](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- **Rychlý start & pokyny**: **https:\u002F\u002Faka.ms\u002Fopenai\u002Fstart**\n\n### ⚠️ Omezení starších modelů\n\n> **VAROVÁNÍ**: Starší modely (před `gpt-4.1`) nemusí plně podporovat všechny funkce Responses API.\n>\n> Známá omezení se staršími modely:\n> - **parametr `reasoning`**: Není podporován u mnoha modelů bez reasoning. Migrujte `reasoning` pouze pokud byl již v původním kódu přítomen.\n> - **parametr `seed`**: Není podporován v Responses API vůbec – odstraňte ze všech požadavků.\n> - **Strukturovaný výstup přes `text.format`**: Starší modely nemusejí spolehlivě vynucovat `strict: true` JSON schémata.\n> - **Orchestrace nástrojů**: GPT-5+ řídí volání nástrojů jako součást reasoning. Starší modely v Responses stále fungují, ale nemají tuto hlubokou integraci.\n> - **Omezení teploty**: Při migraci na `gpt-5` musí být teplota vynechána nebo nastavena na `1`. Starší modely nejsou tímto omezeny.\n\n### O-série reasoning modely (o1, o3-mini, o3, o4-mini)\n\nO-série modelů má specifická omezení parametrů. Při migraci aplikací cílených na O-sérii:\n\n- **`temperature`**: Musí být `1` (nebo vynecháno). O-série modely nepřijímají jiné hodnoty.\n- **`max_completion_tokens` → `max_output_tokens`**: Aplikace používající Azure-specifické `max_completion_tokens` musí přejít na `max_output_tokens`. Nastavte vysoké hodnoty (4096+) protože tokeny reasoning se počítají do limitu.\n- **`reasoning_effort`**: Pokud aplikace používá `reasoning_effort` (low\u002Fmedium\u002Fhigh), ponechejte jej — Responses API tento parametr u O-série modelů podporuje.\n- **Chování streamingu**: O-série modely mohou bufferovat výstup, dokud reasoning neskončí, před odesláním delta událostí textu. Streaming stále funguje, ale první `response.output_text.delta` může přijít s delším zpožděním než u GPT modelů.\n- **`top_p`**: Není podporován na O-sérii — odstraňte pokud je přítomen.\n- **Používání nástrojů**: O-série modely podporují nástroje přes Responses API stejně jako GPT modely, ale kvalita orchestrací volání nástrojů se liší podle modelu.\n\n**Akce — proaktivní doporučení ohledně modelu**: Během fáze skenování zkontrolujte, jaký model aplikace používá (názvy nasazení, proměnné prostředí, konfigurace). Pokud model předchází `gpt-4.1` (není gpt-4.1+), proaktivně uživateli sdělte:\n- Migrace bude fungovat pro základní text, chat, streaming a nástroje na jejich aktuálním modelu.\n- Novější modely (`gpt-5.1`, `gpt-5.2`) nabízí lepší orchestraci nástrojů, vynucení strukturovaného výstupu, reasoning a dostupnost v různých regionech.\n- Měli by zvážit upgrade svého nasazení, až budou připraveni — není to ale blokující pro migraci.\n\nNezabraňujte ani neodmítejte migraci na základě verze modelu. Toto doporučení je pouze informativní.\n\n### GitHub Models nepodporuje Responses API\n\n> **GitHub Models (`models.github.ai`, `models.inference.ai.azure.com`) nepodporují Responses API.**\n\nPokud kódová základna obsahuje cestu ke GitHub Models (hledejte `base_url` směřující na `models.github.ai` nebo `models.inference.ai.azure.com`), **odstraňte ji úplně** během migrace. Responses API vyžaduje Azure OpenAI, OpenAI nebo kompatibilní lokální endpoint (např. Ollama s podporou Responses).\n\nAkce během skenování:\n- Označte všechny GitHub Models cesty kódu k odstranění.\n\n---\n\n## Migrace frameworku\n\nMnoho aplikací používá nadstandardní frameworky nad OpenAI. Při migraci těchto se mění API samotného frameworku — nejen podkladové OpenAI volání.\n\n### Microsoft Agent Framework (MAF)\n\n**Nejdříve zkontrolujte svou verzi MAF** — migrace záleží na tom, zda používáte MAF 1.0.0+ nebo před-1.0.0 beta\u002Frc.\n\n#### MAF 1.0.0+ (agent-framework-openai >= 1.0.0)\n\n`OpenAIChatClient` **již používá Responses API** — migrace není potřeba. Pokud kód používá starý `OpenAIChatCompletionClient` (který používá `chat.completions.create`), nahraďte jej `OpenAIChatClient`.\n\n| Před | Po |\n|--------|-------|\n| `from agent_framework.openai import OpenAIChatCompletionClient` | `from agent_framework.openai import OpenAIChatClient` |\n| `OpenAIChatCompletionClient(...)` | `OpenAIChatClient(...)` |\n\nPro kontrolu verze: `python -c \"import agent_framework_openai; print(agent_framework_openai.__version__)\"`\n\n#### MAF před-1.0.0 (beta\u002Frc verze)\n\nV před-1.0.0 MAF `OpenAIChatClient` používal Chat Completions. Upgradujte na `agent-framework-openai>=1.0.0`, kde `OpenAIChatClient` výchozí používá Responses API.\n\nŽádné další změny nejsou potřeba — API `Agent` a nástrojů zůstávají stejné.\n\n### LangChain (`langchain-openai`)\n\nPřidejte `use_responses_api=True` do `ChatOpenAI()`. Také změňte přístup k odpovědi z `.content` na `.text`.\n\n| Před | Po |\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\nKompletní příklady kódu před a po najdete v [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Pokyny pro migraci frontendu\n\n> **Responses API je záležitost serverové strany.** Migrujte svůj Python backend; HTTP kontrakt frontendu by měl zůstat nezměněn, pokud není backend jen tenkým průchodem — v tom případě zvažte přijetí Requests tvaru Responses API k odstranění překladové vrstvy. Pokud frontend volá OpenAI přímo s klíčem na straně klienta, přesuňte tyto volání nejdříve na backend.\n\n### Deprecace `@microsoft\u002Fai-chat-protocol`\n\nNPM balíček `@microsoft\u002Fai-chat-protocol` je zastaralý a měl by být nahrazen [`ndjson-readablestream`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fndjson-readablestream). Pokud ho najdete ve frontendu:\n\n1. Nahraďte CDN tag skriptu:\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. Odstraňte instanci `AIChatProtocolClient` (`new ChatProtocol.AIChatProtocolClient(\"\u002Fchat\")`).\n3. Nahraďte `client.getStreamedCompletion(messages)` přímým voláním `fetch()` na backendový streaming endpoint.\n4. Nahraďte `for await (const response of result)` cyklem `for await (const chunk of readNDJSONStream(response.body))`.\n5. Aktualizujte přístupy k vlastnostem z `response.delta.content` \u002F `response.error` na `chunk.delta.content` \u002F `chunk.error`.\n\n---\n\n## Cíle\n\n- Vypište všechna místa v Python kódu využívající Chat Completions nebo staré Completions vůči Azure OpenAI.\n- Navrhněte plán migrace a pořadí změn pro Python kód.\n- Proveďte bezpečné, minimální úpravy ke změně na Responses API.\n- Aktualizujte volající, aby používali výstupní schéma Responses; bez zpětných kompatibilních obalů.\n- Spusťte testy\u002Flinty; opravte drobné porušení způsobené migrací.\n- Připravte malé, snadno kontrolovatelné změnové sady a poskytněte závěrečné shrnutí s rozdíly (neprovádějte commit).\n\n---\n\n## Zásady\n\n- Měňte pouze soubory uvnitř git workspace. Nikdy nepište mimo něj.\n- Neponechávejte shimové vrstvy zpětné kompatibility; migrujte kód na nový tvar API.\n- Nezanechávejte přechodové komentáře ani záložní soubory.\n- Zachovejte streamovací sémantiku, pokud byla používána; jinak používejte nestreamovací režim.\n- Žádejte schválení před spuštěním příkazů nebo síťových volání v režimu schvalování.\n- Nespouštějte `git add`\u002F`git commit`\u002F`git push`; dělejte pouze úpravy ve stromu pracovního prostoru.\n\n---\n\n## Krok 0: Migrace Azure OpenAI klienta (předpoklad)\n\nPokud kód používá konstruktory `AzureOpenAI` nebo `AsyncAzureOpenAI`, migrujte nejdříve na standardní `OpenAI` \u002F `AsyncOpenAI` konstruktory. Azure-specifické konstruktory jsou zastaralé od `openai>=1.108.1`.\n\n### Proč cesta API v1?\n\nNový endpoint `\u002Fopenai\u002Fv1` používá standardního klienta `OpenAI()` místo `AzureOpenAI()`, nevyžaduje parametr `api_version` a pracuje stejně na OpenAI i Azure OpenAI. Stejný klient je budoucnostově kompatibilní — není potřeba spravovat verze.\n\n### Klíčové změny\n\n| Před | Po |\n|--------|-------|\n| `AzureOpenAI` | `OpenAI` |\n| `AsyncAzureOpenAI` | `AsyncOpenAI` |\n| `azure_endpoint` | `base_url` |\n| `azure_ad_token_provider` | `api_key` |\n| `api_version=...` | Odstranit úplně |\n\n### Kontrolní seznam úklidu\n\n- Odstraňte argument `api_version` z konstrukce klienta.\n- Odstraňte proměnné prostředí `AZURE_OPENAI_VERSION` \u002F `AZURE_OPENAI_API_VERSION` z `.env`, nastavení aplikace i Bicep\u002Finfra souborů.\n- Přejmenujte `AZURE_OPENAI_CLIENT_ID` → `AZURE_CLIENT_ID` v `.env`, nastavení aplikace, Bicep\u002Finfra a testovacích fixturních souborech (standardní konvence Azure Identity SDK).\n- Zajistěte `openai>=1.108.1` v `requirements.txt` nebo `pyproject.toml`.\n\n### Migrace proměnných prostředí\n\n| Starý env var | Akce | Poznámky |\n|-------------|--------|-------|\n| `AZURE_OPENAI_VERSION` | **Odstranit** | S endpointem v1 není třeba `api_version` |\n| `AZURE_OPENAI_API_VERSION` | **Odstranit** | Totéž jako výše |\n| `AZURE_OPENAI_CLIENT_ID` | **Přejmenovat** → `AZURE_CLIENT_ID` | Standardní konvence Azure Identity SDK pro `ManagedIdentityCredential(client_id=...)` |\n| `AZURE_OPENAI_ENDPOINT` | **Zachovat** | Stále potřeba pro konstrukci `base_url` |\n| `AZURE_OPENAI_CHAT_DEPLOYMENT` | **Zachovat** | Používá se jako parametr `model` v `responses.create` |\n| `AZURE_OPENAI_API_KEY` | **Zachovat** | Používá se jako `api_key` pro autentizaci pomocí klíče |\n\nPříklady nastavení klienta (synch, asynch, EntraID, API klíč, multi-tenant) najdete v [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Krok 1: Detekujte stará volání\n\nSpusťte skript [detect_legacy.py](..\u002F..\u002F..\u002F..\u002F..\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py), který najde všechna volání, jež je třeba migrovat:\n\n```bash\npython skills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py .\n```\n\nNebo spusťte tyto vyhledávací dotazy ručně — každý výskyt je cílem migrace:\n\n```bash\n# Volání zastaralého API (nutno přepsat)\nrg \"chat\\.completions\\.create\"\nrg \"ChatCompletion\\.create\"\nrg \"Completion\\.create\"\n\n# Zastaralé konstruktory Azure klientů (nutno nahradit)\nrg \"AzureOpenAI\\(\"\nrg \"AsyncAzureOpenAI\\(\"\n\n# Vzory přístupu ke struktuře odpovědi (nutno aktualizovat)\nrg \"choices\\[0\\]\\.message\\.content\"\nrg \"choices\\[0\\]\\.delta\\.content\"\nrg \"choices\\[0\\]\\.message\\.function_call\"\nrg \"choices\\[0\\]\\.message\\.tool_calls\"\n\n# Definice nástrojů ve starém vnořeném formátu (nutno zploštit)\nrg '\"function\":\\s*{\\s*\"name\"'\nrg \"pydantic_function_tool\"\n\n# Výsledky nástrojů ve starém formátu (nutno převést na function_call_output)\nrg '\"role\":\\s*\"tool\"'\nrg '\"tool_call_id\"'\n\n# Zastaralé parametry (nutno odstranit nebo přejmenovat)\nrg \"response_format\"\nrg \"max_tokens\\b\"        # přejmenovat na max_output_tokens\nrg \"['\\\"]seed['\\\"]\"      # remove entirely\n\n# Zastaralé proměnné prostředí (uklidit)\nrg \"AZURE_OPENAI_API_VERSION|AZURE_OPENAI_VERSION\"\nrg \"AZURE_OPENAI_CLIENT_ID\"  # mělo by být AZURE_CLIENT_ID\n\n# Koncové body GitHub Models (nutno odstranit — Responses API není podporováno)\nrg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"\n\n# Zastaralé vzory na úrovni frameworku (nutno aktualizovat)\nrg \"OpenAIChatCompletionClient\"  # MAF 1.0.0+: nahradit za OpenAIChatClient\nrg \"ChatOpenAI\\(\" | grep -v \"use_responses_api\"  # LangChain: potřeba use_responses_api=True\n\n# Testovací infrastruktura (nutno aktualizovat)\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# Přístup k tělu chyby filtru obsahu (nutno aktualizovat — struktura se změnila)\nrg 'innererror.*content_filter_result|error\\.body\\[\"innererror\"\\]'\nrg \"content_filter_result\\[\" # starý singulární tvar — nyní content_filter_results (množné číslo) uvnitř pole content_filters\n\n# Surová HTTP volání na endpoint Chat Completions (nutno aktualizovat URL)\nrg \"\u002Fopenai\u002Fdeployments\u002F.*\u002Fchat\u002Fcompletions\"\nrg \"api-version=\"\n```\n\n### Heuristika (detekce a přepis)\n\n- **Klient Chat Completions**: `client.chat.completions.create` → `client.responses.create(...)`.\n\n- **Konstruktory klienta Azure**: `AzureOpenAI(...)` → `OpenAI(base_url=..., api_key=...)`.\n- **Nástroje**: převést definice nástrojů pro volání funkcí z vnořeného formátu (`{\"type\": \"function\", \"function\": {\"name\": ...}}`) na plochý formát Responses (`{\"type\": \"function\", \"name\": ...}`); použít `tool_choice`; vracet výsledky nástrojů jako položky `{\"type\": \"function_call_output\", \"call_id\": ..., \"output\": ...}` (nikoli `{\"role\": \"tool\", ...}`).\n- **Návrat nástrojů**: když model vrací volání funkcí, připojit položky `response.output` do konverzace (nikoli ručně `{\"role\": \"assistant\", \"tool_calls\": [...]}` slovník), poté připojit položky `function_call_output` pro každý výsledek.\n- **Příklady nástrojů s několika pokusy**: pokud konverzace obsahuje pevně zakódované příklady volání nástrojů, převést je na položky `{\"type\": \"function_call\", \"id\": \"fc_...\", \"call_id\": \"fc_...\", ...}` + `{\"type\": \"function_call_output\", ...}`. ID musí začínat `fc_`.\n- **`pydantic_function_tool()`**: tento pomocný nástroj stále generuje starý vnořený formát a **není kompatibilní** s `responses.create()`. Nahraďte ručními definicemi nástrojů nebo obalem pro zploštění.\n- **Více kol**: uchovávat historii konverzace v aplikaci; předávat předchozí kola přes položky `input`.\n- **Formátování**: nahradit vrcholové `response_format` v Chatu objektem `text.format` v Responses. Kanonický tvar: `text={\"format\": {\"type\": \"json_schema\", \"name\": \"Output\", \"strict\": True, \"schema\": {...}}}`.\n- **Položky obsahu**: nahradit Chat `content[].type: \"text\"` položkami Responses `content[].type: \"input_text\"` pro tahy uživatele\u002Fsystému.\n- **Položky obrazového obsahu**: nahradit Chat `content[].type: \"image_url\"` položkami Responses `content[].type: \"input_image\"`. Pole `image_url` se mění z vnořeného objektu `{\"url\": \"...\"}` na plochý řetězec. Viz cheat sheet pro příklady před\u002Fpo.\n- **Úsilí o odůvodnění**: **migrujte `reasoning` pouze pokud již existuje v původním kódu**.\n- **Zpracování chyb filtru obsahu**: struktura chybového těla se změnila. Chat Completions používal `error.body[\"innererror\"][\"content_filter_result\"]` (singulár); Responses API používá `error.body[\"content_filters\"][0][\"content_filter_results\"]` (plurál, uvnitř pole). Kód přistupující k `innererror` vyvolá `KeyError`. Přepište na použití nové cesty.\n- **Surová HTTP volání**: pokud aplikace volá přímo Azure OpenAI REST API (pomocí `requests`, `httpx` atd.) přes `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions?api-version=...`, přepište na `\u002Fopenai\u002Fv1\u002Fresponses`. Tělo požadavku se mění: `messages` → `input`, přidat `max_output_tokens` a `store: false`, odstranit query parametr `api-version`. Tělo odpovědi se mění: `choices[0].message.content` → `output[0].content[0].text` (pozn.: `output_text` je vlastnost SDK pro jednodušší přístup, není přítomna v syrovém REST JSON).\n\n---\n\n## Krok 2: Použití migrace\n\n### Poznámky k migraci (Chat Completions → Responses)\n\n- **Proč migrovat**: Responses je sjednocené API pro text, nástroje a streamování; Chat Completions je zastaralé. S GPT-5 je Responses požadováno pro nejlepší výkon.\n- **HTTP**: Azure endpoint se přepíná z `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions` na `\u002Fopenai\u002Fv1\u002Fresponses`.\n- **Pole**: `messages` → `input`, `max_tokens` → `max_output_tokens`. `temperature` zůstává.\n- **Formátování**: `response_format` → `text.format` s vhodným objektem.\n- **Položky obsahu**: nahradit Chat `content[].type: \"text\"` položkami Responses `content[].type: \"input_text\"` pro tahy systému\u002Fuživatele.\n- **Položky obrazového obsahu**: nahradit Chat `content[].type: \"image_url\"` položkami Responses `content[].type: \"input_image\"`. Zploštit pole `image_url` z `{\"image_url\": {\"url\": \"...\"}}` na `{\"image_url\": \"...\"}` (prostý řetězec — HTTPS URL nebo `data:image\u002F...;base64,...` data URI).\n\n### Referenční mapování parametrů\n\n| Chat Completions | Responses API |\n|-----------------|---------------|\n| `prompt` | `input` |\n| `messages` | `input` (pole položek) |\n| `max_tokens` | `max_output_tokens` |\n| `response_format` | `text.format` (objekt) |\n| `temperature` | `temperature` (beze změny) |\n| `stop` | `stop` (beze změny) |\n| `frequency_penalty` | `frequency_penalty` (beze změny) |\n| `presence_penalty` | `presence_penalty` (beze změny) |\n| `tools` \u002F volání funkcí | `tools` (beze změny) |\n| `seed` | **Odstranit** (není podporováno) |\n| `store` | `store` (nastaveno na `false`) |\n| `content[].type: \"text\"` | `content[].type: \"input_text\"` |\n| `content[].type: \"image_url\"` | `content[].type: \"input_image\"` |\n| `\"image_url\": {\"url\": \"...\"}` | `\"image_url\": \"...\"` (plochý řetězec) |\n\nKompletní příklady kódu před a po najdete v [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\nPro migraci testovací infrastruktury (mocks, snapshots, assertions) viz [test-migration.md](.\u002Freferences\u002Ftest-migration.md).\n\nPro řešení problémů a často se vyskytující chyby viz [troubleshooting.md](.\u002Freferences\u002Ftroubleshooting.md).\n\n---\n\n## Uchovávání dat & stav\n\n- Nastavte `store: false` u všech požadavků Responses.\n- Nespoléhejte se na předchozí ID zpráv nebo kontext uložený na serveru; stavební stav spravujte na klientovi a minimalizujte metadata.\n\n---\n\n## Akceptační kritéria\n\n### Kódové kontroly (všechny musí projít)\n\n- [ ] Žádné shody pro `rg \"chat\\.completions\\.create|ChatCompletion\\.create|Completion\\.create\"` v migrovaných souborech.\n- [ ] Žádné shody pro `rg \"AzureOpenAI\\(|AsyncAzureOpenAI\\(\"` — všechny konstruktory používají `OpenAI`\u002F`AsyncOpenAI` s v1 endpointem.\n- [ ] Žádné shody pro `rg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"` — cesty kódu GitHub Models odstraněny.\n- [ ] Žádné shody pro `rg \"OpenAIChatCompletionClient\"` — kód MAF 1.0.0+ používá `OpenAIChatClient` (který používá Responses API). U verzí před 1.0.0 přejděte na `agent-framework-openai>=1.0.0`.\n- [ ] Všechny volání `ChatOpenAI(...)` obsahují `use_responses_api=True`.\n- [ ] Žádné shody pro `rg \"choices\\[0\\]\"` — veškerý přístup k odpovědi používá `resp.output_text` nebo schéma výstupu Responses.\n- [ ] Není žádný `response_format` na nejvyšší úrovni; veškerý strukturovaný výstup používá `text={\"format\": {...}}`.\n- [ ] `openai>=1.108.1` a `azure-identity` v `requirements.txt` nebo `pyproject.toml`; závislosti přebudovány.\n- [ ] Nastaveno `store=False` u každého volání `responses.create`.\n- [ ] Žádná `api_version` při konstrukci klienta; `AZURE_OPENAI_API_VERSION` odstraněn z environmentálních souborů a infrastruktury.\n\n### Kontroly testovací infrastruktury (všechny musí projít)\n\n- [ ] Žádné shody pro `rg \"ChatCompletionChunk|AsyncCompletions\\.create|chat\\.completions\" tests\u002F`.\n- [ ] Žádné shody pro `rg \"_azure_ad_token_provider\" tests\u002F` — assertace aktualizovány tak, aby kontrolovaly `isinstance(client, AsyncOpenAI)` nebo `base_url`.\n- [ ] Žádné shody pro `rg \"prompt_filter_results|content_filter_results\" tests\u002F` — Azure-specifické filtry odebrány.\n- [ ] Mock fixtures používají `kwargs.get(\"input\")` místo `kwargs.get(\"messages\")`.\n- [ ] Soubory snapshot\u002Fgolden aktualizovány na tvar streamování Responses (bez `choices[0]`, `function_call`, `logprobs` atd.).\n- [ ] `pytest` projde bez chyb po všech aktualizacích testů.\n\n### Chování (ověřit ručně nebo pomocí test harness)\n\n- [ ] **Základní dokončení**: ne-streamované `responses.create` vrací neprázdný `output_text`.\n- [ ] **Parita streamu**: pokud původní kód používal streamování, migrovaný kód streamuje a vydává události `response.output_text.delta` s neprázdnými deltami.\n- [ ] **Strukturovaný výstup**: pokud se používá `text.format` s `json_schema`, `json.loads(resp.output_text)` uspěje a odpovídá schématu.\n- [ ] **Smyčka volání nástroje**: pokud jsou použity nástroje, model vydává volání nástroje, aplikace je spouští a následný požadavek vrací konečný `output_text` (bez nekonečné smyčky).\n- [ ] **Async parita**: pokud byl použit `AsyncAzureOpenAI`, funguje ekvivalent `AsyncOpenAI` s `await`.\n- [ ] **Míra chyb**: žádné nové chyby 400\u002F401\u002F404 oproti před-migračnímu základu.\n\n### Výstupy\n\n- Shrnutí obsahuje upravené soubory, počty před\u002Fpo starých voláních a další kroky.\n- Změny jsou pouze úpravy pracovního stromu (žádné commity).\n\n---\n\n## Požadavky na verze SDK\n\n| Balíček | Minimální verze |\n|---------|----------------|\n| `openai` | `>=1.108.1` |\n| `azure-identity` | Nejnovější (pro EntraID autentizaci) |\n\n---\n\n## Reference\n\n- [Cheat Sheet — všechny ukázky kódu](.\u002Freferences\u002Fcheat-sheet.md)\n- [Test Migration — mocky, snapshoty, assertace](.\u002Freferences\u002Ftest-migration.md)\n- [Troubleshooting — chyby, tabulka rizik, nástrahy](.\u002Freferences\u002Ftroubleshooting.md)\n- [detect_legacy.py — automatizovaný skener](..\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- [Životní cyklus verze Azure OpenAI API](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**Prohlášení o omezení odpovědnosti**:\nTento dokument byl přeložen pomocí AI překladatelské služby [Co-op Translator](https:\u002F\u002Fgithub.com\u002FAzure\u002Fco-op-translator). Přestože usilujeme o co největší přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Originální dokument v jeho mateřském jazyce by měl být považován za autoritativní zdroj. Pro kritické informace se doporučuje profesionální lidský překlad. Nejsme odpovědní za jakékoli nedorozumění nebo nesprávné interpretace vzniklé použitím tohoto překladu.\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER END -->",{"name":5,"license":14},"main","f09e94ffe170f8af6d3db7c42987bbe4db227723","translations\u002Fcs\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\u002Fcs\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","参考文档",29551,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fcs\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",7511,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fcs\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Freferences\u002Ftest-migration.md",{"path":59,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":60,"sourceHtmlUrl":61},"references\u002Ftroubleshooting.md",16262,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fcs\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]]