From 8a65a9e72438078a1c1bb7ae7cd9b7bb9bcf546b Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Wed, 4 Feb 2026 12:31:32 +0000 Subject: [PATCH] Add providers module (base, factory) --- src/promptforge/providers/base.py | 62 +++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/promptforge/providers/base.py diff --git a/src/promptforge/providers/base.py b/src/promptforge/providers/base.py new file mode 100644 index 0000000..b36e69f --- /dev/null +++ b/src/promptforge/providers/base.py @@ -0,0 +1,62 @@ +from abc import ABC, abstractmethod +from typing import Any, AsyncIterator, Dict, Optional + + +class ProviderResponse: + def __init__( + self, + content: str, + model: str, + provider: str, + usage: Optional[Dict[str, Any]] = None, + latency_ms: float = 0.0, + metadata: Optional[Dict[str, Any]] = None, + ): + self.content = content + self.model = model + self.provider = provider + self.usage = usage or {} + self.latency_ms = latency_ms + self.metadata = metadata or {} + + +class ProviderBase(ABC): + def __init__( + self, + api_key: Optional[str] = None, + model: str = "gpt-4", + temperature: float = 0.7, + **kwargs, + ): + self.api_key = api_key + self.model = model + self.temperature = temperature + self.extra_kwargs = kwargs + + @property + @abstractmethod + def name(self) -> str: + pass + + @abstractmethod + async def complete( + self, + prompt: str, + system_prompt: Optional[str] = None, + max_tokens: Optional[int] = None, + **kwargs, + ) -> ProviderResponse: + pass + + @abstractmethod + async def stream_complete( + self, + prompt: str, + system_prompt: Optional[str] = None, + max_tokens: Optional[int] = None, + **kwargs, + ) -> AsyncIterator[str]: + pass + + def validate_api_key(self) -> bool: + return True \ No newline at end of file