From e5d6b5be52a1af3b1d544980d331817bb0223ba1 Mon Sep 17 00:00:00 2001 From: mamad Date: Thu, 27 Aug 2026 20:22:22 +0330 Subject: [PATCH] fix(llm): support flexible base_url formats for open-ai compatible proxies like orcarouter --- core/llm.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/core/llm.py b/core/llm.py index 0329d1d..1b2a2f0 100644 --- a/core/llm.py +++ b/core/llm.py @@ -16,17 +16,17 @@ class LLMClient: model: Optional[str] = None, base_url: Optional[str] = None, ): - self.provider = provider or os.getenv("AI_PROVIDER", "gemini").lower() + self.provider = provider or os.getenv("AI_PROVIDER", "openai").lower() self.api_key = api_key or os.getenv("AI_API_KEY", "") - self.model = model or os.getenv("AI_MODEL", "gemini-1.5-flash" if self.provider == "gemini" else "gpt-4o-mini") - self.base_url = base_url or os.getenv("AI_BASE_URL") + self.model = model or os.getenv("AI_MODEL", "orcarouter/auto" if self.provider == "openai" else "gemini-1.5-flash") + self.base_url = base_url or os.getenv("AI_BASE_URL", "https://api.orcarouter.ai/v1") async def generate_json(self, prompt: str, system_prompt: Optional[str] = None, action_name: str = "general") -> Dict[str, Any]: """Send prompt to LLM and parse JSON response.""" start_time = time.time() status = "error" try: - if self.provider == "gemini": + if self.provider == "gemini" and "orcarouter" not in (self.base_url or ""): result = await self._call_gemini(prompt, system_prompt) else: result = await self._call_openai(prompt, system_prompt) @@ -66,7 +66,9 @@ class LLMClient: return json.loads(raw_text) async def _call_openai(self, prompt: str, system_prompt: Optional[str] = None) -> Dict[str, Any]: - url = self.base_url or "https://api.openai.com/v1/chat/completions" + base = (self.base_url or "https://api.orcarouter.ai/v1").rstrip("/") + url = base if base.endswith("/chat/completions") else f"{base}/chat/completions" + headers = { "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json"