import json import os import sys import tempfile import uuid from typing import Any, Callable import pytest sys.path.append(os.path.join(os.path.dirname(__file__), "..")) sys.path.append(os.path.join(os.path.dirname(__file__), "../..")) from conftest import skip_openai # noqa: E402 from test_assistant_agent import KEY_LOC, OAI_CONFIG_LIST # noqa: E402 import autogen import autogen.runtime_logging from autogen.logger.file_logger import FileLogger is_windows = sys.platform.startswith("win") def dummy_function(param1: str, param2: int) -> Any: return param1 * param2 @pytest.mark.skipif(is_windows, reason="Skipping file logging tests on Windows") @pytest.fixture def logger() -> FileLogger: current_dir = os.path.dirname(os.path.abspath(__file__)) with tempfile.TemporaryDirectory(dir=current_dir) as temp_dir: log_file = os.path.join(temp_dir, "test_log.log") config = {"filename": log_file} logger = FileLogger(config) yield logger logger.stop() @pytest.mark.skipif(is_windows, reason="Skipping file logging tests on Windows") def test_start(logger: FileLogger): session_id = logger.start() assert isinstance(session_id, str) assert len(session_id) == 36 @pytest.mark.skipif(is_windows, reason="Skipping file logging tests on Windows") def test_log_chat_completion(logger: FileLogger): invocation_id = uuid.uuid4() client_id = 123456789 wrapper_id = 987654321 request = {"messages": [{"content": "Test message", "role": "user"}]} response = "Test response" is_cached = 0 cost = 0.5 start_time = "2024-05-06 15:20:21.263231" agent = autogen.AssistantAgent(name="TestAgent", code_execution_config=False) logger.log_chat_completion( invocation_id=invocation_id, client_id=client_id, wrapper_id=wrapper_id, request=request, response=response, is_cached=is_cached, cost=cost, start_time=start_time, source=agent, ) with open(logger.log_file, "r") as f: lines = f.readlines() assert len(lines) == 1 log_data = json.loads(lines[0]) assert log_data["invocation_id"] == str(invocation_id) assert log_data["client_id"] == client_id assert log_data["wrapper_id"] == wrapper_id assert log_data["response"] == response assert log_data["is_cached"] == is_cached assert log_data["cost"] == cost assert log_data["start_time"] == start_time assert log_data["source_name"] == "TestAgent" assert isinstance(log_data["thread_id"], int) @pytest.mark.skipif(is_windows, reason="Skipping file logging tests on Windows") def test_log_function_use(logger: FileLogger): source = autogen.AssistantAgent(name="TestAgent", code_execution_config=False) func: Callable[[str, int], Any] = dummy_function args = {"foo": "bar"} returns = True logger.log_function_use(source=source, function=func, args=args, returns=returns) with open(logger.log_file, "r") as f: lines = f.readlines() assert len(lines) == 1 log_data = json.loads(lines[0]) assert log_data["source_name"] == "TestAgent" assert log_data["input_args"] == json.dumps(args) assert log_data["returns"] == json.dumps(returns) assert isinstance(log_data["thread_id"], int) class TestWrapper: def __init__(self, init_args): self.init_args = init_args @pytest.mark.skipif(is_windows, reason="Skipping file logging tests on Windows") def test_log_new_agent(logger: FileLogger): agent = autogen.UserProxyAgent(name="user_proxy", code_execution_config=False) logger.log_new_agent(agent) with open(logger.log_file, "r") as f: lines = f.readlines() log_data = json.loads(lines[0]) # the first line is the session id assert log_data["agent_name"] == "user_proxy" @pytest.mark.skipif(is_windows, reason="Skipping file logging tests on Windows") def test_log_event(logger: FileLogger): source = autogen.AssistantAgent(name="TestAgent", code_execution_config=False) name = "TestEvent" kwargs = {"key": "value"} logger.log_event(source, name, **kwargs) with open(logger.log_file, "r") as f: lines = f.readlines() log_data = json.loads(lines[0]) assert log_data["source_name"] == "TestAgent" assert log_data["event_name"] == name assert log_data["json_state"] == json.dumps(kwargs) assert isinstance(log_data["thread_id"], int) @pytest.mark.skipif(is_windows, reason="Skipping file logging tests on Windows") def test_log_new_wrapper(logger: FileLogger): wrapper = TestWrapper(init_args={"foo": "bar"}) logger.log_new_wrapper(wrapper, wrapper.init_args) with open(logger.log_file, "r") as f: lines = f.readlines() log_data = json.loads(lines[0]) assert log_data["wrapper_id"] == id(wrapper) assert log_data["json_state"] == json.dumps(wrapper.init_args) assert isinstance(log_data["thread_id"], int) @pytest.mark.skipif(is_windows, reason="Skipping file logging tests on Windows") def test_log_new_client(logger: FileLogger): client = autogen.UserProxyAgent(name="user_proxy", code_execution_config=False) wrapper = TestWrapper(init_args={"foo": "bar"}) init_args = {"foo": "bar"} logger.log_new_client(client, wrapper, init_args) with open(logger.log_file, "r") as f: lines = f.readlines() log_data = json.loads(lines[0]) assert log_data["client_id"] == id(client) assert log_data["wrapper_id"] == id(wrapper) assert log_data["json_state"] == json.dumps(init_args) assert isinstance(log_data["thread_id"], int)