diff --git a/src/praisonai-agents/praisonaiagents/agent/chat_mixin.py b/src/praisonai-agents/praisonaiagents/agent/chat_mixin.py index 7babf3600..0f56d30f8 100644 --- a/src/praisonai-agents/praisonaiagents/agent/chat_mixin.py +++ b/src/praisonai-agents/praisonaiagents/agent/chat_mixin.py @@ -507,7 +507,7 @@ def _process_stream_response(self, messages, temperature, start_time, formatted_ emit_events=True ) - def _chat_completion(self, messages, temperature=1.0, tools=None, stream=True, reasoning_steps=False, task_name=None, task_description=None, task_id=None, response_format=None, _retry_depth=0): + def _chat_completion(self, messages, temperature=1.0, tools=None, stream=False, reasoning_steps=False, task_name=None, task_description=None, task_id=None, response_format=None, _retry_depth=0): start_time = time.time() # --- Context compaction (opt-in via ExecutionConfig.context_compaction) --- @@ -774,7 +774,7 @@ def _execute_unified_chat_completion( messages, temperature=1.0, tools=None, - stream=True, + stream=False, reasoning_steps=False, task_name=None, task_description=None, @@ -857,7 +857,7 @@ async def _execute_unified_achat_completion( messages, temperature=1.0, tools=None, - stream=True, + stream=True, # Async methods keep stream=True default (async adapters support streaming) reasoning_steps=False, task_name=None, task_description=None, diff --git a/src/praisonai-agents/tests/unit/agent/test_chat_sync_stream_defaults.py b/src/praisonai-agents/tests/unit/agent/test_chat_sync_stream_defaults.py new file mode 100644 index 000000000..3a28fae7d --- /dev/null +++ b/src/praisonai-agents/tests/unit/agent/test_chat_sync_stream_defaults.py @@ -0,0 +1,48 @@ +import ast +from pathlib import Path + + +def _chat_mixin_path() -> Path: + for candidate in Path(__file__).resolve().parents: + chat_mixin = candidate / "praisonaiagents" / "agent" / "chat_mixin.py" + if chat_mixin.exists(): + return chat_mixin + raise FileNotFoundError("Could not locate praisonaiagents/agent/chat_mixin.py") + + +def get_chat_mixin_stream_parameter_default(function_name: str): + chat_mixin = _chat_mixin_path() + tree = ast.parse(chat_mixin.read_text(encoding="utf-8")) + + for node in tree.body: + if isinstance(node, ast.ClassDef) and node.name == "ChatMixin": + for item in node.body: + if isinstance(item, ast.FunctionDef) and item.name == function_name: + args = item.args.args + defaults = item.args.defaults + first_default_index = len(args) - len(defaults) + for idx, arg in enumerate(args): + if arg.arg == "stream": + default_idx = idx - first_default_index + if default_idx < 0: + raise AssertionError( + f"Function '{function_name}' has no default for stream" + ) + default = defaults[default_idx] + if isinstance(default, ast.Constant): + return default.value + raise AssertionError( + f"Function '{function_name}' stream default is non-constant" + ) + raise AssertionError(f"Function '{function_name}' or stream parameter not found") + + +def test_chat_completion_stream_default_is_false(): + assert get_chat_mixin_stream_parameter_default("_chat_completion") is False + + +def test_execute_unified_chat_completion_stream_default_is_false(): + assert ( + get_chat_mixin_stream_parameter_default("_execute_unified_chat_completion") + is False + )