caarleexx commited on
Commit
ad63520
·
verified ·
1 Parent(s): 91d975f

Create backend/main.py

Browse files
Files changed (1) hide show
  1. backend/main.py +62 -0
backend/main.py ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import os
3
+ from dotenv import load_dotenv
4
+ from fastapi import FastAPI
5
+ from fastapi.middleware.cors import CORSMiddleware
6
+ from pydantic import BaseModel
7
+ from langchain_core.prompts import ChatPromptTemplate
8
+ from langchain_groq import ChatGroq
9
+ from fastapi.responses import StreamingResponse
10
+
11
+ # Carrega a API key do arquivo .env
12
+ load_dotenv()
13
+
14
+ # 1. Inicialização do FastAPI
15
+ app = FastAPI()
16
+
17
+ # 2. Configuração do CORS
18
+ # Essencial para permitir que o frontend (rodando em outra porta) se comunique com este backend.
19
+ app.add_middleware(
20
+ CORSMiddleware,
21
+ allow_origins=["*"], # Permite todas as origens (em produção, restrinja para o seu domínio)
22
+ allow_credentials=True,
23
+ allow_methods=["*"],
24
+ allow_headers=["*"],
25
+ )
26
+
27
+ # 3. LangChain: Definição do Modelo e do Prompt
28
+ # Usamos o LangChain para simplificar a interação com a Groq
29
+ model = ChatGroq(model="groq/compound")
30
+
31
+ system_prompt = (
32
+ "Você é um assistente de pesquisa avançado. "
33
+ "Use as ferramentas disponíveis para responder às perguntas do usuário de forma completa e detalhada."
34
+ )
35
+ prompt = ChatPromptTemplate.from_messages(
36
+ [("system", system_prompt), ("human", "{input}")]
37
+ )
38
+
39
+ # Criamos a "cadeia" de execução: o prompt é passado para o modelo
40
+ chain = prompt | model
41
+
42
+ # 4. Pydantic Model: Define a estrutura da requisição que nossa API espera
43
+ class ChatRequest(BaseModel):
44
+ content: str
45
+
46
+ # 5. O Endpoint da API
47
+ @app.post("/chat")
48
+ async def chat(request: ChatRequest):
49
+ """
50
+ Este endpoint recebe uma mensagem do usuário e retorna um stream da resposta do modelo.
51
+ """
52
+ # Função geradora que produz os pedaços (chunks) da resposta
53
+ async def stream_generator():
54
+ # 'astream' é o método de streaming assíncrono do LangChain
55
+ async for chunk in chain.astream({"input": request.content}):
56
+ if chunk.content:
57
+ # 'yield' envia o pedaço de texto para o cliente
58
+ print(f"Enviando chunk: {chunk.content}") # Log para depuração
59
+ yield chunk.content
60
+
61
+ # Retorna uma resposta de streaming que consome o nosso gerador
62
+ return StreamingResponse(stream_generator(), media_type="text/plain")