OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
Dashboard de análise esportiva profissional
Translation pending
Sports & fitnessPython · TypeScriptGitHub @wemarquesOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
calculo prognósticos esportivos
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Sistema profissional de cálculo de prognósticos esportivos com backend FastAPI, frontend Streamlit, dashboard Next.js, placares ao vivo, auditoria contínua por IA e calibração de modelos O SportsBankZU Pro é um sistema completo de análise e prognósticos esportivos que combina modelos estatísticos avançados com uma interface intuitiva e profissional.Read the full README ↗
Sistema profissional de cálculo de prognósticos esportivos com backend FastAPI, frontend Streamlit, dashboard Next.js, placares ao vivo, auditoria contínua por IA e calibração de modelos
Última revisão: 2026-03-05
O SportsBankZU Pro é um sistema completo de análise e prognósticos esportivos que combina modelos estatísticos avançados com uma interface intuitiva e profissional.
/live-scores no backend com cache de 1 minuto para eficiencia de rate limit (V3.4)None (V3.5.1)POST /api/ai/score-correction para correção manual de resultados com re-auditoria (V3.5.1)CLAUDE.md — 7 passos de verificação antes de qualquer correção (V3.5.1)python -m cli) com ClickA autenticacao ja esta integrada no app.py. Para ativar:
config.yaml localmente (na raiz) ou configure Secrets no Streamlit Cloud.PyYAML instalado (ja incluso no requirements.txt).O sistema é composto por três componentes principais que trabalham de forma integrada:
Backend FastAPI processa dados de jogos (CSVs locais ou fontes externas) e expõe endpoints REST com probabilidades para diferentes mercados (1X2, Over/Under, BTTS), valores de lambda (λ) e estatísticas detalhadas. O Frontend Streamlit consome a API do backend e apresenta os prognósticos em formato tabular e gráfico, incluindo o Quadro-Resumo Profissional formatado para compartilhamento. O Dashboard Next.js oferece uma interface moderna e responsiva com seleção de ligas, análise de jogos e visualização de picks recomendados.
O sistema oferece análise estatística baseada em modelos de Poisson, Expected Goals (xG) e lambda dinâmico. Gera prognósticos para múltiplos mercados incluindo Money Line, Over/Under, BTTS e Double Chance. O Quadro-Resumo Profissional apresenta mercados sugeridos, duplas e triplas SAFE com correlação controlada, além de regras de governança por regime de liga. Inclui sistema de autenticação com login e senha para controle de acesso, suporta múltiplas ligas europeias e internacionais, e permite deploy em Streamlit Cloud com configuração simplificada.
O SportsBankZU Pro inclui um sistema de autenticacao opcional que protege o acesso ao sistema atraves de login com usuario e senha.
O sistema oferece autenticação baseada em usuário e senha com senhas criptografadas usando hash SHA-256. Suporta múltiplos usuários com credenciais individuais, mantém sessão ativa durante o uso, possui botão de logout na sidebar, e é compatível com Streamlit Cloud através de Secrets.
Para implementar a autenticação, você precisará dos seguintes arquivos na raiz do projeto:
auth.py é o módulo principal de autenticação que gerencia login, logout e verificação de credenciais. config.yaml armazena as credenciais dos usuários com senhas em hash SHA-256. gerar_hash_senha.py (opcional) é um script auxiliar para gerar hash de novas senhas.
A autenticacao ja esta integrada no app.py. Para ativar:
config.yaml na raiz do projeto ou configure Secrets no Streamlit Cloud.PyYAML (ja incluso no requirements.txt).streamlit run app.py.O sistema vem pré-configurado com duas contas de teste:
| Usuário | Senha | Nome |
|---|---|---|
admin | admin | Administrador |
usuario1 | password | Usuário Teste |
Para criar hash de uma nova senha, execute o script auxiliar:
python gerar_hash_senha.py
Digite sua senha quando solicitado e copie o hash gerado. Cole o hash no arquivo config.yaml no campo password do usuário correspondente.
Antes de iniciar, certifique-se de ter os seguintes requisitos instalados:
O sistema requer Python 3.10 ou superior com as bibliotecas FastAPI, Uvicorn, Pandas, Numpy, Streamlit e PyYAML. O Backend FastAPI deve estar acessível publicamente ou localmente em http://localhost:5001. Os Secrets devem estar configurados para o Streamlit com a variável BACKEND_URL. Para uso em produção, defina as variáveis de ambiente FUTEBOL_ROOT (ou DATA_ROOT) e/ou FUTEBOL_DATA_DIR no backend para apontar para o storage correto. Além disso, é necessário Node.js 18 ou superior para o dashboard Next.js.
Primeiro, inicie o servidor backend que processa os dados e expõe a API:
# Criar ambiente virtual
python -m venv venv
# Ativar ambiente virtual
venv\Scripts\activate # Windows
source venv/bin/activate # Linux/Mac
# Instalar dependências
pip install fastapi uvicorn pandas numpy
# Iniciar servidor
uvicorn backend.main:app --reload --port 5001
O backend estará disponível em http://localhost:5001.
Em seguida, inicie a interface Streamlit:
# Instalar dependências (incluindo autenticação)
pip install -r requirements.txt
# Configurar URL do backend
set BACKEND_URL=http://localhost:5001 # Windows
export BACKEND_URL=http://localhost:5001 # Linux/Mac
# Iniciar Streamlit
streamlit run app.py
Acesse a interface em http://localhost:8501/.
Tela de Login: Ao acessar, você verá a tela de autenticação. Use as credenciais de teste (admin / admin) para entrar.
Por fim, inicie o dashboard moderno:
cd frontend/next
npm install
npm run dev
Acesse o dashboard em http://localhost:3000/dashboard. Em produção: sportsbankzu-pro-well.vercel.app/dashboard.
O projeto inclui uma CLI unificada construída com Click:
# Ajuda geral
python -m cli --help
# Listar ligas configuradas
python -m cli data leagues
# Descobrir dados disponíveis
python -m cli data discover
# Buscar fixtures
python -m cli data fixtures premier-league --date today
# Gerar Quadro-Resumo
python -m cli analysis quadro premier-league
# Previsões com mercados sugeridos
python -m cli analysis predict premier-league --date tomorrow
# Auditoria com IA (requer MISTRAL_API_KEY)
python -m cli analysis audit premier-league --match-index 0
# Iniciar backend
python -m cli server api --port 5001 --reload
# Iniciar backend + Streamlit juntos
python -m cli server dev
# Validar deploy
python -m cli server validate --backend-url https://api.exemplo.com
# Gerar hash de senha
python -m cli utils hash-password
# Rodar testes
python -m cli utils test --coverage
Após instalar com pip install -e ., o comando sportsbank fica disponível globalmente:
sportsbank data leagues
sportsbank analysis quadro premier-league
O dashboard Next.js possui testes E2E automatizados com Playwright:
cd frontend/next
# Instalar browsers (primeira vez)
npx playwright install --with-deps
# Rodar todos os testes
npm run test:e2e
# Modo visual interativo
npm run test:e2e:ui
# Com navegador visível
npm run test:e2e:headed
# Ver relatório HTML
npm run test:e2e:report
Testes disponíveis:
| Arquivo | Cobertura |
|---|---|
e2e/home.spec.ts | Página principal: header, banca, slider Kelly, estratégia, value bets |
e2e/dashboard.spec.ts | Dashboard: sidebar, stats, gráfico, seletor de liga |
e2e/ai-audit.spec.ts | Página de auditoria AI |
e2e/market-trends.spec.ts | Tendências de mercado: chips, gráfico |
e2e/performance-stats.spec.ts | Estatísticas: heat map, DRS zones, transfers |
e2e/navigation.spec.ts | Navegação entre páginas, theme toggle |
e2e/api.spec.ts | Rotas API: matches, decision/pre |
| # | País | Liga | ID | DNA |
|---|---|---|---|---|
| 1 | England | Premier League | premier-league | OFFENSIVE |
| 2 | England | Championship | championship | BALANCED |
| 3 | England | League One | league-one | DEFENSIVE |
| 4 | England | League Two | league-two | DEFENSIVE |
| 5 | Argentina | Primera Division | primera-division | BALANCED |
| 6 | Australia | A-League | a-league | BALANCED |
| 7 | Austria | Bundesliga | austrian-bundesliga | BALANCED |
| 8 | Belgium | Pro League | pro-league | BALANCED |
| 9 | Brazil | Serie A | brasileirao-serie-a | OFFENSIVE |
| 10 | Brazil | Serie B | brasileirao-serie-b | BALANCED |
| 11 | Colombia | Primera A | colombian-primera-a | BALANCED |
| 12 | Czech Republic | First League | czech-first-league | DEFENSIVE |
| 13 | Denmark | Superliga | superliga | BALANCED |
| 14 | France | Ligue 1 | ligue-1 | BALANCED |
| 15 | France | Ligue 2 | ligue-2 | DEFENSIVE |
| 16 | Germany | Bundesliga | bundesliga | OFFENSIVE |
| 17 | Germany | 2. Bundesliga | 2-bundesliga | BALANCED |
Para configuração local, crie o arquivo .streamlit/secrets.toml na raiz do projeto:
BACKEND_URL = "http://localhost:5001"
O arquivo config.yaml já vem pré-configurado com usuários de teste. Para produção, você deve:
python gerar_hash_senha.pyconfig.yaml com os hashes geradosconfig.yaml ao .gitignoreExemplo de config.yaml:
credentials:
usernames:
seu_usuario:
name: "Seu Nome Completo"
password: "hash_sha256_da_sua_senha_aqui"
outro_usuario:
name: "Outro Usuário"
password: "hash_sha256_da_outra_senha_aqui"
O dashboard Next.js requer a variável PY_BACKEND_URL para conectar ao backend FastAPI e exibir dados reais. Sem essa variável, o sistema usa mock data como fallback (comportamento intencional para desenvolvimento local sem backend).
Setup local:
# Copiar o arquivo de exemplo
tcp frontend/next/.env.example frontend/next/.env.local
# Editar com a URL do backend local
# PY_BACKEND_URL=http://localhost:5001
Deploy no Vercel (produção):
Para que o dashboard em produção use dados reais (e não mock data), configure a variável de ambiente no painel do Vercel:
PY_BACKEND_URL = URL do seu backend FastAPI (ex: https://seu-endpoint.execute-api.us-east-1.amazonaws.com)| Variável | Obrigatória | Descrição |
|---|---|---|
PY_BACKEND_URL | Sim (produção) | URL do backend FastAPI. Sem ela, o dashboard usa mock data |
NEXT_PUBLIC_PY_BACKEND_URL | Não | Variante pública para fetches client-side |
Importante: A branch
maindeve ser sempre a fonte da verdade para deploys em produção. Certifique-se de que features desenvolvidas em branches de trabalho sejam mergeadas namainantes do deploy final.
Para manter suas credenciais seguras, siga estas práticas recomendadas:
Nunca faça commit do config.yaml com senhas reais. Adicione o arquivo ao .gitignore executando echo "config.yaml" >> .gitignore. Use Streamlit Secrets para produção em vez de arquivos locais. Gere senhas fortes e armazene apenas os hashes SHA-256. Mantenha credenciais de teste separadas das credenciais de produção.
Certifique-se de que seu .gitignore inclui:
# Credenciais
config.yaml
.env
.env.local
# Dados sensíveis
*.csv
data/
# Python
__pycache__/
*.py[cod]
venv/
# Node
node_modules/
.next/
Antes de fazer deploy, prepare seu repositório:
# Adicionar config.yaml ao .gitignore
echo "config.yaml" >> .gitignore
# Fazer commit das alterações
git add .
git commit -m "feat: adiciona sistema de autenticação"
git push
Acesse streamlit.io/cloud e crie um novo app apontando para app.py na raiz do seu repositório GitHub.
Em Settings → Secrets, adicione as seguintes configurações:
# URL do Backend
BACKEND_URL = "https://seu-backend-publico:5001"
# Credenciais de Autenticação
[credentials.usernames.admin]
name = "Administrador"
password = "8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918"
[credentials.usernames.seu_usuario]
name = "Seu Nome"
password = "seu_hash_sha256_aqui"
Nota: O hash mostrado acima é da senha "admin" (apenas para exemplo).
Aguarde a conclusão da build. O app estará disponível em:
https://{nome-do-app}-{seu-usuario}.streamlit.app
O backend utiliza as seguintes variáveis de ambiente para localizar os dados:
FUTEBOL_ROOT (ou DATA_ROOT) define a raiz do projeto/dados (ex: /data/futebol). FUTEBOL_DATA_DIR especifica o caminho direto para a pasta data (ex: /data/futebol/data).
Se não definidas, o sistema usa o padrão C:\Users\wxamb\futebol\data (Windows) ou /home/ubuntu/futebol/data (Linux).
Teste os endpoints principais da API:
# Listar jogos de múltiplas ligas
GET http://localhost:5001/fixtures?leagues=premier-league,la-liga&date=today
# Descobrir ligas disponíveis
GET http://localhost:5001/discover
# Placares ao vivo (cache 1 min)
GET http://localhost:5001/live-scores
# Gerar quadro-resumo profissional
GET http://localhost:5001/quadro-resumo?league=premier-league&date=week&incluir_simples=true&incluir_duplas=true&incluir_triplas=false&incluir_governanca=true
# Corrigir score de jogo com dados ausentes/errados
POST http://localhost:5001/api/ai/score-correction
# Body: {"match_id": "...", "home_team": "Lanús", "away_team": "Boca Juniors", "home_goals": 0, "away_goals": 3, "league": "primera-division"}
Verifique se a interface está funcionando corretamente:
A tela de login deve aparecer ao acessar pela primeira vez. Após autenticação, a tabela de jogos deve mostrar os prognósticos com probabilidades e valores de λ nas tooltips. O Quadro-Resumo Profissional deve aparecer acima da tabela com opções para copiar e baixar. O gráfico interativo deve exibir as probabilidades de forma visual.
Confirme o funcionamento do dashboard:
A página inicial (/dashboard) deve carregar jogos por liga com filtros Hoje/Amanhã/Próxima Rodada. A aba Recomendadas 2026 exibe jogos com maior confiança. O botão Compartilhar captura a tela e permite enviar via WhatsApp (em dispositivos compatíveis) ou faz download da imagem e abre o WhatsApp com o link. Jogos ao vivo exibem placar atualizado automaticamente a cada 60s com indicador vermelho pulsante. A navegação é fluida e responsiva.
Se o backend for público e acessado de diferentes origens, adicione middleware CORS:
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["https://seu-app.streamlit.app"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
Se o backend não tiver acesso local aos CSVs, considere usar storage público (AWS S3, Google Cloud Storage) ou criar um endpoint específico para upload/download de dados.
Se CSVs forem usados pelo backend, eles precisam estar acessíveis para o servidor. Para deploy em produção, considere migrar para storage público ou criar um endpoint dedicado.
Quando a variável BACKEND_URL não responder, o app exibirá tabelas vazias. Verifique os logs do Streamlit e a conectividade com o backend.
A tela mostra a "Última atualização (fonte)" quando o backend fornece o campo lastUpdated na resposta da API.
O sistema de autenticação é obrigatório por padrão. Se desejar desabilitar temporariamente para testes, comente as linhas de autenticação no app.py.
Para informações mais detalhadas sobre componentes específicos, consulte:
solucao_autenticacao_streamlit.mdPROMPT_IMPLEMENTACAO_QUADRO_RESUMO_FINAL.mdhttp://localhost:5001/docs para documentação interativa (Swagger)CLAUDE.md na raiz do projeto com instruções, comandos, referências Context7 e regra de investigação obrigatóriaFootyStatsMatchInput — defaults de homeGoalCount, awayGoalCount, totalGoalCount alterados de 0 para None em data_mapper.py, eliminando a confusão entre "0 gols" e "dados ausentes"map_match_to_internal() — fallback 0 removido do mapeamento de gols; campos agora propagam None quando a API não retorna dadosfixtures_service.py — jogos ao vivo com dados de gol ausentes não são mais defaultados para 0-0; sistema loga warning e mantém match_score = Noneai_analysis.py batch audit agora pula jogos sem score verificado em vez de auditar contra 0-0 falsocron_handler.py — mesma validação de score None aplicada ao cron audit e ao tracking de dupla accuracyPOST /api/ai/score-correction para correção manual de resultados quando API retorna dados errados/ausentesSCORE_CORRECTION com confiança 100% e rastreabilidade completacron_handler.py batch auditdupla_intra_accuracy_pct, dupla_inter_accuracy_pct, dupla_overall_accuracy_pctdupla_intra_correct/total, dupla_inter_correct/totalNone antes de incluir no lookup — evita avaliação contra dados fantasmastatus_map() — removido "incomplete" do mapeamento para "live" em util_service.py; agora cai em "scheduled" (FootyStats usa "incomplete" para jogos não iniciados)fixtures_service.py — se API retorna "live" mas kickoff é > 2 min no futuro, override para "scheduled" com logging/live-scores — demote "live" → "scheduled" quando elapsed_min < -2, previne badges "AO VIVO" falsosCLAUDE.md com 7 passos mandatórios antes de qualquer correção:
BatchAuditPanel)localAudit.ts agora avalia cada dupla contra resultados reais dos jogos finalizados — avaliação determinística no browserresultado (ACERTOU/ERROU/PENDENTE) adicionado a AuditCombinada; campos de accuracy adicionados a AuditCombinadasclassify_league_dna()prediction_risk > 0.65 antes de aplicar estratégiasSafeBetsMatchInput, SafeBetsResult, StrategyResult, SafeBetsResponse com enums SafeBetTag, RiskLevel, LeagueCategoryTeamSafeBetsStats com model_validator para flatten automático de nested stats da API FootyStatsPOST /safe-bets/evaluate — avaliação em batch de matches com stats pré-carregadosGET /safe-bets/league-dna — consulta de perfis DNA por liga ou todas as 33GET /safe-bets/leagues — listagem de todas as ligas monitoradas com DNA integradoleagues_config.py expandido de 22 para 33 ligas com nomes alternativos para matching fuzzy002_add_safe_bets_leagues.sql com DDL para novas tabelas e inserção de season IDsSafeBetsBadge com indicadores visuais: badge de risco (SAFE verde, MODERADO amarelo, NO BET vermelho) e tags por estratégiaSafeBetTag, RiskLevel, SafeBetsResult, StrategyResult + config de labels/cores em SAFE_BET_TAG_CONFIGPOST /api/safe-bets encaminha avaliação ao backend com timeout de 30s/live-scores retorna placares e status de jogos em andamento/finalizados via FootyStats todays-matchesget_live_scores() no FootyStatsClient com cache de 1 minuto (vs 30 min do todays-matches padrao) para eficiencia de rate limitfixtures_service.py agora extrai placar para jogos com status live (antes apenas finished), incluindo placar do intervalo (halftime)model_update_recommendation no schema JSON — IA agora recomenda se modelo precisa re-treinoMistralAuditor inclui model_update_recommendation padrãomistral-medium-latest/large para o veloz e eficiente mistral-small-lateststatus_map (ignorando incomplete) para evitar que jogos agendados sobreponham o status "VIVO" no dashboard/api/matches/live/api/matches/live reescrita — substituido mock simulateLive() por chamada real ao backendfootystatsId adicionado ao tipo Match para correlacao precisa no pollingModelUpdateRecommendation com needs_update, urgency, reasons, recommended_actions, next_retrain_suggestiondashboard/page.tsx nao e mais feita automaticamente no useEffect para economizar custos, trocada por um botão "Gerar Análise AI" de ativacao manual no MatchDetailCardlocalAudit.ts — avaliação determinística instantânea (ACERTOU/ERROU) para todos os mercados (1X2, Over/Under, BTTS, Double Chance) sem depender do backend Lambda/api/ai/batch-audit/evaluate — recebe apenas estatísticas pré-computadas pelo browser (3-5s vs 30s+ anterior)min-width: 40px e white-space: nowrap|| tratava 0 como falso, ocultando dados válidos); seção comparativa expandida por padrão!= null em vez de ||try-except individual em cada match no fixtures_service.py com exc_info=True para tracebacks completosbuild_records_from_matches() protegido contra crash total — fallback para records = []teams_to_df() com tratamento por registro — times malformados são ignorados sem derrubar o loteleague_df e get_league_season_stats() com try-except individual — liga com dados incompletos não impede carregamento das demaismapMatchStats() em src/lib/matchStats.ts — elimina 55 linhas duplicadas entre dashboard e página de matchfetchCombinadas estabilizadas via useMemo para IDs de ligas — evita re-fetches desnecessáriostotal_goals_at_half_time, home/away_team_goal_count_half_timehome/away_team_goal_timings (minutos dos gols)home/away_team_first_half_cards, home/away_team_second_half_cardsattendance (público), referee (árbitro)odds_btts_no adicionado ao mapeamentowins/draws/losses, win/draw/loss_percentage, league_position (overall/home/away)clean_sheets, clean_sheet_percentage — crítico para análise BTTSbtts_count, btts_percentage — input direto para mercado BTTSfts_count, fts_percentage (failed to score) — complementa análise BTTS Nãoover05~45_percentage, under15/25_percentage — input direto para mercados O/Uxg_for_avg, xg_against_avg (overall/home/away) — melhora cálculo de lambdasaverage_total_goals_per_match, goal_difference, minutes_per_goal_scored/concededgoals_scored/conceded_half_time, médias por jogo HThome_advantage_percentage, prediction_risk, first_team_to_score_percentagepoints_per_game_home/away adicionadoscorners_against_per_match (overall/home/away) — escanteios do adversárioover85/95/105_corners_percentage — input direto para mercado de escanteiosshots_off_target_per_matchbtts_and_win_percentage, scored_both_halves_percentagegoals_scored/conceded_2h_per_match, btts_2h_percentagehome_advantage_percentage, home_scored/defence_advantage_percentageaverage_scored_home_team, average_scored_away_teamclean_sheets_percentage (nível liga)over_05~45_percentage (benchmarks da liga)xg_avg (xG médio da liga), prediction_riskmatches_completed, total_matches (progresso da temporada)_team_stat() para extrair qualquer coluna do teams_dfyellow_cards, red_cards, fouls, offsides, shots_off_target (nível de partida) — alimentam cálculos e comparativosleague-teams com &include=stats busca dados agregados por time (cartões, faltas, finalizações, chutes ao gol, posse, escanteios) — corrige gap onde teams_df era sempre None no path de APImap_team_to_internal() reescrito com mapeamento completo dos campos reais da API FootyStats (cardsAVG_overall, foulsAVG_overall, shotsAVG_overall, shotsOnTargetAVG_overall, cornersAVG_overall, possessionAVG_overall, etc.)team_shots_per_match() e cascata de fallbacks: team stats → histórico de partidas → média da liga / 2 (para cartões, faltas, finalizações, chutes ao gol, escanteios)foulsAVG_overall) e finalizações (shotsAVG_overall) adicionadas a league_dfbtts_multiplier e corner_multiplier do audit DB às probabilidades — anteriormente só aplicava lambda_home/away_multiplierEscanteios Over 8.5/9.5/10.5 adicionados a CALIBRATED_MARKETS e ao mapping calibrate_match_stats, permitindo calibração isotônica para escanteioslog_pick(), alimentando o calibrador com dados de Brier Score per-market (BTTS, corners, etc.)_evaluate_pick_deterministic agora avalia corretamente mercados de escanteios contra total_corners do jogo — anteriormente retornava sempre (100% erro)Promise.allSettled, evitando timeout do Lambda que processava tudo sequencialmente (45+ chamadas API FootyStats em série = 90-130s, estourando os 55s de timeout). Merge dos resultados é feito client-side em getMatchesByLeague() (frontend/next/src/lib/api.ts). REGRA: NÃO remover este fan-out — sem ele, o sistema volta a dar timeout com as 22 ligas.fetch/route.ts para TIMEOUT, CONNECTION_ERROR e HTTP 502/503/504 (cold start do Lambda)handleRetry agora replica a lógica completa do carregamento inicial (retry em cold start + fallback today→week)today_audit às 23:45 BRT para auditar jogos do mesmo dia (além do batch_audit de ontem às 20h)calibrator.py com Isotonic Regression para calibração de probabilidades:
TimeSeriesSplit (sem data leakage)retrain_calibrators para re-treino semanalimpact_percentage (0-20) adicionado ao schema de confidence_adjustment do ContextAnalyzerPara dúvidas, problemas ou sugestões:
Este projeto é proprietário e confidencial. Todos os direitos reservados.
Desenvolvido com ⚽ para análise profissional de prognósticos esportivos
| 18 | Greece | Super League | super-league-greece | BALANCED |
| 19 | Italy | Serie A | serie-a | BALANCED |
| 20 | Italy | Serie B | serie-b | DEFENSIVE |
| 21 | Japan | J-League | j-league | DEFENSIVE |
| 22 | Netherlands | Eredivisie | eredivisie | BALANCED |
| 23 | Netherlands | Eerste Divisie | eerste-divisie | BALANCED |
| 24 | Norway | Eliteserien | eliteserien | DEFENSIVE |
| 25 | Portugal | Primeira Liga | primeira-liga | BALANCED |
| 26 | Saudi Arabia | Professional League | professional-league | BALANCED |
| 27 | Scotland | Premiership | premiership | BALANCED |
| 28 | South Korea | K-League | k-league | DEFENSIVE |
| 29 | Spain | La Liga | la-liga | BALANCED |
| 30 | Spain | Segunda Division | segunda-division | BALANCED |
| 31 | Sweden | Allsvenskan | allsvenskan | DEFENSIVE |
| 32 | Switzerland | Super League | super-league | BALANCED |
| 33 | Turkey | Süper Lig | super-lig | BALANCED |
| 34 | UAE | Pro League | uae-pro-league | BALANCED |
| 35 | USA | MLS | mls | BALANCED |
/api/ai/batch-audit deprecada — retorna status: "success" com mensagem de atualização para navegadores com JS cacheado de deploys anterioresbuildId — detecta JS desatualizado após deploys Vercel e recarrega a página automaticamenteMatchDetailCard após ser sobrescrito durante resolução de conflito de layoutdate_unix do kickoff com heurística de override por dados de halftimeFalse_get_dynamic_thresholds() do audit DB com fallback para defaults, permitindo ajuste automático via auditoriaBTTS_THRESHOLD, BTTS_MULTIPLIER, CORNER_THRESHOLD, CORNER_MULTIPLIER adicionados a ADJUSTMENT_LIMITS, permitindo que Mistral sugira e aplique correções para esses mercadosrecommended_corrections