Spaces:
Running
Running
| """ | |
| Agent for auto mode API routes. | |
| """ | |
| from __future__ import annotations | |
| import logging | |
| from fastapi import APIRouter, Request | |
| from fastapi.responses import JSONResponse | |
| from starlette.responses import Response | |
| from ..providers import is_provider_supported | |
| from ._request_secrets import get_llm_api_key | |
| from ..services.generation import generate_agent_for_auto | |
| from ..utils.json_stream import create_streaming_json_response | |
| router = APIRouter(tags=["agent-for-auto"]) | |
| logger = logging.getLogger(__name__) | |
| async def agent_for_auto(request: Request) -> Response: | |
| body = await request.json() | |
| provider = body.get("provider") | |
| message = body.get("message") | |
| current_space = body.get("currentSpace") | |
| api_key = get_llm_api_key(request) | |
| base_url = body.get("baseUrl") | |
| model = body.get("model") | |
| user_timezone = body.get("userTimezone") | |
| user_locale = body.get("userLocale") | |
| if not provider or not message: | |
| return JSONResponse( | |
| status_code=400, | |
| content={"error": "Missing required fields: provider, message"}, | |
| ) | |
| if not is_provider_supported(provider): | |
| return JSONResponse(status_code=400, content={"error": f"Unsupported provider: {provider}"}) | |
| # Auto agent preselection is best-effort and must not break user chat flow. | |
| # On provider auth/config errors, gracefully return null and let frontend fallback. | |
| return create_streaming_json_response( | |
| _build_agent_for_auto_result( | |
| provider=provider, | |
| message=message, | |
| current_space=current_space, | |
| api_key=api_key, | |
| base_url=base_url, | |
| model=model, | |
| user_timezone=user_timezone, | |
| user_locale=user_locale, | |
| ) | |
| ) | |
| async def _build_agent_for_auto_result( | |
| *, | |
| provider: str, | |
| message: str, | |
| current_space: dict | None, | |
| api_key: str, | |
| base_url: str | None, | |
| model: str | None, | |
| user_timezone: str | None, | |
| user_locale: str | None, | |
| ) -> dict[str, str | None]: | |
| try: | |
| agent_name = await generate_agent_for_auto( | |
| provider=provider, | |
| user_message=message, | |
| current_space=current_space, | |
| api_key=api_key, | |
| base_url=base_url, | |
| model=model, | |
| user_timezone=user_timezone, | |
| user_locale=user_locale, | |
| ) | |
| return {"agentName": agent_name} | |
| except Exception as exc: # noqa: BLE001 | |
| logger.warning("agent-for-auto failed, fallback to null agent: %s", exc) | |
| return {"agentName": None} | |