diff --git a/examples/aimlapi/toolcall.php b/examples/aimlapi/toolcall.php index 65f96cb61..26709108f 100644 --- a/examples/aimlapi/toolcall.php +++ b/examples/aimlapi/toolcall.php @@ -24,7 +24,7 @@ $wikipedia = new Wikipedia(http_client()); $toolbox = new Toolbox([$wikipedia], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'google/gemini-2.5-flash', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'google/gemini-2.5-flash', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('Who is the current chancellor of Germany?')); $result = $agent->call($messages); diff --git a/examples/anthropic/token-metadata.php b/examples/anthropic/token-metadata.php index 08e074719..34c73436f 100644 --- a/examples/anthropic/token-metadata.php +++ b/examples/anthropic/token-metadata.php @@ -19,7 +19,7 @@ $platform = PlatformFactory::create(env('ANTHROPIC_API_KEY'), http_client()); -$agent = new Agent($platform, 'claude-3-5-sonnet-20241022', outputProcessors: [new TokenOutputProcessor()], logger: logger()); +$agent = new Agent($platform, 'claude-3-5-sonnet-20241022', outputProcessors: [new TokenOutputProcessor()]); $messages = new MessageBag( Message::forSystem('You are a pirate and you write funny.'), Message::ofUser('What is the Symfony framework?'), diff --git a/examples/anthropic/toolcall.php b/examples/anthropic/toolcall.php index a3b500119..ea5127cb9 100644 --- a/examples/anthropic/toolcall.php +++ b/examples/anthropic/toolcall.php @@ -24,7 +24,7 @@ $wikipedia = new Wikipedia(http_client()); $toolbox = new Toolbox([$wikipedia], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'claude-3-5-sonnet-20241022', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'claude-3-5-sonnet-20241022', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('Who is the current chancellor of Germany?')); $result = $agent->call($messages); diff --git a/examples/bedrock/toolcall-claude.php b/examples/bedrock/toolcall-claude.php index 62a5f1c18..6370c2858 100644 --- a/examples/bedrock/toolcall-claude.php +++ b/examples/bedrock/toolcall-claude.php @@ -30,7 +30,7 @@ $wikipedia = new Wikipedia(http_client()); $toolbox = new Toolbox([$wikipedia]); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'claude-3-7-sonnet-20250219', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'claude-3-7-sonnet-20250219', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('Who is the current chancellor of Germany?')); $result = $agent->call($messages); diff --git a/examples/bedrock/toolcall-nova.php b/examples/bedrock/toolcall-nova.php index 6ce64fe14..67f375cfa 100644 --- a/examples/bedrock/toolcall-nova.php +++ b/examples/bedrock/toolcall-nova.php @@ -30,7 +30,7 @@ $wikipedia = new Wikipedia(http_client()); $toolbox = new Toolbox([$wikipedia]); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'nova-pro', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'nova-pro', [$processor], [$processor]); $messages = new MessageBag( Message::ofUser('Who is the current chancellor of Germany? Use Wikipedia to find the answer.') diff --git a/examples/chat/persistent-chat.php b/examples/chat/persistent-chat.php index a4a351dd4..cfe46a91c 100644 --- a/examples/chat/persistent-chat.php +++ b/examples/chat/persistent-chat.php @@ -20,7 +20,7 @@ $platform = PlatformFactory::create(env('OPENAI_API_KEY'), http_client()); -$agent = new Agent($platform, 'gpt-4o-mini', logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini'); $chat = new Chat($agent, new InMemoryStore()); $messages = new MessageBag( diff --git a/examples/dockermodelrunner/chat.php b/examples/dockermodelrunner/chat.php index 7189f984d..6afd693b2 100644 --- a/examples/dockermodelrunner/chat.php +++ b/examples/dockermodelrunner/chat.php @@ -18,7 +18,7 @@ $platform = PlatformFactory::create(env('DOCKER_MODEL_RUNNER_HOST_URL'), http_client()); -$agent = new Agent($platform, 'ai/gemma3n', logger: logger()); +$agent = new Agent($platform, 'ai/gemma3n'); $messages = new MessageBag( Message::forSystem('You are a pirate and you write funny.'), Message::ofUser('What is the Symfony framework?'), diff --git a/examples/dockermodelrunner/toolcall.php b/examples/dockermodelrunner/toolcall.php index 52d8b13fc..73b55b379 100644 --- a/examples/dockermodelrunner/toolcall.php +++ b/examples/dockermodelrunner/toolcall.php @@ -24,7 +24,7 @@ $wikipedia = new Wikipedia(http_client()); $toolbox = new Toolbox([$wikipedia]); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'ai/gemma3n', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'ai/gemma3n', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('Who is the actual Prime Minister of France?')); $result = $agent->call($messages); diff --git a/examples/gemini/server-tools.php b/examples/gemini/server-tools.php index 16bffc736..71420677d 100644 --- a/examples/gemini/server-tools.php +++ b/examples/gemini/server-tools.php @@ -23,7 +23,7 @@ $toolbox = new Toolbox([new Clock()], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gemini-2.5-pro-preview-03-25', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gemini-2.5-pro-preview-03-25', [$processor], [$processor]); $messages = new MessageBag( Message::ofUser( diff --git a/examples/gemini/structured-output-clock.php b/examples/gemini/structured-output-clock.php index bed2d07bb..11b371821 100644 --- a/examples/gemini/structured-output-clock.php +++ b/examples/gemini/structured-output-clock.php @@ -27,7 +27,7 @@ $toolbox = new Toolbox([$clock]); $toolProcessor = new ToolProcessor($toolbox); $structuredOutputProcessor = new StructuredOutputProcessor(); -$agent = new Agent($platform, 'gemini-1.5-flash', [$toolProcessor, $structuredOutputProcessor], [$toolProcessor, $structuredOutputProcessor], logger: logger()); +$agent = new Agent($platform, 'gemini-1.5-flash', [$toolProcessor, $structuredOutputProcessor], [$toolProcessor, $structuredOutputProcessor]); $messages = new MessageBag(Message::ofUser('What date and time is it?')); $result = $agent->call($messages, ['response_format' => [ diff --git a/examples/gemini/structured-output-math.php b/examples/gemini/structured-output-math.php index a2ef4095d..5b9536b3d 100644 --- a/examples/gemini/structured-output-math.php +++ b/examples/gemini/structured-output-math.php @@ -21,7 +21,7 @@ $platform = PlatformFactory::create(env('GEMINI_API_KEY'), http_client()); $processor = new AgentProcessor(); -$agent = new Agent($platform, 'gemini-1.5-flash', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gemini-1.5-flash', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('You are a helpful math tutor. Guide the user through the solution step by step.'), Message::ofUser('how can I solve 8x + 7 = -23'), diff --git a/examples/gemini/token-metadata.php b/examples/gemini/token-metadata.php index 08f4f6e99..f0922dd9b 100644 --- a/examples/gemini/token-metadata.php +++ b/examples/gemini/token-metadata.php @@ -19,7 +19,7 @@ $platform = PlatformFactory::create(env('GEMINI_API_KEY'), http_client()); -$agent = new Agent($platform, 'gemini-2.0-flash', outputProcessors: [new TokenOutputProcessor()], logger: logger()); +$agent = new Agent($platform, 'gemini-2.0-flash', outputProcessors: [new TokenOutputProcessor()]); $messages = new MessageBag( Message::forSystem('You are a pirate and you write funny.'), Message::ofUser('What is the Symfony framework?'), diff --git a/examples/gemini/toolcall.php b/examples/gemini/toolcall.php index 598ee53c4..368c632d8 100644 --- a/examples/gemini/toolcall.php +++ b/examples/gemini/toolcall.php @@ -23,7 +23,7 @@ $toolbox = new Toolbox([new Clock()], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gemini-2.0-flash', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gemini-2.0-flash', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('What time is it?')); $result = $agent->call($messages); diff --git a/examples/memory/mariadb.php b/examples/memory/mariadb.php index ebb2ea778..d3641098c 100644 --- a/examples/memory/mariadb.php +++ b/examples/memory/mariadb.php @@ -65,7 +65,7 @@ $embeddingsMemory = new EmbeddingProvider($platform, $embeddingsModel, $store); $memoryProcessor = new MemoryInputProcessor($embeddingsMemory); -$agent = new Agent($platform, 'gpt-4o-mini', [$memoryProcessor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$memoryProcessor]); $messages = new MessageBag(Message::ofUser('Have we discussed about my friend John in the past? If yes, what did we talk about?')); $result = $agent->call($messages); diff --git a/examples/memory/static.php b/examples/memory/static.php index db9f74341..8b751b03a 100644 --- a/examples/memory/static.php +++ b/examples/memory/static.php @@ -30,7 +30,7 @@ ); $memoryProcessor = new MemoryInputProcessor($personalFacts); -$agent = new Agent($platform, 'gpt-4o-mini', [$systemPromptProcessor, $memoryProcessor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$systemPromptProcessor, $memoryProcessor]); $messages = new MessageBag(Message::ofUser('What do we do today?')); $result = $agent->call($messages); diff --git a/examples/misc/chat-system-prompt.php b/examples/misc/chat-system-prompt.php index b8f411bfa..6fd809bbf 100644 --- a/examples/misc/chat-system-prompt.php +++ b/examples/misc/chat-system-prompt.php @@ -21,7 +21,7 @@ $processor = new SystemPromptInputProcessor('You are Yoda and write like he speaks. But short.'); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor]); $messages = new MessageBag(Message::ofUser('What is the meaning of life?')); $result = $agent->call($messages); diff --git a/examples/misc/prompt-json-file.php b/examples/misc/prompt-json-file.php index f02c5f787..b5ee0d36a 100644 --- a/examples/misc/prompt-json-file.php +++ b/examples/misc/prompt-json-file.php @@ -24,7 +24,7 @@ $promptFile = File::fromFile(dirname(__DIR__, 2).'/fixtures/prompts/code-reviewer.json'); $systemPromptProcessor = new SystemPromptInputProcessor($promptFile); -$agent = new Agent($platform, 'gpt-4o-mini', [$systemPromptProcessor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$systemPromptProcessor]); $messages = new MessageBag(Message::ofUser('Review this code: function add($a, $b) { return $a + $b; }')); $result = $agent->call($messages); diff --git a/examples/misc/prompt-text-file.php b/examples/misc/prompt-text-file.php index e30513ba3..bc8b3e612 100644 --- a/examples/misc/prompt-text-file.php +++ b/examples/misc/prompt-text-file.php @@ -24,7 +24,7 @@ $promptFile = File::fromFile(dirname(__DIR__, 2).'/fixtures/prompts/helpful-assistant.txt'); $systemPromptProcessor = new SystemPromptInputProcessor($promptFile); -$agent = new Agent($platform, 'gpt-4o-mini', [$systemPromptProcessor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$systemPromptProcessor]); $messages = new MessageBag(Message::ofUser('Can you explain what dependency injection is?')); $result = $agent->call($messages); diff --git a/examples/mistral/structured-output-math.php b/examples/mistral/structured-output-math.php index a49490e05..dd5244bdc 100644 --- a/examples/mistral/structured-output-math.php +++ b/examples/mistral/structured-output-math.php @@ -27,7 +27,7 @@ $serializer = new Serializer([new ObjectNormalizer()], [new JsonEncoder()]); $processor = new AgentProcessor(new ResponseFormatFactory(), $serializer); -$agent = new Agent($platform, 'mistral-small-latest', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'mistral-small-latest', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('You are a helpful math tutor. Guide the user through the solution step by step.'), Message::ofUser('how can I solve 8x + 7 = -23'), diff --git a/examples/mistral/token-metadata.php b/examples/mistral/token-metadata.php index 46f992f5b..cf2d7ea7e 100644 --- a/examples/mistral/token-metadata.php +++ b/examples/mistral/token-metadata.php @@ -19,7 +19,7 @@ $platform = PlatformFactory::create(env('MISTRAL_API_KEY'), http_client()); -$agent = new Agent($platform, 'mistral-large-latest', outputProcessors: [new TokenOutputProcessor()], logger: logger()); +$agent = new Agent($platform, 'mistral-large-latest', outputProcessors: [new TokenOutputProcessor()]); $messages = new MessageBag( Message::forSystem('You are a pirate and you write funny.'), diff --git a/examples/mistral/toolcall-stream.php b/examples/mistral/toolcall-stream.php index a3e271e6e..2ae6c4660 100644 --- a/examples/mistral/toolcall-stream.php +++ b/examples/mistral/toolcall-stream.php @@ -24,7 +24,7 @@ $transcriber = new YouTubeTranscriber(http_client()); $toolbox = new Toolbox([$transcriber], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'mistral-large-latest', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'mistral-large-latest', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('Please summarize this video for me: https://www.youtube.com/watch?v=6uXW-ulpj0s')); $result = $agent->call($messages, [ diff --git a/examples/mistral/toolcall.php b/examples/mistral/toolcall.php index d2009a386..13b1a2a38 100644 --- a/examples/mistral/toolcall.php +++ b/examples/mistral/toolcall.php @@ -23,7 +23,7 @@ $toolbox = new Toolbox([new Clock()], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'mistral-large-latest', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'mistral-large-latest', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('What time is it?')); $result = $agent->call($messages); diff --git a/examples/multi-agent/orchestrator.php b/examples/multi-agent/orchestrator.php index 4cdcde1dd..3b63cd992 100644 --- a/examples/multi-agent/orchestrator.php +++ b/examples/multi-agent/orchestrator.php @@ -31,7 +31,6 @@ 'gpt-4o-mini', [new SystemPromptInputProcessor('You are an intelligent agent orchestrator that routes user questions to specialized agents.'), $structuredOutputProcessor], [$structuredOutputProcessor], - logger: logger() ); // Create technical agent for handling technical issues @@ -40,7 +39,6 @@ 'gpt-4o-mini?max_tokens=150', // set max_tokens here to be faster and cheaper [new SystemPromptInputProcessor('You are a technical support specialist. Help users resolve bugs, problems, and technical errors.')], name: 'technical', - logger: logger() ); // Create general agent for handling any other questions @@ -49,7 +47,6 @@ 'gpt-4o-mini', [new SystemPromptInputProcessor('You are a helpful general assistant. Assist users with any questions or tasks they may have. You should never ever answer technical question.')], name: 'fallback', - logger: logger() ); $multiAgent = new MultiAgent( diff --git a/examples/ollama/rag.php b/examples/ollama/rag.php index 28832b94a..df6990618 100644 --- a/examples/ollama/rag.php +++ b/examples/ollama/rag.php @@ -49,7 +49,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, env('OLLAMA_LLM'), [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, env('OLLAMA_LLM'), [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/ollama/structured-output-math.php b/examples/ollama/structured-output-math.php index ff45ab574..93f6b4006 100644 --- a/examples/ollama/structured-output-math.php +++ b/examples/ollama/structured-output-math.php @@ -21,7 +21,7 @@ $platform = PlatformFactory::create(env('OLLAMA_HOST_URL'), http_client()); $processor = new AgentProcessor(); -$agent = new Agent($platform, env('OLLAMA_LLM'), [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, env('OLLAMA_LLM'), [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('You are a helpful math tutor. Guide the user through the solution step by step.'), Message::ofUser('how can I solve 8x + 7 = -23'), diff --git a/examples/ollama/toolcall.php b/examples/ollama/toolcall.php index c34037f12..4b24c6d6a 100644 --- a/examples/ollama/toolcall.php +++ b/examples/ollama/toolcall.php @@ -23,7 +23,7 @@ $toolbox = new Toolbox([new Clock()], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, env('OLLAMA_LLM'), [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, env('OLLAMA_LLM'), [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('What time is it?')); $result = $agent->call($messages); diff --git a/examples/openai/agent-as-tool.php b/examples/openai/agent-as-tool.php index 978fbfbd1..2cd0fb643 100644 --- a/examples/openai/agent-as-tool.php +++ b/examples/openai/agent-as-tool.php @@ -27,7 +27,7 @@ // Create a specialized agent for mathematical calculations $mathSystemPrompt = new SystemPromptInputProcessor('You are a mathematical calculator. When given a math problem, solve it and return only the numerical result with a brief explanation.'); -$mathAgent = new Agent($platform, 'gpt-4o', [$mathSystemPrompt], logger: logger()); +$mathAgent = new Agent($platform, 'gpt-4o', [$mathSystemPrompt]); // Wrap the math agent as a tool $mathTool = new AgentTool($mathAgent); @@ -49,7 +49,7 @@ // Create the main agent with the math agent as a tool $toolbox = new Toolbox([$mathTool], toolFactory: $chainFactory, logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); // Ask a question that requires mathematical calculation $messages = new MessageBag(Message::ofUser('I have 15 apples and I want to share them equally among 4 friends. How many apples does each friend get and how many are left over?')); diff --git a/examples/openai/chat-o1.php b/examples/openai/chat-o1.php index e747580f9..67287517a 100644 --- a/examples/openai/chat-o1.php +++ b/examples/openai/chat-o1.php @@ -32,7 +32,7 @@ at the beginning and end, not throughout the code. PROMPT; -$agent = new Agent($platform, 'o1-preview', logger: logger()); +$agent = new Agent($platform, 'o1-preview'); $result = $agent->call(new MessageBag(Message::ofUser($prompt))); echo $result->getContent().\PHP_EOL; diff --git a/examples/openai/structured-output-list-of-polymorphic-items.php b/examples/openai/structured-output-list-of-polymorphic-items.php index def7afdd8..283ca1f14 100644 --- a/examples/openai/structured-output-list-of-polymorphic-items.php +++ b/examples/openai/structured-output-list-of-polymorphic-items.php @@ -20,7 +20,7 @@ $platform = PlatformFactory::create(env('OPENAI_API_KEY'), http_client()); $processor = new AgentProcessor(); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('You are a persona data collector! Return all the data you can gather from the user input.'), Message::ofUser('Hi! My name is John Doe, I am 30 years old and I live in Paris.'), diff --git a/examples/openai/structured-output-math.php b/examples/openai/structured-output-math.php index 7c0e0ad9d..e6e20968a 100644 --- a/examples/openai/structured-output-math.php +++ b/examples/openai/structured-output-math.php @@ -20,7 +20,7 @@ $platform = PlatformFactory::create(env('OPENAI_API_KEY'), http_client()); $processor = new AgentProcessor(); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('You are a helpful math tutor. Guide the user through the solution step by step.'), Message::ofUser('how can I solve 8x + 7 = -23'), diff --git a/examples/openai/structured-output-union-types.php b/examples/openai/structured-output-union-types.php index 42c685925..407cd79e0 100644 --- a/examples/openai/structured-output-union-types.php +++ b/examples/openai/structured-output-union-types.php @@ -20,7 +20,7 @@ $platform = PlatformFactory::create(env('OPENAI_API_KEY'), http_client()); $processor = new AgentProcessor(); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem(<<call($messages); diff --git a/examples/perplexity/academic-search.php b/examples/perplexity/academic-search.php index e37d55325..878def954 100644 --- a/examples/perplexity/academic-search.php +++ b/examples/perplexity/academic-search.php @@ -18,7 +18,7 @@ require_once dirname(__DIR__).'/bootstrap.php'; $platform = PlatformFactory::create(env('PERPLEXITY_API_KEY'), http_client()); -$agent = new Agent($platform, 'sonar', outputProcessors: [new SearchResultProcessor()], logger: logger()); +$agent = new Agent($platform, 'sonar', outputProcessors: [new SearchResultProcessor()]); $messages = new MessageBag(Message::ofUser('What is the best French cheese of the first quarter-century of 21st century?')); $response = $agent->call($messages, [ diff --git a/examples/perplexity/image-input-url.php b/examples/perplexity/image-input-url.php index 11fdeb03f..b07c08592 100644 --- a/examples/perplexity/image-input-url.php +++ b/examples/perplexity/image-input-url.php @@ -19,7 +19,7 @@ require_once dirname(__DIR__).'/bootstrap.php'; $platform = PlatformFactory::create(env('PERPLEXITY_API_KEY'), http_client()); -$agent = new Agent($platform, 'sonar', outputProcessors: [new SearchResultProcessor()], logger: logger()); +$agent = new Agent($platform, 'sonar', outputProcessors: [new SearchResultProcessor()]); $messages = new MessageBag( Message::forSystem('You are an image analyzer bot that helps identify the content of images.'), diff --git a/examples/perplexity/pdf-input-url.php b/examples/perplexity/pdf-input-url.php index c6431e548..b070c4cfa 100644 --- a/examples/perplexity/pdf-input-url.php +++ b/examples/perplexity/pdf-input-url.php @@ -19,7 +19,7 @@ require_once dirname(__DIR__).'/bootstrap.php'; $platform = PlatformFactory::create(env('PERPLEXITY_API_KEY'), http_client()); -$agent = new Agent($platform, 'sonar', outputProcessors: [new SearchResultProcessor()], logger: logger()); +$agent = new Agent($platform, 'sonar', outputProcessors: [new SearchResultProcessor()]); $messages = new MessageBag( Message::ofUser( diff --git a/examples/perplexity/stream.php b/examples/perplexity/stream.php index 762c7f051..f7b03ea03 100644 --- a/examples/perplexity/stream.php +++ b/examples/perplexity/stream.php @@ -18,7 +18,7 @@ require_once dirname(__DIR__).'/bootstrap.php'; $platform = PlatformFactory::create(env('PERPLEXITY_API_KEY'), http_client()); -$agent = new Agent($platform, 'sonar', outputProcessors: [new SearchResultProcessor()], logger: logger()); +$agent = new Agent($platform, 'sonar', outputProcessors: [new SearchResultProcessor()]); $messages = new MessageBag( Message::forSystem('You are a thoughtful philosopher.'), diff --git a/examples/perplexity/token-metadata.php b/examples/perplexity/token-metadata.php index f92db5a5a..0c8659f44 100644 --- a/examples/perplexity/token-metadata.php +++ b/examples/perplexity/token-metadata.php @@ -18,7 +18,7 @@ require_once dirname(__DIR__).'/bootstrap.php'; $platform = PlatformFactory::create(env('PERPLEXITY_API_KEY'), http_client()); -$agent = new Agent($platform, 'sonar', outputProcessors: [new TokenOutputProcessor()], logger: logger()); +$agent = new Agent($platform, 'sonar', outputProcessors: [new TokenOutputProcessor()]); $messages = new MessageBag( Message::forSystem('You are a pirate and you write funny.'), diff --git a/examples/rag/cache.php b/examples/rag/cache.php index 432ba99b2..849931e7f 100644 --- a/examples/rag/cache.php +++ b/examples/rag/cache.php @@ -50,7 +50,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/chromadb.php b/examples/rag/chromadb.php index 224851786..5272a29e0 100644 --- a/examples/rag/chromadb.php +++ b/examples/rag/chromadb.php @@ -57,7 +57,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/clickhouse.php b/examples/rag/clickhouse.php index 388e2f9dd..70d7891cc 100644 --- a/examples/rag/clickhouse.php +++ b/examples/rag/clickhouse.php @@ -57,7 +57,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/cloudflare.php b/examples/rag/cloudflare.php index a8a067487..83dfbab22 100644 --- a/examples/rag/cloudflare.php +++ b/examples/rag/cloudflare.php @@ -57,7 +57,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/in-memory.php b/examples/rag/in-memory.php index 7a7ee4dd7..47f9e4b06 100644 --- a/examples/rag/in-memory.php +++ b/examples/rag/in-memory.php @@ -49,7 +49,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/mariadb-gemini.php b/examples/rag/mariadb-gemini.php index d17f731de..3d6bf0d52 100644 --- a/examples/rag/mariadb-gemini.php +++ b/examples/rag/mariadb-gemini.php @@ -59,7 +59,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gemini-2.0-flash-lite-preview-02-05', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gemini-2.0-flash-lite-preview-02-05', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/mariadb-openai.php b/examples/rag/mariadb-openai.php index 6a189be63..4eab37093 100644 --- a/examples/rag/mariadb-openai.php +++ b/examples/rag/mariadb-openai.php @@ -58,7 +58,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/meilisearch.php b/examples/rag/meilisearch.php index 844b7a732..364317651 100644 --- a/examples/rag/meilisearch.php +++ b/examples/rag/meilisearch.php @@ -57,7 +57,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/milvus.php b/examples/rag/milvus.php index 8051424d0..61404d597 100644 --- a/examples/rag/milvus.php +++ b/examples/rag/milvus.php @@ -58,7 +58,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/mongodb.php b/examples/rag/mongodb.php index 68be627b0..23dc60e26 100644 --- a/examples/rag/mongodb.php +++ b/examples/rag/mongodb.php @@ -59,7 +59,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/pinecone.php b/examples/rag/pinecone.php index b2063de06..1c352f4d6 100644 --- a/examples/rag/pinecone.php +++ b/examples/rag/pinecone.php @@ -50,7 +50,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/postgres.php b/examples/rag/postgres.php index 1e59b6b29..2e735c543 100644 --- a/examples/rag/postgres.php +++ b/examples/rag/postgres.php @@ -57,7 +57,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/qdrant.php b/examples/rag/qdrant.php index 2e9a60e76..e447a09e5 100644 --- a/examples/rag/qdrant.php +++ b/examples/rag/qdrant.php @@ -57,7 +57,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/redis.php b/examples/rag/redis.php index 59b61708f..a0d1ca7f4 100644 --- a/examples/rag/redis.php +++ b/examples/rag/redis.php @@ -60,7 +60,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/typesense.php b/examples/rag/typesense.php index 3778bcdc3..5882d57eb 100644 --- a/examples/rag/typesense.php +++ b/examples/rag/typesense.php @@ -57,7 +57,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/rag/weaviate.php b/examples/rag/weaviate.php index 8b97bb16c..ceb6ff874 100644 --- a/examples/rag/weaviate.php +++ b/examples/rag/weaviate.php @@ -58,7 +58,7 @@ $similaritySearch = new SimilaritySearch($vectorizer, $store); $toolbox = new Toolbox([$similaritySearch], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('Please answer all user questions only using SimilaritySearch function.'), diff --git a/examples/scaleway/structured-output-math.php b/examples/scaleway/structured-output-math.php index 9bd65b0d7..465c2c2b9 100644 --- a/examples/scaleway/structured-output-math.php +++ b/examples/scaleway/structured-output-math.php @@ -21,7 +21,7 @@ $platform = PlatformFactory::create(env('SCALEWAY_SECRET_KEY'), http_client()); $processor = new AgentProcessor(); -$agent = new Agent($platform, 'gpt-oss-120b', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-oss-120b', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('You are a helpful math tutor. Guide the user through the solution step by step.'), Message::ofUser('how can I solve 8x + 7 = -23'), diff --git a/examples/scaleway/toolcall-stream.php b/examples/scaleway/toolcall-stream.php index a94eab220..5a02b902c 100644 --- a/examples/scaleway/toolcall-stream.php +++ b/examples/scaleway/toolcall-stream.php @@ -24,7 +24,7 @@ $transcriber = new YouTubeTranscriber(http_client()); $toolbox = new Toolbox([$transcriber], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-oss-120b', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-oss-120b', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('Please summarize this video for me: https://www.youtube.com/watch?v=6uXW-ulpj0s')); $result = $agent->call($messages, ['stream' => true]); diff --git a/examples/scaleway/toolcall.php b/examples/scaleway/toolcall.php index 0e1782274..e11c4837b 100644 --- a/examples/scaleway/toolcall.php +++ b/examples/scaleway/toolcall.php @@ -24,7 +24,7 @@ $transcriber = new YouTubeTranscriber(http_client()); $toolbox = new Toolbox([$transcriber], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-oss-120b', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-oss-120b', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('Please summarize this video for me: https://www.youtube.com/watch?v=6uXW-ulpj0s')); $result = $agent->call($messages); diff --git a/examples/toolbox/brave.php b/examples/toolbox/brave.php index 5ebc6101f..43efa2ccb 100644 --- a/examples/toolbox/brave.php +++ b/examples/toolbox/brave.php @@ -26,7 +26,7 @@ $crawler = new Crawler(http_client()); $toolbox = new Toolbox([$brave, $crawler], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('What was the latest game result of Dallas Cowboys?')); $result = $agent->call($messages); diff --git a/examples/toolbox/clock.php b/examples/toolbox/clock.php index a2a688026..9a6565101 100644 --- a/examples/toolbox/clock.php +++ b/examples/toolbox/clock.php @@ -26,7 +26,7 @@ ->addTool(Clock::class, 'clock', 'Get the current date and time', 'now'); $toolbox = new Toolbox([new Clock()], $metadataFactory, logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('What date and time is it?')); $result = $agent->call($messages); diff --git a/examples/toolbox/mapbox-geocode.php b/examples/toolbox/mapbox-geocode.php index 69f474aa2..2b43033a0 100644 --- a/examples/toolbox/mapbox-geocode.php +++ b/examples/toolbox/mapbox-geocode.php @@ -24,7 +24,7 @@ $mapbox = new Mapbox(http_client(), env('MAPBOX_ACCESS_TOKEN')); $toolbox = new Toolbox([$mapbox], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('What are the coordinates of Brandenburg Gate in Berlin?')); $result = $agent->call($messages); diff --git a/examples/toolbox/mapbox-reverse-geocode.php b/examples/toolbox/mapbox-reverse-geocode.php index 254d910e2..b205b4c45 100644 --- a/examples/toolbox/mapbox-reverse-geocode.php +++ b/examples/toolbox/mapbox-reverse-geocode.php @@ -24,7 +24,7 @@ $mapbox = new Mapbox(http_client(), env('MAPBOX_ACCESS_TOKEN')); $toolbox = new Toolbox([$mapbox], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('What address is at coordinates longitude -73.985131, latitude 40.758895?')); $result = $agent->call($messages); diff --git a/examples/toolbox/serpapi.php b/examples/toolbox/serpapi.php index a4bff0a5b..38b65677d 100644 --- a/examples/toolbox/serpapi.php +++ b/examples/toolbox/serpapi.php @@ -24,7 +24,7 @@ $serpApi = new SerpApi(http_client(), env('SERP_API_KEY')); $toolbox = new Toolbox([$serpApi], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('Who is the current chancellor of Germany?')); $result = $agent->call($messages); diff --git a/examples/toolbox/tavily.php b/examples/toolbox/tavily.php index 0f5fb539f..c9f8c06a7 100644 --- a/examples/toolbox/tavily.php +++ b/examples/toolbox/tavily.php @@ -24,7 +24,7 @@ $tavily = new Tavily(http_client(), env('TAVILY_API_KEY')); $toolbox = new Toolbox([$tavily], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('What was the latest game result of Dallas Cowboys?')); $result = $agent->call($messages); diff --git a/examples/toolbox/weather-event.php b/examples/toolbox/weather-event.php index ecb5d5a2c..2773c9d1a 100644 --- a/examples/toolbox/weather-event.php +++ b/examples/toolbox/weather-event.php @@ -28,7 +28,7 @@ $toolbox = new Toolbox([$openMeteo], logger: logger()); $eventDispatcher = new EventDispatcher(); $processor = new AgentProcessor($toolbox, eventDispatcher: $eventDispatcher); -$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gpt-4o-mini', [$processor], [$processor]); // Add tool call result listener to enforce chain exits direct with structured response for weather tools $eventDispatcher->addListener(ToolCallsExecuted::class, function (ToolCallsExecuted $event): void { diff --git a/examples/vertexai/structured-output-clock.php b/examples/vertexai/structured-output-clock.php index 840a21596..222eebaa6 100644 --- a/examples/vertexai/structured-output-clock.php +++ b/examples/vertexai/structured-output-clock.php @@ -27,7 +27,7 @@ $toolbox = new Toolbox([$clock]); $toolProcessor = new ToolProcessor($toolbox); $structuredOutputProcessor = new StructuredOutputProcessor(); -$agent = new Agent($platform, 'gemini-2.5-pro', [$toolProcessor, $structuredOutputProcessor], [$toolProcessor, $structuredOutputProcessor], logger: logger()); +$agent = new Agent($platform, 'gemini-2.5-pro', [$toolProcessor, $structuredOutputProcessor], [$toolProcessor, $structuredOutputProcessor]); $messages = new MessageBag(Message::ofUser('What date and time is it?')); $result = $agent->call($messages, ['response_format' => [ diff --git a/examples/vertexai/structured-output-math.php b/examples/vertexai/structured-output-math.php index 8ca97c801..bb3ce8c6d 100644 --- a/examples/vertexai/structured-output-math.php +++ b/examples/vertexai/structured-output-math.php @@ -21,7 +21,7 @@ $platform = PlatformFactory::create(env('GOOGLE_CLOUD_LOCATION'), env('GOOGLE_CLOUD_PROJECT'), adc_aware_http_client()); $processor = new AgentProcessor(); -$agent = new Agent($platform, 'gemini-2.5-flash-lite', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gemini-2.5-flash-lite', [$processor], [$processor]); $messages = new MessageBag( Message::forSystem('You are a helpful math tutor. Guide the user through the solution step by step.'), Message::ofUser('how can I solve 8x + 7 = -23'), diff --git a/examples/vertexai/token-metadata.php b/examples/vertexai/token-metadata.php index 8ab02c10e..e6726e67f 100644 --- a/examples/vertexai/token-metadata.php +++ b/examples/vertexai/token-metadata.php @@ -19,7 +19,7 @@ $platform = PlatformFactory::create(env('GOOGLE_CLOUD_LOCATION'), env('GOOGLE_CLOUD_PROJECT'), adc_aware_http_client()); -$agent = new Agent($platform, 'gemini-2.0-flash-lite', outputProcessors: [new TokenOutputProcessor()], logger: logger()); +$agent = new Agent($platform, 'gemini-2.0-flash-lite', outputProcessors: [new TokenOutputProcessor()]); $messages = new MessageBag( Message::forSystem('You are an expert assistant in animal study.'), Message::ofUser('What does a cat usually eat?'), diff --git a/examples/vertexai/toolcall.php b/examples/vertexai/toolcall.php index 3d6201afa..09cb98167 100644 --- a/examples/vertexai/toolcall.php +++ b/examples/vertexai/toolcall.php @@ -23,7 +23,7 @@ $toolbox = new Toolbox([new Clock()], logger: logger()); $processor = new AgentProcessor($toolbox); -$agent = new Agent($platform, 'gemini-2.5-flash-lite', [$processor], [$processor], logger: logger()); +$agent = new Agent($platform, 'gemini-2.5-flash-lite', [$processor], [$processor]); $messages = new MessageBag(Message::ofUser('What time is it?')); $result = $agent->call($messages); diff --git a/src/agent/src/Agent.php b/src/agent/src/Agent.php index 1dbbe8404..e50eb8677 100644 --- a/src/agent/src/Agent.php +++ b/src/agent/src/Agent.php @@ -11,19 +11,13 @@ namespace Symfony\AI\Agent; -use Psr\Log\LoggerInterface; -use Psr\Log\NullLogger; use Symfony\AI\Agent\Exception\InvalidArgumentException; use Symfony\AI\Agent\Exception\MissingModelSupportException; use Symfony\AI\Agent\Exception\RuntimeException; -use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\ExceptionInterface; use Symfony\AI\Platform\Message\MessageBag; -use Symfony\AI\Platform\Model; use Symfony\AI\Platform\PlatformInterface; use Symfony\AI\Platform\Result\ResultInterface; -use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface; -use Symfony\Contracts\HttpClient\Exception\HttpExceptionInterface; /** * @author Christopher Hertel @@ -51,15 +45,14 @@ public function __construct( iterable $inputProcessors = [], iterable $outputProcessors = [], private string $name = 'agent', - private LoggerInterface $logger = new NullLogger(), ) { $this->inputProcessors = $this->initializeProcessors($inputProcessors, InputProcessorInterface::class); $this->outputProcessors = $this->initializeProcessors($outputProcessors, OutputProcessorInterface::class); } - public function getModel(): Model + public function getModel(): string { - return $this->platform->getModelCatalog()->getModel($this->model); + return $this->model; } public function getName(): string @@ -80,35 +73,16 @@ public function call(MessageBag $messages, array $options = []): ResultInterface $input = new Input($this->getModel(), $messages, $options); array_map(fn (InputProcessorInterface $processor) => $processor->processInput($input), $this->inputProcessors); - $model = $input->model; - $messages = $input->messages; + $model = $input->getModel(); + $messages = $input->getMessageBag(); $options = $input->getOptions(); - if ($messages->containsAudio() && !$model->supports(Capability::INPUT_AUDIO)) { - throw MissingModelSupportException::forAudioInput($model::class); - } - - if ($messages->containsImage() && !$model->supports(Capability::INPUT_IMAGE)) { - throw MissingModelSupportException::forImageInput($model::class); - } - - try { - $result = $this->platform->invoke($this->model, $messages, $options)->getResult(); - } catch (ClientExceptionInterface $e) { - $message = $e->getMessage(); - $content = $e->getResponse()->toArray(false); - - $this->logger->debug($message, $content); - - throw new InvalidArgumentException('' === $message ? 'Invalid request to model or platform' : $message, previous: $e); - } catch (HttpExceptionInterface $e) { - throw new RuntimeException('Failed to request model.', previous: $e); - } + $result = $this->platform->invoke($model, $messages, $options)->getResult(); $output = new Output($model, $result, $messages, $options); array_map(fn (OutputProcessorInterface $processor) => $processor->processOutput($output), $this->outputProcessors); - return $output->result; + return $output->getResult(); } /** diff --git a/src/agent/src/Input.php b/src/agent/src/Input.php index 0187a18af..6648b0d5c 100644 --- a/src/agent/src/Input.php +++ b/src/agent/src/Input.php @@ -12,7 +12,6 @@ namespace Symfony\AI\Agent; use Symfony\AI\Platform\Message\MessageBag; -use Symfony\AI\Platform\Model; /** * @author Christopher Hertel @@ -23,12 +22,32 @@ final class Input * @param array $options */ public function __construct( - public Model $model, - public MessageBag $messages, + private string $model, + private MessageBag $messageBag, private array $options = [], ) { } + public function getModel(): string + { + return $this->model; + } + + public function setModel(string $model): void + { + $this->model = $model; + } + + public function getMessageBag(): MessageBag + { + return $this->messageBag; + } + + public function setMessageBag(MessageBag $messageBag): void + { + $this->messageBag = $messageBag; + } + /** * @return array */ diff --git a/src/agent/src/InputProcessor/ModelOverrideInputProcessor.php b/src/agent/src/InputProcessor/ModelOverrideInputProcessor.php index f4e94e172..7d6869f22 100644 --- a/src/agent/src/InputProcessor/ModelOverrideInputProcessor.php +++ b/src/agent/src/InputProcessor/ModelOverrideInputProcessor.php @@ -14,7 +14,6 @@ use Symfony\AI\Agent\Exception\InvalidArgumentException; use Symfony\AI\Agent\Input; use Symfony\AI\Agent\InputProcessorInterface; -use Symfony\AI\Platform\Model; /** * @author Christopher Hertel @@ -29,10 +28,10 @@ public function processInput(Input $input): void return; } - if (!$options['model'] instanceof Model) { - throw new InvalidArgumentException(\sprintf('Option "model" must be an instance of "%s".', Model::class)); + if (!\is_string($options['model'])) { + throw new InvalidArgumentException('Option "model" must be a string.'); } - $input->model = $options['model']; + $input->setModel($options['model']); } } diff --git a/src/agent/src/InputProcessor/SystemPromptInputProcessor.php b/src/agent/src/InputProcessor/SystemPromptInputProcessor.php index f96e87071..b8f33d0f0 100644 --- a/src/agent/src/InputProcessor/SystemPromptInputProcessor.php +++ b/src/agent/src/InputProcessor/SystemPromptInputProcessor.php @@ -45,7 +45,7 @@ public function __construct( public function processInput(Input $input): void { - $messages = $input->messages; + $messages = $input->getMessageBag(); if (null !== $messages->getSystemMessage()) { $this->logger->debug('Skipping system prompt injection since MessageBag already contains a system message.'); @@ -85,6 +85,6 @@ public function processInput(Input $input): void PROMPT; } - $input->messages = $messages->prepend(Message::forSystem($message)); + $input->setMessageBag($messages->prepend(Message::forSystem($message))); } } diff --git a/src/agent/src/Memory/EmbeddingProvider.php b/src/agent/src/Memory/EmbeddingProvider.php index 4a54381c4..99266535e 100644 --- a/src/agent/src/Memory/EmbeddingProvider.php +++ b/src/agent/src/Memory/EmbeddingProvider.php @@ -34,7 +34,7 @@ public function __construct( public function load(Input $input): array { - $messages = $input->messages->getMessages(); + $messages = $input->getMessageBag()->getMessages(); /** @var MessageInterface|null $userMessage */ $userMessage = $messages[array_key_last($messages)] ?? null; diff --git a/src/agent/src/Memory/MemoryInputProcessor.php b/src/agent/src/Memory/MemoryInputProcessor.php index c70ad5da2..2c37bae82 100644 --- a/src/agent/src/Memory/MemoryInputProcessor.php +++ b/src/agent/src/Memory/MemoryInputProcessor.php @@ -69,17 +69,17 @@ public function processInput(Input $input): void return; } - $systemMessage = $input->messages->getSystemMessage()->content ?? ''; + $systemMessage = $input->getMessageBag()->getSystemMessage()->content ?? ''; $combinedMessage = self::MEMORY_PROMPT_MESSAGE.$memory; if ('' !== $systemMessage) { $combinedMessage .= \PHP_EOL.\PHP_EOL.'# System Prompt'.\PHP_EOL.\PHP_EOL.$systemMessage; } - $messages = $input->messages + $messages = $input->getMessageBag() ->withoutSystemMessage() ->prepend(Message::forSystem($combinedMessage)); - $input->messages = $messages; + $input->setMessageBag($messages); } } diff --git a/src/agent/src/Output.php b/src/agent/src/Output.php index 0e48f4c2a..d069d47a7 100644 --- a/src/agent/src/Output.php +++ b/src/agent/src/Output.php @@ -12,7 +12,6 @@ namespace Symfony\AI\Agent; use Symfony\AI\Platform\Message\MessageBag; -use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\ResultInterface; /** @@ -24,10 +23,38 @@ final class Output * @param array $options */ public function __construct( - public readonly Model $model, - public ResultInterface $result, - public readonly MessageBag $messages, - public readonly array $options = [], + private readonly string $model, + private ResultInterface $result, + private readonly MessageBag $messageBag, + private readonly array $options = [], ) { } + + public function getModel(): string + { + return $this->model; + } + + public function getResult(): ResultInterface + { + return $this->result; + } + + public function setResult(ResultInterface $result): void + { + $this->result = $result; + } + + public function getMessageBag(): MessageBag + { + return $this->messageBag; + } + + /** + * @return array + */ + public function getOptions(): array + { + return $this->options; + } } diff --git a/src/agent/src/StructuredOutput/AgentProcessor.php b/src/agent/src/StructuredOutput/AgentProcessor.php index cea91c006..7fb1dd01d 100644 --- a/src/agent/src/StructuredOutput/AgentProcessor.php +++ b/src/agent/src/StructuredOutput/AgentProcessor.php @@ -17,7 +17,6 @@ use Symfony\AI\Agent\InputProcessorInterface; use Symfony\AI\Agent\Output; use Symfony\AI\Agent\OutputProcessorInterface; -use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Result\ObjectResult; use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor; use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor; @@ -74,10 +73,6 @@ public function processInput(Input $input): void return; } - if (!$input->model->supports(Capability::OUTPUT_STRUCTURED)) { - throw MissingModelSupportException::forStructuredOutput($input->model::class); - } - if (true === ($options['stream'] ?? false)) { throw new InvalidArgumentException('Streamed responses are not supported for structured output.'); } @@ -92,9 +87,9 @@ public function processInput(Input $input): void public function processOutput(Output $output): void { - $options = $output->options; + $options = $output->getOptions(); - if ($output->result instanceof ObjectResult) { + if ($output->getResult() instanceof ObjectResult) { return; } @@ -103,22 +98,22 @@ public function processOutput(Output $output): void } if (!isset($this->outputStructure)) { - $output->result = new ObjectResult(json_decode($output->result->getContent(), true)); + $output->setResult(new ObjectResult(json_decode($output->getResult()->getContent(), true))); return; } - $originalResult = $output->result; - $output->result = new ObjectResult( - $this->serializer->deserialize($output->result->getContent(), $this->outputStructure, 'json') - ); + $originalResult = $output->getResult(); + $output->setResult(new ObjectResult( + $this->serializer->deserialize($output->getResult()->getContent(), $this->outputStructure, 'json') + )); if ($originalResult->getMetadata()->count() > 0) { - $output->result->getMetadata()->set($originalResult->getMetadata()->all()); + $output->getResult()->getMetadata()->set($originalResult->getMetadata()->all()); } if (null !== $originalResult->getRawResult()) { - $output->result->setRawResult($originalResult->getRawResult()); + $output->getResult()->setRawResult($originalResult->getRawResult()); } } } diff --git a/src/agent/src/Toolbox/AgentProcessor.php b/src/agent/src/Toolbox/AgentProcessor.php index b966d29d6..f454f0358 100644 --- a/src/agent/src/Toolbox/AgentProcessor.php +++ b/src/agent/src/Toolbox/AgentProcessor.php @@ -61,20 +61,19 @@ public function processInput(Input $input): void public function processOutput(Output $output): void { - if ($output->result instanceof GenericStreamResponse) { - $output->result = new ToolboxStreamResponse( - $output->result->getContent(), - $this->handleToolCallsCallback($output), + if ($output->getResult() instanceof GenericStreamResponse) { + $output->setResult( + new ToolboxStreamResponse($output->getResult()->getContent(), $this->handleToolCallsCallback($output)) ); return; } - if (!$output->result instanceof ToolCallResult) { + if (!$output->getResult() instanceof ToolCallResult) { return; } - $output->result = $this->handleToolCallsCallback($output)($output->result); + $output->setResult($this->handleToolCallsCallback($output)($output->getResult())); } /** @@ -88,7 +87,7 @@ private function isFlatStringArray(array $tools): bool private function handleToolCallsCallback(Output $output): \Closure { return function (ToolCallResult $result, ?AssistantMessage $streamedAssistantResponse = null) use ($output): ResultInterface { - $messages = $this->keepToolMessages ? $output->messages : clone $output->messages; + $messages = $this->keepToolMessages ? $output->getMessageBag() : clone $output->getMessageBag(); if (null !== $streamedAssistantResponse && '' !== $streamedAssistantResponse->content) { $messages->add($streamedAssistantResponse); @@ -108,7 +107,7 @@ private function handleToolCallsCallback(Output $output): \Closure $event = new ToolCallsExecuted(...$results); $this->eventDispatcher?->dispatch($event); - $result = $event->hasResponse() ? $event->result : $this->agent->call($messages, $output->options); + $result = $event->hasResponse() ? $event->result : $this->agent->call($messages, $output->getOptions()); } while ($result instanceof ToolCallResult); return $result; diff --git a/src/agent/tests/AgentTest.php b/src/agent/tests/AgentTest.php index b0da87d27..1973ab244 100644 --- a/src/agent/tests/AgentTest.php +++ b/src/agent/tests/AgentTest.php @@ -12,32 +12,23 @@ namespace Symfony\AI\Agent\Tests; use PHPUnit\Framework\TestCase; -use Psr\Log\LoggerInterface; use Symfony\AI\Agent\Agent; use Symfony\AI\Agent\AgentAwareInterface; use Symfony\AI\Agent\AgentInterface; use Symfony\AI\Agent\Exception\InvalidArgumentException; -use Symfony\AI\Agent\Exception\MissingModelSupportException; -use Symfony\AI\Agent\Exception\RuntimeException; use Symfony\AI\Agent\Input; use Symfony\AI\Agent\InputProcessorInterface; use Symfony\AI\Agent\Output; use Symfony\AI\Agent\OutputProcessorInterface; -use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Message\Content\Audio; use Symfony\AI\Platform\Message\Content\Image; use Symfony\AI\Platform\Message\Content\Text; use Symfony\AI\Platform\Message\MessageBag; use Symfony\AI\Platform\Message\UserMessage; -use Symfony\AI\Platform\Model; -use Symfony\AI\Platform\ModelCatalog\DynamicModelCatalog; use Symfony\AI\Platform\PlatformInterface; use Symfony\AI\Platform\Result\RawResultInterface; use Symfony\AI\Platform\Result\ResultInterface; use Symfony\AI\Platform\Result\ResultPromise; -use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface; -use Symfony\Contracts\HttpClient\Exception\HttpExceptionInterface; -use Symfony\Contracts\HttpClient\ResponseInterface as HttpResponseInterface; final class AgentTest extends TestCase { @@ -111,13 +102,9 @@ public function testAgentExposesHisModel() { $platform = $this->createMock(PlatformInterface::class); - $platform->expects($this->once()) - ->method('getModelCatalog') - ->willReturn(new DynamicModelCatalog()); - $agent = new Agent($platform, 'gpt-4o'); - $this->assertEquals(new Model('gpt-4o', Capability::cases()), $agent->getModel()); + $this->assertEquals('gpt-4o', $agent->getModel()); } public function testCallProcessesInputThroughProcessors() @@ -127,10 +114,6 @@ public function testCallProcessesInputThroughProcessors() $messages = new MessageBag(new UserMessage(new Text('Hello'))); $result = $this->createMock(ResultInterface::class); - $platform->expects($this->once()) - ->method('getModelCatalog') - ->willReturn(new DynamicModelCatalog()); - $inputProcessor = $this->createMock(InputProcessorInterface::class); $inputProcessor->expects($this->once()) ->method('processInput') @@ -157,10 +140,6 @@ public function testCallProcessesOutputThroughProcessors() $messages = new MessageBag(new UserMessage(new Text('Hello'))); $result = $this->createMock(ResultInterface::class); - $platform->expects($this->once()) - ->method('getModelCatalog') - ->willReturn(new DynamicModelCatalog()); - $outputProcessor = $this->createMock(OutputProcessorInterface::class); $outputProcessor->expects($this->once()) ->method('processOutput') @@ -180,62 +159,12 @@ public function testCallProcessesOutputThroughProcessors() $this->assertSame($result, $actualResult); } - public function testCallThrowsExceptionForAudioInputWithoutSupport() - { - $platform = $this->createMock(PlatformInterface::class); - $messages = new MessageBag(new UserMessage(new Audio('audio-data', 'audio/mp3'))); - - $modelCatalog = $this->createMock(\Symfony\AI\Platform\ModelCatalog\ModelCatalogInterface::class); - $model = new Model('gpt-4', [Capability::INPUT_TEXT]); // Model without INPUT_AUDIO capability - - $modelCatalog->expects($this->once()) - ->method('getModel') - ->with('gpt-4') - ->willReturn($model); - - $platform->expects($this->once()) - ->method('getModelCatalog') - ->willReturn($modelCatalog); - - $this->expectException(MissingModelSupportException::class); - - $agent = new Agent($platform, 'gpt-4'); - $agent->call($messages); - } - - public function testCallThrowsExceptionForImageInputWithoutSupport() - { - $platform = $this->createMock(PlatformInterface::class); - $messages = new MessageBag(new UserMessage(new Image('image-data', 'image/png'))); - - $modelCatalog = $this->createMock(\Symfony\AI\Platform\ModelCatalog\ModelCatalogInterface::class); - $model = new Model('gpt-4', [Capability::INPUT_TEXT]); // Model without INPUT_IMAGE capability - - $modelCatalog->expects($this->once()) - ->method('getModel') - ->with('gpt-4') - ->willReturn($model); - - $platform->expects($this->once()) - ->method('getModelCatalog') - ->willReturn($modelCatalog); - - $this->expectException(MissingModelSupportException::class); - - $agent = new Agent($platform, 'gpt-4'); - $agent->call($messages); - } - public function testCallAllowsAudioInputWithSupport() { $platform = $this->createMock(PlatformInterface::class); $messages = new MessageBag(new UserMessage(new Audio('audio-data', 'audio/mp3'))); $result = $this->createMock(ResultInterface::class); - $platform->expects($this->once()) - ->method('getModelCatalog') - ->willReturn(new DynamicModelCatalog()); - $rawResult = $this->createMock(RawResultInterface::class); $response = new ResultPromise(fn () => $result, $rawResult, []); @@ -256,10 +185,6 @@ public function testCallAllowsImageInputWithSupport() $messages = new MessageBag(new UserMessage(new Image('image-data', 'image/png'))); $result = $this->createMock(ResultInterface::class); - $platform->expects($this->once()) - ->method('getModelCatalog') - ->willReturn(new DynamicModelCatalog()); - $rawResult = $this->createMock(RawResultInterface::class); $response = new ResultPromise(fn () => $result, $rawResult, []); @@ -274,115 +199,6 @@ public function testCallAllowsImageInputWithSupport() $this->assertSame($result, $actualResult); } - public function testCallHandlesClientException() - { - $platform = $this->createMock(PlatformInterface::class); - $messages = new MessageBag(new UserMessage(new Text('Hello'))); - $logger = $this->createMock(LoggerInterface::class); - - $platform->expects($this->once()) - ->method('getModelCatalog') - ->willReturn(new DynamicModelCatalog()); - - $httpResponse = $this->createMock(HttpResponseInterface::class); - $httpResponse->expects($this->once()) - ->method('toArray') - ->with(false) - ->willReturn(['error' => 'Bad request']); - - $exception = new class('Client error') extends \Exception implements ClientExceptionInterface { - private HttpResponseInterface $response; - - public function setResponse(HttpResponseInterface $response): void - { - $this->response = $response; - } - - public function getResponse(): HttpResponseInterface - { - return $this->response; - } - }; - $exception->setResponse($httpResponse); - - $logger->expects($this->once()) - ->method('debug') - ->with('Client error', ['error' => 'Bad request']); - - $platform->expects($this->once()) - ->method('invoke') - ->willThrowException($exception); - - $this->expectException(InvalidArgumentException::class); - $this->expectExceptionMessage('Client error'); - - $agent = new Agent($platform, 'gpt-4', logger: $logger); - $agent->call($messages); - } - - public function testCallHandlesClientExceptionWithEmptyMessage() - { - $platform = $this->createMock(PlatformInterface::class); - $messages = new MessageBag(new UserMessage(new Text('Hello'))); - - $platform->expects($this->once()) - ->method('getModelCatalog') - ->willReturn(new DynamicModelCatalog()); - - $httpResponse = $this->createMock(HttpResponseInterface::class); - $httpResponse->expects($this->once()) - ->method('toArray') - ->with(false) - ->willReturn([]); - - $exception = new class('') extends \Exception implements ClientExceptionInterface { - private HttpResponseInterface $response; - - public function setResponse(HttpResponseInterface $response): void - { - $this->response = $response; - } - - public function getResponse(): HttpResponseInterface - { - return $this->response; - } - }; - $exception->setResponse($httpResponse); - - $platform->expects($this->once()) - ->method('invoke') - ->willThrowException($exception); - - $this->expectException(InvalidArgumentException::class); - $this->expectExceptionMessage('Invalid request to model or platform'); - - $agent = new Agent($platform, 'gpt-4'); - $agent->call($messages); - } - - public function testCallHandlesHttpException() - { - $platform = $this->createMock(PlatformInterface::class); - $messages = new MessageBag(new UserMessage(new Text('Hello'))); - - $platform->expects($this->once()) - ->method('getModelCatalog') - ->willReturn(new DynamicModelCatalog()); - - $exception = $this->createMock(HttpExceptionInterface::class); - - $platform->expects($this->once()) - ->method('invoke') - ->willThrowException($exception); - - $this->expectException(RuntimeException::class); - $this->expectExceptionMessage('Failed to request model'); - - $agent = new Agent($platform, 'gpt-4'); - $agent->call($messages); - } - public function testCallPassesOptionsToInvoke() { $platform = $this->createMock(PlatformInterface::class); @@ -393,10 +209,6 @@ public function testCallPassesOptionsToInvoke() $rawResult = $this->createMock(RawResultInterface::class); $response = new ResultPromise(fn () => $result, $rawResult, []); - $platform->expects($this->once()) - ->method('getModelCatalog') - ->willReturn(new DynamicModelCatalog()); - $platform->expects($this->once()) ->method('invoke') ->with('gpt-4', $messages, $options) diff --git a/src/agent/tests/InputProcessor/ModelOverrideInputProcessorTest.php b/src/agent/tests/InputProcessor/ModelOverrideInputProcessorTest.php index 8201be4ff..408470d2d 100644 --- a/src/agent/tests/InputProcessor/ModelOverrideInputProcessorTest.php +++ b/src/agent/tests/InputProcessor/ModelOverrideInputProcessorTest.php @@ -15,46 +15,36 @@ use Symfony\AI\Agent\Exception\InvalidArgumentException; use Symfony\AI\Agent\Input; use Symfony\AI\Agent\InputProcessor\ModelOverrideInputProcessor; -use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Message\MessageBag; -use Symfony\AI\Platform\Model; final class ModelOverrideInputProcessorTest extends TestCase { public function testProcessInputWithValidModelOption() { - $originalModel = new Model('gpt-4o-mini', [Capability::INPUT_TEXT, Capability::OUTPUT_TEXT]); - $overrideModel = new Model('gpt-4o', [Capability::INPUT_TEXT, Capability::OUTPUT_TEXT]); - - $input = new Input($originalModel, new MessageBag(), ['model' => $overrideModel]); + $input = new Input('gpt-4o-mini', new MessageBag(), ['model' => 'gpt-4o']); $processor = new ModelOverrideInputProcessor(); $processor->processInput($input); - $this->assertSame($overrideModel, $input->model); - $this->assertSame('gpt-4o', $input->model->getName()); + $this->assertSame('gpt-4o', $input->getModel()); } public function testProcessInputWithoutModelOption() { - $originalModel = new Model('gpt-4o-mini', [Capability::INPUT_TEXT, Capability::OUTPUT_TEXT]); - - $input = new Input($originalModel, new MessageBag()); + $input = new Input('gpt-4o-mini', new MessageBag()); $processor = new ModelOverrideInputProcessor(); $processor->processInput($input); - $this->assertSame($originalModel, $input->model); - $this->assertSame('gpt-4o-mini', $input->model->getName()); + $this->assertSame('gpt-4o-mini', $input->getModel()); } public function testProcessInputWithInvalidModelOption() { $this->expectException(InvalidArgumentException::class); - $this->expectExceptionMessage(\sprintf('Option "model" must be an instance of "%s".', Model::class)); + $this->expectExceptionMessage('Option "model" must be a string.'); - $originalModel = new Model('gpt-4o-mini', [Capability::INPUT_TEXT, Capability::OUTPUT_TEXT]); - $input = new Input($originalModel, new MessageBag(), ['model' => new MessageBag()]); + $input = new Input('gpt-4o-mini', new MessageBag(), ['model' => new MessageBag()]); $processor = new ModelOverrideInputProcessor(); $processor->processInput($input); diff --git a/src/agent/tests/InputProcessor/SystemPromptInputProcessorTest.php b/src/agent/tests/InputProcessor/SystemPromptInputProcessorTest.php index 8e0f6d628..a448ce943 100644 --- a/src/agent/tests/InputProcessor/SystemPromptInputProcessorTest.php +++ b/src/agent/tests/InputProcessor/SystemPromptInputProcessorTest.php @@ -17,7 +17,6 @@ use Symfony\AI\Agent\Toolbox\ToolboxInterface; use Symfony\AI\Fixtures\Tool\ToolNoParams; use Symfony\AI\Fixtures\Tool\ToolRequiredParams; -use Symfony\AI\Platform\Bridge\OpenAi\Gpt; use Symfony\AI\Platform\Message\Content\File; use Symfony\AI\Platform\Message\Message; use Symfony\AI\Platform\Message\MessageBag; @@ -35,10 +34,10 @@ public function testProcessInputAddsSystemMessageWhenNoneExists() { $processor = new SystemPromptInputProcessor('This is a system prompt'); - $input = new Input(new Gpt('gpt-4o'), new MessageBag(Message::ofUser('This is a user message'))); + $input = new Input('gpt-4o', new MessageBag(Message::ofUser('This is a user message'))); $processor->processInput($input); - $messages = $input->messages->getMessages(); + $messages = $input->getMessageBag()->getMessages(); $this->assertCount(2, $messages); $this->assertInstanceOf(SystemMessage::class, $messages[0]); $this->assertInstanceOf(UserMessage::class, $messages[1]); @@ -53,10 +52,10 @@ public function testProcessInputDoesNotAddSystemMessageWhenOneExists() Message::forSystem('This is already a system prompt'), Message::ofUser('This is a user message'), ); - $input = new Input(new Gpt('gpt-4o'), $messages); + $input = new Input('gpt-4o', $messages); $processor->processInput($input); - $messages = $input->messages->getMessages(); + $messages = $input->getMessageBag()->getMessages(); $this->assertCount(2, $messages); $this->assertInstanceOf(SystemMessage::class, $messages[0]); $this->assertInstanceOf(UserMessage::class, $messages[1]); @@ -80,10 +79,10 @@ public function execute(ToolCall $toolCall): mixed }, ); - $input = new Input(new Gpt('gpt-4o'), new MessageBag(Message::ofUser('This is a user message'))); + $input = new Input('gpt-4o', new MessageBag(Message::ofUser('This is a user message'))); $processor->processInput($input); - $messages = $input->messages->getMessages(); + $messages = $input->getMessageBag()->getMessages(); $this->assertCount(2, $messages); $this->assertInstanceOf(SystemMessage::class, $messages[0]); $this->assertInstanceOf(UserMessage::class, $messages[1]); @@ -119,10 +118,10 @@ public function execute(ToolCall $toolCall): mixed $this->getTranslator(), ); - $input = new Input(new Gpt('gpt-4o'), new MessageBag(Message::ofUser('This is a user message'))); + $input = new Input('gpt-4o', new MessageBag(Message::ofUser('This is a user message'))); $processor->processInput($input); - $messages = $input->messages->getMessages(); + $messages = $input->getMessageBag()->getMessages(); $this->assertCount(2, $messages); $this->assertInstanceOf(SystemMessage::class, $messages[0]); $this->assertInstanceOf(UserMessage::class, $messages[1]); @@ -161,10 +160,10 @@ public function execute(ToolCall $toolCall): mixed }, ); - $input = new Input(new Gpt('gpt-4o'), new MessageBag(Message::ofUser('This is a user message'))); + $input = new Input('gpt-4o', new MessageBag(Message::ofUser('This is a user message'))); $processor->processInput($input); - $messages = $input->messages->getMessages(); + $messages = $input->getMessageBag()->getMessages(); $this->assertCount(2, $messages); $this->assertInstanceOf(SystemMessage::class, $messages[0]); $this->assertInstanceOf(UserMessage::class, $messages[1]); @@ -184,10 +183,10 @@ public function testWithTranslatedSystemPrompt() { $processor = new SystemPromptInputProcessor(new TranslatableMessage('This is a'), null, $this->getTranslator()); - $input = new Input(new Gpt('gpt-4o'), new MessageBag(Message::ofUser('This is a user message')), []); + $input = new Input('gpt-4o', new MessageBag(Message::ofUser('This is a user message')), []); $processor->processInput($input); - $messages = $input->messages->getMessages(); + $messages = $input->getMessageBag()->getMessages(); $this->assertCount(2, $messages); $this->assertInstanceOf(SystemMessage::class, $messages[0]); $this->assertInstanceOf(UserMessage::class, $messages[1]); @@ -202,10 +201,10 @@ public function testWithTranslationDomainSystemPrompt() $this->getTranslator(), ); - $input = new Input(new Gpt('gpt-4o'), new MessageBag(), []); + $input = new Input('gpt-4o', new MessageBag(), []); $processor->processInput($input); - $messages = $input->messages->getMessages(); + $messages = $input->getMessageBag()->getMessages(); $this->assertCount(1, $messages); $this->assertInstanceOf(SystemMessage::class, $messages[0]); $this->assertSame('This is a cool translated system prompt with a translation domain', $messages[0]->content); @@ -231,10 +230,10 @@ public function testProcessInputWithFile() $file = File::fromFile($tempFile); $processor = new SystemPromptInputProcessor($file); - $input = new Input(new Gpt('gpt-4o'), new MessageBag(Message::ofUser('This is a user message'))); + $input = new Input('gpt-4o', new MessageBag(Message::ofUser('This is a user message'))); $processor->processInput($input); - $messages = $input->messages->getMessages(); + $messages = $input->getMessageBag()->getMessages(); $this->assertCount(2, $messages); $this->assertInstanceOf(SystemMessage::class, $messages[0]); $this->assertInstanceOf(UserMessage::class, $messages[1]); @@ -253,10 +252,10 @@ public function testProcessInputWithMultilineFile() $file = File::fromFile($tempFile); $processor = new SystemPromptInputProcessor($file); - $input = new Input(new Gpt('gpt-4o'), new MessageBag(Message::ofUser('This is a user message'))); + $input = new Input('gpt-4o', new MessageBag(Message::ofUser('This is a user message'))); $processor->processInput($input); - $messages = $input->messages->getMessages(); + $messages = $input->getMessageBag()->getMessages(); $this->assertCount(2, $messages); $this->assertInstanceOf(SystemMessage::class, $messages[0]); $this->assertSame("Line 1\nLine 2\nLine 3", $messages[0]->content); diff --git a/src/agent/tests/Memory/EmbeddingProviderTest.php b/src/agent/tests/Memory/EmbeddingProviderTest.php index 5efed0fff..bcea04182 100644 --- a/src/agent/tests/Memory/EmbeddingProviderTest.php +++ b/src/agent/tests/Memory/EmbeddingProviderTest.php @@ -36,17 +36,9 @@ public function testItIsDoingNothingWithEmptyMessageBag() $store = $this->createMock(StoreInterface::class); $store->expects($this->never())->method('query'); - $embeddingProvider = new EmbeddingProvider( - $platform, - $this->createStub(Model::class), - $store, - ); + $embeddingProvider = new EmbeddingProvider($platform, new Model('embedding-001'), $store); - $embeddingProvider->load(new Input( - $this->createStub(Model::class), - new MessageBag(), - [], - )); + $embeddingProvider->load(new Input('embedding-001', new MessageBag(), [])); } public function testItIsDoingNothingWithoutUserMessageInBag() @@ -57,14 +49,10 @@ public function testItIsDoingNothingWithoutUserMessageInBag() $store = $this->createMock(StoreInterface::class); $store->expects($this->never())->method('query'); - $embeddingProvider = new EmbeddingProvider( - $platform, - $this->createStub(Model::class), - $store, - ); + $embeddingProvider = new EmbeddingProvider($platform, new Model('embedding-001'), $store); $embeddingProvider->load(new Input( - $this->createStub(Model::class), + 'embedding-001', new MessageBag(Message::forSystem('This is a system message')), [], )); @@ -78,14 +66,10 @@ public function testItIsDoingNothingWhenUserMessageHasNoTextContent() $store = $this->createMock(StoreInterface::class); $store->expects($this->never())->method('query'); - $embeddingProvider = new EmbeddingProvider( - $platform, - $this->createStub(Model::class), - $store, - ); + $embeddingProvider = new EmbeddingProvider($platform, new Model('embedding-001'), $store); $embeddingProvider->load(new Input( - $this->createStub(Model::class), + 'embedding-001', new MessageBag(Message::ofUser(new ImageUrl('foo.jpg'))), [], )); @@ -99,11 +83,6 @@ public function testItIsNotCreatingMemoryWhenNoVectorsFound() $this->createStub(RawResultInterface::class), ); - $embeddingModel = $this->createMock(Model::class); - $embeddingModel->expects($this->once()) - ->method('getName') - ->willReturn('text-embedding-3-small'); - $platform = $this->createMock(PlatformInterface::class); $platform->expects($this->once()) ->method('invoke') @@ -116,14 +95,10 @@ public function testItIsNotCreatingMemoryWhenNoVectorsFound() ->with($vector) ->willReturn([]); - $embeddingProvider = new EmbeddingProvider( - $platform, - $embeddingModel, - $store, - ); + $embeddingProvider = new EmbeddingProvider($platform, new Model('text-embedding-3-small'), $store); $memory = $embeddingProvider->load(new Input( - $this->createStub(Model::class), + 'text-embedding-3-small', new MessageBag(Message::ofUser(new Text('Have we talked about the weather?'))), [], )); @@ -139,11 +114,6 @@ public function testItIsCreatingMemoryWithFoundVectors() $this->createStub(RawResultInterface::class), ); - $embeddingModel = $this->createMock(Model::class); - $embeddingModel->expects($this->once()) - ->method('getName') - ->willReturn('text-embedding-3-small'); - $platform = $this->createMock(PlatformInterface::class); $platform->expects($this->once()) ->method('invoke') @@ -159,14 +129,10 @@ public function testItIsCreatingMemoryWithFoundVectors() (object) ['metadata' => ['fact' => 'Water is wet']], ]); - $embeddingProvider = new EmbeddingProvider( - $platform, - $embeddingModel, - $store, - ); + $embeddingProvider = new EmbeddingProvider($platform, new Model('text-embedding-3-small'), $store); $memory = $embeddingProvider->load(new Input( - $this->createStub(Model::class), + 'text-embedding-3-small', new MessageBag(Message::ofUser(new Text('Have we talked about the weather?'))), [], )); diff --git a/src/agent/tests/Memory/MemoryInputProcessorTest.php b/src/agent/tests/Memory/MemoryInputProcessorTest.php index 069e5db4e..23cd26f20 100644 --- a/src/agent/tests/Memory/MemoryInputProcessorTest.php +++ b/src/agent/tests/Memory/MemoryInputProcessorTest.php @@ -18,7 +18,6 @@ use Symfony\AI\Agent\Memory\MemoryProviderInterface; use Symfony\AI\Platform\Message\Message; use Symfony\AI\Platform\Message\MessageBag; -use Symfony\AI\Platform\Model; final class MemoryInputProcessorTest extends TestCase { @@ -28,11 +27,9 @@ public function testItIsDoingNothingOnInactiveMemory() $memoryProvider->expects($this->never())->method($this->anything()); $memoryInputProcessor = new MemoryInputProcessor($memoryProvider); - $memoryInputProcessor->processInput($input = new Input( - $this->createStub(Model::class), - new MessageBag(), - ['use_memory' => false] - )); + $memoryInputProcessor->processInput( + $input = new Input('gpt-4', new MessageBag(), ['use_memory' => false]), + ); $this->assertArrayNotHasKey('use_memory', $input->getOptions()); } @@ -40,11 +37,9 @@ public function testItIsDoingNothingOnInactiveMemory() public function testItIsDoingNothingWhenThereAreNoProviders() { $memoryInputProcessor = new MemoryInputProcessor(); - $memoryInputProcessor->processInput($input = new Input( - $this->createStub(Model::class), - new MessageBag(), - ['use_memory' => true] - )); + $memoryInputProcessor->processInput( + $input = new Input('gpt-4', new MessageBag(), ['use_memory' => true]), + ); $this->assertArrayNotHasKey('use_memory', $input->getOptions()); } @@ -67,9 +62,9 @@ public function testItIsAddingMemoryToSystemPrompt() ); $memoryInputProcessor->processInput($input = new Input( - $this->createStub(Model::class), + 'gpt-4', new MessageBag(Message::forSystem('You are a helpful and kind assistant.')), - [] + [], )); $this->assertArrayNotHasKey('use_memory', $input->getOptions()); @@ -87,7 +82,7 @@ public function testItIsAddingMemoryToSystemPrompt() You are a helpful and kind assistant. MARKDOWN, - $input->messages->getSystemMessage()->content, + $input->getMessageBag()->getSystemMessage()->content, ); } @@ -100,11 +95,7 @@ public function testItIsAddingMemoryToSystemPromptEvenItIsEmpty() $memoryInputProcessor = new MemoryInputProcessor($firstMemoryProvider); - $memoryInputProcessor->processInput($input = new Input( - $this->createStub(Model::class), - new MessageBag(), - [] - )); + $memoryInputProcessor->processInput($input = new Input('gpt-4', new MessageBag(), [])); $this->assertArrayNotHasKey('use_memory', $input->getOptions()); $this->assertSame( @@ -117,7 +108,7 @@ public function testItIsAddingMemoryToSystemPromptEvenItIsEmpty() First memory content MARKDOWN, - $input->messages->getSystemMessage()->content, + $input->getMessageBag()->getSystemMessage()->content, ); } @@ -130,11 +121,7 @@ public function testItIsAddingMultipleMemoryFromSingleProviderToSystemPrompt() $memoryInputProcessor = new MemoryInputProcessor($firstMemoryProvider); - $memoryInputProcessor->processInput($input = new Input( - $this->createStub(Model::class), - new MessageBag(), - [] - )); + $memoryInputProcessor->processInput($input = new Input('gpt-4', new MessageBag(), [])); $this->assertArrayNotHasKey('use_memory', $input->getOptions()); $this->assertSame( @@ -148,7 +135,7 @@ public function testItIsAddingMultipleMemoryFromSingleProviderToSystemPrompt() First memory content Second memory content MARKDOWN, - $input->messages->getSystemMessage()->content, + $input->getMessageBag()->getSystemMessage()->content, ); } @@ -161,13 +148,9 @@ public function testItIsNotAddingAnythingIfMemoryWasEmpty() $memoryInputProcessor = new MemoryInputProcessor($firstMemoryProvider); - $memoryInputProcessor->processInput($input = new Input( - $this->createStub(Model::class), - new MessageBag(), - [] - )); + $memoryInputProcessor->processInput($input = new Input('gpt-4', new MessageBag(), [])); $this->assertArrayNotHasKey('use_memory', $input->getOptions()); - $this->assertNull($input->messages->getSystemMessage()?->content); + $this->assertNull($input->getMessageBag()->getSystemMessage()?->content); } } diff --git a/src/agent/tests/Memory/StaticMemoryProviderTest.php b/src/agent/tests/Memory/StaticMemoryProviderTest.php index 69ed54251..73b141dc9 100644 --- a/src/agent/tests/Memory/StaticMemoryProviderTest.php +++ b/src/agent/tests/Memory/StaticMemoryProviderTest.php @@ -16,7 +16,6 @@ use Symfony\AI\Agent\Memory\Memory; use Symfony\AI\Agent\Memory\StaticMemoryProvider; use Symfony\AI\Platform\Message\MessageBag; -use Symfony\AI\Platform\Model; final class StaticMemoryProviderTest extends TestCase { @@ -24,11 +23,7 @@ public function testItsReturnsNullWhenNoFactsAreProvided() { $provider = new StaticMemoryProvider(); - $memory = $provider->load(new Input( - $this->createStub(Model::class), - new MessageBag(), - [] - )); + $memory = $provider->load(new Input('gpt-4', new MessageBag(), [])); $this->assertCount(0, $memory); } @@ -40,11 +35,7 @@ public function testItDeliversFormattedFacts() $fact2 = 'Water is wet', ); - $memory = $provider->load(new Input( - $this->createStub(Model::class), - new MessageBag(), - [] - )); + $memory = $provider->load(new Input('gpt-4', new MessageBag(), [])); $this->assertCount(1, $memory); $this->assertInstanceOf(Memory::class, $memory[0]); diff --git a/src/agent/tests/StructuredOutput/AgentProcessorTest.php b/src/agent/tests/StructuredOutput/AgentProcessorTest.php index fb45e219e..74391e817 100644 --- a/src/agent/tests/StructuredOutput/AgentProcessorTest.php +++ b/src/agent/tests/StructuredOutput/AgentProcessorTest.php @@ -13,7 +13,6 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; -use Symfony\AI\Agent\Exception\MissingModelSupportException; use Symfony\AI\Agent\Input; use Symfony\AI\Agent\Output; use Symfony\AI\Agent\StructuredOutput\AgentProcessor; @@ -26,10 +25,8 @@ use Symfony\AI\Fixtures\StructuredOutput\UnionType\HumanReadableTimeUnion; use Symfony\AI\Fixtures\StructuredOutput\UnionType\UnionTypeDto; use Symfony\AI\Fixtures\StructuredOutput\UnionType\UnixTimestampUnion; -use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Message\MessageBag; use Symfony\AI\Platform\Metadata\Metadata; -use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\ObjectResult; use Symfony\AI\Platform\Result\TextResult; use Symfony\Component\Serializer\SerializerInterface; @@ -39,9 +36,7 @@ final class AgentProcessorTest extends TestCase public function testProcessInputWithOutputStructure() { $processor = new AgentProcessor(new ConfigurableResponseFormatFactory(['some' => 'format'])); - - $model = new Model('gpt-4', [Capability::OUTPUT_STRUCTURED]); - $input = new Input($model, new MessageBag(), ['output_structure' => 'SomeStructure']); + $input = new Input('gpt-4', new MessageBag(), ['output_structure' => 'SomeStructure']); $processor->processInput($input); @@ -51,56 +46,40 @@ public function testProcessInputWithOutputStructure() public function testProcessInputWithoutOutputStructure() { $processor = new AgentProcessor(new ConfigurableResponseFormatFactory()); - - $model = new Model('gpt-4', [Capability::OUTPUT_STRUCTURED]); - $input = new Input($model, new MessageBag()); + $input = new Input('gpt-4', new MessageBag()); $processor->processInput($input); $this->assertSame([], $input->getOptions()); } - public function testProcessInputThrowsExceptionWhenLlmDoesNotSupportStructuredOutput() - { - $this->expectException(MissingModelSupportException::class); - - $processor = new AgentProcessor(new ConfigurableResponseFormatFactory()); - - $model = new Model('gpt-3'); - $input = new Input($model, new MessageBag(), ['output_structure' => 'SomeStructure']); - - $processor->processInput($input); - } - public function testProcessOutputWithResponseFormat() { $processor = new AgentProcessor(new ConfigurableResponseFormatFactory(['some' => 'format'])); - $model = new Model('gpt-4', [Capability::OUTPUT_STRUCTURED]); $options = ['output_structure' => SomeStructure::class]; - $input = new Input($model, new MessageBag(), $options); + $input = new Input('gpt-4', new MessageBag(), $options); $processor->processInput($input); $result = new TextResult('{"some": "data"}'); - $output = new Output($model, $result, new MessageBag(), $input->getOptions()); + $output = new Output('gpt-4', $result, new MessageBag(), $input->getOptions()); $processor->processOutput($output); - $this->assertInstanceOf(ObjectResult::class, $output->result); - $this->assertInstanceOf(SomeStructure::class, $output->result->getContent()); - $this->assertInstanceOf(Metadata::class, $output->result->getMetadata()); - $this->assertNull($output->result->getRawResult()); - $this->assertSame('data', $output->result->getContent()->some); + $this->assertInstanceOf(ObjectResult::class, $output->getResult()); + $this->assertInstanceOf(SomeStructure::class, $output->getResult()->getContent()); + $this->assertInstanceOf(Metadata::class, $output->getResult()->getMetadata()); + $this->assertNull($output->getResult()->getRawResult()); + $this->assertSame('data', $output->getResult()->getContent()->some); } public function testProcessOutputWithComplexResponseFormat() { $processor = new AgentProcessor(new ConfigurableResponseFormatFactory(['some' => 'format'])); - $model = new Model('gpt-4', [Capability::OUTPUT_STRUCTURED]); $options = ['output_structure' => MathReasoning::class]; - $input = new Input($model, new MessageBag(), $options); + $input = new Input('gpt-4', new MessageBag(), $options); $processor->processInput($input); $result = new TextResult(<<getOptions()); + $output = new Output('gpt-4', $result, new MessageBag(), $input->getOptions()); $processor->processOutput($output); - $this->assertInstanceOf(ObjectResult::class, $output->result); - $this->assertInstanceOf(MathReasoning::class, $structure = $output->result->getContent()); - $this->assertInstanceOf(Metadata::class, $output->result->getMetadata()); - $this->assertNull($output->result->getRawResult()); + $this->assertInstanceOf(ObjectResult::class, $output->getResult()); + $this->assertInstanceOf(MathReasoning::class, $structure = $output->getResult()->getContent()); + $this->assertInstanceOf(Metadata::class, $output->getResult()->getMetadata()); + $this->assertNull($output->getResult()->getRawResult()); $this->assertCount(5, $structure->steps); $this->assertInstanceOf(Step::class, $structure->steps[0]); $this->assertInstanceOf(Step::class, $structure->steps[1]); @@ -158,17 +137,16 @@ public function testProcessOutputWithUnionTypeResponseFormat(TextResult $result, { $processor = new AgentProcessor(new ConfigurableResponseFormatFactory(['some' => 'format'])); - $model = new Model('gpt-4', [Capability::OUTPUT_STRUCTURED]); $options = ['output_structure' => UnionTypeDto::class]; - $input = new Input($model, new MessageBag(), $options); + $input = new Input('gpt-4', new MessageBag(), $options); $processor->processInput($input); - $output = new Output($model, $result, new MessageBag(), $input->getOptions()); + $output = new Output('gpt-4', $result, new MessageBag(), $input->getOptions()); $processor->processOutput($output); - $this->assertInstanceOf(ObjectResult::class, $output->result); + $this->assertInstanceOf(ObjectResult::class, $output->getResult()); /** @var UnionTypeDto $structure */ - $structure = $output->result->getContent(); + $structure = $output->getResult()->getContent(); $this->assertInstanceOf(UnionTypeDto::class, $structure); $this->assertInstanceOf($expectedTimeStructure, $structure->time); @@ -202,9 +180,8 @@ public function testProcessOutputWithCorrectPolymorphicTypesResponseFormat() { $processor = new AgentProcessor(new ConfigurableResponseFormatFactory(['some' => 'format'])); - $model = new Model('gpt-4', [Capability::OUTPUT_STRUCTURED]); $options = ['output_structure' => ListOfPolymorphicTypesDto::class]; - $input = new Input($model, new MessageBag(), $options); + $input = new Input('gpt-4', new MessageBag(), $options); $processor->processInput($input); $result = new TextResult(<<getOptions()); + $output = new Output('gpt-4', $result, new MessageBag(), $input->getOptions()); $processor->processOutput($output); - $this->assertInstanceOf(ObjectResult::class, $output->result); + $this->assertInstanceOf(ObjectResult::class, $output->getResult()); /** @var ListOfPolymorphicTypesDto $structure */ - $structure = $output->result->getContent(); + $structure = $output->getResult()->getContent(); $this->assertInstanceOf(ListOfPolymorphicTypesDto::class, $structure); $this->assertCount(2, $structure->items); @@ -253,13 +230,11 @@ public function testProcessOutputWithoutResponseFormat() $serializer = self::createMock(SerializerInterface::class); $processor = new AgentProcessor($resultFormatFactory, $serializer); - $model = self::createMock(Model::class); $result = new TextResult(''); - - $output = new Output($model, $result, new MessageBag()); + $output = new Output('gpt4', $result, new MessageBag()); $processor->processOutput($output); - $this->assertSame($result, $output->result); + $this->assertSame($result, $output->getResult()); } } diff --git a/src/agent/tests/Toolbox/AgentProcessorTest.php b/src/agent/tests/Toolbox/AgentProcessorTest.php index a52bdb77e..671451c9a 100644 --- a/src/agent/tests/Toolbox/AgentProcessorTest.php +++ b/src/agent/tests/Toolbox/AgentProcessorTest.php @@ -17,11 +17,9 @@ use Symfony\AI\Agent\Output; use Symfony\AI\Agent\Toolbox\AgentProcessor; use Symfony\AI\Agent\Toolbox\ToolboxInterface; -use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Message\AssistantMessage; use Symfony\AI\Platform\Message\MessageBag; use Symfony\AI\Platform\Message\ToolCallMessage; -use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\ToolCall; use Symfony\AI\Platform\Result\ToolCallResult; use Symfony\AI\Platform\Tool\ExecutionReference; @@ -34,9 +32,8 @@ public function testProcessInputWithoutRegisteredToolsWillResultInNoOptionChange $toolbox = $this->createStub(ToolboxInterface::class); $toolbox->method('getTools')->willReturn([]); - $model = new Model('gpt-4', [Capability::TOOL_CALLING]); $processor = new AgentProcessor($toolbox); - $input = new Input($model, new MessageBag()); + $input = new Input('gpt-4', new MessageBag()); $processor->processInput($input); @@ -50,9 +47,8 @@ public function testProcessInputWithRegisteredToolsWillResultInOptionChange() $tool2 = new Tool(new ExecutionReference('ClassTool2', 'method1'), 'tool2', 'description2', null); $toolbox->method('getTools')->willReturn([$tool1, $tool2]); - $model = new Model('gpt-4', [Capability::TOOL_CALLING]); $processor = new AgentProcessor($toolbox); - $input = new Input($model, new MessageBag()); + $input = new Input('gpt-4', new MessageBag()); $processor->processInput($input); @@ -66,9 +62,8 @@ public function testProcessInputWithRegisteredToolsButToolOverride() $tool2 = new Tool(new ExecutionReference('ClassTool2', 'method1'), 'tool2', 'description2', null); $toolbox->method('getTools')->willReturn([$tool1, $tool2]); - $model = new Model('gpt-4', [Capability::TOOL_CALLING]); $processor = new AgentProcessor($toolbox); - $input = new Input($model, new MessageBag(), ['tools' => ['tool2']]); + $input = new Input('gpt-4', new MessageBag(), ['tools' => ['tool2']]); $processor->processInput($input); @@ -80,8 +75,6 @@ public function testProcessOutputWithToolCallResponseKeepingMessages() $toolbox = $this->createMock(ToolboxInterface::class); $toolbox->expects($this->once())->method('execute')->willReturn('Test response'); - $model = new Model('gpt-4', [Capability::TOOL_CALLING]); - $messageBag = new MessageBag(); $result = new ToolCallResult(new ToolCall('id1', 'tool1', ['arg1' => 'value1'])); @@ -91,7 +84,7 @@ public function testProcessOutputWithToolCallResponseKeepingMessages() $processor = new AgentProcessor($toolbox, keepToolMessages: true); $processor->setAgent($agent); - $output = new Output($model, $result, $messageBag); + $output = new Output('gpt-4', $result, $messageBag); $processor->processOutput($output); @@ -105,8 +98,6 @@ public function testProcessOutputWithToolCallResponseForgettingMessages() $toolbox = $this->createMock(ToolboxInterface::class); $toolbox->expects($this->once())->method('execute')->willReturn('Test response'); - $model = new Model('gpt-4', [Capability::TOOL_CALLING]); - $messageBag = new MessageBag(); $result = new ToolCallResult(new ToolCall('id1', 'tool1', ['arg1' => 'value1'])); @@ -116,7 +107,7 @@ public function testProcessOutputWithToolCallResponseForgettingMessages() $processor = new AgentProcessor($toolbox, keepToolMessages: false); $processor->setAgent($agent); - $output = new Output($model, $result, $messageBag); + $output = new Output('gpt-4', $result, $messageBag); $processor->processOutput($output); diff --git a/src/platform/src/Bridge/Anthropic/TokenOutputProcessor.php b/src/platform/src/Bridge/Anthropic/TokenOutputProcessor.php index b9c27922a..6d4aafd10 100644 --- a/src/platform/src/Bridge/Anthropic/TokenOutputProcessor.php +++ b/src/platform/src/Bridge/Anthropic/TokenOutputProcessor.php @@ -21,17 +21,17 @@ final class TokenOutputProcessor implements OutputProcessorInterface { public function processOutput(Output $output): void { - if ($output->result instanceof StreamResult) { + if ($output->getResult() instanceof StreamResult) { // Streams have to be handled manually as the tokens are part of the streamed chunks return; } - $rawResponse = $output->result->getRawResult()?->getObject(); + $rawResponse = $output->getResult()->getRawResult()?->getObject(); if (!$rawResponse instanceof ResponseInterface) { return; } - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = new TokenUsage(); diff --git a/src/platform/src/Bridge/Gemini/TokenOutputProcessor.php b/src/platform/src/Bridge/Gemini/TokenOutputProcessor.php index f55a41172..8517c4c5d 100644 --- a/src/platform/src/Bridge/Gemini/TokenOutputProcessor.php +++ b/src/platform/src/Bridge/Gemini/TokenOutputProcessor.php @@ -21,17 +21,17 @@ final class TokenOutputProcessor implements OutputProcessorInterface { public function processOutput(Output $output): void { - if ($output->result instanceof StreamResult) { + if ($output->getResult() instanceof StreamResult) { // Streams have to be handled manually as the tokens are part of the streamed chunks return; } - $rawResponse = $output->result->getRawResult()?->getObject(); + $rawResponse = $output->getResult()->getRawResult()?->getObject(); if (!$rawResponse instanceof ResponseInterface) { return; } - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = new TokenUsage(); diff --git a/src/platform/src/Bridge/Mistral/TokenOutputProcessor.php b/src/platform/src/Bridge/Mistral/TokenOutputProcessor.php index 44d5ad8b6..a48fbc6ce 100644 --- a/src/platform/src/Bridge/Mistral/TokenOutputProcessor.php +++ b/src/platform/src/Bridge/Mistral/TokenOutputProcessor.php @@ -24,17 +24,17 @@ final class TokenOutputProcessor implements OutputProcessorInterface { public function processOutput(Output $output): void { - if ($output->result instanceof StreamResult) { + if ($output->getResult() instanceof StreamResult) { // Streams have to be handled manually as the tokens are part of the streamed chunks return; } - $rawResponse = $output->result->getRawResult()?->getObject(); + $rawResponse = $output->getResult()->getRawResult()?->getObject(); if (!$rawResponse instanceof ResponseInterface) { return; } - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $headers = $rawResponse->getHeaders(false); $remainingTokensMinute = $headers['x-ratelimit-limit-tokens-minute'][0] ?? null; diff --git a/src/platform/src/Bridge/OpenAi/TokenOutputProcessor.php b/src/platform/src/Bridge/OpenAi/TokenOutputProcessor.php index a313efd4a..6f31d3394 100644 --- a/src/platform/src/Bridge/OpenAi/TokenOutputProcessor.php +++ b/src/platform/src/Bridge/OpenAi/TokenOutputProcessor.php @@ -24,17 +24,17 @@ final class TokenOutputProcessor implements OutputProcessorInterface { public function processOutput(Output $output): void { - if ($output->result instanceof StreamResult) { + if ($output->getResult() instanceof StreamResult) { // Streams have to be handled manually as the tokens are part of the streamed chunks return; } - $rawResponse = $output->result->getRawResult()?->getObject(); + $rawResponse = $output->getResult()->getRawResult()?->getObject(); if (!$rawResponse instanceof ResponseInterface) { return; } - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $remainingTokens = $rawResponse->getHeaders(false)['x-ratelimit-remaining-tokens'][0] ?? null; $tokenUsage = new TokenUsage( diff --git a/src/platform/src/Bridge/Perplexity/SearchResultProcessor.php b/src/platform/src/Bridge/Perplexity/SearchResultProcessor.php index 217be96c1..f69c7b23c 100644 --- a/src/platform/src/Bridge/Perplexity/SearchResultProcessor.php +++ b/src/platform/src/Bridge/Perplexity/SearchResultProcessor.php @@ -23,17 +23,17 @@ final class SearchResultProcessor implements OutputProcessorInterface { public function processOutput(Output $output): void { - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); - if ($output->result instanceof StreamResult) { - $generator = $output->result->getContent(); + if ($output->getResult() instanceof StreamResult) { + $generator = $output->getResult()->getContent(); // Makes $metadata accessible in the stream loop. $generator->send($metadata); return; } - $rawResponse = $output->result->getRawResult()?->getObject(); + $rawResponse = $output->getResult()->getRawResult()?->getObject(); if (!$rawResponse instanceof ResponseInterface) { return; } diff --git a/src/platform/src/Bridge/Perplexity/TokenOutputProcessor.php b/src/platform/src/Bridge/Perplexity/TokenOutputProcessor.php index 3a8d624fc..e99269c55 100644 --- a/src/platform/src/Bridge/Perplexity/TokenOutputProcessor.php +++ b/src/platform/src/Bridge/Perplexity/TokenOutputProcessor.php @@ -24,12 +24,12 @@ final class TokenOutputProcessor implements OutputProcessorInterface { public function processOutput(Output $output): void { - if ($output->result instanceof StreamResult) { + if ($output->getResult() instanceof StreamResult) { // Streams have to be handled manually as the tokens are part of the streamed chunks return; } - $rawResponse = $output->result->getRawResult()?->getObject(); + $rawResponse = $output->getResult()->getRawResult()?->getObject(); if (!$rawResponse instanceof ResponseInterface) { return; } @@ -40,7 +40,7 @@ public function processOutput(Output $output): void return; } - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = new TokenUsage(); $usage = $content['usage']; diff --git a/src/platform/src/Bridge/VertexAi/TokenOutputProcessor.php b/src/platform/src/Bridge/VertexAi/TokenOutputProcessor.php index 4d8841bfc..8e4a4115b 100644 --- a/src/platform/src/Bridge/VertexAi/TokenOutputProcessor.php +++ b/src/platform/src/Bridge/VertexAi/TokenOutputProcessor.php @@ -38,12 +38,12 @@ final class TokenOutputProcessor implements OutputProcessorInterface public function processOutput(Output $output): void { $tokenUsage = new TokenUsage(); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); - if ($output->result instanceof StreamResult) { + if ($output->getResult() instanceof StreamResult) { $lastChunk = null; - foreach ($output->result->getContent() as $chunk) { + foreach ($output->getResult()->getContent() as $chunk) { // Store last event that contains usage metadata if (isset($chunk['usageMetadata'])) { $lastChunk = $chunk; @@ -57,7 +57,7 @@ public function processOutput(Output $output): void return; } - $rawResponse = $output->result->getRawResult()?->getObject(); + $rawResponse = $output->getResult()->getRawResult()?->getObject(); if (!$rawResponse instanceof ResponseInterface) { return; } diff --git a/src/platform/tests/Bridge/Anthropic/TokenOutputProcessorTest.php b/src/platform/tests/Bridge/Anthropic/TokenOutputProcessorTest.php index b0c0e72b9..63dbeb497 100644 --- a/src/platform/tests/Bridge/Anthropic/TokenOutputProcessorTest.php +++ b/src/platform/tests/Bridge/Anthropic/TokenOutputProcessorTest.php @@ -16,7 +16,6 @@ use Symfony\AI\Platform\Bridge\Anthropic\TokenOutputProcessor; use Symfony\AI\Platform\Message\MessageBag; use Symfony\AI\Platform\Metadata\TokenUsage; -use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawHttpResult; use Symfony\AI\Platform\Result\ResultInterface; use Symfony\AI\Platform\Result\StreamResult; @@ -33,7 +32,7 @@ public function testItHandlesStreamResponsesWithoutProcessing() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $this->assertCount(0, $metadata); } @@ -45,7 +44,7 @@ public function testItDoesNothingWithoutRawResponse() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $this->assertCount(0, $metadata); } @@ -60,7 +59,7 @@ public function testItAddsRemainingTokensToMetadata() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertCount(1, $metadata); @@ -91,7 +90,7 @@ public function testItAddsUsageTokensToMetadata() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertInstanceOf(TokenUsage::class, $tokenUsage); @@ -122,7 +121,7 @@ public function testItHandlesMissingUsageFields() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertInstanceOf(TokenUsage::class, $tokenUsage); @@ -142,11 +141,6 @@ private function createRawResult(array $data = []): RawHttpResult private function createOutput(ResultInterface $result): Output { - return new Output( - $this->createStub(Model::class), - $result, - new MessageBag(), - [], - ); + return new Output('claude-3-5-sonnet-latest', $result, new MessageBag(), []); } } diff --git a/src/platform/tests/Bridge/Gemini/TokenOutputProcessorTest.php b/src/platform/tests/Bridge/Gemini/TokenOutputProcessorTest.php index 4be1daaec..d6f77abfe 100644 --- a/src/platform/tests/Bridge/Gemini/TokenOutputProcessorTest.php +++ b/src/platform/tests/Bridge/Gemini/TokenOutputProcessorTest.php @@ -16,7 +16,6 @@ use Symfony\AI\Platform\Bridge\Gemini\TokenOutputProcessor; use Symfony\AI\Platform\Message\MessageBag; use Symfony\AI\Platform\Metadata\TokenUsage; -use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawHttpResult; use Symfony\AI\Platform\Result\ResultInterface; use Symfony\AI\Platform\Result\StreamResult; @@ -33,7 +32,7 @@ public function testItHandlesStreamResponsesWithoutProcessing() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $this->assertCount(0, $metadata); } @@ -45,7 +44,7 @@ public function testItDoesNothingWithoutRawResponse() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $this->assertCount(0, $metadata); } @@ -60,7 +59,7 @@ public function testItAddsRemainingTokensToMetadata() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertCount(1, $metadata); @@ -90,7 +89,7 @@ public function testItAddsUsageTokensToMetadata() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertInstanceOf(TokenUsage::class, $tokenUsage); @@ -121,7 +120,7 @@ public function testItHandlesMissingUsageFields() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertInstanceOf(TokenUsage::class, $tokenUsage); @@ -141,11 +140,6 @@ private function createRawResult(array $data = []): RawHttpResult private function createOutput(ResultInterface $result): Output { - return new Output( - $this->createStub(Model::class), - $result, - $this->createStub(MessageBag::class), - [], - ); + return new Output('gemini-2.5-pro', $result, new MessageBag(), []); } } diff --git a/src/platform/tests/Bridge/Mistral/TokenOutputProcessorTest.php b/src/platform/tests/Bridge/Mistral/TokenOutputProcessorTest.php index 8b7450729..c48610178 100644 --- a/src/platform/tests/Bridge/Mistral/TokenOutputProcessorTest.php +++ b/src/platform/tests/Bridge/Mistral/TokenOutputProcessorTest.php @@ -16,7 +16,6 @@ use Symfony\AI\Platform\Bridge\Mistral\TokenOutputProcessor; use Symfony\AI\Platform\Message\MessageBag; use Symfony\AI\Platform\Metadata\TokenUsage; -use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawHttpResult; use Symfony\AI\Platform\Result\ResultInterface; use Symfony\AI\Platform\Result\StreamResult; @@ -33,7 +32,7 @@ public function testItHandlesStreamResponsesWithoutProcessing() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $this->assertCount(0, $metadata); } @@ -45,7 +44,7 @@ public function testItDoesNothingWithoutRawResponse() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $this->assertCount(0, $metadata); } @@ -60,7 +59,7 @@ public function testItAddsRemainingTokensToMetadata() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertCount(1, $metadata); @@ -88,7 +87,7 @@ public function testItAddsUsageTokensToMetadata() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertInstanceOf(TokenUsage::class, $tokenUsage); @@ -117,7 +116,7 @@ public function testItHandlesMissingUsageFields() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertInstanceOf(TokenUsage::class, $tokenUsage); @@ -143,11 +142,6 @@ private function createRawResponse(array $data = []): RawHttpResult private function createOutput(ResultInterface $result): Output { - return new Output( - $this->createStub(Model::class), - $result, - $this->createStub(MessageBag::class), - [], - ); + return new Output('ministral-3b-latest', $result, new MessageBag(), []); } } diff --git a/src/platform/tests/Bridge/OpenAi/TokenOutputProcessorTest.php b/src/platform/tests/Bridge/OpenAi/TokenOutputProcessorTest.php index f0fd3b898..044536247 100644 --- a/src/platform/tests/Bridge/OpenAi/TokenOutputProcessorTest.php +++ b/src/platform/tests/Bridge/OpenAi/TokenOutputProcessorTest.php @@ -16,7 +16,6 @@ use Symfony\AI\Platform\Bridge\OpenAi\TokenOutputProcessor; use Symfony\AI\Platform\Message\MessageBag; use Symfony\AI\Platform\Metadata\TokenUsage; -use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawHttpResult; use Symfony\AI\Platform\Result\ResultInterface; use Symfony\AI\Platform\Result\StreamResult; @@ -33,7 +32,7 @@ public function testItHandlesStreamResponsesWithoutProcessing() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $this->assertCount(0, $metadata); } @@ -45,7 +44,7 @@ public function testItDoesNothingWithoutRawResponse() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $this->assertCount(0, $metadata); } @@ -60,7 +59,7 @@ public function testItAddsRemainingTokensToMetadata() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertCount(1, $metadata); @@ -93,7 +92,7 @@ public function testItAddsUsageTokensToMetadata() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertInstanceOf(TokenUsage::class, $tokenUsage); @@ -123,7 +122,7 @@ public function testItHandlesMissingUsageFields() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertInstanceOf(TokenUsage::class, $tokenUsage); @@ -146,11 +145,6 @@ private function createRawResult(array $data = []): RawHttpResult private function createOutput(ResultInterface $result): Output { - return new Output( - $this->createStub(Model::class), - $result, - $this->createStub(MessageBag::class), - [], - ); + return new Output('gpt-4o', $result, new MessageBag(), []); } } diff --git a/src/platform/tests/Bridge/Perplexity/TokenOutputProcessorTest.php b/src/platform/tests/Bridge/Perplexity/TokenOutputProcessorTest.php index bee78e5f6..50edbfb5b 100644 --- a/src/platform/tests/Bridge/Perplexity/TokenOutputProcessorTest.php +++ b/src/platform/tests/Bridge/Perplexity/TokenOutputProcessorTest.php @@ -16,7 +16,6 @@ use Symfony\AI\Platform\Bridge\Perplexity\TokenOutputProcessor; use Symfony\AI\Platform\Message\MessageBag; use Symfony\AI\Platform\Metadata\TokenUsage; -use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawHttpResult; use Symfony\AI\Platform\Result\ResultInterface; use Symfony\AI\Platform\Result\StreamResult; @@ -36,7 +35,7 @@ public function testItHandlesStreamResponsesWithoutProcessing() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $this->assertCount(0, $metadata); } @@ -48,7 +47,7 @@ public function testItDoesNothingWithoutRawResponse() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $this->assertCount(0, $metadata); } @@ -72,7 +71,7 @@ public function testItAddsUsageTokensToMetadata() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertInstanceOf(TokenUsage::class, $tokenUsage); @@ -100,7 +99,7 @@ public function testItHandlesMissingUsageFields() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertInstanceOf(TokenUsage::class, $tokenUsage); @@ -120,11 +119,6 @@ private function createRawResult(array $data = []): RawHttpResult private function createOutput(ResultInterface $result): Output { - return new Output( - $this->createStub(Model::class), - $result, - $this->createStub(MessageBag::class), - [], - ); + return new Output('sonar', $result, new MessageBag(), []); } } diff --git a/src/platform/tests/Bridge/VertexAi/TokenOutputProcessorTest.php b/src/platform/tests/Bridge/VertexAi/TokenOutputProcessorTest.php index 9d109102b..3399f85f5 100644 --- a/src/platform/tests/Bridge/VertexAi/TokenOutputProcessorTest.php +++ b/src/platform/tests/Bridge/VertexAi/TokenOutputProcessorTest.php @@ -16,7 +16,6 @@ use Symfony\AI\Platform\Bridge\VertexAi\TokenOutputProcessor; use Symfony\AI\Platform\Message\MessageBag; use Symfony\AI\Platform\Metadata\TokenUsage; -use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawHttpResult; use Symfony\AI\Platform\Result\ResultInterface; use Symfony\AI\Platform\Result\StreamResult; @@ -33,7 +32,7 @@ public function testItDoesNothingWithoutRawResponse() $processor->processOutput($output); - $this->assertCount(0, $output->result->getMetadata()); + $this->assertCount(0, $output->getResult()->getMetadata()); } public function testItAddsUsageTokensToMetadata() @@ -55,7 +54,7 @@ public function testItAddsUsageTokensToMetadata() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertCount(1, $metadata); @@ -82,7 +81,7 @@ public function testItHandlesMissingUsageFields() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertCount(1, $metadata); @@ -103,7 +102,7 @@ public function testItAddsEmptyTokenUsageWhenUsageMetadataNotPresent() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertCount(1, $metadata); @@ -136,7 +135,7 @@ public function testItHandlesStreamResults() $processor->processOutput($output); - $metadata = $output->result->getMetadata(); + $metadata = $output->getResult()->getMetadata(); $tokenUsage = $metadata->get('token_usage'); $this->assertCount(1, $metadata); @@ -158,11 +157,6 @@ private function createRawResponse(array $data = []): RawHttpResult private function createOutput(ResultInterface $result): Output { - return new Output( - $this->createStub(Model::class), - $result, - new MessageBag(), - [], - ); + return new Output('gemini-2.5-pro', $result, new MessageBag(), []); } }