addressing comments

This commit is contained in:
lorenzejay
2026-05-21 16:11:15 -07:00
parent 4b08a8308d
commit 3349cfcb92
3 changed files with 51 additions and 2 deletions

View File

@@ -0,0 +1,46 @@
#!/usr/bin/env python
"""Minimal Flow runner: Agent.kickoff() + response_format + tool.
cd lib/crewai
uv run python scripts/structured_output_with_tools_runner.py
"""
from pydantic import BaseModel, Field
from crewai import Agent
from crewai.flow import Flow, start
from crewai.tools import tool
class CalculationResult(BaseModel):
operation: str = Field(description="Operation performed")
result: int = Field(description="Numeric result")
explanation: str = Field(description="Short explanation")
@tool
def add_numbers(a: int, b: int) -> int:
"""Add two integers."""
return a + b
class StructuredOutputFlow(Flow):
@start()
def run(self):
agent = Agent(
role="Calculator",
goal="Use tools and return structured results",
backstory="Compute with tools, then answer in the required schema.",
tools=[add_numbers],
verbose=True,
llm='anthropic/claude-sonnet-4-6'
)
return agent.kickoff(
"Use add_numbers to compute 15 + 27.",
response_format=CalculationResult,
)
if __name__ == "__main__":
result = StructuredOutputFlow().kickoff()
print(result.pydantic)

View File

@@ -1694,7 +1694,8 @@ class Agent(BaseAgent):
try:
formatted_result = response_format.model_validate_json(raw_output)
except ValidationError:
pass
# Direct JSON validation failed; fall back to converter-based parsing below.
formatted_result = None
if formatted_result is None:
try:
@@ -1715,6 +1716,7 @@ class Agent(BaseAgent):
if isinstance(conversion_result, BaseModel):
formatted_result = conversion_result
except ConverterError:
# Conversion failure is non-fatal; raw output is preserved below.
pass
else:
raw_output = str(output) if not isinstance(output, str) else output

View File

@@ -644,7 +644,8 @@ class LiteAgent(FlowTrackable, BaseModel):
str(agent_finish.output)
)
except ValidationError:
pass
# Direct JSON validation failed; fall back to converter-based parsing below.
formatted_result = None
if formatted_result is None:
try: