| import asyncio |
| import httpx |
| import os |
|
|
| OPENROUTER_BASE = "https://openrouter.ai/api/v1/chat/completions" |
| HEADERS = { |
| "Authorization": f"Bearer {os.getenv('OPENROUTER_API_KEY')}", |
| "Content-Type": "application/json", |
| } |
|
|
| ALLOWED_MODELS = [ |
| "deepseek/deepseek-chat-v3-0324:free", |
| "google/gemini-2.0-flash-exp:free", |
| "meta-llama/llama-4-maverick:free", |
| "microsoft/mai-ds-r1:free", |
| "meta-llama/llama-4-scout:free", |
| "google/gemma-3-27b-it:free", |
| "qwen/qwq-32b:free", |
| "qwen/qwen2.5-vl-72b-instruct:free", |
| "qwen/qwen-2.5-72b-instruct:free", |
| "google/gemini-2.5-pro-exp-03-25:free", |
| "deepseek/deepseek-r1:free", |
| ] |
|
|
| async def call_openrouter(model: str, prompt: str) -> str: |
| body = { |
| "model": model, |
| "messages": [{"role": "user", "content": prompt}], |
| "temperature": 0.7, |
| } |
| async with httpx.AsyncClient(timeout=30) as client: |
| response = await client.post(OPENROUTER_BASE, headers=HEADERS, json=body) |
| response.raise_for_status() |
| return response.json()["choices"][0]["message"]["content"] |
|
|
| async def query_llm_agent(name: str, prompt: str, settings: dict) -> str: |
| selected_model = settings.get("models", {}).get(name) |
|
|
| if not selected_model: |
| return f"[{name}] No model selected." |
|
|
| |
| if not selected_model.endswith(":free"): |
| selected_model += ":free" |
|
|
| if selected_model not in ALLOWED_MODELS: |
| return f"[{name}] Model '{selected_model}' is not supported." |
|
|
| try: |
| response = await call_openrouter(selected_model, prompt) |
| return f"[{name}] {response}" |
| except Exception as e: |
| return f"[{name}] Error: {str(e)}" |
|
|
| async def query_all_llms(prompt: str, settings: dict) -> list: |
| agents = ["LLM-A", "LLM-B", "LLM-C"] |
| tasks = [query_llm_agent(agent, prompt, settings) for agent in agents] |
| results = await asyncio.gather(*tasks) |
| return results |
|
|
| def query_all_llms_sync(prompt: str, settings: dict) -> list: |
| return asyncio.run(query_all_llms(prompt, settings)) |
|
|