caarleexx commited on
Commit
45d9742
Β·
verified Β·
1 Parent(s): ebce6a3

Upload entrypoint (1).sh

Browse files
Files changed (1) hide show
  1. entrypoint (1).sh +359 -0
entrypoint (1).sh ADDED
@@ -0,0 +1,359 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+
5
+ echo "╔════════════════════════════════════════════════════════════════════╗"
6
+ echo "β•‘ ParaAi v5.0 - Sistema HΓ­brido (Flex/Batch/Gemini/OpenRouter) β•‘"
7
+ echo "β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•"
8
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸš€ Iniciando ParaAi v5.0..."
9
+ echo ""
10
+
11
+ # ============================================================================
12
+ # VALIDAÇÃO DE AMBIENTE
13
+ # ============================================================================
14
+
15
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ” Validando ambiente..."
16
+
17
+ # GIT_TOKEN obrigatΓ³rio
18
+ if [[ -z "${GIT_TOKEN}" ]]; then
19
+ echo "❌ GIT_TOKEN não definido"
20
+ exit 1
21
+ fi
22
+
23
+ # PROCESSING_MODE (padrΓ£o: flex)
24
+ export PROCESSING_MODE="${PROCESSING_MODE:-flex}"
25
+
26
+ # Valida modo
27
+ if [[ ! "$PROCESSING_MODE" =~ ^(flex|batch|gemini|openrouter)$ ]]; then
28
+ echo "❌ PROCESSING_MODE invÑlido: $PROCESSING_MODE"
29
+ echo " Valores aceitos: flex, batch, gemini, openrouter"
30
+ exit 1
31
+ fi
32
+
33
+ # Valida API Keys por modo
34
+ if [[ "$PROCESSING_MODE" == "gemini" ]]; then
35
+ if [[ -z "${GEMINI_API_KEY}" ]]; then
36
+ echo "❌ GEMINI_API_KEY não definida (modo: gemini)"
37
+ exit 1
38
+ fi
39
+
40
+ elif [[ "$PROCESSING_MODE" == "flex" ]] || [[ "$PROCESSING_MODE" == "batch" ]]; then
41
+ if [[ -z "${GROQ_API_KEY}" ]]; then
42
+ echo "❌ GROQ_API_KEY não definida (modo: $PROCESSING_MODE)"
43
+ exit 1
44
+ fi
45
+
46
+ elif [[ "$PROCESSING_MODE" == "openrouter" ]]; then
47
+ if [[ -z "${OPENROUTER_API_KEY}" ]]; then
48
+ echo "❌ OPENROUTER_API_KEY não definida (modo: openrouter)"
49
+ exit 1
50
+ fi
51
+ fi
52
+
53
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] βœ… ValidaΓ§Γ΅es concluΓ­das"
54
+ echo ""
55
+
56
+ # ============================================================================
57
+ # CONFIGURAÇÃO GIT
58
+ # ============================================================================
59
+
60
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ”§ Configurando Git..."
61
+
62
+ git config --global user.email "paraai-worker@bot.com"
63
+ git config --global user.name "ParaAi Worker v5.0"
64
+ git config --global pull.rebase true
65
+
66
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] βœ… Git configurado"
67
+
68
+ # ============================================================================
69
+ # CRIAÇÃO DE DIRETΓ“RIOS
70
+ # ============================================================================
71
+
72
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ“ Criando diretΓ³rios..."
73
+
74
+ mkdir -p trabalho/dados_llm
75
+ mkdir -p trabalho/batches_temp
76
+ mkdir -p repo_git_temp
77
+
78
+ # Garante permissΓ΅es
79
+ chmod -R 755 trabalho/ 2>/dev/null || true
80
+ chmod -R 755 repo_git_temp/ 2>/dev/null || true
81
+
82
+ # Limpa repo_git_temp se nΓ£o for repo vΓ‘lido
83
+ if [ -d "repo_git_temp" ] && [ "$(ls -A repo_git_temp)" ]; then
84
+ if [ ! -d "repo_git_temp/.git" ]; then
85
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️ repo_git_temp não é repo vÑlido, limpando..."
86
+ rm -rf repo_git_temp/* 2>/dev/null || true
87
+ rm -rf repo_git_temp/.* 2>/dev/null || true
88
+ fi
89
+ fi
90
+
91
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] βœ… DiretΓ³rios criados"
92
+ echo ""
93
+
94
+ # ============================================================================
95
+ # INFORMAÇÕES DA CONFIGURAÇÃO
96
+ # ============================================================================
97
+
98
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
99
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ“Š CONFIGURAÇÃO DO SISTEMA"
100
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
101
+
102
+ # RepositΓ³rio
103
+ export GITHUB_REPO="${GITHUB_REPO:-carlex22/ParaAi}"
104
+ export GITHUB_BRANCH="${GITHUB_BRANCH:-main}"
105
+
106
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ“¦ RepositΓ³rio: $GITHUB_REPO"
107
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🌿 Branch: $GITHUB_BRANCH"
108
+
109
+ # Modo de processamento
110
+ echo ""
111
+
112
+ if [[ "$PROCESSING_MODE" == "flex" ]]; then
113
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⚑ MODO: FLEX Processing"
114
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Tipo: SΓ­ncrono"
115
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Rate Limit: 500 req/min (10x on-demand)"
116
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ PreΓ§o: Pay-as-you-go"
117
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Workers: ${NUM_WORKERS:-30}"
118
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Ideal para: ProduΓ§Γ£o rΓ‘pida"
119
+
120
+ elif [[ "$PROCESSING_MODE" == "batch" ]]; then
121
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ“¦ MODO: BATCH API"
122
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Tipo: AssΓ­ncrono"
123
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Rate Limit: Sem limite"
124
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ PreΓ§o: 50% desconto πŸ’°"
125
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Completion Window: ${BATCH_COMPLETION_WINDOW:-24h}"
126
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Poll Interval: ${BATCH_POLL_INTERVAL:-30}s"
127
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Ideal para: Volume grande (>100k reqs)"
128
+
129
+ elif [[ "$PROCESSING_MODE" == "gemini" ]]; then
130
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ€– MODO: GEMINI"
131
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Tipo: SΓ­ncrono"
132
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Rate Limit: 15 req/min"
133
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ PreΓ§o: GrΓ‘tis (free tier)"
134
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Workers: ${NUM_WORKERS:-10}"
135
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ πŸ”₯ ResiliΓͺncia: RetryDelay automΓ‘tico"
136
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Ideal para: Teste/desenvolvimento"
137
+
138
+ elif [[ "$PROCESSING_MODE" == "openrouter" ]]; then
139
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🌐 MODO: OPENROUTER"
140
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Tipo: SΓ­ncrono"
141
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Rate Limit: 200 req/min (adaptativo)"
142
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ PreΓ§o: Varia por modelo"
143
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Workers: ${NUM_WORKERS:-20}"
144
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Modelos: 200+ disponΓ­veis"
145
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Ideal para: Qualidade e variedade"
146
+ fi
147
+
148
+ # Modelos
149
+ echo ""
150
+
151
+ if [[ "$PROCESSING_MODE" == "gemini" ]]; then
152
+ export GEMINI_MODEL="${GEMINI_MODEL:-gemini-2.0-flash-exp}"
153
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🎯 Modelo: $GEMINI_MODEL"
154
+
155
+ elif [[ "$PROCESSING_MODE" == "openrouter" ]]; then
156
+ export OPENROUTER_MODEL="${OPENROUTER_MODEL:-openai/gpt-4o-mini}"
157
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🎯 Modelo: $OPENROUTER_MODEL"
158
+ export OPENROUTER_SITE_URL="${OPENROUTER_SITE_URL:-https://github.com/caarleexx/ParaAi}"
159
+ export OPENROUTER_SITE_NAME="${OPENROUTER_SITE_NAME:-ParaAi}"
160
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Site: $OPENROUTER_SITE_NAME"
161
+
162
+ else
163
+ export GROQ_MODEL="${GROQ_MODEL:-llama-3.3-70b-versatile}"
164
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🎯 Modelo: $GROQ_MODEL"
165
+ fi
166
+
167
+ # Chunks
168
+ echo ""
169
+ export REGISTROS_POR_CHUNK="${REGISTROS_POR_CHUNK:-100}"
170
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ“¦ Registros por chunk: $REGISTROS_POR_CHUNK"
171
+
172
+ # Retry (apenas para modos sΓ­ncronos)
173
+ if [[ "$PROCESSING_MODE" != "batch" ]]; then
174
+ export MAX_RETRIES="${MAX_RETRIES:-500000}"
175
+ export REQUEST_TIMEOUT="${REQUEST_TIMEOUT:-30000}"
176
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ”„ Max retries: $MAX_RETRIES"
177
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⏱️ Timeout: ${REQUEST_TIMEOUT}s"
178
+ fi
179
+
180
+ # Batch especΓ­fico
181
+ if [[ "$PROCESSING_MODE" == "batch" ]]; then
182
+ export MAX_BATCH_SIZE="${MAX_BATCH_SIZE:-1000}"
183
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ“¦ Max batch size: $MAX_BATCH_SIZE registros"
184
+ fi
185
+
186
+ # EstatΓ­sticas rastreadas
187
+ echo ""
188
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ“Š EstatΓ­sticas rastreadas:"
189
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Registros processados"
190
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Tokens consumidos"
191
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Retries 429 (Rate Limit)"
192
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Retries 498 (Capacity)"
193
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Retries 503 (Service Unavailable) πŸ†•"
194
+
195
+ if [[ "$PROCESSING_MODE" == "gemini" ]]; then
196
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] β€’ Retries Quota (Gemini RetryDelay) πŸ†•"
197
+ fi
198
+
199
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
200
+ echo ""
201
+
202
+ # ============================================================================
203
+ # VALIDAÇÃO DE ARQUIVOS
204
+ # ============================================================================
205
+
206
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ”Ž Verificando arquivos necessΓ‘rios..."
207
+
208
+ REQUIRED_FILES=(
209
+ "config.py"
210
+ "worker_orquestrador_hybrid.py"
211
+ "llm_worker_hybrid.py"
212
+ "batch_client.py"
213
+ "queue_manager.py"
214
+ "git_manager.py"
215
+ "result_collector.py"
216
+ "app.py"
217
+ )
218
+
219
+ MISSING_FILES=()
220
+ for file in "${REQUIRED_FILES[@]}"; do
221
+ if [ ! -f "$file" ]; then
222
+ MISSING_FILES+=("$file")
223
+ fi
224
+ done
225
+
226
+ if [ ${#MISSING_FILES[@]} -gt 0 ]; then
227
+ echo "❌ Arquivos ausentes:"
228
+ for file in "${MISSING_FILES[@]}"; do
229
+ echo " - $file"
230
+ done
231
+ exit 1
232
+ fi
233
+
234
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] βœ… Todos os arquivos necessΓ‘rios presentes"
235
+ echo ""
236
+
237
+ # ============================================================================
238
+ # TESTE DE IMPORTAÇÕES
239
+ # ============================================================================
240
+
241
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ§ͺ Testando importaΓ§Γ΅es Python..."
242
+
243
+ python3 << 'PYEOF'
244
+ import sys
245
+
246
+ try:
247
+ from config import PROCESSING_MODE, validate_config
248
+ print(f" βœ… config.py OK")
249
+
250
+ validate_config()
251
+ print(f" βœ… ConfiguraΓ§Γ£o validada")
252
+ print(f" ℹ️ Modo: {PROCESSING_MODE.value}")
253
+
254
+ except Exception as e:
255
+ print(f" ❌ Erro: {e}")
256
+ sys.exit(1)
257
+ PYEOF
258
+
259
+ if [ $? -ne 0 ]; then
260
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Falha na validação de configuração"
261
+ exit 1
262
+ fi
263
+
264
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] βœ… ImportaΓ§Γ΅es OK"
265
+ echo ""
266
+
267
+ # ============================================================================
268
+ # MENSAGEM DE BOAS-VINDAS v5.0
269
+ # ============================================================================
270
+
271
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
272
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸŽ‰ NOVIDADES v5.0"
273
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
274
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✨ OpenRouter - 200+ modelos LLM"
275
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ”₯ ResiliΓͺncia Gemini com RetryDelay"
276
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ›‘οΈ Retry inteligente por tipo de erro"
277
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ“Š EstatΓ­sticas aprimoradas"
278
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
279
+ echo ""
280
+
281
+ # ============================================================================
282
+ # INICIAR WORKER ORQUESTRADOR
283
+ # ============================================================================
284
+
285
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ€– Iniciando Worker Orquestrador..."
286
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
287
+ echo ""
288
+
289
+ # FunΓ§Γ£o para iniciar worker com retry
290
+ start_worker() {
291
+ local max_retries=3
292
+ local retry=0
293
+
294
+ while [ $retry -lt $max_retries ]; do
295
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ”„ Tentativa $((retry + 1))/$max_retries de iniciar worker..."
296
+
297
+ python3 -u worker_orquestrador_hybrid.py &
298
+ WORKER_PID=$!
299
+
300
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ℹ️ Worker PID: $WORKER_PID"
301
+
302
+ # Aguarda 10s para verificar se iniciou
303
+ sleep 10
304
+
305
+ if kill -0 $WORKER_PID 2>/dev/null; then
306
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] βœ… Worker iniciado com sucesso!"
307
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ“Š Monitorando PID: $WORKER_PID"
308
+ return 0
309
+ else
310
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️ Worker falhou ao iniciar"
311
+ retry=$((retry + 1))
312
+
313
+ if [ $retry -lt $max_retries ]; then
314
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ—‘οΈ Limpando estado..."
315
+
316
+ # Reseta repo git
317
+ if [ -d "repo_git_temp/.git" ]; then
318
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ”„ Resetando repo Git..."
319
+ (cd repo_git_temp && git reset --hard HEAD 2>/dev/null) || true
320
+ else
321
+ rm -rf repo_git_temp/* 2>/dev/null || true
322
+ rm -rf repo_git_temp/.* 2>/dev/null || true
323
+ fi
324
+
325
+ sleep 3
326
+ fi
327
+ fi
328
+ done
329
+
330
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Worker não iniciou após $max_retries tentativas"
331
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ℹ️ Dashboard continuarΓ‘ disponΓ­vel (modo read-only)"
332
+ return 1
333
+ }
334
+
335
+ start_worker
336
+ sleep 3
337
+ echo ""
338
+
339
+ # ============================================================================
340
+ # INICIAR DASHBOARD
341
+ # ============================================================================
342
+
343
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🌐 Iniciando Dashboard FastAPI..."
344
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
345
+ echo ""
346
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ“Š Dashboard: http://0.0.0.0:7860"
347
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ“ˆ API Stats: http://0.0.0.0:7860/api/stats"
348
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] πŸ’š Health Check: http://0.0.0.0:7860/health"
349
+ echo ""
350
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
351
+ echo ""
352
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] βœ… Sistema v5.0 inicializado!"
353
+ echo ""
354
+
355
+ # ============================================================================
356
+ # EXEC UVICORN
357
+ # ============================================================================
358
+
359
+ exec uvicorn app:app --host 0.0.0.0 --port 7860 --log-level info