יום 11 - כלים מובנים ב API

10/10/2025

ספקי הגישה למודלים כמו OpenAI ו Anthropic שמו לב למספר אתגרים של מפתחים שבונים מערכות מבוססות סוכנים הקשורים להפעלת כלים ומהווים הזדמנות עסקית לאותם ספקי מודלים:

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

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

  3. אם המודל רוצה ליצור תמונה יש להשתמש במנגנון AI אחר שיוצר תמונות.

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

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

1. דוגמה 1 - כלי הרצת קוד

בואו נכתוב דוגמה ראשונה עם כלי הרצת קוד, אבל לפני שאשתמש בכלי המובנה של OpenAI אני רוצה לכתוב את הדוגמה עם כלי הרצת קוד עצמאי שאני כותב ולדבר על הבעיות שבו. זאת התוכנית:

import asyncio

from agents import Agent, Runner

import json

from typing_extensions import TypedDict, Any
import os
from agents import Agent, FunctionTool, RunContextWrapper, function_tool
from agents.extensions.models.litellm_model import LitellmModel

@function_tool
async def run_python(code: str) -> str:
    """Run provided python code and return the value of "result" global variable as string.

    Args:
        code: python code to execute

    Example input to return the value of 5 + 7:
        x = 5
        y = 7
        result = x + y
    """
    print(f"Running Code: \n\n{code}")
    ns = {}
    exec(code, ns)
    print(f"Result = {ns['result']}")
    return str(ns['result'])

agent = Agent(
    name="Assistant",
    model=LitellmModel(model="github/gpt-4.1", api_key=os.environ["GITHUB_TOKEN"]),
    tools=[run_python],
)

async def main():
    result = await Runner.run(agent, "What is the current os.name ? use Python to find out")
    print(result.final_output)

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

הקוד עובד - המודל כתב את התוכנית:

import os
result = os.name

הקוד שלי הריץ אותה עם exec ובסוף החזיר את ערך המשתנה result. אבל גם קל לראות את הבעיות:

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

  2. יותר גרוע - הכלי רץ אצלי על המכונה או במערכת אמיתית על שרת הפרודקשן. מודלים הם לא יצורים אמינים ותקלה או פרומפט זדוני יכולים לעשות הרבה נזק.

עכשיו בואו נראה איך זה עובד עם הכלי המובנה של OpenAI. זה הקוד המעודכן:

import asyncio
from agents import Agent, Runner, CodeInterpreterTool

agent = Agent(
    name="Assistant",
    tools=[CodeInterpreterTool(
        tool_config={
            "type": "code_interpreter",
            "container": { "type": "auto" }
        }
    )],
)

async def main():
    result = await Runner.run(agent, "What is the current os.name ? use Python to find out")
    print(result.final_output)

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

הקוד נראה הרבה יותר טוב! זה מה שקורה הפעם:

  1. כלי Code Interpreter רץ בענן. אני מעביר קונפיגורציה שאומרת שכל פעם שהוא צריך להריץ קוד הוא יכול ליצור לעצמו קונטיינר.

  2. בשביל להשתמש בכלי הרצת הקוד אני כבר לא יכול לעבוד דרך LiteLLM והמודל של גיטהאב וחייב להיכנס למודל בתשלום של OpenAI. גם הבקשה עצמה לוקחת הרבה יותר זמן ויותר טוקנים.

  3. הקוד רץ בענן של OpenAI על קונטיינר מנותק מהשרת שלי ואני מקבל רק את תשובת המודל.

  4. ל OpenAI יש API שלם לעבודה עם קבצים וקונטיינרים כך שמשתמשים מתקדמים יכולים ליצור בעצמם את הקונטיינר, להעלות אליו קבצים, לתת למודל לכתוב קבצים חדשים ולהריץ קוד ובסוף להוריד קבצי תוצאה.

2. דוגמה 2 - חיפוש ברשת

כלי מובנה שני הוא כלי החיפוש ברשת. בואו נראה אותו באמצעות הדוגמה הבאה:

import asyncio

from agents import Agent, Runner, WebSearchTool

agent = Agent(
    name="Assistant",
    tools=[
        WebSearchTool(),
    ],
)

async def main():
    result = await Runner.run(agent, "Which coffee shop should I go to, taking into account the weather today in SF?")
    print(result.final_output)


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

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

from tavily import TavilyClient
tavily_client = TavilyClient(api_key="tvly-YOUR_API_KEY")
response = tavily_client.search("Who is Leo Messi?")
print(response)

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

3. עכשיו אתם

חישבו - איזה עוד כלים לדעתכם אנשים צריכים וקשה לכתוב או להריץ בצורה מקומית?