Spaces:
Sleeping
Sleeping
| """ | |
| LLM Client โ Facade over core.providers.llm. | |
| ไฟ็ๅๆ API ้ข (LLMClient, ChatMessage, ChatResponse)๏ผ | |
| ๅ ้จๅงๆๅฐ providers.registry.get_llm() ๅๅปบ็ providerใ | |
| ๆๆไธๅฑ่ฐ็จ (chat_agent, critic, main.py) ๆ ้ๆนๅจใ | |
| """ | |
| from __future__ import annotations | |
| from typing import AsyncIterator, Optional | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| # Re-export public types (facade ๅ ผๅฎนๅฅ็บฆ) | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| from providers.llm.base import ChatMessage, ChatResponse # noqa: F401 | |
| class LLMClient: | |
| """ | |
| Async LLM client for OpenHer. | |
| Thin facade โ ๅงๆๅฐ core.providers.llm ็ๅ ทไฝ provider ๅฎ็ฐใ | |
| Constructor ็ญพๅไธๅ๏ผๆๆ่ฐ็จๆนๆ ้ๆนๅจใ | |
| Usage: | |
| client = LLMClient(provider="dashscope", model="qwen-max") | |
| response = await client.chat([ | |
| ChatMessage("system", "You are a companion..."), | |
| ChatMessage("user", "ไฝ ๅฅฝๅ"), | |
| ]) | |
| print(response.content) | |
| """ | |
| def __init__( | |
| self, | |
| provider: str = "dashscope", | |
| model: Optional[str] = None, | |
| api_key: Optional[str] = None, | |
| base_url: Optional[str] = None, | |
| temperature: float = 0.92, | |
| max_tokens: int = 1024, | |
| ): | |
| from providers.registry import get_llm | |
| self.provider = provider | |
| self._impl = get_llm( | |
| provider=provider, | |
| model=model, | |
| api_key=api_key, | |
| base_url=base_url, | |
| temperature=temperature, | |
| max_tokens=max_tokens, | |
| ) | |
| # Expose model name for observability (main.py prints it) | |
| self.model = self._impl.model | |
| print(f"โ LLM ๅฎขๆท็ซฏ: {self.model} ({self.provider}) [async]") | |
| async def chat( | |
| self, | |
| messages: list[ChatMessage], | |
| temperature: Optional[float] = None, | |
| max_tokens: Optional[int] = None, | |
| tools: Optional[list[dict]] = None, | |
| tool_choice: Optional[str] = None, | |
| ) -> ChatResponse: | |
| """Send a chat request and get a response (async).""" | |
| return await self._impl.chat(messages, temperature, max_tokens, tools, tool_choice) | |
| async def chat_stream( | |
| self, | |
| messages: list[ChatMessage], | |
| temperature: Optional[float] = None, | |
| max_tokens: Optional[int] = None, | |
| ) -> AsyncIterator[str]: | |
| """Stream a chat response, yielding content chunks (async).""" | |
| async for chunk in self._impl.chat_stream(messages, temperature, max_tokens): | |
| yield chunk | |