File size: 6,289 Bytes
10e4b23 | 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 143 144 145 146 147 148 | # Dossiê Técnico — THC LLM (backend)
**Data desta revisão:** 2026-07-25
**Repositório:** ~/thcllm — https://github.com/wilkertoigo/thcllm (mirror) + https://huggingface.co/spaces/HulkToigo/THCLLM (produção)
**HEAD:** 01dc751 — sincronizado em `origin` (HF Space) e `github` (mirror)
> Nota de proveniência: este arquivo existiu por engano no repositório
> `thc-cli` (commit `53bc8e0`, removido em `d1402e6`). O conteúdo é
> especificamente sobre o backend `app.py` do thcllm, não sobre a CLI —
> por isso foi movido para cá.
---
## 1. Estado do git (verificado em 2026-07-25)
- Branch: `main`, working tree clean.
- `origin` (HF Space) e `github` (mirror) **agora sincronizados** — antes
desta revisão, `github` estava travado em `d07fc84` (bem atrás,
faltavam ~24 commits incluindo toda a Fase 6/MCP e todo o trabalho de
tool calling). Corrigido com `git push github main:main` (fast-forward
confirmado seguro via `git merge-base --is-ancestor`).
- HEAD atual: `01dc751 fix(app): reordena schemas de tools/Anthropic e
adiciona from __future__ import annotations`.
## 2. Tool calling — estado funcional
Implementado em dois formatos:
- **OpenAI-compatible** (`/v1/chat/completions`) — `tools` no formato
`{"type":"function","function":{...}}`.
- **Anthropic-compatible** (`/v1/messages`, `/v1/messages/stream`) —
`tools` no formato `{"name","description","input_schema"}`, usado pelo
Claude Code SDK.
**Confirmado em produção**: curl real contra
`https://hulktoigo-thcllm.hf.space/v1/messages` com uma tool `get_weather`
retornou corretamente bloco `tool_use` com `stop_reason: "tool_use"`.
Testado com `llama33-70b-groq` (backend groq).
### Schemas (ordem confirmada em app.py, linhas 416-490)
416: class ToolFunctionParameters(BaseModel)
422: class ToolFunction(BaseModel)
428: class Tool(BaseModel)
433: class AnthropicMessage(BaseModel)
438: class AnthropicTool(BaseModel)
462: class ChatRequest(BaseModel) # usa Tool
490: class AnthropicRequest(BaseModel) # usa AnthropicTool
`from __future__ import annotations` está na linha 1 do arquivo — blindagem
permanente contra `NameError` de forward-reference em type hints.
## 3. PENDÊNCIA ATIVA — regressão encontrada nesta revisão
`grep -n "não suporta tool calling" app.py` retorna **vazio**.
Os warnings de log que avisam quando `req.tools` é enviado para um backend
que não suporta tool calling (`transformers`, `gguf`, `kilo`) existiam no
commit `ce54b53` original, mas se perderam na sequência de
revert/fix (`5ccd423` → `dbb524c`) e nunca foram restaurados. O `dbb524c`
("restaura suporte a tool calling sem SyntaxError") só recuperou a lógica
de `openrouter`/`groq`/`mistral`/`gemini`, não esses três warnings.
**Impacto**: baixo (comportamental, não funcional — hoje `req.tools`
simplesmente é ignorado nesses backends sem log, o que dificulta debug se
alguém tentar usar tools num modelo local/kilo sem perceber que não tem
efeito).
**Ação recomendada**: reintroduzir os 3 `logger.warning(...)` nos blocos
`if backend == "transformers"`, `elif backend == "gguf"`, `elif backend ==
"kilo"` de `chat_completions` e `chat_completions_async` — ver diff de
`ce54b53` para o texto exato original.
## 4. Pendências herdadas do relatório anterior (ainda não verificadas)
1. Testar `/v1/chat/completions` (formato OpenAI) pós-fix `01dc751`.
2. Testar `/v1/messages/stream` (SSE) com cliente real — só o
não-streaming foi validado.
3. Testar tool calling com mistral, openrouter e gemini (só groq foi
confirmado, e antes dos 3 incidentes de produção desta sessão).
4. Reintroduzir os warnings de backend sem suporte (ver seção 3 acima).
## 5. Inconsistência de schema em config.py (observação, não corrigida)
`TEXT_MODELS` mistura dois esquemas de chave:
- Backends remotos (`kilo`, `openrouter`, `groq`, `mistral`, `gemini`):
usam `model_id`.
- Backends locais (`transformers`, `gguf`): usam `id` / `repo`+`file`.
Código que acesse `TEXT_MODELS[k]["model_id"]` genericamente pode gerar
`KeyError` para entradas locais. Não corrigido nesta revisão — só
documentado.
## 6. Estrutura do repositório
~/thcllm/
├── app.py (1838 linhas)
├── auth.py (103 linhas)
├── config.py (316 linhas)
├── models.py (141 linhas)
├── exceptions.py (46 linhas)
├── logger.py (14 linhas)
├── Dockerfile
├── requirements.txt
├── teste.py (stub: soma(a,b))
├── knowledge/, skills/
├── RELATORIO_TECNICO.md
├── SECURITY_INCIDENT_2026-07.md
└── DOSSIE_TECNICO_2026-07-25.md (este arquivo)
Sem pasta `tests/` — toda validação é manual (`py_compile`, `ast.parse`,
curl sequencial contra produção). O Space não tem CI.
## 7. Endpoints registrados
| método | path |
|---|---|
| GET | `/` |
| GET | `/login`, `/auth/google`, `/auth/callback`, `/logout`, `/me` |
| GET | `/v1/models`, `/v1/quota` |
| POST | `/v1/knowledge/reload` |
| POST | `/v1/chat/completions` |
| POST | `/v1/images/generations` |
| POST | `/v1/audio/generations` |
| POST | `/v1/audio/transcriptions` |
| GET | `/v1/transcription-models` |
| POST | `/v1/messages`, `/v1/messages/stream` |
`/docs`, `/redoc`, `/openapi.json` ficam desativados por padrão
(`THC_DEBUG=true` para habilitar).
## 8. Lições de processo desta revisão (2026-07-25)
- Documentação e código divergem com facilidade quando há dois repos git
separados (thc-cli / thcllm) apontando pra propósitos diferentes — um
dossiê técnico do thcllm foi commitado por engano no repo do thc-cli.
Antes de aceitar qualquer doc como verdade, confirmar com `git log`,
`grep`, `find` no código real.
- Remote secundário (`github` mirror do thcllm) pode ficar
silenciosamente desatualizado por múltiplos ciclos de trabalho — vale
checar `git log <remote>/main --oneline` periodicamente, não só o
remote principal de deploy.
- "Pendência antiga" registrada em relatório anterior (script de
desativação do huggingface_provider) já tinha sido resolvida por outro
caminho (comentário + import comentado em `providers/__init__.py` do
thc-cli, datado de 2026-07-25) — relatórios precisam ser revalidados
contra o código antes de serem tratados como lista de tarefas viva.
|