-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Open
Labels
Feature requestNew feature requestNew feature request
Description
Description
Hi!
I absolutely love the work you are doing at pydantic-ai. It has very quickly become a critical part of our production codebase. We also rely heavily on Openrouter for provider and model routing, and to provide extra capacity under heavy load. One feature I would love to see is if the provider selected by Openrouter was captured in the ModelResponse. This would be extremely valuable to us for debugging and analytics purposes. The vendor_details
attribute seems like a natural fit. I think implementing this would require creating an OpenRouterModel
class with a modified _process_response
method
Current Behavior
from os import getenv
from pydantic_ai import Agent
from pydantic_ai.models.openai import OpenAIModel
from pydantic_ai.providers.openrouter import OpenRouterProvider
model = OpenAIModel(
model_name="anthropic/claude-3.7-sonnet",
provider=OpenRouterProvider(api_key=getenv("OPENROUTER_API_KEY"))
)
agent = Agent(model)
result = await agent.run("What is the meaning of life?")
result.new_messages()[-1].vendor_details is None
>>> True
Desired Behavior
from os import getenv
from pydantic_ai import Agent
from pydantic_ai.models.openai import OpenRouterModel
from pydantic_ai.providers.openrouter import OpenRouterProvider
model = OpenRouterModel(
model_name="anthropic/claude-3.7-sonnet",
provider=OpenRouterProvider(api_key=getenv("OPENROUTER_API_KEY"))
)
agent = Agent(model)
result = await agent.run("What is the meaning of life?")
print(result.new_messages()[-1].vendor_details)
>>> {"provider": "Google"}
Super Basic Implementation
Would be great to see this officially supported, and I would be happy to contribute with some guidance!
# pydantic_ai.models.openrouter
from openai.types import chat
from pydantic_ai.messages import ModelResponse
from pydantic_ai.models.openai import OpenAIModel
class OpenRouterModel(OpenAIModel):
def _process_response(self, response: chat.ChatCompletion) -> ModelResponse:
model_response = super()._process_response(response=response)
openrouter_provider = response.provider if hasattr(response, "provider") else None
if openrouter_provider:
vendor_details = getattr(model_response, "vendor_details", {})
vendor_details["provider"] = openrouter_provider
return model_response
References
No response
Metadata
Metadata
Assignees
Labels
Feature requestNew feature requestNew feature request