Skip to content

#45. Model Precedense

Source code in OpAgentsOlympus/practice/#45. model_precedense.py
OpAgentsOlympus/practice/#45. model_precedense.py
from agents import (
    Agent,
    Runner,
    RunConfig,
    ModelProvider,
    OpenAIChatCompletionsModel,
    AsyncOpenAI,
)
from agents.tracing import set_trace_processors
from agents.tracing.processors import BatchTraceProcessor, TracingExporter
from rich.console import Console
from rich.tree import Tree
import os
import dotenv

dotenv.load_dotenv()
GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")

client = AsyncOpenAI(
    base_url="https://generativelanguage.googleapis.com/v1beta/openai",
    api_key=GEMINI_API_KEY,
)


class CustomConsoleSpanExporter(TracingExporter):
    def __init__(self):
        self.console = Console()

    def export(self, items):
        for item in items:
            if (
                hasattr(item, "export")
                and item.export().get("span_data", {}).get("type", "unknown")
                == "generation"
            ):
                self._export_span(item)

    def _export_span(self, span):
        span_data = span.export()
        if not span_data:
            return

        span_details = span_data.get("span_data", {})
        span_type = span_details.get("type", "unknown")

        tree = Tree(f"[bold green]Span:[/bold green] {span_type}")

        if span_type == "generation":
            self._add_generation_data(tree, span_details)

        self.console.print(tree)

    def _add_generation_data(self, tree, data):
        if data.get("model"):
            tree.add(
                f"[yellow]🎯 ACTUAL MODEL USED:[/yellow] [bold red]{data['model']}[/bold red]"
            )


comprehensive_processor = BatchTraceProcessor(CustomConsoleSpanExporter())
set_trace_processors([comprehensive_processor])

model1 = OpenAIChatCompletionsModel("gemini-1.5-flash", client)
model2 = OpenAIChatCompletionsModel("gemini-2.0-flash", client)


class CustomProvider(ModelProvider):
    def get_model(self, model_name: str):
        if model_name == "custom-model":
            return model2
        print(f"❌ CustomProvider could not resolve: {model_name}")
        return None


agent = Agent(
    name="Assistant",
    instructions="You are a helpful assistant",
    model=model1,  # This will be overridden
)

run_config = RunConfig(
    model="custom-model",
    model_provider=CustomProvider(),
    tracing_disabled=False,  # Enable tracing so that the CustomConsoleSpanExporter be able to log in terminal
)

# This will use gemini-2.0-flash, not gemini-1.5-flash
result = Runner.run_sync(agent, "Hello", run_config=run_config)
print(f"✨ Final output: {result.final_output}")