Lucas S. Vieira


Primeira Ferramenta


Dando poderes ao agente


Guilda de IA

đź“° Fofocas da Semana

  • Qwen3.7-Plus (01/06) — multimodal (texto+visĂŁo), irmĂŁo do Max (text-only), 1M ctx, API-only preview
    • Max: reasoning puro, IA Index 56.6, #1 chinĂŞs
    • Plus: enxerga imagens, screenshots, gráficos — Max nĂŁo consegue
  • Mellum2 (01/06) — JetBrains, 12B MoE (2.5B ativos, 64 experts/8 ativas), 131K ctx, Apache 2.0, foco em routing/RAG/sub-agentes 🔓
  • NVIDIA RTX Spark (01/06) — superchip consumer: Grace CPU 20-core + Blackwell GPU, 128GB unified, 1 PF FP4, outono 2026
  • NVIDIA DGX Station (01/06) — workstation enterprise: GB300 Blackwell Ultra, Grace 72-core, 748 GB, 20 PF FP4, ~US$97k, Q4 2026
  • OpenClaw (02/06) — projeto open-source de agentes chega no Windows; integra com MXC (Microsoft Execution Containers), sandbox OS-level, fluxos multi-step com isolamento 🦞
    • NVIDIA OpenShell — runtime Apache 2.0 pra agentes autĂ´nomos, construĂ­do sobre MXC, inclui harnesses pra Hermes Agent 🛡️
  • Hermes Agent (02/06) — suporte nativo Windows (sem WSL!): CLI, gateway, cron, browser, MCP tudo nativo; novo Hermes Desktop App (macOS + Windows) com instalador GUI 🖥️
  • Gemma 4 12B (03/06) — encoder-free unificado, 11.95B dense, texto+imagem+áudio nativo, Apache 2.0, GGUF disponĂ­vel 🔓
    • Gemma 4 QAT (05/06) — quantização-aware training oficial: Q40 QAT com menos perda que PTQ, formato mobile com 2-bit seletivo, E2B text-only < 1 GB 🔓
  • MAI-Thinking-1 — 35B MoE (~1T total), reasoning, 97% AIME 2025, 53% SWE-Bench Pro, 256K ctx, "not distilled"
  • MAI-Code-1-Flash — cĂłdigo, inferĂŞncia eficiente, integrado ao GitHub Copilot
  • MAI-Transcribe-1 / MAI-Voice-1 / MAI-Image-2 — STT, TTS, imagem (lançados em abril)
    • API-only (Azure Foundry + GitHub Models + OpenRouter), sem open weights, preview privado
  • NVIDIA Nemotron 3 Ultra (04/06) — 550B Hybrid Mamba-2/Transformer/LatMoE (55B ativos), #1 US open-weights (IA Index 48, atrás de Kimi K2.6 a 54), 1M ctx, 300+ tok/s, pesos BF16+NVFP4 🔓
    • Anunciado 01/06 no Computex por Jensen, 5x mais rápido e 30% mais barato que concorrentes open frontier
    • NVIDIA Open Model License (comercial OK, ≠ Apache 2.0)
    • Datacenter only (mĂ­n. A100 cluster, ideal: GB300/Blackwell)
    • Nemotron 3.5 ASR (04/06) — 0.6B ASR multilingual, 40 idiomas (pt-BR pronto), streaming sub-100ms, OpenMDW-1.1 🔓
    • Nemotron 3.5 Content Safety (04/06) — 4B guardrail com reasoning, BYO policy, 22 categorias de harm, dual-mode (think/no-think), topic-following, NVIDIA Open Model License 🔓
  • Magenta RealTime 2 (04/06) — geração de mĂşsica em tempo real, decoder-only LLM, 2 sizes (230M small / 2.4B base), controle por texto+áudio+MIDI, SpectroStream codec 48kHz stereo, Apache 2.0 cĂłdigo + CC-BY 4.0 pesos 🔓
    • Streaming real-time exige Apple Silicon; GPU NVIDIA = offline only via JAX
    • Modelo small (230M) roda em Air M1; base (2.4B) exige Pro Max
  • LFM2.5-VL-Extract (04/06) — Liquid AI, VLM de extração estruturada: passa imagem + lista de campos, retorna JSON (nĂŁo texto livre). 450 M e 1.6B, open-weight, GGUF disponĂ­vel 🔓 (Demo! ↗)

O problema do LLM puro

LLMs sĂŁo modelos de linguagem. Eles preveem texto, nĂŁo calculam.

