| from smolagents.models import Model, ChatMessage, Tool, MessageRole |
| from time import sleep |
| from typing import List, Dict, Optional |
| from huggingface_hub import hf_hub_download |
| import json |
|
|
|
|
| class FakeModelReplayLog(Model): |
| """A model class that returns pre-recorded responses from a log file. |
| |
| This class is useful for testing and debugging purposes, as it doesn't make |
| actual API calls but instead returns responses from a pre-recorded log file. |
| |
| Parameters: |
| log_url (str, optional): |
| URL to the log file. Defaults to the smolagents example log. |
| **kwargs: Additional keyword arguments passed to the Model base class. |
| """ |
|
|
| def __init__(self, log_folder: str, **kwargs): |
| super().__init__(**kwargs) |
| self.dataset_name = "smolagents/computer-agent-logs" |
| self.log_folder = log_folder |
| self.call_counter = 0 |
| self.model_outputs = self._load_model_outputs() |
|
|
| def _load_model_outputs(self) -> List[str]: |
| """Load model outputs from the log file using HuggingFace datasets library.""" |
| |
| file_path = hf_hub_download( |
| repo_id=self.dataset_name, |
| filename=self.log_folder + "/metadata.json", |
| repo_type="dataset", |
| ) |
|
|
| |
| with open(file_path, "r") as f: |
| log_data = json.load(f) |
|
|
| |
| model_outputs = [] |
|
|
| for step in log_data["summary"][1:]: |
| model_outputs.append(step["model_output_message"]["content"]) |
|
|
| print(f"Loaded {len(model_outputs)} model outputs from log file") |
| return model_outputs |
|
|
| def __call__( |
| self, |
| messages: List[Dict[str, str]], |
| stop_sequences: Optional[List[str]] = None, |
| grammar: Optional[str] = None, |
| tools_to_call_from: Optional[List[Tool]] = None, |
| **kwargs, |
| ) -> ChatMessage: |
| """Return the next pre-recorded response from the log file. |
| |
| Parameters: |
| messages: List of input messages (ignored). |
| stop_sequences: Optional list of stop sequences (ignored). |
| grammar: Optional grammar specification (ignored). |
| tools_to_call_from: Optional list of tools (ignored). |
| **kwargs: Additional keyword arguments (ignored). |
| |
| Returns: |
| ChatMessage: The next pre-recorded response. |
| """ |
| sleep(1.0) |
|
|
| |
| if self.call_counter < len(self.model_outputs): |
| content = self.model_outputs[self.call_counter] |
| self.call_counter += 1 |
| else: |
| content = "No more pre-recorded responses available." |
|
|
| |
| self.last_input_token_count = len(str(messages)) // 4 |
| self.last_output_token_count = len(content) // 4 |
|
|
| |
| return ChatMessage( |
| role=MessageRole.ASSISTANT, |
| content=content, |
| tool_calls=None, |
| raw={"source": "pre-recorded log", "call_number": self.call_counter}, |
| ) |
|
|