Spaces:
Sleeping
Sleeping
| """Mock LLM Provider for testing""" | |
| import time | |
| from typing import List, Dict, Iterator, Optional | |
| from .base import BaseLLMProvider | |
| class MockProvider(BaseLLMProvider): | |
| """Mock LLM provider for testing without API calls""" | |
| MODELS = [ | |
| "mock-fast", | |
| "mock-slow", | |
| "mock-smart", | |
| ] | |
| # Mock responses for different scenarios | |
| RESPONSES = { | |
| "default": "This is a mock response. I'm a fake LLM provider used for testing. " | |
| "I can simulate responses without making real API calls. " | |
| "Try asking me different questions to see how the interface works!", | |
| "search": "Based on the search results provided, I can see information about {topic}. " | |
| "This is a mock response that pretends to use the search context. " | |
| "In a real scenario, a real LLM would analyze and synthesize this information.", | |
| "error": "This is a simulated error response for testing error handling.", | |
| } | |
| def __init__(self, api_key: Optional[str] = None, **kwargs): | |
| super().__init__(api_key, **kwargs) | |
| self.delay = kwargs.get("delay", 0.05) # Delay between chunks for streaming | |
| def name(self) -> str: | |
| return "Mock (Testing)" | |
| def requires_api_key(self) -> bool: | |
| return False | |
| def get_available_models(self) -> List[str]: | |
| return self.MODELS | |
| def chat( | |
| self, | |
| messages: List[Dict[str, str]], | |
| model: str, | |
| temperature: float = 0.7, | |
| max_tokens: Optional[int] = None, | |
| stream: bool = False, | |
| **kwargs | |
| ) -> str | Iterator[str]: | |
| # Extract user message | |
| user_message = "" | |
| has_search_context = False | |
| for msg in messages: | |
| if msg["role"] == "user": | |
| user_message = msg["content"].lower() | |
| if "search" in user_message: has_search_context = True | |
| elif msg["role"] == "system" and "search results" in msg["content"].lower(): | |
| has_search_context = True | |
| # Choose response based on context | |
| if has_search_context: | |
| # Extract a topic from the user message for more realistic mock | |
| words = user_message.split() | |
| topic = " ".join(words[:3]) if len(words) >= 3 else "the topic" | |
| response = self.RESPONSES["search"].format(topic=topic) | |
| else: | |
| response = self.RESPONSES["default"] | |
| # Add some variety based on model | |
| if "smart" in model: | |
| response += "\n\n(Using 'smart' model - pretending to be more detailed)" | |
| elif "fast" in model: | |
| response += "\n\n(Using 'fast' model - quick response)" | |
| elif "slow" in model: | |
| response += "\n\n(Using 'slow' model - simulating slower processing)" | |
| self.delay = 0.1 | |
| if stream: | |
| return self._stream_response(response) | |
| else: | |
| return response | |
| def _stream_response(self, response: str) -> Iterator[str]: | |
| """Stream response word by word""" | |
| words = response.split() | |
| for i, word in enumerate(words): | |
| # Add space before word except for first word | |
| chunk = word if i == 0 else f" {word}" | |
| yield chunk | |
| time.sleep(self.delay) | |