תקציר דוגמאות הוובינר מחר

17/09/2025

הי חברים מה קורה? השבוע במפגש של מדברים AI אני אציג את הספריה OpenAI Agents ואראה איך להתקין אותה, מה הקשר שלה לספריות סוכנים מתחרות או מקבילות ומה המנגנונים והעקרונות המרכזיים של כתיבת סוכנים. אלה 5 דוגמאות שאני מתכנן להציג.

1. הסוכן הראשון שלי

סוכן הוא בסך הכל תוכנית רגילה שחלק מהעבודה שלה נעשה באמצעות מודל שפה גדול. דוגמה ראשונה עם OpenAI Agents היא התוכנית:

from agents import Agent, Runner

agent = Agent(name="Assistant", instructions="You are a helpful assistant")

result = Runner.run_sync(agent, "Write a haiku about recursion in programming.")
print(result.final_output)

בשביל להריץ את התוכנית יש להתקין את הספריה עם:

pip install openai-agents

ולהגדיר משתנה סביבה בשם OPENAI_API_KEY שמחזיק את מפתח ה API שלכם מ openai.

התוכנית בדוגמה משתמשת במודל שפה דרך API כדי לכתוב שיר הייקו. כל פעם שמפעילים אותה מקבלים שיר קצת אחר על אותו נושא.

2. גיוון סוכנים עם בדיחות אבא

דוגמה שניה היא בחירת המודל. כל מודל נותן תשובות אחרות והרבה פעמים מודלים מסוימים יותר מתאימים לענות על שאלות מסוימות מאחרים. אין "מודל הכי טוב" יש מודל שמתאים בצורה הכי טובה לפרומפט שכתבתי ולמשימה שאני צריך לבצע.

עם openai agents יש לי שתי אפשרויות לבחור מודל. אופציה ראשונה אם אני רוצה להישאר בעולם של OpenAI אפשר להעביר את המפתח model לבנאי של Agents לדוגמה:

agent = Agent(
    name="Assistant",
    instructions="You are a mighty creator of dad jokes",
    model="gpt-5-mini",
)

אופציה שניה אם אני רוצה מודל מספק אחר, למשל בשביל לעבוד עם ג'מיני, אני צריך להתקין גירסה של ספריית הסוכנים עם תוסף בשם LiteLLM עם הפקודה:

pip install "openai-agents[litellm]"

ואז אני יכול בקוד לכתוב:

gemini = Agent(
    name="Assistant",
    instructions="You are a mighty creator of dad jokes",
    model=LitellmModel(model="gemini/gemini-2.5-flash", api_key="...")
)

result = Runner.run_sync(gemini, "Write a random dad joke")
print(result.final_output)

3. בדיקת סוכנים דרך ה REPL

ספריית OpenAI Agents מגיעה עם כלי שורת פקודה לבדיקת סוכנים. הכלי מאפשר לי לכתוב שורת Instructions ואז להמשיך ולדבר עם הסוכן שמוגדר על ידי המודל וה Instructions. תוכנית כזו מפעילה לולאה שמחכה לשורה מהמשתמש, שולחת את ההודעה למודל השפה, שומרת את ההודעה ואת תשובת המודל ומדפיסה אותה חזרה למשתמש בהזרמה.

זה הקוד וזה מאוד נוח כדי לבדוק איך סוכנים שונים שאנחנו בונים יתנהגו:

import asyncio
from agents import Agent, run_demo_loop

async def main() -> None:
    agent = Agent(
        name="Assistant",
        instructions="You are a mighty creator of dad jokes",
        model="gpt-4.1-mini",
    )

    await run_demo_loop(agent)

if __name__ == "__main__":
    asyncio.run(main())

4. ניהול Session בעצמנו

מה בעצם עושה הפונקציה run_demo_loop? היא פותחת אוביקט שנקרא session. מודל השפה לא "זוכר" הודעות ישנות, אין לו State, לכן בשביל לייצר שיחה כל הודעה נשלחת עם כל ההודעות הקודמות באותה השיחה. אוביקט session שומר רשימות של הודעות כדי שיהיה אפשר להמשיך שיחות.

