-
Notifications
You must be signed in to change notification settings - Fork 2.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix structured outputs on various models #2109
base: main
Are you sure you want to change the base?
Conversation
…gno-agi/agno into fix-structured-output
@@ -100,6 +100,9 @@ def request_kwargs(self) -> Dict[str, Any]: | |||
if self.presence_penalty: | |||
_request_params["presence_penalty"] = self.presence_penalty | |||
|
|||
if self.response_format: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The response_model
should be set at the Agent level. We should make sure it is consistent for each provider
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What goes to the model is only response_format
and whether to use structured_output
or not. We don't send the field response_model
, that is only used in the agent.
@@ -38,6 +38,8 @@ class AzureOpenAI(OpenAILike): | |||
name: str = "AzureOpenAI" | |||
provider: str = "Azure" | |||
|
|||
supports_structured_outputs: bool = True |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like we are just defining this field and not using it anywhere
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This logic in the agent is the important part.
# Update the response_format on the Model
if self.response_model is not None:
# This will pass the pydantic model to the model
if self.structured_outputs and self.model.supports_structured_outputs:
logger.debug("Setting Model.response_format to Agent.response_model")
self.model.response_format = self.response_model
self.model.structured_outputs = True
else:
# Otherwise we just want JSON
self.model.response_format = {"type": "json_object"}
else:
self.model.response_format = None
If we don't set the flag in the model, then it will default to json mode, which MIGHT work, but the native support should be better. The naming we use is... confusing.
Description
This addresses structured output not behaving exactly correct on multiple models
fixes: #2099
Type of change
Please check the options that are relevant:
Checklist
./scripts/format.sh
and./scripts/validate.sh
to ensure code is formatted and linted.Additional Notes
Include any deployment notes, performance implications, security considerations, or other relevant information (e.g., screenshots or logs if applicable).