Davizigjojo commited on
Commit
73538aa
·
verified ·
1 Parent(s): 10eb1fd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +13 -32
app.py CHANGED
@@ -24,8 +24,6 @@ os.environ["GRADIO_SSR_MODE"] = "False"
24
  os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
25
 
26
  # 3. IMPORTAÇÕES
27
- import threading
28
- import uvicorn
29
  import time
30
  import traceback
31
  import json
@@ -36,12 +34,9 @@ from fastapi.middleware.cors import CORSMiddleware
36
  from fastapi.responses import StreamingResponse
37
  from pydantic import BaseModel
38
  from typing import List, Optional
39
- from pyngrok import ngrok
40
  from huggingface_hub import hf_hub_download
41
  import spaces
42
 
43
- NGROK_TOKEN = os.getenv("NGROK_TOKEN")
44
-
45
  MODEL_REGISTRY = {
46
  "blazertiny-1b": {"repo_id": "Davizig10jojo/BlazerTiny-1b-GGUF", "filename": "blazertiny-1b-Q6_K.gguf", "min_size_mb": 200},
47
  "blazerrhino-3b": {"repo_id": "Davizig10jojo/BlazerRhino-3B-GGUF", "filename": "BlazerRhino-3B-Instruct.Q4_K_M.gguf", "min_size_mb": 1000},
@@ -62,6 +57,7 @@ for key, meta in MODEL_REGISTRY.items():
62
  except Exception as e:
63
  print(f"⚠️ Erro ao baixar {key}: {e}")
64
 
 
65
  api_app = FastAPI(title="Blazer GPU Engine")
66
  api_app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"])
67
 
@@ -85,7 +81,6 @@ def check_hf():
85
  def stream_generator(model_id: str, prompt_formatado: str, max_tokens: int, temperature: float):
86
  from llama_cpp import Llama
87
 
88
- # Fallback inteligente: se o modelo falhar ou não existir, usa o Tiny-1b que é mais estável
89
  if model_id not in MODEL_PATHS:
90
  model_id = "blazertiny-1b"
91
 
@@ -102,7 +97,6 @@ def stream_generator(model_id: str, prompt_formatado: str, max_tokens: int, temp
102
  use_mmap=True
103
  )
104
 
105
- # Stops agressivos para evitar alucinação e vazamento de pensamento
106
  stop_sequences = ["<|im_end|>", "</think>", "User:", "Assistant:", "I'm sorry", "I cannot"]
107
 
108
  response_stream = llm(
@@ -110,7 +104,7 @@ def stream_generator(model_id: str, prompt_formatado: str, max_tokens: int, temp
110
  max_tokens=max_tokens,
111
  temperature=temperature,
112
  top_p=0.95,
113
- repeat_penalty=1.15, # Penaliza repetições
114
  stop=stop_sequences,
115
  echo=False,
116
  stream=True
@@ -146,9 +140,7 @@ def stream_generator(model_id: str, prompt_formatado: str, max_tokens: int, temp
146
  @api_app.post("/v1/chat/completions")
147
  async def chat_completions(request: ChatCompletionRequest):
148
  try:
149
- # SYSTEM PROMPT BLINDADO: Força o português e proíbe recusas
150
  system_prompt = "Você é o Blazer, um assistente prestativo. Responda SEMPRE em português brasileiro de forma direta, curta e natural. NUNCA diga que não entende ou peça mais informações. Apenas responda ao cumprimento ou pergunta."
151
-
152
  prompt_formatado = f"<|im_start|>system\n{system_prompt}<|im_end|>\n"
153
 
154
  for msg in request.messages:
@@ -174,33 +166,22 @@ async def chat_completions(request: ChatCompletionRequest):
174
  async def listar_modelos():
175
  return {"object": "list", "data": [{"id": k, "object": "model", "created": 1677652288, "owned_by": "user"} for k in MODEL_PATHS.keys()]}
176
 
177
- def run_fastapi():
178
- uvicorn.run(api_app, host="127.0.0.1", port=8000, log_level="warning")
179
-
180
- def iniciar_ngrok():
181
- if not NGROK_TOKEN:
182
- print("⚠️ NGROK_TOKEN ausente.")
183
- return
184
- time.sleep(15)
185
- ngrok.set_auth_token(NGROK_TOKEN)
186
- for tentativa in range(5):
187
- try:
188
- ngrok.kill()
189
- time.sleep(3)
190
- public_url = ngrok.connect(8000, proto="http", bind_tls=True)
191
- print(f"\n🔗 URL POCKETPAL: {public_url.public_url}\n")
192
- return
193
- except Exception as e:
194
- time.sleep(10)
195
-
196
  with gr.Blocks() as demo:
197
  gr.Markdown("# 🦏 Blazer API Hub [ZeroGPU Otimizado]")
 
 
 
 
 
198
 
199
  if __name__ == "__main__":
200
  try:
201
  check_hf()
202
  except:
203
  pass
204
- threading.Thread(target=run_fastapi, daemon=True).start()
205
- threading.Thread(target=iniciar_ngrok, daemon=True).start()
206
- demo.launch(server_name="0.0.0.0", server_port=7860)
 
 
 
24
  os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
25
 
26
  # 3. IMPORTAÇÕES
 
 
27
  import time
28
  import traceback
29
  import json
 
34
  from fastapi.responses import StreamingResponse
35
  from pydantic import BaseModel
36
  from typing import List, Optional
 
37
  from huggingface_hub import hf_hub_download
38
  import spaces
39
 
 
 
40
  MODEL_REGISTRY = {
41
  "blazertiny-1b": {"repo_id": "Davizig10jojo/BlazerTiny-1b-GGUF", "filename": "blazertiny-1b-Q6_K.gguf", "min_size_mb": 200},
42
  "blazerrhino-3b": {"repo_id": "Davizig10jojo/BlazerRhino-3B-GGUF", "filename": "BlazerRhino-3B-Instruct.Q4_K_M.gguf", "min_size_mb": 1000},
 
57
  except Exception as e:
58
  print(f"⚠️ Erro ao baixar {key}: {e}")
59
 
60
+ # Instanciamos o FastAPI normalmente
61
  api_app = FastAPI(title="Blazer GPU Engine")
62
  api_app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"])
63
 
 
81
  def stream_generator(model_id: str, prompt_formatado: str, max_tokens: int, temperature: float):
82
  from llama_cpp import Llama
83
 
 
84
  if model_id not in MODEL_PATHS:
85
  model_id = "blazertiny-1b"
86
 
 
97
  use_mmap=True
98
  )
99
 
 
100
  stop_sequences = ["<|im_end|>", "</think>", "User:", "Assistant:", "I'm sorry", "I cannot"]
101
 
102
  response_stream = llm(
 
104
  max_tokens=max_tokens,
105
  temperature=temperature,
106
  top_p=0.95,
107
+ repeat_penalty=1.15,
108
  stop=stop_sequences,
109
  echo=False,
110
  stream=True
 
140
  @api_app.post("/v1/chat/completions")
141
  async def chat_completions(request: ChatCompletionRequest):
142
  try:
 
143
  system_prompt = "Você é o Blazer, um assistente prestativo. Responda SEMPRE em português brasileiro de forma direta, curta e natural. NUNCA diga que não entende ou peça mais informações. Apenas responda ao cumprimento ou pergunta."
 
144
  prompt_formatado = f"<|im_start|>system\n{system_prompt}<|im_end|>\n"
145
 
146
  for msg in request.messages:
 
166
  async def listar_modelos():
167
  return {"object": "list", "data": [{"id": k, "object": "model", "created": 1677652288, "owned_by": "user"} for k in MODEL_PATHS.keys()]}
168
 
169
+ # Criamos a interface Gradio
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
170
  with gr.Blocks() as demo:
171
  gr.Markdown("# 🦏 Blazer API Hub [ZeroGPU Otimizado]")
172
+ gr.Markdown("As rotas OpenAI-compatible estão disponíveis diretamente na URL deste Space.")
173
+
174
+ # O SEGREDO ESTÁ AQUI: Montamos o Gradio dentro do FastAPI app
175
+ # O caminho '/' servirá a interface do Gradio, liberando os outros endpoints
176
+ app = gr.mount_gradio_app(api_app, demo, path="/")
177
 
178
  if __name__ == "__main__":
179
  try:
180
  check_hf()
181
  except:
182
  pass
183
+
184
+ # IMPORTANTE: No Hugging Face, iniciamos o arquivo executando o objeto 'app' do FastAPI modificado via uvicorn
185
+ # Como o Hugging Face roda o arquivo direto, usamos a chamada padrão
186
+ import uvicorn
187
+ uvicorn.run(app, host="0.0.0.0", port=7860)