[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M699RBE3QKV886R5EV70R64X":3,"skill-same:01M699RBE3QKV886R5EV70R64X":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},"01M699RBE3QKV886R5EV70R64X","azure-openai-to-responses",null,"microsoft\u002Fai-agents-for-beginners","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M6998ZK2275KMJE6Y5SEA2X2",79567,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fpl\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# Migracja aplikacji Python z Azure OpenAI Chat Completions do Responses API\n\n> **AUTORYTATYWNE WSKAZÓWKI — POSTĘPUJ ZGODNIE Z NIMI**\n>\n> Ten zestaw umiejętności migruje kod Python używający Azure OpenAI Chat Completions\n> do zunifikowanego Responses API. Postępuj zgodnie z tymi instrukcjami dokładnie.\n> Nie wymyślaj mapowania parametrów ani nowych kształtów API.\n\n---\n\n## Wyzwalacze\n\nAktywuj tę umiejętność, gdy użytkownik chce:\n- Migrować aplikację Python z Azure OpenAI Chat Completions do Responses API\n- Zaktualizować użycie Python OpenAI SDK do najnowszego kształtu API dla Azure OpenAI\n- Przygotować kod Python dla modeli GPT-5 lub nowszych, które wymagają Responses na Azure\n- Przełączyć się z `AzureOpenAI`\u002F`AsyncAzureOpenAI` na standardowy klient `OpenAI`\u002F`AsyncOpenAI` z endpointem v1\n- Naprawić ostrzeżenia o wycofaniu związane z konstruktorami `AzureOpenAI` lub `api_version`\n\n---\n\n## ⚠️ Zgodność modeli — SPRAWDŹ NAJPIERW\n\n> **Przed migracją zweryfikuj, czy Twoje wdrożenie Azure OpenAI obsługuje Responses API.**\n\n### 1. Test dymny wdrożenia (najszybszy)\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> **Uwaga**: `max_output_tokens` ma **minimum 16** na Azure OpenAI. Wartości poniżej 16 zwracają błąd 400. Używaj 50+ do testów dymnych.\n\nJeśli zwraca 404, model wdrożenia jeszcze nie obsługuje Responses — sprawdź poniższe odniesienia lub ponownie wdroż model obsługujący.\n\n### 2. Sprawdź dostępne modele w twoim regionie (zalecane)\n\nUruchom wbudowane narzędzie zgodności modeli, aby zobaczyć, co jest dostępne z wsparciem Responses API w twoim regionie:\n\n```bash\npython migrate.py models --subscription YOUR_SUB_ID --location YOUR_REGION\n```\n\nTo zapytanie bezpośrednio do Azure ARM i pokazuje macierz zgodności — które modele wspierają Responses, zorganizowany output, narzędzia itp. Użyj `--filter gpt-5.1,gpt-5.2` do zawężenia wyników lub `--json` dla skryptów.\n\n### 3. Pełne odniesienie wsparcia modeli\n\n- **Zapytanie na żywo**: `python migrate.py models` (patrz wyżej — specyficzne dla regionu, zawsze aktualne)\n- **Przegląd dostępności**: [Tabela podsumowania modeli i dostępność w regionach](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- **Szybki start i wskazówki**: **https:\u002F\u002Faka.ms\u002Fopenai\u002Fstart**\n\n### ⚠️ Ograniczenia starszych modeli\n\n> **OSTRZEŻENIE**: Starsze modele (te wcześniejsze niż `gpt-4.1`) mogą nie wspierać w pełni wszystkich funkcji Responses API.\n>\n> Znane ograniczenia starszych modeli:\n> - **parametr `reasoning`**: Nieobsługiwany w wielu modelach bez reasoning. Migruj `reasoning` tylko jeśli był już w oryginalnym kodzie.\n> - **parametr `seed`**: W Responses API w ogóle nie jest wspierany — usuń ze wszystkich zapytań.\n> - **Zorganizowany output za pomocą `text.format`**: Starsze modele mogą nie wymuszać schematów JSON z `strict: true` wiarygodnie.\n> - **Orkiestracja narzędzi**: GPT-5+ orkiestruje wywołania narzędzi w ramach wewnętrznego reasoning. Starsze modele na Responses działają, ale bez tej głębokiej integracji.\n> - **Ograniczenia temperatury**: Przy migracji do `gpt-5` temperatura musi być pominięta lub ustawiona na `1`. Starsze modele tego ograniczenia nie mają.\n\n### Modele reasoning serii O (o1, o3-mini, o3, o4-mini)\n\nModele serii O mają unikalne ograniczenia parametrów. Przy migracji aplikacji celujących w modele serii O:\n\n- **`temperature`**: Musi być `1` (lub pominięte). Modele serii O nie akceptują innych wartości.\n- **`max_completion_tokens` → `max_output_tokens`**: Aplikacje używające Azure-specyficznego `max_completion_tokens` muszą przełączyć się na `max_output_tokens`. Ustaw wysokie wartości (4096+), ponieważ tokeny reasoning liczą się do limitu.\n- **`reasoning_effort`**: Jeśli aplikacja używa `reasoning_effort` (low\u002Fmedium\u002Fhigh), zachowaj go — Responses API wspiera ten parametr dla modeli serii O.\n- **Zachowanie streamingu**: Modele serii O mogą buforować output do zakończenia reasoning przed emitowaniem zdarzeń tekstowych delta. Streaming działa, ale pierwszy `response.output_text.delta` może przyjść z większym opóźnieniem niż w modelach GPT.\n- **`top_p`**: Nieobsługiwany na serii O — usuń jeśli obecny.\n- **Użycie narzędzi**: Modele serii O wspierają narzędzia przez Responses API jak modele GPT, ale jakość orkiestracji wywołań narzędzi różni się w zależności od modelu.\n\n**Działanie — proaktywna porada modelowa**: Podczas fazy skanu sprawdź, który model aplikacja celuje (nazwy wdrożeń, zmienne środowiskowe, konfig). Jeśli model jest wcześniejszy niż `gpt-4.1` (nie gpt-4.1+), poinformuj użytkownika proaktywnie:\n- Migracja będzie działać dla podstawowego tekstu, czatu, streamingu i narzędzi na ich obecnym modelu.\n- Nowe modele (`gpt-5.1`, `gpt-5.2`) oferują lepszą orkiestrację narzędzi, wymuszanie zorganizowanego outputu, reasoning i dostępność międzyregionową.\n- Powinni rozważyć aktualizację wdrożenia, gdy będą gotowi — nie blokuje to migracji.\n\nNie blokuj ani nie odmawiaj migracji ze względu na wersję modelu. Porada ma charakter informacyjny.\n\n### GitHub Models NIE obsługuje Responses API\n\n> **GitHub Models (`models.github.ai`, `models.inference.ai.azure.com`) nie obsługuje Responses API.**\n\nJeśli kod zawiera ścieżkę kodu GitHub Models (szukaj `base_url` wskazującego na `models.github.ai` lub `models.inference.ai.azure.com`), **usuń ją całkowicie** podczas migracji. Responses API wymaga Azure OpenAI, OpenAI lub kompatybilnego lokalnego endpointu (np. Ollama z obsługą Responses).\n\nDziałanie podczas skanu:\n- Oznacz każdą ścieżkę kodu GitHub Models do usunięcia.\n\n---\n\n## Migracja frameworków\n\nWiele aplikacji używa wyższych warstw frameworków na OpenAI. Podczas migracji tych frameworków zmienia się ich własne API — nie tylko wywołania OpenAI w tle.\n\n### Microsoft Agent Framework (MAF)\n\n**Sprawdź najpierw swoją wersję MAF** — migracja zależy od tego, czy masz MAF 1.0.0+ czy wersje beta\u002Frc przed 1.0.0.\n\n#### MAF 1.0.0+ (agent-framework-openai >= 1.0.0)\n\n`OpenAIChatClient` **już używa Responses API** — migracja nie jest potrzebna. Jeśli kod używa legacy `OpenAIChatCompletionClient` (używającego `chat.completions.create`), zastąp go `OpenAIChatClient`.\n\n| Przed | Po |\n|--------|-----|\n| `from agent_framework.openai import OpenAIChatCompletionClient` | `from agent_framework.openai import OpenAIChatClient` |\n| `OpenAIChatCompletionClient(...)` | `OpenAIChatClient(...)` |\n\nAby sprawdzić wersję: `python -c \"import agent_framework_openai; print(agent_framework_openai.__version__)\"`\n\n#### MAF pre-1.0.0 (wersje beta\u002Frc)\n\nW pre-1.0.0 MAF `OpenAIChatClient` używał Chat Completions. Zaktualizuj do `agent-framework-openai>=1.0.0` gdzie `OpenAIChatClient` domyślnie używa Responses API.\n\nInne zmiany nie są potrzebne — API `Agent` i narzędzi pozostają takie same.\n\n### LangChain (`langchain-openai`)\n\nDodaj `use_responses_api=True` do `ChatOpenAI()`. Aktualizuj dostęp do odpowiedzi z `.content` na `.text`.\n\n| Przed | 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\nPełne przykłady kodu przed\u002Fpo znajdziesz w [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Wskazówki dotyczące migracji frontendów\n\n> **Responses API to kwestia serwerowa.** Migruj backend w Pythonie; kontrakt HTTP frontendu powinien pozostać niezmieniony o ile backend nie jest cienką warstwą przejściową — wtedy rozważ adaptację kształtu zapytań Responses, aby wyeliminować warstwę tłumaczenia. Jeśli frontend wywołuje OpenAI bezpośrednio z kluczem klienta, przenieś te wywołania najpierw do backendu.\n\n### Deprecacja `@microsoft\u002Fai-chat-protocol`\n\nPakiet npm `@microsoft\u002Fai-chat-protocol` jest przestarzały i powinien zostać zastąpiony przez [`ndjson-readablestream`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fndjson-readablestream). Jeśli masz go na froncie:\n\n1. Zamień tag skryptu CDN:\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. Usuń instancjonowanie `AIChatProtocolClient` (`new ChatProtocol.AIChatProtocolClient(\"\u002Fchat\")`).\n3. Zamień `client.getStreamedCompletion(messages)` na bezpośrednie wywołanie `fetch()` do endpointu backendowego ze streamingiem.\n4. Zamień `for await (const response of result)` na `for await (const chunk of readNDJSONStream(response.body))`.\n5. Aktualizuj dostęp do właściwości z `response.delta.content` \u002F `response.error` na `chunk.delta.content` \u002F `chunk.error`.\n\n---\n\n## Cele\n\n- Wypisz wszystkie miejsca wywołań w Pythonie używające Chat Completions lub legacy Completions z Azure OpenAI.\n- Zaproponuj plan migracji i kolejność dla bazy kodu Python.\n- Wykonaj bezpieczne, minimalne poprawki do przełączenia na Responses API.\n- Zaktualizuj wywołania do konsumowania schematu outputu Responses; brak warstw kompatybilności.\n- Uruchom testy\u002Fanalizę statyczną; napraw drobne błędy spowodowane migracją.\n- Przygotuj małe, możliwe do review zestawy zmian i podaj końcowe podsumowanie z różnicami (nie zatwierdzaj).\n\n---\n\n## Zasady ochronne\n\n- Modyfikuj tylko pliki w workspace git. Nigdy nie zapisuj na zewnątrz.\n- Nie zachowuj kompatybilności wstecznej; migruj kod do nowego kształtu API.\n- Nie zostawiaj komentarzy przejściowych ani kopii zapasowych.\n- Zachowaj semantykę streamingu, jeśli była używana; inaczej użyj wariantu bez streamingu.\n- W trybie zatwierdzania żądaj aprobaty przed uruchomieniem poleceń lub połączeń sieciowych.\n- Nie wykonuj `git add`\u002F`git commit`\u002F`git push`; prodkuj tylko zmiany w working-tree.\n\n---\n\n## Krok 0: Migracja klienta Azure OpenAI (wymaganie wstępne)\n\nJeśli kod używa konstruktorów `AzureOpenAI` lub `AsyncAzureOpenAI`, najpierw migruj do standardowych konstruktorów `OpenAI` \u002F `AsyncOpenAI`. Konstruktorzy specyficzni dla Azure są wycofani w `openai>=1.108.1`.\n\n### Dlaczego ścieżka API v1?\n\nNowy endpoint `\u002Fopenai\u002Fv1` używa standardowego klienta `OpenAI()` zamiast `AzureOpenAI()`, nie wymaga parametru `api_version` i działa identycznie na OpenAI i Azure OpenAI. Ten sam klient jest przyszłościowy — nie wymaga zarządzania wersjami.\n\n### Kluczowe zmiany\n\n| Przed | Po |\n|--------|-----|\n| `AzureOpenAI` | `OpenAI` |\n| `AsyncAzureOpenAI` | `AsyncOpenAI` |\n| `azure_endpoint` | `base_url` |\n| `azure_ad_token_provider` | `api_key` |\n| `api_version=...` | Usuń całkowicie |\n\n### Lista kontrolna sprzątania\n\n- Usuń argument `api_version` z konstrukcji klienta.\n- Usuń zmienne środowiskowe `AZURE_OPENAI_VERSION` \u002F `AZURE_OPENAI_API_VERSION` z `.env`, ustawień aplikacji i plików Bicep\u002Finfrastruktury.\n- Zmień nazwę `AZURE_OPENAI_CLIENT_ID` → `AZURE_CLIENT_ID` w `.env`, ustawieniach, Bicep\u002Finfra i fixture testowych (standardowa konwencja SDK Azure Identity).\n- Upewnij się, że `openai>=1.108.1` jest w `requirements.txt` lub `pyproject.toml`.\n\n### Migracja zmiennych środowiskowych\n\n| Stara zmienna env | Działanie | Uwagi |\n|-------------|--------|-------|\n| `AZURE_OPENAI_VERSION` | **Usuń** | Nie potrzebny `api_version` z endpointem v1 |\n| `AZURE_OPENAI_API_VERSION` | **Usuń** | To samo co powyżej |\n| `AZURE_OPENAI_CLIENT_ID` | **Zmień nazwę** → `AZURE_CLIENT_ID` | Standardowa konwencja SDK Azure Identity dla `ManagedIdentityCredential(client_id=...)` |\n| `AZURE_OPENAI_ENDPOINT` | **Zachowaj** | Nadal potrzebny do budowy `base_url` |\n| `AZURE_OPENAI_CHAT_DEPLOYMENT` | **Zachowaj** | Używany jako parametr `model` w `responses.create` |\n| `AZURE_OPENAI_API_KEY` | **Zachowaj** | Używany jako `api_key` do uwierzytelniania kluczem |\n\nPrzykłady konfiguracji klienta (sync, async, EntraID, klucz API, multi-tenant) znajdziesz w [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Krok 1: Wykrywanie miejsc wywołań legacy\n\nUruchom skrypt [detect_legacy.py](..\u002F..\u002F..\u002F..\u002F..\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py), aby znaleźć wszystkie miejsca wywołań wymagające migracji:\n\n```bash\npython skills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py .\n```\n\nLub wyszukaj ręcznie — każdy traf jest celem migracji:\n\n```bash\n# Dziedziczne wywołania API (należy przepisać)\nrg \"chat\\.completions\\.create\"\nrg \"ChatCompletion\\.create\"\nrg \"Completion\\.create\"\n\n# Przestarzałe konstruktory klienta Azure (należy zastąpić)\nrg \"AzureOpenAI\\(\"\nrg \"AsyncAzureOpenAI\\(\"\n\n# Wzorce dostępu do struktury odpowiedzi (należy zaktualizować)\nrg \"choices\\[0\\]\\.message\\.content\"\nrg \"choices\\[0\\]\\.delta\\.content\"\nrg \"choices\\[0\\]\\.message\\.function_call\"\nrg \"choices\\[0\\]\\.message\\.tool_calls\"\n\n# Definicje narzędzi w starej zagnieżdżonej formie (należy spłaszczyć)\nrg '\"function\":\\s*{\\s*\"name\"'\nrg \"pydantic_function_tool\"\n\n# Wyniki narzędzi w starym formacie (należy przekonwertować na function_call_output)\nrg '\"role\":\\s*\"tool\"'\nrg '\"tool_call_id\"'\n\n# Przestarzałe parametry (należy usunąć lub zmienić nazwę)\nrg \"response_format\"\nrg \"max_tokens\\b\"        # zmień nazwę na max_output_tokens\nrg \"['\\\"]seed['\\\"]\"      # remove entirely\n\n# Przestarzałe zmienne środowiskowe (posprzątać)\nrg \"AZURE_OPENAI_API_VERSION|AZURE_OPENAI_VERSION\"\nrg \"AZURE_OPENAI_CLIENT_ID\"  # powinno być AZURE_CLIENT_ID\n\n# Punkty końcowe modeli GitHub (należy usunąć — API odpowiedzi nie jest wspierane)\nrg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"\n\n# Dziedziczne wzorce na poziomie frameworka (należy zaktualizować)\nrg \"OpenAIChatCompletionClient\"  # MAF 1.0.0+: zastąp OpenAIChatClient\nrg \"ChatOpenAI\\(\" | grep -v \"use_responses_api\"  # LangChain: wymaga use_responses_api=True\n\n# Infrastruktura testowa (należy zaktualizować)\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# Dostęp do ciała błędu filtra treści (należy zaktualizować — zmieniona struktura)\nrg 'innererror.*content_filter_result|error\\.body\\[\"innererror\"\\]'\nrg \"content_filter_result\\[\" # stara forma pojedyncza — teraz content_filter_results (liczba mnoga) wewnątrz tablicy content_filters\n\n# Surowe wywołania HTTP do punktu końcowego Chat Completions (należy zaktualizować URL)\nrg \"\u002Fopenai\u002Fdeployments\u002F.*\u002Fchat\u002Fcompletions\"\nrg \"api-version=\"\n```\n\n### Heurystyki (wykrywanie i przepisywanie)\n\n- **Klient Chat Completions**: `client.chat.completions.create` → `client.responses.create(...)`.\n\n- **Konstruktory klienta Azure**: `AzureOpenAI(...)` → `OpenAI(base_url=..., api_key=...)`.\n- **Narzędzia**: konwertuj definicje narzędzi do wywołania funkcji z formatu zagnieżdżonego (`{\"type\": \"function\", \"function\": {\"name\": ...}}`) na płaski format Responses (`{\"type\": \"function\", \"name\": ...}`); używaj `tool_choice`; zwracaj wyniki narzędzi jako elementy `{\"type\": \"function_call_output\", \"call_id\": ..., \"output\": ...}` (nie jako `{\"role\": \"tool\", ...}`).\n- **Obrót narzędzi**: gdy model zwraca wywołania funkcji, dopisuj elementy `response.output` do konwersacji (nie ręcznie słownik `{\"role\": \"assistant\", \"tool_calls\": [...]}`), następnie dopisuj elementy `function_call_output` dla każdego wyniku.\n- **Przykłady wielu wywołań narzędzi**: jeśli konwersacja zawiera na stałe zakodowane przykłady wywołań narzędzi, konwertuj je na elementy `{\"type\": \"function_call\", \"id\": \"fc_...\", \"call_id\": \"fc_...\", ...}` + `{\"type\": \"function_call_output\", ...}`. Identyfikatory muszą zaczynać się od `fc_`.\n- **`pydantic_function_tool()`**: ten helper nadal generuje stary format zagnieżdżony i jest **niekompatybilny** z `responses.create()`. Zastąp go ręcznymi definicjami narzędzi lub opakowaniem spłaszczającym.\n- **Wielokrotne tury**: utrzymuj historię konwersacji w aplikacji; przekazuj poprzednie tury przez elementy `input`.\n- **Formatowanie**: zamień górnopoziomowy `response_format` w Chat na `text.format` w Responses. Kanoniczny kształt: `text={\"format\": {\"type\": \"json_schema\", \"name\": \"Output\", \"strict\": True, \"schema\": {...}}}`.\n- **Elementy treści**: zamień Chat `content[].type: \"text\"` na Responses `content[].type: \"input_text\"` dla tur użytkownika\u002Fsystemu.\n- **Elementy treści obrazów**: zamień Chat `content[].type: \"image_url\"` na Responses `content[].type: \"input_image\"`. Pole `image_url` zmienia się z obiektu zagnieżdżonego `{\"url\": \"...\"}` na pusty string. Zobacz ściągę dla przykładów przed\u002Fpo.\n- **Wysiłek rozumowania**: **migracja `reasoning` tylko jeśli już jest w oryginalnym kodzie**.\n- **Obsługa błędów filtru treści**: struktura błędu uległa zmianie. Chat Completions używało `error.body[\"innererror\"][\"content_filter_result\"]` (pojedyncze); Responses API używa `error.body[\"content_filters\"][0][\"content_filter_results\"]` (liczne, w tablicy). Kod odwołujący się do `innererror` zgłosi `KeyError`. Przeredaguj, by używać nowej ścieżki.\n- **Surowe wywołania HTTP**: jeśli aplikacja wywołuje Azure OpenAI REST API bezpośrednio (przez `requests`, `httpx` itd.) używając `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions?api-version=...`, zmień na `\u002Fopenai\u002Fv1\u002Fresponses`. Treść żądania zmienia się: `messages` → `input`, dodaj `max_output_tokens` i `store: false`, usuń parametr `api-version`. Treść odpowiedzi zmienia się: `choices[0].message.content` → `output[0].content[0].text` (uwaga: `output_text` to właściwość ułatwiająca w SDK, nieobecna w surowym JSON REST).\n\n---\n\n## Krok 2: Zastosuj migrację\n\n### Notatki migracyjne (Chat Completions → Responses)\n\n- **Dlaczego migrować**: Responses to zunifikowane API dla tekstu, narzędzi i streamingu; Chat Completions jest przestarzałe. Od GPT-5 wymagane jest korzystanie z Responses dla najlepszej wydajności.\n- **HTTP**: punkt końcowy Azure zmienia się z `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions` na `\u002Fopenai\u002Fv1\u002Fresponses`.\n- **Pola**: `messages` → `input`, `max_tokens` → `max_output_tokens`. `temperature` bez zmian.\n- **Formatowanie**: `response_format` → `text.format` z odpowiednim obiektem.\n- **Elementy treści**: zamień Chat `content[].type: \"text\"` na Responses `content[].type: \"input_text\"` dla tur systemu\u002Fużytkownika.\n- **Elementy treści obrazów**: zamień Chat `content[].type: \"image_url\"` na Responses `content[].type: \"input_image\"`. Spłaszcz pole `image_url` z `{\"image_url\": {\"url\": \"...\"}}` na `{\"image_url\": \"...\"}` (zwykły string — URL HTTPS lub URI `data:image\u002F...;base64,...`).\n\n### Odniesienie mapowania parametrów\n\n| Chat Completions | Responses API |\n|-----------------|---------------|\n| `prompt` | `input` |\n| `messages` | `input` (tablica elementów) |\n| `max_tokens` | `max_output_tokens` |\n| `response_format` | `text.format` (obiekt) |\n| `temperature` | `temperature` (bez zmian) |\n| `stop` | `stop` (bez zmian) |\n| `frequency_penalty` | `frequency_penalty` (bez zmian) |\n| `presence_penalty` | `presence_penalty` (bez zmian) |\n| `tools` \u002F wywołanie funkcji | `tools` (bez zmian) |\n| `seed` | **Usuń** (nieobsługiwane) |\n| `store` | `store` (ustaw 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\": \"...\"` (płaski string) |\n\nPełne przykłady kodu przed\u002Fpo znajdziesz w [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\nDla migracji infrastruktury testowej (mocks, snapshots, asercje), zobacz [test-migration.md](.\u002Freferences\u002Ftest-migration.md).\n\nDla rozwiązywania problemów i pułapek, zobacz [troubleshooting.md](.\u002Freferences\u002Ftroubleshooting.md).\n\n---\n\n## Przechowywanie danych i stan\n\n- Ustaw `store: false` we wszystkich żądaniach Responses.\n- Nie polegaj na poprzednich ID wiadomości ani na kontekście przechowywanym na serwerze; zarządzaj stanem po stronie klienta i minimalizuj metadane.\n\n---\n\n## Kryteria akceptacji\n\n### Bramy na poziomie kodu (wszystkie muszą przejść)\n\n- [ ] Brak trafień dla `rg \"chat\\.completions\\.create|ChatCompletion\\.create|Completion\\.create\"` w zmigrowanych plikach.\n- [ ] Brak trafień dla `rg \"AzureOpenAI\\(|AsyncAzureOpenAI\\(\"` — wszystkie konstruktory używają `OpenAI`\u002F`AsyncOpenAI` z punktem końcowym v1.\n- [ ] Brak trafień dla `rg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"` — ścieżki kodu GitHub Models usunięte.\n- [ ] Brak trafień dla `rg \"OpenAIChatCompletionClient\"` — kod MAF 1.0.0+ używa `OpenAIChatClient` (który korzysta z Responses API). W wersji pre-1.0.0 zaktualizuj do `agent-framework-openai>=1.0.0`.\n- [ ] Wszystkie wywołania `ChatOpenAI(...)` zawierają `use_responses_api=True`.\n- [ ] Brak trafień dla `rg \"choices\\[0\\]\"` — cały dostęp do odpowiedzi używa `resp.output_text` lub schematu wyjściowego Responses.\n- [ ] Brak `response_format` na poziomie głównym; całe wyjście strukturalne używa `text={\"format\": {...}}`.\n- [ ] `openai>=1.108.1` i `azure-identity` w `requirements.txt` lub `pyproject.toml`; zależności zainstalowane ponownie.\n- [ ] `store=False` ustawione przy każdym wywołaniu `responses.create`.\n- [ ] Brak `api_version` w konstrukcji klienta; `AZURE_OPENAI_API_VERSION` usunięte z plików środowiskowych i infrastruktury.\n\n### Bramy infrastruktury testowej (wszystkie muszą przejść)\n\n- [ ] Brak trafień dla `rg \"ChatCompletionChunk|AsyncCompletions\\.create|chat\\.completions\" tests\u002F`.\n- [ ] Brak trafień dla `rg \"_azure_ad_token_provider\" tests\u002F` — asercje zaktualizowane, aby sprawdzać `isinstance(client, AsyncOpenAI)` lub `base_url`.\n- [ ] Brak trafień dla `rg \"prompt_filter_results|content_filter_results\" tests\u002F` — usunięto filtry specyficzne dla Azure.\n- [ ] Mocki używają `kwargs.get(\"input\")` zamiast `kwargs.get(\"messages\")`.\n- [ ] Snapshopy \u002F pliki golden zaktualizowane do formatu streamingowego Responses (brak `choices[0]`, `function_call`, `logprobs` itp.).\n- [ ] `pytest` przechodzi bez błędów po wszystkich aktualizacjach testów.\n\n### Bramy zachowań (weryfikacja ręczna lub przez zestaw testów)\n\n- [ ] **Podstawowe uzupełnienie**: niestreamingowe `responses.create` zwraca niepusty `output_text`.\n- [ ] **Parzystość streamingu**: jeśli oryginalny kod używał streamingu, kod po migracji strumieniuje i generuje zdarzenia `response.output_text.delta` z niepustymi delta.\n- [ ] **Strukturalne wyjście**: jeśli używasz `text.format` z `json_schema`, `json.loads(resp.output_text)` kończy się sukcesem i pasuje do schematu.\n- [ ] **Pętla wywołań narzędzi**: jeśli używane są narzędzia, model wykonuje wywołania narzędzi, aplikacja je wykonuje, a zapytanie następcze zwraca finalny `output_text` (bez nieskończonych pętli).\n- [ ] **Parzystość asynchroniczna**: jeśli używano `AsyncAzureOpenAI`, równoważnik `AsyncOpenAI` działa z `await`.\n- [ ] **Wskaźnik błędów**: brak nowych błędów 400\u002F401\u002F404 w porównaniu do stanu przed migracją.\n\n### Dostawy\n\n- Podsumowanie zawiera edytowane pliki, liczbę wywołań legacy przed\u002Fpo i kolejne kroki.\n- Zmiany to tylko edycje w drzewie roboczym (bez commitów).\n\n---\n\n## Wymagania wersji SDK\n\n| Pakiet | Minimalna wersja |\n|--------|----------------|\n| `openai` | `>=1.108.1` |\n| `azure-identity` | Najnowsza (dla uwierzytelniania EntraID) |\n\n---\n\n## Odnośniki\n\n- [Cheat Sheet — wszystkie fragmenty kodu](.\u002Freferences\u002Fcheat-sheet.md)\n- [Test Migration — mocki, snapshoty, asercje](.\u002Freferences\u002Ftest-migration.md)\n- [Troubleshooting — błędy, tabela ryzyka, pułapki](.\u002Freferences\u002Ftroubleshooting.md)\n- [detect_legacy.py — automatyczny skaner](..\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- [Dokumentacja Azure OpenAI Responses API](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fhow-to\u002Fresponses)\n- [Cykl życia wersji API Azure OpenAI](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**Zastrzeżenie**:\nNiniejszy dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https:\u002F\u002Fgithub.com\u002FAzure\u002Fco-op-translator). Choć dążymy do dokładności, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub niedokładności. Oryginalny dokument w jego języku źródłowym należy uznawać za autorytatywne źródło. W przypadku informacji krytycznych zalecane jest skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER END -->","# Migracja aplikacji Python z Azure OpenAI Chat Completions do Responses API\n\n> **AUTORYTATYWNE WSKAZÓWKI — POSTĘPUJ ZGODNIE Z NIMI**\n>\n> Ten zestaw umiejętności migruje kod Python używający Azure OpenAI Chat Completions\n> do zunifikowanego Responses API. Postępuj zgodnie z tymi instrukcjami dokładnie.\n> Nie wymyślaj mapowania parametrów ani nowych kształtów API.\n\n---\n\n## Wyzwalacze\n\nAktywuj tę umiejętność, gdy użytkownik chce:\n- Migrować aplikację Python z Azure OpenAI Chat Completions do Responses API\n- Zaktualizować użycie Python OpenAI SDK do najnowszego kształtu API dla Azure OpenAI\n- Przygotować kod Python dla modeli GPT-5 lub nowszych, które wymagają Responses na Azure\n- Przełączyć się z `AzureOpenAI`\u002F`AsyncAzureOpenAI` na standardowy klient `OpenAI`\u002F`AsyncOpenAI` z endpointem v1\n- Naprawić ostrzeżenia o wycofaniu związane z konstruktorami `AzureOpenAI` lub `api_version`\n\n---\n\n## ⚠️ Zgodność modeli — SPRAWDŹ NAJPIERW\n\n> **Przed migracją zweryfikuj, czy Twoje wdrożenie Azure OpenAI obsługuje Responses API.**\n\n### 1. Test dymny wdrożenia (najszybszy)\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> **Uwaga**: `max_output_tokens` ma **minimum 16** na Azure OpenAI. Wartości poniżej 16 zwracają błąd 400. Używaj 50+ do testów dymnych.\n\nJeśli zwraca 404, model wdrożenia jeszcze nie obsługuje Responses — sprawdź poniższe odniesienia lub ponownie wdroż model obsługujący.\n\n### 2. Sprawdź dostępne modele w twoim regionie (zalecane)\n\nUruchom wbudowane narzędzie zgodności modeli, aby zobaczyć, co jest dostępne z wsparciem Responses API w twoim regionie:\n\n```bash\npython migrate.py models --subscription YOUR_SUB_ID --location YOUR_REGION\n```\n\nTo zapytanie bezpośrednio do Azure ARM i pokazuje macierz zgodności — które modele wspierają Responses, zorganizowany output, narzędzia itp. Użyj `--filter gpt-5.1,gpt-5.2` do zawężenia wyników lub `--json` dla skryptów.\n\n### 3. Pełne odniesienie wsparcia modeli\n\n- **Zapytanie na żywo**: `python migrate.py models` (patrz wyżej — specyficzne dla regionu, zawsze aktualne)\n- **Przegląd dostępności**: [Tabela podsumowania modeli i dostępność w regionach](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- **Szybki start i wskazówki**: **https:\u002F\u002Faka.ms\u002Fopenai\u002Fstart**\n\n### ⚠️ Ograniczenia starszych modeli\n\n> **OSTRZEŻENIE**: Starsze modele (te wcześniejsze niż `gpt-4.1`) mogą nie wspierać w pełni wszystkich funkcji Responses API.\n>\n> Znane ograniczenia starszych modeli:\n> - **parametr `reasoning`**: Nieobsługiwany w wielu modelach bez reasoning. Migruj `reasoning` tylko jeśli był już w oryginalnym kodzie.\n> - **parametr `seed`**: W Responses API w ogóle nie jest wspierany — usuń ze wszystkich zapytań.\n> - **Zorganizowany output za pomocą `text.format`**: Starsze modele mogą nie wymuszać schematów JSON z `strict: true` wiarygodnie.\n> - **Orkiestracja narzędzi**: GPT-5+ orkiestruje wywołania narzędzi w ramach wewnętrznego reasoning. Starsze modele na Responses działają, ale bez tej głębokiej integracji.\n> - **Ograniczenia temperatury**: Przy migracji do `gpt-5` temperatura musi być pominięta lub ustawiona na `1`. Starsze modele tego ograniczenia nie mają.\n\n### Modele reasoning serii O (o1, o3-mini, o3, o4-mini)\n\nModele serii O mają unikalne ograniczenia parametrów. Przy migracji aplikacji celujących w modele serii O:\n\n- **`temperature`**: Musi być `1` (lub pominięte). Modele serii O nie akceptują innych wartości.\n- **`max_completion_tokens` → `max_output_tokens`**: Aplikacje używające Azure-specyficznego `max_completion_tokens` muszą przełączyć się na `max_output_tokens`. Ustaw wysokie wartości (4096+), ponieważ tokeny reasoning liczą się do limitu.\n- **`reasoning_effort`**: Jeśli aplikacja używa `reasoning_effort` (low\u002Fmedium\u002Fhigh), zachowaj go — Responses API wspiera ten parametr dla modeli serii O.\n- **Zachowanie streamingu**: Modele serii O mogą buforować output do zakończenia reasoning przed emitowaniem zdarzeń tekstowych delta. Streaming działa, ale pierwszy `response.output_text.delta` może przyjść z większym opóźnieniem niż w modelach GPT.\n- **`top_p`**: Nieobsługiwany na serii O — usuń jeśli obecny.\n- **Użycie narzędzi**: Modele serii O wspierają narzędzia przez Responses API jak modele GPT, ale jakość orkiestracji wywołań narzędzi różni się w zależności od modelu.\n\n**Działanie — proaktywna porada modelowa**: Podczas fazy skanu sprawdź, który model aplikacja celuje (nazwy wdrożeń, zmienne środowiskowe, konfig). Jeśli model jest wcześniejszy niż `gpt-4.1` (nie gpt-4.1+), poinformuj użytkownika proaktywnie:\n- Migracja będzie działać dla podstawowego tekstu, czatu, streamingu i narzędzi na ich obecnym modelu.\n- Nowe modele (`gpt-5.1`, `gpt-5.2`) oferują lepszą orkiestrację narzędzi, wymuszanie zorganizowanego outputu, reasoning i dostępność międzyregionową.\n- Powinni rozważyć aktualizację wdrożenia, gdy będą gotowi — nie blokuje to migracji.\n\nNie blokuj ani nie odmawiaj migracji ze względu na wersję modelu. Porada ma charakter informacyjny.\n\n### GitHub Models NIE obsługuje Responses API\n\n> **GitHub Models (`models.github.ai`, `models.inference.ai.azure.com`) nie obsługuje Responses API.**\n\nJeśli kod zawiera ścieżkę kodu GitHub Models (szukaj `base_url` wskazującego na `models.github.ai` lub `models.inference.ai.azure.com`), **usuń ją całkowicie** podczas migracji. Responses API wymaga Azure OpenAI, OpenAI lub kompatybilnego lokalnego endpointu (np. Ollama z obsługą Responses).\n\nDziałanie podczas skanu:\n- Oznacz każdą ścieżkę kodu GitHub Models do usunięcia.\n\n---\n\n## Migracja frameworków\n\nWiele aplikacji używa wyższych warstw frameworków na OpenAI. Podczas migracji tych frameworków zmienia się ich własne API — nie tylko wywołania OpenAI w tle.\n\n### Microsoft Agent Framework (MAF)\n\n**Sprawdź najpierw swoją wersję MAF** — migracja zależy od tego, czy masz MAF 1.0.0+ czy wersje beta\u002Frc przed 1.0.0.\n\n#### MAF 1.0.0+ (agent-framework-openai >= 1.0.0)\n\n`OpenAIChatClient` **już używa Responses API** — migracja nie jest potrzebna. Jeśli kod używa legacy `OpenAIChatCompletionClient` (używającego `chat.completions.create`), zastąp go `OpenAIChatClient`.\n\n| Przed | Po |\n|--------|-----|\n| `from agent_framework.openai import OpenAIChatCompletionClient` | `from agent_framework.openai import OpenAIChatClient` |\n| `OpenAIChatCompletionClient(...)` | `OpenAIChatClient(...)` |\n\nAby sprawdzić wersję: `python -c \"import agent_framework_openai; print(agent_framework_openai.__version__)\"`\n\n#### MAF pre-1.0.0 (wersje beta\u002Frc)\n\nW pre-1.0.0 MAF `OpenAIChatClient` używał Chat Completions. Zaktualizuj do `agent-framework-openai>=1.0.0` gdzie `OpenAIChatClient` domyślnie używa Responses API.\n\nInne zmiany nie są potrzebne — API `Agent` i narzędzi pozostają takie same.\n\n### LangChain (`langchain-openai`)\n\nDodaj `use_responses_api=True` do `ChatOpenAI()`. Aktualizuj dostęp do odpowiedzi z `.content` na `.text`.\n\n| Przed | 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\nPełne przykłady kodu przed\u002Fpo znajdziesz w [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Wskazówki dotyczące migracji frontendów\n\n> **Responses API to kwestia serwerowa.** Migruj backend w Pythonie; kontrakt HTTP frontendu powinien pozostać niezmieniony o ile backend nie jest cienką warstwą przejściową — wtedy rozważ adaptację kształtu zapytań Responses, aby wyeliminować warstwę tłumaczenia. Jeśli frontend wywołuje OpenAI bezpośrednio z kluczem klienta, przenieś te wywołania najpierw do backendu.\n\n### Deprecacja `@microsoft\u002Fai-chat-protocol`\n\nPakiet npm `@microsoft\u002Fai-chat-protocol` jest przestarzały i powinien zostać zastąpiony przez [`ndjson-readablestream`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fndjson-readablestream). Jeśli masz go na froncie:\n\n1. Zamień tag skryptu CDN:\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. Usuń instancjonowanie `AIChatProtocolClient` (`new ChatProtocol.AIChatProtocolClient(\"\u002Fchat\")`).\n3. Zamień `client.getStreamedCompletion(messages)` na bezpośrednie wywołanie `fetch()` do endpointu backendowego ze streamingiem.\n4. Zamień `for await (const response of result)` na `for await (const chunk of readNDJSONStream(response.body))`.\n5. Aktualizuj dostęp do właściwości z `response.delta.content` \u002F `response.error` na `chunk.delta.content` \u002F `chunk.error`.\n\n---\n\n## Cele\n\n- Wypisz wszystkie miejsca wywołań w Pythonie używające Chat Completions lub legacy Completions z Azure OpenAI.\n- Zaproponuj plan migracji i kolejność dla bazy kodu Python.\n- Wykonaj bezpieczne, minimalne poprawki do przełączenia na Responses API.\n- Zaktualizuj wywołania do konsumowania schematu outputu Responses; brak warstw kompatybilności.\n- Uruchom testy\u002Fanalizę statyczną; napraw drobne błędy spowodowane migracją.\n- Przygotuj małe, możliwe do review zestawy zmian i podaj końcowe podsumowanie z różnicami (nie zatwierdzaj).\n\n---\n\n## Zasady ochronne\n\n- Modyfikuj tylko pliki w workspace git. Nigdy nie zapisuj na zewnątrz.\n- Nie zachowuj kompatybilności wstecznej; migruj kod do nowego kształtu API.\n- Nie zostawiaj komentarzy przejściowych ani kopii zapasowych.\n- Zachowaj semantykę streamingu, jeśli była używana; inaczej użyj wariantu bez streamingu.\n- W trybie zatwierdzania żądaj aprobaty przed uruchomieniem poleceń lub połączeń sieciowych.\n- Nie wykonuj `git add`\u002F`git commit`\u002F`git push`; prodkuj tylko zmiany w working-tree.\n\n---\n\n## Krok 0: Migracja klienta Azure OpenAI (wymaganie wstępne)\n\nJeśli kod używa konstruktorów `AzureOpenAI` lub `AsyncAzureOpenAI`, najpierw migruj do standardowych konstruktorów `OpenAI` \u002F `AsyncOpenAI`. Konstruktorzy specyficzni dla Azure są wycofani w `openai>=1.108.1`.\n\n### Dlaczego ścieżka API v1?\n\nNowy endpoint `\u002Fopenai\u002Fv1` używa standardowego klienta `OpenAI()` zamiast `AzureOpenAI()`, nie wymaga parametru `api_version` i działa identycznie na OpenAI i Azure OpenAI. Ten sam klient jest przyszłościowy — nie wymaga zarządzania wersjami.\n\n### Kluczowe zmiany\n\n| Przed | Po |\n|--------|-----|\n| `AzureOpenAI` | `OpenAI` |\n| `AsyncAzureOpenAI` | `AsyncOpenAI` |\n| `azure_endpoint` | `base_url` |\n| `azure_ad_token_provider` | `api_key` |\n| `api_version=...` | Usuń całkowicie |\n\n### Lista kontrolna sprzątania\n\n- Usuń argument `api_version` z konstrukcji klienta.\n- Usuń zmienne środowiskowe `AZURE_OPENAI_VERSION` \u002F `AZURE_OPENAI_API_VERSION` z `.env`, ustawień aplikacji i plików Bicep\u002Finfrastruktury.\n- Zmień nazwę `AZURE_OPENAI_CLIENT_ID` → `AZURE_CLIENT_ID` w `.env`, ustawieniach, Bicep\u002Finfra i fixture testowych (standardowa konwencja SDK Azure Identity).\n- Upewnij się, że `openai>=1.108.1` jest w `requirements.txt` lub `pyproject.toml`.\n\n### Migracja zmiennych środowiskowych\n\n| Stara zmienna env | Działanie | Uwagi |\n|-------------|--------|-------|\n| `AZURE_OPENAI_VERSION` | **Usuń** | Nie potrzebny `api_version` z endpointem v1 |\n| `AZURE_OPENAI_API_VERSION` | **Usuń** | To samo co powyżej |\n| `AZURE_OPENAI_CLIENT_ID` | **Zmień nazwę** → `AZURE_CLIENT_ID` | Standardowa konwencja SDK Azure Identity dla `ManagedIdentityCredential(client_id=...)` |\n| `AZURE_OPENAI_ENDPOINT` | **Zachowaj** | Nadal potrzebny do budowy `base_url` |\n| `AZURE_OPENAI_CHAT_DEPLOYMENT` | **Zachowaj** | Używany jako parametr `model` w `responses.create` |\n| `AZURE_OPENAI_API_KEY` | **Zachowaj** | Używany jako `api_key` do uwierzytelniania kluczem |\n\nPrzykłady konfiguracji klienta (sync, async, EntraID, klucz API, multi-tenant) znajdziesz w [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Krok 1: Wykrywanie miejsc wywołań legacy\n\nUruchom skrypt [detect_legacy.py](..\u002F..\u002F..\u002F..\u002F..\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py), aby znaleźć wszystkie miejsca wywołań wymagające migracji:\n\n```bash\npython skills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py .\n```\n\nLub wyszukaj ręcznie — każdy traf jest celem migracji:\n\n```bash\n# Dziedziczne wywołania API (należy przepisać)\nrg \"chat\\.completions\\.create\"\nrg \"ChatCompletion\\.create\"\nrg \"Completion\\.create\"\n\n# Przestarzałe konstruktory klienta Azure (należy zastąpić)\nrg \"AzureOpenAI\\(\"\nrg \"AsyncAzureOpenAI\\(\"\n\n# Wzorce dostępu do struktury odpowiedzi (należy zaktualizować)\nrg \"choices\\[0\\]\\.message\\.content\"\nrg \"choices\\[0\\]\\.delta\\.content\"\nrg \"choices\\[0\\]\\.message\\.function_call\"\nrg \"choices\\[0\\]\\.message\\.tool_calls\"\n\n# Definicje narzędzi w starej zagnieżdżonej formie (należy spłaszczyć)\nrg '\"function\":\\s*{\\s*\"name\"'\nrg \"pydantic_function_tool\"\n\n# Wyniki narzędzi w starym formacie (należy przekonwertować na function_call_output)\nrg '\"role\":\\s*\"tool\"'\nrg '\"tool_call_id\"'\n\n# Przestarzałe parametry (należy usunąć lub zmienić nazwę)\nrg \"response_format\"\nrg \"max_tokens\\b\"        # zmień nazwę na max_output_tokens\nrg \"['\\\"]seed['\\\"]\"      # remove entirely\n\n# Przestarzałe zmienne środowiskowe (posprzątać)\nrg \"AZURE_OPENAI_API_VERSION|AZURE_OPENAI_VERSION\"\nrg \"AZURE_OPENAI_CLIENT_ID\"  # powinno być AZURE_CLIENT_ID\n\n# Punkty końcowe modeli GitHub (należy usunąć — API odpowiedzi nie jest wspierane)\nrg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"\n\n# Dziedziczne wzorce na poziomie frameworka (należy zaktualizować)\nrg \"OpenAIChatCompletionClient\"  # MAF 1.0.0+: zastąp OpenAIChatClient\nrg \"ChatOpenAI\\(\" | grep -v \"use_responses_api\"  # LangChain: wymaga use_responses_api=True\n\n# Infrastruktura testowa (należy zaktualizować)\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# Dostęp do ciała błędu filtra treści (należy zaktualizować — zmieniona struktura)\nrg 'innererror.*content_filter_result|error\\.body\\[\"innererror\"\\]'\nrg \"content_filter_result\\[\" # stara forma pojedyncza — teraz content_filter_results (liczba mnoga) wewnątrz tablicy content_filters\n\n# Surowe wywołania HTTP do punktu końcowego Chat Completions (należy zaktualizować URL)\nrg \"\u002Fopenai\u002Fdeployments\u002F.*\u002Fchat\u002Fcompletions\"\nrg \"api-version=\"\n```\n\n### Heurystyki (wykrywanie i przepisywanie)\n\n- **Klient Chat Completions**: `client.chat.completions.create` → `client.responses.create(...)`.\n\n- **Konstruktory klienta Azure**: `AzureOpenAI(...)` → `OpenAI(base_url=..., api_key=...)`.\n- **Narzędzia**: konwertuj definicje narzędzi do wywołania funkcji z formatu zagnieżdżonego (`{\"type\": \"function\", \"function\": {\"name\": ...}}`) na płaski format Responses (`{\"type\": \"function\", \"name\": ...}`); używaj `tool_choice`; zwracaj wyniki narzędzi jako elementy `{\"type\": \"function_call_output\", \"call_id\": ..., \"output\": ...}` (nie jako `{\"role\": \"tool\", ...}`).\n- **Obrót narzędzi**: gdy model zwraca wywołania funkcji, dopisuj elementy `response.output` do konwersacji (nie ręcznie słownik `{\"role\": \"assistant\", \"tool_calls\": [...]}`), następnie dopisuj elementy `function_call_output` dla każdego wyniku.\n- **Przykłady wielu wywołań narzędzi**: jeśli konwersacja zawiera na stałe zakodowane przykłady wywołań narzędzi, konwertuj je na elementy `{\"type\": \"function_call\", \"id\": \"fc_...\", \"call_id\": \"fc_...\", ...}` + `{\"type\": \"function_call_output\", ...}`. Identyfikatory muszą zaczynać się od `fc_`.\n- **`pydantic_function_tool()`**: ten helper nadal generuje stary format zagnieżdżony i jest **niekompatybilny** z `responses.create()`. Zastąp go ręcznymi definicjami narzędzi lub opakowaniem spłaszczającym.\n- **Wielokrotne tury**: utrzymuj historię konwersacji w aplikacji; przekazuj poprzednie tury przez elementy `input`.\n- **Formatowanie**: zamień górnopoziomowy `response_format` w Chat na `text.format` w Responses. Kanoniczny kształt: `text={\"format\": {\"type\": \"json_schema\", \"name\": \"Output\", \"strict\": True, \"schema\": {...}}}`.\n- **Elementy treści**: zamień Chat `content[].type: \"text\"` na Responses `content[].type: \"input_text\"` dla tur użytkownika\u002Fsystemu.\n- **Elementy treści obrazów**: zamień Chat `content[].type: \"image_url\"` na Responses `content[].type: \"input_image\"`. Pole `image_url` zmienia się z obiektu zagnieżdżonego `{\"url\": \"...\"}` na pusty string. Zobacz ściągę dla przykładów przed\u002Fpo.\n- **Wysiłek rozumowania**: **migracja `reasoning` tylko jeśli już jest w oryginalnym kodzie**.\n- **Obsługa błędów filtru treści**: struktura błędu uległa zmianie. Chat Completions używało `error.body[\"innererror\"][\"content_filter_result\"]` (pojedyncze); Responses API używa `error.body[\"content_filters\"][0][\"content_filter_results\"]` (liczne, w tablicy). Kod odwołujący się do `innererror` zgłosi `KeyError`. Przeredaguj, by używać nowej ścieżki.\n- **Surowe wywołania HTTP**: jeśli aplikacja wywołuje Azure OpenAI REST API bezpośrednio (przez `requests`, `httpx` itd.) używając `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions?api-version=...`, zmień na `\u002Fopenai\u002Fv1\u002Fresponses`. Treść żądania zmienia się: `messages` → `input`, dodaj `max_output_tokens` i `store: false`, usuń parametr `api-version`. Treść odpowiedzi zmienia się: `choices[0].message.content` → `output[0].content[0].text` (uwaga: `output_text` to właściwość ułatwiająca w SDK, nieobecna w surowym JSON REST).\n\n---\n\n## Krok 2: Zastosuj migrację\n\n### Notatki migracyjne (Chat Completions → Responses)\n\n- **Dlaczego migrować**: Responses to zunifikowane API dla tekstu, narzędzi i streamingu; Chat Completions jest przestarzałe. Od GPT-5 wymagane jest korzystanie z Responses dla najlepszej wydajności.\n- **HTTP**: punkt końcowy Azure zmienia się z `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions` na `\u002Fopenai\u002Fv1\u002Fresponses`.\n- **Pola**: `messages` → `input`, `max_tokens` → `max_output_tokens`. `temperature` bez zmian.\n- **Formatowanie**: `response_format` → `text.format` z odpowiednim obiektem.\n- **Elementy treści**: zamień Chat `content[].type: \"text\"` na Responses `content[].type: \"input_text\"` dla tur systemu\u002Fużytkownika.\n- **Elementy treści obrazów**: zamień Chat `content[].type: \"image_url\"` na Responses `content[].type: \"input_image\"`. Spłaszcz pole `image_url` z `{\"image_url\": {\"url\": \"...\"}}` na `{\"image_url\": \"...\"}` (zwykły string — URL HTTPS lub URI `data:image\u002F...;base64,...`).\n\n### Odniesienie mapowania parametrów\n\n| Chat Completions | Responses API |\n|-----------------|---------------|\n| `prompt` | `input` |\n| `messages` | `input` (tablica elementów) |\n| `max_tokens` | `max_output_tokens` |\n| `response_format` | `text.format` (obiekt) |\n| `temperature` | `temperature` (bez zmian) |\n| `stop` | `stop` (bez zmian) |\n| `frequency_penalty` | `frequency_penalty` (bez zmian) |\n| `presence_penalty` | `presence_penalty` (bez zmian) |\n| `tools` \u002F wywołanie funkcji | `tools` (bez zmian) |\n| `seed` | **Usuń** (nieobsługiwane) |\n| `store` | `store` (ustaw 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\": \"...\"` (płaski string) |\n\nPełne przykłady kodu przed\u002Fpo znajdziesz w [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\nDla migracji infrastruktury testowej (mocks, snapshots, asercje), zobacz [test-migration.md](.\u002Freferences\u002Ftest-migration.md).\n\nDla rozwiązywania problemów i pułapek, zobacz [troubleshooting.md](.\u002Freferences\u002Ftroubleshooting.md).\n\n---\n\n## Przechowywanie danych i stan\n\n- Ustaw `store: false` we wszystkich żądaniach Responses.\n- Nie polegaj na poprzednich ID wiadomości ani na kontekście przechowywanym na serwerze; zarządzaj stanem po stronie klienta i minimalizuj metadane.\n\n---\n\n## Kryteria akceptacji\n\n### Bramy na poziomie kodu (wszystkie muszą przejść)\n\n- [ ] Brak trafień dla `rg \"chat\\.completions\\.create|ChatCompletion\\.create|Completion\\.create\"` w zmigrowanych plikach.\n- [ ] Brak trafień dla `rg \"AzureOpenAI\\(|AsyncAzureOpenAI\\(\"` — wszystkie konstruktory używają `OpenAI`\u002F`AsyncOpenAI` z punktem końcowym v1.\n- [ ] Brak trafień dla `rg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"` — ścieżki kodu GitHub Models usunięte.\n- [ ] Brak trafień dla `rg \"OpenAIChatCompletionClient\"` — kod MAF 1.0.0+ używa `OpenAIChatClient` (który korzysta z Responses API). W wersji pre-1.0.0 zaktualizuj do `agent-framework-openai>=1.0.0`.\n- [ ] Wszystkie wywołania `ChatOpenAI(...)` zawierają `use_responses_api=True`.\n- [ ] Brak trafień dla `rg \"choices\\[0\\]\"` — cały dostęp do odpowiedzi używa `resp.output_text` lub schematu wyjściowego Responses.\n- [ ] Brak `response_format` na poziomie głównym; całe wyjście strukturalne używa `text={\"format\": {...}}`.\n- [ ] `openai>=1.108.1` i `azure-identity` w `requirements.txt` lub `pyproject.toml`; zależności zainstalowane ponownie.\n- [ ] `store=False` ustawione przy każdym wywołaniu `responses.create`.\n- [ ] Brak `api_version` w konstrukcji klienta; `AZURE_OPENAI_API_VERSION` usunięte z plików środowiskowych i infrastruktury.\n\n### Bramy infrastruktury testowej (wszystkie muszą przejść)\n\n- [ ] Brak trafień dla `rg \"ChatCompletionChunk|AsyncCompletions\\.create|chat\\.completions\" tests\u002F`.\n- [ ] Brak trafień dla `rg \"_azure_ad_token_provider\" tests\u002F` — asercje zaktualizowane, aby sprawdzać `isinstance(client, AsyncOpenAI)` lub `base_url`.\n- [ ] Brak trafień dla `rg \"prompt_filter_results|content_filter_results\" tests\u002F` — usunięto filtry specyficzne dla Azure.\n- [ ] Mocki używają `kwargs.get(\"input\")` zamiast `kwargs.get(\"messages\")`.\n- [ ] Snapshopy \u002F pliki golden zaktualizowane do formatu streamingowego Responses (brak `choices[0]`, `function_call`, `logprobs` itp.).\n- [ ] `pytest` przechodzi bez błędów po wszystkich aktualizacjach testów.\n\n### Bramy zachowań (weryfikacja ręczna lub przez zestaw testów)\n\n- [ ] **Podstawowe uzupełnienie**: niestreamingowe `responses.create` zwraca niepusty `output_text`.\n- [ ] **Parzystość streamingu**: jeśli oryginalny kod używał streamingu, kod po migracji strumieniuje i generuje zdarzenia `response.output_text.delta` z niepustymi delta.\n- [ ] **Strukturalne wyjście**: jeśli używasz `text.format` z `json_schema`, `json.loads(resp.output_text)` kończy się sukcesem i pasuje do schematu.\n- [ ] **Pętla wywołań narzędzi**: jeśli używane są narzędzia, model wykonuje wywołania narzędzi, aplikacja je wykonuje, a zapytanie następcze zwraca finalny `output_text` (bez nieskończonych pętli).\n- [ ] **Parzystość asynchroniczna**: jeśli używano `AsyncAzureOpenAI`, równoważnik `AsyncOpenAI` działa z `await`.\n- [ ] **Wskaźnik błędów**: brak nowych błędów 400\u002F401\u002F404 w porównaniu do stanu przed migracją.\n\n### Dostawy\n\n- Podsumowanie zawiera edytowane pliki, liczbę wywołań legacy przed\u002Fpo i kolejne kroki.\n- Zmiany to tylko edycje w drzewie roboczym (bez commitów).\n\n---\n\n## Wymagania wersji SDK\n\n| Pakiet | Minimalna wersja |\n|--------|----------------|\n| `openai` | `>=1.108.1` |\n| `azure-identity` | Najnowsza (dla uwierzytelniania EntraID) |\n\n---\n\n## Odnośniki\n\n- [Cheat Sheet — wszystkie fragmenty kodu](.\u002Freferences\u002Fcheat-sheet.md)\n- [Test Migration — mocki, snapshoty, asercje](.\u002Freferences\u002Ftest-migration.md)\n- [Troubleshooting — błędy, tabela ryzyka, pułapki](.\u002Freferences\u002Ftroubleshooting.md)\n- [detect_legacy.py — automatyczny skaner](..\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- [Dokumentacja Azure OpenAI Responses API](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fhow-to\u002Fresponses)\n- [Cykl życia wersji API Azure OpenAI](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**Zastrzeżenie**:\nNiniejszy dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https:\u002F\u002Fgithub.com\u002FAzure\u002Fco-op-translator). Choć dążymy do dokładności, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub niedokładności. Oryginalny dokument w jego języku źródłowym należy uznawać za autorytatywne źródło. W przypadku informacji krytycznych zalecane jest skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER END -->",{"name":5,"license":14},"main","f09e94ffe170f8af6d3db7c42987bbe4db227723","translations\u002Fpl\u002F.agents\u002Fskills\u002Fazure-openai-to-responses",26057,"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\u002Fpl\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","参考文档",29445,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fpl\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",7502,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fpl\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Freferences\u002Ftest-migration.md",{"path":59,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":60,"sourceHtmlUrl":61},"references\u002Ftroubleshooting.md",16201,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fpl\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]]