Lucas S. Vieira


Python + API de LLM


Conectando com modelos locais


Guilda de IA

Recap: Semana 04

  • Variáveis, listas, dicionários, funções
  • Loops, condicionais, strings e JSON
  • Mensagens de LLM = lista de dicts

"Python é a ferramenta. O LLM é o cérebro. A API é a ponte."

O que é uma API de LLM?

  • API = garçom entre seu código e o modelo
  • Você manda JSON, recebe JSON
  • Esse padrão é universal — Ollama, llama.cpp, OpenAI, todos igual

Entender HTTP = entender todas as APIs de LLM.

O setup: Ollama

curl -fsSL https://ollama.com/install.sh | sh
ollama pull gemma4:e2b-it-qat
  • Servidor local na porta 11434
  • Sem API key, sem conta, sem custo
  • Baixou, é seu — roda até sem internet

No Colab o notebook já faz o setup pra você.

🔴 Demo 1: Colab — Ollama + gemma4

  1. Abrir luksamuk.codes/pages/guilda-ia → Semana 05
  2. Clicar em 📓 Colab
  3. Rodar as células: setup → warm up → chat com memória

Warm up de ~2-3 min na primeira vez. Depois: respostas rápidas.

Chat com memória

  • Cada chamada manda o histórico completo
  • O modelo não "lembra" — recebe tudo de novo
  • É uma lista de dicts: system → user → assistant → user → ...

É como repetir toda a conversa toda vez que você fala.

Direto no motor: llama-server

llama-server \
  --port 8081 \
  --model ~/.llama-models/lfm2.5-2.6b/LFM2.5-2.6B-QAD-Q4_0.gguf \
  --fit on --fit-target 512 \
  --ctx-size 8192 \
  --jinja \
  --temp 0.1 --top-p 0.9 --top-k 50 --min-p 0.0 \
  --repeat-penalty 1.1 \
  --cache-type-k q4_0 --cache-type-v q4_0 \
  --flash-attn auto

Variante com reasoning

llama-server \
  (igual ao de cima) \
  --reasoning on        # ← única flag que muda

lfm2.5-2.6b:think no llama-swap: o mesmo modelo, com o rascunho de raciocínio embaixo da resposta.

O padrão universal: /v1/chat/completions

import requests
import json

response = requests.post(
    "http://localhost:12434/v1/chat/completions",
    json={
        "model": "lfm2.5-2.6b",
        "messages": [
            {"role": "system", "content": "..."},
            {"role": "user", "content": "O que é Python?"}
        ],
        "temperature": 0.7,
        "max_tokens": 8192
    }
)

response_dict = response.json()
print(json.dumps(response_dict, indent=2, sort_keys=True))

Um código, N servidores

requests.post(url, json=payload)
  • O payload é idêntico. O HTTP não sabe a diferença.

Ferramentas como o llama-swap trocam de modelo a quente.

Tratamento de Erros

Código Significado O que fazer
ConnectionError Servidor não existe Subir o servidor!
404 Modelo não encontrado Conferir em /api/tags
429 Rate limit Aguardar e tentar
500 Erro do servidor Conferir payload

Erro clássico: esquecer de subir o servidor antes da requisição.

Exercícios

  1. Função perguntar() universal (só muda a URL)
  2. Chat com memória (dicts, sem classes)
  3. Dois servidores, mesma requisição
  4. Tratamento de erros com try/except

Todos os exercícios estão na apostila com gabarito.

Para a próxima aula

  • Ter o Ollama instalado (local) — ou usar o Colab
  • Nenhuma API key necessária — o modelo é seu
  • Próxima aula: Estrutura de um agente!

Perguntas?