API para conversão assíncrona de documentos e páginas em chunks estruturados, com opção de retornar também o texto completo em Markdown.
O processamento é feito em segundo plano com fila Redis + RQ. A API apenas recebe a requisicao, cria o job e expoe o status da execucao.
src/
app.py # API HTTP e rotas administrativas
worker.py # Inicializacao do worker RQ
tasks.py # Ponto de entrada dos jobs em segundo plano
document_processor.py # Conversao com Docling e geracao de chunks
rq_helpers.py # Helpers de compatibilidade para APIs de resultado/job id do RQ
auth/
config.py
models.py
repository.py
validators.py
Use .env.example como base.
Principais variaveis:
APP_NAMEAPP_VERSIONAPP_ORIGINSHF_TOKENEMBEDDING_MODELMAX_TOKENSDOCS_URL_ENABLEDADMIN_DOCS_ENABLEDADMIN_API_TOKENSTOKEN_DB_PATH
Observacoes:
ADMIN_API_TOKENSaceita um ou mais tokens administrativos separados por virgula.TOKEN_DB_PATHusadata/tokens.dbpor padrao e e utilizado pelo container da API.HF_TOKENe repassado ao worker para autenticar downloads de modelos quando necessario.
POST /document_to_markdown exige:
Authorization: Bearer <user-token>
Os tokens de usuario sao armazenados em SQLite e podem ser gerenciados pelas rotas administrativas.
As rotas administrativas exigem:
Authorization: Bearer <admin-token>
O token administrativo e lido de ADMIN_API_TOKENS no .env.
GET /GET /status/{task_id}
POST /document_to_markdown
Campos do formulario:
urlobrigatorioinclude_full_textopcional, booleano, padraofalse
GET /admin/tokensPOST /admin/tokensPATCH /admin/tokens/{token_id}DELETE /admin/tokens/{token_id}
As rotas administrativas podem ser ocultadas do Swagger com ADMIN_DOCS_ENABLED=false.
O proprio Swagger pode ser desabilitado com DOCS_URL_ENABLED=false.
cp .env.example .envNo minimo, defina:
APP_NAME="Docs Para Markdown"
APP_VERSION="1.0.0"
ADMIN_API_TOKENS="admin-token"
HF_TOKEN=""O docker-compose.yml atual monta estes caminhos a partir da maquina host:
./db-> banco SQLite de tokens./models-> cache de modelos
Crie-os se necessario:
mkdir -p db modelsO arquivo de compose usa a rede externa proxy.
Se ela ainda nao existir:
docker network create proxydocker compose up -d --buildServicos:
converter_markdown_apiconverter_markdown_workerconverter_markdown_redis
A API ficara disponivel em:
http://localhost:8000
curl -X POST http://localhost:8000/admin/tokens \
-H "Authorization: Bearer admin-token" \
-H "Content-Type: application/json" \
-d '{"token":"client-token","active":true}'curl -X POST http://localhost:8000/document_to_markdown \
-H "Authorization: Bearer client-token" \
-F "url=https://example.com/document.pdf" \
-F "include_full_text=true"Exemplo de resposta:
{
"task_id": "job-id",
"status": "queued"
}curl http://localhost:8000/status/job-idQuando concluir, a resposta tera este formato:
{
"status": "done",
"elapsed_seconds": 12.34,
"result": {
"chunks": [
{
"text": "chunk text",
"meta": {}
}
],
"document": "# Full markdown text"
}
}Se include_full_text=false, o campo document e omitido.
- O banco de tokens e persistido via
./db:/app/data - O cache de modelos e persistido via
./models:/models