项目文件夹

文件
2026-07-13 12:59:43 +08:00

631 行
26 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "4b2cf5f5",
"metadata": {},
"outputs": [],
"source": [
"import asyncio\n",
"import json\n",
"import os\n",
"from typing import Annotated, Any, Never\n",
"\n",
"from agent_framework import (\n",
" AgentExecutor,\n",
" AgentExecutorRequest,\n",
" AgentExecutorResponse,\n",
" Message,\n",
" WorkflowBuilder,\n",
" WorkflowContext,\n",
" executor,\n",
" tool,\n",
")\n",
"from agent_framework.azure import AzureAIProjectAgentProvider\n",
"from azure.identity import AzureCliCredential\n",
"from dotenv import load_dotenv\n",
"from IPython.display import HTML, display\n",
"from pydantic import BaseModel\n",
"\n",
"print(\"✅ All imports successful!\")"
]
},
{
"cell_type": "markdown",
"id": "001c224e",
"metadata": {},
"source": [
"## 1. lépés: Pydantic modellek definiálása strukturált kimenetekhez\n",
"\n",
"Ezek a modellek definiálják azt a **sémát**, amelyet az ügynökök vissza fognak adni. A `response_format` használatával Pydantic-kel biztosított:\n",
"- ✅ Típusbiztos adatkinyerés\n",
"- ✅ Automatikus validáció\n",
"- ✅ Nincs elemzési hiba szabad szöveges válaszokból\n",
"- ✅ Egyszerű feltételes útválasztás mezők alapján\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6c2ef582",
"metadata": {},
"outputs": [],
"source": [
"class BookingCheckResult(BaseModel):\n",
" \"\"\"Result from checking hotel availability at a destination.\"\"\"\n",
"\n",
" destination: str\n",
" has_availability: bool\n",
" message: str\n",
"\n",
"\n",
"class AlternativeResult(BaseModel):\n",
" \"\"\"Suggested alternative destination when no rooms available.\"\"\"\n",
"\n",
" alternative_destination: str\n",
" reason: str\n",
"\n",
"\n",
"class BookingConfirmation(BaseModel):\n",
" \"\"\"Booking suggestion when rooms are available.\"\"\"\n",
"\n",
" destination: str\n",
" action: str\n",
" message: str\n",
"\n",
"\n",
"print(\"✅ Pydantic models defined:\")\n",
"print(\" - BookingCheckResult (availability check)\")\n",
"print(\" - AlternativeResult (alternative suggestion)\")\n",
"print(\" - BookingConfirmation (booking confirmation)\")"
]
},
{
"cell_type": "markdown",
"id": "48423ecc",
"metadata": {},
"source": [
"## 2. lépés: A szállodai foglalási eszköz létrehozása\n",
"\n",
"Ezt az eszközt fogja hívni az **availability_agent**, hogy ellenőrizze a szobák rendelkezésre állását. Az `@ai_function` dekorátort használjuk, hogy:\n",
"- Egy Python függvényt mesterséges intelligencia által hívható eszközzé alakítsunk\n",
"- Automatikusan generáljon JSON sémát a LLM számára\n",
"- Kezelje a paraméterellenőrzést\n",
"- Engedélyezze az automatikus meghívást az ügynökök által\n",
"\n",
"Ehhez a demonstrációhoz:\n",
"- **Stockholm, Seattle, Tokió, London, Amszterdam** → Van szabad szoba ✅\n",
"- **Minden más város** → Nincs szoba ❌\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "aad7e7ec",
"metadata": {},
"outputs": [],
"source": [
"@tool(description=\"Check hotel room availability for a destination city\")\n",
"def hotel_booking(destination: Annotated[str, \"The destination city to check for hotel rooms\"]) -> str:\n",
" \"\"\"\n",
" Simulates checking hotel room availability.\n",
"\n",
" Returns JSON string with availability status.\n",
" \"\"\"\n",
" display(\n",
" HTML(f\"\"\"\n",
" <div style='padding: 15px; background: #e3f2fd; border-left: 4px solid #2196f3; border-radius: 4px; margin: 10px 0;'>\n",
" <strong>🔍 Tool Invoked:</strong> hotel_booking(\"{destination}\")\n",
" </div>\n",
" \"\"\")\n",
" )\n",
"\n",
" # Simulate availability check\n",
" cities_with_rooms = [\"stockholm\", \"seattle\", \"tokyo\", \"london\", \"amsterdam\"]\n",
" has_rooms = destination.lower() in cities_with_rooms\n",
"\n",
" result = {\"has_availability\": has_rooms, \"destination\": destination}\n",
"\n",
" return json.dumps(result)\n",
"\n",
"\n",
"print(\"✅ hotel_booking tool created with @tool decorator\")"
]
},
{
"cell_type": "markdown",
"id": "134c54b0",
"metadata": {},
"source": [
"## 3. lépés: Feltételfüggvények definiálása az útválasztáshoz\n",
"\n",
"Ezek a függvények megvizsgálják az ügynök válaszát, és meghatározzák, melyik útvonalat kell követni a munkafolyamatban.\n",
"\n",
"**Kulcsminta:**\n",
"1. Ellenőrizze, hogy az üzenet `AgentExecutorResponse` típusú-e\n",
"2. Elemezze a strukturált kimenetet (Pydantic modell)\n",
"3. Visszaadja a `True` vagy `False` értéket az útválasztás vezérléséhez\n",
"\n",
"A munkafolyamat ezeket a feltételeket az **éleken** értékeli ki, hogy eldöntse, melyik végrehajtót hívja meg legközelebb.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6960edd1",
"metadata": {},
"outputs": [],
"source": [
"def has_availability_condition(message: Any) -> bool:\n",
" \"\"\"\n",
" Condition for routing when hotels ARE available.\n",
" \n",
" Returns True if the destination has hotel rooms.\n",
" \"\"\"\n",
" if not isinstance(message, AgentExecutorResponse):\n",
" return True # Default to True if unexpected type\n",
"\n",
" try:\n",
" result = BookingCheckResult.model_validate_json(message.agent_run_response.text)\n",
"\n",
" display(\n",
" HTML(f\"\"\"\n",
" <div style='padding: 12px; background: #c8e6c9; border-left: 4px solid #4caf50; border-radius: 4px; margin: 10px 0;'>\n",
" <strong>✅ Condition Check:</strong> has_availability = <strong>{result.has_availability}</strong> for {result.destination}\n",
" </div>\n",
" \"\"\")\n",
" )\n",
"\n",
" return result.has_availability\n",
" except Exception as e:\n",
" display(\n",
" HTML(f\"\"\"\n",
" <div style='padding: 12px; background: #ffcdd2; border-left: 4px solid #f44336; border-radius: 4px; margin: 10px 0;'>\n",
" <strong>⚠️ Error:</strong> {str(e)}\n",
" </div>\n",
" \"\"\")\n",
" )\n",
" return False\n",
"\n",
"\n",
"def no_availability_condition(message: Any) -> bool:\n",
" \"\"\"\n",
" Condition for routing when hotels are NOT available.\n",
" \n",
" Returns True if the destination has no hotel rooms.\n",
" \"\"\"\n",
" if not isinstance(message, AgentExecutorResponse):\n",
" return False\n",
"\n",
" try:\n",
" result = BookingCheckResult.model_validate_json(message.agent_run_response.text)\n",
"\n",
" display(\n",
" HTML(f\"\"\"\n",
" <div style='padding: 12px; background: #ffecb3; border-left: 4px solid #ff9800; border-radius: 4px; margin: 10px 0;'>\n",
" <strong>❌ Condition Check:</strong> no_availability for {result.destination}\n",
" </div>\n",
" \"\"\")\n",
" )\n",
"\n",
" return not result.has_availability\n",
" except Exception as e:\n",
" return False\n",
"\n",
"\n",
"print(\"✅ Condition functions defined:\")\n",
"print(\" - has_availability_condition (routes when rooms exist)\")\n",
"print(\" - no_availability_condition (routes when no rooms)\")"
]
},
{
"cell_type": "markdown",
"id": "9dc783ba",
"metadata": {},
"source": [
"## 4. lépés: Egyedi megjelenítő végrehajtó létrehozása\n",
"\n",
"A végrehajtók olyan munkafolyamat-összetevők, amelyek átalakításokat vagy mellékhatásokat hajtanak végre. Az `@executor` dekorátort használjuk egy olyan egyedi végrehajtó létrehozásához, amely megjeleníti a végső eredményt.\n",
"\n",
"**Főbb fogalmak:**\n",
"- `@executor(id=\"...\")` - Egy függvény regisztrálása munkafolyamat végrehajtóként\n",
"- `WorkflowContext[Never, str]` - Bemeneti/kimeneti típusjelzések\n",
"- `ctx.yield_output(...)` - A végső munkafolyamat eredményének átadása\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c67f6b55",
"metadata": {},
"outputs": [],
"source": [
"@executor(id=\"display_result\")\n",
"async def display_result(response: AgentExecutorResponse, ctx: WorkflowContext[Never, str]) -> None:\n",
" \"\"\"\n",
" Display the final result as workflow output.\n",
" \n",
" This executor receives the final agent response and yields it as the workflow output.\n",
" \"\"\"\n",
" display(\n",
" HTML(\"\"\"\n",
" <div style='padding: 15px; background: #f3e5f5; border-left: 4px solid #9c27b0; border-radius: 4px; margin: 10px 0;'>\n",
" <strong>📤 Display Executor:</strong> Yielding workflow output\n",
" </div>\n",
" \"\"\")\n",
" )\n",
"\n",
" await ctx.yield_output(response.agent_run_response.text)\n",
"\n",
"\n",
"print(\"✅ display_result executor created with @executor decorator\")"
]
},
{
"cell_type": "markdown",
"id": "7de6eb90",
"metadata": {},
"source": [
"## 5. lépés: Környezeti változók betöltése\n",
"\n",
"Állítsa be az LLM kliensét. Ez a példa az alábbiakkal működik:\n",
"- **GitHub modellek** (Ingyenes szint GitHub tokennel)\n",
"- **Azure OpenAI**\n",
"- **OpenAI**\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1e8f0d88",
"metadata": {},
"outputs": [],
"source": [
"# Load environment variables\n",
"load_dotenv()\n",
"\n",
"# Configure the Azure AI Foundry provider with keyless authentication\n",
"provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())"
]
},
{
"cell_type": "markdown",
"id": "3fc61fe7",
"metadata": {},
"source": [
"## 6. lépés: AI ügynökök létrehozása strukturált kimenetekkel\n",
"\n",
"Három **speciális ügynököt** hozunk létre, mindegyiket `AgentExecutor`-be csomagolva:\n",
"\n",
"1. **availability_agent** – A szálloda elérhetőségének ellenőrzése az eszköz segítségével\n",
"2. **alternative_agent** – Alternatív városokat javasol (ha nincs szabad szoba)\n",
"3. **booking_agent** – Foglalásra ösztönöz (ha vannak szabad szobák)\n",
"\n",
"**Fő jellemzők:**\n",
"- `tools=[hotel_booking]` – Az eszköz biztosítása az ügynöknek\n",
"- `response_format=PydanticModel` – Strukturált JSON kimenet kikényszerítése\n",
"- `AgentExecutor(..., id=\"...\")` – Ügynök becsomagolása munkafolyamat használathoz\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "66466dda",
"metadata": {},
"outputs": [],
"source": [
"# Agent 1: Check availability with tool\n",
"availability_agent = AgentExecutor(\n",
" await provider.create_agent(\n",
" name=\"availability-agent\",\n",
" instructions=(\n",
" \"You are a hotel booking assistant that checks room availability. \"\n",
" \"Use the hotel_booking tool to check if rooms are available at the destination. \"\n",
" \"Return JSON with fields: destination (string), has_availability (bool), and message (string). \"\n",
" \"The message should summarize the availability status.\"\n",
" ),\n",
" tools=[hotel_booking],\n",
" default_options={\"response_format\": BookingCheckResult},\n",
" ),\n",
" id=\"availability_agent\",\n",
")\n",
"\n",
"# Agent 2: Suggest alternative (when no rooms)\n",
"alternative_agent = AgentExecutor(\n",
" await provider.create_agent(\n",
" name=\"alternative-agent\",\n",
" instructions=(\n",
" \"You are a helpful travel assistant. When a user cannot find hotels in their requested city, \"\n",
" \"suggest an alternative nearby city that has availability. \"\n",
" \"Return JSON with fields: alternative_destination (string) and reason (string). \"\n",
" \"Make your suggestion sound appealing and helpful.\"\n",
" ),\n",
" default_options={\"response_format\": AlternativeResult},\n",
" ),\n",
" id=\"alternative_agent\",\n",
")\n",
"\n",
"# Agent 3: Suggest booking (when rooms available)\n",
"booking_agent = AgentExecutor(\n",
" await provider.create_agent(\n",
" name=\"booking-agent\",\n",
" instructions=(\n",
" \"You are a booking assistant. The user has found available hotel rooms. \"\n",
" \"Encourage them to book by highlighting the destination's appeal. \"\n",
" \"Return JSON with fields: destination (string), action (string), and message (string). \"\n",
" \"The action should be 'book_now' and message should be encouraging.\"\n",
" ),\n",
" default_options={\"response_format\": BookingConfirmation},\n",
" ),\n",
" id=\"booking_agent\",\n",
")\n",
"\n",
"display(\n",
" HTML(\"\"\"\n",
" <div style='padding: 15px; background: #e3f2fd; border-left: 4px solid #2196f3; border-radius: 4px; margin: 10px 0;'>\n",
" <strong>✅ Created 3 Agents:</strong>\n",
" <ul style='margin: 10px 0 0 0;'>\n",
" <li><strong>availability_agent</strong> - Checks availability with hotel_booking tool</li>\n",
" <li><strong>alternative_agent</strong> - Suggests alternative cities</li>\n",
" <li><strong>booking_agent</strong> - Encourages booking</li>\n",
" </ul>\n",
" </div>\n",
"\"\"\")\n",
")"
]
},
{
"cell_type": "markdown",
"id": "7879a0cb",
"metadata": {},
"source": [
"## 7. lépés: Építsük meg a munkafolyamatot feltételes élekkel\n",
"\n",
"Most a `WorkflowBuilder`-t használjuk a gráf feltételes útválasztással történő felépítéséhez:\n",
"\n",
"**Munkafolyamat szerkezete:**\n",
"```\n",
"availability_agent (START)\n",
" ↓\n",
" Evaluate conditions\n",
" ↙ ↘\n",
"[no_availability] [has_availability]\n",
" ↓ ↓\n",
"alternative_agent booking_agent\n",
" ↓ ↓\n",
" display_result ←───┘\n",
"```\n",
"\n",
"**Kulcsfontosságú metódusok:**\n",
"- `.set_start_executor(...)` - Beállítja a belépési pontot\n",
"- `.add_edge(from, to, condition=...)` - Feltételes élet ad hozzá\n",
"- `.build()` - Befejezi a munkafolyamatot\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "90bb29dd",
"metadata": {},
"outputs": [],
"source": [
"# Build the workflow with conditional routing\n",
"workflow = (\n",
" WorkflowBuilder(\n",
" start_executor=availability_agent,\n",
" output_executors=[display_result],\n",
" )\n",
" # NO AVAILABILITY PATH\n",
" .add_edge(availability_agent, alternative_agent, condition=no_availability_condition)\n",
" .add_edge(alternative_agent, display_result)\n",
" # HAS AVAILABILITY PATH\n",
" .add_edge(availability_agent, booking_agent, condition=has_availability_condition)\n",
" .add_edge(booking_agent, display_result)\n",
" .build()\n",
")\n",
"\n",
"display(\n",
" HTML(\"\"\"\n",
" <div style='padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 8px; margin: 10px 0;'>\n",
" <h3 style='margin: 0 0 15px 0;'>✅ Workflow Built Successfully!</h3>\n",
" <p style='margin: 0; line-height: 1.6;'>\n",
" <strong>Conditional Routing:</strong><br>\n",
" • If <strong>NO availability</strong> → alternative_agent → display_result<br>\n",
" • If <strong>availability</strong> → booking_agent → display_result\n",
" </p>\n",
" </div>\n",
"\"\"\")\n",
")"
]
},
{
"cell_type": "markdown",
"id": "0a3ad845",
"metadata": {},
"source": [
"## 8. lépés: Futtassa az 1. tesztesetet - Város ELÉRHETŐSÉG NÉLKÜL (Párizs)\n",
"\n",
"Teszteljük a **nem elérhető** útvonalat azzal, hogy szállodákat kérünk le Párizsban (ahol a szimulációnkban nincs szoba).\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "af1538cd",
"metadata": {},
"outputs": [],
"source": [
"display(\n",
" HTML(\"\"\"\n",
" <div style='padding: 20px; background: #fff3e0; border-left: 4px solid #ff9800; border-radius: 8px; margin: 20px 0;'>\n",
" <h3 style='margin: 0 0 10px 0; color: #e65100;'>🧪 TEST CASE 1: Paris (No Availability)</h3>\n",
" <p style='margin: 0;'>Expected workflow path: availability_agent → alternative_agent → display_result</p>\n",
" </div>\n",
"\"\"\")\n",
")\n",
"\n",
"# Create request for Paris\n",
"request_paris = AgentExecutorRequest(\n",
" messages=[Message(role=\"user\", text=\"I want to book a hotel in Paris\")], should_respond=True\n",
")\n",
"\n",
"# Run the workflow\n",
"events_paris = await workflow.run(request_paris)\n",
"outputs_paris = events_paris.get_outputs()\n",
"\n",
"# Display results\n",
"if outputs_paris:\n",
" result_paris = AlternativeResult.model_validate_json(outputs_paris[0])\n",
"\n",
" display(\n",
" HTML(f\"\"\"\n",
" <div style='padding: 25px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 12px; box-shadow: 0 4px 12px rgba(255,165,0,0.3); margin: 20px 0;'>\n",
" <h3 style='margin: 0 0 15px 0; color: #333;'>🏆 WORKFLOW RESULT (Paris)</h3>\n",
" <div style='background: white; padding: 20px; border-radius: 8px;'>\n",
" <p style='margin: 0 0 10px 0; font-size: 16px;'><strong>Status:</strong> ❌ No rooms in Paris</p>\n",
" <p style='margin: 0 0 10px 0; font-size: 16px;'><strong>Alternative Suggestion:</strong> 🏨 {result_paris.alternative_destination}</p>\n",
" <p style='margin: 0; font-size: 14px; color: #666;'><strong>Reason:</strong> {result_paris.reason}</p>\n",
" </div>\n",
" </div>\n",
" \"\"\")\n",
" )"
]
},
{
"cell_type": "markdown",
"id": "408a3f60",
"metadata": {},
"source": [
"## 9. lépés: Teszteset 2 futtatása - Város ELÉRHETŐSÉGGEL (Stockholm)\n",
"\n",
"Most teszteljük az **elérhetőség** útvonalat úgy, hogy szállodákat kérünk Stockholmból (amelynek vannak szobái a szimulációnkban).\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e1471000",
"metadata": {},
"outputs": [],
"source": [
"display(\n",
" HTML(\"\"\"\n",
" <div style='padding: 20px; background: #e8f5e9; border-left: 4px solid #4caf50; border-radius: 8px; margin: 20px 0;'>\n",
" <h3 style='margin: 0 0 10px 0; color: #1b5e20;'>🧪 TEST CASE 2: Stockholm (Has Availability)</h3>\n",
" <p style='margin: 0;'>Expected workflow path: availability_agent → booking_agent → display_result</p>\n",
" </div>\n",
"\"\"\")\n",
")\n",
"\n",
"# Create request for Stockholm\n",
"request_stockholm = AgentExecutorRequest(\n",
" messages=[Message(role=\"user\", text=\"I want to book a hotel in Stockholm\")], should_respond=True\n",
")\n",
"\n",
"# Run the workflow\n",
"events_stockholm = await workflow.run(request_stockholm)\n",
"outputs_stockholm = events_stockholm.get_outputs()\n",
"\n",
"# Display results\n",
"if outputs_stockholm:\n",
" result_stockholm = BookingConfirmation.model_validate_json(outputs_stockholm[0])\n",
"\n",
" display(\n",
" HTML(f\"\"\"\n",
" <div style='padding: 25px; background: linear-gradient(135deg, #4caf50 0%, #8bc34a 100%); color: white; border-radius: 12px; box-shadow: 0 4px 12px rgba(76,175,80,0.3); margin: 20px 0;'>\n",
" <h3 style='margin: 0 0 15px 0;'>🏆 WORKFLOW RESULT (Stockholm)</h3>\n",
" <div style='background: white; color: #333; padding: 20px; border-radius: 8px;'>\n",
" <p style='margin: 0 0 10px 0; font-size: 16px;'><strong>Status:</strong> ✅ Rooms Available!</p>\n",
" <p style='margin: 0 0 10px 0; font-size: 16px;'><strong>Destination:</strong> 🏨 {result_stockholm.destination}</p>\n",
" <p style='margin: 0 0 10px 0; font-size: 16px;'><strong>Action:</strong> {result_stockholm.action}</p>\n",
" <p style='margin: 0; font-size: 14px; color: #666;'><strong>Message:</strong> {result_stockholm.message}</p>\n",
" </div>\n",
" </div>\n",
" \"\"\")\n",
" )"
]
},
{
"cell_type": "markdown",
"id": "a415537c",
"metadata": {},
"source": [
"## Főbb tanulságok és további lépések\n",
"\n",
"### ✅ Amit megtanultál:\n",
"\n",
"1. **WorkflowBuilder minta**\n",
" - Használd a `.set_start_executor()`-t a belépési pont meghatározásához\n",
" - Használd a `.add_edge(from, to, condition=...)`-t feltételes útválasztáshoz\n",
" - Hívd meg a `.build()`-et a munkafolyamat véglegesítéséhez\n",
"\n",
"2. **Feltételes útválasztás**\n",
" - A feltétel függvények vizsgálják az `AgentExecutorResponse`-t\n",
" - A strukturált kimenetek elemzése az útválasztási döntésekhez\n",
" - `True` értékkel aktivál egy élt, `False`-szal kihagyja azt\n",
"\n",
"3. **Eszköz integráció**\n",
" - Az `@ai_function` segítségével Python függvényeket AI eszközökké alakítunk\n",
" - Az ügynökök automatikusan hívják az eszközöket, amikor szükséges\n",
" - Az eszközök JSON-t adnak vissza, amit az ügynökök feldolgoznak\n",
"\n",
"4. **Strukturált kimenetek**\n",
" - Pydantic modelleket használj típusbiztos adatkinyeréshez\n",
" - Állítsd be a `response_format=MyModel` értéket az ügynökök létrehozásakor\n",
" - Válaszokat a `Model.model_validate_json()` segítségével dolgozz fel\n",
"\n",
"5. **Egyedi végrehajtók**\n",
" - Használd az `@executor(id=\"...\")` jelölést a munkafolyamat komponensek létrehozásához\n",
" - A végrehajtók adatokat alakíthatnak át vagy oldalt hatásokat hajthatnak végre\n",
" - Használd a `ctx.yield_output()`-ot a munkafolyamat eredményeinek előállításához\n",
"\n",
"### 🚀 Valós alkalmazások:\n",
"\n",
"- **Utazásfoglalás**: Elérhetőség ellenőrzése, alternatívák javaslata, összehasonlítás\n",
"- **Ügyfélszolgálat**: Probléma típus, hangulat, prioritás alapján útválasztás\n",
"- **E-kereskedelem**: Készletellenőrzés, alternatívák javaslata, rendelések feldolgozása\n",
"- **Tartalom moderálás**: Útválasztás toxicitási pontszámok és felhasználói jelzések alapján\n",
"- **Jóváhagyási folyamatok**: Összeg, felhasználói szerep, kockázati szint alapján útválasztás\n",
"- **Többlépcsős feldolgozás**: Adatminőség, teljesség alapján útválasztás\n",
"\n",
"### 📚 Következő lépések:\n",
"\n",
"- Bonyolultabb feltételek hozzáadása (többszörös kritériumok)\n",
"- Ciklusok megvalósítása a munkafolyamat állapotkezeléssel\n",
"- Al-munkafolyamatok hozzáadása újrafelhasználható komponensekhez\n",
"- Integráció valós API-kkal (szállásfoglalás, készletrendszerek)\n",
"- Hibakezelés és tartalékútvonalak hozzáadása\n",
"- Munkafolyamatok vizualizálása beépített megjelenítő eszközökkel\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Jogi nyilatkozat**:\nEz a dokumentum az AI fordítási szolgáltatás, a [Co-op Translator](https://github.com/Azure/co-op-translator) segítségével készült. Bár az pontosságra törekszünk, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az anyanyelvén tekintendő hiteles forrásnak. Fontos információk esetén professzionális emberi fordítást javasolunk. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely ebből a fordításból ered.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv (3.12.12)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}