File size: 3,763 Bytes
53fdb6d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
"""
Router de testes de LLM
Endpoints para testar providers e modelos LLM
"""
from fastapi import APIRouter, HTTPException
from datetime import datetime
import time

from api.models.requests import LLMGenerateRequest
from api.models.responses import LLMTestResponse, MessageResponse
from api.utils.logger import setup_logger

router = APIRouter()
logger = setup_logger(__name__)


@router.post("/generate", response_model=LLMTestResponse)
async def test_llm_generate(request: LLMGenerateRequest):
    """
    **Testa geração de texto com LLM.**

    Útil para:
    - Verificar se API keys estão funcionando
    - Testar diferentes modelos
    - Medir latência e tokens
    """
    start_time = time.time()

    try:
        # Importar LLM manager
        from llm.llm_manager import LLMManager

        llm = LLMManager()

        # Verificar se provider está disponível
        if not llm.is_provider_available(request.provider):
            raise HTTPException(
                status_code=503,
                detail=f"Provider '{request.provider}' não disponível ou não configurado"
            )

        # Gerar texto
        result = await llm.generate(
            prompt=request.prompt,
            provider=request.provider,
            model=request.model,
            temperature=request.temperature,
            max_tokens=request.max_tokens
        )

        duration_ms = (time.time() - start_time) * 1000

        logger.info(
            f"✅ LLM test [{request.provider}] - "
            f"Tokens: {result.get('tokens', 0)} - "
            f"Duration: {duration_ms:.2f}ms"
        )

        return LLMTestResponse(
            provider=request.provider,
            model=result.get("model", request.model or "default"),
            success=True,
            response=result.get("text", ""),
            tokens_used=result.get("tokens"),
            duration_ms=duration_ms
        )

    except Exception as e:
        duration_ms = (time.time() - start_time) * 1000

        logger.error(f"❌ LLM test error: {str(e)}")

        return LLMTestResponse(
            provider=request.provider,
            model=request.model or "unknown",
            success=False,
            duration_ms=duration_ms,
            error=str(e)
        )


@router.get("/providers")
async def list_providers():
    """
    **Lista providers LLM disponíveis.**

    Mostra quais providers estão configurados e prontos para uso.
    """
    try:
        from llm.llm_manager import LLMManager

        llm = LLMManager()
        providers = llm.list_providers()

        return {
            "providers": providers,
            "total": len(providers),
            "default": llm.default_provider
        }

    except Exception as e:
        logger.error(f"Error listing providers: {e}")
        return {
            "providers": [],
            "total": 0,
            "error": str(e)
        }


@router.get("/models/{provider}")
async def list_models(provider: str):
    """
    **Lista modelos disponíveis de um provider.**

    Args:
        provider: Nome do provider (groq/openai/anthropic)
    """
    try:
        from llm.llm_manager import LLMManager

        llm = LLMManager()

        if not llm.is_provider_available(provider):
            raise HTTPException(
                status_code=404,
                detail=f"Provider '{provider}' não disponível"
            )

        models = llm.get_available_models(provider)

        return {
            "provider": provider,
            "models": models,
            "total": len(models)
        }

    except HTTPException:
        raise
    except Exception as e:
        logger.error(f"Error listing models: {e}")
        raise HTTPException(status_code=500, detail=str(e))