Pergunta: "Quanto Ă© 234 Ă— 987?"

O modelo não calcula. Ele prevê a resposta baseado em padrões. Pode acertar, pode errar.

A solução: ferramentas

Ferramenta = função Python que o agente pode chamar.

đź““ Colab

Como funciona:

  1. O LLM recebe a descrição das ferramentas disponíveis
  2. Analisa a pergunta
  3. Decide: preciso dessa ferramenta?
  4. Gera os argumentos no formato correto
  5. Python executa e devolve resultado
  6. O LLM usa o resultado na resposta

Exemplo: calculadora

@tool
def calculate(a: float, b: float, operation: str) -> float:
    """Performs a math operation between two numbers
    and returns the exact result.
    Use when you need to do calculations.
    operation: 'add', 'subtract', 'multiply', 'divide'
    """
    ops = {'add': a+b, 'subtract': a-b,
           'multiply': a*b, 'divide': a/b}
    return ops[operation]

Parâmetros nomeados: seguro e simples. Sem eval, sem parsing.

Exemplo: tamanho de palavra

@tool
def get_word_length(word: str) -> int:
    """Returns the number of characters in a word.
    Use when the user asks about the length
    of a word or how many letters it has.
    """
    return len(word)

O segredo: descrição clara

O modelo decide baseado na descrição.

Descrição ruim:

"Calculadora."

→ Modelo não sabe quando usar.

Descrição boa:

"Performs a math operation between two numbers and returns the exact result. Use when you need to do calculations."

→ Modelo entende quando E como usar.

@tool: Pydantic resolve o parsing

  • @tool gera o schema JSON automaticamente
  • Pydantic valida e converte os tipos
  • "234" → 234.0 (conversĂŁo automática)
  • ValidationError se o LLM manda lixo

Sem @tool:

a = float(args["a"])       # manual
b = float(args["b"])       # manual

Com @tool:

resultado = calculate.invoke(args)  # Pydantic!

O ciclo manual: bind_tools

  1. invoke → LLM decide (retorna tool_calls, não executa)
  2. VocĂŞ executa a ferramenta com os argumentos
  3. invoke de novo com ToolMessage → resposta final

Passo 1 — o LLM decide:

resposta = llm_com_ferramentas.invoke(
    "Quanto Ă© 234 vezes 987?")
pprint(resposta.tool_calls)
# [{'name': 'calculate',
#   'args': {'a': 234, 'b': 987,
#            'operation': 'multiply'},
#   'id': 'call_abc123'}]

resposta.content é string vazia — o LLM não executou!

Passo 2 — você executa:

tc = resposta.tool_calls[0]
resultado = calculate.invoke(tc['args'])
print(resultado)  # 230958.0

Passo 3 — resultado volta pro LLM:

mensagens = [
    HumanMessage(content="Quanto Ă© 234 vezes 987?"),
    resposta,  # AIMessage com tool_call
    ToolMessage(content=str(resultado),
                tool_call_id=tc['id']),
]
resposta_final = llm_com_ferramentas.invoke(mensagens)
# "O resultado Ă© 230.958."

ReAct se completa

O ciclo manual é ReAct em ação:

  • Thought → LLM raciocina ("preciso calcular")
  • Action → LLM chama ferramenta (tool_calls)
  • Observation → vocĂŞ executa e devolve o resultado
  • Answer → LLM formula a resposta final

(Yao et al., 2022)

O ciclo automático: create_agent

O ciclo manual é bom pra entender. Na prática:

from langchain.agents import create_agent

agente = create_agent(llm, [calculate, get_word_length])

resultado = agente.invoke(
    {"messages": "Quanto Ă© 234 vezes 987?"})
print(resultado["messages"][-1].content)

Uma linha. Decide, executa, responde — tudo automático.

Um gostinho de async

import asyncio

async def conversar():
    future = agente.ainvoke(
        {"messages": "Quanto Ă© 234 vezes 987?"})
    print("Processando...")  # roda imediatamente
    resultado = await future  # agora espera
    print(resultado["messages"][-1].content)

asyncio.run(conversar())

⚠️ Em notebooks Jupyter/Colab, asyncio.run() falha. Solução: nest_asyncio.apply() antes de rodar.

Para lembrar

"Ferramenta transforma conversa em ação."

LLM puro: sĂł fala Agente com ferramenta: fala E faz

  • Manual (bind_tools): entender o que acontece
  • Automático (create_agent): produzir