[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M699C8C7E1CTF4YSCEMD7BXZ":3,"skill-same:01M699C8C7E1CTF4YSCEMD7BXZ":66},{"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},"01M699C8C7E1CTF4YSCEMD7BXZ","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\u002Fel\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 στην Azure OpenAI\n- Προετοιμάσει κώδικα Python για μοντέλα GPT-5 ή νεότερα που απαιτούν Responses στο Azure\n- Μεταβεί από `AzureOpenAI`\u002F`AsyncAzureOpenAI` σε τυπικό `OpenAI`\u002F`AsyncOpenAI` πελάτη με το v1 endpoint\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 live και δείχνει πίνακα συμβατότητας — ποια μοντέλα υποστηρίζουν 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 με `strict: true`.\n> - **Ορχήστρωση εργαλείων**: Το GPT-5+ οργανώνει κλήσεις εργαλείων ως μέρος εσωτερικού reasoning. Τα παλιά μοντέλα στο Responses λειτουργούν αλλά χωρίς αυτήν την ενσωμάτωση.\n> - **Περιορισμοί θερμοκρασίας**: Κατά τη μετεγκατάσταση σε `gpt-5`, η θερμοκρασία πρέπει να παραληφθεί ή να οριστεί σε `1`. Τα παλιά μοντέλα δεν έχουν τέτοιο περιορισμό.\n\n### Μοντέλα λογικής σειράς O (o1, o3-mini, o3, o4-mini)\n\nΤα μοντέλα O-series έχουν μοναδικούς περιορισμούς παραμέτρων. Κατά τη μετεγκατάσταση εφαρμογών που στοχεύουν μοντέλα O-series:\n\n- **`temperature`**: Πρέπει να είναι `1` (ή να παραληφθεί). Τα μοντέλα O-series δεν δέχονται άλλες τιμές.\n- **`max_completion_tokens` → `max_output_tokens`**: Οι εφαρμογές που χρησιμοποιούν το Azure-ειδικό `max_completion_tokens` πρέπει να περάσουν σε `max_output_tokens`. Θέστε υψηλές τιμές (4096+) γιατί οι tokens του reasoning υπολογίζονται στο όριο.\n- **`reasoning_effort`**: Αν η εφαρμογή χρησιμοποιεί `reasoning_effort` (χαμηλή\u002Fμεσαία\u002Fυψηλή), κρατήστε το — το Responses API υποστηρίζει αυτή την παράμετρο για μοντέλα o-series.\n- **Συμπεριφορά ροής (streaming)**: Τα μοντέλα O-series μπορεί να αποθηκεύουν την έξοδο μέχρι να ολοκληρωθεί το reasoning πριν εκπέμψουν συμβάντα κειμένου delta. Το streaming λειτουργεί ακόμα, αλλά το πρώτο `response.output_text.delta` μπορεί να φτάσει με καθυστέρηση μεγαλύτερη από τα μοντέλα GPT.\n- **`top_p`**: Δεν υποστηρίζεται στα o-series — αφαιρέστε το αν υπάρχει.\n- **Χρήση εργαλείων**: Τα μοντέλα O-series υποστηρίζουν εργαλεία μέσω Responses API όπως και τα μοντέλα GPT, αλλά η ποιότητα ορχήστρωσης κλήσεων εργαλείων ποικίλλει ανάλογα με το μοντέλο.\n\n**Ενέργεια — προληπτική συμβουλή μοντέλου**: Κατά τη φάση ανίχνευσης, ελέγξτε ποιο μοντέλο στοχεύει η εφαρμογή (ονόματα ανάπτυξης, μεταβλητές περιβάλλοντος, ρυθμίσεις). Αν το μοντέλο προηγήθηκε του `gpt-4.1` (όχι gpt-4.1+), ενημερώστε προληπτικά τον χρήστη:\n- Η μετεγκατάσταση θα λειτουργήσει για βασικό κείμενο, chat, streaming και εργαλεία στο τρέχον μοντέλο τους.\n- Νεότερα μοντέλα (`gpt-5.1`, `gpt-5.2`) προσφέρουν καλύτερη ορχήστρωση εργαλείων, επιβολή δομημένης εξόδου, reasoning και διαθεσιμότητα σε διάφορες περιοχές.\n- Πρέπει να εξετάσουν την αναβάθμιση της ανάπτυξής τους όταν είναι έτοιμοι — δεν μπλοκάρει τη μετεγκατάσταση.\n\nΜην μπλοκάρετε ή αρνείστε τη μετεγκατάσταση βάσει έκδοσης μοντέλου. Η συμβουλή είναι ενημερωτική.\n\n### Τα GitHub Models δεν υποστηρίζουν το Responses API\n\n> **Τα GitHub Models (`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 ή συμβατό τοπικό endpoint (π.χ., Ollama με υποστήριξη Responses).\n\nΕνέργεια κατά τη σάρωση:\n- Επισημάνετε οποιεσδήποτε διαδρομές κώδικα GitHub Models για αφαίρεση.\n\n---\n\n## Μετεγκατάσταση Πλαισίου Εργασίας\n\nΠολλές εφαρμογές χρησιμοποιούν ανώτερα πλαίσια πάνω από OpenAI. Κατά τη μετεγκατάσταση αυτών, αλλάζει το ίδιο το API του πλαισίου — όχι μόνο οι κλήσεις OpenAI από κάτω.\n\n### Microsoft Agent Framework (MAF)\n\n**Ελέγξτε πρώτα την έκδοση MAF** — η μετεγκατάσταση εξαρτάται αν είστε σε MAF 1.0.0+ ή προ-1.0.0 beta\u002Frc.\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Δεν χρειάζονται άλλες αλλαγές — τα APIs του `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## Οδηγίες Μετεγκατάστασης Frontend\n\n> **Το Responses API είναι θέμα πλευράς διακομιστή.** Μεταφέρετε το backend Python σας· η σύμβαση HTTP του frontend πρέπει να παραμείνει αμετάβλητη εκτός αν το backend είναι λεπτό πέρασμα — τότε εξετάστε την υιοθέτηση της μορφής αιτήματος Responses για να εξαλειφθεί ένα επίπεδο μετάφρασης. Αν το frontend καλεί το OpenAI απευθείας με κλειδί client-side, μετακινήστε αυτές τις κλήσεις πρώτα σε backend.\n\n### Απόσυρση `@microsoft\u002Fai-chat-protocol`\n\nΤο npm πακέτο `@microsoft\u002Fai-chat-protocol` είναι αποσυρμένο και πρέπει να αντικατασταθεί με το [`ndjson-readablestream`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fndjson-readablestream). Αν το συναντήσετε σε frontend:\n\n1. Αντικαταστήστε το CDN script tag:\n   ```html\n   \u003C!-- Before -->\n   \u003Cscript src=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002F@microsoft\u002Fai-chat-protocol@...\u002Fdist\u002Fiife\u002Findex.js\">\u003C\u002Fscript>\n   \u003C!-- After -->\n   \u003Cscript src=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002Fndjson-readablestream@1.0.7\u002Fdist\u002Fndjson-readablestream.umd.js\">\u003C\u002Fscript>\n   ```\n2. Αφαιρέστε τη δημιουργία `AIChatProtocolClient` (`new ChatProtocol.AIChatProtocolClient(\"\u002Fchat\")`).\n3. Αντικαταστήστε το `client.getStreamedCompletion(messages)` με άμεση κλήση `fetch()` στο backend streaming endpoint.\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- Καταγράψτε όλες τις κλήσεις Python που χρησιμοποιούν Chat Completions ή legacy Completions στην Azure OpenAI.\n- Προτείνετε σχέδιο και αλληλουχία μετεγκατάστασης για τον κώδικα Python.\n- Εφαρμόστε ασφαλείς, ελάχιστες αλλαγές για να γίνει μετάβαση στο Responses API.\n- Ενημερώστε τους καλούντες να καταναλώνουν το σχήμα εξόδου Responses· χωρίς wrappers συμβατότητας.\n- Εκτελέστε δοκιμές και linters· διορθώστε μικρά σφάλματα από τη μετεγκατάσταση.\n- Προετοιμάστε μικρές σειρές αλλαγών προς αναθεώρηση και δώστε τελική περίληψη με διαφορές (μην κάνετε commit).\n\n---\n\n## Κανόνες προστασίας\n\n- Τροποποιήστε μόνο αρχεία μέσα στον χώρο εργασίας git. Ποτέ έξω από αυτόν.\n- Μην διατηρείτε shim συμβατότητας προς τα πίσω· μεταφέρετε τον κώδικα στην νέα μορφή API.\n- Μην αφήνετε σχόλια προσωρινής χρήσης ή αρχεία backup.\n- Διατηρήστε τις ροές (streaming) αν χρησιμοποιούνταν· αλλιώς χρησιμοποιήστε μη-ροή.\n- Ζητήστε έγκριση πριν εκτελέσετε εντολές ή δικτυακές κλήσεις αν βρίσκεστε σε λειτουργία έγκρισης.\n- Μην τρέχετε `git add`\u002F`git commit`\u002F`git push`; παράγετε μόνο επεξεργασίες δέντρου εργασίας.\n\n---\n\n## Βήμα 0: Μετεγκατάσταση πελάτη Azure OpenAI (προαπαιτούμενο)\n\nΑν η βάση κώδικα χρησιμοποιεί τους constructors `AzureOpenAI` ή `AsyncAzureOpenAI`, μεταβείτε πρώτα στους τυπικούς constructors `OpenAI` \u002F `AsyncOpenAI`. Οι Azure-ειδικοί constructors έχουν αποσυρθεί στο `openai>=1.108.1`.\n\n### Γιατί το endpoint v1 API;\n\nΤο νέο endpoint `\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`, ρυθμίσεις app και αρχεία Bicep\u002Finfra.\n- Μετονομάστε `AZURE_OPENAI_CLIENT_ID` → `AZURE_CLIENT_ID` σε `.env`, ρυθμίσεις app, Bicep\u002Finfra και fixtures τεστ (τυπική σύμβαση Azure Identity SDK).\n- Βεβαιωθείτε ότι έχετε `openai>=1.108.1` στο `requirements.txt` ή `pyproject.toml`.\n\n### Μετεγκατάσταση μεταβλητών περιβάλλοντος\n\n| Παλιά env var | Ενέργεια | Σημειώσεις |\n|-------------|--------|-------|\n| `AZURE_OPENAI_VERSION` | **Αφαιρέστε** | Δεν χρειάζεται `api_version` με το endpoint 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 key, πολλαπλοί tenants), δείτε [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Βήμα 1: Εντοπισμός Legacy Call Sites\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()`. Αντικαταστήστε με χειροκίνητους ορισμούς εργαλείων ή έναν wrapper για επίπεδη μορφή.\n- **Πολλαπλούς γύρους**: διατηρήστε το ιστορικό συνομιλίας στην εφαρμογή· περάστε προηγούμενους γύρους μέσω στοιχείων `input`.\n- **Μορφοποίηση**: αντικαταστήστε το επίπεδο κορυφής `response_format` του Chat με `text.format` στις Responses. Κανονική μορφή: `text={\"format\": {\"type\": \"json_schema\", \"name\": \"Output\", \"strict\": True, \"schema\": {...}}}`.\n- **Στοιχεία περιεχομένου**: αντικαταστήστε το Chat `content[].type: \"text\"` με Responses `content[].type: \"input_text\"` για στροφές χρήστη\u002Fσυστήματος.\n- **Στοιχεία περιεχομένου εικόνας**: αντικαταστήστε το Chat `content[].type: \"image_url\"` με Responses `content[].type: \"input_image\"`. Το πεδίο `image_url` αλλάζει από εμφωλευμένο αντικείμενο `{\"url\": \"...\"}` σε απλή συμβολοσειρά. Δείτε το cheat sheet για παραδείγματα πριν\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`, αφαιρέστε το query param `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 endpoint αλλαγές από `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions` σε `\u002Fopenai\u002Fv1\u002Fresponses`.\n- **Πεδία**: `messages` → `input`, `max_tokens` → `max_output_tokens`. `temperature` παραμένει ίση.\n- **Μορφοποίηση**: `response_format` → `text.format` με κατάλληλο αντικείμενο.\n- **Στοιχεία περιεχομένου**: Αντικαταστήστε το Chat `content[].type: \"text\"` με Responses `content[].type: \"input_text\"` για στροφές συστήματος\u002Fχρήστη.\n- **Στοιχεία περιεχομένου εικόνας**: Αντικαταστήστε το Chat `content[].type: \"image_url\"` με Responses `content[].type: \"input_image\"`. Απλοποιήστε το πεδίο `image_url` από `{\"image_url\": {\"url\": \"...\"}}` σε `{\"image_url\": \"...\"}` (απλή συμβολοσειρά — είτε HTTPS URL είτε 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 function-calling | `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- Μην βασίζεστε σε προηγούμενα αναγνωριστικά μηνυμάτων ή συμφραζόμενα αποθηκευμένα στον διακομιστή· κρατήστε κατάσταση διαχειριζόμενη από τον πελάτη και ελαχιστοποιήστε τα μεταδεδομένα.\n\n---\n\n## Κριτήρια Αποδοχής\n\n### Διαύλους επιπέδου κώδικα (όλοι πρέπει να περάσουν)\n\n- [ ] Μηδενικές εμφανίσεις για `rg \"chat\\.completions\\.create|ChatCompletion\\.create|Completion\\.create\"` σε αρχεία μετά τη μεταφορά.\n- [ ] Μηδενικές εμφανίσεις για `rg \"AzureOpenAI\\(|AsyncAzureOpenAI\\(\"` — όλοι οι κατασκευαστές χρησιμοποιούν `OpenAI`\u002F`AsyncOpenAI` με το v1 endpoint.\n- [ ] Μηδενικές εμφανίσεις για `rg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"` — οι διαδρομές κώδικα GitHub Models αφαιρέθηκαν.\n- [ ] Μηδενικές εμφανίσεις για `rg \"OpenAIChatCompletionClient\"` — o κώδικας MAF 1.0.0+ χρησιμοποιεί `OpenAIChatClient` (που χρησιμοποιεί Responses API). Σε pre-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` — οι assertions ενημερώθηκαν να ελέγχουν `isinstance(client, AsyncOpenAI)` ή `base_url`.\n- [ ] Μηδενικές εμφανίσεις για `rg \"prompt_filter_results|content_filter_results\" tests\u002F` — τα Azure-specific φίλτρα mocks αφαιρέθηκαν.\n- [ ] Τα mock fixtures χρησιμοποιούν `kwargs.get(\"input\")` όχι `kwargs.get(\"messages\")`.\n- [ ] Snapshot \u002F golden αρχεία ανανεώθηκαν στο σχήμα ροής Responses (χωρίς `choices[0]`, `function_call`, `logprobs`, κλπ.).\n- [ ] `pytest` περνάει χωρίς αποτυχίες μετά τις ενημερώσεις όλων των δοκιμών.\n\n### Διαύλους συμπεριφοράς (επαληθεύστε χειροκίνητα ή με test harness)\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- [ ] **Ισοτιμία Async**: αν χρησιμοποιήθηκε `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- [Μεταφορά Δοκιμών — 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- [Τεκμηρίωση 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 αναφορά](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 -->","# Μεταφορά Εφαρμογών 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 στην Azure OpenAI\n- Προετοιμάσει κώδικα Python για μοντέλα GPT-5 ή νεότερα που απαιτούν Responses στο Azure\n- Μεταβεί από `AzureOpenAI`\u002F`AsyncAzureOpenAI` σε τυπικό `OpenAI`\u002F`AsyncOpenAI` πελάτη με το v1 endpoint\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 live και δείχνει πίνακα συμβατότητας — ποια μοντέλα υποστηρίζουν 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 με `strict: true`.\n> - **Ορχήστρωση εργαλείων**: Το GPT-5+ οργανώνει κλήσεις εργαλείων ως μέρος εσωτερικού reasoning. Τα παλιά μοντέλα στο Responses λειτουργούν αλλά χωρίς αυτήν την ενσωμάτωση.\n> - **Περιορισμοί θερμοκρασίας**: Κατά τη μετεγκατάσταση σε `gpt-5`, η θερμοκρασία πρέπει να παραληφθεί ή να οριστεί σε `1`. Τα παλιά μοντέλα δεν έχουν τέτοιο περιορισμό.\n\n### Μοντέλα λογικής σειράς O (o1, o3-mini, o3, o4-mini)\n\nΤα μοντέλα O-series έχουν μοναδικούς περιορισμούς παραμέτρων. Κατά τη μετεγκατάσταση εφαρμογών που στοχεύουν μοντέλα O-series:\n\n- **`temperature`**: Πρέπει να είναι `1` (ή να παραληφθεί). Τα μοντέλα O-series δεν δέχονται άλλες τιμές.\n- **`max_completion_tokens` → `max_output_tokens`**: Οι εφαρμογές που χρησιμοποιούν το Azure-ειδικό `max_completion_tokens` πρέπει να περάσουν σε `max_output_tokens`. Θέστε υψηλές τιμές (4096+) γιατί οι tokens του reasoning υπολογίζονται στο όριο.\n- **`reasoning_effort`**: Αν η εφαρμογή χρησιμοποιεί `reasoning_effort` (χαμηλή\u002Fμεσαία\u002Fυψηλή), κρατήστε το — το Responses API υποστηρίζει αυτή την παράμετρο για μοντέλα o-series.\n- **Συμπεριφορά ροής (streaming)**: Τα μοντέλα O-series μπορεί να αποθηκεύουν την έξοδο μέχρι να ολοκληρωθεί το reasoning πριν εκπέμψουν συμβάντα κειμένου delta. Το streaming λειτουργεί ακόμα, αλλά το πρώτο `response.output_text.delta` μπορεί να φτάσει με καθυστέρηση μεγαλύτερη από τα μοντέλα GPT.\n- **`top_p`**: Δεν υποστηρίζεται στα o-series — αφαιρέστε το αν υπάρχει.\n- **Χρήση εργαλείων**: Τα μοντέλα O-series υποστηρίζουν εργαλεία μέσω Responses API όπως και τα μοντέλα GPT, αλλά η ποιότητα ορχήστρωσης κλήσεων εργαλείων ποικίλλει ανάλογα με το μοντέλο.\n\n**Ενέργεια — προληπτική συμβουλή μοντέλου**: Κατά τη φάση ανίχνευσης, ελέγξτε ποιο μοντέλο στοχεύει η εφαρμογή (ονόματα ανάπτυξης, μεταβλητές περιβάλλοντος, ρυθμίσεις). Αν το μοντέλο προηγήθηκε του `gpt-4.1` (όχι gpt-4.1+), ενημερώστε προληπτικά τον χρήστη:\n- Η μετεγκατάσταση θα λειτουργήσει για βασικό κείμενο, chat, streaming και εργαλεία στο τρέχον μοντέλο τους.\n- Νεότερα μοντέλα (`gpt-5.1`, `gpt-5.2`) προσφέρουν καλύτερη ορχήστρωση εργαλείων, επιβολή δομημένης εξόδου, reasoning και διαθεσιμότητα σε διάφορες περιοχές.\n- Πρέπει να εξετάσουν την αναβάθμιση της ανάπτυξής τους όταν είναι έτοιμοι — δεν μπλοκάρει τη μετεγκατάσταση.\n\nΜην μπλοκάρετε ή αρνείστε τη μετεγκατάσταση βάσει έκδοσης μοντέλου. Η συμβουλή είναι ενημερωτική.\n\n### Τα GitHub Models δεν υποστηρίζουν το Responses API\n\n> **Τα GitHub Models (`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 ή συμβατό τοπικό endpoint (π.χ., Ollama με υποστήριξη Responses).\n\nΕνέργεια κατά τη σάρωση:\n- Επισημάνετε οποιεσδήποτε διαδρομές κώδικα GitHub Models για αφαίρεση.\n\n---\n\n## Μετεγκατάσταση Πλαισίου Εργασίας\n\nΠολλές εφαρμογές χρησιμοποιούν ανώτερα πλαίσια πάνω από OpenAI. Κατά τη μετεγκατάσταση αυτών, αλλάζει το ίδιο το API του πλαισίου — όχι μόνο οι κλήσεις OpenAI από κάτω.\n\n### Microsoft Agent Framework (MAF)\n\n**Ελέγξτε πρώτα την έκδοση MAF** — η μετεγκατάσταση εξαρτάται αν είστε σε MAF 1.0.0+ ή προ-1.0.0 beta\u002Frc.\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Δεν χρειάζονται άλλες αλλαγές — τα APIs του `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## Οδηγίες Μετεγκατάστασης Frontend\n\n> **Το Responses API είναι θέμα πλευράς διακομιστή.** Μεταφέρετε το backend Python σας· η σύμβαση HTTP του frontend πρέπει να παραμείνει αμετάβλητη εκτός αν το backend είναι λεπτό πέρασμα — τότε εξετάστε την υιοθέτηση της μορφής αιτήματος Responses για να εξαλειφθεί ένα επίπεδο μετάφρασης. Αν το frontend καλεί το OpenAI απευθείας με κλειδί client-side, μετακινήστε αυτές τις κλήσεις πρώτα σε backend.\n\n### Απόσυρση `@microsoft\u002Fai-chat-protocol`\n\nΤο npm πακέτο `@microsoft\u002Fai-chat-protocol` είναι αποσυρμένο και πρέπει να αντικατασταθεί με το [`ndjson-readablestream`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fndjson-readablestream). Αν το συναντήσετε σε frontend:\n\n1. Αντικαταστήστε το CDN script tag:\n   ```html\n   \u003C!-- Before -->\n   \u003Cscript src=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002F@microsoft\u002Fai-chat-protocol@...\u002Fdist\u002Fiife\u002Findex.js\">\u003C\u002Fscript>\n   \u003C!-- After -->\n   \u003Cscript src=\"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002Fndjson-readablestream@1.0.7\u002Fdist\u002Fndjson-readablestream.umd.js\">\u003C\u002Fscript>\n   ```\n2. Αφαιρέστε τη δημιουργία `AIChatProtocolClient` (`new ChatProtocol.AIChatProtocolClient(\"\u002Fchat\")`).\n3. Αντικαταστήστε το `client.getStreamedCompletion(messages)` με άμεση κλήση `fetch()` στο backend streaming endpoint.\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- Καταγράψτε όλες τις κλήσεις Python που χρησιμοποιούν Chat Completions ή legacy Completions στην Azure OpenAI.\n- Προτείνετε σχέδιο και αλληλουχία μετεγκατάστασης για τον κώδικα Python.\n- Εφαρμόστε ασφαλείς, ελάχιστες αλλαγές για να γίνει μετάβαση στο Responses API.\n- Ενημερώστε τους καλούντες να καταναλώνουν το σχήμα εξόδου Responses· χωρίς wrappers συμβατότητας.\n- Εκτελέστε δοκιμές και linters· διορθώστε μικρά σφάλματα από τη μετεγκατάσταση.\n- Προετοιμάστε μικρές σειρές αλλαγών προς αναθεώρηση και δώστε τελική περίληψη με διαφορές (μην κάνετε commit).\n\n---\n\n## Κανόνες προστασίας\n\n- Τροποποιήστε μόνο αρχεία μέσα στον χώρο εργασίας git. Ποτέ έξω από αυτόν.\n- Μην διατηρείτε shim συμβατότητας προς τα πίσω· μεταφέρετε τον κώδικα στην νέα μορφή API.\n- Μην αφήνετε σχόλια προσωρινής χρήσης ή αρχεία backup.\n- Διατηρήστε τις ροές (streaming) αν χρησιμοποιούνταν· αλλιώς χρησιμοποιήστε μη-ροή.\n- Ζητήστε έγκριση πριν εκτελέσετε εντολές ή δικτυακές κλήσεις αν βρίσκεστε σε λειτουργία έγκρισης.\n- Μην τρέχετε `git add`\u002F`git commit`\u002F`git push`; παράγετε μόνο επεξεργασίες δέντρου εργασίας.\n\n---\n\n## Βήμα 0: Μετεγκατάσταση πελάτη Azure OpenAI (προαπαιτούμενο)\n\nΑν η βάση κώδικα χρησιμοποιεί τους constructors `AzureOpenAI` ή `AsyncAzureOpenAI`, μεταβείτε πρώτα στους τυπικούς constructors `OpenAI` \u002F `AsyncOpenAI`. Οι Azure-ειδικοί constructors έχουν αποσυρθεί στο `openai>=1.108.1`.\n\n### Γιατί το endpoint v1 API;\n\nΤο νέο endpoint `\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`, ρυθμίσεις app και αρχεία Bicep\u002Finfra.\n- Μετονομάστε `AZURE_OPENAI_CLIENT_ID` → `AZURE_CLIENT_ID` σε `.env`, ρυθμίσεις app, Bicep\u002Finfra και fixtures τεστ (τυπική σύμβαση Azure Identity SDK).\n- Βεβαιωθείτε ότι έχετε `openai>=1.108.1` στο `requirements.txt` ή `pyproject.toml`.\n\n### Μετεγκατάσταση μεταβλητών περιβάλλοντος\n\n| Παλιά env var | Ενέργεια | Σημειώσεις |\n|-------------|--------|-------|\n| `AZURE_OPENAI_VERSION` | **Αφαιρέστε** | Δεν χρειάζεται `api_version` με το endpoint 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 key, πολλαπλοί tenants), δείτε [cheat-sheet.md](.\u002Freferences\u002Fcheat-sheet.md).\n\n---\n\n## Βήμα 1: Εντοπισμός Legacy Call Sites\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()`. Αντικαταστήστε με χειροκίνητους ορισμούς εργαλείων ή έναν wrapper για επίπεδη μορφή.\n- **Πολλαπλούς γύρους**: διατηρήστε το ιστορικό συνομιλίας στην εφαρμογή· περάστε προηγούμενους γύρους μέσω στοιχείων `input`.\n- **Μορφοποίηση**: αντικαταστήστε το επίπεδο κορυφής `response_format` του Chat με `text.format` στις Responses. Κανονική μορφή: `text={\"format\": {\"type\": \"json_schema\", \"name\": \"Output\", \"strict\": True, \"schema\": {...}}}`.\n- **Στοιχεία περιεχομένου**: αντικαταστήστε το Chat `content[].type: \"text\"` με Responses `content[].type: \"input_text\"` για στροφές χρήστη\u002Fσυστήματος.\n- **Στοιχεία περιεχομένου εικόνας**: αντικαταστήστε το Chat `content[].type: \"image_url\"` με Responses `content[].type: \"input_image\"`. Το πεδίο `image_url` αλλάζει από εμφωλευμένο αντικείμενο `{\"url\": \"...\"}` σε απλή συμβολοσειρά. Δείτε το cheat sheet για παραδείγματα πριν\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`, αφαιρέστε το query param `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 endpoint αλλαγές από `\u002Fopenai\u002Fdeployments\u002F{name}\u002Fchat\u002Fcompletions` σε `\u002Fopenai\u002Fv1\u002Fresponses`.\n- **Πεδία**: `messages` → `input`, `max_tokens` → `max_output_tokens`. `temperature` παραμένει ίση.\n- **Μορφοποίηση**: `response_format` → `text.format` με κατάλληλο αντικείμενο.\n- **Στοιχεία περιεχομένου**: Αντικαταστήστε το Chat `content[].type: \"text\"` με Responses `content[].type: \"input_text\"` για στροφές συστήματος\u002Fχρήστη.\n- **Στοιχεία περιεχομένου εικόνας**: Αντικαταστήστε το Chat `content[].type: \"image_url\"` με Responses `content[].type: \"input_image\"`. Απλοποιήστε το πεδίο `image_url` από `{\"image_url\": {\"url\": \"...\"}}` σε `{\"image_url\": \"...\"}` (απλή συμβολοσειρά — είτε HTTPS URL είτε 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 function-calling | `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- Μην βασίζεστε σε προηγούμενα αναγνωριστικά μηνυμάτων ή συμφραζόμενα αποθηκευμένα στον διακομιστή· κρατήστε κατάσταση διαχειριζόμενη από τον πελάτη και ελαχιστοποιήστε τα μεταδεδομένα.\n\n---\n\n## Κριτήρια Αποδοχής\n\n### Διαύλους επιπέδου κώδικα (όλοι πρέπει να περάσουν)\n\n- [ ] Μηδενικές εμφανίσεις για `rg \"chat\\.completions\\.create|ChatCompletion\\.create|Completion\\.create\"` σε αρχεία μετά τη μεταφορά.\n- [ ] Μηδενικές εμφανίσεις για `rg \"AzureOpenAI\\(|AsyncAzureOpenAI\\(\"` — όλοι οι κατασκευαστές χρησιμοποιούν `OpenAI`\u002F`AsyncOpenAI` με το v1 endpoint.\n- [ ] Μηδενικές εμφανίσεις για `rg \"models\\.github\\.ai|models\\.inference\\.ai\\.azure\"` — οι διαδρομές κώδικα GitHub Models αφαιρέθηκαν.\n- [ ] Μηδενικές εμφανίσεις για `rg \"OpenAIChatCompletionClient\"` — o κώδικας MAF 1.0.0+ χρησιμοποιεί `OpenAIChatClient` (που χρησιμοποιεί Responses API). Σε pre-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` — οι assertions ενημερώθηκαν να ελέγχουν `isinstance(client, AsyncOpenAI)` ή `base_url`.\n- [ ] Μηδενικές εμφανίσεις για `rg \"prompt_filter_results|content_filter_results\" tests\u002F` — τα Azure-specific φίλτρα mocks αφαιρέθηκαν.\n- [ ] Τα mock fixtures χρησιμοποιούν `kwargs.get(\"input\")` όχι `kwargs.get(\"messages\")`.\n- [ ] Snapshot \u002F golden αρχεία ανανεώθηκαν στο σχήμα ροής Responses (χωρίς `choices[0]`, `function_call`, `logprobs`, κλπ.).\n- [ ] `pytest` περνάει χωρίς αποτυχίες μετά τις ενημερώσεις όλων των δοκιμών.\n\n### Διαύλους συμπεριφοράς (επαληθεύστε χειροκίνητα ή με test harness)\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- [ ] **Ισοτιμία Async**: αν χρησιμοποιήθηκε `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- [Μεταφορά Δοκιμών — 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- [Τεκμηρίωση 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 αναφορά](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\u002Fel\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\u002Fel\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002FSKILL.md",true,[48,54,58,62],{"path":49,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":52,"sourceHtmlUrl":53},"agents\u002Fopenai.yaml","REFERENCE","参考文档",277,"https:\u002F\u002Fgithub.com\u002Fshengdabai\u002FTony-Claude-Code-Skills\u002Fblob\u002Fmain\u002Fskills\u002F.agents\u002Fskills\u002Fgstack-retro\u002Fagents\u002Fopenai.yaml",{"path":55,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":56,"sourceHtmlUrl":57},"references\u002Fcheat-sheet.md",36509,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fel\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Freferences\u002Fcheat-sheet.md",{"path":59,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":60,"sourceHtmlUrl":61},"references\u002Ftest-migration.md",9214,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fel\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Freferences\u002Ftest-migration.md",{"path":63,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":64,"sourceHtmlUrl":65},"references\u002Ftroubleshooting.md",24382,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fai-agents-for-beginners\u002Fblob\u002Fmain\u002Ftranslations\u002Fel\u002F.agents\u002Fskills\u002Fazure-openai-to-responses\u002Freferences\u002Ftroubleshooting.md",[67,85,96,104,112,119],{"skillNo":68,"name":69,"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":70,"categories":71,"keywords":82,"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",[72,77],{"categoryNo":73,"categoryName":74,"taxonomyType":75,"taxonomyTypeDesc":76},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":78,"categoryName":79,"taxonomyType":80,"taxonomyTypeDesc":81},"01JBSEEDCAT000000000000039","教师与教育","PROFESSION","适用职业",[83,84],"testing","testing course samples",{"skillNo":86,"name":87,"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":88,"categories":89,"keywords":93,"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",[90],{"categoryNo":91,"categoryName":92,"taxonomyType":75,"taxonomyTypeDesc":76},"01JBSEEDCAT000000000000023","Skill与智能体开发",[94,8,95],"docs","microsoft docs",{"skillNo":97,"name":98,"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":99,"categories":100,"keywords":101,"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",[],[102,103],"ai agents","local ai agents",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"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",[],[111],"jupyter notebook",{"skillNo":113,"name":114,"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":115,"categories":116,"keywords":117,"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",[],[118],"deploying scalable agents",{"skillNo":120,"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":121,"categories":122,"keywords":123,"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]]