ה session יכולה להישמר בזיכרון אבל יהיה לנו נוח לשמור אותה בבסיס נתונים. הקוד הזה מריץ לולאה של שיחה עם מודל ושומר את כל ההודעות לבסיס נתונים מסוג SQLite. אחרי הרצה הסתכלו בבסיס הנתונים כדי לראות את מבנה הטבלאות וההודעות:

import asyncio
from agents import Agent, SQLiteSession, Runner

async def main() -> None:
    agent = Agent(
        name="Assistant",
        instructions="You are a mighty creator of dad jokes",
        model="gpt-4.1-mini",
    )
    session = SQLiteSession("user_123", "conversations.db")

    while True:
        next_line = input('> ')
        result = await Runner.run(
            agent,
            next_line,
            session=session
        )
        print(result.final_output)



if __name__ == "__main__":
    asyncio.run(main())

5. הפעלת כלים

הרבה פעמים אנחנו רוצים לתת למודל אפשרות "לעשות" משהו באמצע השיחה - כלומר המודל מדווח לתוכנית שעוטפת אותו שמשהו מיוחד קרה ואז התוכנית מריצה קוד לטיפול באותו האירוע. ניקח דוגמה עם מודל שמייצר בדיחות וחלק מהבדיחות מצחיקות במיוחד. אני לא יודע כשאני כותב את קוד התוכנית איזה בדיחות יצאו מצחיקות במיוחד, האמת שאפילו אם היו נותנים לי את שורת הטקסט של הבדיחה לא הייתי יודע בקוד לבדוק אם היא מצחיקה, אבל מודל השפה מתוך השיחה שלו עם המשתמש כן יכול לזהות את הנקודה שבה הוא ייצר בדיחה מצחיקה במיוחד (למשל אם הוא מזהה שהמשתמש צחק בקול מהבדיחה).

שימוש בכלים זה המנגנון שמאפשר למודל "לדווח" שמשהו כזה קרה. ספריית AI שתומכת בשימוש בכלים תאפשר לנו להגדיר מראש איזה ״כלים״ זמינים, ומה עושים כשמודל מפעיל כלי מסוים. בדוגמה הבאה למודל יש כלי של שמירת בדיחה ואנחנו מבקשים ממנו לשמור את הבדיחות המצחיקות:

import asyncio
from agents import Agent, SQLiteSession, Runner, FunctionTool, function_tool

@function_tool
async def save_joke(joke: str) -> str:
    """Save the given dad joke because it was so funny

    Args:
        joke: The joke text
    """
    print("*** Funny joke detected, saving! ***")
    # In real life, we'd fetch the weather from a weather API
    with open('jokes.txt', 'a', encoding='utf8') as f:
        f.write(joke)
        f.write("\n\n")

    return "joke saved"

async def main() -> None:
    agent = Agent(
        name="Assistant",
        instructions="You are a mighty creator of dad jokes. save the really funny ones with your tool",
        tools=[save_joke],
    )
    session = SQLiteSession("user_123", "conversations.db")

    while True:
        next_line = input('> ')
        result = await Runner.run(
            agent,
            next_line,
            session=session
        )
        print(result.final_output)



if __name__ == "__main__":
    asyncio.run(main())

בוובינר מחר נדבר יותר לעומק על הספריה, אני אסביר לאט על כל תוכנית, נריץ כל אחת וגם נשבור אותן קצת כדי לראות איך הדברים האלה עובדים. זה יהיה מבוא טוב אם אתם חולמים לכתוב סוכני AI או רק לקבל הצצה איך סוכנים כאלה נראים מתחת למכסה המנוע.

נפגשים מחר (יום חמישי) בעשר בבוקר. בשביל קישור לזום צריך להירשם בעמוד הזה: https://www.tocode.co.il/talking_ai