genai-function-calling/openai-agents/main.py (57 lines of code) (raw):

import asyncio import os import sys from httpx import AsyncClient from agents import ( Agent, ModelSettings, OpenAIProvider, RunConfig, Runner, function_tool, Tool, ) from agents.tracing import GLOBAL_TRACE_PROVIDER from openai import AsyncAzureOpenAI from main_mcp import run_main as mcp_main # Shut down the global tracer as it sends to the OpenAI "/traces/ingest" # endpoint, which we aren't using and doesn't exist on alternative backends # like Ollama. GLOBAL_TRACE_PROVIDER.shutdown() async def get_latest_elasticsearch_version(major_version: int = 0) -> str: """Returns the latest GA version of Elasticsearch in "X.Y.Z" format. Args: major_version: Major version to filter by (e.g. 7, 8). Defaults to latest """ async with AsyncClient() as client: response = await client.get("https://artifacts.elastic.co/releases/stack.json") response.raise_for_status() releases = response.json()["releases"] # Fetch releases and filter out non-release versions (e.g., -rc1) or # those not matching major_version. In any case, remove " GA" suffix. versions = [] for r in releases: v = r["version"].removesuffix(" GA") if "-" in r["version"]: continue if major_version and int(v.split(".")[0]) != major_version: continue versions.append(v) if not versions: raise ValueError("No valid versions found") # "8.9.1" > "8.10.0", so coerce to a numeric tuple: (8,9,1) < (8,10,0) return max(versions, key=lambda v: tuple(map(int, v.split(".")))) async def run_agent(tools: list[Tool]): model_name = os.getenv("CHAT_MODEL", "gpt-4o-mini") openai_client = AsyncAzureOpenAI() if os.getenv("AZURE_OPENAI_API_KEY") else None model = OpenAIProvider(openai_client=openai_client, use_responses=False).get_model(model_name) agent = Agent( name="version_assistant", model=model, model_settings=ModelSettings(temperature=0), tools=tools, ) result = await Runner.run( starting_agent=agent, input="What is the latest version of Elasticsearch 8?", run_config=RunConfig(workflow_name="GetLatestElasticsearchVersion"), ) print(result.final_output) async def main(): """Run tools with the agent directly unless in MCP mode""" fns = [get_latest_elasticsearch_version] if any(arg.startswith("--mcp") for arg in sys.argv): await mcp_main(fns, run_agent) # start an MCP server and use its tools else: # run the tools directly await run_agent([function_tool(strict_mode=False)(fn) for fn in fns]) if __name__ == "__main__": asyncio.run(main())