[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M699FDX3NRYWVYECW2QM872N":3,"skill-same:01M699FDX3NRYWVYECW2QM872N":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},"01M699FDX3NRYWVYECW2QM872N","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\u002Fhe\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# הגירת אפליקציות פייתון מ-Azure OpenAI Chat Completions ל-Responses API\n\n> **הנחיה מחייבת — עקוב במדויק**\n>\n> מיומנות זו מיגרת בסיסי קוד בפייתון המשתמשים ב-Azure OpenAI Chat Completions\n> ל-API המאוחד Responses. עקוב אחרי ההוראות במדויק.\n> אל תתעסק במיפויי פרמטרים או תמציא צורות API חדשות.\n\n---\n\n## טריגרים\n\nהפעל מיומנות זו כאשר המשתמש רוצה:\n- להגר אפליקציית פייתון מ-Azure OpenAI Chat Completions ל-Responses API\n- לשדרג שימוש ב-Python OpenAI SDK לצורת API העדכנית ביותר נגד Azure OpenAI\n- להכין קוד פייתון למודלים GPT-5 או חדשים יותר שדורשים Responses על Azure\n- לעבור מ-`AzureOpenAI`\u002F`AsyncAzureOpenAI` ללקוח הסטנדרטי `OpenAI`\u002F`AsyncOpenAI` עם נקודת קצה v1\n- לתקן אזהרות התיישנות שקשורות לבנאי `AzureOpenAI` או `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` רק אם היה קיים בקוד המקורי.\n> - **פרמטר `seed`**: אינו נתמך בכלל ב-Responses API — הסר מכל הבקשות.\n> - **פלט מובנה דרך `text.format`**: דגמים ישנים עשויים לא לאכוף במדויק סכמות JSON עם `strict: true`.\n> - **אורקסטרציה של כלים**: GPT-5 ומעלה מארגנים קריאות כלים כחלק מההסקה הפנימית. דגמים ישנים ב-Responses עדיין עובדים אך חסרה אינטגרציה עמוקה זו.\n> - **מגבלות טמפרטורה**: בהגירה ל-`gpt-5` יש לדחות את הטמפרטורה או לקבועה ל-`1`. לדגמים ישנים אין מגבלה זו.\n\n### דגמי הסקה מסדרת 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+) כי אסימוני הסקה נספרים נגד המגבלה.\n- **`reasoning_effort`**: אם האפליקציה משתמשת ב-`reasoning_effort` (נמוך\u002Fבינוני\u002Fגבוה), יש לשמור עליו — ה-Responses API תומך בפרמטר זה לדגמי סדרת O.\n- **התנהגות סטרימינג**: דגמי סדרת O עשויים לאגור פלט עד לסיום ההסקה לפני שיוצרים אירועי דלתא טקסט. סטרימינג עדיין עובד, אך `response.output_text.delta` ראשוני עשוי להגיע מעכב יותר מאשר בדגמי GPT.\n- **`top_p`**: אינו נתמך בסדרת O — הסר אם קיים.\n- **שימוש בכלים**: דגמי סדרת O תומכים בכלים דרך Responses API כפי שמודלים GPT תומכים, אך איכות אורקסטרציית קריאות כלים משתנה לפי דגם.\n\n**פעולה — ייעוץ מודל יזום**: במהלך שלב הסריקה, בדוק לאיזה דגם האפליקציה מיועדת (שמות פריסה, משתני סביבת עבודה, קונפיגורציה). אם הדגם מקדים ל-`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 (חפש `base_url` המכוון ל-`models.github.ai` או `models.inference.ai.azure.com`), **הסר אותו לגמרי** במהלך ההגירה. ה-Responses API דורש Azure OpenAI, OpenAI או נקודת קצה מקומית תואמת (למשל Ollama עם תמיכה ב-Responses).\n\nפעולה במהלך הסריקה:\n- סמן כל נתיב קוד לדגמי GitHub להסרה.\n\n---\n\n## הגירת מסגרת עבודה\n\nאפליקציות רבות משתמשות במסגרת עבודה ברמת גבוה מעל OpenAI. בהגירת אלו, ה-API של המסגרת משתנה — לא רק הקריאות התחתונות ל-OpenAI.\n\n### מסגרת סוכנים של מיקרוסופט (MAF)\n\n**בדוק תחילה את גרסת MAF שלך** — ההגירה תלויה אם אתה על MAF 1.0.0+ או ביטא\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 (הוצאות ביטא\u002FRC)\n\nב-MAF לפני 1.0.0, `OpenAIChatClient` השתמש ב-Chat Completions. שדרג ל-`agent-framework-openai>=1.0.0` שבו `OpenAIChatClient` כבר משתמש ב-Responses API כברירת מחדל.\n\nאין שינוי נוסף דרוש — ה-API של `Agent` והכלים נשארים זהים.\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 הוא נושא צד-שרת.** הגר את הבקאנד בפייתון שלך; חוזה HTTP בצד הפרונטאנד צריך להישאר ללא שינוי אלא אם הבקאנד שלך הוא מעקף דק — במקרה זה שקול לאמץ את צורת הבקשה של Responses כדי לבטל שכבת תרגום. אם הפרונטאנד קורא ל-OpenAI ישירות עם מפתח בצד לקוח, העבר את הקריאות לבקאנד קודם.\n\n### הפסקת שימוש ב-`@microsoft\u002Fai-chat-protocol`\n\nחבילת ה-npm `@microsoft\u002Fai-chat-protocol` הוסרה ויש להחליפה ב-[`ndjson-readablestream`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fndjson-readablestream). אם נתקל בה בפרונטאנד:\n\n1. החלף את תגית סקריפט 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. הסר יצירת מופע `AIChatProtocolClient` (`new ChatProtocol.AIChatProtocolClient(\"\u002Fchat\")`).\n3. החלף את `client.getStreamedCompletion(messages)` בקריאה ישירה ל-`fetch()` לנקודת הקצה סטרימינג בבקאנד.\n4. החלף `for await (const response of result)` ב-`for await (const chunk of readNDJSONStream(response.body))`.\n5. עדכן גישה למאפיינים מ-`response.delta.content` \u002F `response.error` ל-`chunk.delta.content` \u002F `chunk.error`.\n\n---\n\n## מטרות\n\n- למנות את כל אתרי הקריאה בפייתון המשתמשים ב-Chat Completions או ב-Completions ישן נגד Azure OpenAI.\n- להציע תוכנית והסדר הגירה עבור בסיס הקוד בפייתון.\n- לבצע שינויים מינימליים ובטוחים לעבור ל-Responses API.\n- לעדכן קוראים לצריכת סכמת הפלט של Responses; ללא עטיפות תאימות אחורית.\n- להריץ בדיקות\u002Fלינטים; לתקן תקלות משניות שנגרמו מההגירה.\n- להכין קבוצות שינויים קטנות וכנות לסקירה ולספק סיכום סופי עם הבדלים (לא לבצע commit).\n\n---\n\n## כללי שמירת גבולות\n\n- לשנות רק קבצים בתוך סביבת ה-git. לעולם אל תכתוב מחוץ לה.\n- אל תשמור התאמות תאימות לאחור; הגר את הקוד לצורת ה-API החדשה.\n- אל תשאיר הערות מעבר\u002Fמעבר או קבצי גיבוי.\n- שמור על סמנטיקת סטרימינג אם הייתה בשימוש קודם; אחרת השתמש ללא סטרימינג.\n- בקש אישור לפני הרצת פקודות או קריאות רשת אם במצב אישורים.\n- אל תריץ `git add`\u002F`git commit`\u002F`git push`; הפק רק שינויים בעץ העבודה.\n\n---\n\n## שלב 0: הגירת לקוח Azure OpenAI (דרישה מוקדמת)\n\nאם בסיס הקוד משתמש בבנאי `AzureOpenAI` או `AsyncAzureOpenAI`, הגר תחילה לבנאי הסטנדרטי `OpenAI` \u002F `AsyncOpenAI`. בנאים ייחודיים ל-Azure אינם נתמכים ב-`openai>=1.108.1`.\n\n### למה נקודת קצה v1?\n\nנקודת הקצה החדשה `\u002Fopenai\u002Fv1` משתמשת בלקוח הסטנדרטי `OpenAI()` במקום `AzureOpenAI()`, אינה דורשת פרמטר `api_version`, ופועלת זהה ב-OpenAI וב-Azure OpenAI. קוד הלקוח זהה והכין לעתיד — ללא צורך בניהול גרסאות.\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` מבניית הלקוח.\n- הסר משתני סביבה `AZURE_OPENAI_VERSION` \u002F `AZURE_OPENAI_API_VERSION` מקובץ `.env`, הגדרות אפליקציה וקבצי Bicep\u002Fתשתית.\n- שנה את `AZURE_OPENAI_CLIENT_ID` ל־`AZURE_CLIENT_ID` בקובץ `.env`, הגדרות אפליקציה, Bicep\u002Fתשתית ודגמי בדיקה (הסכם סטנדרטי של 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לדוגמאות קוד של פעולת הלקוח (סינכרוני, אסינכרוני, EntraID, מפתח API, מולטי טננט), ראה [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## שלב 1: זיהוי אתרי קריאה ישנים\n\nהפעל את הסקריפט [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 (חייב להסיר — API לתגובות לא נתמך)\nrg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"\n\n# דפוסי מורשת ברמת התשתית (חייבים לעדכן)\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- **לקוח Chat Completions**: `client.chat.completions.create` → `client.responses.create(...)`.\n\n- **קונסטרוקטורים של לקוח Azure**: `AzureOpenAI(...)` → `OpenAI(base_url=..., api_key=...)`.\n- **כלים**: המרת הגדרות כלי-קריאה לפונקציה מפורמט מקונן (`{\"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()`**: העזר הזה עדיין מייצר את הפורמט המקונן הישן ואינו **תואם** ל-`responses.create()`. החלף בהגדרות כלי ידניות או עטיפה שמשטיחה.\n- **רב-סיבובים**: שמור היסטוריית שיחה באפליקציה; העבר סיבובים קודמים כפריטי `input`.\n- **עיצוב**: החלף את `response_format` של Chat בשכבת על ב-Responses עם `text.format`. צורה קאנונית: `text={\"format\": {\"type\": \"json_schema\", \"name\": \"Output\", \"strict\": True, \"schema\": {...}}}`.\n- **פריטי תוכן**: החלף `content[].type: \"text\"` של Chat ל-`content[].type: \"input_text\"` ב-Responses עבור תורות של משתמש\u002Fמערכת.\n- **פריטי תוכן תמונה**: החלף `content[].type: \"image_url\"` של Chat ל-`content[].type: \"input_image\"` ב-Responses. השדה `image_url` משתנה מאובייקט מקונן `{\"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 גולמיות**: אם האפליקציה עושה קריאה ישירה ל-Azure OpenAI REST API (דרך `requests`, `httpx`, וכו') באמצעות `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions?api-version=...`, המיר ל-`\u002Fopenai\u002Fv1\u002Fresponses`. גוף הבקשה משתנה: `messages` → `input`, הוסף `max_output_tokens` ו-`store: false`, הסר פרמטר שאילתה `api-version`. גוף התגובה משתנה: `choices[0].message.content` → `output[0].content[0].text` (שים לב: `output_text` הוא מאפיין נוחות SDK שאינו קיים ב-JSON גולמי).\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\"` ב-Responses עבור תורות מערכת\u002Fמשתמש.\n- **פריטי תוכן תמונה**: החלף `content[].type: \"image_url\"` של Chat ל-`content[].type: \"input_image\"` ב-Responses. שטח את השדה `image_url` מ-`{\"image_url\": {\"url\": \"...\"}}` ל-`{\"image_url\": \"...\"}` (מחרוזת פשוטה — כתובת 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להגירת תשתית בדיקות (מוקים, תמונות מצב, ואישורים), ראה [test-migration.md](.\u002Freferences\u002Ftest-migration.md).\n\nלפתרון תקלות וטעויות, ראה [troubleshooting.md](.\u002Freferences\u002Ftroubleshooting.md).\n\n---\n\n## שמירת מידע ומצב\n\n- קבע `store: false` בכל בקשות Responses.\n- אל תסתמך על מזהי הודעות קודמות או הקשר שנשמר בשרת; שמור מצב מנוהל-לקוח וצמצם מטא-דאטה.\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 הוסרו.\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` או סכמת הפלט של 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` הוסר מקבצי הסביבה והתשתית.\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` — מוקים ספציפיים ל-Azure להסינון הוסרו.\n- [ ] מוקים משתמשים ב-`kwargs.get(\"input\")` ולא ב-`kwargs.get(\"messages\")`.\n- [ ] קבצי snapshot \u002F golden מעודכנים לצורת הזרימה של Responses (ללא `choices[0]`, `function_call`, `logprobs` וכו').\n- [ ] `pytest` עובר ללא כשלונות לאחר כל עדכוני הבדיקות.\n\n### שערים התנהגותיים (בדיקה ידנית או דרך מסגרת בדיקות)\n\n- [ ] **השלמה בסיסית**: `responses.create` שאינה זורמת מחזירה `output_text` שאינו ריק.\n- [ ] **עקיבות בזרימה**: אם הקוד המקורי השתמש בזרימה, הקוד שהוגר זורם ומפיק אירועים `response.output_text.delta` עם דלתא לא ריקה.\n- [ ] **פלט מובנה**: אם משתמשים ב-`text.format` עם `json_schema`, `json.loads(resp.output_text)` מצליח ותואם לסכמה.\n- [ ] **לולאת קריאה לכלים**: אם משתמשים בכלים, המודל מוציא קריאות כלים, האפליקציה מבצעת אותן, והבקשה הבאה מחזירה פלט סופי `output_text` (ללא לולאה אינסופית).\n- [ ] **עקיבות אסינכרונית**: אם השתמשו ב-`AsyncAzureOpenAI`, מקביל ב-`AsyncOpenAI` עובד עם `await`.\n- [ ] **שיעור שגיאות**: אין שגיאות חדשות מסוג 400\u002F401\u002F404 בהשוואה לקו הבסיס לפני ההגירה.\n\n### תוצרי עבודה\n\n- התקציר כולל קבצים שנערכו, מונים לפני\u002Fאחרי של אתרי קריאה מורשת, ושלבים הבאים.\n- השינויים הם רק עריכות בעץ העבודה (ללא commits).\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- [הגירת בדיקות — מוקים, תמונות מצב, אישורים](.\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- [מסמכי Azure OpenAI Responses API](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fhow-to\u002Fresponses)\n- [מחזור חיים של גרסת Azure OpenAI API](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fapi-version-lifecycle?view=foundry-classic&tabs=python#api-evolution)\n- [OpenAI Responses API reference](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fresponses)\n\n---\n\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**כתב ויתור**:\nמסמך זה תורגם באמצעות שירות תרגום אוטומטי [Co-op Translator](https:\u002F\u002Fgithub.com\u002FAzure\u002Fco-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה.\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER END -->","# הגירת אפליקציות פייתון מ-Azure OpenAI Chat Completions ל-Responses API\n\n> **הנחיה מחייבת — עקוב במדויק**\n>\n> מיומנות זו מיגרת בסיסי קוד בפייתון המשתמשים ב-Azure OpenAI Chat Completions\n> ל-API המאוחד Responses. עקוב אחרי ההוראות במדויק.\n> אל תתעסק במיפויי פרמטרים או תמציא צורות API חדשות.\n\n---\n\n## טריגרים\n\nהפעל מיומנות זו כאשר המשתמש רוצה:\n- להגר אפליקציית פייתון מ-Azure OpenAI Chat Completions ל-Responses API\n- לשדרג שימוש ב-Python OpenAI SDK לצורת API העדכנית ביותר נגד Azure OpenAI\n- להכין קוד פייתון למודלים GPT-5 או חדשים יותר שדורשים Responses על Azure\n- לעבור מ-`AzureOpenAI`\u002F`AsyncAzureOpenAI` ללקוח הסטנדרטי `OpenAI`\u002F`AsyncOpenAI` עם נקודת קצה v1\n- לתקן אזהרות התיישנות שקשורות לבנאי `AzureOpenAI` או `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` רק אם היה קיים בקוד המקורי.\n> - **פרמטר `seed`**: אינו נתמך בכלל ב-Responses API — הסר מכל הבקשות.\n> - **פלט מובנה דרך `text.format`**: דגמים ישנים עשויים לא לאכוף במדויק סכמות JSON עם `strict: true`.\n> - **אורקסטרציה של כלים**: GPT-5 ומעלה מארגנים קריאות כלים כחלק מההסקה הפנימית. דגמים ישנים ב-Responses עדיין עובדים אך חסרה אינטגרציה עמוקה זו.\n> - **מגבלות טמפרטורה**: בהגירה ל-`gpt-5` יש לדחות את הטמפרטורה או לקבועה ל-`1`. לדגמים ישנים אין מגבלה זו.\n\n### דגמי הסקה מסדרת 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+) כי אסימוני הסקה נספרים נגד המגבלה.\n- **`reasoning_effort`**: אם האפליקציה משתמשת ב-`reasoning_effort` (נמוך\u002Fבינוני\u002Fגבוה), יש לשמור עליו — ה-Responses API תומך בפרמטר זה לדגמי סדרת O.\n- **התנהגות סטרימינג**: דגמי סדרת O עשויים לאגור פלט עד לסיום ההסקה לפני שיוצרים אירועי דלתא טקסט. סטרימינג עדיין עובד, אך `response.output_text.delta` ראשוני עשוי להגיע מעכב יותר מאשר בדגמי GPT.\n- **`top_p`**: אינו נתמך בסדרת O — הסר אם קיים.\n- **שימוש בכלים**: דגמי סדרת O תומכים בכלים דרך Responses API כפי שמודלים GPT תומכים, אך איכות אורקסטרציית קריאות כלים משתנה לפי דגם.\n\n**פעולה — ייעוץ מודל יזום**: במהלך שלב הסריקה, בדוק לאיזה דגם האפליקציה מיועדת (שמות פריסה, משתני סביבת עבודה, קונפיגורציה). אם הדגם מקדים ל-`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 (חפש `base_url` המכוון ל-`models.github.ai` או `models.inference.ai.azure.com`), **הסר אותו לגמרי** במהלך ההגירה. ה-Responses API דורש Azure OpenAI, OpenAI או נקודת קצה מקומית תואמת (למשל Ollama עם תמיכה ב-Responses).\n\nפעולה במהלך הסריקה:\n- סמן כל נתיב קוד לדגמי GitHub להסרה.\n\n---\n\n## הגירת מסגרת עבודה\n\nאפליקציות רבות משתמשות במסגרת עבודה ברמת גבוה מעל OpenAI. בהגירת אלו, ה-API של המסגרת משתנה — לא רק הקריאות התחתונות ל-OpenAI.\n\n### מסגרת סוכנים של מיקרוסופט (MAF)\n\n**בדוק תחילה את גרסת MAF שלך** — ההגירה תלויה אם אתה על MAF 1.0.0+ או ביטא\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 (הוצאות ביטא\u002FRC)\n\nב-MAF לפני 1.0.0, `OpenAIChatClient` השתמש ב-Chat Completions. שדרג ל-`agent-framework-openai>=1.0.0` שבו `OpenAIChatClient` כבר משתמש ב-Responses API כברירת מחדל.\n\nאין שינוי נוסף דרוש — ה-API של `Agent` והכלים נשארים זהים.\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 הוא נושא צד-שרת.** הגר את הבקאנד בפייתון שלך; חוזה HTTP בצד הפרונטאנד צריך להישאר ללא שינוי אלא אם הבקאנד שלך הוא מעקף דק — במקרה זה שקול לאמץ את צורת הבקשה של Responses כדי לבטל שכבת תרגום. אם הפרונטאנד קורא ל-OpenAI ישירות עם מפתח בצד לקוח, העבר את הקריאות לבקאנד קודם.\n\n### הפסקת שימוש ב-`@microsoft\u002Fai-chat-protocol`\n\nחבילת ה-npm `@microsoft\u002Fai-chat-protocol` הוסרה ויש להחליפה ב-[`ndjson-readablestream`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fndjson-readablestream). אם נתקל בה בפרונטאנד:\n\n1. החלף את תגית סקריפט 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. הסר יצירת מופע `AIChatProtocolClient` (`new ChatProtocol.AIChatProtocolClient(\"\u002Fchat\")`).\n3. החלף את `client.getStreamedCompletion(messages)` בקריאה ישירה ל-`fetch()` לנקודת הקצה סטרימינג בבקאנד.\n4. החלף `for await (const response of result)` ב-`for await (const chunk of readNDJSONStream(response.body))`.\n5. עדכן גישה למאפיינים מ-`response.delta.content` \u002F `response.error` ל-`chunk.delta.content` \u002F `chunk.error`.\n\n---\n\n## מטרות\n\n- למנות את כל אתרי הקריאה בפייתון המשתמשים ב-Chat Completions או ב-Completions ישן נגד Azure OpenAI.\n- להציע תוכנית והסדר הגירה עבור בסיס הקוד בפייתון.\n- לבצע שינויים מינימליים ובטוחים לעבור ל-Responses API.\n- לעדכן קוראים לצריכת סכמת הפלט של Responses; ללא עטיפות תאימות אחורית.\n- להריץ בדיקות\u002Fלינטים; לתקן תקלות משניות שנגרמו מההגירה.\n- להכין קבוצות שינויים קטנות וכנות לסקירה ולספק סיכום סופי עם הבדלים (לא לבצע commit).\n\n---\n\n## כללי שמירת גבולות\n\n- לשנות רק קבצים בתוך סביבת ה-git. לעולם אל תכתוב מחוץ לה.\n- אל תשמור התאמות תאימות לאחור; הגר את הקוד לצורת ה-API החדשה.\n- אל תשאיר הערות מעבר\u002Fמעבר או קבצי גיבוי.\n- שמור על סמנטיקת סטרימינג אם הייתה בשימוש קודם; אחרת השתמש ללא סטרימינג.\n- בקש אישור לפני הרצת פקודות או קריאות רשת אם במצב אישורים.\n- אל תריץ `git add`\u002F`git commit`\u002F`git push`; הפק רק שינויים בעץ העבודה.\n\n---\n\n## שלב 0: הגירת לקוח Azure OpenAI (דרישה מוקדמת)\n\nאם בסיס הקוד משתמש בבנאי `AzureOpenAI` או `AsyncAzureOpenAI`, הגר תחילה לבנאי הסטנדרטי `OpenAI` \u002F `AsyncOpenAI`. בנאים ייחודיים ל-Azure אינם נתמכים ב-`openai>=1.108.1`.\n\n### למה נקודת קצה v1?\n\nנקודת הקצה החדשה `\u002Fopenai\u002Fv1` משתמשת בלקוח הסטנדרטי `OpenAI()` במקום `AzureOpenAI()`, אינה דורשת פרמטר `api_version`, ופועלת זהה ב-OpenAI וב-Azure OpenAI. קוד הלקוח זהה והכין לעתיד — ללא צורך בניהול גרסאות.\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` מבניית הלקוח.\n- הסר משתני סביבה `AZURE_OPENAI_VERSION` \u002F `AZURE_OPENAI_API_VERSION` מקובץ `.env`, הגדרות אפליקציה וקבצי Bicep\u002Fתשתית.\n- שנה את `AZURE_OPENAI_CLIENT_ID` ל־`AZURE_CLIENT_ID` בקובץ `.env`, הגדרות אפליקציה, Bicep\u002Fתשתית ודגמי בדיקה (הסכם סטנדרטי של 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לדוגמאות קוד של פעולת הלקוח (סינכרוני, אסינכרוני, EntraID, מפתח API, מולטי טננט), ראה [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## שלב 1: זיהוי אתרי קריאה ישנים\n\nהפעל את הסקריפט [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 (חייב להסיר — API לתגובות לא נתמך)\nrg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"\n\n# דפוסי מורשת ברמת התשתית (חייבים לעדכן)\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- **לקוח Chat Completions**: `client.chat.completions.create` → `client.responses.create(...)`.\n\n- **קונסטרוקטורים של לקוח Azure**: `AzureOpenAI(...)` → `OpenAI(base_url=..., api_key=...)`.\n- **כלים**: המרת הגדרות כלי-קריאה לפונקציה מפורמט מקונן (`{\"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()`**: העזר הזה עדיין מייצר את הפורמט המקונן הישן ואינו **תואם** ל-`responses.create()`. החלף בהגדרות כלי ידניות או עטיפה שמשטיחה.\n- **רב-סיבובים**: שמור היסטוריית שיחה באפליקציה; העבר סיבובים קודמים כפריטי `input`.\n- **עיצוב**: החלף את `response_format` של Chat בשכבת על ב-Responses עם `text.format`. צורה קאנונית: `text={\"format\": {\"type\": \"json_schema\", \"name\": \"Output\", \"strict\": True, \"schema\": {...}}}`.\n- **פריטי תוכן**: החלף `content[].type: \"text\"` של Chat ל-`content[].type: \"input_text\"` ב-Responses עבור תורות של משתמש\u002Fמערכת.\n- **פריטי תוכן תמונה**: החלף `content[].type: \"image_url\"` של Chat ל-`content[].type: \"input_image\"` ב-Responses. השדה `image_url` משתנה מאובייקט מקונן `{\"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 גולמיות**: אם האפליקציה עושה קריאה ישירה ל-Azure OpenAI REST API (דרך `requests`, `httpx`, וכו') באמצעות `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions?api-version=...`, המיר ל-`\u002Fopenai\u002Fv1\u002Fresponses`. גוף הבקשה משתנה: `messages` → `input`, הוסף `max_output_tokens` ו-`store: false`, הסר פרמטר שאילתה `api-version`. גוף התגובה משתנה: `choices[0].message.content` → `output[0].content[0].text` (שים לב: `output_text` הוא מאפיין נוחות SDK שאינו קיים ב-JSON גולמי).\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\"` ב-Responses עבור תורות מערכת\u002Fמשתמש.\n- **פריטי תוכן תמונה**: החלף `content[].type: \"image_url\"` של Chat ל-`content[].type: \"input_image\"` ב-Responses. שטח את השדה `image_url` מ-`{\"image_url\": {\"url\": \"...\"}}` ל-`{\"image_url\": \"...\"}` (מחרוזת פשוטה — כתובת 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להגירת תשתית בדיקות (מוקים, תמונות מצב, ואישורים), ראה [test-migration.md](.\u002Freferences\u002Ftest-migration.md).\n\nלפתרון תקלות וטעויות, ראה [troubleshooting.md](.\u002Freferences\u002Ftroubleshooting.md).\n\n---\n\n## שמירת מידע ומצב\n\n- קבע `store: false` בכל בקשות Responses.\n- אל תסתמך על מזהי הודעות קודמות או הקשר שנשמר בשרת; שמור מצב מנוהל-לקוח וצמצם מטא-דאטה.\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 הוסרו.\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` או סכמת הפלט של 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` הוסר מקבצי הסביבה והתשתית.\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` — מוקים ספציפיים ל-Azure להסינון הוסרו.\n- [ ] מוקים משתמשים ב-`kwargs.get(\"input\")` ולא ב-`kwargs.get(\"messages\")`.\n- [ ] קבצי snapshot \u002F golden מעודכנים לצורת הזרימה של Responses (ללא `choices[0]`, `function_call`, `logprobs` וכו').\n- [ ] `pytest` עובר ללא כשלונות לאחר כל עדכוני הבדיקות.\n\n### שערים התנהגותיים (בדיקה ידנית או דרך מסגרת בדיקות)\n\n- [ ] **השלמה בסיסית**: `responses.create` שאינה זורמת מחזירה `output_text` שאינו ריק.\n- [ ] **עקיבות בזרימה**: אם הקוד המקורי השתמש בזרימה, הקוד שהוגר זורם ומפיק אירועים `response.output_text.delta` עם דלתא לא ריקה.\n- [ ] **פלט מובנה**: אם משתמשים ב-`text.format` עם `json_schema`, `json.loads(resp.output_text)` מצליח ותואם לסכמה.\n- [ ] **לולאת קריאה לכלים**: אם משתמשים בכלים, המודל מוציא קריאות כלים, האפליקציה מבצעת אותן, והבקשה הבאה מחזירה פלט סופי `output_text` (ללא לולאה אינסופית).\n- [ ] **עקיבות אסינכרונית**: אם השתמשו ב-`AsyncAzureOpenAI`, מקביל ב-`AsyncOpenAI` עובד עם `await`.\n- [ ] **שיעור שגיאות**: אין שגיאות חדשות מסוג 400\u002F401\u002F404 בהשוואה לקו הבסיס לפני ההגירה.\n\n### תוצרי עבודה\n\n- התקציר כולל קבצים שנערכו, מונים לפני\u002Fאחרי של אתרי קריאה מורשת, ושלבים הבאים.\n- השינויים הם רק עריכות בעץ העבודה (ללא commits).\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- [הגירת בדיקות — מוקים, תמונות מצב, אישורים](.\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- [מסמכי Azure OpenAI Responses API](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fhow-to\u002Fresponses)\n- [מחזור חיים של גרסת Azure OpenAI API](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fapi-version-lifecycle?view=foundry-classic&tabs=python#api-evolution)\n- [OpenAI Responses API reference](https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fapi-reference\u002Fresponses)\n\n---\n\n\u003C!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**כתב ויתור**:\nמסמך זה תורגם באמצעות שירות תרגום אוטומטי [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\u002Fhe\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\u002Fhe\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","参考文档",31211,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fhe\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",8031,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fhe\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Freferences\u002Ftest-migration.md",{"path":59,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":60,"sourceHtmlUrl":61},"references\u002Ftroubleshooting.md",18140,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fhe\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]]