[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M699JFTHQ4D677RQR362SSK7":3,"skill-same:01M699JFTHQ4D677RQR362SSK7":76},{"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},"01M699JFTHQ4D677RQR362SSK7","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\u002Fkm\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# ផ្លាស់ប្តូរកម្មវិធី Python ពី Azure OpenAI Chat Completions ទៅ Responses API\n\n> **ការណែនាំមានសណ្ឋាន — អនុវត្តតាមយ៉ាងម៉ត់ចត់**\n>\n> ជំនាញនេះបម្រើការផ្លាស់ប្តូរកូដ Python ដែលប្រើ Azure OpenAI Chat Completions\n> ទៅ Responses API តែមួយគត់។ សូមអនុវត្តតាមបទបញ្ជាទាំងនេះយ៉ាងម៉ត់ចត់។\n> កុំបង្កើតការ​ផ្គូផ្គងអថេរឬបង្កើតរូបរាង API ថ្មីៗឡើយ។\n\n---\n\n## ការផ្ទាំងចាប់ផ្តើម\n\nសកម្មភាពជំនាញនេះនៅពេលដែលអ្នកប្រើប្រាស់ចង់:\n- ផ្លាស់ប្តូរកម្មវិធី Python ពី Azure OpenAI Chat Completions ទៅ Responses API\n- បន្ថែមការប្រើប្រាស់ Python OpenAI SDK ទៅរូបរាង API ថ្មី ដែលឆ្លošបញ្ចូលជាមួយ Azure OpenAI\n- ត្រៀមកូដ Python សម្រាប់ម៉ូដែល GPT-5 ឬថ្មីជាងដែលទាមទារ Responses នៅលើ Azure\n- ផ្លាស់ពី `AzureOpenAI`\u002F`AsyncAzureOpenAI` ទៅ client `OpenAI`\u002F`AsyncOpenAI` ផ្លូវការដោយប្រើចំណុចបញ្ចប់ v1\n- កែបញ្ហាផ្សព្វផ្សាយថា `AzureOpenAI` constructors ឬ `api_version`\n\n---\n\n## ⚠️ ភាពត្រូវគ្នាសម្រាប់ម៉ូដែល — សូមពិនិត្យជាមុន\n\n> **មុននឹងផ្លាស់ប្តូរ សូមបញ្ជាក់ថាការដំឡើង Azure OpenAI របស់អ្នកគាំទ្រ Responses API។**\n\n### 1. សាកល្បងបឋម (លឿនបំផុត)\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> **ចំណាំ**: `max_output_tokens` មានតម្លៃតិចបំផុត 16 នៅលើ Azure OpenAI។ តម្លៃក្រោម 16 នឹងបញ្ជូនកំហុស 400។ សូមប្រើ 50 ឬច្រើនសម្រាប់សាកល្បងបឋម។\n\nប្រសិនបើវាតបណ្ដោយ 404 នោះម៉ូដែលក្នុងការដំឡើងមិនគាំទ្រ Responses ទេ — សូមពិនិត្យប្រភពខាងក្រោម ឬដំឡើងម្តងទៀតជាមួយម៉ូដែលគាំទ្រ។\n\n### 2. ពិនិត្យម៉ូដែលមានក្នុងតំបន់របស់អ្នក (ផ្ដល់អនុសាសន៍)\n\nដំណើរការឧបករណ៍ត្រួតពិនិត្យភាពត្រូវគ្នារបស់ម៉ូដែលដើម្បីមើលអ្វីមានជាមួយការគាំទ្រ Responses API ក្នុងតំបន់ជាក់លាក់របស់អ្នក៖\n\n```bash\npython migrate.py models --subscription YOUR_SUB_ID --location YOUR_REGION\n```\n\nវាស្វែងរក Azure ARM តាមពេលវេលាពិត និងបង្ហាញម៉ាទ្រីសភាពត្រូវគ្នា — ម៉ូដែលណាដែលគាំទ្រ Responses, ផលប៉ះពាល់សំខាន់ៗ, ឧបករណ៍ជាដើម។ ប្រើ `--filter gpt-5.1,gpt-5.2` ដើម្បីបណ្តុះតម្រុយឬ `--json` សម្រាប់ស្គ្រីប។\n\n### 3. ឯកសារភាពគាំទ្រម៉ូដែលពេញលេញ\n\n- **ស្វែងរកផ្ទាល់**: `python migrate.py models` (មើលខាងលើ — តំបន់ជាក់លាក់ និងទាន់សម័យអស់ពេល)\n- **មើលការចេញលក់**: [តារាងសង្ខេបម៉ូដែល និងភាពមានដែនប្រៀប](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- **ការចាប់ផ្តើមលឿន & សេចក្ដីណែនាំ**: **https:\u002F\u002Faka.ms\u002Fopenai\u002Fstart**\n\n### ⚠️ កំណត់នៃម៉ូដែលចាស់\n\n> **ការព្រមាន**: ម៉ូដែលចាស់ (ដែលមានមុន `gpt-4.1`) ប្រហែលមិនគាំទ្រពេញលេញលក្ខណៈ Responses API ទេ។\n>\n> កំណត់ដែលគេស្គាល់ទាក់ទងទៅម៉ូដែលចាស់៖\n> - **ប៉ារ៉ាម៉ែត្រ `reasoning`**: មិនគាំទ្រនៅម៉ូដែលមិន reasoning ជាច្រើនទេ។ គ្រាន់តែផ្លាស់ប្តូរ `reasoning` ប្រសិនបើវាមានរួចនៅក្នុងកូដដើម។\n> - **ប៉ារ៉ាម៉ែត្រ `seed`**: មិនគាំទ្រនៅ Responses API ទេ — ត្រូវដកចេញពីសំណើទាំងអស់។\n> - **លទ្ធផលមានរចនាសម្ព័ន្ធតាម `text.format`**: ម៉ូដែលចាស់ប្រហែលមិនអនុវត្ត JSON schemas `strict: true` យ៉ាងម៉ត់ចត់ទេ។\n> - **ការផ្គុងគ្នាឧបករណ៍**: GPT-5+ គ្រប់គ្រងការហៅឧបករណ៍ជាផ្នែកនៃការគិតនៅខាងក្នុង។ ម៉ូដែលចាស់នៅ Responses នៅមុខមុនក៏ដំណើរការបាន ប៉ុន្តែមិនមានការចូលរួមជ្រៅនេះទេ។\n> - **កម្រិតសីតុណ្ហភាព**: ពេលផ្លាស់ប្តូរទៅ `gpt-5` តម្លៃសីតុណ្ហភាពត្រូវតែបោះបង់ ឬកំណត់ជា `1`។ ម៉ូដែលចាស់មិនមានកំណត់បែបនេះ។\n\n### ម៉ូដែល reasoning ស៊េរី O (o1, o3-mini, o3, o4-mini)\n\nម៉ូដែលស៊េរី O មានកំណត់ប៉ារ៉ាម៉ែត្រ ពេលផ្លាស់ប្តូរកម្មវិធីដែលគោលបំណងទៅម៉ូដែលស៊េរី O:\n\n- **`temperature`**: ត្រូវតែជា `1` (ឬករណីមិនប្រើ)។ ម៉ូដែលស៊េរី O មិនទទួលតម្លៃផ្សេងទេ។\n- **`max_completion_tokens` → `max_output_tokens`**: កម្មវិធីប្រើ `max_completion_tokens` ជាពិសេសរបស់ Azure ត្រូវប្ដូរទៅ `max_output_tokens`។ កំណត់តម្លៃខ្ពស់ (4096+) ព្រោះ reasoning tokens នឹងរាប់ក្នុងកម្រិតដឹកនាំ។\n- **`reasoning_effort`**: ប្រសិនបើកម្មវិធីប្រើ `reasoning_effort` (ទាប\u002Fមធ្យម\u002Fខ្ពស់) សូមរក្សាទុក — Responses API គាំទ្រប៉ារ៉ាម៉ែត្រនេះសម្រាប់ម៉ូដែលស៊េរី O។\n- **អាកប្បកិរិយាស្ទ្រីម**: ម៉ូដែលស៊េរី O អាចផ្ទុកលទ្ធផលរហូតដល់ការគិតបញ្ចប់មុនផ្ទុកព្រឹត្តិការ delta អត្ថបទ។ ស្ទ្រីមមិនប្រែប្រួល ប៉ុន្តែ `response.output_text.delta` ជាលើកដំបូងប្រហែលមកយឺតជាងម៉ូដែល GPT។\n- **`top_p`**: មិនគាំទ្រលើស៊េរី o — ត្រូវដកចេញប្រសិនបើមាន។\n- **ការប្រើឧបករណ៍**: ម៉ូដែលស៊េរី O គាំទ្រឧបករណ៍តាម Responses API ដូចម៉ូដែល GPT ប៉ុន្តែគុណភាពការគ្រប់គ្រងការហៅឧបករណ៍ខុសគ្នា។\n\n**សកម្មភាព — ផ្ដល់ដំណឹងជាមុនអំពីម៉ូដែល**: ក្នុងដំណាក់កាលស្កេន ប្រើប្រាស់ដឹងថា ម៉ូដែលកំណត់គោលបំណងកម្មវិធី (ឈ្មោះ deployment, រលកបរិស្ថាន, config) បើម៉ូដែលមុន `gpt-4.1` (មិនមែន gpt-4.1+) សូមប្រាប់អ្នកប្រើប្រាស់ជាមុន:\n- ការផ្លាស់ប្តូរនឹងធ្វើការជាមួយអត្ថបទមូលដ្ឋាន, ជជែក, ស្ទ្រីម និងឧបករណ៍លើម៉ូដែលបច្ចុប្បន្ន។\n- ម៉ូដែលថ្មី (`gpt-5.1`, `gpt-5.2`) ផ្តល់ជូនការគ្រប់គ្រងឧបករណ៍ល្អប្រសើរ លទ្ធផលមានរចនាសម្ព័ន្ធល្អ ការគិត និងមាននៅតំបន់ជាយថាហេតុ។\n- ពួកគេគួរជម្រាបជូនការដំឡើងរបស់ពួកគេនៅពេលដែលពេញចិត្ត — វាមិនរាំងស្ងើចការផ្លាស់ប្តូរទេ។\n\nកុំរាំងស្ងើច ឬបដិសេធការផ្លាស់ប្តូរដោយផ្អែកលើកំណែម៉ូដែលទេ។ ការណែនាំនេះគ្រាន់តែជាសេចក្ដីជ្រាបតែប៉ុណ្ណោះ។\n\n### ម៉ូដែល GitHub មិនគាំទ្រ Responses API\n\n> **ម៉ូដែល GitHub (`models.github.ai`, `models.inference.ai.azure.com`) មិនគាំទ្រ Responses API ទេ។**\n\nប្រសិនបើកូដដើមមានផ្លូវលេខ GitHub Models (មើល `base_url` បង្ហាញទៅ `models.github.ai` ឬ `models.inference.ai.azure.com`), **លុបទាំងស្រុង** ពេលផ្លាស់ប្តូរ។ Responses API ត្រូវប្រើ Azure OpenAI, OpenAI, ឬចំណុចបញ្ចប់មូលដ្ឋានសមស្រប (ឧ. Ollama មានការគាំទ្រ Responses)។\n\nសកម្មភាពនៅពេលស្កេន:\n- សម្គាល់ផ្លូវលេខកូដ GitHub Models សម្រាប់លុបចេញ។\n\n---\n\n## ការផ្លាស់ប្តូរគ្រឹះសម្ព័ន្ធ\n\nកម្មវិធីជាច្រើនប្រើ framework ដាន់ខ្ពស់លើ OpenAI។ ពេលផ្លាស់ប្តូរទាំងនេះ ការផ្លាស់ប្តូរជាក្នុង API ឯករាជ្យរបស់ framework មិនមែនត្រឹមតែកូដ OpenAI រុំៗទេ។\n\n### Microsoft Agent Framework (MAF)\n\n**ពិនិត្យកំណែ MAF របស់អ្នកមុន** — ការផ្លាស់ប្តូរនេះអាស្រ័យលើថា អ្នកកំពុងប្រើ MAF 1.0.0+ ឬ beta\u002Frc មុន 1.0.0។\n\n#### MAF 1.0.0+ (agent-framework-openai >= 1.0.0)\n\n`OpenAIChatClient` **ប្រើ Responses API រួចហើយ** — មិនចាំបាច់ផ្លាស់ប្តូរ។ ប្រសិនបើកូដប្រើ `OpenAIChatCompletionClient` ចាស់ (ប្រើ `chat.completions.create`), ប្ដូរទៅ `OpenAIChatClient`។\n\n| មុន | បន្ទាប់ |\n|--------|-------|\n| `from agent_framework.openai import OpenAIChatCompletionClient` | `from agent_framework.openai import OpenAIChatClient` |\n| `OpenAIChatCompletionClient(...)` | `OpenAIChatClient(...)` |\n\nដើម្បីពិនិត្យកំណែ៖ `python -c \"import agent_framework_openai; print(agent_framework_openai.__version__)\" `\n\n#### MAF មុន 1.0.0 (បោះពុម្ព beta\u002Frc)\n\nនៅក្នុង MAF មុន 1.0.0, `OpenAIChatClient` ប្រើ Chat Completions។ ធ្វើបច្ចុប្បន្នភាពទៅ `agent-framework-openai>=1.0.0` ដែល `OpenAIChatClient` ប្រើ Responses API ដោយស្វ័យប្រវត្តិ។\n\nមិនចាំបាច់ផ្លាស់ប្តូរផ្សេងៗទៀត — `Agent` និង API ឧបករណ៍នៅដដែល។\n\n### LangChain (`langchain-openai`)\n\nបន្ថែម `use_responses_api=True` ទៅក្នុង `ChatOpenAI()`។ ក៏បន្ទាន់សម័យការចូលប្រើលទ្ធផលពី `.content` ទៅ `.text`។\n\n| មុន | បន្ទាប់ |\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\nសម្រាប់ឧទាហរណ៍កូដពេញលេញ មុន\u002Fក្រោយសូមមើល [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md)។\n\n---\n\n## គន្លឹះផ្លាស់ប្តូរផ្នែកមុខ\n\n> **Responses API គឺជាបញ្ហាផ្នែកបម្រើ។** សូមផ្លាស់ប្តូរផ្នែកក្រោយ Python របស់អ្នក។ កិច្ចសន្យា HTTP ផ្នែកមុខគួរតែមិនផ្លាស់ប្ដូរទេ លើកលែងតែផ្នែកក្រោយជាផ្នែកឆ្លាតទៅផ្នែកមុខ — ក្នុងករណីនោះ សូមពិចារណាការយករូបរាងសំណើ Responses ដើម្បីបញ្ចប់ជាតទៅជំនួសស្រទាប់បកប្រែ។ ប្រសិនបើផ្នែកមុខហៅ OpenAI ដោយផ្ទាល់ដោយ key មួយផ្នែកមុខ សូមផ្លាស់ប្ដូរហៅទៅផ្នែកក្រោយ ជាចម្បង។\n\n### ការលះបង់ `@microsoft\u002Fai-chat-protocol`\n\nបណ្ដុំនិពន្ធ npm `@microsoft\u002Fai-chat-protocol` លះបង់ និងគួរត្រូវបានជំនួសដោយ [`ndjson-readablestream`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fndjson-readablestream)។ ប្រសិនបើអ្នកជួបប្រទៈវានៅផ្នែកមុខ៖\n\n១. ជំនួសតេកដ្ឋាន script 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   ```\n ២. លុបការបង្កើត `AIChatProtocolClient` (`new ChatProtocol.AIChatProtocolClient(\"\u002Fchat\")`) ។\n៣. ជំនួស `client.getStreamedCompletion(messages)` ជាមួយការហៅ `fetch()` ទៅចំណុចបញ្ចប់ការស្ទ្រីមនៅខាងក្រោយ។\n៤. ជំនួស `for await (const response of result)` ជាមួយ `for await (const chunk of readNDJSONStream(response.body))`។\n៥. អាប់ដេតការចូលប្រើគុណភាពពី `response.delta.content` \u002F `response.error` ទៅ `chunk.delta.content` \u002F `chunk.error`។\n\n---\n\n## គោលដៅ\n\n- រាប់បញ្ចូលទីកន្លែងហៅ Python ទាំងអស់ប្រើ Chat Completions ឬ legacy Completions លើ Azure OpenAI។\n- ផ្តល់ផែនការផ្លាស់ប្តូរ និងលំដាប់សម្រាប់កូដ Python។\n- អនុវត្តកែប្រែយ៉ាងប្រុងប្រយ័ត្ន និងតិចតួច ដើម្បីផ្លាស់ទៅ Responses API។\n- ដំឡើងអ្នកហៅឲ្យប្រើស្កីម៉ាផលិតផល Responses; គ្មានស្រោមទ្រនាប់សំរាប់ Backcompat។\n- ដំណើរការប្រឡង\u002Fប្រឡូល; ដោះស្រាយបញ្ហាធម្មតាដែលបង្កឡើងដោយការផ្លាស់ប្តូរ។\n- ត្រៀមសំណុំផ្លាស់ប្តូរតូចៗអាចស្ទង់មើល និងផ្តល់សេចក្ដីសង្ខេបចុងក្រោយជាមួយតម្រឹម (កុំ commit)។\n\n---\n\n## បញ្ជីសុវត្ថិភាព\n\n- ត្រូវកែប្រែគ្រាន់តែឯកសារក្នុងបរិវេណ git ប៉ុណ្ណោះ។ មិនចោលពីក្រៅនោះទេ។\n- មិនផ្ដល់ការកាន់កាប់សមត្ថភាពមុន; ផ្លាស់ប្តូរកូដទៅរូបរាង API ថ្មី។\n- មិនទុកមតិយោបល់ការផ្លាស់ប្ដូរ ឬឯកសារបម្រុងទុកទាន់ពេលបានឡើយ។\n- គោរពភាពស្ទ្រីមបើវាបានគេចនា; បើមិនដូច្នោះប្រើមិនស្ទ្រីម។\n- សុំអនុម័តមុនពេលដំណើរការការបញ្ជា ឬហៅបណ្ដាញ ប្រសិនបើនៅនៅមុខងារអនុម័ត។\n- មិនដំណើរការ `git add`\u002F`git commit`\u002F`git push`; ផលិតតែការកែប្រែទិន្នន័យនៅក្នុង working-tree។\n\n---\n\n## ជំហាន 0: ផ្លាស់ប្តូរ Azure OpenAI Client (លក្ខខណ្ឌមុន)\n\nប្រសិនបើកូដប្រើ constructors `AzureOpenAI` ឬ `AsyncAzureOpenAI`, សូមផ្លាស់ទៅ constructors `OpenAI` \u002F `AsyncOpenAI` ផ្លូវការដំបូង។ constructors របស់ Azure សម្រាប់ `openai>=1.108.1` ត្រូវបានលះបង់។\n\n### ហេតុអ្វីត្រូវប្រើផ្លូវ API v1?\n\nចំណុចបញ្ចប់ថ្មី `\u002Fopenai\u002Fv1` ប្រើ client `OpenAI()` ផ្លូវការមិនយោង `AzureOpenAI()`, មិនចាំបាច់ប៉ារ៉ាម៉ែត្រ `api_version`, និងដំណើរការដូចគ្នាតាម OpenAI និង Azure OpenAI។ កូដ client ដូចគ្នា អនាគតធានា — មិនចាំបាច់គ្រប់គ្រងកំណែ។\n\n### ការផ្លាស់ប្តូរសំខាន់ៗ\n\n| មុន | បន្ទាប់ |\n|--------|-------|\n| `AzureOpenAI` | `OpenAI` |\n| `AsyncAzureOpenAI` | `AsyncOpenAI` |\n| `azure_endpoint` | `base_url` |\n| `azure_ad_token_provider` | `api_key` |\n| `api_version=...` | លុបទាំងស្រុង |\n\n### បញ្ជីសម្អាត\n\n- លុបប៉ារ៉ាម៉ែត្រ `api_version` ពីការបង្កើត client។\n- លុបបរិស្ថានបម្លែង `AZURE_OPENAI_VERSION` \u002F `AZURE_OPENAI_API_VERSION` ពី `.env`, app settings និងឯកសារ Bicep\u002Finfra។\n- ប្ដូរ `AZURE_OPENAI_CLIENT_ID` → `AZURE_CLIENT_ID` ក្នុង `.env`, app settings, Bicep\u002Finfra, និង test fixtures (ស្តង់ដារ Azure Identity SDK)។\n- ប្រាកដថា `openai>=1.108.1` នៅក្នុង `requirements.txt` ឬ `pyproject.toml`។\n\n### ផ្លាស់ប្តូរបរិស្ថានបម្លែង\n\n| បរិស្ថានបម្លែងចាស់ | សកម្មភាព | សម្គាល់ |\n|-------------|--------|-------|\n| `AZURE_OPENAI_VERSION` | **លុប** | មិនត្រូវការ `api_version` ជាមួយចំណុចបញ្ចប់ v1 |\n| `AZURE_OPENAI_API_VERSION` | **លុប** | ដូចគ្នា |\n| `AZURE_OPENAI_CLIENT_ID` | **ប្ដូរឈ្មោះ** → `AZURE_CLIENT_ID` | ស្តង់ដារ Azure Identity SDK សម្រាប់ `ManagedIdentityCredential(client_id=...)` |\n| `AZURE_OPENAI_ENDPOINT` | **រក្សាទុក** | ត្រូវការសម្រាប់បង្កើត `base_url` |\n| `AZURE_OPENAI_CHAT_DEPLOYMENT` | **រក្សាទុក** | ប្រើជា `model` ប៉ារ៉ាម៉ែត្រ នៅ `responses.create` |\n| `AZURE_OPENAI_API_KEY` | **រក្សាទុក** | ប្រើជា `api_key` សម្រាប់ការផ្ដល់សិទ្ធិដោយគ្រាប់សោ |\n\nសម្រាប់ឧទាហរណ៍កូដ client (sync, async, EntraID, API key, multi-tenant) សូមមើល [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md)។\n\n---\n\n## ជំហាន 1: រកមើលទីកន្លែងហៅប្រពៃណីចាស់\n\nដំណើរការ script [detect_legacy.py](..\u002F..\u002F..\u002F..\u002F..\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py) ដើម្បីស្វែងរកទីកន្លែងហៅទាំងអស់ដែលត្រូវការផ្លាស់ប្តូរ:\n\n```bash\npython skills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py .\n```\n\nឬដំណើរការស្វែងរកទាំងនេះដោយដៃ — រាល់ការចេញផ្សាយជួបគ្នាជាគោលដៅផ្លាស់ប្តូរ:\n\n```bash\n# ការហៅ API ចាស់ (ត្រូវសរសេរឡើងវិញ)\nrg \"chat\\.completions\\.create\"\nrg \"ChatCompletion\\.create\"\nrg \"Completion\\.create\"\n\n# អ្នកបង្កើតថ្នាក់ Azure ដែលបានផ្អាកប្រើ (ត្រូវប្តូរ)\nrg \"AzureOpenAI\\(\"\nrg \"AsyncAzureOpenAI\\(\"\n\n# លំនាំការចូលប្រើរូបរាងចម្លើយ (ត្រូវធ្វើបច្ចុប្បន្នភាព)\nrg \"choices\\[0\\]\\.message\\.content\"\nrg \"choices\\[0\\]\\.delta\\.content\"\nrg \"choices\\[0\\]\\.message\\.function_call\"\nrg \"choices\\[0\\]\\.message\\.tool_calls\"\n\n# ការបញ្ជាក់ឧបករណ៍ក្នុងទ្រង់ទ្រាយជាស្រទាប់ចាស់ (ត្រូវធ្វើបញ្ឈរច្រាស)\nrg '\"function\":\\s*{\\s*\"name\"'\nrg \"pydantic_function_tool\"\n\n# លទ្ធផលឧបករណ៍ក្នុងទ្រង់ទ្រាយចាស់ (ត្រូវបម្លែងទៅ function_call_output)\nrg '\"role\":\\s*\"tool\"'\nrg '\"tool_call_id\"'\n\n# ប៉ារ៉ាម៉ែត្រ​ដែលបានផ្អាកប្រើ (ត្រូវលុបឬប្តូរឈ្មោះ)\nrg \"response_format\"\nrg \"max_tokens\\b\"        # ប្តូរឈ្មោះទៅ max_output_tokens\nrg \"['\\\"]seed['\\\"]\"      # remove entirely\n\n# អថេរបរិយាកាសដែលបានផ្អាកប្រើ (ត្រូវសម្អាត)\nrg \"AZURE_OPENAI_API_VERSION|AZURE_OPENAI_VERSION\"\nrg \"AZURE_OPENAI_CLIENT_ID\"  # គួរតែជា AZURE_CLIENT_ID\n\n# ចំណុចគោល GitHub Models (ត្រូវលុប — មិនគាំទ្រ Responses API)\nrg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"\n\n# លំនាំលំដាប់ស៊ុម legacy នៅលើ Framework (ត្រូវចាប់ផ្តើមបច្ចុប្បន្នភាព)\nrg \"OpenAIChatCompletionClient\"  # MAF 1.0.0+: ប្តូរទៅ OpenAIChatClient\nrg \"ChatOpenAI\\(\" | grep -v \"use_responses_api\"  # LangChain: ត្រូវការ use_responses_api=True\n\n# ហេដ្ឋារចនាសម្ព័ន្ធសាកល្បង (ត្រូវបច្ចុប្បន្នភាព)\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# ការចូលប្រើរាងកាយកំហុសតម្រងខ្លឹមសារ (ត្រូវបច្ចុប្បន្នភាព — រចនាសម្ព័ន្ធបានផ្លាស់ប្តូរ)\nrg 'innererror.*content_filter_result|error\\.body\\[\"innererror\"\\]'\nrg \"content_filter_result\\[\" # ទំរង់តែមួយចាស់ — ឥឡូវ content_filter_results (ពហុរូប) នៅខាងក្នុងអារេ content_filters\n\n# ការហៅ HTTP ដើមទៅចំណុចផ្ដាច់ Chat Completions (ត្រូវបច្ចុប្បន្នភាព URL)\nrg \"\u002Fopenai\u002Fdeployments\u002F.*\u002Fchat\u002Fcompletions\"\nrg \"api-version=\"\n```\n\n### វិធីសាស្រ្ត (រកឃើញ និងកែប្រែ)\n\n- **Client Chat Completions**: `client.chat.completions.create` → `client.responses.create(...)`.\n\n- **អ្នកតឹងតែងអតិថិជន Azure**៖ `AzureOpenAI(...)` → `OpenAI(base_url=..., api_key=...)`។\n- **ឧបករណ៍**៖ បម្លែងកំណត់នៃឧបករណ៍ហៅមុខងារពីទ្រង់ទ្រាយរក្សាទុកក្នុង nested (`{\"type\": \"function\", \"function\": {\"name\": ...}}`) ទៅទ្រង់ទ្រាយ Responses ជាត្រង់ (`{\"type\": \"function\", \"name\": ...}`)។ ប្រើ `tool_choice`។ ត្រឡប់លទ្ធផលឧបករណ៍ជារបស់ `{\"type\": \"function_call_output\", \"call_id\": ..., \"output\": ...}` (មិនមែនជា `{\"role\": \"tool\", ...}`)។\n- **ការបង្រ្កាបឧបករណ៍ជាច្រើនដង**៖ ពេលម៉ូដែលត្រឡប់ការហៅមុខងារ សូមបន្ថែមធាតុ `response.output` ទៅក្នុងកិច្ចសន្ទនា (មិនមែនជាដីកសាន់ `{\"role\": \"assistant\", \"tool_calls\": [...]}`) បន្ទាប់មកបន្ថែមធាតុ `function_call_output` សម្រាប់លទ្ធផលនីមួយៗ។\n- **ឧទាហរណ៍ឧបករណ៍ប៉ុន្មានដង**៖ ប្រសិនបើកិច្ចសន្ទនាមានឧទាហរណ៍ហៅឧបករណ៍ដាក់កូដម៉ានូ អ្នកត្រូវបម្លែងពួកវាទៅជា `{\"type\": \"function_call\", \"id\": \"fc_...\", \"call_id\": \"fc_...\", ...}` ជាមួយខ្សែកូដ `{\"type\": \"function_call_output\", ...}`។ អត្តសញ្ញាណត្រូវចាប់ផ្តើមជាមួយ `fc_`។\n- **`pydantic_function_tool()`**៖ ជំនួយនេះនៅតែបង្កើតទ្រង់ទ្រាយ nested ចាស់ ហើយមិន **ការព្រមព្រៀង** ជាមួយ `responses.create()`។ ជំនួសដោយកំណត់តែងឧបករណ៍ដោយដៃ ឬប្រើវ៉ារ៉ាប់បាច់បញ្ចូល។\n- **ចំលងជាច្រើនជុំ**៖ រក្សាប្រវត្តិកិច្ចសន្ទនានៅក្នុងកម្មវិធី; បញ្ជូនជុំមុនៗតាមរយៈធាតុ `input`។\n- **រចនាប័ទ្ម**៖ ជំនួស `response_format` នៅកំពូល Chat ជា `text.format` ក្នុង Responses។ ទ្រង់ទ្រាយស្តង់ដា៖ `text={\"format\": {\"type\": \"json_schema\", \"name\": \"Output\", \"strict\": True, \"schema\": {...}}}`។\n- **ធាតុមាតិកា**៖ បម្លែង `content[].type: \"text\"` របស់ Chat ទៅជា `content[].type: \"input_text\"` សម្រាប់ជុំអ្នកប្រើ\u002Fប្រព័ន្ធ ក្នុង Responses។\n- **ធាតុំាតិការូបភាព**៖ បម្លែង `content[].type: \"image_url\"` របស់ Chat ទៅជា `content[].type: \"input_image\"` នៅក្នុង Responses។ ប្រស្នាក់ `image_url` បម្លែងពីអប្បបរមា nested `{\"url\": \"...\"}` ទៅខ្សែស្រឡាយត្រង់។ មើលស្លាកជំនួយសម្រាប់ឧទាហរណ៍មុន\u002Fបន្ទាប់។\n- **ខិតខំពិចារណា**៖ **ចូរផ្លាស់ប្តូរ `reasoning` តែប៉ុណ្ណោះ ប្រសិនបើវាមានរួចហើយក្នុងកូដដើម**។\n- **ដំណើរការខូចខាតក្នុងការត្រួតពិនិត្យមាតិកា**៖ រចនាសម្ព័ន្ធខ្លឹមសារខុស។ Chat Completions ប្រើ `error.body[\"innererror\"][\"content_filter_result\"]` (ឯកជន); Responses API ប្រើ `error.body[\"content_filters\"][0][\"content_filter_results\"]` (ពហុ បញ្ចូលក្នុងតារាង)។ កូដដែលចូលដល់ `innererror` នឹងបញ្ចេញ `KeyError`។ សូមសរសេរឡើងវិញដើម្បីប្រើផ្លូវថ្មី។\n- **ហៅ HTTP ដំបូងគ្រប់គ្រាន់**៖ ប្រសិនបើកម្មវិធីហៅ REST API Azure OpenAI ដោយផ្ទាល់ (តាម `requests`, `httpx`, ល.) ដោយប្រើ `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions?api-version=...` សូមបម្លែងទៅ `\u002Fopenai\u002Fv1\u002Fresponses`។ ខ្លឹមសារសំណើបម្លែង៖ `messages` → `input` ផ្ដល់ `max_output_tokens` និង `store: false` លុប `api-version` query។ ខ្លឹមសារឆ្លើយតបបម្លែង៖ `choices[0].message.content` → `output[0].content[0].text` (ចំណាំ៖ `output_text` គឺជាគុណលក្ខណៈ SDK មិនមានក្នុង JSON REST ដើម)។\n\n---\n\n## ជំហានទី 2៖ អនុវត្តការផ្លាស់ប្តូរ\n\n### កំណត់សម្គាល់ការផ្លាស់ប្តូរ (Chat Completions → Responses)\n\n- **ហេតុផលផ្លាស់ប្តូរ**៖ Responses ជា API ឯកសរ​សម្រាប់អត្ថបទ, ឧបករណ៍ និងការចាក់ទឹក។ Chat Completions ជាគំរូចាស់។ ជាមួយ GPT-5, Responses ត្រូវបានទាមទារសម្រាប់ប្រសិទ្ធភាពអតិបរមា។\n- **HTTP**៖ ចំណុចបញ្ចូល Azure ផ្លាស់ពី `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions` ទៅ `\u002Fopenai\u002Fv1\u002Fresponses`។\n- **វាលទិន្នន័យ**៖ `messages` → `input`, `max_tokens` → `max_output_tokens`។ `temperature` មិនផ្លាស់ប្តូរ។\n- **រចនាប័ទ្ម**៖ `response_format` → `text.format` ជាវត្ថុត្រឹមត្រូវ។\n- **ធាតុមាតិកា**៖ ជំនួស `content[].type: \"text\"` របស់ Chat ជា `content[].type: \"input_text\"` សម្រាប់ជុំប្រព័ន្ធ\u002Fអ្នកប្រើក្នុង Responses។\n- **ធាតុរូបភាព**៖ ជំនួស `content[].type: \"image_url\"` របស់ Chat ជា `content[].type: \"input_image\"` ក្នុង Responses។ ផ្លាស់ប្តូរជំនួសវាល `image_url` ពី `{\"image_url\": {\"url\": \"...\"}}` ទៅ `{\"image_url\": \"...\"}` (ខ្សែស្រឡាយត្រង់ — ទាំង អាសយដ្ឋាន HTTPS ឬ URI ទិន្នន័យ `data:image\u002F...;base64,...`)។\n\n### ឯកសារការកំណត់ផែនទីប៉ារ៉ាម៉ែត្រ\n\n| Chat Completions | Responses API |\n|-----------------|---------------|\n| `prompt` | `input` |\n| `messages` | `input` (សារៈក្នុងអារ៉េ) |\n| `max_tokens` | `max_output_tokens` |\n| `response_format` | `text.format` (វត្ថុ) |\n| `temperature` | `temperature` (មិនផ្លាស់ប្តូរ) |\n| `stop` | `stop` (មិនផ្លាស់ប្តូរ) |\n| `frequency_penalty` | `frequency_penalty` (មិនផ្លាស់ប្តូរ) |\n| `presence_penalty` | `presence_penalty` (មិនផ្លាស់ប្តូរ) |\n| `tools` \u002F ហៅមុខងារ | `tools` (មិនផ្លាស់ប្តូរ) |\n| `seed` | **លុបចោល** (មិនគាំទ្រ) |\n| `store` | `store` (កំណត់ជា `false`) |\n| `content[].type: \"text\"` | `content[].type: \"input_text\"` |\n| `content[].type: \"image_url\"` | `content[].type: \"input_image\"` |\n| `\"image_url\": {\"url\": \"...\"}` | `\"image_url\": \"...\"` (ខ្សែស្រឡាយត្រង់) |\n\nសម្រាប់ឧទាហរណ៍កូដពេញលេញ មុន\u002Fបន្ទាប់ គឺមើលបាន [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md)។\n\nសម្រាប់ផ្លាស់ប្តូរគ្រឹះស្ថានតេស្ត (mocks, snapshots, assertions) សូមមើល [test-migration.md](.\u002Freferences\u002Ftest-migration.md)។\n\nសម្រាប់ដោះស្រាយកំហុស និងការប្រើប្រាស់ មាននៅ [troubleshooting.md](.\u002Freferences\u002Ftroubleshooting.md)។\n\n---\n\n## ការផ្ទុកទិន្នន័យ និងស្ថានភាព\n\n- កំណត់ `store: false` លើសំណើ Responses ទាំងអស់។\n- មិនពឹងផ្អែកលើអត្តសញ្ញាណសារមុន ឬបរិបទដែលបានរក្សាទុកនៅម៉ាស៊ីនបម្រើ; រក្សាស្ថានភាពដោយការគ្រប់គ្រងរបស់អតិថិជន ហើយកាត់បន្ថយ metadata។\n\n---\n\n## លក្ខខណ្ឌទទួលយក\n\n### ច្រកកូដកម្រិត (ទាំងអស់ត្រូវតែជោគជ័យ)\n\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"chat\\.completions\\.create|ChatCompletion\\.create|Completion\\.create\"` ក្នុងឯកសារ ដែលបានផ្លាស់ប្តូរ។\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"AzureOpenAI\\(|AsyncAzureOpenAI\\(\"` — អ្នកតឹងតែងទាំងអស់ប្រើ `OpenAI`\u002F`AsyncOpenAI` ជាមួយចំណុចបញ្ចូល v1។\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"` — គន្លងកូដ GitHub Models បានដកចេញ។\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"OpenAIChatCompletionClient\"` — កូដ MAF 1.0.0+ ប្រើ `OpenAIChatClient` (ដែលប្រើ Responses API)។ ក្នុងមុន-1.0.0, ធ្វើការដំឡើងទៅ `agent-framework-openai>=1.0.0`។\n- [ ] ការហៅ `ChatOpenAI(...)` ទាំងអស់រួមបញ្ចូល `use_responses_api=True`។\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"choices\\[0\\]\"` — ការចូលប្រើលទ្ធផលទាំងអស់ប្រើ `resp.output_text` ឬទ្រង់ទ្រាយ output Responses។\n- [ ] មិនមាន `response_format` លើកំពូល; លទ្ធផលមានរចនាសម្ព័ន្ធទាំងអស់ប្រើ `text={\"format\": {...}}`។\n- [ ] មាន `openai>=1.108.1` និង `azure-identity` ក្នុង `requirements.txt` ឬ `pyproject.toml`; តម្រូវការត្រូវបានដំឡើងឡើងវិញ។\n- [ ] ចុះបញ្ជី `store=False` លើការហៅ `responses.create` ទាំងអស់។\n- [ ] មិនមាន `api_version` ក្នុងការបង្កើតអតិថិជន; ការ​លុប `AZURE_OPENAI_API_VERSION` ពីឯកសារ env និងអាគារពាក់ព័ន្ធ។\n\n### ច្រកសំណង់តេស្ត (ទាំងអស់ត្រូវតែជោគជ័យ)\n\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"ChatCompletionChunk|AsyncCompletions\\.create|chat\\.completions\" tests\u002F`។\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"_azure_ad_token_provider\" tests\u002F` — បញ្ញត្តិបានធ្វើបច្ចុប្បន្នភាព ដើម្បីពិនិត្យ `isinstance(client, AsyncOpenAI)` ឬ `base_url`។\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"prompt_filter_results|content_filter_results\" tests\u002F` — mocks គោលលក្ខណៈ filter របស់ Azure បានដកចេញ។\n- [ ] mock fixture ប្រើ `kwargs.get(\"input\")` មិនមែន `kwargs.get(\"messages\")`។\n- [ ] Snapshot \u002F golden files បានបន្ទាន់សម័យទៅទ្រង់ទ្រាយ streaming Responses (គ្មាន `choices[0]`, `function_call`, `logprobs` ទេ)។\n- [ ] `pytest` ការបញ្ចប់ជោគជ័យ ដោយគ្មានបរាជ័យក្រោយការកែប្រែទាំងអស់។\n\n### ច្រករបៀបអនុវត្ត (ត្រួតពិនិត្យដោយដៃ ឬតាម test harness)\n\n- [ ] **ការបញ្ចប់មូលដ្ឋាន**៖ `responses.create` មិនស្ទ្រីម ត្រូវត្រឡប់ `output_text` មិនទទេ។\n- [ ] **ភាពស្ទ្រីមស្មើភាព**៖ ប្រសិនបើកូដដើមប្រើការស្ទ្រីម កូដដែលបានផ្លាស់ប្តូរនឹងស្ទ្រីម និងបញ្ចេញព្រឹត្តិការណ៍ `response.output_text.delta` ជាមួយ delta មិនទទេ។\n- [ ] **លទ្ធផលមានរចនាសម្ព័ន្ធ**៖ ប្រសិនបើប្រើ `text.format` ជាមួយ `json_schema`, `json.loads(resp.output_text)` ត្រូវជោគជ័យ និងមានផ្ទឹងទៅនឹង schema។\n- [ ] **វដ្តហៅឧបករណ៍**៖ ប្រសិនបើប្រើឧបករណ៍ ម៉ូដែលហៅឧបករណ៍ កម្មវិធីអនុវត្ត ពេលបន្ទាប់សំណើត្រឡប់ `output_text` ចុងក្រោយ (គ្មានវដ្តអតិផរណា)។\n- [ ] **ភាពស្មើភាព Async**៖ ប្រសិនបើប្រើ `AsyncAzureOpenAI` វិធីសាស្រ្តស្មើគ្នា `AsyncOpenAI` នឹងដំណើរការជាមួយ `await`។\n- [ ] **អត្រាកំហុស**៖ មិនមានកំហុស 400\u002F401\u002F404 ថ្មីប្រៀបធៀបទៅមុនពេលផ្លាស់ប្តូរ។\n\n### ទំនុកចរន្ត\n\n- សេចក្ដីសង្ខេបរួមមានឯកសារ​ដែលបានកែប្រែ ចំនួនកន្លែងហៅប្រពៃណីមុន\u002Fបន្ទាប់ និងជំហានបន្ទាប់។\n- ប្រែប្រួលគឺជាការកែសម្រួលក្នុងផ្ទះបាយ (working-tree edits) មិនមែនជាការបញ្ជូន commit ទេ។\n\n---\n\n## តម្រូវការដំណើរការកំណែ SDK\n\n| កញ្ចប់ | កំណែអប្បបរមា |\n|---------|----------------|\n| `openai` | `>=1.108.1` |\n| `azure-identity` | ថ្មីបំផុត (សម្រាប់​អត្តសញ្ញាណ EntraID) |\n\n---\n\n## ឯកសារយោង\n\n- [តារាងជំនួយ — ជួរខ្សែខ្លីកូដទាំងអស់](.\u002Freferences\u002Fcheat-sheet.md)\n- [ការផ្លាស់ប្តូរទំហំតេស្ត — mocks, snapshots, assertions](.\u002Freferences\u002Ftest-migration.md)\n- [ដោះស្រាយបញ្ហា — កំហុស, តារាងហានិភ័យ, បញ្ហា](.\u002Freferences\u002Ftroubleshooting.md)\n- [detect_legacy.py — កម្មវិធីស្កេនស្វ័យប្រវត្តិ](..\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- [ឯកសារ API Azure OpenAI Responses](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fhow-to\u002Fresponses)\n- [ជីវិត 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- [ឯកសារយោង API Responses OpenAI](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fresponses)\n\n---\n\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**ការបដិសេធ**:\nឯកសារនេះត្រូវបានបម្លែងភាសា ដោយប្រើសេវាបម្លែងភាសា AI [Co-op Translator](https:\u002F\u002Fgithub.com\u002FAzure\u002Fco-op-translator)។ ទោះយើងខ្ញុំមានក្តីប្រាថ្នាឱ្យបានច្បាស់លាស់ តែសូមយល់ដឹងថាការបម្លែងដោយស្វ័យប្រវត្តិក៏អាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមជាភាសាទីតាំងគួរត្រូវបានគេប្រើជាប្រភពច្បាស់លាស់។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឱ្យប្រើប្រាស់ការប្រែដោយមនុស្សជំនាញ។ យើងខ្ញុំមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសបន្ទាប់ពីការប្រើប្រាស់ការបម្លែងនេះនោះទេ។\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER END -->","# ផ្លាស់ប្តូរកម្មវិធី Python ពី Azure OpenAI Chat Completions ទៅ Responses API\n\n> **ការណែនាំមានសណ្ឋាន — អនុវត្តតាមយ៉ាងម៉ត់ចត់**\n>\n> ជំនាញនេះបម្រើការផ្លាស់ប្តូរកូដ Python ដែលប្រើ Azure OpenAI Chat Completions\n> ទៅ Responses API តែមួយគត់។ សូមអនុវត្តតាមបទបញ្ជាទាំងនេះយ៉ាងម៉ត់ចត់។\n> កុំបង្កើតការ​ផ្គូផ្គងអថេរឬបង្កើតរូបរាង API ថ្មីៗឡើយ។\n\n---\n\n## ការផ្ទាំងចាប់ផ្តើម\n\nសកម្មភាពជំនាញនេះនៅពេលដែលអ្នកប្រើប្រាស់ចង់:\n- ផ្លាស់ប្តូរកម្មវិធី Python ពី Azure OpenAI Chat Completions ទៅ Responses API\n- បន្ថែមការប្រើប្រាស់ Python OpenAI SDK ទៅរូបរាង API ថ្មី ដែលឆ្លošបញ្ចូលជាមួយ Azure OpenAI\n- ត្រៀមកូដ Python សម្រាប់ម៉ូដែល GPT-5 ឬថ្មីជាងដែលទាមទារ Responses នៅលើ Azure\n- ផ្លាស់ពី `AzureOpenAI`\u002F`AsyncAzureOpenAI` ទៅ client `OpenAI`\u002F`AsyncOpenAI` ផ្លូវការដោយប្រើចំណុចបញ្ចប់ v1\n- កែបញ្ហាផ្សព្វផ្សាយថា `AzureOpenAI` constructors ឬ `api_version`\n\n---\n\n## ⚠️ ភាពត្រូវគ្នាសម្រាប់ម៉ូដែល — សូមពិនិត្យជាមុន\n\n> **មុននឹងផ្លាស់ប្តូរ សូមបញ្ជាក់ថាការដំឡើង Azure OpenAI របស់អ្នកគាំទ្រ Responses API។**\n\n### 1. សាកល្បងបឋម (លឿនបំផុត)\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> **ចំណាំ**: `max_output_tokens` មានតម្លៃតិចបំផុត 16 នៅលើ Azure OpenAI។ តម្លៃក្រោម 16 នឹងបញ្ជូនកំហុស 400។ សូមប្រើ 50 ឬច្រើនសម្រាប់សាកល្បងបឋម។\n\nប្រសិនបើវាតបណ្ដោយ 404 នោះម៉ូដែលក្នុងការដំឡើងមិនគាំទ្រ Responses ទេ — សូមពិនិត្យប្រភពខាងក្រោម ឬដំឡើងម្តងទៀតជាមួយម៉ូដែលគាំទ្រ។\n\n### 2. ពិនិត្យម៉ូដែលមានក្នុងតំបន់របស់អ្នក (ផ្ដល់អនុសាសន៍)\n\nដំណើរការឧបករណ៍ត្រួតពិនិត្យភាពត្រូវគ្នារបស់ម៉ូដែលដើម្បីមើលអ្វីមានជាមួយការគាំទ្រ Responses API ក្នុងតំបន់ជាក់លាក់របស់អ្នក៖\n\n```bash\npython migrate.py models --subscription YOUR_SUB_ID --location YOUR_REGION\n```\n\nវាស្វែងរក Azure ARM តាមពេលវេលាពិត និងបង្ហាញម៉ាទ្រីសភាពត្រូវគ្នា — ម៉ូដែលណាដែលគាំទ្រ Responses, ផលប៉ះពាល់សំខាន់ៗ, ឧបករណ៍ជាដើម។ ប្រើ `--filter gpt-5.1,gpt-5.2` ដើម្បីបណ្តុះតម្រុយឬ `--json` សម្រាប់ស្គ្រីប។\n\n### 3. ឯកសារភាពគាំទ្រម៉ូដែលពេញលេញ\n\n- **ស្វែងរកផ្ទាល់**: `python migrate.py models` (មើលខាងលើ — តំបន់ជាក់លាក់ និងទាន់សម័យអស់ពេល)\n- **មើលការចេញលក់**: [តារាងសង្ខេបម៉ូដែល និងភាពមានដែនប្រៀប](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- **ការចាប់ផ្តើមលឿន & សេចក្ដីណែនាំ**: **https:\u002F\u002Faka.ms\u002Fopenai\u002Fstart**\n\n### ⚠️ កំណត់នៃម៉ូដែលចាស់\n\n> **ការព្រមាន**: ម៉ូដែលចាស់ (ដែលមានមុន `gpt-4.1`) ប្រហែលមិនគាំទ្រពេញលេញលក្ខណៈ Responses API ទេ។\n>\n> កំណត់ដែលគេស្គាល់ទាក់ទងទៅម៉ូដែលចាស់៖\n> - **ប៉ារ៉ាម៉ែត្រ `reasoning`**: មិនគាំទ្រនៅម៉ូដែលមិន reasoning ជាច្រើនទេ។ គ្រាន់តែផ្លាស់ប្តូរ `reasoning` ប្រសិនបើវាមានរួចនៅក្នុងកូដដើម។\n> - **ប៉ារ៉ាម៉ែត្រ `seed`**: មិនគាំទ្រនៅ Responses API ទេ — ត្រូវដកចេញពីសំណើទាំងអស់។\n> - **លទ្ធផលមានរចនាសម្ព័ន្ធតាម `text.format`**: ម៉ូដែលចាស់ប្រហែលមិនអនុវត្ត JSON schemas `strict: true` យ៉ាងម៉ត់ចត់ទេ។\n> - **ការផ្គុងគ្នាឧបករណ៍**: GPT-5+ គ្រប់គ្រងការហៅឧបករណ៍ជាផ្នែកនៃការគិតនៅខាងក្នុង។ ម៉ូដែលចាស់នៅ Responses នៅមុខមុនក៏ដំណើរការបាន ប៉ុន្តែមិនមានការចូលរួមជ្រៅនេះទេ។\n> - **កម្រិតសីតុណ្ហភាព**: ពេលផ្លាស់ប្តូរទៅ `gpt-5` តម្លៃសីតុណ្ហភាពត្រូវតែបោះបង់ ឬកំណត់ជា `1`។ ម៉ូដែលចាស់មិនមានកំណត់បែបនេះ។\n\n### ម៉ូដែល reasoning ស៊េរី O (o1, o3-mini, o3, o4-mini)\n\nម៉ូដែលស៊េរី O មានកំណត់ប៉ារ៉ាម៉ែត្រ ពេលផ្លាស់ប្តូរកម្មវិធីដែលគោលបំណងទៅម៉ូដែលស៊េរី O:\n\n- **`temperature`**: ត្រូវតែជា `1` (ឬករណីមិនប្រើ)។ ម៉ូដែលស៊េរី O មិនទទួលតម្លៃផ្សេងទេ។\n- **`max_completion_tokens` → `max_output_tokens`**: កម្មវិធីប្រើ `max_completion_tokens` ជាពិសេសរបស់ Azure ត្រូវប្ដូរទៅ `max_output_tokens`។ កំណត់តម្លៃខ្ពស់ (4096+) ព្រោះ reasoning tokens នឹងរាប់ក្នុងកម្រិតដឹកនាំ។\n- **`reasoning_effort`**: ប្រសិនបើកម្មវិធីប្រើ `reasoning_effort` (ទាប\u002Fមធ្យម\u002Fខ្ពស់) សូមរក្សាទុក — Responses API គាំទ្រប៉ារ៉ាម៉ែត្រនេះសម្រាប់ម៉ូដែលស៊េរី O។\n- **អាកប្បកិរិយាស្ទ្រីម**: ម៉ូដែលស៊េរី O អាចផ្ទុកលទ្ធផលរហូតដល់ការគិតបញ្ចប់មុនផ្ទុកព្រឹត្តិការ delta អត្ថបទ។ ស្ទ្រីមមិនប្រែប្រួល ប៉ុន្តែ `response.output_text.delta` ជាលើកដំបូងប្រហែលមកយឺតជាងម៉ូដែល GPT។\n- **`top_p`**: មិនគាំទ្រលើស៊េរី o — ត្រូវដកចេញប្រសិនបើមាន។\n- **ការប្រើឧបករណ៍**: ម៉ូដែលស៊េរី O គាំទ្រឧបករណ៍តាម Responses API ដូចម៉ូដែល GPT ប៉ុន្តែគុណភាពការគ្រប់គ្រងការហៅឧបករណ៍ខុសគ្នា។\n\n**សកម្មភាព — ផ្ដល់ដំណឹងជាមុនអំពីម៉ូដែល**: ក្នុងដំណាក់កាលស្កេន ប្រើប្រាស់ដឹងថា ម៉ូដែលកំណត់គោលបំណងកម្មវិធី (ឈ្មោះ deployment, រលកបរិស្ថាន, config) បើម៉ូដែលមុន `gpt-4.1` (មិនមែន gpt-4.1+) សូមប្រាប់អ្នកប្រើប្រាស់ជាមុន:\n- ការផ្លាស់ប្តូរនឹងធ្វើការជាមួយអត្ថបទមូលដ្ឋាន, ជជែក, ស្ទ្រីម និងឧបករណ៍លើម៉ូដែលបច្ចុប្បន្ន។\n- ម៉ូដែលថ្មី (`gpt-5.1`, `gpt-5.2`) ផ្តល់ជូនការគ្រប់គ្រងឧបករណ៍ល្អប្រសើរ លទ្ធផលមានរចនាសម្ព័ន្ធល្អ ការគិត និងមាននៅតំបន់ជាយថាហេតុ។\n- ពួកគេគួរជម្រាបជូនការដំឡើងរបស់ពួកគេនៅពេលដែលពេញចិត្ត — វាមិនរាំងស្ងើចការផ្លាស់ប្តូរទេ។\n\nកុំរាំងស្ងើច ឬបដិសេធការផ្លាស់ប្តូរដោយផ្អែកលើកំណែម៉ូដែលទេ។ ការណែនាំនេះគ្រាន់តែជាសេចក្ដីជ្រាបតែប៉ុណ្ណោះ។\n\n### ម៉ូដែល GitHub មិនគាំទ្រ Responses API\n\n> **ម៉ូដែល GitHub (`models.github.ai`, `models.inference.ai.azure.com`) មិនគាំទ្រ Responses API ទេ។**\n\nប្រសិនបើកូដដើមមានផ្លូវលេខ GitHub Models (មើល `base_url` បង្ហាញទៅ `models.github.ai` ឬ `models.inference.ai.azure.com`), **លុបទាំងស្រុង** ពេលផ្លាស់ប្តូរ។ Responses API ត្រូវប្រើ Azure OpenAI, OpenAI, ឬចំណុចបញ្ចប់មូលដ្ឋានសមស្រប (ឧ. Ollama មានការគាំទ្រ Responses)។\n\nសកម្មភាពនៅពេលស្កេន:\n- សម្គាល់ផ្លូវលេខកូដ GitHub Models សម្រាប់លុបចេញ។\n\n---\n\n## ការផ្លាស់ប្តូរគ្រឹះសម្ព័ន្ធ\n\nកម្មវិធីជាច្រើនប្រើ framework ដាន់ខ្ពស់លើ OpenAI។ ពេលផ្លាស់ប្តូរទាំងនេះ ការផ្លាស់ប្តូរជាក្នុង API ឯករាជ្យរបស់ framework មិនមែនត្រឹមតែកូដ OpenAI រុំៗទេ។\n\n### Microsoft Agent Framework (MAF)\n\n**ពិនិត្យកំណែ MAF របស់អ្នកមុន** — ការផ្លាស់ប្តូរនេះអាស្រ័យលើថា អ្នកកំពុងប្រើ MAF 1.0.0+ ឬ beta\u002Frc មុន 1.0.0។\n\n#### MAF 1.0.0+ (agent-framework-openai >= 1.0.0)\n\n`OpenAIChatClient` **ប្រើ Responses API រួចហើយ** — មិនចាំបាច់ផ្លាស់ប្តូរ។ ប្រសិនបើកូដប្រើ `OpenAIChatCompletionClient` ចាស់ (ប្រើ `chat.completions.create`), ប្ដូរទៅ `OpenAIChatClient`។\n\n| មុន | បន្ទាប់ |\n|--------|-------|\n| `from agent_framework.openai import OpenAIChatCompletionClient` | `from agent_framework.openai import OpenAIChatClient` |\n| `OpenAIChatCompletionClient(...)` | `OpenAIChatClient(...)` |\n\nដើម្បីពិនិត្យកំណែ៖ `python -c \"import agent_framework_openai; print(agent_framework_openai.__version__)\" `\n\n#### MAF មុន 1.0.0 (បោះពុម្ព beta\u002Frc)\n\nនៅក្នុង MAF មុន 1.0.0, `OpenAIChatClient` ប្រើ Chat Completions។ ធ្វើបច្ចុប្បន្នភាពទៅ `agent-framework-openai>=1.0.0` ដែល `OpenAIChatClient` ប្រើ Responses API ដោយស្វ័យប្រវត្តិ។\n\nមិនចាំបាច់ផ្លាស់ប្តូរផ្សេងៗទៀត — `Agent` និង API ឧបករណ៍នៅដដែល។\n\n### LangChain (`langchain-openai`)\n\nបន្ថែម `use_responses_api=True` ទៅក្នុង `ChatOpenAI()`។ ក៏បន្ទាន់សម័យការចូលប្រើលទ្ធផលពី `.content` ទៅ `.text`។\n\n| មុន | បន្ទាប់ |\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\nសម្រាប់ឧទាហរណ៍កូដពេញលេញ មុន\u002Fក្រោយសូមមើល [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md)។\n\n---\n\n## គន្លឹះផ្លាស់ប្តូរផ្នែកមុខ\n\n> **Responses API គឺជាបញ្ហាផ្នែកបម្រើ។** សូមផ្លាស់ប្តូរផ្នែកក្រោយ Python របស់អ្នក។ កិច្ចសន្យា HTTP ផ្នែកមុខគួរតែមិនផ្លាស់ប្ដូរទេ លើកលែងតែផ្នែកក្រោយជាផ្នែកឆ្លាតទៅផ្នែកមុខ — ក្នុងករណីនោះ សូមពិចារណាការយករូបរាងសំណើ Responses ដើម្បីបញ្ចប់ជាតទៅជំនួសស្រទាប់បកប្រែ។ ប្រសិនបើផ្នែកមុខហៅ OpenAI ដោយផ្ទាល់ដោយ key មួយផ្នែកមុខ សូមផ្លាស់ប្ដូរហៅទៅផ្នែកក្រោយ ជាចម្បង។\n\n### ការលះបង់ `@microsoft\u002Fai-chat-protocol`\n\nបណ្ដុំនិពន្ធ npm `@microsoft\u002Fai-chat-protocol` លះបង់ និងគួរត្រូវបានជំនួសដោយ [`ndjson-readablestream`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fndjson-readablestream)។ ប្រសិនបើអ្នកជួបប្រទៈវានៅផ្នែកមុខ៖\n\n១. ជំនួសតេកដ្ឋាន script 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   ```\n ២. លុបការបង្កើត `AIChatProtocolClient` (`new ChatProtocol.AIChatProtocolClient(\"\u002Fchat\")`) ។\n៣. ជំនួស `client.getStreamedCompletion(messages)` ជាមួយការហៅ `fetch()` ទៅចំណុចបញ្ចប់ការស្ទ្រីមនៅខាងក្រោយ។\n៤. ជំនួស `for await (const response of result)` ជាមួយ `for await (const chunk of readNDJSONStream(response.body))`។\n៥. អាប់ដេតការចូលប្រើគុណភាពពី `response.delta.content` \u002F `response.error` ទៅ `chunk.delta.content` \u002F `chunk.error`។\n\n---\n\n## គោលដៅ\n\n- រាប់បញ្ចូលទីកន្លែងហៅ Python ទាំងអស់ប្រើ Chat Completions ឬ legacy Completions លើ Azure OpenAI។\n- ផ្តល់ផែនការផ្លាស់ប្តូរ និងលំដាប់សម្រាប់កូដ Python។\n- អនុវត្តកែប្រែយ៉ាងប្រុងប្រយ័ត្ន និងតិចតួច ដើម្បីផ្លាស់ទៅ Responses API។\n- ដំឡើងអ្នកហៅឲ្យប្រើស្កីម៉ាផលិតផល Responses; គ្មានស្រោមទ្រនាប់សំរាប់ Backcompat។\n- ដំណើរការប្រឡង\u002Fប្រឡូល; ដោះស្រាយបញ្ហាធម្មតាដែលបង្កឡើងដោយការផ្លាស់ប្តូរ។\n- ត្រៀមសំណុំផ្លាស់ប្តូរតូចៗអាចស្ទង់មើល និងផ្តល់សេចក្ដីសង្ខេបចុងក្រោយជាមួយតម្រឹម (កុំ commit)។\n\n---\n\n## បញ្ជីសុវត្ថិភាព\n\n- ត្រូវកែប្រែគ្រាន់តែឯកសារក្នុងបរិវេណ git ប៉ុណ្ណោះ។ មិនចោលពីក្រៅនោះទេ។\n- មិនផ្ដល់ការកាន់កាប់សមត្ថភាពមុន; ផ្លាស់ប្តូរកូដទៅរូបរាង API ថ្មី។\n- មិនទុកមតិយោបល់ការផ្លាស់ប្ដូរ ឬឯកសារបម្រុងទុកទាន់ពេលបានឡើយ។\n- គោរពភាពស្ទ្រីមបើវាបានគេចនា; បើមិនដូច្នោះប្រើមិនស្ទ្រីម។\n- សុំអនុម័តមុនពេលដំណើរការការបញ្ជា ឬហៅបណ្ដាញ ប្រសិនបើនៅនៅមុខងារអនុម័ត។\n- មិនដំណើរការ `git add`\u002F`git commit`\u002F`git push`; ផលិតតែការកែប្រែទិន្នន័យនៅក្នុង working-tree។\n\n---\n\n## ជំហាន 0: ផ្លាស់ប្តូរ Azure OpenAI Client (លក្ខខណ្ឌមុន)\n\nប្រសិនបើកូដប្រើ constructors `AzureOpenAI` ឬ `AsyncAzureOpenAI`, សូមផ្លាស់ទៅ constructors `OpenAI` \u002F `AsyncOpenAI` ផ្លូវការដំបូង។ constructors របស់ Azure សម្រាប់ `openai>=1.108.1` ត្រូវបានលះបង់។\n\n### ហេតុអ្វីត្រូវប្រើផ្លូវ API v1?\n\nចំណុចបញ្ចប់ថ្មី `\u002Fopenai\u002Fv1` ប្រើ client `OpenAI()` ផ្លូវការមិនយោង `AzureOpenAI()`, មិនចាំបាច់ប៉ារ៉ាម៉ែត្រ `api_version`, និងដំណើរការដូចគ្នាតាម OpenAI និង Azure OpenAI។ កូដ client ដូចគ្នា អនាគតធានា — មិនចាំបាច់គ្រប់គ្រងកំណែ។\n\n### ការផ្លាស់ប្តូរសំខាន់ៗ\n\n| មុន | បន្ទាប់ |\n|--------|-------|\n| `AzureOpenAI` | `OpenAI` |\n| `AsyncAzureOpenAI` | `AsyncOpenAI` |\n| `azure_endpoint` | `base_url` |\n| `azure_ad_token_provider` | `api_key` |\n| `api_version=...` | លុបទាំងស្រុង |\n\n### បញ្ជីសម្អាត\n\n- លុបប៉ារ៉ាម៉ែត្រ `api_version` ពីការបង្កើត client។\n- លុបបរិស្ថានបម្លែង `AZURE_OPENAI_VERSION` \u002F `AZURE_OPENAI_API_VERSION` ពី `.env`, app settings និងឯកសារ Bicep\u002Finfra។\n- ប្ដូរ `AZURE_OPENAI_CLIENT_ID` → `AZURE_CLIENT_ID` ក្នុង `.env`, app settings, Bicep\u002Finfra, និង test fixtures (ស្តង់ដារ Azure Identity SDK)។\n- ប្រាកដថា `openai>=1.108.1` នៅក្នុង `requirements.txt` ឬ `pyproject.toml`។\n\n### ផ្លាស់ប្តូរបរិស្ថានបម្លែង\n\n| បរិស្ថានបម្លែងចាស់ | សកម្មភាព | សម្គាល់ |\n|-------------|--------|-------|\n| `AZURE_OPENAI_VERSION` | **លុប** | មិនត្រូវការ `api_version` ជាមួយចំណុចបញ្ចប់ v1 |\n| `AZURE_OPENAI_API_VERSION` | **លុប** | ដូចគ្នា |\n| `AZURE_OPENAI_CLIENT_ID` | **ប្ដូរឈ្មោះ** → `AZURE_CLIENT_ID` | ស្តង់ដារ Azure Identity SDK សម្រាប់ `ManagedIdentityCredential(client_id=...)` |\n| `AZURE_OPENAI_ENDPOINT` | **រក្សាទុក** | ត្រូវការសម្រាប់បង្កើត `base_url` |\n| `AZURE_OPENAI_CHAT_DEPLOYMENT` | **រក្សាទុក** | ប្រើជា `model` ប៉ារ៉ាម៉ែត្រ នៅ `responses.create` |\n| `AZURE_OPENAI_API_KEY` | **រក្សាទុក** | ប្រើជា `api_key` សម្រាប់ការផ្ដល់សិទ្ធិដោយគ្រាប់សោ |\n\nសម្រាប់ឧទាហរណ៍កូដ client (sync, async, EntraID, API key, multi-tenant) សូមមើល [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md)។\n\n---\n\n## ជំហាន 1: រកមើលទីកន្លែងហៅប្រពៃណីចាស់\n\nដំណើរការ script [detect_legacy.py](..\u002F..\u002F..\u002F..\u002F..\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py) ដើម្បីស្វែងរកទីកន្លែងហៅទាំងអស់ដែលត្រូវការផ្លាស់ប្តូរ:\n\n```bash\npython skills\u002Fazure-openai-to-responses\u002Fscripts\u002Fdetect_legacy.py .\n```\n\nឬដំណើរការស្វែងរកទាំងនេះដោយដៃ — រាល់ការចេញផ្សាយជួបគ្នាជាគោលដៅផ្លាស់ប្តូរ:\n\n```bash\n# ការហៅ API ចាស់ (ត្រូវសរសេរឡើងវិញ)\nrg \"chat\\.completions\\.create\"\nrg \"ChatCompletion\\.create\"\nrg \"Completion\\.create\"\n\n# អ្នកបង្កើតថ្នាក់ Azure ដែលបានផ្អាកប្រើ (ត្រូវប្តូរ)\nrg \"AzureOpenAI\\(\"\nrg \"AsyncAzureOpenAI\\(\"\n\n# លំនាំការចូលប្រើរូបរាងចម្លើយ (ត្រូវធ្វើបច្ចុប្បន្នភាព)\nrg \"choices\\[0\\]\\.message\\.content\"\nrg \"choices\\[0\\]\\.delta\\.content\"\nrg \"choices\\[0\\]\\.message\\.function_call\"\nrg \"choices\\[0\\]\\.message\\.tool_calls\"\n\n# ការបញ្ជាក់ឧបករណ៍ក្នុងទ្រង់ទ្រាយជាស្រទាប់ចាស់ (ត្រូវធ្វើបញ្ឈរច្រាស)\nrg '\"function\":\\s*{\\s*\"name\"'\nrg \"pydantic_function_tool\"\n\n# លទ្ធផលឧបករណ៍ក្នុងទ្រង់ទ្រាយចាស់ (ត្រូវបម្លែងទៅ function_call_output)\nrg '\"role\":\\s*\"tool\"'\nrg '\"tool_call_id\"'\n\n# ប៉ារ៉ាម៉ែត្រ​ដែលបានផ្អាកប្រើ (ត្រូវលុបឬប្តូរឈ្មោះ)\nrg \"response_format\"\nrg \"max_tokens\\b\"        # ប្តូរឈ្មោះទៅ max_output_tokens\nrg \"['\\\"]seed['\\\"]\"      # remove entirely\n\n# អថេរបរិយាកាសដែលបានផ្អាកប្រើ (ត្រូវសម្អាត)\nrg \"AZURE_OPENAI_API_VERSION|AZURE_OPENAI_VERSION\"\nrg \"AZURE_OPENAI_CLIENT_ID\"  # គួរតែជា AZURE_CLIENT_ID\n\n# ចំណុចគោល GitHub Models (ត្រូវលុប — មិនគាំទ្រ Responses API)\nrg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"\n\n# លំនាំលំដាប់ស៊ុម legacy នៅលើ Framework (ត្រូវចាប់ផ្តើមបច្ចុប្បន្នភាព)\nrg \"OpenAIChatCompletionClient\"  # MAF 1.0.0+: ប្តូរទៅ OpenAIChatClient\nrg \"ChatOpenAI\\(\" | grep -v \"use_responses_api\"  # LangChain: ត្រូវការ use_responses_api=True\n\n# ហេដ្ឋារចនាសម្ព័ន្ធសាកល្បង (ត្រូវបច្ចុប្បន្នភាព)\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# ការចូលប្រើរាងកាយកំហុសតម្រងខ្លឹមសារ (ត្រូវបច្ចុប្បន្នភាព — រចនាសម្ព័ន្ធបានផ្លាស់ប្តូរ)\nrg 'innererror.*content_filter_result|error\\.body\\[\"innererror\"\\]'\nrg \"content_filter_result\\[\" # ទំរង់តែមួយចាស់ — ឥឡូវ content_filter_results (ពហុរូប) នៅខាងក្នុងអារេ content_filters\n\n# ការហៅ HTTP ដើមទៅចំណុចផ្ដាច់ Chat Completions (ត្រូវបច្ចុប្បន្នភាព URL)\nrg \"\u002Fopenai\u002Fdeployments\u002F.*\u002Fchat\u002Fcompletions\"\nrg \"api-version=\"\n```\n\n### វិធីសាស្រ្ត (រកឃើញ និងកែប្រែ)\n\n- **Client Chat Completions**: `client.chat.completions.create` → `client.responses.create(...)`.\n\n- **អ្នកតឹងតែងអតិថិជន Azure**៖ `AzureOpenAI(...)` → `OpenAI(base_url=..., api_key=...)`។\n- **ឧបករណ៍**៖ បម្លែងកំណត់នៃឧបករណ៍ហៅមុខងារពីទ្រង់ទ្រាយរក្សាទុកក្នុង nested (`{\"type\": \"function\", \"function\": {\"name\": ...}}`) ទៅទ្រង់ទ្រាយ Responses ជាត្រង់ (`{\"type\": \"function\", \"name\": ...}`)។ ប្រើ `tool_choice`។ ត្រឡប់លទ្ធផលឧបករណ៍ជារបស់ `{\"type\": \"function_call_output\", \"call_id\": ..., \"output\": ...}` (មិនមែនជា `{\"role\": \"tool\", ...}`)។\n- **ការបង្រ្កាបឧបករណ៍ជាច្រើនដង**៖ ពេលម៉ូដែលត្រឡប់ការហៅមុខងារ សូមបន្ថែមធាតុ `response.output` ទៅក្នុងកិច្ចសន្ទនា (មិនមែនជាដីកសាន់ `{\"role\": \"assistant\", \"tool_calls\": [...]}`) បន្ទាប់មកបន្ថែមធាតុ `function_call_output` សម្រាប់លទ្ធផលនីមួយៗ។\n- **ឧទាហរណ៍ឧបករណ៍ប៉ុន្មានដង**៖ ប្រសិនបើកិច្ចសន្ទនាមានឧទាហរណ៍ហៅឧបករណ៍ដាក់កូដម៉ានូ អ្នកត្រូវបម្លែងពួកវាទៅជា `{\"type\": \"function_call\", \"id\": \"fc_...\", \"call_id\": \"fc_...\", ...}` ជាមួយខ្សែកូដ `{\"type\": \"function_call_output\", ...}`។ អត្តសញ្ញាណត្រូវចាប់ផ្តើមជាមួយ `fc_`។\n- **`pydantic_function_tool()`**៖ ជំនួយនេះនៅតែបង្កើតទ្រង់ទ្រាយ nested ចាស់ ហើយមិន **ការព្រមព្រៀង** ជាមួយ `responses.create()`។ ជំនួសដោយកំណត់តែងឧបករណ៍ដោយដៃ ឬប្រើវ៉ារ៉ាប់បាច់បញ្ចូល។\n- **ចំលងជាច្រើនជុំ**៖ រក្សាប្រវត្តិកិច្ចសន្ទនានៅក្នុងកម្មវិធី; បញ្ជូនជុំមុនៗតាមរយៈធាតុ `input`។\n- **រចនាប័ទ្ម**៖ ជំនួស `response_format` នៅកំពូល Chat ជា `text.format` ក្នុង Responses។ ទ្រង់ទ្រាយស្តង់ដា៖ `text={\"format\": {\"type\": \"json_schema\", \"name\": \"Output\", \"strict\": True, \"schema\": {...}}}`។\n- **ធាតុមាតិកា**៖ បម្លែង `content[].type: \"text\"` របស់ Chat ទៅជា `content[].type: \"input_text\"` សម្រាប់ជុំអ្នកប្រើ\u002Fប្រព័ន្ធ ក្នុង Responses។\n- **ធាតុំាតិការូបភាព**៖ បម្លែង `content[].type: \"image_url\"` របស់ Chat ទៅជា `content[].type: \"input_image\"` នៅក្នុង Responses។ ប្រស្នាក់ `image_url` បម្លែងពីអប្បបរមា nested `{\"url\": \"...\"}` ទៅខ្សែស្រឡាយត្រង់។ មើលស្លាកជំនួយសម្រាប់ឧទាហរណ៍មុន\u002Fបន្ទាប់។\n- **ខិតខំពិចារណា**៖ **ចូរផ្លាស់ប្តូរ `reasoning` តែប៉ុណ្ណោះ ប្រសិនបើវាមានរួចហើយក្នុងកូដដើម**។\n- **ដំណើរការខូចខាតក្នុងការត្រួតពិនិត្យមាតិកា**៖ រចនាសម្ព័ន្ធខ្លឹមសារខុស។ Chat Completions ប្រើ `error.body[\"innererror\"][\"content_filter_result\"]` (ឯកជន); Responses API ប្រើ `error.body[\"content_filters\"][0][\"content_filter_results\"]` (ពហុ បញ្ចូលក្នុងតារាង)។ កូដដែលចូលដល់ `innererror` នឹងបញ្ចេញ `KeyError`។ សូមសរសេរឡើងវិញដើម្បីប្រើផ្លូវថ្មី។\n- **ហៅ HTTP ដំបូងគ្រប់គ្រាន់**៖ ប្រសិនបើកម្មវិធីហៅ REST API Azure OpenAI ដោយផ្ទាល់ (តាម `requests`, `httpx`, ល.) ដោយប្រើ `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions?api-version=...` សូមបម្លែងទៅ `\u002Fopenai\u002Fv1\u002Fresponses`។ ខ្លឹមសារសំណើបម្លែង៖ `messages` → `input` ផ្ដល់ `max_output_tokens` និង `store: false` លុប `api-version` query។ ខ្លឹមសារឆ្លើយតបបម្លែង៖ `choices[0].message.content` → `output[0].content[0].text` (ចំណាំ៖ `output_text` គឺជាគុណលក្ខណៈ SDK មិនមានក្នុង JSON REST ដើម)។\n\n---\n\n## ជំហានទី 2៖ អនុវត្តការផ្លាស់ប្តូរ\n\n### កំណត់សម្គាល់ការផ្លាស់ប្តូរ (Chat Completions → Responses)\n\n- **ហេតុផលផ្លាស់ប្តូរ**៖ Responses ជា API ឯកសរ​សម្រាប់អត្ថបទ, ឧបករណ៍ និងការចាក់ទឹក។ Chat Completions ជាគំរូចាស់។ ជាមួយ GPT-5, Responses ត្រូវបានទាមទារសម្រាប់ប្រសិទ្ធភាពអតិបរមា។\n- **HTTP**៖ ចំណុចបញ្ចូល Azure ផ្លាស់ពី `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions` ទៅ `\u002Fopenai\u002Fv1\u002Fresponses`។\n- **វាលទិន្នន័យ**៖ `messages` → `input`, `max_tokens` → `max_output_tokens`។ `temperature` មិនផ្លាស់ប្តូរ។\n- **រចនាប័ទ្ម**៖ `response_format` → `text.format` ជាវត្ថុត្រឹមត្រូវ។\n- **ធាតុមាតិកា**៖ ជំនួស `content[].type: \"text\"` របស់ Chat ជា `content[].type: \"input_text\"` សម្រាប់ជុំប្រព័ន្ធ\u002Fអ្នកប្រើក្នុង Responses។\n- **ធាតុរូបភាព**៖ ជំនួស `content[].type: \"image_url\"` របស់ Chat ជា `content[].type: \"input_image\"` ក្នុង Responses។ ផ្លាស់ប្តូរជំនួសវាល `image_url` ពី `{\"image_url\": {\"url\": \"...\"}}` ទៅ `{\"image_url\": \"...\"}` (ខ្សែស្រឡាយត្រង់ — ទាំង អាសយដ្ឋាន HTTPS ឬ URI ទិន្នន័យ `data:image\u002F...;base64,...`)។\n\n### ឯកសារការកំណត់ផែនទីប៉ារ៉ាម៉ែត្រ\n\n| Chat Completions | Responses API |\n|-----------------|---------------|\n| `prompt` | `input` |\n| `messages` | `input` (សារៈក្នុងអារ៉េ) |\n| `max_tokens` | `max_output_tokens` |\n| `response_format` | `text.format` (វត្ថុ) |\n| `temperature` | `temperature` (មិនផ្លាស់ប្តូរ) |\n| `stop` | `stop` (មិនផ្លាស់ប្តូរ) |\n| `frequency_penalty` | `frequency_penalty` (មិនផ្លាស់ប្តូរ) |\n| `presence_penalty` | `presence_penalty` (មិនផ្លាស់ប្តូរ) |\n| `tools` \u002F ហៅមុខងារ | `tools` (មិនផ្លាស់ប្តូរ) |\n| `seed` | **លុបចោល** (មិនគាំទ្រ) |\n| `store` | `store` (កំណត់ជា `false`) |\n| `content[].type: \"text\"` | `content[].type: \"input_text\"` |\n| `content[].type: \"image_url\"` | `content[].type: \"input_image\"` |\n| `\"image_url\": {\"url\": \"...\"}` | `\"image_url\": \"...\"` (ខ្សែស្រឡាយត្រង់) |\n\nសម្រាប់ឧទាហរណ៍កូដពេញលេញ មុន\u002Fបន្ទាប់ គឺមើលបាន [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md)។\n\nសម្រាប់ផ្លាស់ប្តូរគ្រឹះស្ថានតេស្ត (mocks, snapshots, assertions) សូមមើល [test-migration.md](.\u002Freferences\u002Ftest-migration.md)។\n\nសម្រាប់ដោះស្រាយកំហុស និងការប្រើប្រាស់ មាននៅ [troubleshooting.md](.\u002Freferences\u002Ftroubleshooting.md)។\n\n---\n\n## ការផ្ទុកទិន្នន័យ និងស្ថានភាព\n\n- កំណត់ `store: false` លើសំណើ Responses ទាំងអស់។\n- មិនពឹងផ្អែកលើអត្តសញ្ញាណសារមុន ឬបរិបទដែលបានរក្សាទុកនៅម៉ាស៊ីនបម្រើ; រក្សាស្ថានភាពដោយការគ្រប់គ្រងរបស់អតិថិជន ហើយកាត់បន្ថយ metadata។\n\n---\n\n## លក្ខខណ្ឌទទួលយក\n\n### ច្រកកូដកម្រិត (ទាំងអស់ត្រូវតែជោគជ័យ)\n\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"chat\\.completions\\.create|ChatCompletion\\.create|Completion\\.create\"` ក្នុងឯកសារ ដែលបានផ្លាស់ប្តូរ។\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"AzureOpenAI\\(|AsyncAzureOpenAI\\(\"` — អ្នកតឹងតែងទាំងអស់ប្រើ `OpenAI`\u002F`AsyncOpenAI` ជាមួយចំណុចបញ្ចូល v1។\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"` — គន្លងកូដ GitHub Models បានដកចេញ។\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"OpenAIChatCompletionClient\"` — កូដ MAF 1.0.0+ ប្រើ `OpenAIChatClient` (ដែលប្រើ Responses API)។ ក្នុងមុន-1.0.0, ធ្វើការដំឡើងទៅ `agent-framework-openai>=1.0.0`។\n- [ ] ការហៅ `ChatOpenAI(...)` ទាំងអស់រួមបញ្ចូល `use_responses_api=True`។\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"choices\\[0\\]\"` — ការចូលប្រើលទ្ធផលទាំងអស់ប្រើ `resp.output_text` ឬទ្រង់ទ្រាយ output Responses។\n- [ ] មិនមាន `response_format` លើកំពូល; លទ្ធផលមានរចនាសម្ព័ន្ធទាំងអស់ប្រើ `text={\"format\": {...}}`។\n- [ ] មាន `openai>=1.108.1` និង `azure-identity` ក្នុង `requirements.txt` ឬ `pyproject.toml`; តម្រូវការត្រូវបានដំឡើងឡើងវិញ។\n- [ ] ចុះបញ្ជី `store=False` លើការហៅ `responses.create` ទាំងអស់។\n- [ ] មិនមាន `api_version` ក្នុងការបង្កើតអតិថិជន; ការ​លុប `AZURE_OPENAI_API_VERSION` ពីឯកសារ env និងអាគារពាក់ព័ន្ធ។\n\n### ច្រកសំណង់តេស្ត (ទាំងអស់ត្រូវតែជោគជ័យ)\n\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"ChatCompletionChunk|AsyncCompletions\\.create|chat\\.completions\" tests\u002F`។\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"_azure_ad_token_provider\" tests\u002F` — បញ្ញត្តិបានធ្វើបច្ចុប្បន្នភាព ដើម្បីពិនិត្យ `isinstance(client, AsyncOpenAI)` ឬ `base_url`។\n- [ ] គ្មានការប្រកួតផ្គូផ្គងសម្រាប់ `rg \"prompt_filter_results|content_filter_results\" tests\u002F` — mocks គោលលក្ខណៈ filter របស់ Azure បានដកចេញ។\n- [ ] mock fixture ប្រើ `kwargs.get(\"input\")` មិនមែន `kwargs.get(\"messages\")`។\n- [ ] Snapshot \u002F golden files បានបន្ទាន់សម័យទៅទ្រង់ទ្រាយ streaming Responses (គ្មាន `choices[0]`, `function_call`, `logprobs` ទេ)។\n- [ ] `pytest` ការបញ្ចប់ជោគជ័យ ដោយគ្មានបរាជ័យក្រោយការកែប្រែទាំងអស់។\n\n### ច្រករបៀបអនុវត្ត (ត្រួតពិនិត្យដោយដៃ ឬតាម test harness)\n\n- [ ] **ការបញ្ចប់មូលដ្ឋាន**៖ `responses.create` មិនស្ទ្រីម ត្រូវត្រឡប់ `output_text` មិនទទេ។\n- [ ] **ភាពស្ទ្រីមស្មើភាព**៖ ប្រសិនបើកូដដើមប្រើការស្ទ្រីម កូដដែលបានផ្លាស់ប្តូរនឹងស្ទ្រីម និងបញ្ចេញព្រឹត្តិការណ៍ `response.output_text.delta` ជាមួយ delta មិនទទេ។\n- [ ] **លទ្ធផលមានរចនាសម្ព័ន្ធ**៖ ប្រសិនបើប្រើ `text.format` ជាមួយ `json_schema`, `json.loads(resp.output_text)` ត្រូវជោគជ័យ និងមានផ្ទឹងទៅនឹង schema។\n- [ ] **វដ្តហៅឧបករណ៍**៖ ប្រសិនបើប្រើឧបករណ៍ ម៉ូដែលហៅឧបករណ៍ កម្មវិធីអនុវត្ត ពេលបន្ទាប់សំណើត្រឡប់ `output_text` ចុងក្រោយ (គ្មានវដ្តអតិផរណា)។\n- [ ] **ភាពស្មើភាព Async**៖ ប្រសិនបើប្រើ `AsyncAzureOpenAI` វិធីសាស្រ្តស្មើគ្នា `AsyncOpenAI` នឹងដំណើរការជាមួយ `await`។\n- [ ] **អត្រាកំហុស**៖ មិនមានកំហុស 400\u002F401\u002F404 ថ្មីប្រៀបធៀបទៅមុនពេលផ្លាស់ប្តូរ។\n\n### ទំនុកចរន្ត\n\n- សេចក្ដីសង្ខេបរួមមានឯកសារ​ដែលបានកែប្រែ ចំនួនកន្លែងហៅប្រពៃណីមុន\u002Fបន្ទាប់ និងជំហានបន្ទាប់។\n- ប្រែប្រួលគឺជាការកែសម្រួលក្នុងផ្ទះបាយ (working-tree edits) មិនមែនជាការបញ្ជូន commit ទេ។\n\n---\n\n## តម្រូវការដំណើរការកំណែ SDK\n\n| កញ្ចប់ | កំណែអប្បបរមា |\n|---------|----------------|\n| `openai` | `>=1.108.1` |\n| `azure-identity` | ថ្មីបំផុត (សម្រាប់​អត្តសញ្ញាណ EntraID) |\n\n---\n\n## ឯកសារយោង\n\n- [តារាងជំនួយ — ជួរខ្សែខ្លីកូដទាំងអស់](.\u002Freferences\u002Fcheat-sheet.md)\n- [ការផ្លាស់ប្តូរទំហំតេស្ត — mocks, snapshots, assertions](.\u002Freferences\u002Ftest-migration.md)\n- [ដោះស្រាយបញ្ហា — កំហុស, តារាងហានិភ័យ, បញ្ហា](.\u002Freferences\u002Ftroubleshooting.md)\n- [detect_legacy.py — កម្មវិធីស្កេនស្វ័យប្រវត្តិ](..\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- [ឯកសារ API Azure OpenAI Responses](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fhow-to\u002Fresponses)\n- [ជីវិត 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- [ឯកសារយោង API Responses OpenAI](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fresponses)\n\n---\n\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**ការបដិសេធ**:\nឯកសារនេះត្រូវបានបម្លែងភាសា ដោយប្រើសេវាបម្លែងភាសា AI [Co-op Translator](https:\u002F\u002Fgithub.com\u002FAzure\u002Fco-op-translator)។ ទោះយើងខ្ញុំមានក្តីប្រាថ្នាឱ្យបានច្បាស់លាស់ តែសូមយល់ដឹងថាការបម្លែងដោយស្វ័យប្រវត្តិក៏អាចមានកំហុសឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមជាភាសាទីតាំងគួរត្រូវបានគេប្រើជាប្រភពច្បាស់លាស់។ សម្រាប់ព័ត៌មានសំខាន់ៗ សូមណែនាំឱ្យប្រើប្រាស់ការប្រែដោយមនុស្សជំនាញ។ យើងខ្ញុំមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសបន្ទាប់ពីការប្រើប្រាស់ការបម្លែងនេះនោះទេ។\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER END -->",{"name":5,"license":14},"main","f09e94ffe170f8af6d3db7c42987bbe4db227723","translations\u002Fkm\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\u002Fkm\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002FSKILL.md",true,[48,54,60,64,68,72],{"path":49,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":52,"sourceHtmlUrl":53},"profiles\u002Fclaude_code\u002Fcanaries.jsonl","OTHER","其他",75,"https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Ftests\u002Fruntime\u002Ffixtures\u002Foverlay_deploy\u002Fskills\u002Fsample-alpha\u002Fprofiles\u002Fclaude_code\u002Fcanaries.jsonl",{"path":55,"resourceType":56,"resourceTypeDesc":57,"sizeBytes":58,"sourceHtmlUrl":59},"references\u002Fcheat-sheet.md","REFERENCE","参考文档",39582,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fkm\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Freferences\u002Fcheat-sheet.md",{"path":61,"resourceType":56,"resourceTypeDesc":57,"sizeBytes":62,"sourceHtmlUrl":63},"references\u002Fnote.md",301,"https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Ftests\u002Fruntime\u002Ffixtures\u002Foverlay_deploy\u002Fskills\u002Fsample-alpha\u002Freferences\u002Fnote.md",{"path":65,"resourceType":56,"resourceTypeDesc":57,"sizeBytes":66,"sourceHtmlUrl":67},"references\u002Ftest-migration.md",10554,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fkm\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Freferences\u002Ftest-migration.md",{"path":69,"resourceType":56,"resourceTypeDesc":57,"sizeBytes":70,"sourceHtmlUrl":71},"references\u002Ftroubleshooting.md",26494,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fkm\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Freferences\u002Ftroubleshooting.md",{"path":73,"resourceType":56,"resourceTypeDesc":57,"sizeBytes":74,"sourceHtmlUrl":75},"skill.yaml",588,"https:\u002F\u002Fgithub.com\u002Flutzfinger\u002FSAI-baseversion\u002Fblob\u002Fmain\u002Ftests\u002Fruntime\u002Ffixtures\u002Foverlay_deploy\u002Fskills\u002Fsample-alpha\u002Fskill.yaml",[77,95,106,114,122,129],{"skillNo":78,"name":79,"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":80,"categories":81,"keywords":92,"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",[82,87],{"categoryNo":83,"categoryName":84,"taxonomyType":85,"taxonomyTypeDesc":86},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":88,"categoryName":89,"taxonomyType":90,"taxonomyTypeDesc":91},"01JBSEEDCAT000000000000039","教师与教育","PROFESSION","适用职业",[93,94],"testing","testing course samples",{"skillNo":96,"name":97,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":103,"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",[100],{"categoryNo":101,"categoryName":102,"taxonomyType":85,"taxonomyTypeDesc":86},"01JBSEEDCAT000000000000023","Skill与智能体开发",[104,8,105],"docs","microsoft docs",{"skillNo":107,"name":108,"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":109,"categories":110,"keywords":111,"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",[],[112,113],"ai agents","local ai agents",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":120,"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",[],[121],"jupyter notebook",{"skillNo":123,"name":124,"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":125,"categories":126,"keywords":127,"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",[],[128],"deploying scalable agents",{"skillNo":130,"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":131,"categories":132,"keywords":133,"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]]