Crie um Agente Deep Research com LangGraph e LangChain (Tutorial Multi-Agente)

Crie um Agente Deep Research com LangGraph e LangChain (Tutorial Multi-Agente) Crie um Agente Deep Research com LangGraph e LangChain (Tutorial Multi-Agente)

Aviso: Este post foi traduzido para o português usando um modelo de tradução automática. Por favor, me avise se encontrar algum erro.

Você já saiu à procura do melhor de algo? Os melhores tênis para correr, a melhor ferramenta para aquele conserto, o melhor churrasco?

Quando você vai procurar, das 80 páginas que aparecem, 90% são páginas para ganhar dinheiro com afiliados da Amazon, feitas por pessoas que não sabem do que estão falando, apenas buscam os produtos mais vendidos na Amazon, enchem a página de palavras-chave para aparecer nas primeiras posições de busca do Google e lotam o conteúdo de links para a Amazon.

Nos 10% restantes, você precisa navegar por páginas com enormes blocos de texto, feitos para melhorar o SEO e aparecer nas primeiras posições de busca do Google.

Por isso, uma simples pesquisa no Google se torna um trabalho pesado e entediante.

Outra coisa é quando você quer pesquisar sobre um tema que não requer compras. Assim como antes, você precisa navegar por dezenas de páginas, contrastando informações, seguindo fontes, etc.

E se atribuirmos isso a um assistente de IA?

Neste post vamos explicar como criar o seu próprio assistente de IA para que ele pesquise por você sobre qualquer assunto e assim você possa dedicar seu tempo ao que realmente importa.

**Informação**: Este post é baseado no curso Deep Research with LangGraph da LangChain Academy. Mas, como senti que havia muitos conceitos dados como certos, escrevi da maneira que gostaria de ter encontrado.

O que é um assistente de IA?link image 103

Um assistente de IA é um agente que pode realizar tarefas complexas e automatizadas. Mas, na atual era do desenvolvimento de agentes, precisamos projetá-lo muito bem para que não se perca pelo buraco da toca como Alice no País das Maravilhas e saiba quando parar de buscar e quando já encontrou a informação que você precisava.

Arquitetura do assistentelink image 104

Para realizar o assistente vamos usar a seguinte arquitetura:

deep researcher architecture

Escopolink image 105

Primeiro vamos definir o escopo da pesquisa. Um LLM analisará a mensagem do usuário e, se considerar que precisa de mais informações, irá solicitá-las.

Supervisor de Pesquisalink image 106

Aqui, um LLM ficará encarregado de supervisionar a pesquisa, dividindo-a em pequenas pesquisas e atribuindo-as a subagentes investigadores. Cada um desses subagentes terá ferramentas para realizar a pesquisa.

Cada subagente investigador usará suas ferramentas várias vezes para obter uma investigação profunda de sua tarefa e, quando terminar, devolverá ao supervisor um resumo de sua investigação. Cada subagente tem seu próprio contexto e não tem acesso ao contexto e aos resultados dos outros subagentes.

Assim que o supervisor receber todos os resumos dos subagentes, avaliará se precisa solicitar novas investigações aos subagentes. No momento em que considerar que não é mais necessário realizar mais investigações, fará um resumo de todas as informações que possui e as enviará ao writer.

Escritorlink image 107

Por fim, quando já foi realizada a pesquisa aprofundada, o writer é responsável por escrever um relatório completo e detalhado para o usuário.

Instalação de bibliotecaslink image 108

Vamos instalar todas as bibliotecas que vamos precisar para o desenvolvimento do assistente.

Primeiro criamos um ambiente uv

	
< > Input
Python
!uv init deepresearcher
Copied
>_ Output
			
error: Project is already initialized in `/Users/macm1/Documents/web/portafolio/posts/deepresearcher` (`pyproject.toml` file exists)

Nós o sincronizamos

	
< > Input
Python
!cd deepresearcher && uv sync
Copied
>_ Output
			
Resolved 88 packages in 9ms
Audited 84 packages in 0.38ms

Nós o ativamos

	
< > Input
Python
!cd deepresearcher && source .venv/bin/activate
Copied

Instalamos as bibliotecas necessárias

	
< > Input
Python
!cd deepresearcher && source .venv/bin/activate && uv add "alive-progress&gt;=3.3.0" "dotenv&gt;=0.9.9" "grandalf&gt;=0.8" "ipykernel&gt;=6.30.1" "langchain&gt;=0.3.27" "langchain-anthropic&gt;=0.3.21" "langchain-community&gt;=0.3.29" "langchain-mcp-adapters&gt;=0.1.11" "langchain-openai&gt;=0.3.33" "langgraph&gt;=0.6.7" "rich&gt;=14.1.0" "tavily-python&gt;=0.7.12"
Copied
>_ Output
			
Resolved 88 packages in 0.59ms
Audited 84 packages in 0.01ms

Vamos analisar o que instalamos

Utilslink image 109

Antes de mergulharmos no código, vamos criar algumas funções que vão ser úteis para o desenvolvimento do assistente.

Diretóriolink image 110

Em primeiro lugar, criamos uma função que nos permite obter o diretório atual.

	
< > Input
Python
from pathlib import Path
def get_current_dir() -&gt; Path:
"""Get the current directory of the module.
This function is compatible with Jupyter notebooks and regular Python scripts.
Returns:
Path object representing the current directory
"""
try:
return Path(__file__).resolve().parent
except NameError: # __file__ is not defined
return Path.cwd()
Copied

Datalink image 111

Agora criamos uma função que nos permite obter a data atual.

	
< > Input
Python
from datetime import datetime
def get_today_str() -&gt; str:
"""Get current date in a human-readable format."""
return datetime.now().strftime("%a %b %-d, %Y")
Copied

Mensagenslink image 112

Por fim, criamos uma série de funções que nos permitem formatar as mensagens para que sejam exibidas de uma maneira mais clara no console.

	
< > Input
Python
from rich.console import Console
from rich.panel import Panel
from rich.text import Text
import json
import ast
console = Console()
def format_tool_outputs(tool_outputs_list: list) -&gt; str:
"""Format a list of ToolMessage objects into a readable string"""
formatted_parts = []
for i, output in enumerate(tool_outputs_list, 1):
# Handle ToolMessage objects that have been converted to strings
if isinstance(output, dict):
formatted_parts.append(f" Tool Output {i}:")
formatted_parts.append(f" Name: {output.get('name', 'N/A')}")
formatted_parts.append(f" Tool Call ID: {output.get('tool_call_id', 'N/A')}")
# Format the content (which contains the actual output)
content = output.get('content', 'N/A')
if isinstance(content, str):
# Truncate very long outputs
if len(content) &gt; 500:
content_preview = content[:500] + f"... ({len(content)} chars total)"
else:
content_preview = content
formatted_parts.append(f" Content:")
# Indent each line of content
for line in content_preview.split(' '):
formatted_parts.append(f" {line}")
else:
formatted_parts.append(f" Content: {content}")
else:
formatted_parts.append(f" Tool Output {i}: {output}")
return " ".join(formatted_parts)
def format_string_with_structures(content: str) -&gt; str:
"""
Detect and format structured data (lists, dicts) within a string.
Handles cases like 'Tool calls: [...]' and 'Tool outputs: [...]' by parsing and formatting the structure.
"""
# Check if the string contains 'Tool outputs:' followed by a list
if 'Tool outputs:' in content:
try:
# Find the position where the tool outputs list starts
tool_outputs_index = content.index('Tool outputs:')
prefix = content[:tool_outputs_index + len('Tool outputs:')]
# Extract the part that should be a list
potential_list = content[tool_outputs_index + len('Tool outputs:'):].strip()
# Try to parse it as a Python literal (list/dict)
parsed_data = ast.literal_eval(potential_list)
# If it's a list of tool outputs, format them nicely
if isinstance(parsed_data, list):
formatted_parts = [prefix + " "]
formatted_parts.append(format_tool_outputs(parsed_data))
return " ".join(formatted_parts)
except (ValueError, SyntaxError):
# If parsing fails, continue to next check
pass
# Check if the string contains 'Tool calls:' followed by a list
if 'Tool calls:' in content:
try:
# Find the position where the tool calls list starts
tool_calls_index = content.index('Tool calls:')
prefix = content[:tool_calls_index + len('Tool calls:')]
# Extract the part that should be a list
potential_list = content[tool_calls_index + len('Tool calls:'):].strip()
# Try to parse it as a Python literal (list/dict)
parsed_data = ast.literal_eval(potential_list)
# If it's a list of tool calls, format them nicely
if isinstance(parsed_data, list):
formatted_parts = [prefix + " "]
for i, tool_call in enumerate(parsed_data, 1):
if isinstance(tool_call, dict):
formatted_parts.append(f" Tool Call {i}:")
formatted_parts.append(f" Name: {tool_call.get('name', 'N/A')}")
formatted_parts.append(f" ID: {tool_call.get('id', 'N/A')}")
formatted_parts.append(f" Type: {tool_call.get('type', 'N/A')}")
if 'args' in tool_call:
formatted_parts.append(f" Args:")
formatted_parts.append(f" {json.dumps(tool_call['args'], indent=7, ensure_ascii=False)}")
return " ".join(formatted_parts)
except (ValueError, SyntaxError):
# If parsing fails, return the original content
pass
# Try to detect if the entire content is a JSON/dict/list
try:
# Try JSON first
parsed = json.loads(content)
return json.dumps(parsed, indent=2, ensure_ascii=False)
except (json.JSONDecodeError, TypeError):
try:
# Try Python literal (ast.literal_eval)
parsed = ast.literal_eval(content)
return json.dumps(parsed, indent=2, ensure_ascii=False)
except (ValueError, SyntaxError):
# If all parsing attempts fail, return original content
return content
def format_message_content(message):
"""Convert message content to displayable string"""
parts = []
tool_calls_processed = False
# Handle ToolCall objects (special case - they don't have 'content')
if isinstance(message, dict) and 'args' in message and 'name' in message:
# This is a ToolCall dictionary
parts.append(f"Tool Call Name: {message.get('name', 'N/A')}")
parts.append(f"ID: {message.get('id', 'N/A')}")
# Format the args (which should be the tool calls list)
args = message.get('args', [])
if isinstance(args, list):
for i, tool_call in enumerate(args, 1):
if isinstance(tool_call, dict):
parts.append(f" Tool Call {i}:")
parts.append(f" Name: {tool_call.get('name', 'N/A')}")
parts.append(f" ID: {tool_call.get('id', 'N/A')}")
parts.append(f" Type: {tool_call.get('type', 'N/A')}")
if 'args' in tool_call:
parts.append(f" Args:")
parts.append(f" {json.dumps(tool_call['args'], indent=7, ensure_ascii=False)}")
return " ".join(parts)
# Check if message has 'content' attribute
if not hasattr(message, 'content'):
# If it's a dict-like object, try to access it as a dict
if hasattr(message, '__getitem__'):
try:
content = message['content'] if 'content' in message else str(message)
parts.append(content)
return " ".join(parts)
except (KeyError, TypeError):
parts.append(str(message))
return " ".join(parts)
else:
parts.append(str(message))
return " ".join(parts)
# Handle main content (normal messages with 'content' attribute)
if isinstance(message.content, str):
# Try to detect and format structured data within the string
formatted_content = format_string_with_structures(message.content)
parts.append(formatted_content)
elif isinstance(message.content, list):
# Handle complex content like tool calls (Anthropic format)
for item in message.content:
if item.get('type') == 'text':
parts.append(item['text'])
elif item.get('type') == 'tool_use':
parts.append(f" 🔧 Tool Call: {item['name']}")
parts.append(f" Args: {str(json.dumps(item['input'], indent=7, ensure_ascii=False))}")
parts.append(f" ID: {item.get('id', 'N/A')}")
tool_calls_processed = True
else:
parts.append(str(message.content))
# Handle tool calls attached to the message (OpenAI format) - only if not already processed
if not tool_calls_processed and hasattr(message, 'tool_calls') and message.tool_calls:
for tool_call in message.tool_calls:
parts.append(f" 🔧 Tool Call: {tool_call['name']}")
parts.append(f" Args: {json.dumps(tool_call['args'], indent=2)}")
parts.append(f" ID: {tool_call['id']}")
return " ".join(parts)
def format_messages(messages, title: str = "", border_style: str = "white", msg_subtype: str = ""):
"""Format and display a list of messages with Rich formatting
Args:
messages: List of messages to format
title: Title of the panel
border_style: Border style of the panel
msg_subtype: Subtype of the message
"""
# Check if messages is a list
if isinstance(messages, list):
for m in messages:
# Handle different message types
if isinstance(m, dict):
# Check if it's a ToolCall dict
if 'args' in m and 'name' in m:
msg_type = 'ToolCall'
else:
msg_type = 'Dict'
else:
msg_type = m.__class__.__name__.replace('Message', '')
content = format_message_content(m)
if msg_type == 'Human':
if msg_subtype == 'RealHumanMessage':
if title == "":
title = "🧑 Real Human Message"
else:
title = f"🧑 {title}"
console.print(Panel(content, title=title, border_style="#201ADB")) # Blue
else:
if title == "":
title = "🧑 Simulated Human Message"
else:
title = f"🧑 {title}"
console.print(Panel(content, title=title, border_style="#1A64DB")) # Blue
elif msg_type == 'AI':
if title == "":
title = "🤖 Assistant"
else:
title = f"🤖 {title}"
console.print(Panel(content, title=title, border_style="#24FA00")) # Green
elif msg_type == 'ClarifyWithUser':
if title == "":
title = "🤖 Clarify With User"
else:
title = f"🤖 {title}"
console.print(Panel(content, title=title, border_style="#37DB1A")) # Green
elif msg_type == 'ResearchQuestion':
if title == "":
title = "🤖 Research brief generated"
else:
title = f"🤖 {title}"
console.print(Panel(content, title=title, border_style="#37DB1A")) # Green
elif msg_type == 'Tool':
if title == "":
title = "🔧 Tool Output"
else:
title = f"🔧 {title}"
console.print(Panel(content, title=title, border_style="yellow"))
elif msg_type == 'ToolCall':
if title == "":
title = "🔧 Tool Calls"
else:
title = f"🔧 {title}"
console.print(Panel(content, title=title, border_style="magenta"))
elif msg_type == 'Use tools':
if title == "":
title = "🔧 Tool Output"
else:
title = f"🔧 {title}"
console.print(Panel(content, title=title, border_style="yellow"))
elif msg_type == 'System':
if title == "":
title = "🔧 System Message"
else:
title = f"🔧 {title}"
console.print(Panel(content, title=title, border_style="red"))
else:
print(f"msg_type: {msg_type}")
if title == "":
title = f"📝 {msg_type}"
else:
title = f"📝 {title}"
console.print(Panel(content, title=title, border_style="white"))
elif isinstance(messages, str):
console.print(Panel(messages, title=title, border_style=border_style))
else:
print(f"messages type: {type(messages)}")
Copied

Scopelink image 113

Vamos começar a desenhar o primeiro módulo, o de scope. Com este módulo vamos definir o alcance da pesquisa.

Prompts de Scopelink image 114

Vamos começar definindo os prompts do escopo. Primeiro definimos o prompt que faz com que o LLM peça mais informações ao usuário quando considera que não tem informações suficientes.

  • Em primeiro lugar, é passado o contexto da conversa que tenha ocorrido até aquele momento
  • Recebe a data, por isso tivemos que criar uma função para obter a data
  • É-lhe indicado que faça perguntas de esclarecimento ao usuário, se necessário. Se o usuário pedir para pesquisar sobre algo e o LLM considerar que precisa de mais informações sobre o que o usuário deseja, pode pedir mais informações ao usuário. Se não precisar de mais informações, deve informar ao usuário que já tem tudo o que precisa para começar a pesquisa.
  • É indicado o formato da saída que deve responder
	
< > Input
Python
clarify_with_user_instructions="""
Estas são as mensagens trocadas até agora com o usuário que solicitou o relatório:
&lt;Messages&gt;
{messages}
&lt;/Messages&gt;
A data de hoje é {date}.
Avalie se você precisa fazer alguma pergunta esclarecedora ou se o usuário já forneceu informações suficientes para iniciar a investigação.
IMPORTANTE: Se no histórico de mensagens você perceber que já fez uma pergunta esclarecedora, na maioria das vezes não será necessário fazer outra. Só faça outra pergunta se for ABSOLUTAMENTE NECESSÁRIO.
Se houver acrônimos, abreviações ou termos desconhecidos, peça ao usuário para esclarecê-los.
Se precisar fazer uma pergunta, siga estas diretrizes:
- Seja conciso ao coletar todas as informações necessárias.
- Certifique-se de coletar todas as informações necessárias para realizar a tarefa de investigação de forma concisa e bem estruturada.
- Use marcadores ou listas numeradas, se necessário, para maior clareza. Certifique-se de usar o formato Markdown e de que ele será exibido corretamente se a string de saída for passada para um renderizador Markdown.
- Não solicite informações desnecessárias ou informações que o usuário já tenha fornecido. Se você perceber que o usuário já forneceu as informações, não as solicite novamente.
Responda em formato JSON válido com estas chaves exatas:
“need_clarification”: boolean,
‘question’: “&lt;pergunta para solicitar ao usuário que esclareça o escopo do relatório&gt;”,
“verification”: “&lt;mensagem de verificação de que iniciaremos a investigação&gt;”
Se precisar fazer uma pergunta esclarecedora, retorne:
“need_clarification”: true,
‘question’: “&lt;sua pergunta esclarecedora&gt;”,
“verification”: “”
Se você não precisar fazer uma pergunta esclarecedora, retorne:
“need_clarification”: false,
‘question’: “”,
“verification”: “&lt;Mensagem de confirmação de que a investigação será iniciada com base nas informações fornecidas.&gt;”
Para a mensagem de verificação quando não for necessário esclarecimento:
- Confirme que você tem informações suficientes para continuar.
- Resuma brevemente os aspectos principais do que você entendeu da solicitação.
- Confirme que o processo de investigação será iniciado agora.
- Mantenha a mensagem concisa e profissional.
Responda sempre no idioma em que o usuário fez a pergunta. Em caso de dúvida, responda em português.
"""
Copied

Agora definimos o prompt para que, com a conversa que o LLM teve com o usuário, o LLM gere um prompt com a pesquisa que deve ser realizada e que será enviada ao agente de pesquisa.

  • É passado o contexto da conversa que tenha ocorrido até aquele momento
  • É-lhe indicada a data
  • Indica-se como deve ser o formato do prompt que precisa ser gerado. Não se pode assumir coisas que o usuário não mencionou. Deve ser específico e detalhado. Escrever em primeira pessoa.
	
< > Input
Python
transform_messages_into_research_topic_prompt = """Você receberá um conjunto de mensagens que foram trocadas até agora entre o usuário e você.
Sua tarefa consiste em traduzir essas mensagens em uma pergunta de pesquisa mais detalhada e específica que será usada para orientar a pesquisa.
As mensagens trocadas até agora entre você e o usuário são:
&lt;Messages&gt;
{messages}
&lt;/Messages&gt;
A data de hoje é {date}.
Você retornará uma única pergunta de pesquisa que será usada para orientar a pesquisa.
Diretrizes:
1. Maximize a especificidade e os detalhes.
- Inclua todas as preferências conhecidas do usuário e liste explicitamente os atributos ou dimensões-chave a serem considerados.
- É importante que todos os detalhes do usuário sejam incluídos nas instruções.
2. Trate com cuidado as dimensões não especificadas
- Quando a qualidade da pesquisa exigir que dimensões adicionais não especificadas pelo usuário sejam consideradas, reconheça-as como considerações em aberto, em vez de preferências presumidas.
- Exemplo: em vez de assumir “opções econômicas”, diga “considere todas as faixas de preço, a menos que sejam especificadas restrições de custo”.
- Mencione apenas as dimensões que são realmente necessárias para uma pesquisa exaustiva nessa área.
3. Evite suposições injustificadas
- Nunca invente preferências, restrições ou requisitos específicos do usuário que não tenham sido indicados.
- Se o usuário não forneceu um detalhe específico, indique explicitamente essa falta de especificação.
- Oriente o pesquisador a tratar os aspectos não especificados como flexíveis, em vez de fazer suposições.
4. Distinga entre o escopo da pesquisa e as preferências do usuário
- Escopo da pesquisa: quais tópicos/dimensões devem ser pesquisados (pode ser mais amplo do que as menções explícitas do usuário)
- Preferências do usuário: restrições, requisitos ou preferências específicas (você só deve incluir o que o usuário indicou)
- Exemplo: “Investigar os fatores que influenciam a qualidade do café (incluindo a origem dos grãos, os métodos de torrefação e as técnicas de preparação) nas cafeterias de Madri, com foco principalmente no sabor, conforme especificado pelo usuário”.
5. Use a primeira pessoa
- Redija a solicitação da perspectiva do usuário.
6. Fontes
- Se fontes específicas devem ter prioridade, especifique-as na pergunta de pesquisa.
- Para pesquisas sobre produtos e viagens, é preferível criar links diretos para sites oficiais ou primários (por exemplo, sites oficiais de marcas, páginas de fabricantes ou plataformas de comércio eletrônico renomadas, como a Amazon, para opiniões de usuários), em vez de sites agregadores ou blogs com muito SEO.
- Para consultas acadêmicas ou científicas, é preferível criar um link direto para o artigo original ou a publicação oficial em uma revista, em vez de artigos de pesquisas ou resumos secundários.
- No caso de pessoas, tente criar um link direto para o perfil do LinkedIn, site pessoal ou perfil do GitHub, se houver.
- Se a consulta estiver em um idioma específico, dê prioridade às fontes publicadas nesse idioma.
Responda sempre no idioma em que o usuário lhe perguntou. Em caso de dúvida, responda em português.
"""
Copied

Estado de Scopelink image 115

Definimos agora o estado do escopo. O estado é como a memória de curto prazo do agente, onde serão armazenadas as variáveis e dados que serão usados durante a execução do agente e que precisam estar disponíveis durante a execução do agente.

Assim que o agente parar de ser executado, essa memória será perdida

Vamos definir dois estados

	
< > Input
Python
import operator
from typing_extensions import Optional, Annotated, Sequence
from langchain_core.messages import BaseMessage
from langgraph.graph import MessagesState
from langgraph.graph.message import add_messages
class AgentInputState(MessagesState):
"""Input state for the full agent - only contains messages from user input."""
pass
class AgentState(MessagesState):
"""
Main state for the full multi-agent research system.
Extends MessagesState with additional fields for research coordination.
Note: Some fields are duplicated across different state classes for proper
state management between subgraphs and the main workflow.
"""
# Research brief generated from user conversation history
research_brief: Optional[str]
# Messages exchanged with the supervisor agent for coordination
supervisor_messages: Annotated[Sequence[BaseMessage], add_messages]
# Raw unprocessed research notes collected during the research phase
raw_notes: Annotated[list[str], operator.add] = []
# Processed and structured notes ready for report generation
notes: Annotated[list[str], operator.add] = []
# Final formatted research report
final_report: str
Copied

Pode parecer estranho criar dois estados, AgentInputState e AgentState. Poderíamos ter criado um único estado chamado AgentState, já que os dois que criamos herdaram da classe MessagesState. Portanto, definindo apenas um ou definindo dois, as mensagens que forem geradas, tanto as que vêm do usuário quanto as que o agente gera, serão armazenadas em uma lista chamada messages.

Mas fizemos isso em dois, porque vamos definir AgentInputState como o formato de entrada que o agente vai esperar, e AgentState como o estado interno do agente. Para quê? Para que o restante das variáveis do estado (research_brief, supervisor_messages, raw_notes, notes, final_report) não possam ser modificadas quando for feita uma chamada ao agente.

Por exemplo, se tivéssemos criado apenas um estado AgentState, na hora de invocar o agente, poderíamos fazer

estado = {
"messages": ["Olá, como você está?"],
"research_brief": "Investigar os fatores que influenciam a qualidade do café",
"supervisor_messages": [],
"raw_notes": [],
"notes": [],
"final_report": ""
}

agent.invoke(state)

Ao fazer isso, inicialmente haveria um valor para research_brief, e não queremos isso, queremos que seja o agente quem gere o research_brief.

Ao ter um estado AgentState e outro AgentInputState, o estado AgentState, vamos definir como variável ao invocar o agente o AgentInputState, de modo que não poderemos modificar o research_brief de fora do agente.

Saída estruturada do agente Scopelink image 116

Definimos agora como queremos que seja a saída do LLM quando ele for invocado. Definimos duas saídas estruturadas, uma para quando queremos saber se precisamos de mais dados do usuário (ClarifyWithUser) e outra para quando queremos gerar o research_brief (ResearchQuestion).

	
< > Input
Python
from pydantic import BaseModel, Field
class ClarifyWithUser(BaseModel):
"""Schema for user clarification decision and questions."""
need_clarification: bool = Field(
description="Whether the user needs to be asked a clarifying question.",
)
question: str = Field(
description="A question to ask the user to clarify the report scope",
)
verification: str = Field(
description="Verify message that we will start research after the user has provided the necessary information.",
)
class ResearchQuestion(BaseModel):
"""Schema for structured research brief generation."""
research_brief: str = Field(
description="A research question that will be used to guide the research.",
)
Copied

A função Field do pydantic é usada para definir o tipo de dado que se espera na saída do LLM e para adicionar uma descrição do que se espera que seja a saída.

Com ClarifyWithUser espera-se que o LLM devolva

  • um booleano (need_clarification) que indique se são necessárias mais informações do usuário
  • uma pergunta (question) que, caso seja necessário mais informações do usuário, será feita para esclarecer o escopo da investigação
  • uma mensagem de verificação (verification) que será dada ao usuário para que ele confirme que possui informações suficientes para iniciar a investigação

Com ResearchQuestion espera-se que o LLM devolva uma pergunta de pesquisa (research_brief), que é a que será enviada ao agente de pesquisa para que seja feita a investigação.

Modelo de linguagem do agente Scopelink image 117

Agora que temos os prompts, definimos o modelo de linguagem que o agente vai usar.

	
< > Input
Python
from langchain.chat_models import init_chat_model
import os
import dotenv
dotenv.load_dotenv()
SCOPE_MODEL_NAME = "gpt-4.1"
SCOPE_MODEL_PROVIDER = "openai"
SCOPE_MODEL_BASE_URL = "https://api.openai.com/v1"
SCOPE_MODEL_TEMPERATURE = 0.0
SCOPE_MODEL_PROVIDER_API_KEY = os.getenv("OPENAI_API_KEY")
scope_model = init_chat_model(
model=SCOPE_MODEL_NAME,
model_provider=SCOPE_MODEL_PROVIDER,
api_key=SCOPE_MODEL_PROVIDER_API_KEY,
base_url=SCOPE_MODEL_BASE_URL,
temperature=SCOPE_MODEL_TEMPERATURE
)
Copied

Funções do agente Scopelink image 118

Como o agente vai precisar realizar duas ações, pedir mais informações ao usuário, se necessário, e gerar o research_brief, vamos criar duas funções para cada uma das ações.

Começamos com a função para pedir mais informações ao usuário

  • Primeiro, obtemos a última mensagem do histórico de mensagens, que será a mensagem do usuário
  • Em seguida, fazemos uma chamada ao modelo forçando que ele devolva uma saída estruturada do tipo ClarifyWithUser
  • Se o LLM retornar que são necessárias mais informações, enviamos uma mensagem ao usuário indicando que são necessárias mais informações e encerramos o fluxo do agente
  • Se o LLM devolver que não são necessárias mais informações, enviamos uma mensagem ao usuário indicando que a pesquisa pode ser iniciada e, no fluxo do agente, é indicado que seja executada a função write_research_brief para gerar o research_brief.
	
< > Input
Python
from typing_extensions import Literal
from alive_progress import alive_bar
import traceback
import sys
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage, get_buffer_string
from langgraph.graph import START, END
from langgraph.types import Command
def clarify_with_user(state: AgentState) -&gt; Command[Literal["write_research_brief", "__end__"]]:
"""
Determine if the user's request contains sufficient information to proceed with research.
Uses structured output to make deterministic decisions and avoid hallucination.
Routes to either research brief generation or ends with a clarification question.
"""
try:
print("⏳ Scope agent:")
format_messages([state.get("messages", [])[-1]], title="Real Human Message", msg_subtype='RealHumanMessage')
# Set up structured output model
structured_output_model = scope_model.with_structured_output(ClarifyWithUser)
# Invoke the model with clarification instructions
with alive_bar(monitor=False, stats=False, title="", spinner='dots_waves', bar='blocks') as bar:
response = structured_output_model.invoke([
HumanMessage(content=clarify_with_user_instructions.format(
messages=get_buffer_string(messages=state["messages"]),
date=get_today_str()
))
])
bar()
# Format and display the research messages
format_messages([response], title="Scope Assistant - need clarification?")
# Route based on clarification need
if response.need_clarification:
# Create a System message to show the decision
routing_message = SystemMessage(
content="Necesita aclaración por parte del usuario. Enviando pregunta aclaratoria..."
)
format_messages([routing_message], title="Scope System Message")
return Command(
goto=END,
update={"messages": [AIMessage(content=response.question)]}
)
else:
# Create a System message to show the decision
routing_message = SystemMessage(
content="No necesita aclaración por parte del usuario. Enviando mensaje de verificación..."
)
format_messages([routing_message], title="Scope System Message")
return Command(
goto="write_research_brief",
update={"messages": [AIMessage(content=response.verification)]}
)
except Exception as e:
# Get the traceback information
exc_type, exc_obj, exc_tb = sys.exc_info()
line_number = exc_tb.tb_lineno
# Print detailed error information
print(f" ❌ Error in clarify_with_user function:")
print(f" Line number: {line_number}")
print(f" Error type: {type(e).__name__}")
print(f" Error message: {str(e)}")
print(f" Full traceback:")
traceback.print_exc()
# Re-raise the exception to let the caller handle it
raise
Copied

Agora escrevemos a função para gerar o research_brief

  • Primeiro obtemos a última mensagem do histórico de mensagens, que será
  • Em seguida, fazemos uma chamada ao modelo forçando que ele retorne uma saída estruturada do tipo ResearchQuestion
  • O fluxo do agente é encerrado devolvendo o research_brief
	
< > Input
Python
def write_research_brief(state: AgentState):
"""
Transform the conversation history into a comprehensive research brief.
Uses structured output to ensure the brief follows the required format
and contains all necessary details for effective research.
"""
try:
# Set up structured output model
structured_output_model = scope_model.with_structured_output(ResearchQuestion)
print("⏳ Scope agent - Write research brief:")
format_messages([state.get("messages", [])[-1]], title="Scope Assistant - Write research brief")
# Generate research brief from conversation history
with alive_bar(monitor=False, stats=False, title="", spinner='dots_waves', bar='blocks') as bar:
response = structured_output_model.invoke([
HumanMessage(content=transform_messages_into_research_topic_prompt.format(
messages=get_buffer_string(state.get("messages", [])),
date=get_today_str()
))
])
bar()
# Format and display the research brief
format_messages([response], title="Scope Assistant - Research brief generated")
# Update state with generated research brief and pass it to the supervisor
return {
"research_brief": response.research_brief,
"supervisor_messages": [HumanMessage(content=f"{response.research_brief}.")]
}
except Exception as e:
# Get the traceback information
exc_type, exc_obj, exc_tb = sys.exc_info()
line_number = exc_tb.tb_lineno
# Print detailed error information
print(f" ❌ Error in write_research_brief function:")
print(f" Line number: {line_number}")
print(f" Error type: {type(e).__name__}")
print(f" Error message: {str(e)}")
print(f" Full traceback:")
traceback.print_exc()
# Re-raise the exception to let the caller handle it
raise
Copied

Grafo do agente Scopelink image 119

Agora que temos tudo o que é necessário para construir o agente, vamos definir o grafo do agente.

Primeiro, criamos o agente com o estado AgentState e a entrada AgentInputState, como explicamos anteriormente, para que só seja possível modificar a mensagem do estado interno do agente e não seja possível modificar o restante das variáveis do estado.

	
< > Input
Python
from langgraph.graph import StateGraph
# Build the scoping workflow
scope_graph_builder = StateGraph(AgentState, input_schema=AgentInputState)
Copied

Adicionamos dois nós, cada um com as funções que definimos anteriormente

	
< > Input
Python
# Add workflow nodes
scope_graph_builder.add_node("clarify_with_user", clarify_with_user)
scope_graph_builder.add_node("write_research_brief", write_research_brief)
Copied
>_ Output
			
&lt;langgraph.graph.state.StateGraph at 0x1117ff0e0&gt;

E finalmente adicionamos as arestas que conectam os nós. Começamos com o nó START e o conectamos ao nó clarify_with_user. Por outro lado, unimos o nó write_research_brief ao nó END. E é a função clarify_with_user que se encarrega de decidir se, com a mensagem do usuário, passa-se para o nó write_research_brief ou se pede mais informações ao usuário e passa-se para o nó END.

	
< > Input
Python
from langgraph.graph import START, END
# Add workflow edges
scope_graph_builder.add_edge(START, "clarify_with_user")
scope_graph_builder.add_edge("write_research_brief", END)
Copied
>_ Output
			
&lt;langgraph.graph.state.StateGraph at 0x1117ff0e0&gt;

Compilamos o grafo e representamos o diagrama de fluxo

	
< > Input
Python
from langgraph.checkpoint.memory import InMemorySaver
from IPython.display import Image, display
checkpointer = InMemorySaver()
scope_agent = scope_graph_builder.compile(checkpointer=checkpointer)
# Visualize the workflow
display(Image(scope_agent.get_graph(xray=True).draw_mermaid_png()))
Copied
>_ Output
			
&lt;IPython.core.display.Image object&gt;

Execução do agente Scopelink image 120

Criamos uma thread para poder fazer várias chamadas ao agente, caso ele nos peça mais informações, e criamos a mensagem inicial do usuário com o que queremos que ele crie o research_brief

	
< > Input
Python
thread = {"configurable": {"thread_id": "1"}}
user_message = "Quero pesquisar os melhores cafés de Madrid.."
result = await scope_agent.ainvoke({"messages": [HumanMessage(content=f"{user_message}.")]}, config=thread)
Copied
>_ Output
			
⏳ Scope agent:
>_ Output
			
╭───────────────────────────────────────────── 🧑 Real Human Message ─────────────────────────────────────────────╮
│ Quero pesquisar os melhores cafés de Madrid... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 1.2s
>_ Output
			
╭─────────────────────────────────── 🤖 Scope Assistant - need clarification? ────────────────────────────────────╮
│ need_clarification=True question='Você está procurando cafés para trabalhar, para apreciar cafés especiais, ou │
│ apenas os mais populares entre turistas e locais? Há algum bairro específico de Madrid que você prefere?' │
│ verification='' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────────────────── 🔧 Scope System Message ────────────────────────────────────────────╮
│ Necesita aclaración por parte del usuario. Enviando pregunta aclaratoria... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

Como se pode ver, o agente nos pede mais informações, por isso voltamos a invocar o agente com as informações que ele solicita.

	
< > Input
Python
user_message = "Examine a qualidade do café para avaliar as melhores cafeterias de Madri.."
result = await scope_agent.ainvoke({"messages": [HumanMessage(content=f"{user_message}.")]}, config=thread)
Copied
>_ Output
			
⏳ Scope agent:
>_ Output
			
╭───────────────────────────────────────────── 🧑 Real Human Message ─────────────────────────────────────────────╮
│ Examine a qualidade do café para avaliar as melhores cafeterias de Madri... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 1.3s
>_ Output
			
╭─────────────────────────────────── 🤖 Scope Assistant - need clarification? ────────────────────────────────────╮
│ need_clarification=False question='' verification='Você forneceu informações suficientes para iniciar a │
│ pesquisa. Entendi que deseja um relatório sobre as melhores cafeterias de Madri, com foco na qualidade do café │
│ servido. Iniciarei agora a investigação considerando esse critério principal.' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────────────────── 🔧 Scope System Message ────────────────────────────────────────────╮
│ No necesita aclaración por parte del usuario. Enviando mensaje de verificación... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Scope agent - Write research brief:
>_ Output
			
╭─────────────────────────────────── 🤖 Scope Assistant - Write research brief ───────────────────────────────────╮
│ Você forneceu informações suficientes para iniciar a pesquisa. Entendi que deseja um relatório sobre as │
│ melhores cafeterias de Madri, com foco na qualidade do café servido. Iniciarei agora a investigação │
│ considerando esse critério principal. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 4.2s
>_ Output
			
╭───────────────────────────────── 🤖 Scope Assistant - Research brief generated ─────────────────────────────────╮
│ research_brief='Quero identificar as melhores cafeterias de Madri avaliando principalmente a qualidade do café │
│ servido. Para isso, desejo que a pesquisa considere critérios como a origem e seleção dos grãos, métodos de │
│ torra, técnicas de preparo, frescor do café, sabor e aroma, bem como eventuais prêmios ou reconhecimentos │
│ relacionados à qualidade do café. Não especifiquei bairros, estilos de ambiente, faixas de preço ou outros │
│ serviços oferecidos, portanto, esses aspectos devem ser tratados como abertos e flexíveis. Priorize fontes │
│ oficiais das cafeterias, avaliações de especialistas em café, rankings de publicações reconhecidas no setor e │
│ opiniões de consumidores em plataformas confiáveis, preferencialmente em português ou espanhol.' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

Com as novas informações esclarecedoras, o agente gerou o research_brief, que será o que enviaremos ao agente de pesquisa.

Pesquisadorlink image 121

Se lembrarmos de como seria a arquitetura do deep researcher, vemos que há um Research supervisor que se encarrega de atribuir pesquisas a diferentes Researchers

deep researcher architecture

Então agora vamos definir o Researcher que será responsável por realizar a pesquisa.

Prompts para pesquisadoreslink image 122

Primeiro definimos o prompt do Researcher, é indicado

  • O que é um pesquisador com acesso a ferramentas
  • Diz-se que as duas ferramentas que você tem são a de busca na web e a de reflexão
  • São dadas instruções sobre como deve realizar a pesquisa
  • É-lhe indicado que deve utilizar a ferramenta de reflexão após cada busca
  • É-lhe dado um orçamento de chamadas para ferramentas
	
< > Input
Python
research_agent_prompt = """Você é um assistente de pesquisa que realiza uma pesquisa sobre o tema introduzido pelo usuário. Para contextualizar, hoje é {date}.
&lt;Task&gt;
Seu trabalho consiste em usar ferramentas para coletar informações sobre o tema introduzido pelo usuário.
Você pode usar qualquer uma das ferramentas fornecidas para encontrar recursos que o ajudem a responder à pergunta de pesquisa. Você pode usar essas ferramentas em série ou em paralelo, sua pesquisa é realizada em um loop de chamada de ferramentas.
&lt;/Task&gt;
&lt;Available Tools&gt;
Você tem acesso a duas ferramentas principais:
1. **tavily_search**: para realizar pesquisas na web com o objetivo de coletar informações.
2. **think_tool**: para reflexão e planejamento estratégico durante a pesquisa.
**IMPORTANTE: use a ferramenta think_tool após cada pesquisa para refletir sobre os resultados e planejar os próximos passos**.
**CRÍTICO: você deve sempre fornecer o parâmetro “reflection” com conteúdo detalhado ao chamar o think_tool. Nunca chame essa ferramenta sem argumentos**.
&lt;/Available Tools&gt;
&lt;Instructions&gt;
Pense como um pesquisador humano com tempo limitado. Siga estas etapas:
1. **Leia a pergunta com atenção**: quais informações específicas o usuário precisa?
2. **Comece com pesquisas mais amplas**: use primeiro consultas amplas e exaustivas.
3. **Após cada pesquisa, faça uma pausa e avalie**: tenho o suficiente para responder? O que me falta?
4. **Faça pesquisas mais específicas à medida que coleta informações**: preencha as lacunas.
5. **Pare quando puder responder com segurança**: não continue buscando a perfeição.
&lt;/Instructions&gt;
&lt;Hard Limits&gt;
**Orçamentos de chamadas para ferramentas** (evite pesquisas excessivas):
- **Consultas simples**: use no máximo 2-3 chamadas para ferramentas de pesquisa.
- **Consultas complexas**: use no máximo 5 chamadas para ferramentas de pesquisa
- **Pare sempre**: após 5 chamadas para ferramentas de pesquisa, se você não conseguir encontrar as fontes adequadas
**Pare imediatamente quando**:
- Você puder responder à pergunta do usuário de forma exaustiva
- Você tiver mais de 3 exemplos/fontes relevantes para a pergunta
- Suas duas últimas pesquisas tenham retornado informações semelhantes
&lt;/Hard Limits&gt;
&lt;Show Your Thinking&gt;
Após cada chamada à ferramenta de pesquisa, use think_tool para analisar os resultados:
- Que informações importantes eu encontrei?
- O que está faltando?
- Tenho o suficiente para responder à pergunta de forma exaustiva?
- Devo continuar pesquisando ou dar minha resposta?
&lt;/Show Your Thinking&gt;
"""
Copied

Agora definimos o prompt de um LLM que resume conteúdo de uma página web.

  • É fornecido o conteúdo de uma página web
  • São dadas instruções sobre como deve ser feito o resumo
  • É fornecido a ele um formato no qual deve devolver o resumo
  • É fornecida a data atual
	
< > Input
Python
summarize_webpage_prompt = """Sua tarefa consiste em resumir o conteúdo bruto de uma página da web obtida por meio de uma pesquisa na Internet. Seu objetivo é criar um resumo que preserve as informações mais importantes da página da web original. Esse resumo será usado por um agente de pesquisa posterior, portanto, é fundamental manter os detalhes principais sem perder informações essenciais.
Este é o conteúdo não processado da página da web:
&lt;webpage_content&gt;
{webpage_content}
&lt;/webpage_content&gt;
Siga estas diretrizes para criar seu resumo:
1. Identifique e preserve o tema principal ou o objetivo da página da web.
2. Preserve os dados, estatísticas e pontos-chave que são fundamentais para a mensagem do conteúdo.
3. Preserve citações importantes de fontes ou especialistas confiáveis.
4. Mantenha a ordem cronológica dos eventos se o conteúdo for sensível ao tempo ou histórico.
5. Preserve listas ou instruções passo a passo, se houver.
6. Inclua datas, nomes e locais relevantes que sejam cruciais para a compreensão do conteúdo.
7. Resuma explicações longas, mantendo intacta a mensagem principal.
Quando se trata de diferentes tipos de conteúdo:
- Para artigos de notícias: concentre-se em quem, o quê, quando, onde, por que e como.
- Para conteúdo científico: mantenha a metodologia, os resultados e as conclusões.
- Para artigos de opinião: mantenha os argumentos principais e os pontos de apoio.
- Para páginas de produtos: mantenha as características principais, as especificações e os pontos de venda exclusivos.
Seu resumo deve ser significativamente mais curto que o conteúdo original, mas completo o suficiente para constituir uma fonte de informação por si só. Tente que ele tenha entre 25% e 30% do comprimento original, a menos que o conteúdo já seja conciso.
Apresente seu resumo no seguinte formato:
```
{{
“summary”: “Seu resumo aqui, estruturado com parágrafos ou marcadores adequados, conforme necessário”,
“key_excerpts”: “Primeira citação ou trecho importante, Segunda citação ou trecho importante, Terceira citação ou trecho importante, ...Adicione mais trechos conforme necessário, até um máximo de 5”
}}
```
Aqui estão dois exemplos de bons resumos:
Exemplo 1 (para um artigo de notícias):
```json
{{
“summary”: "Em 15 de julho de 2023, a NASA lançou com sucesso a missão Artemis II do Centro Espacial Kennedy. Esta é a primeira missão tripulada à Lua desde a Apollo 17 em 1972. A tripulação de quatro pessoas, liderada pela comandante Jane Smith, orbitará a Lua por 10 dias antes de retornar à Terra. Esta missão é um passo crucial nos planos da NASA para estabelecer uma presença humana permanente na Lua até 2030.”,
“key_excerpts”: “A Artemis II representa uma nova era na exploração espacial, disse o administrador da NASA, John Doe. A missão testará sistemas críticos para futuras estadias de longa duração na Lua, explicou a engenheira-chefe Sarah Johnson. Não vamos apenas voltar à Lua, vamos avançar em direção à Lua, declarou a comandante Jane Smith durante a coletiva de imprensa antes do lançamento."
}}
```
Exemplo 2 (para um artigo científico):
```json
{{
“summary”: "Um novo estudo publicado na Nature Climate Change revela que o nível do mar está subindo mais rápido do que se pensava. Os pesquisadores analisaram dados de satélite de 1993 a 2022 e descobriram que a taxa de aumento do nível do mar acelerou em 0,08 mm/ano² nas últimas três décadas. Essa aceleração é atribuída principalmente ao derretimento das calotas polares da Groenlândia e da Antártida. O estudo prevê que, se as tendências atuais continuarem, o nível global do mar poderá subir até 2 metros até 2100, o que representaria um risco significativo para as comunidades costeiras em todo o mundo.
“key_excerpts”: “Nossas descobertas indicam uma clara aceleração no aumento do nível do mar, o que tem implicações importantes para o planejamento costeiro e as estratégias de adaptação”, afirmou a autora principal, Dra. Emily Brown. A velocidade do derretimento das camadas de gelo da Groenlândia e da Antártida triplicou desde a década de 1990, de acordo com o estudo. Sem uma redução imediata e substancial das emissões de gases de efeito estufa, enfrentaremos um aumento potencialmente catastrófico do nível do mar no final deste século, alertou o coautor, o professor Michael Green.
}}
```
Lembre-se de que seu objetivo é criar um resumo que possa ser facilmente compreendido e utilizado por um agente de pesquisa posterior, ao mesmo tempo em que preserva as informações mais importantes da página da web original.
A data de hoje é {date}.
"""
Copied

Uma vez que o conteúdo da página web foi resumido, outro LLM é chamado para limpar os resultados da pesquisa e do raciocínio interno ao resumir o conteúdo.

  • É fornecido um conteúdo da pesquisa
  • São dadas instruções sobre como deve fazer o resumo
  • É fornecido um formato no qual deve devolver o resumo
  • É fornecida a data atual
  • É-lhe indicado que deve conservar todas as declarações e informações relevantes recolhidas pelo investigador
  • Informa-se que deve repetir a informação chave textualmente

Este prompt é importante, porque se pede que seja criada uma lista numerada com as fontes utilizadas. Isto é útil para que em pesquisas futuras não se usem novamente as mesmas fontes. Mas, sobretudo, para que no relatório final ao usuário, possam ser mostradas as fontes utilizadas para cada afirmação.

	
< > Input
Python
compress_research_system_prompt = """Você é um assistente de pesquisa que investigou um tema utilizando diversas ferramentas e pesquisas na Internet. Seu trabalho agora consiste em limpar os resultados, conservando todas as declarações e informações relevantes coletadas pelo pesquisador. Para contextualizar, hoje é {date}.
&lt;Task&gt;
Você deve limpar as informações coletadas das ferramentas e pesquisas na Internet nas mensagens existentes.
Todas as informações relevantes devem ser repetidas e reescritas textualmente, mas em um formato mais limpo.
O objetivo desta etapa é simplesmente eliminar qualquer informação obviamente irrelevante ou duplicada.
Por exemplo, se três fontes dizem “X”, você poderia dizer “Essas três fontes afirmam X”.
Apenas esses resultados completos e limpos serão devolvidos ao usuário, por isso é essencial que você não perca nenhuma informação das mensagens não processadas.
&lt;/Task&gt;
&lt;Tool Call Filtering&gt;
**IMPORTANTE**: Ao processar as mensagens de pesquisa, concentre-se apenas no conteúdo substantivo da pesquisa:
- **Incluir**: Todos os resultados do tavily_search e as descobertas da pesquisa na web
- **Excluir**: as chamadas e respostas do think_tool, pois são reflexões internas do agente para a tomada de decisões e não devem ser incluídas no relatório final da investigação
- **Concentre-se em**: as informações reais coletadas de fontes externas, não no processo de raciocínio interno do agente.
As chamadas para o think_tool contêm reflexões estratégicas e notas sobre a tomada de decisões que são internas ao processo de pesquisa, mas não contêm informações factuais que devam ser mantidas no relatório final.
&lt;/Tool Call Filtering&gt;
&lt;Guidelines&gt;
1. Os resultados devem ser exaustivos e incluir TODAS as informações e fontes que o investigador tenha coletado a partir das chamadas para ferramentas e pesquisas na web. Espera-se que você repita as informações-chave textualmente.
2. Este relatório pode ter a extensão necessária para incluir TODAS as informações que o investigador tenha coletado.
3. Em seu relatório, você deve incluir citações em linha para cada fonte que o investigador tenha encontrado.
4. Você deve incluir uma seção “Fontes” no final do relatório, listando todas as fontes encontradas pelo pesquisador com as citações correspondentes, referenciadas em relação às afirmações do relatório.
5. Certifique-se de incluir TODAS as fontes coletadas pelo pesquisador no relatório e como elas foram usadas para responder à pergunta.
6. É muito importante não perder nenhuma fonte. Mais adiante, um LLM será usado para mesclar este relatório com outros, por isso é essencial ter todas as fontes disponíveis.
&lt;/Guidelines&gt;
&lt;Output Format&gt;
O relatório deve ser estruturado da seguinte forma:
**Lista de consultas e chamadas a ferramentas realizadas**
**Resultados completos**
**Lista de todas as fontes relevantes (com citações no relatório)**
&lt;/Output Format&gt;
&lt;Citation Rules&gt;
- Atribua a cada URL único um número de citação único no seu texto.
- Termine com ### Fontes, enumerando cada fonte com os números correspondentes.
- IMPORTANTE: Numere as fontes sequencialmente, sem saltos (1, 2, 3, 4...), na lista final, independentemente das fontes que escolher.
- Exemplo de formato:
[1] Título da fonte: URL
[2] Título da fonte: URL
&lt;/Citation Rules&gt;
Lembrete importante: É extremamente importante que qualquer informação que seja remotamente relevante para o tema de pesquisa do usuário seja mantida textualmente (ou seja, não a reescreva, não a resuma, não a parafraseie).
"""
Copied

Por fim, definimos o prompt de uma LLM que se encarrega de depurar os resultados da pesquisa para a pergunta específica que lhe foi atribuída.

  • É dado o tema de pesquisa
  • São dadas instruções sobre como deve ser feito o resumo
	
< > Input
Python
compress_research_human_message = """Todas as mensagens anteriores referem-se à pesquisa realizada por um pesquisador de IA sobre o seguinte tema de pesquisa:
TEMA DE PESQUISA: {research_topic}
Sua tarefa consiste em refinar os resultados desta pesquisa, conservando TODAS as informações relevantes para responder a esta questão de pesquisa específica.
REQUISITOS FUNDAMENTAIS:
- NÃO resuma nem parafraseie as informações: mantenha-as textualmente.
- NÃO perca nenhum detalhe, dado, nome, número ou descoberta específica
- NÃO filtre as informações que pareçam relevantes para o tema da pesquisa
- Organize as informações em um formato mais claro, mas mantenha todo o conteúdo
- Inclua TODAS as fontes e citações encontradas durante a pesquisa
- Lembre-se de que esta pesquisa foi realizada para responder à pergunta específica acima
Os resultados refinados serão usados para a elaboração do relatório final, por isso é fundamental que sejam exaustivos."""
Copied

Estado do pesquisadorlink image 123

Agora temos algo semelhante ao estado de Scope, temos dois estados ResearcherState e ResearcherInputState, vamos vê-los e depois explicamos.

	
< > Input
Python
from typing_extensions import TypedDict, Annotated, List, Sequence
class ResearcherState(TypedDict):
"""
State for the research agent containing message history and research metadata.
This state tracks the researcher's conversation, iteration count for limiting
tool calls, the research topic being investigated, compressed findings,
and raw research notes for detailed analysis.
"""
researcher_messages: Annotated[Sequence[BaseMessage], add_messages]
tool_call_iterations: int
research_topic: str
compressed_research: str
raw_notes: Annotated[List[str], operator.add]
class ResearcherOutputState(TypedDict):
"""
Output state for the research agent containing final research results.
This represents the final output of the research process with compressed
research findings and all raw notes from the research process.
"""
compressed_research: str
raw_notes: Annotated[List[str], operator.add]
researcher_messages: Annotated[Sequence[BaseMessage], add_messages]
Copied

Pode-se ver que todas as variáveis de ResearcherOutputState (compressed_research, raw_notes e researcher_messages) estão presentes em ResearcherState, mas as variáveis tool_call_iterations e research_topic de ResearcherState não estão em ResearcherOutputState.

Isso é porque são variáveis que o agente de investigação precisa, mas não são relevantes para o usuário final, que neste caso vai ser o Supervisor.

Saída estruturada do Researcherlink image 124

Vamos definir como queremos que seja a saída do Researcher.

	
< > Input
Python
class Summary(BaseModel):
"""Schema for webpage content summarization."""
summary: str = Field(description="Concise summary of the webpage content")
key_excerpts: str = Field(description="Important quotes and excerpts from the content")
Copied

Vemos que queremos um resumo e as citações principais da pesquisa.

Tools do Researcherlink image 125

Quando explicamos o agente Scope, explicamos as funções do agente, enquanto agora vamos definir as tools. Qual é a diferença?

As funções foram implementadas por nós e serão executadas sempre que o código seguir um fluxo que definimos. No entanto, as tools são ferramentas que o agente possui e é ele quem decide se vai utilizá-las ou não, e quando utilizá-las.

Ferramenta de busca weblink image 126

Para buscar na internet, vamos utilizar a ferramenta tavily_search que já importamos antes.

Antes de definir a tool, primeiro definimos algumas funções auxiliares que vão nos ajudar a definir a tool.

Primeiro, definimos uma função para realizar várias buscas em paralelo.

	
< > Input
Python
def tavily_search_multiple(
search_queries: List[str],
max_results: int = 3,
topic: Literal["general", "news", "finance"] = "general",
include_raw_content: bool = True,
) -&gt; List[dict]:
"""Perform search using Tavily API for multiple queries.
Args:
search_queries: List of search queries to execute
max_results: Maximum number of results per query
topic: Topic filter for search results
include_raw_content: Whether to include raw webpage content
Returns:
List of search result dictionaries
"""
# Execute searches sequentially. Note: yon can use AsyncTavilyClient to parallelize this step.
search_docs = []
for query in search_queries:
result = tavily_client.search(
query,
max_results=max_results,
include_raw_content=include_raw_content,
topic=topic
)
search_docs.append(result)
return search_docs
Copied

Como fazemos várias buscas em paralelo, pode ser que essas buscas tenham encontrado dados nas mesmas fontes, por isso descartamos as buscas duplicadas com uma função

	
< > Input
Python
def deduplicate_search_results(search_results: List[dict]) -&gt; dict:
"""Deduplicate search results by URL to avoid processing duplicate content.
Args:
search_results: List of search result dictionaries
Returns:
Dictionary mapping URLs to unique results
"""
unique_results = {}
for response in search_results:
for result in response['results']:
url = result['url']
if url not in unique_results:
unique_results[url] = result
return unique_results
Copied

Agora definimos uma função para resumir o conteúdo de uma página web, para isso vamos usar o prompt summarize_webpage_prompt

	
< > Input
Python
def summarize_webpage_content(webpage_content: str) -&gt; str:
"""Summarize webpage content using the configured summarization model.
Args:
webpage_content: Raw webpage content to summarize
Returns:
Formatted summary with key excerpts
"""
try:
# Set up structured output model for summarization
structured_model = summarization_model.with_structured_output(Summary)
# Generate summary
summary = structured_model.invoke([
HumanMessage(content=summarize_webpage_prompt.format(
webpage_content=webpage_content,
date=get_today_str()
))
])
# Format summary with clear structure
formatted_summary = (
f"&lt;summary&gt; {summary.summary} &lt;/summary&gt; "
f"&lt;key_excerpts&gt; {summary.key_excerpts} &lt;/key_excerpts&gt;"
)
return formatted_summary
except Exception as e:
print(f"Failed to summarize webpage: {str(e)}")
return webpage_content[:1000] + "..." if len(webpage_content) &gt; 1000 else webpage_content
Copied

Com o conteúdo da busca resumido, criamos uma função para limpar os resultados da pesquisa.

	
< > Input
Python
def process_search_results(unique_results: dict) -&gt; dict:
"""Process search results by summarizing content where available.
Args:
unique_results: Dictionary of unique search results
Returns:
Dictionary of processed results with summaries
"""
summarized_results = {}
for url, result in unique_results.items():
# Use existing content if no raw content for summarization
if not result.get("raw_content"):
content = result['content']
else:
# Summarize raw content for better processing
content = summarize_webpage_content(result['raw_content'])
summarized_results[url] = {
'title': result['title'],
'content': content
}
return summarized_results
Copied

E por último, criamos uma função para dar um formato específico ao conteúdo da pesquisa.

	
< > Input
Python
def format_search_output(summarized_results: dict) -&gt; str:
"""Format search results into a well-structured string output.
Args:
summarized_results: Dictionary of processed search results
Returns:
Formatted string of search results with clear source separation
"""
if not summarized_results:
return "No valid search results found. Please try different search queries or use a different search API."
formatted_output = "Search results: "
for i, (url, result) in enumerate(summarized_results.items(), 1):
formatted_output += f" --- SOURCE {i}: {result['title']} --- "
formatted_output += f"URL: {url} "
formatted_output += f"SUMMARY: {result['content']} "
formatted_output += "-" * 80 + " "
return formatted_output
Copied

Com todas essas funções auxiliares, já podemos definir a ferramenta que vai usar as funções que definimos. Primeiro, realiza várias buscas em paralelo, descarta os resultados duplicados, limpa os resultados e dá um formato específico ao conteúdo da pesquisa.

	
< > Input
Python
from langchain_core.tools import tool, InjectedToolArg
@tool(parse_docstring=True)
def tavily_search(
query: str,
max_results: Annotated[int, InjectedToolArg] = 3,
topic: Annotated[Literal["general", "news", "finance"], InjectedToolArg] = "general",
) -&gt; str:
"""Fetch results from Tavily search API with content summarization.
Args:
query: A single search query to execute
max_results: Maximum number of results to return
topic: Topic to filter results by ('general', 'news', 'finance')
"""
# Execute search for single query
search_results = tavily_search_multiple(
[query], # Convert single query to list for the internal function
max_results=max_results,
topic=topic,
include_raw_content=True,
)
# Deduplicate results by URL to avoid processing duplicate content
unique_results = deduplicate_search_results(search_results)
# Process results with summarization
summarized_results = process_search_results(unique_results)
# Format output for consumption
return format_search_output(summarized_results)
Copied

Pode-se ver que usamos parse_docstring=True ao definir a tool. Isso faz com que o docstring da função seja passado para o LLM para que ele tenha essa informação como contexto. Se não fizermos isso, o LLM só receberá como contexto

{
"query": str,
"max_results": int,
"topic": Literal["geral", "notícias", "finanças"]
}

Ou seja, eu só saberia que tipo de argumentos a função espera, mas não saberia para que ela é usada. Mas, ao fazer parse_docstring=True, o que o LLM recebe é algo assim:

Tenho um buscador que:
- Recebe:
- query (string): "Uma consulta de pesquisa simples"
- max_results (int): "Número máximo de resultados a devolver"
- tópico (Literal): "Categoria para filtrar ('general', 'news', 'finance')"

Embora haja outra coisa que fizemos que faz com que não seja realmente assim, as linhas

max_results: Annotated[int, InjectedToolArg] = 3,
topic: Annotado[Literal["general", "news", "finance"], InjectedToolArg] = "general",

Usam InjectedToolArg, que faz com que o valor desses argumentos seja fixo e não decidido pelo LLM. Imagine que o LLM decida que o número máximo de resultados seja 100, isso poderia fazer com que a busca fosse longa demais.

Por isso, o que o LLM realmente recebe é algo assim:

Tenho um buscador que:
- Recebe:
- query (string): "Uma consulta de pesquisa simples"

Ferramenta de reflexãolink image 127

Como queremos que o agente reflita após cada busca, damos a ele uma ferramenta para isso

	
< > Input
Python
@tool(parse_docstring=True)
def think_tool(reflection: str = "") -&gt; str:
"""Record your strategic reflection on research progress (REQUIRED).
You MUST provide a detailed reflection analyzing your current findings,
gaps, and next steps. Never call this tool without providing reflection text.
Use this tool after each search to analyze results and plan next steps systematically.
This creates a deliberate pause in the research workflow for quality decision-making.
When to use:
- After receiving search results: What key information did I find?
- Before deciding next steps: Do I have enough to answer comprehensively?
- When assessing research gaps: What specific information am I still missing?
- Before concluding research: Can I provide a complete answer now?
Args:
reflection: (REQUIRED) Your detailed reflection on research progress, findings, gaps, and next steps.
Your reflection should include analysis of current findings, gap assessment,
quality evaluation, and strategic decision about next steps.
"""
if not reflection:
return "Reflection recorded: [No reflection provided]"
return f"Reflection recorded: {reflection}"
Copied

Assim como antes, usamos parse_docstring=True para que o docstring seja passado ao LLM como contexto.

Modelos de linguagem do pesquisadorlink image 128

Agora que definimos as tools, vamos definir os diferentes modelos de linguagem que vamos usar, já que alguns deles vão usar as tools.

Modelo de linguagem de resumo do pesquisadorlink image 129

Primeiro vamos criar o modelo de linguagem que vamos usar na função summarize_webpage_content que definimos antes

	
< > Input
Python
from langchain.chat_models import init_chat_model
import os
import dotenv
dotenv.load_dotenv()
SUMMARIZATION_MODEL_NAME = "gpt-4.1-mini"
SUMMARIZATION_MODEL_PROVIDER = "openai"
SUMMARIZATION_MODEL_BASE_URL = "https://api.openai.com/v1"
SUMMARIZATION_MODEL_TEMPERATURE = 0.0
SUMMARIZATION_MODEL_PROVIDER_API_KEY = os.getenv("OPENAI_API_KEY")
summarization_model = init_chat_model(
model=SUMMARIZATION_MODEL_NAME,
model_provider=SUMMARIZATION_MODEL_PROVIDER,
api_key=SUMMARIZATION_MODEL_PROVIDER_API_KEY,
base_url=SUMMARIZATION_MODEL_BASE_URL,
temperature=SUMMARIZATION_MODEL_TEMPERATURE
)
Copied

Modelo de linguagem de pesquisalink image 130

Agora vamos definir o modelo de linguagem que será responsável pela pesquisa

	
< > Input
Python
RESEARCH_MODEL_NAME = "anthropic:claude-sonnet-4-5-20250929"
ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY")
RESEARCH_MODEL_MAX_TOKENS = 4096
research_model = init_chat_model(
model=RESEARCH_MODEL_NAME,
max_tokens=RESEARCH_MODEL_MAX_TOKENS
)
Copied

Agora damos ao modelo de linguagem de pesquisa acesso às tools que definimos

	
< > Input
Python
researcher_tools = [tavily_search, think_tool]
model_with_tools = research_model.bind_tools(researcher_tools)
Copied

Modelo de linguagem de compressão da informaçãolink image 131

Por fim, definimos um modelo de linguagem que será responsável por comprimir as informações da pesquisa

	
< > Input
Python
COMPRESS_MODEL_NAME = "gpt-4.1"
COMPRESS_MODEL_PROVIDER = "openai"
COMPRESS_MODEL_BASE_URL = "https://api.openai.com/v1"
COMPRESS_MODEL_TEMPERATURE = 0.0
COMPRESS_MODEL_PROVIDER_API_KEY = os.getenv("OPENAI_API_KEY")
compress_model = init_chat_model(
model=COMPRESS_MODEL_NAME,
model_provider=COMPRESS_MODEL_PROVIDER,
api_key=COMPRESS_MODEL_PROVIDER_API_KEY,
base_url=COMPRESS_MODEL_BASE_URL,
temperature=COMPRESS_MODEL_TEMPERATURE,
max_tokens=32000
)
Copied

Funções do agentelink image 132

Como vimos anteriormente, por um lado estão as ferramentas do agente, que são ferramentas que o LLM vai escolher quando e como usar, e por outro lado estão as funções do agente, que são as funções que vão ser executadas nos nós do grafo, e vão ser executadas no momento que nós definirmos por código.

Primeiro criamos uma função que será responsável por chamar o modelo de linguagem de pesquisa com as ferramentas às quais ele tem acesso. O modelo decidirá se precisa usar uma ferramenta ou não e, caso utilize, o controle será passado para a ferramenta para que ela seja executada.

	
< > Input
Python
def llm_call(state: ResearcherState):
"""Analyze current state and decide on next actions.
The model analyzes the current conversation state and decides whether to:
1. Call search tools to gather more information
2. Provide a final answer based on gathered information
Returns updated state with the model's response.
"""
try:
# Show progress bar while waiting for LLM response
print("⏳ Researcher agent:")
if isinstance(state.get('researcher_messages', [])[-1], HumanMessage):
format_messages([state.get("researcher_messages", [])[-1]], title="Researcher Agent - Simulated Human Message")
with alive_bar(monitor=False, stats=False, title="", spinner='dots_waves', bar='blocks') as bar:
research_messages = model_with_tools.invoke(
[SystemMessage(content=research_agent_prompt)] + state["researcher_messages"]
)
bar() # Complete the progress bar
# Format and display the research messages
format_messages([research_messages], title="Researcher Agent response")
# Return the research messages
return {
"researcher_messages": [
research_messages
]
}
except Exception as e:
# Get the traceback information
exc_type, exc_obj, exc_tb = sys.exc_info()
line_number = exc_tb.tb_lineno
# Print detailed error information
print(f" ❌ Error in llm_call function:")
print(f" Line number: {line_number}")
print(f" Error type: {type(e).__name__}")
print(f" Error message: {str(e)}")
print(f" Full traceback:")
traceback.print_exc()
# Re-raise the exception to let the caller handle it
raise
Copied

Se o modelo de linguagem de pesquisa decidir que não precisa usar uma ferramenta, o controle é passado para a função tool_node para que a ferramenta escolhida pelo LLM seja executada.

	
< > Input
Python
from langchain_core.messages import ToolMessage, ToolCall
tools_by_name = {tool.name: tool for tool in researcher_tools}
def tool_node(state: ResearcherState):
"""Execute all tool calls from the previous LLM response.
Executes all tool calls from the previous LLM responses.
Returns updated state with tool execution results.
"""
try:
# Get the tool calls
tool_calls = state["researcher_messages"][-1].tool_calls
# Format the tool calls
format_messages([ToolCall(
name="Tool Calls",
args=tool_calls,
id="tool_call_id"
)], title="Researcher Agent - Tool calls")
# Execute all tool calls
observations = []
for tool_call in tool_calls:
with alive_bar(monitor=False, stats=False, title=f"", spinner='dots_waves', bar='blocks') as bar:
tool = tools_by_name[tool_call["name"]]
observation = tool.invoke(tool_call["args"])
observations.append(observation)
bar()
# Format and display the result immediately
format_messages([ToolMessage(
content=observation,
name=tool_call["name"],
tool_call_id=tool_call["id"]
)], title="Researcher Agent - Tool calls result")
# Create tool message outputs
tool_outputs = [
ToolMessage(
content=observation,
name=tool_call["name"],
tool_call_id=tool_call["id"]
) for observation, tool_call in zip(observations, tool_calls)
]
# Return the tool outputs
return {"researcher_messages": tool_outputs}
except Exception as e:
# Get the traceback information
exc_type, exc_obj, exc_tb = sys.exc_info()
line_number = exc_tb.tb_lineno
# Print detailed error information
print(f" ❌ Error in tool_node function:")
print(f" Line number: {line_number}")
print(f" Error type: {type(e).__name__}")
print(f" Error message: {str(e)}")
print(f" Full traceback:")
traceback.print_exc()
# Re-raise the exception to let the caller handle it
raise
Copied

Agora vamos definir a função que será responsável por comprimir as informações da pesquisa.

	
< > Input
Python
from langchain_core.messages import SystemMessage, HumanMessage, filter_messages
def compress_research(state: ResearcherState) -&gt; dict:
"""Compress research findings into a concise summary.
Takes all the research messages and tool outputs and creates
a compressed summary suitable for the supervisor's decision-making.
"""
try:
system_message = compress_research_system_prompt.format(date=get_today_str())
messages = [SystemMessage(content=system_message)] + state.get("researcher_messages", []) + [HumanMessage(content=compress_research_human_message)]
print("⏳ Compressing Research:")
with alive_bar(monitor=False, stats=False, title="", spinner='dots_waves', bar='blocks') as bar:
response = compress_model.invoke(messages)
bar()
# Format and display the compressed research
format_messages([response], title="Researcher Agent - Compressed Research")
# Extract raw notes from tool and AI messages
raw_notes = [
str(m.content) for m in filter_messages(
state["researcher_messages"],
include_types=["tool", "ai"]
)
]
# Return the compressed research and raw notes
return {
"compressed_research": str(response.content),
"raw_notes": [" ".join(raw_notes)]
}
except Exception as e:
# Get the traceback information
exc_type, exc_obj, exc_tb = sys.exc_info()
line_number = exc_tb.tb_lineno
# Print detailed error information
print(f" ❌ Error in compress_research function:")
print(f" Line number: {line_number}")
print(f" Error type: {type(e).__name__}")
print(f" Error message: {str(e)}")
print(f" Full traceback:")
traceback.print_exc()
# Re-raise the exception to let the caller handle it
raise
Copied

Por fim, vamos definir a função que será responsável por decidir se a investigação continua ou se é finalizada.

O que vai fazer é verificar se a última mensagem do modelo de linguagem de pesquisa contém chamadas de ferramentas e, caso contenha, isso significa que o LLM decidiu usar uma ferramenta, então o controle é passado para a função tool_node para que seja executada a ferramenta que o LLM escolheu.

Caso contrário, se a última mensagem não contiver tool calls, isso significa que o LLM decidiu que já tem informações suficientes e o controle é passado para a função compress_research para que as informações da pesquisa sejam comprimidas.

	
< > Input
Python
def should_continue(state: ResearcherState) -&gt; Literal["tool_node", "compress_research"]:
"""Determine whether to continue research or provide final answer.
Determines whether the agent should continue the research loop or provide
a final answer based on whether the LLM made tool calls.
Returns:
"tool_node": Continue to tool execution
"compress_research": Stop and compress research
"""
try:
messages = state["researcher_messages"]
last_message = messages[-1]
# If the LLM makes a tool call, continue to tool execution
if last_message.tool_calls:
# Create a System message to show the decision
decision_message = SystemMessage(
content="Last message contains tool calls. Continuing to tool execution..."
)
format_messages([decision_message], title="Researcher Agent - Should continue")
return "tool_node"
# Otherwise, we have a final answer
else:
# Create a System message to show the decision
decision_message = SystemMessage(
content="No tool calls found. Stopping research and compressing findings..."
)
format_messages([decision_message], title="Researcher Agent - Should compress research")
return "compress_research"
except Exception as e:
# Get the traceback information
exc_type, exc_obj, exc_tb = sys.exc_info()
line_number = exc_tb.tb_lineno
# Print detailed error information
print(f" ❌ Error in should_continue function:")
print(f" Line number: {line_number}")
print(f" Error type: {type(e).__name__}")
print(f" Error message: {str(e)}")
print(f" Full traceback:")
traceback.print_exc()
# Re-raise the exception to let the caller handle it
raise
Copied

Grafo do pesquisadorlink image 133

Já temos tudo o que é necessário para construir o grafo do agente researcher.

Primeiro criamos o grafo

	
< > Input
Python
# Build the agent workflow
researcher_agent_builder = StateGraph(ResearcherState, output_schema=ResearcherOutputState)
Copied

Agora criamos os nós que vão compor o grafo. Vão utilizar as funções que definimos anteriormente.

	
< > Input
Python
# Add nodes to the graph
researcher_agent_builder.add_node("llm_call", llm_call)
researcher_agent_builder.add_node("tool_node", tool_node)
researcher_agent_builder.add_node("compress_research", compress_research)
Copied
>_ Output
			
&lt;langgraph.graph.state.StateGraph at 0x111e87560&gt;

Já temos os nós, vamos uni-los com as arestas.

  • Do nó START passa-se para o nó llm_call
  • Do nó llm_call passa-se para o nó tool_node se a última mensagem contiver tool calls, ou para o nó compress_research se não contiver tool calls
  • Do nó tool_node passa-se para o nó llm_call para que o LLM possa decidir se continua investigando ou não
  • Do nó compress_research passa-se para o nó END
	
< > Input
Python
# Add edges to connect nodes
researcher_agent_builder.add_edge(START, "llm_call")
researcher_agent_builder.add_conditional_edges(
"llm_call",
should_continue,
{
"tool_node": "tool_node", # Continue research loop
"compress_research": "compress_research", # Provide final answer
},
)
researcher_agent_builder.add_edge("tool_node", "llm_call") # Loop back for more research
researcher_agent_builder.add_edge("compress_research", END)
Copied
>_ Output
			
&lt;langgraph.graph.state.StateGraph at 0x111e87560&gt;

Compilamos o grafo e representamos o diagrama de fluxo

	
< > Input
Python
from langgraph.checkpoint.memory import InMemorySaver
from IPython.display import Image, display
checkpointer = InMemorySaver()
researcher_agent = researcher_agent_builder.compile(checkpointer=checkpointer)
# Visualize the workflow
display(Image(researcher_agent.get_graph(xray=True).draw_mermaid_png()))
Copied
>_ Output
			
&lt;IPython.core.display.Image object&gt;

Execução do agente researcherlink image 134

Primeiro vamos chamar o agente Scope para que nos ajude a definir o research_brief

Criamos uma thread para poder fazer várias chamadas ao agente, caso ele nos peça mais informações.

	
< > Input
Python
thread = {"configurable": {"thread_id": "2"}}
user_message = "Quero pesquisar os melhores cafés de Madrid.."
result = await scope_agent.ainvoke({"messages": [HumanMessage(content=f"{user_message}.")]}, config=thread)
Copied
>_ Output
			
⏳ Scope agent:
>_ Output
			
╭───────────────────────────────────────────── 🧑 Real Human Message ─────────────────────────────────────────────╮
│ Quero pesquisar os melhores cafés de Madrid... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 1.4s
>_ Output
			
╭─────────────────────────────────── 🤖 Scope Assistant - need clarification? ────────────────────────────────────╮
│ need_clarification=True question='Você está procurando cafés para trabalhar, para lazer, ou com algum critério │
│ específico (por exemplo, cafés com wi-fi, ambiente tranquilo, cafés tradicionais, etc.)?' verification='' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────────────────── 🔧 Scope System Message ────────────────────────────────────────────╮
│ Necesita aclaración por parte del usuario. Enviando pregunta aclaratoria... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

O agente nos pede mais informações, portanto, voltamos a invocar o agente com as informações que ele solicitou.

	
< > Input
Python
user_message = "Examine a qualidade do café para avaliar as melhores cafeterias de Madri.."
result = await scope_agent.ainvoke({"messages": [HumanMessage(content=f"{user_message}.")]}, config=thread)
Copied
>_ Output
			
⏳ Scope agent:
>_ Output
			
╭───────────────────────────────────────────── 🧑 Real Human Message ─────────────────────────────────────────────╮
│ Examine a qualidade do café para avaliar as melhores cafeterias de Madri... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 1.3s
>_ Output
			
╭─────────────────────────────────── 🤖 Scope Assistant - need clarification? ────────────────────────────────────╮
│ need_clarification=False question='' verification='Você forneceu informações suficientes para iniciar a │
│ investigação. Entendi que deseja um relatório avaliando as melhores cafeterias de Madri com base na qualidade │
│ do café servido. Iniciarei agora a pesquisa considerando esse critério principal.' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────────────────── 🔧 Scope System Message ────────────────────────────────────────────╮
│ No necesita aclaración por parte del usuario. Enviando mensaje de verificación... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Scope agent - Write research brief:
>_ Output
			
╭─────────────────────────────────── 🤖 Scope Assistant - Write research brief ───────────────────────────────────╮
│ Você forneceu informações suficientes para iniciar a investigação. Entendi que deseja um relatório avaliando as │
│ melhores cafeterias de Madri com base na qualidade do café servido. Iniciarei agora a pesquisa considerando │
│ esse critério principal. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 3.6s
>_ Output
			
╭───────────────────────────────── 🤖 Scope Assistant - Research brief generated ─────────────────────────────────╮
│ research_brief='Quero identificar as melhores cafeterias de Madri avaliando especificamente a qualidade do café │
│ servido. Para isso, desejo que a pesquisa considere critérios como sabor, aroma, frescor dos grãos, métodos de │
│ preparo e reputação do estabelecimento em relação à qualidade do café. Não especifiquei preferências quanto a │
│ preço, localização, ambiente, wi-fi ou outros serviços, portanto, esses aspectos podem ser considerados │
│ flexíveis ou secundários. Priorize fontes oficiais das cafeterias, avaliações de clientes em plataformas │
│ confiáveis (como Google Maps, TripAdvisor ou sites especializados em café) e publicações em espanhol, sempre │
│ que possível.' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

Já temos o research_brief, portanto podemos invocar o agente Researcher para que comece a pesquisa.

IMPORTANTE: Neste caso, o que fazemos é invocar o agente Researcher com o research_brief que já temos, para isso passamos como a variável de estado researcher_messages e como a variável de estado research_topic

Também criamos um cliente da API da Tavily para poder fazer buscas na internet.

	
< > Input
Python
from tavily import TavilyClient
research_brief = result["research_brief"]
research_topic = str(research_brief)
tavily_client = TavilyClient(api_key=os.getenv("TAVILY_API_KEY"))
result = await researcher_agent.ainvoke({"researcher_messages": [HumanMessage(content=f"{research_brief}.")], "research_topic": research_topic}, config=thread)
Copied
>_ Output
			
⏳ Researcher agent:
>_ Output
			
╭───────────────────────────────── 🧑 Researcher Agent - Simulated Human Message ─────────────────────────────────╮
│ Quero identificar as melhores cafeterias de Madri avaliando especificamente a qualidade do café servido. Para │
│ isso, desejo que a pesquisa considere critérios como sabor, aroma, frescor dos grãos, métodos de preparo e │
│ reputação do estabelecimento em relação à qualidade do café. Não especifiquei preferências quanto a preço, │
│ localização, ambiente, wi-fi ou outros serviços, portanto, esses aspectos podem ser considerados flexíveis ou │
│ secundários. Priorize fontes oficiais das cafeterias, avaliações de clientes em plataformas confiáveis (como │
│ Google Maps, TripAdvisor ou sites especializados em café) e publicações em espanhol, sempre que possível.. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 4.6s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ Vou ajudá-lo a identificar as melhores cafeterias de Madri focadas especificamente na qualidade do café. Vou │
│ realizar uma pesquisa estruturada considerando os critérios que você mencionou. │
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "mejores cafeterías Madrid calidad café especial granos métodos preparación" │
│ } │
│ ID: toolu_01HzGvKNQde1A9iH6D3rZtwM │
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "specialty coffee Madrid baristas mejor café artesanal reseñas" │
│ } │
│ ID: toolu_01RdtDvXGXERGVtSv9NFPWqU │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: tavily_search │
│ ID: toolu_01HzGvKNQde1A9iH6D3rZtwM │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "mejores cafeterías Madrid calidad café especial granos métodos preparación" │
│ } │
│ │
│ Tool Call 2: │
│ Name: tavily_search │
│ ID: toolu_01RdtDvXGXERGVtSv9NFPWqU │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "specialty coffee Madrid baristas mejor café artesanal reseñas" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 24.0s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: ▷ 10 Mejores Cafeterías de Especialidad 《 Madrid 》 --- │
│ URL: https://myspecialtycoffee.es/madrid/ │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ A página apresenta um guia detalhado das melhores cafeterias de especialidade em Madrid, destacando 10 │
│ estabelecimentos principais como HanSo Café, Toma Café, Misión Café, Hola Coffee, Ruda Café, Acid Café, Geisha │
│ Coffee, Santa Kafeina, The Fix e Cafelito. Cada café é descrito com informações sobre localização, horário, │
│ preço médio, métodos de preparo (como V60, Chemex, Aeropress, espresso), tipos de grãos (origem única, torra │
│ leve ou média), e ofertas gastronômicas complementares, incluindo opções veganas e produtos artesanais. O │
│ conteúdo enfatiza a crescente cena do café de especialidade em Madrid, especialmente em bairros como Malasaña, │
│ Lavapiés e Chamberí, ressaltando a cultura local que valoriza a sustentabilidade, a qualidade e a conexão entre │
│ produtores e consumidores. Além disso, a página explica as qualidades do café de especialidade, destacando sua │
│ pureza, complexidade de sabores e métodos precisos de preparo. Também menciona que as cafeterias oferecem │
│ ambientes ideais para trabalho, socialização e eventos culturais relacionados ao café, como workshops e │
...
│ grandes diferencias entre una cafetería de especialidad y una tradicional es el ambiente.", "La proximidad a │
│ una buena cafetería de especialidad se está convirtiendo en un factor importante para quienes buscan una nueva │
│ vivienda.", "Las zonas con mayor concentración de Specialty Coffee podrían experimentar un aumento en el valor │
│ de las propiedades.", "El Specialty Coffee se ha convertido en un símbolo de estilo de vida moderno, asociado │
│ con la calidad, el buen gusto y la experiencia sensorial." │
│ &lt;/key_excerpts&gt; │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 12.9s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: Las 10 Mejores Cafeterías de Especialidad en Madrid - YouTube --- │
│ URL: https://www.youtube.com/watch?v=v3_i-I8B5U4 │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ O artigo apresenta um ranking das 10 melhores cafeterias de especialidade em Madrid, elaborado pelo fundador da │
│ plataforma 'Mi Piso en Madrid', um entusiasta do café de especialidade. A lista inclui: Pink Bourbon Espresso │
│ Bar, Naji Specialty Coffee, Lilo Brunch Specialty Coffee, Geisha Specialty Coffee, Hola Coffee, Umami Specialty │
│ Coffee, East Crema Coffee, Syra Coffee, La Deseada Specialty Coffee e Bô Specialty Coffee. Além disso, o site │
│ oferece serviços de consultoria imobiliária personalizada para quem deseja comprar um imóvel estrategicamente │
│ localizado próximo a essas cafeterias. Também há um blog que discute o impacto do café de especialidade no │
│ mercado imobiliário. O conteúdo é direcionado a amantes de Madrid, seu ambiente e, especialmente, do café de │
│ alta qualidade, incentivando o contato para mais informações e o acompanhamento nas redes sociais. │
│ &lt;/summary&gt; │
│ │
...
│ https://www.telecinco.es/gastronomia/alimentacion/20250405/mapa-mejores-cafes-barista-madrid-planes-gourmet_18_ │
│ 015172731.html │
│ │
│ SUMMARY: │
│ El mapa de los mejores cafés de barista de Madrid · Baya Café Vino (Madrid) · Beik Biek (Madrid) · Bianchi │
│ Kiosko Cafe (Madrid) · Branco Speciality │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 8.6s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": "Análise dos resultados da primeira pesquisa: **Informações importantes │
│ encontradas:** - Identifiquei várias cafeterias de especialidade em Madrid mencionadas em múltiplas fontes - │
│ As cafeterias mais citadas incluem: HanSo Café, Toma Café, Misión Café, Hola Coffee, Naji Specialty Coffee, │
│ Geisha Coffee, Pink Bourbon Espresso Bar, Lilo Brunch, Bô Specialty Coffee, La Deseada - As fontes mencionam │
│ métodos de preparo como V60, Chemex, Aeropress, espresso - Há foco em grãos de origem única, torras │
│ leves/médias - Bairros principais: Malasaña, Lavapiés, Chamberí **Lacunas identificadas:** - Faltam │
│ detalhes específicos sobre qualidade do café (sabor, aroma, frescor dos grãos) em cada estabelecimento - Não │
│ tenho informações de avaliações de clientes em plataformas como Google Maps ou TripAdvisor - Preciso de │
│ informações mais detalhadas sobre a reputação de cada cafeteria - Faltam sites oficiais das cafeterias │
│ mencionadas **Próximos passos:** Vou buscar avaliações específicas e reputação das cafeterias mais │
│ mencionadas, focando em plataformas de avaliação e informações sobre qualidade do café servido." │
│ } │
│ ID: toolu_01Re1azR9qC2rx8QrVjyvYa4 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: think_tool │
│ ID: toolu_01Re1azR9qC2rx8QrVjyvYa4 │
│ Type: tool_call │
│ Args: │
│ { │
│ "reflection": "Análise dos resultados da primeira pesquisa: **Informações importantes │
│ encontradas:** - Identifiquei várias cafeterias de especialidade em Madrid mencionadas em múltiplas fontes - │
│ As cafeterias mais citadas incluem: HanSo Café, Toma Café, Misión Café, Hola Coffee, Naji Specialty Coffee, │
│ Geisha Coffee, Pink Bourbon Espresso Bar, Lilo Brunch, Bô Specialty Coffee, La Deseada - As fontes mencionam │
│ métodos de preparo como V60, Chemex, Aeropress, espresso - Há foco em grãos de origem única, torras │
│ leves/médias - Bairros principais: Malasaña, Lavapiés, Chamberí **Lacunas identificadas:** - Faltam │
│ detalhes específicos sobre qualidade do café (sabor, aroma, frescor dos grãos) em cada estabelecimento - Não │
│ tenho informações de avaliações de clientes em plataformas como Google Maps ou TripAdvisor - Preciso de │
│ informações mais detalhadas sobre a reputação de cada cafeteria - Faltam sites oficiais das cafeterias │
│ mencionadas **Próximos passos:** Vou buscar avaliações específicas e reputação das cafeterias mais │
│ mencionadas, focando em plataformas de avaliação e informações sobre qualidade do café servido." │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 0.0s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Reflection recorded: Análise dos resultados da primeira pesquisa: │
│ │
│ **Informações importantes encontradas:** │
│ - Identifiquei várias cafeterias de especialidade em Madrid mencionadas em múltiplas fontes │
│ - As cafeterias mais citadas incluem: HanSo Café, Toma Café, Misión Café, Hola Coffee, Naji Specialty Coffee, │
│ Geisha Coffee, Pink Bourbon Espresso Bar, Lilo Brunch, Bô Specialty Coffee, La Deseada │
│ - As fontes mencionam métodos de preparo como V60, Chemex, Aeropress, espresso │
│ - Há foco em grãos de origem única, torras leves/médias │
│ - Bairros principais: Malasaña, Lavapiés, Chamberí │
│ │
│ **Lacunas identificadas:** │
│ - Faltam detalhes específicos sobre qualidade do café (sabor, aroma, frescor dos grãos) em cada estabelecimento │
│ - Não tenho informações de avaliações de clientes em plataformas como Google Maps ou TripAdvisor │
│ - Preciso de informações mais detalhadas sobre a reputação de cada cafeteria │
│ - Faltam sites oficiais das cafeterias mencionadas │
│ │
│ **Próximos passos:** │
│ Vou buscar avaliações específicas e reputação das cafeterias mais mencionadas, focando em plataformas de │
│ avaliação e informações sobre qualidade do café servido. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 3.6s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "HanSo Café Toma Café Madrid opiniones reseñas calidad café TripAdvisor Google" │
│ } │
│ ID: toolu_01MpPMnFZrGawPd77SeebeKM │
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "Naji Specialty Coffee Geisha Coffee Madrid valoraciones clientes sabor aroma" │
│ } │
│ ID: toolu_01T96rEgbpLuWD24CCP7Qk7x │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: tavily_search │
│ ID: toolu_01MpPMnFZrGawPd77SeebeKM │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "HanSo Café Toma Café Madrid opiniones reseñas calidad café TripAdvisor Google" │
│ } │
│ │
│ Tool Call 2: │
│ Name: tavily_search │
│ ID: toolu_01T96rEgbpLuWD24CCP7Qk7x │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "Naji Specialty Coffee Geisha Coffee Madrid valoraciones clientes sabor aroma" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 2.1s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: Capuchino y Chai - Picture of HanSo Cafe, Madrid - Tripadvisor --- │
│ URL: https://www.tripadvisor.com/LocationPhotoDirectLink-g187514-d5870249-i281611212-HanSo_Cafe-Madrid.html │
│ │
│ SUMMARY: │
│ From Review : Para los amantes del café of HanSo Cafe. HanSo Cafe · 435 reviews. #748 of 10540 restaurants in │
│ Madrid. Calle Pez 20 Barrio Malasaña, 28004 Madrid │
│ │
│ -------------------------------------------------------------------------------- │
│ │
│ │
│ --- SOURCE 2: TOMA CAFE 1, Madrid - 2025 Reviews &amp; Information - Tripadvisor --- │
│ URL: https://www.tripadvisor.ca/Restaurant_Review-g187514-d2408938-Reviews-or150-Toma_Cafe_1-Madrid.html │
│ │
│ SUMMARY: │
│ The food mediocre at best. We ordered two different types of sandwiches and both were bland at best. If you │
│ want amazing coffee and a very nice breakfast go to │
│ │
│ -------------------------------------------------------------------------------- │
│ │
│ │
│ --- SOURCE 3: HANSO CAFE 2, Madrid - Restaurant Reviews &amp; Photos - Tripadvisor --- │
│ URL: https://www.tripadvisor.com/Restaurant_Review-g187514-d27001341-Reviews-Hanso_Cafe_2-Madrid.html │
│ │
│ SUMMARY: │
│ The place is minimalist and modern decor (the bad thing is that it is a bit tight and noisy), the menu wide and │
│ varied, and the prices high but not crazy. The │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 16.2s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: Naji Specialty Coffee | Madrid - Facebook --- │
│ URL: https://www.facebook.com/najispecialtycoffeeshop/?locale=es_LA │
│ │
│ SUMMARY: │
│ Recomendado por el 94% (10 opiniones). Publicaciones. Naji Specialty Coffee ... Naji Specialty Coffee está en │
│ Madrid Coffee Festival. 4 de mar │
│ │
│ -------------------------------------------------------------------------------- │
│ │
│ │
│ --- SOURCE 2: El café de pistacho más famoso de Madrid se toma en Naji Specialty ... --- │
│ URL: https://guiadelocio.es/madrid/plan/naji-specialty-coffee-cafe-de-pistacho-mas-famoso-de-madrid/ │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
...
│ de métodos como V60, Chemex, Aeropress, y espresso.", "Naji Specialty Coffee se especializa en granos de origen │
│ único y tueste ligero, provenientes de micro-lotes seleccionados de países como Etiopía, Colombia y Brasil.", │
│ "El menú de Naji Specialty Coffee ofrece diversas opciones de brunch, incluyendo tostadas, bowls y postres │
│ caseros.", "Naji Specialty Coffee no acepta reservas, pero su equipo trabaja para reducir los tiempos de espera │
│ y hacer la experiencia lo más agradable posible." │
│ &lt;/key_excerpts&gt; │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 8.4s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": "Análise dos resultados da segunda pesquisa: **Novas informações obtidas:** - HanSo │
│ Café: 435 reviews no TripAdvisor, classificado como #748 de 10.540 restaurantes em Madrid, localizado no bairro │
│ Malasaña - Toma Café: Mencionado no TripAdvisor, mas a avaliação encontrada foi mista (comentário sobre comida │
│ medíocre, mas reconhece o café como "amazing") - Naji Specialty Coffee: 94% de recomendação (10 opiniões no │
│ Facebook), famoso pelo pistachio latte, usa grãos de origem única de Etiópia, Colômbia e Brasil, métodos V60, │
│ Chemex, Aeropress e espresso, preço médio 2,80€-4,50€, torra leve **Lacunas ainda existentes:** - Preciso │
│ de mais informações detalhadas sobre Geisha Coffee, Pink Bourbon, Hola Coffee - Faltam mais avaliações │
│ específicas sobre qualidade do café (sabor, aroma) - Preciso de informações sobre mais cafeterias para dar uma │
│ lista mais completa - Sites oficiais e contatos das cafeterias **Próximos passos:** Vou fazer mais uma │
│ busca focando nas outras cafeterias frequentemente mencionadas e buscando avaliações mais específicas sobre │
│ qualidade do café." │
│ } │
│ ID: toolu_01YLjSRPARNZVzU3nLSRAiZA │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: think_tool │
│ ID: toolu_01YLjSRPARNZVzU3nLSRAiZA │
│ Type: tool_call │
│ Args: │
│ { │
│ "reflection": "Análise dos resultados da segunda pesquisa: **Novas informações obtidas:** - HanSo │
│ Café: 435 reviews no TripAdvisor, classificado como #748 de 10.540 restaurantes em Madrid, localizado no bairro │
│ Malasaña - Toma Café: Mencionado no TripAdvisor, mas a avaliação encontrada foi mista (comentário sobre comida │
│ medíocre, mas reconhece o café como "amazing") - Naji Specialty Coffee: 94% de recomendação (10 opiniões no │
│ Facebook), famoso pelo pistachio latte, usa grãos de origem única de Etiópia, Colômbia e Brasil, métodos V60, │
│ Chemex, Aeropress e espresso, preço médio 2,80€-4,50€, torra leve **Lacunas ainda existentes:** - Preciso │
│ de mais informações detalhadas sobre Geisha Coffee, Pink Bourbon, Hola Coffee - Faltam mais avaliações │
│ específicas sobre qualidade do café (sabor, aroma) - Preciso de informações sobre mais cafeterias para dar uma │
│ lista mais completa - Sites oficiais e contatos das cafeterias **Próximos passos:** Vou fazer mais uma │
│ busca focando nas outras cafeterias frequentemente mencionadas e buscando avaliações mais específicas sobre │
│ qualidade do café." │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 0.0s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Reflection recorded: Análise dos resultados da segunda pesquisa: │
│ │
│ **Novas informações obtidas:** │
│ - HanSo Café: 435 reviews no TripAdvisor, classificado como #748 de 10.540 restaurantes em Madrid, localizado │
│ no bairro Malasaña │
│ - Toma Café: Mencionado no TripAdvisor, mas a avaliação encontrada foi mista (comentário sobre comida medíocre, │
│ mas reconhece o café como "amazing") │
│ - Naji Specialty Coffee: 94% de recomendação (10 opiniões no Facebook), famoso pelo pistachio latte, usa grãos │
│ de origem única de Etiópia, Colômbia e Brasil, métodos V60, Chemex, Aeropress e espresso, preço médio │
│ 2,80€-4,50€, torra leve │
│ │
│ **Lacunas ainda existentes:** │
│ - Preciso de mais informações detalhadas sobre Geisha Coffee, Pink Bourbon, Hola Coffee │
│ - Faltam mais avaliações específicas sobre qualidade do café (sabor, aroma) │
│ - Preciso de informações sobre mais cafeterias para dar uma lista mais completa │
│ - Sites oficiais e contatos das cafeterias │
│ │
│ **Próximos passos:** │
│ Vou fazer mais uma busca focando nas outras cafeterias frequentemente mencionadas e buscando avaliações mais │
│ específicas sobre qualidade do café. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 3.4s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": ""Hola Coffee" "Misión Café" "Pink Bourbon" Madrid specialty coffee opiniones calidad │
│ granos" │
│ } │
│ ID: toolu_01Kw7vozwc9Wtwn8fHGA262U │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: tavily_search │
│ ID: toolu_01Kw7vozwc9Wtwn8fHGA262U │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": ""Hola Coffee" "Misión Café" "Pink Bourbon" Madrid specialty coffee opiniones calidad │
│ granos" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 2.3s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: Bo Specialty Coffee Madrid | TikTok --- │
│ URL: https://www.tiktok.com/discover/bo-specialty-coffee-madrid │
│ │
│ SUMMARY: │
│ 2️⃣ Obrador de Mision Café ... Pink Bourbon Coffee Madrid · Espresso Americano Madrid · Specialty Coffee München │
│ · Hola Coffee Madrid Curso · Kızılay Coffee De │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 3.1s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "mejores cafeterías especialidad Madrid 2024 2025 ranking guía opiniones baristas tostadores" │
│ } │
│ ID: toolu_01Xd6oeB84yoveJn6kMYwyRH │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: tavily_search │
│ ID: toolu_01Xd6oeB84yoveJn6kMYwyRH │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "mejores cafeterías especialidad Madrid 2024 2025 ranking guía opiniones baristas tostadores" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 15.8s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: Las Mejores Tostadoras de Café en Madrid | Lista del TOP10 --- │
│ URL: https://losmejoresdemadrid.com/tostadoras-cafe/ │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ A página apresenta um ranking atualizado em fevereiro de 2025 das melhores tostadoras de café em Madrid, │
│ avaliadas com base em 21 variáveis-chave distribuídas em cinco categorias, incluindo revisão de permissos, │
│ opiniões de usuários e chamadas mystery calls. O objetivo é conectar consumidores com profissionais locais de │
│ alta qualidade. Entre os destaques estão Cero Coffee Roasters, Martín Tostador, Boconó Specialty Coffee Shop, │
│ Café Raizal, Cafés Guayacán, Café Puerto Rico, Camden Coffee Roasters, Cafés La Mexicana e Hola Coffee │
│ Roastery, cada um com avaliações detalhadas de reputação no Google e Facebook, além de notas em rapidez, │
│ amabilidade, colaboração e atenção. A página também oferece perguntas frequentes sobre diferenças entre │
│ tostadores artesanais e industriais, duração da frescura do café, tipos de torra para espresso e filtrado, │
│ escolha de tostador doméstico e preferência entre café em grão ou moído. Há um aviso de que as empresas │
│ destacadas pagam para aparecer e que a plataforma não intervém nas relações cliente-empresa. Por fim, há um │
...
│ --- SOURCE 3: Las mejores cafeterías de especialidad de España en 2025 --- │
│ URL: https://www.gastronomistas.com/las-mejores-cafeterias-de-especialidad-de-espana-en-2025/ │
│ │
│ SUMMARY: │
│ Madrid, con 20 locales, y Barcelona, con 17, lideran el listado de mejores cafeterías de especialidad BEST │
│ COFFEE SHOPS de España 2025. │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 11.5s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": "Análise dos resultados da terceira e quarta pesquisa: **Informações cruciais │
│ encontradas:** - HOLA COFFEE LAGASCA está classificada em 12º lugar no ranking mundial "The World's 100 Best │
│ Coffee Shops 2025", sendo a melhor cafeteria de Madrid e uma das 4 espanholas no ranking global - Madrid │
│ lidera Espanha com 20 cafeterias de especialidade no listado BEST COFFEE SHOPS de España 2025 - Identificadas │
│ as melhores tostadoras de café em Madrid: Cero Coffee Roasters, Martín Tostador, Boconó Specialty Coffee Shop, │
│ Café Raizal, Hola Coffee Roastery, Camden Coffee Roasters - Informações sobre que muitas dessas cafeterias │
│ torram seu próprio café, garantindo frescor **O que tenho até agora:** 1. Hola Coffee Lagasca - 12º melhor │
│ do mundo 2025 2. Naji Specialty Coffee - 94% recomendação, grãos únicos Etiópia/Colômbia/Brasil 3. HanSo Café │
│ - 435 reviews TripAdvisor, #748 em Madrid 4. Toma Café - Café descrito como "amazing" no TripAdvisor 5. │
│ Outras mencionadas: Geisha Coffee, Pink Bourbon, Misión Café, Bô Specialty Coffee, Lilo Brunch **Avaliação │
│ de suficiência:** Tenho informações sólidas sobre as principais cafeterias, incluindo reconhecimento │
│ internacional (Hola Coffee), métodos de preparo, origem dos grãos e avaliações. Com uma última pesquisa, posso │
│ obter informações mais específicas sobre algumas das outras cafeterias mencionadas para completar o │
│ panorama. **Próxima ação:** Fazer uma última busca para obter informações sobre as outras cafeterias │
│ citadas frequentemente (Toma Café detalhes, Misión Café, Geisha Coffee)." │
│ } │
│ ID: toolu_016Wgk6wAChfD8CLEGWV2cKS │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: think_tool │
│ ID: toolu_016Wgk6wAChfD8CLEGWV2cKS │
│ Type: tool_call │
│ Args: │
│ { │
│ "reflection": "Análise dos resultados da terceira e quarta pesquisa: **Informações cruciais │
│ encontradas:** - HOLA COFFEE LAGASCA está classificada em 12º lugar no ranking mundial "The World's 100 Best │
│ Coffee Shops 2025", sendo a melhor cafeteria de Madrid e uma das 4 espanholas no ranking global - Madrid │
│ lidera Espanha com 20 cafeterias de especialidade no listado BEST COFFEE SHOPS de España 2025 - Identificadas │
│ as melhores tostadoras de café em Madrid: Cero Coffee Roasters, Martín Tostador, Boconó Specialty Coffee Shop, │
│ Café Raizal, Hola Coffee Roastery, Camden Coffee Roasters - Informações sobre que muitas dessas cafeterias │
│ torram seu próprio café, garantindo frescor **O que tenho até agora:** 1. Hola Coffee Lagasca - 12º melhor │
│ do mundo 2025 2. Naji Specialty Coffee - 94% recomendação, grãos únicos Etiópia/Colômbia/Brasil 3. HanSo Café │
│ - 435 reviews TripAdvisor, #748 em Madrid 4. Toma Café - Café descrito como "amazing" no TripAdvisor 5. │
│ Outras mencionadas: Geisha Coffee, Pink Bourbon, Misión Café, Bô Specialty Coffee, Lilo Brunch **Avaliação │
│ de suficiência:** Tenho informações sólidas sobre as principais cafeterias, incluindo reconhecimento │
│ internacional (Hola Coffee), métodos de preparo, origem dos grãos e avaliações. Com uma última pesquisa, posso │
│ obter informações mais específicas sobre algumas das outras cafeterias mencionadas para completar o │
│ panorama. **Próxima ação:** Fazer uma última busca para obter informações sobre as outras cafeterias │
│ citadas frequentemente (Toma Café detalhes, Misión Café, Geisha Coffee)." │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 0.0s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Reflection recorded: Análise dos resultados da terceira e quarta pesquisa: │
│ │
│ **Informações cruciais encontradas:** │
│ - HOLA COFFEE LAGASCA está classificada em 12º lugar no ranking mundial "The World's 100 Best Coffee Shops │
│ 2025", sendo a melhor cafeteria de Madrid e uma das 4 espanholas no ranking global │
│ - Madrid lidera Espanha com 20 cafeterias de especialidade no listado BEST COFFEE SHOPS de España 2025 │
│ - Identificadas as melhores tostadoras de café em Madrid: Cero Coffee Roasters, Martín Tostador, Boconó │
│ Specialty Coffee Shop, Café Raizal, Hola Coffee Roastery, Camden Coffee Roasters │
│ - Informações sobre que muitas dessas cafeterias torram seu próprio café, garantindo frescor │
│ │
│ **O que tenho até agora:** │
│ 1. Hola Coffee Lagasca - 12º melhor do mundo 2025 │
│ 2. Naji Specialty Coffee - 94% recomendação, grãos únicos Etiópia/Colômbia/Brasil │
│ 3. HanSo Café - 435 reviews TripAdvisor, #748 em Madrid │
│ 4. Toma Café - Café descrito como "amazing" no TripAdvisor │
│ 5. Outras mencionadas: Geisha Coffee, Pink Bourbon, Misión Café, Bô Specialty Coffee, Lilo Brunch │
│ │
│ **Avaliação de suficiência:** │
│ Tenho informações sólidas sobre as principais cafeterias, incluindo reconhecimento internacional (Hola Coffee), │
│ métodos de preparo, origem dos grãos e avaliações. Com uma última pesquisa, posso obter informações mais │
│ específicas sobre algumas das outras cafeterias mencionadas para completar o panorama. │
│ │
│ **Próxima ação:** │
│ Fazer uma última busca para obter informações sobre as outras cafeterias citadas frequentemente (Toma Café │
│ detalhes, Misión Café, Geisha Coffee). │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 3.0s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": ""Toma Café" Madrid especialidad información granos métodos preparación valoración sitio │
│ oficial" │
│ } │
│ ID: toolu_01HwjGgXfnWNYR8feqXx3iqu │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: tavily_search │
│ ID: toolu_01HwjGgXfnWNYR8feqXx3iqu │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": ""Toma Café" Madrid especialidad información granos métodos preparación valoración sitio │
│ oficial" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 30.6s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: La Realidad De Producir Café De Especialidad En Fincas ... --- │
│ URL: https://www.tumblr.com/perfectdailygrind/179919420658/la-realidad-de-producir-caf%C3%A9-de-especialidad-en │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ O artigo aborda a realidade desafiadora da produção de café de especialidade em pequenas e minúsculas fazendas, │
│ com foco na região de Barreta, Coclé, Panamá. O autor, Damian Reed, um produtor canadense que vive no Panamá, │
│ descreve as dificuldades enfrentadas por pequenos caficultores, chamados de "caficultores microscópicos", que │
│ possuem entre uma e três hectares, muitas vezes com metade da terra improdutiva. A região de Barreta é isolada, │
│ com infraestrutura precária e extrema pobreza, onde o rendimento médio anual de um produtor pode ser tão baixo │
│ quanto USD 400. O café local historicamente é vendido a preços muito baixos, dificultando investimentos e │
│ manutenção das fazendas, agravado pela devastação causada pela ferrugem do café, que eliminou cerca de 90% das │
│ plantas. O autor identifica sete grandes desafios: qualidade do café, cultivo, capacitação, confiança, │
│ marketing e vendas, infraestrutura e organização. Apesar das dificuldades, eles conseguiram produzir café de │
│ especialidade com pontuações Q-grader entre 85,5 e 87, demonstrando que é possível produzir café de alta │
...
│ legado al café de especialidad sostenible, combinando sabor brasileño auténtico con carácter japonés.”, “Nomad │
│ Coffee es una empresa certificada B Corp, comprometida con prácticas sostenibles y de calidad.”, “Ineffable │
│ Coffee fue reconocido como Mejor Tostador de España en 2021, consolidando su reputación.”, “Zeri’s Coffee │
│ Roaster remunera a los caficultores en función de la calidad del lote, llegando a pagar de 5 a 10 veces más que │
│ el precio estándar.” │
│ &lt;/key_excerpts&gt; │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 13.2s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": "Análise final dos resultados obtidos: **Informações consolidadas sobre │
│ tostadores:** - Hola Coffee é mencionado como tostador reconhecido em Espanha - Nomad Coffee (Barcelona) é │
│ certificado B Corp - A pesquisa revelou mais contexto sobre produção de café de especialidade, mas não trouxe │
│ detalhes específicos sobre Toma Café **Avaliação completa:** Após 5 buscas (atingindo o limite recomendado │
│ para consultas complexas), consegui coletar informações substanciais sobre as melhores cafeterias de │
│ Madrid: **Informações sólidas obtidas:** 1. **Hola Coffee Lagasca** - Classificada 12º melhor do mundo │
│ 2025, reconhecimento internacional excepcional 2. **Naji Specialty Coffee** - 94% recomendação, grãos origem │
│ única (Etiópia, Colômbia, Brasil), métodos V60/Chemex/Aeropress, torra leve 3. **HanSo Café** - 435 reviews │
│ TripAdvisor, #748 de 10.540 em Madrid, Malasaña 4. **Toma Café** - Avaliações mencionam "amazing coffee" no │
│ TripAdvisor 5. Outras cafeterias identificadas: Geisha Coffee, Pink Bourbon, Misión Café, Bô Specialty Coffee, │
│ Lilo Brunch, La Deseada **Informações sobre tostadores (garantia de frescor):** - Cero Coffee Roasters, │
│ Martín Tostador, Boconó Specialty Coffee Shop, Café Raizal, Hola Coffee Roastery, Camden Coffee │
│ Roasters **Critérios atendidos:** ✓ Qualidade do café (especialidade, grãos origem única) ✓ Métodos de │
│ preparo (V60, Chemex, Aeropress, espresso) ✓ Frescor dos grãos (tostadores próprios) ✓ Reputação (ranking │
│ mundial, avaliações TripAdvisor, Facebook) ✓ Fontes em espanhol (maioria) **Conclusão:** Tenho informações │
│ suficientes para fornecer uma resposta completa e detalhada ao usuário. Madrid tem 20 cafeterias listadas no │
│ ranking BEST COFFEE SHOPS de España 2025, e consegui identificar as principais com informações sobre qualidade, │
│ métodos e reputação." │
│ } │
│ ID: toolu_01V9uDPoxUjRah8r5JviXFvp │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: think_tool │
│ ID: toolu_01V9uDPoxUjRah8r5JviXFvp │
│ Type: tool_call │
│ Args: │
│ { │
│ "reflection": "Análise final dos resultados obtidos: **Informações consolidadas sobre │
│ tostadores:** - Hola Coffee é mencionado como tostador reconhecido em Espanha - Nomad Coffee (Barcelona) é │
│ certificado B Corp - A pesquisa revelou mais contexto sobre produção de café de especialidade, mas não trouxe │
│ detalhes específicos sobre Toma Café **Avaliação completa:** Após 5 buscas (atingindo o limite recomendado │
│ para consultas complexas), consegui coletar informações substanciais sobre as melhores cafeterias de │
│ Madrid: **Informações sólidas obtidas:** 1. **Hola Coffee Lagasca** - Classificada 12º melhor do mundo │
│ 2025, reconhecimento internacional excepcional 2. **Naji Specialty Coffee** - 94% recomendação, grãos origem │
│ única (Etiópia, Colômbia, Brasil), métodos V60/Chemex/Aeropress, torra leve 3. **HanSo Café** - 435 reviews │
│ TripAdvisor, #748 de 10.540 em Madrid, Malasaña 4. **Toma Café** - Avaliações mencionam "amazing coffee" no │
│ TripAdvisor 5. Outras cafeterias identificadas: Geisha Coffee, Pink Bourbon, Misión Café, Bô Specialty Coffee, │
│ Lilo Brunch, La Deseada **Informações sobre tostadores (garantia de frescor):** - Cero Coffee Roasters, │
│ Martín Tostador, Boconó Specialty Coffee Shop, Café Raizal, Hola Coffee Roastery, Camden Coffee │
│ Roasters **Critérios atendidos:** ✓ Qualidade do café (especialidade, grãos origem única) ✓ Métodos de │
│ preparo (V60, Chemex, Aeropress, espresso) ✓ Frescor dos grãos (tostadores próprios) ✓ Reputação (ranking │
│ mundial, avaliações TripAdvisor, Facebook) ✓ Fontes em espanhol (maioria) **Conclusão:** Tenho informações │
│ suficientes para fornecer uma resposta completa e detalhada ao usuário. Madrid tem 20 cafeterias listadas no │
│ ranking BEST COFFEE SHOPS de España 2025, e consegui identificar as principais com informações sobre qualidade, │
│ métodos e reputação." │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 0.0s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Reflection recorded: Análise final dos resultados obtidos: │
│ │
│ **Informações consolidadas sobre tostadores:** │
│ - Hola Coffee é mencionado como tostador reconhecido em Espanha │
│ - Nomad Coffee (Barcelona) é certificado B Corp │
│ - A pesquisa revelou mais contexto sobre produção de café de especialidade, mas não trouxe detalhes específicos │
│ sobre Toma Café │
│ │
│ **Avaliação completa:** │
│ Após 5 buscas (atingindo o limite recomendado para consultas complexas), consegui coletar informações │
│ substanciais sobre as melhores cafeterias de Madrid: │
│ │
│ **Informações sólidas obtidas:** │
│ 1. **Hola Coffee Lagasca** - Classificada 12º melhor do mundo 2025, reconhecimento internacional excepcional │
│ 2. **Naji Specialty Coffee** - 94% recomendação, grãos origem única (Etiópia, Colômbia, Brasil), métodos │
│ V60/Chemex/Aeropress, torra leve │
│ 3. **HanSo Café** - 435 reviews TripAdvisor, #748 de 10.540 em Madrid, Malasaña │
│ 4. **Toma Café** - Avaliações mencionam "amazing coffee" no TripAdvisor │
│ 5. Outras cafeterias identificadas: Geisha Coffee, Pink Bourbon, Misión Café, Bô Specialty Coffee, Lilo Brunch, │
│ La Deseada │
│ │
│ **Informações sobre tostadores (garantia de frescor):** │
│ - Cero Coffee Roasters, Martín Tostador, Boconó Specialty Coffee Shop, Café Raizal, Hola Coffee Roastery, │
│ Camden Coffee Roasters │
│ │
│ **Critérios atendidos:** │
│ ✓ Qualidade do café (especialidade, grãos origem única) │
│ ✓ Métodos de preparo (V60, Chemex, Aeropress, espresso) │
│ ✓ Frescor dos grãos (tostadores próprios) │
│ ✓ Reputação (ranking mundial, avaliações TripAdvisor, Facebook) │
│ ✓ Fontes em espanhol (maioria) │
│ │
│ **Conclusão:** │
│ Tenho informações suficientes para fornecer uma resposta completa e detalhada ao usuário. Madrid tem 20 │
│ cafeterias listadas no ranking BEST COFFEE SHOPS de España 2025, e consegui identificar as principais com │
│ informações sobre qualidade, métodos e reputação. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 32.0s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ Com base na minha pesquisa detalhada, apresento as **melhores cafeterias de Madrid avaliadas pela qualidade do │
│ café servido**: │
│ │
│ ## 🏆 TOP CAFETERIAS DE ESPECIALIDADE EM MADRID │
│ │
│ ### **1. HOLA COFFEE LAGASCA** ⭐ Destaque Internacional │
│ - **Reconhecimento:** 12º lugar no ranking mundial "The World's 100 Best Coffee Shops 2025" - a melhor │
│ cafeteria de Madrid e uma das 4 espanholas no ranking global │
│ - **Qualidade:** Possuem sua própria torrefação (Hola Coffee Roastery), garantindo máximo frescor dos grãos │
│ - **Reputação:** Reconhecimento internacional por qualidade excepcional do café │
│ - **Localização:** Calle Lagasca, Madrid │
│ │
│ ### **2. NAJI SPECIALTY COFFEE** │
│ - **Avaliações:** 94% de recomendação dos clientes │
│ - **Grãos:** Seleção de origem única provenientes de micro-lotes de países como **Etiópia, Colômbia e Brasil** │
│ - **Torra:** Especializado em torra leve (light roast), que preserva melhor os sabores originais dos grãos │
│ - **Métodos de preparo:** V60, Chemex, Aeropress e espresso │
│ - **Preço médio:** €2,80 - €4,50 │
│ - **Destaque:** Famoso pelo seu pistachio latte, preparado com técnica especial │
...
│ grãos │
│ 3. **HanSo Café** - pela consistência e volume positivo de avaliações │
│ │
│ **Dica:** Visite durante a manhã para experimentar os grãos mais frescos e pedir aos baristas recomendações │
│ sobre os lotes da semana. Muitas dessas cafeterias oferecem diferentes origens e métodos de preparo, permitindo │
│ explorar perfis de sabor variados. │
│ │
│ Todas as fontes consultadas foram em espanhol e incluíram rankings especializados, plataformas de avaliação │
│ (TripAdvisor, Facebook) e sites especializados em café de especialidade. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────── 🔧 Researcher Agent - Should compress research ─────────────────────────────────╮
│ No tool calls found. Stopping research and compressing findings... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Compressing Research:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 34.6s
>_ Output
			
╭─────────────────────────────────── 🤖 Researcher Agent - Compressed Research ───────────────────────────────────╮
│ **Lista de consultas e chamadas a ferramentas realizadas** │
│ │
│ 1. Pesquisa: "mejores cafeterías Madrid calidad café especial granos métodos preparación" │
│ 2. Pesquisa: "specialty coffee Madrid baristas mejor café artesanal reseñas" │
│ 3. Pesquisa: "HanSo Café Toma Café Madrid opiniones reseñas calidad café TripAdvisor Google" │
│ 4. Pesquisa: "Naji Specialty Coffee Geisha Coffee Madrid valoraciones clientes sabor aroma" │
│ 5. Pesquisa: ""Hola Coffee" "Misión Café" "Pink Bourbon" Madrid specialty coffee opiniones calidad │
│ granos" │
│ 6. Pesquisa: "mejores cafeterías especialidad Madrid 2024 2025 ranking guía opiniones baristas tostadores" │
│ 7. Pesquisa: ""Toma Café" Madrid especialidad información granos métodos preparación valoración sitio │
│ oficial" │
│ │
│ --- │
│ │
│ **Resultados completos** │
│ │
│ --- │
│ │
│ **SOURCE 1: https://myspecialtycoffee.es/madrid/** │
...
│ https://guiadelocio.es/madrid/plan/naji-specialty-coffee-cafe-de-pistacho-mas-famoso-de-madrid/ │
│ [11] Naji Specialty Coffee | Café De Especialidad: https://www.cafesdespecialidad.com/naji-specialty-coffee/ │
│ [12] Las Mejores Tostadoras de Café en Madrid | Lista del TOP10: │
│ https://losmejoresdemadrid.com/tostadoras-cafe/ │
│ [13] Estas son las 100 mejores cafeterías del mundo 2025 - Hule y Mantel: │
│ https://www.huleymantel.com/menu-dia/estas-son-100-mejores-cafeterias-mundo-2025-madrid-barcelona-malaga-estan- │
│ en-lista_102683_102.html │
│ [14] Las mejores cafeterías de especialidad de España en 2025: │
│ https://www.gastronomistas.com/las-mejores-cafeterias-de-especialidad-de-espana-en-2025/ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

Como podemos ver, o agente Researcher usou várias vezes a ferramenta tavily_search para obter informações da internet e a ferramenta think_tool para refletir sobre as informações que possui. Por fim, ele compactou as informações.

Supervisor de pesquisalink image 135

Vamos relembrar como seria a arquitetura do nosso deep researcher.

deep researcher architecture

Já definimos o Scope e o Researcher, agora vamos definir o Research supervisor, que é responsável por atribuir pesquisas a diferentes Researchers.

Sugestões para supervisores de pesquisalink image 136

Neste caso, definimos apenas um prompt no qual se diz ao LLM

  • É um supervisor de pesquisa
  • Tem acesso a três ferramentas, uma para delegar a pesquisa, outra para indicar que a pesquisa está concluída e outra para reflexão e planejamento estratégico durante a pesquisa
  • É indicado que deve usar a ferramenta de reflexão antes de usar a ferramenta que conclui se a pesquisa está terminada ou não
  • É-lhe indicado que, quando precisar realizar várias pesquisas, utilize a ferramenta de pesquisa em paralelo, em vez de realizar as pesquisas uma após a outra
  • É informado de que possui um número máximo de pesquisas que pode realizar
	
< > Input
Python
lead_researcher_prompt = """Você é um supervisor de pesquisa. Seu trabalho é realizar pesquisas chamando a ferramenta “ConductResearch”. Para contextualizar, a data de hoje é {date}.
&lt;Task&gt;
Seu objetivo é chamar a ferramenta “ConductResearch” para realizar uma pesquisa sobre a questão geral de pesquisa levantada pelo usuário.
Quando estiver totalmente satisfeito com os resultados da pesquisa retornados pelas chamadas à ferramenta, você deve chamar a ferramenta “ResearchComplete” para indicar que concluiu sua pesquisa.
&lt;/Task&gt;
&lt;Available Tools&gt;
Você tem acesso a três ferramentas principais:
1. **ConductResearch**: Delega as tarefas de pesquisa a subagentes especializados.
2. **ResearchComplete**: Indica que a pesquisa está concluída.
3. **think_tool**: Para reflexão e planejamento estratégico durante a pesquisa.
**CRÍTICO: Use think_tool antes de chamar ConductResearch para planejar sua abordagem e após cada ConductResearch para avaliar o progresso**.
**CRÍTICO: Você deve sempre fornecer o parâmetro ‘reflection’ com conteúdo detalhado ao chamar o think_tool. Nunca chame essa ferramenta sem argumentos**.
**PESQUISA PARALELA**: Ao identificar vários subtemas independentes que podem ser explorados simultaneamente, faça várias chamadas para a ferramenta ConductResearch em uma única resposta para permitir a execução da pesquisa em paralelo. Isso é mais eficiente do que a pesquisa sequencial para perguntas comparativas ou multifacetadas. Use no máximo {max_concurrent_research_units} agentes paralelos por iteração.
&lt;/Available Tools&gt;
&lt;Instructions&gt;
Pense como um diretor de pesquisa com tempo e recursos limitados. Siga estas etapas:
1. **Leia a pergunta com atenção**: quais informações específicas o usuário precisa?
2. **Decida como delegar a pesquisa**: considere cuidadosamente a pergunta e decida como delegar a pesquisa. Existem várias direções independentes que podem ser exploradas simultaneamente?
3. **Após cada chamada para ConductResearch, faça uma pausa e avalie**: tenho o suficiente para responder? O que ainda falta?
&lt;/Instructions&gt;
&lt;Hard Limits&gt;
**Orçamentos para delegação de tarefas** (evite delegação excessiva):
- **Preferência por um único agente**: use um único agente por simplicidade, a menos que a solicitação do usuário tenha uma clara oportunidade de paralelização.
- **Pare quando puder responder com confiança**: não continue delegando a pesquisa em busca da perfeição.
- **Limite as chamadas às ferramentas**: pare sempre após {max_researcher_iterations} chamadas às ferramentas think_tool e ConductResearch se não conseguir encontrar as fontes adequadas.
&lt;/Hard Limits&gt;
&lt;Show Your Thinking&gt;
Antes de chamar a ferramenta ConductResearch, use a think_tool para planejar sua abordagem:
- A tarefa pode ser dividida em subtarefas menores?
Após cada chamada à ferramenta ConductResearch, use a think_tool para analisar os resultados:
- Que informações importantes encontrei?
- O que está faltando?
- Tenho o suficiente para responder à pergunta de forma exaustiva?
- Devo delegar mais pesquisa ou chamar a ResearchComplete?
&lt;/Show Your Thinking&gt;
&lt;Scaling Rules&gt;
**A pesquisa de fatos simples, listas e classificações** pode usar um único subagente:
- *Exemplo*: Liste as 10 melhores cafeterias de São Francisco → Use 1 subagente
**As comparações apresentadas na solicitação do usuário** podem usar um subagente para cada elemento da comparação:
- *Exemplo*: Compare as abordagens da OpenAI, Anthropic e DeepMind sobre a segurança da IA → Use 3 subagentes
- Delegue subtemas claros, distintos e não sobrepostos
**Lembretes importantes:**
- Cada chamada para o ConductResearch gera um agente de pesquisa dedicado para esse tópico específico.
- Um agente separado redigirá o relatório final; você só precisa coletar informações.
- Ao chamar ConductResearch, forneça instruções completas e independentes; os subagentes não podem ver o trabalho de outros agentes.
- NÃO use acrônimos ou abreviações em suas perguntas de pesquisa, seja muito claro e específico.
&lt;/Scaling Rules&gt;"""
Copied

Estado do orientador de pesquisalink image 137

Definimos o estado do supervisor de pesquisa. Neste caso, vamos ter apenas um estado, não vamos ter um estado de entrada e outro de saída como nos casos anteriores, por isso vai ser mais simples.

	
< > Input
Python
from typing_extensions import Annotated, TypedDict, Sequence
from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messages
import operator
class SupervisorState(TypedDict):
"""
State for the multi-agent research supervisor.
Manages coordination between supervisor and research agents, tracking
research progress and accumulating findings from multiple sub-agents.
"""
# Messages exchanged with supervisor for coordination and decision-making
supervisor_messages: Annotated[Sequence[BaseMessage], add_messages]
# Detailed research brief that guides the overall research direction
research_brief: str
# Processed and structured notes ready for final report generation
notes: Annotated[list[str], operator.add] = []
# Counter tracking the number of research iterations performed
research_iterations: int = 0
# Raw unprocessed research notes collected from sub-agent research
raw_notes: Annotated[list[str], operator.add] = []
Copied

Ferramentas do supervisor de pesquisalink image 138

Como dissemos, as tools são as ferramentas que o LLM vai decidir quando e como usar, então vamos defini-las

Ferramenta de pesquisalink image 139

Começamos com uma ferramenta para que o supervisor de pesquisa possa delegar a pesquisa a um Researcher

	
< > Input
Python
from langchain_core.tools import tool
from pydantic import BaseModel, Field
@tool
class ConductResearch(BaseModel):
"""Tool for delegating a research task to a specialized sub-agent."""
research_topic: str = Field(
description="The topic to research. Should be a single topic, and should be described in high detail (at least a paragraph).",
)
Copied

Pode-se ver que esta ferramenta não faz nada; mais adiante explicaremos o porquê.

Ferramenta de conclusão de pesquisalink image 140

Quando o agente considerar que já possui informações suficientes para responder à pergunta de pesquisa geral, pode usar esta ferramenta para indicar que a pesquisa está concluída

	
< > Input
Python
@tool
class ResearchComplete(BaseModel):
"""Tool for indicating that the research process is complete."""
pass
Copied

Esta ferramenta também não faz nada, mais adiante explicaremos por quê.

Modelo de linguagem do supervisor de pesquisalink image 141

Aqui vamos ter somente um modelo de linguagem

	
< > Input
Python
from langchain.chat_models import init_chat_model
SUPERVISOR_MODEL_NAME = "anthropic:claude-sonnet-4-5-20250929"
SUPERVISOR_MODEL_MAX_TOKENS = 4096
supervisor_model = init_chat_model(
model=SUPERVISOR_MODEL_NAME,
max_tokens=SUPERVISOR_MODEL_MAX_TOKENS
)
Copied

Uma vez que temos o modelo de linguagem, damos acesso às tools que acabamos de definir e à tool think_tool que definimos no Researcher

	
< > Input
Python
supervisor_tools = [ConductResearch, ResearchComplete, think_tool]
supervisor_model_with_tools = supervisor_model.bind_tools(supervisor_tools)
Copied

Podemos ver que na lista de ferramentas estão as duas que definimos como ferramentas do supervisor (ConductResearch e ResearchComplete) e a ferramenta think_tool que definimos no Researcher. Assim, quando invocarmos o modelo de linguagem, ele poderá decidir usar uma dessas três ferramentas.

Configuração da pesquisalink image 142

Vamos definir o número máximo de pesquisas que o supervisor pode solicitar ao Researcher

	
< > Input
Python
max_researcher_iterations = 6
Copied

Agora definimos o número máximo de pesquisas que podem ser realizadas em paralelo

	
< > Input
Python
max_concurrent_researchers = 3
Copied

Funções do supervisor de pesquisalink image 143

Definimos as ferramentas, que são as funções que o LLM vai decidir quando e como usar, mas agora vamos definir as funções que nós vamos determinar por código quando e como serão executadas.

Começamos com a função responsável por coordenar as investigações

  • Pegue a variável supervisor_messages do estado
  • Crie o prompt de sistema do LLM hidratando-o com a data atual, o número máximo de pesquisas que podem ser realizadas em paralelo e o número máximo de iterações que podem ser realizadas
  • Criamos a mensagem com a qual invocamos o modelo de linguagem com o system prompt e o conteúdo de supervisor_messages
  • Chame o modelo de linguagem com a mensagem que construímos
  • Como no prompt do supervisor dissemos para ele chamar uma das três tools, o modelo de linguagem vai devolver uma das três tools
  • Passe o fluxo do agente para o nó supervisor_tools que definiremos depois. Nesse nó, será verificado qual ferramenta foi retornada pelo modelo de linguagem e será executada a lógica dessa ferramenta.
	
< > Input
Python
from langgraph.types import Command
from typing_extensions import Literal
async def supervisor(state: SupervisorState) -&gt; Command[Literal["supervisor_tools"]]:
"""Coordinate research activities.
Analyzes the research brief and current progress to decide:
- What research topics need investigation
- Whether to conduct parallel research
- When research is complete
Args:
state: Current supervisor state with messages and research progress
Returns:
Command to proceed to supervisor_tools node with updated state
"""
try:
supervisor_messages = state.get("supervisor_messages", [])
# Prepare system message with current date and constraints
system_message = lead_researcher_prompt.format(
date=get_today_str(),
max_concurrent_research_units=max_concurrent_researchers,
max_researcher_iterations=max_researcher_iterations
)
messages = [SystemMessage(content=system_message)] + supervisor_messages
# Make decision about next research steps
print("⏳ Supervisor agent:")
with alive_bar(monitor=False, stats=False, title="", spinner='dots_waves', bar='blocks') as bar:
response = await supervisor_model_with_tools.ainvoke(messages)
bar()
# Format and display the supervisor messages
if response.tool_calls is not None:
response_tool_calls_name = response.tool_calls[0].get('name')
if response_tool_calls_name == "think_tool":
title = "Supervisor Agent tools - Call to think tool"
elif response_tool_calls_name == "ConductResearch":
title = "Supervisor Agent tools - Call to Conduct Research"
else:
title = "Supervisor Agent tools - Tool Calls"
format_messages([response], title=title)
else:
format_messages([response], title="Supervisor Agent")
# Increment research iterations if conduct research tool call is present
research_iterations = state.get("research_iterations", 0)
if response.tool_calls is not None:
response_tool_calls_name = response.tool_calls[0].get('name')
if response_tool_calls_name == "ConductResearch":
research_iterations += 1
return Command(
goto="supervisor_tools",
update={
"supervisor_messages": [response],
"research_iterations": state.get("research_iterations", 0) + 1
}
)
except Exception as e:
# Get the traceback information
exc_type, exc_obj, exc_tb = sys.exc_info()
line_number = exc_tb.tb_lineno
# Print detailed error information
print(f" ❌ Error in supervisor function:")
print(f" Line number: {line_number}")
print(f" Error type: {type(e).__name__}")
print(f" Error message: {str(e)}")
print(f" Full traceback:")
traceback.print_exc()
# Re-raise the exception to let the caller handle it
raise
Copied

Agora definimos uma função que obtém as notas internas do modelo de linguagem quando infere qual ferramenta usar

	
< > Input
Python
def get_notes_from_tool_calls(messages: list[BaseMessage]) -&gt; list[str]:
"""Extract research notes from ToolMessage objects in supervisor message history.
This function retrieves the compressed research findings that sub-agents
return as ToolMessage content. When the supervisor delegates research to
sub-agents via ConductResearch tool calls, each sub-agent returns its
compressed findings as the content of a ToolMessage. This function
extracts all such ToolMessage content to compile the final research notes.
Args:
messages: List of messages from supervisor's conversation history
Returns:
List of research note strings extracted from ToolMessage objects
"""
try:
return [tool_msg.content for tool_msg in filter_messages(messages, include_types="tool")]
except Exception as e:
# Get the traceback information
exc_type, exc_obj, exc_tb = sys.exc_info()
line_number = exc_tb.tb_lineno
# Print detailed error information
print(f" ❌ Error in get_notes_from_tool_calls function:")
print(f" Line number: {line_number}")
print(f" Error type: {type(e).__name__}")
print(f" Error message: {str(e)}")
print(f" Full traceback:")
traceback.print_exc()
# Re-raise the exception to let the caller handle it
raise
Copied

Por fim, definimos a função que se encarrega de executar a ferramenta que o modelo de linguagem decidiu usar

  • Obtém-se do estado as variáveis supervisor_messages, com o histórico da conversa do agente supervisor, research_iterations, com o número de iterações realizadas, e most_recent_message, com a última mensagem da conversa do agente supervisor
  • Verifica-se se o número máximo de iterações foi excedido
  • Verifica-se se a última mensagem contém chamadas de ferramentas
  • Verifica-se se a última mensagem contém a ferramenta ResearchComplete
  • No caso de que o número máximo de iterações tenha sido excedido ou a última mensagem contenha a tool ResearchComplete ou a última mensagem não contenha chamadas de ferramentas, passa-se para o nó END e o fluxo do agente supervisor é finalizado
  • Caso contrário, a ferramenta que o modelo de linguagem decidiu usar é executada
  • São coletadas as chamadas de ferramenta do tipo think_tool e as ConductResearch da última mensagem do histórico da conversa do agente supervisor
  • São executadas as chamadas de ferramenta do tipo think_tool que foram coletadas. Elas são executadas invocando a ferramenta think_tool
    • O paralelismo é lançado para executar de forma assíncrona as ConductResearch que foram coletadas. Ele é executado invocando o agente Researcher
    • São coletados os resultados das ConductResearch que foram executadas
    • São coletadas as notas das ConductResearch que foram executadas
	
< > Input
Python
async def supervisor_tools(state: SupervisorState) -&gt; Command[Literal["supervisor", "__end__"]]:
"""Execute supervisor decisions - either conduct research or end the process.
Handles:
- Executing think_tool calls for strategic reflection
- Launching parallel research agents for different topics
- Aggregating research results
- Determining when research is complete
Args:
state: Current supervisor state with messages and iteration count
Returns:
Command to continue supervision, end process, or handle errors
"""
try:
supervisor_messages = state.get("supervisor_messages", [])
research_iterations = state.get("research_iterations", 0)
most_recent_message = supervisor_messages[-1]
# Create a System message to show supervisor messages and research iterations
system_message = SystemMessage(
content=f"Research iterations: {research_iterations}"
)
format_messages([system_message], title="Supervisor Agent tools - Research iterations")
# Initialize variables for single return pattern
tool_messages = []
all_raw_notes = []
next_step = "supervisor" # Default next step
should_end = False
# Check exit criteria first
exceeded_iterations = research_iterations &gt;= max_researcher_iterations
no_tool_calls = not most_recent_message.tool_calls
research_complete = any(
tool_call["name"] == "ResearchComplete"
for tool_call in most_recent_message.tool_calls
)
if exceeded_iterations or no_tool_calls or research_complete:
# Create a System message to show the decision
system_message = SystemMessage(
content=f"Exceeded iterations or no tool calls or research complete. Ending supervisor... Research iterations: {research_iterations} and supervisor messages: {supervisor_messages}"
)
termination_message_info = ""
if exceeded_iterations:
termination_message_info += f" Exceeded iterations"
if no_tool_calls:
termination_message_info += f" No tool calls"
if research_complete:
termination_message_info += f" Research complete"
format_messages([system_message], title=termination_message_info)
should_end = True
next_step = END
else:
# Execute ALL tool calls before deciding next step
try:
# Separate think_tool calls from ConductResearch calls
think_tool_calls = [
tool_call for tool_call in most_recent_message.tool_calls if tool_call["name"] == "think_tool"
]
conduct_research_calls = [
tool_call for tool_call in most_recent_message.tool_calls if tool_call["name"] == "ConductResearch"
]
# Handle think_tool calls (synchronous)
for tool_call in think_tool_calls:
observation = think_tool.invoke(tool_call["args"])
tool_message = ToolMessage(
content=observation,
name=tool_call["name"],
tool_call_id=tool_call["id"]
)
format_messages([tool_message], title="Supervisor Agent - think tool result")
tool_messages.append(tool_message)
# Handle ConductResearch calls (asynchronous)
if conduct_research_calls:
# Launch parallel research agents
coros = [
researcher_agent.ainvoke({
"researcher_messages": [
HumanMessage(content=tool_call["args"]["research_topic"])
],
"research_topic": tool_call["args"]["research_topic"]
})
for tool_call in conduct_research_calls
]
# Wait for all research to complete
tool_results = await asyncio.gather(*coros)
# Format research results as tool messages
# Each sub-agent returns compressed research findings in result["compressed_research"]
# We write this compressed research as the content of a ToolMessage, which allows
# the supervisor to later retrieve these findings via get_notes_from_tool_calls()
research_tool_messages = [
ToolMessage(
content=result.get("compressed_research", "Error synthesizing research report"),
name=tool_call["name"],
tool_call_id=tool_call["id"]
) for result, tool_call in zip(tool_results, conduct_research_calls)
]
tool_messages.extend(research_tool_messages)
# Aggregate raw notes from all research
all_raw_notes = [
" ".join(result.get("raw_notes", [])) for result in tool_results
]
except Exception as e:
# Get the traceback information for inner exception
exc_type, exc_obj, exc_tb = sys.exc_info()
line_number = exc_tb.tb_lineno
# Print detailed error information
print(f" ❌ Error executing tool calls in supervisor_tools function:")
print(f" Line number: {line_number}")
print(f" Error type: {type(e).__name__}")
print(f" Error message: {str(e)}")
print(f" Full traceback:")
traceback.print_exc()
should_end = True
next_step = END
# Single return point with appropriate state updates
if should_end:
return Command(
goto=next_step,
update={
"notes": get_notes_from_tool_calls(supervisor_messages),
"research_brief": state.get("research_brief", "")
}
)
else:
return Command(
goto=next_step,
update={
"supervisor_messages": tool_messages,
"raw_notes": all_raw_notes
}
)
except Exception as e:
# Get the traceback information for outer exception
exc_type, exc_obj, exc_tb = sys.exc_info()
line_number = exc_tb.tb_lineno
# Print detailed error information
print(f" ❌ Error in supervisor_tools function:")
print(f" Line number: {line_number}")
print(f" Error type: {type(e).__name__}")
print(f" Error message: {str(e)}")
print(f" Full traceback:")
traceback.print_exc()
# Re-raise the exception to let the caller handle it
raise
Copied

Agora que definimos as funções, podemos explicar por que as ferramentas que havíamos definido para o agente supervisor não fazem nada.

O modelo de linguagem do agente supervisor tem uma ferramenta para refletir, mas não tem uma ferramenta para invocar o agente Researcher. Porque, como o próprio nome indica, o agente Researcher é um agente, não uma ferramenta, portanto não pode ser invocado como uma ferramenta.

Por isso, quando o modelo de linguagem é invocado na função supervisor, é informado que deve usar uma das três tools, para que na última mensagem esteja a tool que deve ser executada.

Com essa informação, na função supervisor_tools é obtido o nome da tool, de forma que

  • Se o modelo de linguagem decidir usar a tool think_tool, a tool think_tool será executada
  • Se o modelo de linguagem decidir usar a ferramenta ConductResearch, o agente Researcher será executado
  • Se o modelo de linguagem decidir usar a tool ResearchComplete, passa para o nó END e encerra o fluxo do agente supervisor

Grafo do supervisor de pesquisalink image 144

Criamos o grafo do supervisor de pesquisa

	
< > Input
Python
from langgraph.graph import StateGraph
supervisor_builder = StateGraph(SupervisorState)
Copied

Criamos os nós do grafo com as funções que definimos

	
< > Input
Python
supervisor_builder.add_node("supervisor", supervisor)
supervisor_builder.add_node("supervisor_tools", supervisor_tools)
Copied
>_ Output
			
&lt;langgraph.graph.state.StateGraph at 0x111faffb0&gt;

Adicionamos as edges do grafo

  • O fluxo começa no nó supervisor
  • Na função supervisor indica-se que o próximo nó a ser executado é supervisor_tools
  • Na função supervisor_tools indica-se que o próximo nó a ser executado é supervisor se não tiver sido excedido o número máximo de iterações ou a última mensagem não contiver a ferramenta ResearchComplete ou a última mensagem contiver chamadas de ferramentas, caso contrário, executa-se o nó END
	
< > Input
Python
from langgraph.graph import START, END
supervisor_builder.add_edge(START, "supervisor")
Copied
>_ Output
			
&lt;langgraph.graph.state.StateGraph at 0x111faffb0&gt;

Nós o compilamos e o mostramos

	
< > Input
Python
from langgraph.checkpoint.memory import InMemorySaver
from IPython.display import Image, display
checkpointer = InMemorySaver()
supervisor_agent = supervisor_builder.compile(checkpointer=checkpointer)
# Visualize the workflow
display(Image(supervisor_agent.get_graph(xray=True).draw_mermaid_png()))
Copied
>_ Output
			
&lt;IPython.core.display.Image object&gt;

Execução do grafo do supervisor de pesquisalink image 145

Primeiro vamos chamar o agente Scope para que nos ajude a definir o research_brief

Criamos uma thread para poder fazer várias chamadas ao agente, caso ele nos peça mais informações.

	
< > Input
Python
thread = {"configurable": {"thread_id": "3"}}
user_message = "Quero pesquisar os melhores cafés de Madrid.."
result = await scope_agent.ainvoke({"messages": [HumanMessage(content=f"{user_message}.")]}, config=thread)
Copied
>_ Output
			
⏳ Scope agent:
>_ Output
			
╭───────────────────────────────────────────── 🧑 Real Human Message ─────────────────────────────────────────────╮
│ Quero pesquisar os melhores cafés de Madrid... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 1.8s
>_ Output
			
╭─────────────────────────────────── 🤖 Scope Assistant - need clarification? ────────────────────────────────────╮
│ need_clarification=True question='Você está procurando cafés para trabalhar, para lazer, ou com algum critério │
│ específico (por exemplo, cafés com wi-fi, ambiente tranquilo, cafés tradicionais, etc.)?' verification='' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────────────────── 🔧 Scope System Message ────────────────────────────────────────────╮
│ Necesita aclaración por parte del usuario. Enviando pregunta aclaratoria... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

O agente nos pede mais informações, por isso invocamos o agente novamente com as informações que ele solicita.

	
< > Input
Python
user_message = "Examine a qualidade do café para avaliar as melhores cafeterias de Madri.."
result = await scope_agent.ainvoke({"messages": [HumanMessage(content=f"{user_message}.")]}, config=thread)
Copied
>_ Output
			
⏳ Scope agent:
>_ Output
			
╭───────────────────────────────────────────── 🧑 Real Human Message ─────────────────────────────────────────────╮
│ Examine a qualidade do café para avaliar as melhores cafeterias de Madri... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 1.1s
>_ Output
			
╭─────────────────────────────────── 🤖 Scope Assistant - need clarification? ────────────────────────────────────╮
│ need_clarification=False question='' verification='Você forneceu informações suficientes para iniciar a │
│ investigação. Entendi que deseja um relatório avaliando as melhores cafeterias de Madri com base na qualidade │
│ do café servido. Iniciarei agora a pesquisa considerando esse critério principal.' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────────────────── 🔧 Scope System Message ────────────────────────────────────────────╮
│ No necesita aclaración por parte del usuario. Enviando mensaje de verificación... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Scope agent - Write research brief:
>_ Output
			
╭─────────────────────────────────── 🤖 Scope Assistant - Write research brief ───────────────────────────────────╮
│ Você forneceu informações suficientes para iniciar a investigação. Entendi que deseja um relatório avaliando as │
│ melhores cafeterias de Madri com base na qualidade do café servido. Iniciarei agora a pesquisa considerando │
│ esse critério principal. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 4.7s
>_ Output
			
╭───────────────────────────────── 🤖 Scope Assistant - Research brief generated ─────────────────────────────────╮
│ research_brief='Quero identificar as melhores cafeterias de Madri avaliando especificamente a qualidade do café │
│ servido. Para isso, desejo que a pesquisa considere critérios como sabor, aroma, frescor dos grãos, métodos de │
│ preparo e reputação do estabelecimento em relação à qualidade do café. Não especifiquei preferências quanto a │
│ preço, localização, ambiente, wi-fi ou outros serviços, portanto, esses aspectos podem ser considerados │
│ secundários ou flexíveis. Priorize fontes oficiais das cafeterias, avaliações de clientes em plataformas │
│ confiáveis (como Google Maps, TripAdvisor ou sites especializados em café) e publicações em espanhol, sempre │
│ que possível. O foco principal deve ser a excelência do café servido, conforme avaliado por especialistas e │
│ consumidores.' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

Já temos o research_brief, portanto podemos invocar o agente Research supervisor para que inicie a pesquisa.

IMPORTANTE: Neste caso, o que fazemos é invocar o agente Research supervisor com o research_brief que já temos. Para isso, passamos como a variável de estado supervisor_messages e como a variável de estado research_brief.

Também criamos um cliente da API da Tavily para poder fazer buscas na internet.

	
< > Input
Python
from tavily import TavilyClient
import asyncio
research_brief = result["research_brief"]
tavily_client = TavilyClient(api_key=os.getenv("TAVILY_API_KEY"))
result = await supervisor_agent.ainvoke({"supervisor_messages": [HumanMessage(content=f"{research_brief}.")], "research_brief": research_brief}, config=thread)
Copied
>_ Output
			
⏳ Supervisor agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 8.9s
>_ Output
			
╭──────────────────────────────── 🤖 Supervisor Agent tools - Call to think tool ─────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": " Analisando a solicitação do usuário: **Objetivo principal**: Identificar as melhores │
│ cafeterias de Madri com foco específico na qualidade do café servido. **Critérios prioritários:** - Sabor │
│ do café - Aroma - Frescor dos grãos - Métodos de preparo - Reputação em relação à qualidade do │
│ café **Critérios secundários/flexíveis:** - Preço - Localização - Ambiente - Wi-fi e outros │
│ serviços **Fontes preferenciais:** - Sites oficiais das cafeterias - Avaliações em Google Maps - │
│ Avaliações em TripAdvisor - Sites especializados em café - Publicações em espanhol - Opiniões de │
│ especialistas e consumidores **Abordagem de pesquisa:** Esta é uma pesquisa focada em um único tema │
│ específico - cafeterias de qualidade em Madri. Não há múltiplas direções independentes para paralelizar. A │
│ pesquisa deve ser abrangente e cobrir: 1. Rankings e listas de melhores cafeterias especializadas 2. │
│ Avaliações de especialistas em café 3. Opiniões de consumidores nas plataformas mencionadas 4. Informações │
│ sobre métodos de preparo e qualidade dos grãos **Decisão**: Vou usar um único agente de pesquisa com │
│ instruções detalhadas e abrangentes para cobrir todos os aspectos solicitados de forma eficiente. " │
│ } │
│ ID: toolu_019J5VvgyE3ikCL6jKNYeH2m │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────── 🔧 Supervisor Agent tools - Research iterations ────────────────────────────────╮
│ Research iterations: 1 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────────── 🔧 Supervisor Agent - think tool result ────────────────────────────────────╮
│ Reflection recorded: │
│ Analisando a solicitação do usuário: │
│ │
│ **Objetivo principal**: Identificar as melhores cafeterias de Madri com foco específico na qualidade do café │
│ servido. │
│ │
│ **Critérios prioritários:** │
│ - Sabor do café │
│ - Aroma │
│ - Frescor dos grãos │
│ - Métodos de preparo │
│ - Reputação em relação à qualidade do café │
│ │
│ **Critérios secundários/flexíveis:** │
│ - Preço │
│ - Localização │
│ - Ambiente │
│ - Wi-fi e outros serviços │
│ │
│ **Fontes preferenciais:** │
│ - Sites oficiais das cafeterias │
│ - Avaliações em Google Maps │
│ - Avaliações em TripAdvisor │
│ - Sites especializados em café │
│ - Publicações em espanhol │
│ - Opiniões de especialistas e consumidores │
│ │
│ **Abordagem de pesquisa:** │
│ Esta é uma pesquisa focada em um único tema específico - cafeterias de qualidade em Madri. Não há múltiplas │
│ direções independentes para paralelizar. A pesquisa deve ser abrangente e cobrir: │
│ 1. Rankings e listas de melhores cafeterias especializadas │
│ 2. Avaliações de especialistas em café │
│ 3. Opiniões de consumidores nas plataformas mencionadas │
│ 4. Informações sobre métodos de preparo e qualidade dos grãos │
│ │
│ **Decisão**: Vou usar um único agente de pesquisa com instruções detalhadas e abrangentes para cobrir todos os │
│ aspectos solicitados de forma eficiente. │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Supervisor agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 11.2s
>_ Output
			
╭───────────────────────────── 🤖 Supervisor Agent tools - Call to Conduct Research ──────────────────────────────╮
│ │
│ 🔧 Tool Call: ConductResearch │
│ Args: { │
│ "research_topic": "Identifique as melhores cafeterias de Madri, Espanha, com foco específico na │
│ qualidade do café servido. A pesquisa deve avaliar e priorizar os seguintes critérios relacionados à excelência │
│ do café: CRITÉRIOS PRIORITÁRIOS: - Sabor e qualidade sensorial do café - Aroma do café servido - Frescor │
│ dos grãos de café utilizados - Métodos de preparo (espresso, pour over, V60, chemex, aeropress, etc.) - │
│ Reputação do estabelecimento especificamente em relação à qualidade do café - Origem dos grãos de café (se │
│ trabalham com cafés especiais, single origin, etc.) - Expertise dos baristas FONTES A CONSULTAR: - │
│ Websites oficiais das cafeterias de especialidade em Madri - Avaliações em Google Maps (foco em comentários │
│ sobre qualidade do café) - Avaliações em TripAdvisor (foco em comentários sobre qualidade do café) - Sites │
│ especializados em café (coffee blogs, guias de café de especialidade) - Publicações e blogs em espanhol sobre │
│ cultura do café em Madri - Rankings e premiações de cafeterias especializadas - Opiniões de especialistas em │
│ café e baristas INFORMAÇÕES A COLETAR PARA CADA CAFETERIA: - Nome do estabelecimento - Breve descrição do │
│ foco em café de qualidade - Métodos de preparo oferecidos - Tipos de grãos utilizados (origem, torrefação │
│ própria, etc.) - Avaliações específicas sobre qualidade do café (com citações quando possível) - Pontos │
│ fortes em relação à qualidade do café segundo especialistas e clientes - Links para fontes e websites │
│ oficiais Priorize cafeterias reconhecidas por sua excelência em café de especialidade (specialty coffee) e │
│ que sejam altamente avaliadas especificamente pela qualidade do café, não apenas por ambiente ou serviço. O │
│ objetivo é criar uma lista das melhores opções para quem busca café de alta qualidade em Madri." │
│ } │
│ ID: toolu_016ttbDsVfmwEtZHTxPEdhd4 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────── 🔧 Supervisor Agent tools - Research iterations ────────────────────────────────╮
│ Research iterations: 2 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
>_ Output
			
╭───────────────────────────────── 🧑 Researcher Agent - Simulated Human Message ─────────────────────────────────╮
│ Identifique as melhores cafeterias de Madri, Espanha, com foco específico na qualidade do café servido. A │
│ pesquisa deve avaliar e priorizar os seguintes critérios relacionados à excelência do café: │
│ │
│ CRITÉRIOS PRIORITÁRIOS: │
│ - Sabor e qualidade sensorial do café │
│ - Aroma do café servido │
│ - Frescor dos grãos de café utilizados │
│ - Métodos de preparo (espresso, pour over, V60, chemex, aeropress, etc.) │
│ - Reputação do estabelecimento especificamente em relação à qualidade do café │
│ - Origem dos grãos de café (se trabalham com cafés especiais, single origin, etc.) │
│ - Expertise dos baristas │
│ │
│ FONTES A CONSULTAR: │
│ - Websites oficiais das cafeterias de especialidade em Madri │
│ - Avaliações em Google Maps (foco em comentários sobre qualidade do café) │
│ - Avaliações em TripAdvisor (foco em comentários sobre qualidade do café) │
│ - Sites especializados em café (coffee blogs, guias de café de especialidade) │
│ - Publicações e blogs em espanhol sobre cultura do café em Madri │
│ - Rankings e premiações de cafeterias especializadas │
│ - Opiniões de especialistas em café e baristas │
│ │
│ INFORMAÇÕES A COLETAR PARA CADA CAFETERIA: │
│ - Nome do estabelecimento │
│ - Breve descrição do foco em café de qualidade │
│ - Métodos de preparo oferecidos │
│ - Tipos de grãos utilizados (origem, torrefação própria, etc.) │
│ - Avaliações específicas sobre qualidade do café (com citações quando possível) │
│ - Pontos fortes em relação à qualidade do café segundo especialistas e clientes │
│ - Links para fontes e websites oficiais │
│ │
│ Priorize cafeterias reconhecidas por sua excelência em café de especialidade (specialty coffee) e que sejam │
│ altamente avaliadas especificamente pela qualidade do café, não apenas por ambiente ou serviço. O objetivo é │
│ criar uma lista das melhores opções para quem busca café de alta qualidade em Madri. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 4.5s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ Vou realizar uma pesquisa abrangente sobre as melhores cafeterias de café de especialidade em Madri, focando │
│ nos critérios que você especificou. Começarei com buscas amplas e depois aprofundarei conforme necessário. │
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "best specialty coffee shops Madrid Spain 2024 high quality beans baristas" │
│ } │
│ ID: toolu_019CKoDi4bRTdTo5fB4us8sb │
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "mejores cafeterías café especialidad Madrid especialista granos tostado" │
│ } │
│ ID: toolu_011ZBX6Lgr7m5r3pRsTATL2H │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: tavily_search │
│ ID: toolu_019CKoDi4bRTdTo5fB4us8sb │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "best specialty coffee shops Madrid Spain 2024 high quality beans baristas" │
│ } │
│ │
│ Tool Call 2: │
│ Name: tavily_search │
│ ID: toolu_011ZBX6Lgr7m5r3pRsTATL2H │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "mejores cafeterías café especialidad Madrid especialista granos tostado" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 18.3s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: Best Specialty Coffee Shops in Madrid - The Way to Coffee --- │
│ URL: https://www.thewaytocoffee.com/madrid/ │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ O cenário de café especial em Madrid cresceu significativamente desde 2015, com o número de cafeterias │
│ especializadas triplicando e bairros como Chamberí e Lavapiés se tornando destinos para amantes do café. O │
│ Mercado Vallehermoso em Chamberí foi ampliado para incluir produtos orgânicos, slow food e cafés especiais, │
│ refletindo mudanças no comportamento do consumidor. Muitos cafés começaram a torrar seus próprios grãos ou a │
│ desenvolver perfis de torra personalizados. Entre os destaques estão HanSo Café, conhecido por seu ambiente │
│ acolhedor e variedade rotativa de grãos; Toma Café, pioneiro em Madrid com duas unidades em Malasaña e │
│ Chamberí; Hola Coffee, fundado por campeões baristas e torrefadores, que também opera uma torrefação; Misión │
│ Café, que oferece serviço de mesa e a primeira Mod Bar da Espanha; Santa Kafeina, apreciado pela hospitalidade │
│ e variedade de cafés; Ruda Café, que oferece uma extensa seleção de cafés locais e internacionais; Hey My │
│ Coffee, com três unidades e torra própria; e Drømme Kaffe House, que prioriza um ambiente amigável e acessível. │
...
│ mágico, abrindo uma porta para a cultura e herança do proprietário.”, “The Fix Coffee Roasters serve café │
│ torrado localmente e oferece desde cafés filtrados até bolos caseiros e saladas para um almoço rápido.”, “Acid │
│ Café serve café da torrefação dinamarquesa La Cabra, acompanhado de fragrantes doces caseiros, em um ambiente │
│ pequeno e confortável.”, “Tanya Nanetti é uma barista de café especialidade, viajante e escritora para o site │
│ Coffee Insurrection.” │
│ &lt;/key_excerpts&gt; │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 18.7s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: Las 25 mejores cafeterías de especialidad de Madrid --- │
│ URL: https://madridsecreto.co/mejor-cafe-de-madrid/ │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ O artigo apresenta uma lista detalhada das 27 melhores cafeterias de especialidade em Madrid, destacando locais │
│ que oferecem cafés de alta qualidade, geralmente 100% arábica, torrados por artesãos e com foco no café de │
│ especialidade, em oposição ao tradicional café torrefacto. Cada estabelecimento é descrito com suas │
│ características únicas, localização e especialidades, como Bianchi Kiosko Caffé em Malasaña, Obrar em Chamberí │
│ com sua pasteleria de alto nível, Ruda Café em La Latina com café espresso "naked", The Fix em Argüelles que │
│ também é torrefador, e Toma Café, um dos mais conhecidos, com múltiplas unidades. O texto enfatiza a evolução │
│ do consumo de café em Madrid, a valorização do café de qualidade e a diversidade de ofertas, incluindo opções │
│ veganas, cursos de barista, e ambientes para teletrabalho. Além disso, menciona a importância da origem dos │
│ grãos, práticas de comércio justo e a exclusividade de alguns cafés. O artigo serve como um guia para amantes │
│ do café que buscam experiências sofisticadas e autênticas na capital espanhola. │
...
│ “En el número 1 de este prestigioso listado se ha posicionado la australiana ‘Toby’s Estate Coffee Roasters’”, │
│ “En total, son cuatro las direcciones españolas que han conseguido un hueco en el TOP100”, “‘Hola Coffee │
│ Lagasca’, uno de los dos locales que ‘Hola Coffe Roasters’ tiene en la ciudad de Madrid”, “‘Nomad Frutas │
│ Selectas’, en el puesto número 25”, “‘Kima Coffee‘ busca los mejores granos de todo el mundo para traerlos │
│ hasta la Costa del Sol” │
│ &lt;/key_excerpts&gt; │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 11.9s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": " Excelentes resultados iniciais! Encontrei informações muito relevantes sobre cafeterias │
│ de especialidade em Madrid. **Principais achados até agora:** 1. **Hola Coffee** - Destaque importante: │
│ está no TOP 12 mundial (ranking 'The World's 100 Best Coffee Shops 2025'), fundado por campeões baristas, tem │
│ torrefação própria desde 2017, duas unidades (Lavapiés e Lagasca) 2. **Toma Café** - Pioneiro em Madrid, foi │
│ o primeiro a torrar e preparar café especial na cidade, tem duas localizações (Malasaña e Chamberí) 3. │
│ **HanSo Café** - Usa grãos dos melhores torrefadores europeus, preferência por torra clara nórdica, rotação │
│ frequente de grãos 4. **Naji Specialty Coffee** - Visitado por James Hoffmann (referência mundial), famoso │
│ pelo Pistachio Latte, destaque na Condé Nast Traveler 5. **Misión Café** - Primeira Mod Bar da Espanha, │
│ serviço diferenciado 6. **Acid Café** - Serve café da torrefação dinamarquesa La Cabra (referência │
│ internacional) 7. **The Fix Coffee Roasters** - Torrefação própria local 8. **Ruda Café** - Espresso │
│ "naked", seleção extensa de cafés **Lacunas identificadas:** - Preciso de mais informações específicas │
│ sobre métodos de preparo oferecidos - Avaliações de clientes específicas sobre qualidade do café (Google │
│ Maps/TripAdvisor) - Mais detalhes sobre origem dos grãos em cada cafeteria - Informações sobre outras │
│ cafeterias mencionadas (Religion Coffee, Geisha, FOUR Madrid, etc.) **Próximos passos:** Vou fazer buscas │
│ mais específicas sobre avaliações e rankings, e também sobre cafeterias adicionais mencionadas para ter uma │
│ visão mais completa. " │
│ } │
│ ID: toolu_01W9PWaxpspGRCFvSP6ghkYo │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: think_tool │
│ ID: toolu_01W9PWaxpspGRCFvSP6ghkYo │
│ Type: tool_call │
│ Args: │
│ { │
│ "reflection": " Excelentes resultados iniciais! Encontrei informações muito relevantes sobre cafeterias │
│ de especialidade em Madrid. **Principais achados até agora:** 1. **Hola Coffee** - Destaque importante: │
│ está no TOP 12 mundial (ranking 'The World's 100 Best Coffee Shops 2025'), fundado por campeões baristas, tem │
│ torrefação própria desde 2017, duas unidades (Lavapiés e Lagasca) 2. **Toma Café** - Pioneiro em Madrid, foi │
│ o primeiro a torrar e preparar café especial na cidade, tem duas localizações (Malasaña e Chamberí) 3. │
│ **HanSo Café** - Usa grãos dos melhores torrefadores europeus, preferência por torra clara nórdica, rotação │
│ frequente de grãos 4. **Naji Specialty Coffee** - Visitado por James Hoffmann (referência mundial), famoso │
│ pelo Pistachio Latte, destaque na Condé Nast Traveler 5. **Misión Café** - Primeira Mod Bar da Espanha, │
│ serviço diferenciado 6. **Acid Café** - Serve café da torrefação dinamarquesa La Cabra (referência │
│ internacional) 7. **The Fix Coffee Roasters** - Torrefação própria local 8. **Ruda Café** - Espresso │
│ "naked", seleção extensa de cafés **Lacunas identificadas:** - Preciso de mais informações específicas │
│ sobre métodos de preparo oferecidos - Avaliações de clientes específicas sobre qualidade do café (Google │
│ Maps/TripAdvisor) - Mais detalhes sobre origem dos grãos em cada cafeteria - Informações sobre outras │
│ cafeterias mencionadas (Religion Coffee, Geisha, FOUR Madrid, etc.) **Próximos passos:** Vou fazer buscas │
│ mais específicas sobre avaliações e rankings, e também sobre cafeterias adicionais mencionadas para ter uma │
│ visão mais completa. " │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 0.0s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Reflection recorded: │
│ Excelentes resultados iniciais! Encontrei informações muito relevantes sobre cafeterias de especialidade em │
│ Madrid. │
│ │
│ **Principais achados até agora:** │
│ │
│ 1. **Hola Coffee** - Destaque importante: está no TOP 12 mundial (ranking 'The World's 100 Best Coffee Shops │
│ 2025'), fundado por campeões baristas, tem torrefação própria desde 2017, duas unidades (Lavapiés e Lagasca) │
│ │
│ 2. **Toma Café** - Pioneiro em Madrid, foi o primeiro a torrar e preparar café especial na cidade, tem duas │
│ localizações (Malasaña e Chamberí) │
│ │
│ 3. **HanSo Café** - Usa grãos dos melhores torrefadores europeus, preferência por torra clara nórdica, rotação │
│ frequente de grãos │
│ │
│ 4. **Naji Specialty Coffee** - Visitado por James Hoffmann (referência mundial), famoso pelo Pistachio Latte, │
│ destaque na Condé Nast Traveler │
│ │
│ 5. **Misión Café** - Primeira Mod Bar da Espanha, serviço diferenciado │
│ │
│ 6. **Acid Café** - Serve café da torrefação dinamarquesa La Cabra (referência internacional) │
│ │
│ 7. **The Fix Coffee Roasters** - Torrefação própria local │
│ │
│ 8. **Ruda Café** - Espresso "naked", seleção extensa de cafés │
│ │
│ **Lacunas identificadas:** │
│ - Preciso de mais informações específicas sobre métodos de preparo oferecidos │
│ - Avaliações de clientes específicas sobre qualidade do café (Google Maps/TripAdvisor) │
│ - Mais detalhes sobre origem dos grãos em cada cafeteria │
│ - Informações sobre outras cafeterias mencionadas (Religion Coffee, Geisha, FOUR Madrid, etc.) │
│ │
│ **Próximos passos:** │
│ Vou fazer buscas mais específicas sobre avaliações e rankings, e também sobre cafeterias adicionais mencionadas │
│ para ter uma visão mais completa. │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 4.1s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "Hola Coffee Madrid review quality beans barista methods origin single origin" │
│ } │
│ ID: toolu_01LcMhHrdbnQd9Z1Mkk69ryS │
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "Toma Café Madrid opiniones calidad granos métodos preparación espresso filter" │
│ } │
│ ID: toolu_0115NfKm34wpJf5uwFQ9RXqp │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: tavily_search │
│ ID: toolu_01LcMhHrdbnQd9Z1Mkk69ryS │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "Hola Coffee Madrid review quality beans barista methods origin single origin" │
│ } │
│ │
│ Tool Call 2: │
│ Name: tavily_search │
│ ID: toolu_0115NfKm34wpJf5uwFQ9RXqp │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "Toma Café Madrid opiniones calidad granos métodos preparación espresso filter" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 18.1s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: Hola Coffee Roasters | Madrid, Spain | Ratings &amp; Reviews --- │
│ URL: https://coffeeroast.com/roaster/hola-coffee-roasters │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ Hola Coffee Roasters is a specialty coffee roaster based in Madrid, Spain, ranked #171 internationally and #9 │
│ in Spain on CoffeeRoast.com, based on reviews and popularity. Owned by Pablo Caballero and Nolo Botana, the │
│ roaster offers single-origin coffees roasted by Nolo, occasional guest roasters, and sweet treats. They have │
│ three cataloged roasts with a combined rating of 4.5 out of 5 from five reviews: No Molestar Decaf (Medium │
│ Dark, Honduras) rated 5 stars, Lucero Blend (Medium Dark, Americas Blend) rated 4.25 stars, and Burundi │
│ Rugabano (Light, Burundi) rated 4.25 stars. Notable reviews highlight the No Molestar Decaf as an impeccably │
│ executed, complex decaf espresso with chocolate, hazelnut, and caramel notes, and the Lucero Blend as a solid │
│ espresso with bright acidity and grapefruit and lemon flavors. The roaster encourages direct purchases through │
│ their website, maintaining editorial neutrality by not earning commissions from sales. The page also lists │
│ similar top-rated roasters and top reviewers on the platform. │
...
│ sports a Modbar espresso machine.”, “I did that by ordering a so-called ‘degustación’, i.e. a coffee flights │
│ consisting of a shot of espresso, a cortado and a mini batch brew.”, “What really delighted me was the fact │
│ that they use Marvilla ceramics from Mexico City.”, “If you’re looking for a great coffee experience in the │
│ Spanish capital and a place to stock up on delicious coffee beans, pods and other cool gear, then this is your │
│ place to go!” │
│ &lt;/key_excerpts&gt; │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 8.3s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: Toma Café: Madrid's Top Quality Coffee House | ParTASTE --- │
│ URL: https://partaste.com/restaurants-markets/toma-cafe-madrid-coffee-spain/ │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ Toma Café é uma renomada cafeteria de terceira onda localizada no bairro Malasaña, em Madrid, aberta │
│ diariamente com horários das 8h às 20h durante a semana e das 10h às 20h nos fins de semana. Fundada em 2011 │
│ por Patricia e Santi, a casa se destaca por oferecer café para viagem de alta qualidade, algo raro em Madrid │
│ até então, com grãos 100% Arábica de diversas origens, como Colômbia, Brasil, Etiópia e Quênia, entre outros. O │
│ café é preparado por baristas especializados utilizando seis métodos diferentes, incluindo espresso, cold brew, │
│ Aeropress e Sifão, com opções tradicionais e inovadoras como espresso-tônica. Além das bebidas, o cardápio │
│ inclui sanduíches, saladas e uma variedade de doces feitos por um chef interno. O atendimento é personalizado, │
│ com atenção a detalhes como a escolha de especiarias para o cappuccino e orientação na compra de grãos para │
│ casa. Toma Café também oferece cursos e degustações de café em inglês e espanhol, realizadas às sextas e │
│ sábados para pequenos grupos mediante reserva. O local é reconhecido por sua atmosfera descontraída e serviço │
...
│ --- SOURCE 3: TOMA CAFE 1, Madrid - Restaurante Opiniones y Fotos - Tripadvisor --- │
│ URL: https://www.tripadvisor.com.mx/Restaurant_Review-g187514-d2408938-Reviews-or15-Toma_Cafe_1-Madrid.html │
│ │
│ SUMMARY: │
│ Café buenísimo. Uno de los referentes de café de especialidad en Madrid. El local es bonito, cómodo y el │
│ servicio muy amable. Leer más. │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 13.3s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": " Ótimo! Agora tenho informações mais detalhadas sobre dois dos principais │
│ estabelecimentos: **HOLA COFFEE - Informações detalhadas:** - Ranking #12 mundial (World's 100 Best Coffee │
│ Shops 2025) - Ranking #9 na Espanha no CoffeeRoast.com - Fundadores: Pablo Caballero e Nolo Botana │
│ (ex-proprietários do Misión Café) - Torrefação própria com Nolo como torrador principal - Grãos de origem │
│ única de múltiplos continentes - Usa máquina Modbar - Métodos: espresso, flat white, filter coffee, │
│ pour-over, batch brew - Oferece degustação (coffee flights): espresso, cortado e mini batch brew - Avaliações │
│ específicas mencionam qualidade excepcional: "impeccably executed decaf", "complex", "clean and │
│ balanced" - Mencionado pela Condé Nast Traveler - Usa cerâmica Marvilla do México - Preços: €2.50 a │
│ €3.60 - Duas unidades: Lavapiés (Atocha) e Lagasca - Horário: 8h às 20h diariamente **TOMA CAFÉ - │
│ Informações detalhadas:** - Fundado em 2011 por Patricia e Santi - Pioneiro em café de terceira onda em │
│ Madrid - 100% Arábica de várias origens: Colômbia, Brasil, Etiópia, Quênia - Torrefação própria - 6 métodos │
│ de preparo: espresso, cold brew, Aeropress, Sifão, espresso-tônica - Baristas especializados, proprietários │
│ são "campeões da arte do barista" - Oferece cursos e degustações de café (sextas e sábados, inglês e │
│ espanhol) - TripAdvisor: "café excepcional", "hacia tiempo que no probaba un café con tan buen sabor" - │
│ "Uno de los referentes de café de especialidad en Madrid" - Duas unidades: Malasaña e Chamberí - Horário: │
│ 8h-20h (semana), 10h-20h (fim de semana) **O que ainda preciso:** - Mais detalhes sobre outras cafeterias │
│ mencionadas (Naji, HanSo, Acid, Misión, etc.) - Informações sobre métodos de preparo específicos das outras │
│ cafeterias - Mais avaliações de clientes Vou fazer mais uma busca focada nas outras cafeterias importantes │
│ que apareceram nas pesquisas anteriores. " │
│ } │
│ ID: toolu_011AVgYncKFE9fQFAeJ6MUNx │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: think_tool │
│ ID: toolu_011AVgYncKFE9fQFAeJ6MUNx │
│ Type: tool_call │
│ Args: │
│ { │
│ "reflection": " Ótimo! Agora tenho informações mais detalhadas sobre dois dos principais │
│ estabelecimentos: **HOLA COFFEE - Informações detalhadas:** - Ranking #12 mundial (World's 100 Best Coffee │
│ Shops 2025) - Ranking #9 na Espanha no CoffeeRoast.com - Fundadores: Pablo Caballero e Nolo Botana │
│ (ex-proprietários do Misión Café) - Torrefação própria com Nolo como torrador principal - Grãos de origem │
│ única de múltiplos continentes - Usa máquina Modbar - Métodos: espresso, flat white, filter coffee, │
│ pour-over, batch brew - Oferece degustação (coffee flights): espresso, cortado e mini batch brew - Avaliações │
│ específicas mencionam qualidade excepcional: "impeccably executed decaf", "complex", "clean and │
│ balanced" - Mencionado pela Condé Nast Traveler - Usa cerâmica Marvilla do México - Preços: €2.50 a │
│ €3.60 - Duas unidades: Lavapiés (Atocha) e Lagasca - Horário: 8h às 20h diariamente **TOMA CAFÉ - │
│ Informações detalhadas:** - Fundado em 2011 por Patricia e Santi - Pioneiro em café de terceira onda em │
│ Madrid - 100% Arábica de várias origens: Colômbia, Brasil, Etiópia, Quênia - Torrefação própria - 6 métodos │
│ de preparo: espresso, cold brew, Aeropress, Sifão, espresso-tônica - Baristas especializados, proprietários │
│ são "campeões da arte do barista" - Oferece cursos e degustações de café (sextas e sábados, inglês e │
│ espanhol) - TripAdvisor: "café excepcional", "hacia tiempo que no probaba un café con tan buen sabor" - │
│ "Uno de los referentes de café de especialidad en Madrid" - Duas unidades: Malasaña e Chamberí - Horário: │
│ 8h-20h (semana), 10h-20h (fim de semana) **O que ainda preciso:** - Mais detalhes sobre outras cafeterias │
│ mencionadas (Naji, HanSo, Acid, Misión, etc.) - Informações sobre métodos de preparo específicos das outras │
│ cafeterias - Mais avaliações de clientes Vou fazer mais uma busca focada nas outras cafeterias importantes │
│ que apareceram nas pesquisas anteriores. " │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 0.0s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Reflection recorded: │
│ Ótimo! Agora tenho informações mais detalhadas sobre dois dos principais estabelecimentos: │
│ │
│ **HOLA COFFEE - Informações detalhadas:** │
│ - Ranking #12 mundial (World's 100 Best Coffee Shops 2025) │
│ - Ranking #9 na Espanha no CoffeeRoast.com │
│ - Fundadores: Pablo Caballero e Nolo Botana (ex-proprietários do Misión Café) │
│ - Torrefação própria com Nolo como torrador principal │
│ - Grãos de origem única de múltiplos continentes │
│ - Usa máquina Modbar │
│ - Métodos: espresso, flat white, filter coffee, pour-over, batch brew │
│ - Oferece degustação (coffee flights): espresso, cortado e mini batch brew │
│ - Avaliações específicas mencionam qualidade excepcional: "impeccably executed decaf", "complex", "clean and │
│ balanced" │
│ - Mencionado pela Condé Nast Traveler │
│ - Usa cerâmica Marvilla do México │
│ - Preços: €2.50 a €3.60 │
│ - Duas unidades: Lavapiés (Atocha) e Lagasca │
│ - Horário: 8h às 20h diariamente │
...
│ - Horário: 8h-20h (semana), 10h-20h (fim de semana) │
│ │
│ **O que ainda preciso:** │
│ - Mais detalhes sobre outras cafeterias mencionadas (Naji, HanSo, Acid, Misión, etc.) │
│ - Informações sobre métodos de preparo específicos das outras cafeterias │
│ - Mais avaliações de clientes │
│ │
│ Vou fazer mais uma busca focada nas outras cafeterias importantes que apareceram nas pesquisas anteriores. │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 3.7s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "Naji Specialty Coffee Madrid James Hoffmann pistachio quality beans review" │
│ } │
│ ID: toolu_015Dp1zZdsAbyqFCFJPQPYpe │
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "HanSo Cafe Madrid Nordic roast quality Acid Cafe La Cabra Misión Cafe Modbar" │
│ } │
│ ID: toolu_01KYqDr34Kg4Rp4RZTNAwxK3 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: tavily_search │
│ ID: toolu_015Dp1zZdsAbyqFCFJPQPYpe │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "Naji Specialty Coffee Madrid James Hoffmann pistachio quality beans review" │
│ } │
│ │
│ Tool Call 2: │
│ Name: tavily_search │
│ ID: toolu_01KYqDr34Kg4Rp4RZTNAwxK3 │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "HanSo Cafe Madrid Nordic roast quality Acid Cafe La Cabra Misión Cafe Modbar" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 15.6s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: Best Specialty Coffee Places in Madrid - Things Nomads Do --- │
│ URL: https://www.thingsnomadsdo.com/blog/best-specialty-coffee-places-madrid │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ O artigo apresenta uma seleção dos melhores cafés de especialidade em Madrid, Espanha, recomendados pela autora │
│ Nina Hoeberichts, que tem experiência visitando a cidade. Destacam-se locais como Toma Cafe, com duas unidades │
│ no centro da cidade, conhecido pelo café de alta qualidade e ambiente acolhedor; Acid Cafe, próximo ao bairro │
│ hipster Barrio de las Letras, famoso por seus pães e doces, especialmente os pãezinhos de cardamomo; Misión │
│ Cafe, situado no bairro Malasaña; e Hola Coffee, renomado por suas torrefações e presença na cena de café │
│ especial na Espanha. Outro destaque é o NAJI SPECIALTY COFFEE, que oferece especialidades com pistache, │
│ incluindo cheesecake e bebidas de café, e foi visitado pelo mestre do café James Hoffmann. O FOUR Madrid │
│ Specialty Coffee é recomendado tanto pelo café quanto pelo brunch, especialmente os ovos mexidos. Geisha │
│ Specialty Coffee, nomeado em referência ao tipo de grão de café mais caro, oferece café e opções de café da │
│ manhã no centro da cidade. Religion Coffee possui duas unidades elegantes e minimalistas, com café e opções de │
...
│ &lt;key_excerpts&gt; │
│ “Se você encontrou um café que ama, ótimo, mas há algo que você pode gostar ainda mais.”, “Compre café fresco: │
│ a data de torra é mais confiável que a data de validade.”, “Compre café rastreável, pois isso é um atalho para │
│ qualidade.”, “Supermercados oferecem conveniência e preço, mas frescor pode ser comprometido.”, “Cafeterias │
│ permitem interação e frescor razoável; online oferece maior variedade e frescor máximo.” │
│ &lt;/key_excerpts&gt; │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 26.8s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: Acid Cafe – seasonal, minimalist, and just good coffee - Naked Madrid --- │
│ URL: https://www.nakedmadrid.com/2018/02/01/acid-cafe-seasonal-minimalist-and-just-good-coffee/ │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ Acid Cafe é uma cafeteria minimalista e moderna localizada no bairro de Las Letras, Madrid, inaugurada │
│ recentemente. Fundada por Fede Graciano, que é também o principal barista, a cafeteria destaca-se por oferecer │
│ cafés de alta qualidade, especialmente filtrados, utilizando grãos da torrefação dinamarquesa La Cabra, única │
│ disponível em Madrid. O nome 'Acid' refere-se à acidez e doçura características do café de qualidade. O menu é │
│ sazonal e combina pratos criativos com o café, evitando os típicos itens hipsters como abacate com torrada. │
│ Entre as opções de café estão Americano, flat white, batch coffee e café filtrado, além de chá chai e kombucha. │
│ A cafeteria também produz suas próprias pastelarias, incluindo cookies veganos. Aos domingos, há eventos com │
│ DJs ao vivo, criando um ambiente acolhedor e cultural. Acid Cafe está situada próxima ao Museu Reina Sofia, em │
│ uma rua de paralelepípedos, oferecendo uma experiência diferenciada para amantes de café e visitantes que │
│ buscam um local tranquilo e de alta qualidade para apreciar bebidas e comidas sazonais. │
...
│ ingredients and we really love highlighting the delicate flavours in everything. That’s why we chose to work │
│ with La Cabra because their green coffee and roasting style is some of the best in Europe.”, “The only café in │
│ Spain that works exclusively with Danish roaster La Cabra and where the food menu offers plenty of fermented │
│ and pickled ingredients.”, “Every time I return to Madrid I fall in love with it a little bit more. There is │
│ something truly magical about the Spanish capital that makes it one of the finest cities in Europe.” │
│ &lt;/key_excerpts&gt; │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 17.8s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": " Excelente! Agora tenho informações muito detalhadas sobre mais cafeterias. Vou │
│ organizar o que descobri: **NAJI SPECIALTY COFFEE:** - Visitado por James Hoffmann (maior referência │
│ mundial em café) - Famoso pelo Pistachio Latte e cheesecake de pistache - Bebidas de café peculiares e de │
│ alta qualidade - Horário: 10h às 20h **ACID CAFÉ:** - Fundado por Fede Graciano (argentino, principal │
│ barista) - Única cafeteria na ESPANHA que trabalha exclusivamente com La Cabra (torrefação dinamarquesa de │
│ referência europeia) - Nome refere-se à acidez e doçura do café de qualidade - Métodos: espresso, flat white, │
│ batch coffee, café filtrado - Máquina: Kees van der Westen Mirage - Preços: Espresso €2, Flat white €3, │
│ Filter coffee €4 - Foco em sabores delicados - Menu sazonal com ingredientes fermentados - Localização: │
│ Barrio de Las Letras - Horário: Segunda, quarta-sexta 8h-18:30h, fins de semana 10h-18:30h (fechado │
│ terça) **HANSO CAFÉ:** - Usa grãos dos melhores torrefadores europeus - Preferência por torra clara │
│ nórdica - Rotação frequente de grãos de torrefações locais e internacionais - Localização: Malasaña - │
│ Fundado em 2015 **MISIÓN CAFÉ:** - Café irmão do Hola Coffee (mesmos fundadores: Pablo Caballero e Nolo │
│ Botana) - Primeira Mod Bar da Espanha - Espaço mais amplo que o Hola - Serviço de mesa - Localização: │
│ Malasaña **Análise do que tenho:** Já reuni informações muito sólidas sobre as principais cafeterias de │
│ especialidade de Madrid. Tenho: - 5 cafeterias com informações muito detalhadas (Hola Coffee, Toma Café, Naji, │
│ Acid, HanSo) - Informações sobre métodos de preparo, origens dos grãos, avaliações de especialistas - Menções │
│ a outras cafeterias (Misión, The Fix, Ruda, Religion, FOUR Madrid, Geisha) Tenho informações suficientes │
│ para dar uma resposta muito completa. Já realizei 4 chamadas de pesquisa e tenho dados abrangentes sobre os │
│ principais estabelecimentos. Posso fazer UMA última busca para verificar se há alguma informação adicional │
│ importante sobre as demais cafeterias mencionadas ou posso proceder com a resposta. Decisão: Vou fazer uma │
│ última busca focada em completar informações sobre as cafeterias restantes para ter uma lista ainda mais │
│ completa. " │
│ } │
│ ID: toolu_01VHKs9WDDH8tvMTN7Z714Cm │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: think_tool │
│ ID: toolu_01VHKs9WDDH8tvMTN7Z714Cm │
│ Type: tool_call │
│ Args: │
│ { │
│ "reflection": " Excelente! Agora tenho informações muito detalhadas sobre mais cafeterias. Vou │
│ organizar o que descobri: **NAJI SPECIALTY COFFEE:** - Visitado por James Hoffmann (maior referência │
│ mundial em café) - Famoso pelo Pistachio Latte e cheesecake de pistache - Bebidas de café peculiares e de │
│ alta qualidade - Horário: 10h às 20h **ACID CAFÉ:** - Fundado por Fede Graciano (argentino, principal │
│ barista) - Única cafeteria na ESPANHA que trabalha exclusivamente com La Cabra (torrefação dinamarquesa de │
│ referência europeia) - Nome refere-se à acidez e doçura do café de qualidade - Métodos: espresso, flat white, │
│ batch coffee, café filtrado - Máquina: Kees van der Westen Mirage - Preços: Espresso €2, Flat white €3, │
│ Filter coffee €4 - Foco em sabores delicados - Menu sazonal com ingredientes fermentados - Localização: │
│ Barrio de Las Letras - Horário: Segunda, quarta-sexta 8h-18:30h, fins de semana 10h-18:30h (fechado │
│ terça) **HANSO CAFÉ:** - Usa grãos dos melhores torrefadores europeus - Preferência por torra clara │
│ nórdica - Rotação frequente de grãos de torrefações locais e internacionais - Localização: Malasaña - │
│ Fundado em 2015 **MISIÓN CAFÉ:** - Café irmão do Hola Coffee (mesmos fundadores: Pablo Caballero e Nolo │
│ Botana) - Primeira Mod Bar da Espanha - Espaço mais amplo que o Hola - Serviço de mesa - Localização: │
│ Malasaña **Análise do que tenho:** Já reuni informações muito sólidas sobre as principais cafeterias de │
│ especialidade de Madrid. Tenho: - 5 cafeterias com informações muito detalhadas (Hola Coffee, Toma Café, Naji, │
│ Acid, HanSo) - Informações sobre métodos de preparo, origens dos grãos, avaliações de especialistas - Menções │
│ a outras cafeterias (Misión, The Fix, Ruda, Religion, FOUR Madrid, Geisha) Tenho informações suficientes │
│ para dar uma resposta muito completa. Já realizei 4 chamadas de pesquisa e tenho dados abrangentes sobre os │
│ principais estabelecimentos. Posso fazer UMA última busca para verificar se há alguma informação adicional │
│ importante sobre as demais cafeterias mencionadas ou posso proceder com a resposta. Decisão: Vou fazer uma │
│ última busca focada em completar informações sobre as cafeterias restantes para ter uma lista ainda mais │
│ completa. " │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 0.0s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Reflection recorded: │
│ Excelente! Agora tenho informações muito detalhadas sobre mais cafeterias. Vou organizar o que descobri: │
│ │
│ **NAJI SPECIALTY COFFEE:** │
│ - Visitado por James Hoffmann (maior referência mundial em café) │
│ - Famoso pelo Pistachio Latte e cheesecake de pistache │
│ - Bebidas de café peculiares e de alta qualidade │
│ - Horário: 10h às 20h │
│ │
│ **ACID CAFÉ:** │
│ - Fundado por Fede Graciano (argentino, principal barista) │
│ - Única cafeteria na ESPANHA que trabalha exclusivamente com La Cabra (torrefação dinamarquesa de referência │
│ europeia) │
│ - Nome refere-se à acidez e doçura do café de qualidade │
│ - Métodos: espresso, flat white, batch coffee, café filtrado │
│ - Máquina: Kees van der Westen Mirage │
│ - Preços: Espresso €2, Flat white €3, Filter coffee €4 │
│ - Foco em sabores delicados │
│ - Menu sazonal com ingredientes fermentados │
...
│ - Menções a outras cafeterias (Misión, The Fix, Ruda, Religion, FOUR Madrid, Geisha) │
│ │
│ Tenho informações suficientes para dar uma resposta muito completa. Já realizei 4 chamadas de pesquisa e tenho │
│ dados abrangentes sobre os principais estabelecimentos. Posso fazer UMA última busca para verificar se há │
│ alguma informação adicional importante sobre as demais cafeterias mencionadas ou posso proceder com a resposta. │
│ │
│ Decisão: Vou fazer uma última busca focada em completar informações sobre as cafeterias restantes para ter uma │
│ lista ainda mais completa. │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 3.3s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "The Fix Coffee Roasters Ruda Cafe Religion Coffee FOUR Madrid specialty coffee quality beans │
│ methods" │
│ } │
│ ID: toolu_01Kr2rUWhMwries4hiWuZKZz │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: tavily_search │
│ ID: toolu_01Kr2rUWhMwries4hiWuZKZz │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "The Fix Coffee Roasters Ruda Cafe Religion Coffee FOUR Madrid specialty coffee quality beans │
│ methods" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 13.5s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: The Fix Coffee Roasters in Madrid | reviewed by The Coffeevine --- │
│ URL: https://thecoffeevine.com/reviews/cafes/spain/madrid/the-fix-coffee-roasters-in-madrid/ │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ The Fix Coffee Roasters is a leading specialty coffee roastery and café located in the Argüelles neighborhood │
│ of Madrid, Spain. The café offers a cozy, neighborhood vibe with limited seating and focuses on takeaway and │
│ retail sales of their roasted beans. The Fix is known for its high-quality specialty coffee, inspired by │
│ renowned figures like Tim Wendelboe from Norway, aiming to elevate Madrid's coffee scene, which still trails │
│ behind Barcelona. The co-owner and head roaster, Hugo Jimenez, emphasizes attention to detail and quality. The │
│ café serves a variety of coffee options, including natural processed coffees that pair well with milk, as well │
│ as a diverse food menu featuring items like Bircher Müsli, full English breakfast, pulled pork tacos, and a │
│ selection of cakes and sweets. The Fix is highly recommended for visitors and residents seeking excellent │
│ specialty coffee in Madrid. │
│ &lt;/summary&gt; │
...
│ hearted.", "This blend is made up of 4 origins, ethically sourced from the best coffee farms around the │
│ world.", "Our strongest blend, roasted medium dark, this specialty coffee provides a rich body and strength.", │
│ "This coffee bean blend is very popular with home coffee makers, looking to get more crema out of their home │
│ coffee machine.", "We ship worldwide, with postage calculated at checkout based on your location and order │
│ weight." │
│ &lt;/key_excerpts&gt; │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 12.6s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": " Perfeito! Agora tenho informações adicionais sobre The Fix Coffee Roasters: **THE │
│ FIX COFFEE ROASTERS:** - Torrefação própria liderada por Hugo Jimenez (co-proprietário e torrador │
│ principal) - Inspirado por Tim Wendelboe (Noruega) - referência mundial - Localização: Argüelles, próximo à │
│ Plaza de España - Foco em cafés de processo natural que combinam bem com leite (mais doçura e complexidade) - │
│ Blend de 4 origens, obtidas eticamente - Torra média-escura para seu blend "The Fix" - Menu diversificado: │
│ Bircher Müsli, full English breakfast, pulled pork tacos - Ambiente acolhedor de bairro - Foco em takeaway e │
│ venda de grãos - Uma das torrefações líderes de Madrid **Análise final:** Realizei 5 buscas e coletei │
│ informações muito completas sobre as principais cafeterias de café de especialidade em Madrid. Tenho: ✅ 7 │
│ cafeterias com informações detalhadas e verificadas ✅ Informações sobre métodos de preparo ✅ Detalhes sobre │
│ origem dos grãos ✅ Avaliações de especialistas (James Hoffmann, Condé Nast Traveler, Barista Magazine) ✅ │
│ Rankings internacionais (World's 100 Best Coffee Shops) ✅ Informações sobre torrefações próprias ✅ Detalhes │
│ sobre expertise dos baristas ✅ Preços e horários ✅ Localizações específicas Ainda há menções a outras │
│ cafeterias (Ruda Café, Religion Coffee, FOUR Madrid, Geisha), mas já tenho informações substanciais sobre as │
│ principais e mais reconhecidas cafeterias de especialidade. Com 5 buscas realizadas (meu limite), tenho │
│ informações mais que suficientes para fornecer uma resposta completa e de alta qualidade ao │
│ usuário. **Decisão:** Vou proceder com a resposta final, organizando todas as informações coletadas de forma │
│ clara e priorizando as cafeterias com mais reconhecimento e detalhes sobre qualidade do café. " │
│ } │
│ ID: toolu_01UyUDn587NETcgd5Jz6BvPN │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: think_tool │
│ ID: toolu_01UyUDn587NETcgd5Jz6BvPN │
│ Type: tool_call │
│ Args: │
│ { │
│ "reflection": " Perfeito! Agora tenho informações adicionais sobre The Fix Coffee Roasters: **THE │
│ FIX COFFEE ROASTERS:** - Torrefação própria liderada por Hugo Jimenez (co-proprietário e torrador │
│ principal) - Inspirado por Tim Wendelboe (Noruega) - referência mundial - Localização: Argüelles, próximo à │
│ Plaza de España - Foco em cafés de processo natural que combinam bem com leite (mais doçura e complexidade) - │
│ Blend de 4 origens, obtidas eticamente - Torra média-escura para seu blend "The Fix" - Menu diversificado: │
│ Bircher Müsli, full English breakfast, pulled pork tacos - Ambiente acolhedor de bairro - Foco em takeaway e │
│ venda de grãos - Uma das torrefações líderes de Madrid **Análise final:** Realizei 5 buscas e coletei │
│ informações muito completas sobre as principais cafeterias de café de especialidade em Madrid. Tenho: ✅ 7 │
│ cafeterias com informações detalhadas e verificadas ✅ Informações sobre métodos de preparo ✅ Detalhes sobre │
│ origem dos grãos ✅ Avaliações de especialistas (James Hoffmann, Condé Nast Traveler, Barista Magazine) ✅ │
│ Rankings internacionais (World's 100 Best Coffee Shops) ✅ Informações sobre torrefações próprias ✅ Detalhes │
│ sobre expertise dos baristas ✅ Preços e horários ✅ Localizações específicas Ainda há menções a outras │
│ cafeterias (Ruda Café, Religion Coffee, FOUR Madrid, Geisha), mas já tenho informações substanciais sobre as │
│ principais e mais reconhecidas cafeterias de especialidade. Com 5 buscas realizadas (meu limite), tenho │
│ informações mais que suficientes para fornecer uma resposta completa e de alta qualidade ao │
│ usuário. **Decisão:** Vou proceder com a resposta final, organizando todas as informações coletadas de forma │
│ clara e priorizando as cafeterias com mais reconhecimento e detalhes sobre qualidade do café. " │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 0.0s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Reflection recorded: │
│ Perfeito! Agora tenho informações adicionais sobre The Fix Coffee Roasters: │
│ │
│ **THE FIX COFFEE ROASTERS:** │
│ - Torrefação própria liderada por Hugo Jimenez (co-proprietário e torrador principal) │
│ - Inspirado por Tim Wendelboe (Noruega) - referência mundial │
│ - Localização: Argüelles, próximo à Plaza de España │
│ - Foco em cafés de processo natural que combinam bem com leite (mais doçura e complexidade) │
│ - Blend de 4 origens, obtidas eticamente │
│ - Torra média-escura para seu blend "The Fix" │
│ - Menu diversificado: Bircher Müsli, full English breakfast, pulled pork tacos │
│ - Ambiente acolhedor de bairro │
│ - Foco em takeaway e venda de grãos │
│ - Uma das torrefações líderes de Madrid │
│ │
│ **Análise final:** │
│ Realizei 5 buscas e coletei informações muito completas sobre as principais cafeterias de café de especialidade │
│ em Madrid. Tenho: │
│ │
│ ✅ 7 cafeterias com informações detalhadas e verificadas │
│ ✅ Informações sobre métodos de preparo │
│ ✅ Detalhes sobre origem dos grãos │
│ ✅ Avaliações de especialistas (James Hoffmann, Condé Nast Traveler, Barista Magazine) │
│ ✅ Rankings internacionais (World's 100 Best Coffee Shops) │
│ ✅ Informações sobre torrefações próprias │
│ ✅ Detalhes sobre expertise dos baristas │
│ ✅ Preços e horários │
│ ✅ Localizações específicas │
│ │
│ Ainda há menções a outras cafeterias (Ruda Café, Religion Coffee, FOUR Madrid, Geisha), mas já tenho │
│ informações substanciais sobre as principais e mais reconhecidas cafeterias de especialidade. Com 5 buscas │
│ realizadas (meu limite), tenho informações mais que suficientes para fornecer uma resposta completa e de alta │
│ qualidade ao usuário. │
│ │
│ **Decisão:** Vou proceder com a resposta final, organizando todas as informações coletadas de forma clara e │
│ priorizando as cafeterias com mais reconhecimento e detalhes sobre qualidade do café. │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 1:16.5
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ # AS MELHORES CAFETERIAS DE CAFÉ DE ESPECIALIDADE EM MADRI │
│ │
│ Com base em uma análise aprofundada de rankings internacionais, avaliações de especialistas e reviews de │
│ clientes, apresento as melhores cafeterias de Madri focadas em excelência na qualidade do café: │
│ │
│ --- │
│ │
│ ## 🏆 TOP TIER - RECONHECIMENTO MUNDIAL │
│ │
│ ### 1. **HOLA COFFEE ROASTERS** ⭐⭐⭐⭐⭐ │
│ **Ranking: #12 no mundo (World's 100 Best Coffee Shops 2025) | #9 na Espanha** │
│ │
│ **📍 Localizações:** │
│ - Lavapiés (Calle Dr. Fourquet, 33) │
│ - Lagasca (Calle de Lagasca, 98) │
│ │
│ **☕ QUALIDADE DO CAFÉ:** │
│ - **Torrefação própria** liderada por Nolo Botana (torrador principal e cofundador) │
│ - **Grãos de origem única** (single origin) de múltiplos continentes │
...
│ │
│ **Para café com leite (processos naturais):** │
│ → **The Fix Coffee Roasters** │
│ │
│ --- │
│ │
│ **Todas as cafeterias listadas priorizam café de especialidade (specialty coffee), grãos frescos, métodos de │
│ preparo profissionais e baristas altamente qualificados. Madrid consolidou-se como um dos principais destinos │
│ de café de especialidade na Europa, com estabelecimentos que rivalizam com as melhores cafeterias do mundo.** │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────── 🔧 Researcher Agent - Should compress research ─────────────────────────────────╮
│ No tool calls found. Stopping research and compressing findings... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Compressing Research:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 41.7s
>_ Output
			
╭─────────────────────────────────── 🤖 Researcher Agent - Compressed Research ───────────────────────────────────╮
│ **Lista de consultas e chamadas a ferramentas realizadas** │
│ │
│ 1. Pesquisa por “best specialty coffee shops Madrid Spain 2024 high quality beans baristas” │
│ 2. Pesquisa por “mejores cafeterías café especialidad Madrid especialista granos tostado” │
│ 3. Pesquisa por “Hola Coffee Madrid review quality beans barista methods origin single origin” │
│ 4. Pesquisa por “Toma Café Madrid opiniones calidad granos métodos preparación espresso filter” │
│ 5. Pesquisa por “Naji Specialty Coffee Madrid James Hoffmann pistachio quality beans review” │
│ 6. Pesquisa por “HanSo Cafe Madrid Nordic roast quality Acid Cafe La Cabra Misión Cafe Modbar” │
│ 7. Pesquisa por “The Fix Coffee Roasters Ruda Cafe Religion Coffee FOUR Madrid specialty coffee quality beans │
│ methods” │
│ │
│ --- │
│ │
│ **Resultados completos** │
│ │
│ --- │
│ │
│ **Best Specialty Coffee Shops in Madrid - The Way to Coffee** │
│ O cenário de café especial em Madrid cresceu significativamente desde 2015, com o número de cafeterias │
...
│ https://www.nakedmadrid.com/2018/02/01/acid-cafe-seasonal-minimalist-and-just-good-coffee/ │
│ [13] Acid Café in Madrid | reviewed by The Coffeevine: │
│ https://thecoffeevine.com/reviews/cafes/spain/madrid/acid-madrid-es/ │
│ [14] The Fix Coffee Roasters in Madrid | reviewed by The Coffeevine: │
│ https://thecoffeevine.com/reviews/cafes/spain/madrid/the-fix-coffee-roasters-in-madrid/ │
│ [15] The Fix Speciality Coffee| Madrid - Conquest for Coffee: https://conquestforcoffee.com/madrid/the-fix/ │
│ [16] The Fix - Coffee Beans - Artisti Coffee Roasters: │
│ https://artisticoffee.com/products/the-fix-coffee-bean-blend?srsltid=AfmBOopalnY3N38WZ_3mhv20aIyKHfGO4WVzoehc3Q │
│ EOBSGm1CyEIcKL │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Supervisor agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 26.1s
>_ Output
			
╭──────────────────────────────── 🤖 Supervisor Agent tools - Call to think tool ─────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": " Excelente! A pesquisa retornou informações muito detalhadas e abrangentes sobre as │
│ melhores cafeterias de Madri com foco na qualidade do café. **ANÁLISE DOS RESULTADOS:** A pesquisa trouxe │
│ informações robustas sobre múltiplas cafeterias de especialidade em Madri, incluindo: **Cafeterias │
│ principais identificadas:** 1. **Hola Coffee** - Muito destaque, incluindo: - Ranking #12 mundial (World's │
│ 100 Best Coffee Shops) - Torra própria desde 2017 - Grãos de origem única de múltiplos continentes │
│ - Avaliações detalhadas de especialistas - Métodos: pour-over, espresso - Fundadores campeões baristas │
│ (Pablo Caballero e Nolo Botana) 2. **Toma Café** - Pioneiro: - Primeira cafeteria de especialidade em │
│ Madrid (2011) - Torra própria - Grãos 100% Arábica - 6 métodos de preparo (espresso, cold brew, │
│ Aeropress, Sifão) - Proprietários campeões de barista - Oferece cursos e degustações 3. **Acid │
│ Café**: - Único em Madrid a servir La Cabra (torrefação dinamarquesa) - Foco em café filtrado - │
│ Fundado por Fede Graciano (barista principal) - Estilo nórdico de torra 4. **HanSo Café**: - Torra │
│ clara nórdica - Rotação de grãos de torrefações locais e internacionais - Café preparado "à │
│ perfeição" segundo fontes 5. **Naji Specialty Coffee**: - Visitado por James Hoffmann (especialista │
│ mundial em café) - Famoso pelo Pistachio Latte 6. **The Fix Coffee Roasters**: - Torrefação │
│ própria - Inspirado por Tim Wendelboe (Noruega) - Foco em qualidade e atenção aos detalhes 7. │
│ **Misión Café**: - Primeira Mod Bar da Espanha - Irmã do Hola Coffee 8. **Outras mencionadas**: │
│ Religion Coffee, FOUR Madrid, Geisha Specialty Coffee, Ruda Café, Santa Kafeina, Drømme Kaffe House, │
│ etc. **CRITÉRIOS ATENDIDOS:** ✓ Sabor e qualidade - Múltiplas menções sobre sabor excepcional ✓ Aroma - │
│ Mencionado especialmente em Acid Café ✓ Frescor dos grãos - Várias cafeterias com torra própria ✓ Métodos de │
│ preparo - Detalhados (espresso, pour-over, V60, Aeropress, cold brew, Modbar) ✓ Reputação - Rankings mundiais, │
│ visitas de especialistas como James Hoffmann ✓ Origem dos grãos - Single origin mencionado, origem de │
│ múltiplos continentes ✓ Expertise baristas - Campeões de barista mencionados **FONTES UTILIZADAS:** ✓ │
│ Sites especializados (The Way to Coffee, Coffeevine, Barista Magazine) ✓ Condé Nast Traveler (publicação de │
│ prestígio) ✓ TripAdvisor (avaliações de clientes) ✓ Publicações em espanhol (Madrid Secreto, Infobae) ✓ │
│ Ranking mundial (World's 100 Best Coffee Shops) ✓ CoffeeRoast.com (avaliações técnicas) **QUALIDADE DAS │
│ INFORMAÇÕES:** - Avaliações específicas sobre qualidade do café (não apenas ambiente) - Citações diretas de │
│ especialistas e clientes - Informações sobre métodos de preparo - Detalhes sobre origem dos grãos - Rankings │
│ e reconhecimentos internacionais - Links para fontes oficiais **AVALIAÇÃO:** A pesquisa atendeu │
│ completamente aos requisitos do usuário. Tenho informações detalhadas sobre: - As principais cafeterias de │
│ especialidade em Madri - Critérios específicos de qualidade do café - Avaliações de especialistas e │
│ consumidores - Fontes confiáveis e oficiais - Publicações em espanhol incluídas **DECISÃO:** Tenho │
│ informações suficientes e abrangentes para fornecer uma resposta completa ao usuário. A pesquisa cobriu todos │
│ os critérios solicitados com profundidade adequada. Posso chamar ResearchComplete. " │
│ } │
│ ID: toolu_01DDzbw8bRS4M6fhaPefpFHk │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────── 🔧 Supervisor Agent tools - Research iterations ────────────────────────────────╮
│ Research iterations: 3 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────────── 🔧 Supervisor Agent - think tool result ────────────────────────────────────╮
│ Reflection recorded: │
│ Excelente! A pesquisa retornou informações muito detalhadas e abrangentes sobre as melhores cafeterias de Madri │
│ com foco na qualidade do café. │
│ │
│ **ANÁLISE DOS RESULTADOS:** │
│ │
│ A pesquisa trouxe informações robustas sobre múltiplas cafeterias de especialidade em Madri, incluindo: │
│ │
│ **Cafeterias principais identificadas:** │
│ 1. **Hola Coffee** - Muito destaque, incluindo: │
│ - Ranking #12 mundial (World's 100 Best Coffee Shops) │
│ - Torra própria desde 2017 │
│ - Grãos de origem única de múltiplos continentes │
│ - Avaliações detalhadas de especialistas │
│ - Métodos: pour-over, espresso │
│ - Fundadores campeões baristas (Pablo Caballero e Nolo Botana) │
│ │
│ 2. **Toma Café** - Pioneiro: │
│ - Primeira cafeteria de especialidade em Madrid (2011) │
...
│ - Critérios específicos de qualidade do café │
│ - Avaliações de especialistas e consumidores │
│ - Fontes confiáveis e oficiais │
│ - Publicações em espanhol incluídas │
│ │
│ **DECISÃO:** │
│ Tenho informações suficientes e abrangentes para fornecer uma resposta completa ao usuário. A pesquisa cobriu │
│ todos os critérios solicitados com profundidade adequada. Posso chamar ResearchComplete. │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Supervisor agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 2.2s
>_ Output
			
╭──────────────────────────────────── 🤖 Supervisor Agent tools - Tool Calls ─────────────────────────────────────╮
│ │
│ 🔧 Tool Call: ResearchComplete │
│ Args: {} │
│ ID: toolu_01GsJYSFPhPt5XFBTYagJb9r │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────── 🔧 Supervisor Agent tools - Research iterations ────────────────────────────────╮
│ Research iterations: 4 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────────────── 🔧 Research complete ─────────────────────────────────────────────╮
│ Exceeded iterations or no tool calls or research complete. Ending supervisor... Research iterations: 4 and │
│ supervisor messages: [HumanMessage(content='Quero identificar as melhores cafeterias de Madri avaliando │
│ especificamente a qualidade do café servido. Para isso, desejo que a pesquisa considere critérios como sabor, │
│ aroma, frescor dos grãos, métodos de preparo e reputação do estabelecimento em relação à qualidade do café. Não │
│ especifiquei preferências quanto a preço, localização, ambiente, wi-fi ou outros serviços, portanto, esses │
│ aspectos podem ser considerados secundários ou flexíveis. Priorize fontes oficiais das cafeterias, avaliações │
│ de clientes em plataformas confiáveis (como Google Maps, TripAdvisor ou sites especializados em café) e │
│ publicações em espanhol, sempre que possível. O foco principal deve ser a excelência do café servido, conforme │
│ avaliado por especialistas e consumidores..', additional_kwargs={}, response_metadata={}, │
│ id='0bbb24bc-8d1a-4b15-963f-a59941e600d7'), AIMessage(content=[{'id': 'toolu_019J5VvgyE3ikCL6jKNYeH2m', │
│ 'input': {'reflection': ' Analisando a solicitação do usuário: **Objetivo principal**: Identificar as │
│ melhores cafeterias de Madri com foco específico na qualidade do café servido. **Critérios │
│ prioritários:** - Sabor do café - Aroma - Frescor dos grãos - Métodos de preparo - Reputação em relação à │
│ qualidade do café **Critérios secundários/flexíveis:** - Preço - Localização - Ambiente - Wi-fi e outros │
│ serviços **Fontes preferenciais:** - Sites oficiais das cafeterias - Avaliações em Google Maps - │
│ Avaliações em TripAdvisor - Sites especializados em café - Publicações em espanhol - Opiniões de │
│ especialistas e consumidores **Abordagem de pesquisa:** Esta é uma pesquisa focada em um único tema │
│ específico - cafeterias de qualidade em Madri. Não há múltiplas direções independentes para paralelizar. A │
│ pesquisa deve ser abrangente e cobrir: 1. Rankings e listas de melhores cafeterias especializadas 2. │
...
│ 'tool_use'}], additional_kwargs={}, response_metadata={'id': 'msg_01HxHeFXgyBbF5cgqsNFAXpP', 'model': │
│ 'claude-sonnet-4-5-20250929', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'cache_creation': │
│ {'ephemeral_1h_input_tokens': 0, 'ephemeral_5m_input_tokens': 0}, 'cache_creation_input_tokens': 0, │
│ 'cache_read_input_tokens': 0, 'input_tokens': 13716, 'output_tokens': 36, 'server_tool_use': None, │
│ 'service_tier': 'standard'}, 'model_name': 'claude-sonnet-4-5-20250929', 'model_provider': 'anthropic'}, │
│ id='lc_run--a8968773-1b3d-4f53-a9fc-4b5acc4d113b-0', tool_calls=[{'name': 'ResearchComplete', 'args': {}, 'id': │
│ 'toolu_01GsJYSFPhPt5XFBTYagJb9r', 'type': 'tool_call'}], usage_metadata={'input_tokens': 13716, │
│ 'output_tokens': 36, 'total_tokens': 13752, 'input_token_details': {'cache_read': 0, 'cache_creation': 0, │
│ 'ephemeral_5m_input_tokens': 0, 'ephemeral_1h_input_tokens': 0}})] │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

Como podemos ver, o agente supervisor utilizou várias vezes a ferramenta think_tool para refletir sobre as informações que possui e chamou o agente Researcher para realizar a pesquisa. Finalmente, considera que encontrou informações suficientes e chama a ferramenta ResearchComplete para finalizar a pesquisa e gerar o relatório final.

Escritorlink image 146

Já implementamos o agente Scope, o agente Researcher e o agente Supervisor. Agora vamos implementar o agente Writer, que será responsável por gerar o relatório final.

deep researcher architecture

Prompt do escritorlink image 147

Aqui também teremos um único prompt no qual dizemos ao LLM:

  • Tem que fazer um resumo do que foi pesquisado
  • É dado o tema de pesquisa e o que foi pesquisado
  • É solicitado que gere o resumo no idioma do usuário
  • É-lhe indicado como se espera que seja o resumo e são-lhe dados exemplos
	
< > Input
Python
final_report_generation_prompt = """Com base em toda a pesquisa realizada, elabore uma resposta completa e bem estruturada para o resumo geral da pesquisa:
&lt;Research Brief&gt;
{research_brief}
&lt;/Resumo da Pesquisa&gt;
IMPORTANTE: Certifique-se de que sua resposta esteja escrita no mesmo idioma das mensagens do usuário!
Por exemplo, se as mensagens do usuário estiverem em inglês, CERTIFIQUE-SE de escrever sua resposta em inglês. Se as mensagens do usuário estiverem em português, CERTIFIQUE-SE de escrever toda a sua resposta em português.
Isso é muito importante. O usuário só entenderá a resposta se ela estiver escrita no mesmo idioma da mensagem que ele digitou.
A data de hoje é {date}.
Estes são os resultados da pesquisa que você realizou:
&lt;Findings&gt;
{findings}
&lt;/Findings&gt;
Escreva uma resposta detalhada para o resumo geral da pesquisa que:
1. Esteja bem organizada com títulos apropriados (# para título, ## para seções, ### para subseções).
2. Inclua dados e conclusões específicos da pesquisa.
3. Cite as fontes relevantes usando o formato [Título](URL).
4. Apresente uma análise equilibrada e completa. Seja o mais abrangente possível e inclua todas as informações relevantes para a questão geral da pesquisa. As pessoas contam com você para pesquisas aprofundadas e esperam respostas detalhadas e completas.
5. Inclua uma seção de "Fontes" no final com todos os links referenciados.
Você pode estruturar seu relatório de diversas maneiras. Aqui estão alguns exemplos:
Para responder a uma pergunta que pede a comparação entre dois itens, você pode estruturar seu relatório da seguinte forma:
1/ Introdução
2/ Resumo do Tópico A
3/ Resumo do Tópico B
4/ Comparação entre A e B
5/ Conclusão
Para responder a uma pergunta que pede uma lista de itens, você pode precisar apenas de uma única seção que contenha a lista completa.
1/ Lista de itens ou tabela de itens
Alternativamente, você pode optar por criar uma seção separada para cada item da lista. Quando são solicitadas listas, não é necessário incluir uma introdução ou conclusão.
1/ Elemento 1
2/ Elemento 2
3/ Elemento 3
Para responder a uma pergunta que pede para resumir um tópico, escrever um relatório ou fornecer uma visão geral, você pode estruturar seu relatório da seguinte forma:
1/ Visão Geral do Tópico
2/ Conceito 1
3/ Conceito 2
4/ Conceito 3
5/ Conclusão
Se você acha que pode responder à pergunta com uma única seção, também pode!
1/ Resposta
LEMBRE-SE: A seção é um conceito MUITO fluido e flexível. Você pode estruturar seu relatório como achar melhor, mesmo de maneiras não mencionadas acima!
Certifique-se de que suas seções sejam coerentes e façam sentido para o leitor.
Para cada seção do relatório, faça o seguinte:
- Use linguagem simples e clara.
- Use ## para o título da seção (formato Markdown) em cada seção do relatório.
- Nunca se refira a si mesmo como autor do relatório. Deve ser um relatório profissional, sem linguagem autorreferencial.
- Não mencione o que você está fazendo no relatório. Simplesmente escreva o relatório sem comentários pessoais.
- Cada seção deve ser longa o suficiente para responder à pergunta em profundidade com as informações que você coletou. Espera-se que as seções sejam relativamente longas e detalhadas. Você está escrevendo um relatório de pesquisa aprofundado e os usuários esperam uma resposta completa.
- Use marcadores para listar informações quando apropriado, mas, por padrão, escreva em parágrafos.
LEMBRE-SE:
O resumo e a pesquisa podem estar em português, mas você deve traduzir essas informações para o idioma apropriado ao escrever a resposta final.
Certifique-se de que o relatório de resposta final esteja no MESMO idioma das mensagens humanas no histórico de mensagens.
Formate o relatório com marcação clara e uma estrutura adequada e inclua referências às fontes quando necessário.
&lt;Citation Rules&gt;
- Atribua a cada URL exclusivo um número de citação exclusivo em seu texto.
- Termine com ### Fontes, onde todas as fontes são listadas com seus respectivos números.
- IMPORTANTE: Numere as fontes sequencialmente e sem lacunas (1, 2, 3, 4...) na lista final, independentemente das fontes escolhidas.
- Cada fonte deve ser um item separado na lista, para que apareça como uma lista na marcação.
- Exemplo de formato:
[1] Título da Fonte: URL
[2] Título da Fonte: URL
- As citações são extremamente importantes. Certifique-se de incluí-las e preste muita atenção à sua precisão. Os usuários costumam usar essas citações para encontrar mais informações.
&lt;/Citation Rules&gt;
"""
Copied

Modelo de linguagem do Writerlink image 148

Definimos o modelo de linguagem que vamos usar

	
< > Input
Python
import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
load_dotenv()
WRITER_MODEL_NAME = "gpt-4.1"
WRITER_MODEL_PROVIDER = "openai"
WRITER_MODEL_BASE_URL = "https://api.openai.com/v1"
WRITER_MODEL_TEMPERATURE = 0.0
WRITER_MODEL_PROVIDER_API_KEY = os.getenv("OPENAI_API_KEY")
WRITER_MODEL_MAX_TOKENS = 32000
writer_model = init_chat_model(
model=WRITER_MODEL_NAME,
model_provider=WRITER_MODEL_PROVIDER,
api_key=WRITER_MODEL_PROVIDER_API_KEY,
base_url=WRITER_MODEL_BASE_URL,
temperature=WRITER_MODEL_TEMPERATURE,
max_tokens=WRITER_MODEL_MAX_TOKENS
)
Copied

Funções do Writerlink image 149

Definimos a função do Writer. Lembre-se, a função é o que nós definimos como e quando será executada.

O que a função vai fazer é pegar as notas que o agente supervisor foi gerando. Essas notas, junto com o research_brief, são inseridas no prompt que definimos anteriormente.

Com este prompt que acabamos de hidratar, invocamos o modelo de linguagem do agente, que vai gerar o relatório final

	
< > Input
Python
async def final_report_generation(state: AgentState):
"""
Final report generation node.
Synthesizes all research findings into a comprehensive final report
"""
notes = state.get("notes", [])
findings = " ".join(notes)
final_report_prompt = final_report_generation_prompt.format(
research_brief=state.get("research_brief", ""),
findings=findings,
date=get_today_str()
)
print("⏳ Writer agent - Final report generation:")
with alive_bar(monitor=False, stats=False, title="", spinner='dots_waves', bar='blocks') as bar:
final_report = await writer_model.ainvoke([HumanMessage(content=final_report_prompt)])
bar()
format_messages([final_report], title="Writer Agent - Final Report")
return {
"final_report": final_report.content,
"messages": ["Here is the final report: " + final_report.content],
}
Copied

Grafo do Writerlink image 150

Criamos o grafo do Writer

Começamos inicializando o grafo. Diferente dos outros agentes do deep researcher, para este agente não criamos um estado, mas o que vamos fazer é usar o estado AgentState que definimos para o agente Scope e a entrada AgentInputState.

	
< > Input
Python
from langgraph.graph import StateGraph
# Build the overall workflow
agent_builder = StateGraph(AgentState, input_schema=AgentInputState)
Copied

Criamos os nós, que vão ser

  • Um nó clarify_with_user e um nó write_research_brief que serão responsáveis por gerar o resumo do que se deseja investigar
  • Um nó supervisor_subgraph que será o agente supervisor, que poderá chamar os agentes Researcher, com os quais realizará a pesquisa
  • Por fim, um nó final_report_generation com a função que criamos anteriormente, e que será responsável por gerar o relatório final para o usuário
	
< > Input
Python
# Add workflow nodes
agent_builder.add_node("clarify_with_user", clarify_with_user)
agent_builder.add_node("write_research_brief", write_research_brief)
agent_builder.add_node("supervisor_subgraph", supervisor_agent)
agent_builder.add_node("final_report_generation", final_report_generation)
Copied
>_ Output
			
&lt;langgraph.graph.state.StateGraph at 0x11214c800&gt;

Unimos os nós com arestas. O fluxo é

  • Começa-se com o nó clarify_with_user
  • Passa-se para o nó write_research_brief para escrever o resumo do que se deseja pesquisar
  • Em seguida, passa-se para o agente supervisor para que supervisione a investigação com os Researchers
  • Por último, passa-se para final_report_generation para que o relatório final seja gerado
	
< > Input
Python
# Add workflow edges
agent_builder.add_edge(START, "clarify_with_user")
agent_builder.add_edge("write_research_brief", "supervisor_subgraph")
agent_builder.add_edge("supervisor_subgraph", "final_report_generation")
agent_builder.add_edge("final_report_generation", END)
Copied
>_ Output
			
&lt;langgraph.graph.state.StateGraph at 0x11214c800&gt;

Nós o compilamos e o mostramos

	
< > Input
Python
from langgraph.checkpoint.memory import InMemorySaver
from IPython.display import Image, display
# Compile the full workflow
checkpointer = InMemorySaver()
agent = agent_builder.compile(checkpointer=checkpointer)
# Visualize the workflow
display(Image(agent.get_graph(xray=True).draw_mermaid_png()))
Copied
>_ Output
			
&lt;IPython.core.display.Image object&gt;

Execução do grafo Writerlink image 151

Criamos uma thread para poder fazer várias chamadas ao agente, caso ele nos peça mais informações.

	
< > Input
Python
thread = {"configurable": {"thread_id": "4"}}
user_message = "Quero pesquisar os melhores cafés de Madrid.."
result = await agent.ainvoke({"messages": [HumanMessage(content=user_message)]}, config=thread)
Copied
>_ Output
			
⏳ Scope agent:
>_ Output
			
╭───────────────────────────────────────────── 🧑 Real Human Message ─────────────────────────────────────────────╮
│ Quero pesquisar os melhores cafés de Madrid.. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 1.0s
>_ Output
			
╭─────────────────────────────────── 🤖 Scope Assistant - need clarification? ────────────────────────────────────╮
│ need_clarification=True question='Você está procurando cafés para tomar café (bebida) ou cafeterias │
│ (estabelecimentos)? Além disso, você tem algum critério específico, como ambiente, preço, localização ou tipo │
│ de café?' verification='' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────────────────── 🔧 Scope System Message ────────────────────────────────────────────╮
│ Necesita aclaración por parte del usuario. Enviando pregunta aclaratoria... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

O agente nos pede mais informações, então voltamos a invocar o agente com as informações que ele nos pede.

	
< > Input
Python
from tavily import TavilyClient
import asyncio
tavily_client = TavilyClient(api_key=os.getenv("TAVILY_API_KEY"))
user_message = "Examine a qualidade do café para avaliar as melhores cafeterias de Madri.."
result = await agent.ainvoke({"messages": [HumanMessage(content=user_message)]}, config=thread)
Copied
>_ Output
			
⏳ Scope agent:
>_ Output
			
╭───────────────────────────────────────────── 🧑 Real Human Message ─────────────────────────────────────────────╮
│ Examine a qualidade do café para avaliar as melhores cafeterias de Madri.. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 1.4s
>_ Output
			
╭─────────────────────────────────── 🤖 Scope Assistant - need clarification? ────────────────────────────────────╮
│ need_clarification=False question='' verification='Você forneceu informações suficientes para iniciar a │
│ investigação. Entendi que deseja um relatório avaliando as melhores cafeterias de Madri com base na qualidade │
│ do café servido. Iniciarei agora a pesquisa considerando esse critério principal.' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────────────────── 🔧 Scope System Message ────────────────────────────────────────────╮
│ No necesita aclaración por parte del usuario. Enviando mensaje de verificación... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Scope agent - Write research brief:
>_ Output
			
╭─────────────────────────────────── 🤖 Scope Assistant - Write research brief ───────────────────────────────────╮
│ Você forneceu informações suficientes para iniciar a investigação. Entendi que deseja um relatório avaliando as │
│ melhores cafeterias de Madri com base na qualidade do café servido. Iniciarei agora a pesquisa considerando │
│ esse critério principal. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 2.9s
>_ Output
			
╭───────────────────────────────── 🤖 Scope Assistant - Research brief generated ─────────────────────────────────╮
│ research_brief='Quero identificar as melhores cafeterias de Madri avaliando especificamente a qualidade do café │
│ servido. Para isso, desejo que a pesquisa considere fatores como a origem e seleção dos grãos, métodos de │
│ torrefação, técnicas de preparo e avaliação sensorial (sabor, aroma, corpo e acidez) do café oferecido em cada │
│ estabelecimento. Não especifiquei preferências quanto a preço, localização, ambiente ou outros serviços, │
│ portanto, esses aspectos podem ser tratados como flexíveis ou secundários. Priorize fontes oficiais das │
│ cafeterias, avaliações de especialistas em café e plataformas reconhecidas por avaliações de consumidores, │
│ preferencialmente em espanhol ou português.' │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Supervisor agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 9.9s
>_ Output
			
╭──────────────────────────────── 🤖 Supervisor Agent tools - Call to think tool ─────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": " Analisando a solicitação do usuário, preciso identificar as melhores cafeterias de │
│ Madri com foco específico na qualidade do café. Os critérios prioritários são: 1. Origem e seleção dos grãos │
│ de café 2. Métodos de torrefação 3. Técnicas de preparo 4. Avaliação sensorial (sabor, aroma, corpo e │
│ acidez) Aspectos secundários: preço, localização, ambiente, outros serviços. Fontes preferenciais: - │
│ Fontes oficiais das cafeterias (sites, redes sociais) - Avaliações de especialistas em café - Plataformas │
│ reconhecidas de avaliações de consumidores - Idiomas: espanhol ou português Esta é uma pesquisa que pode │
│ ser tratada como uma única tarefa integrada, pois: - Foca em um único mercado geográfico (Madri) - Tem │
│ critérios de avaliação bem definidos e interconectados - Requer análise comparativa das cafeterias baseada nos │
│ mesmos parâmetros - Um único agente pode fazer uma pesquisa mais coesa e comparativa Vou delegar esta │
│ pesquisa a um único subagente especializado que poderá: - Identificar as principais cafeterias especializadas │
│ em café de qualidade em Madri - Avaliar cada estabelecimento com base nos critérios técnicos especificados - │
│ Consultar fontes oficiais, especialistas e plataformas de avaliação - Fornecer uma análise comparativa │
│ completa Estratégia: Usar 1 agente de pesquisa com instruções detalhadas e completas sobre todos os │
│ critérios. " │
│ } │
│ ID: toolu_01TpMrafwRYTuXhcJRF5PNUP │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────── 🔧 Supervisor Agent tools - Research iterations ────────────────────────────────╮
│ Research iterations: 1 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────────── 🔧 Supervisor Agent - think tool result ────────────────────────────────────╮
│ Reflection recorded: │
│ Analisando a solicitação do usuário, preciso identificar as melhores cafeterias de Madri com foco específico na │
│ qualidade do café. Os critérios prioritários são: │
│ │
│ 1. Origem e seleção dos grãos de café │
│ 2. Métodos de torrefação │
│ 3. Técnicas de preparo │
│ 4. Avaliação sensorial (sabor, aroma, corpo e acidez) │
│ │
│ Aspectos secundários: preço, localização, ambiente, outros serviços. │
│ │
│ Fontes preferenciais: │
│ - Fontes oficiais das cafeterias (sites, redes sociais) │
│ - Avaliações de especialistas em café │
│ - Plataformas reconhecidas de avaliações de consumidores │
│ - Idiomas: espanhol ou português │
│ │
│ Esta é uma pesquisa que pode ser tratada como uma única tarefa integrada, pois: │
│ - Foca em um único mercado geográfico (Madri) │
│ - Tem critérios de avaliação bem definidos e interconectados │
│ - Requer análise comparativa das cafeterias baseada nos mesmos parâmetros │
│ - Um único agente pode fazer uma pesquisa mais coesa e comparativa │
│ │
│ Vou delegar esta pesquisa a um único subagente especializado que poderá: │
│ - Identificar as principais cafeterias especializadas em café de qualidade em Madri │
│ - Avaliar cada estabelecimento com base nos critérios técnicos especificados │
│ - Consultar fontes oficiais, especialistas e plataformas de avaliação │
│ - Fornecer uma análise comparativa completa │
│ │
│ Estratégia: Usar 1 agente de pesquisa com instruções detalhadas e completas sobre todos os critérios. │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Supervisor agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 13.3s
>_ Output
			
╭───────────────────────────── 🤖 Supervisor Agent tools - Call to Conduct Research ──────────────────────────────╮
│ │
│ 🔧 Tool Call: ConductResearch │
│ Args: { │
│ "research_topic": "Identificar as melhores cafeterias de Madri, España, avaliando especificamente a │
│ qualidade do café servido. A pesquisa deve focar nos seguintes critérios técnicos prioritários: CRITÉRIOS DE │
│ AVALIAÇÃO PRIORITÁRIOS: 1. Origem e seleção dos grãos de café: Verificar se as cafeterias trabalham com cafés │
│ de origem única (single origin), blends especiais, certificações de qualidade, relacionamento direto com │
│ produtores, ou café de comércio justo/specialty coffee. 2. Métodos de torrefação: Identificar se possuem │
│ torrefação própria (in-house roasting), parceiros especializados, controle sobre o perfil de torra, e se │
│ comunicam transparentemente sobre o processo de torrefação. 3. Técnicas de preparo: Avaliar os métodos de │
│ extração utilizados (espresso, pour over, V60, Chemex, AeroPress, French Press, cold brew, etc.), equipamentos │
│ profissionais, baristas treinados e certificados, e consistência na preparação. 4. Avaliação sensorial: │
│ Buscar informações sobre o perfil sensorial do café (sabor, aroma, corpo, acidez), notas de degustação, │
│ complexidade, equilíbrio e qualidade geral da bebida conforme avaliado por especialistas e consumidores │
│ conhecedores. FONTES PREFERENCIAIS: - Sites oficiais e redes sociais das cafeterias (para informações sobre │
│ grãos, métodos, filosofia) - Avaliações de especialistas em café e críticos gastronômicos especializados - │
│ Plataformas reconhecidas de avaliações de consumidores (Google Reviews, TripAdvisor, The Fork, etc.) - Guias │
│ de café specialty e publicações especializadas em café - Blogs e artigos de especialistas em café de Madri - │
│ Priorizar conteúdo em espanhol ou português ASPECTOS SECUNDÁRIOS (não prioritários mas podem ser mencionados │
│ se relevantes): - Preço, localização, ambiente, decoração, atendimento, outros serviços OBJETIVO │
│ FINAL: Criar uma lista das melhores cafeterias de Madri focadas em qualidade de café, com informações │
│ detalhadas sobre cada estabelecimento baseadas nos critérios técnicos mencionados, permitindo uma comparação │
│ fundamentada da qualidade do café oferecido em cada local." │
│ } │
│ ID: toolu_01Ckc628iu6oPgXqJqDhGv23 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────── 🔧 Supervisor Agent tools - Research iterations ────────────────────────────────╮
│ Research iterations: 2 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
>_ Output
			
╭───────────────────────────────── 🧑 Researcher Agent - Simulated Human Message ─────────────────────────────────╮
│ Identificar as melhores cafeterias de Madri, España, avaliando especificamente a qualidade do café servido. A │
│ pesquisa deve focar nos seguintes critérios técnicos prioritários: │
│ │
│ CRITÉRIOS DE AVALIAÇÃO PRIORITÁRIOS: │
│ 1. Origem e seleção dos grãos de café: Verificar se as cafeterias trabalham com cafés de origem única (single │
│ origin), blends especiais, certificações de qualidade, relacionamento direto com produtores, ou café de │
│ comércio justo/specialty coffee. │
│ │
│ 2. Métodos de torrefação: Identificar se possuem torrefação própria (in-house roasting), parceiros │
│ especializados, controle sobre o perfil de torra, e se comunicam transparentemente sobre o processo de │
│ torrefação. │
│ │
│ 3. Técnicas de preparo: Avaliar os métodos de extração utilizados (espresso, pour over, V60, Chemex, AeroPress, │
│ French Press, cold brew, etc.), equipamentos profissionais, baristas treinados e certificados, e consistência │
│ na preparação. │
│ │
│ 4. Avaliação sensorial: Buscar informações sobre o perfil sensorial do café (sabor, aroma, corpo, acidez), │
│ notas de degustação, complexidade, equilíbrio e qualidade geral da bebida conforme avaliado por especialistas e │
│ consumidores conhecedores. │
│ │
│ FONTES PREFERENCIAIS: │
│ - Sites oficiais e redes sociais das cafeterias (para informações sobre grãos, métodos, filosofia) │
│ - Avaliações de especialistas em café e críticos gastronômicos especializados │
│ - Plataformas reconhecidas de avaliações de consumidores (Google Reviews, TripAdvisor, The Fork, etc.) │
│ - Guias de café specialty e publicações especializadas em café │
│ - Blogs e artigos de especialistas em café de Madri │
│ - Priorizar conteúdo em espanhol ou português │
│ │
│ ASPECTOS SECUNDÁRIOS (não prioritários mas podem ser mencionados se relevantes): │
│ - Preço, localização, ambiente, decoração, atendimento, outros serviços │
│ │
│ OBJETIVO FINAL: │
│ Criar uma lista das melhores cafeterias de Madri focadas em qualidade de café, com informações detalhadas sobre │
│ cada estabelecimento baseadas nos critérios técnicos mencionados, permitindo uma comparação fundamentada da │
│ qualidade do café oferecido em cada local. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 4.6s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ Vou realizar uma pesquisa abrangente sobre as melhores cafeterias de Madri com foco na qualidade técnica do │
│ café. Começarei com buscas amplas sobre cafeterias specialty em Madri. │
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "mejores cafeterías specialty coffee Madrid calidad café origen granos" │
│ } │
│ ID: toolu_014UiRXGDCGe4nCR8HkPHVZn │
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "cafeterias torrefacción propia Madrid baristas profesionales métodos extracción" │
│ } │
│ ID: toolu_01RiW3A7r1wu7BrWn1Y4vXsF │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: tavily_search │
│ ID: toolu_014UiRXGDCGe4nCR8HkPHVZn │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "mejores cafeterías specialty coffee Madrid calidad café origen granos" │
│ } │
│ │
│ Tool Call 2: │
│ Name: tavily_search │
│ ID: toolu_01RiW3A7r1wu7BrWn1Y4vXsF │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "cafeterias torrefacción propia Madrid baristas profesionales métodos extracción" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 25.9s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: ▷ 10 Mejores Cafeterías de Especialidad 《 Madrid 》 --- │
│ URL: https://myspecialtycoffee.es/madrid/ │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ A página apresenta um guia detalhado das melhores cafeterias de especialidade em Madrid, destacando 10 │
│ estabelecimentos principais como HanSo Café, Toma Café, Misión Café, Hola Coffee, Ruda Café, Acid Café, Geisha │
│ Coffee, Santa Kafeina, The Fix e Cafelito. Cada café é descrito com sua localização, horário, preço médio, │
│ especialidades em métodos de preparo (como V60, Chemex, Aeropress, espresso), tipos de grãos (origem única, │
│ torrefação local e internacional), e ofertas gastronômicas complementares, incluindo opções veganas e produtos │
│ artesanais. A página também lista uma extensa seleção de outras cafeterias de especialidade em Madrid, │
│ reforçando a diversidade e qualidade da cena cafeeira local. Explica as qualidades do café de especialidade, │
│ enfatizando sua pureza, origem sustentável, perfil de sabor complexo e métodos de preparo precisos. Destaca │
│ Madrid como uma cidade vibrante que abraça a cultura do café de especialidade, com bairros como Malasaña e │
│ Chamberí sendo pontos-chave. Além do café, as cafeterias oferecem ambientes tranquilos, Wi-Fi, são pet-friendly │
...
│ una pastelería de muy alto nivel” en Obrar, Chamberí., “Si lo tomas espresso, pide que te lo hagan naked” en │
│ Ruda Café., “Hacen cursos de formación de baristas y tienen asesoría para emprender tu propio speciality │
│ coffee” en Hola Coffee., “Tras ver el documental Black Gold los actuales dueños se sensibilizaron con los │
│ problemas que acarrea la industria cafetera, y decidieron tener proveedores de comercio justo de Colombia, │
│ Guatemala o Etiopía” en Café Angélica. │
│ &lt;/key_excerpts&gt; │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 16.9s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: Cafeterías de especialidad en Madrid que deben visitar --- │
│ URL: https://sugarbmd.com/cafeterias-de-especialidad-en-madrid-que-deben-visitar/ │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ A página apresenta uma lista detalhada das principais cafeterias de especialidade em Madrid, destacando suas │
│ características únicas, localização e filosofia. Cada estabelecimento oferece cafés de alta qualidade, métodos │
│ de preparo variados e, frequentemente, uma oferta gastronômica complementar, como pasteleria artesanal e │
│ brunch. Entre os destaques estão ÖSS Kaffe, Libis Specialty Coffee, Masamune Coffee, Cafeteando, Ōfi Café, │
│ Geisha Specialty Coffee, Fanático by Cafés La Mexicana, Nica Specialty Coffee, Old School Bakehouse, Cafés │
│ Guayacán, Dosis Café, Drømme Kaffe House, Siniestro Café, Quinto Café, 1000 Cups Specialty Coffee, Norah Coffee │
│ &amp; Brunch, Faraday Madrid, Doku Toku Café, Infinito Specialty Coffee and Brunch Bistro e Cosecha Bread &amp; Coffee. │
│ Além disso, o conteúdo menciona consultores e marcas digitais como Jonathan Vaz, Talento Coffee, Wake Up Coffee │
│ e Curador Coffee, que promovem a educação, sustentabilidade e inovação no consumo de café. A página enfatiza a │
│ importância da qualidade, sustentabilidade, educação do consumidor e a experiência sensorial e cultural │
...
│ --- SOURCE 3: TOP 10 BEST Barista Coffee Shop in Madrid, Spain - Yelp --- │
│ URL: https://www.yelp.com/search?find_desc=Barista+Coffee+Shop&amp;find_loc=Madrid │
│ │
│ SUMMARY: │
│ 1. Toma Café. 4.4 (230 reviews). 0.5 mi. Calle de la Palma, 49, 28004 Madrid Spain · 2. Hola Coffee. 4.7 (22 │
│ reviews). 1.1 mi · 3. Waycup. 4.5 (2 reviews). 0.2 mi. │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 13.0s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": " Análise dos resultados da primeira busca: **Informações importantes │
│ encontradas:** 1. Identificei uma lista sólida de cafeterias specialty em Madrid, incluindo: HanSo Café, Toma │
│ Café, Misión Café, Hola Coffee, Ruda Café, Acid Café, Geisha Coffee, Santa Kafeina, The Fix, Cafelito, Café │
│ Angélica, Porte Coffee &amp; Cream, Braco Specialty Coffee, Dromme Kaffé House, Bô Specialty Coffee, Norah Coffee, │
│ Obrar, Bianchi Kiosko Caffé, ÖSS Kaffe, Libis, Masamune Coffee, Cafeteando, Ōfi Café, Fanático by Cafés La │
│ Mexicana, entre outros. 2. Informações técnicas relevantes encontradas: - **Torrefação própria**: Hola │
│ Coffee tem roastery próprio, The Fix é torrefador e distribuidor, Café Angélica torram à mão em pequenas │
│ tandas - **Origem dos grãos**: Mencionam cafés de origem única, pequenos produtores, comércio justo, países │
│ como Colômbia, Puerto Rico, Brasil, Kenia, Tanzania, Guatemala, Etiópia - **Métodos de preparo**: V60, Chemex, │
│ Aeropress, espresso, cafés filtrados - **Blends especiais**: Braco tem blend exclusivo de Brasil, Colômbia e │
│ Perú - **Formação**: Hola Coffee oferece cursos para baristas **Lacunas identificadas:** 1. Preciso de │
│ informações mais específicas sobre perfis sensoriais (notas de degustação, acidez, corpo) 2. Falta │
│ detalhamento sobre equipamentos profissionais utilizados 3. Preciso de mais informações sobre certificações e │
│ relacionamento direto com produtores 4. Necessito de avaliações mais específicas de especialistas e críticos │
│ gastronômicos 5. Faltam detalhes sobre processos de torrefação e perfis de torra **Decisão │
│ estratégica:** Vou fazer buscas mais específicas focando em: 1. Avaliações detalhadas e rankings de │
│ especialistas 2. Informações técnicas sobre torrefação e métodos específicos de algumas das principais │
│ cafeterias identificadas 3. Perfis sensoriais e avaliações especializadas Ainda tenho margem para 3-4 │
│ buscas adicionais antes de atingir o limite para consultas complexas. " │
│ } │
│ ID: toolu_01UVpx1NJEajc2BPu5xh6HCz │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: think_tool │
│ ID: toolu_01UVpx1NJEajc2BPu5xh6HCz │
│ Type: tool_call │
│ Args: │
│ { │
│ "reflection": " Análise dos resultados da primeira busca: **Informações importantes │
│ encontradas:** 1. Identificei uma lista sólida de cafeterias specialty em Madrid, incluindo: HanSo Café, Toma │
│ Café, Misión Café, Hola Coffee, Ruda Café, Acid Café, Geisha Coffee, Santa Kafeina, The Fix, Cafelito, Café │
│ Angélica, Porte Coffee &amp; Cream, Braco Specialty Coffee, Dromme Kaffé House, Bô Specialty Coffee, Norah Coffee, │
│ Obrar, Bianchi Kiosko Caffé, ÖSS Kaffe, Libis, Masamune Coffee, Cafeteando, Ōfi Café, Fanático by Cafés La │
│ Mexicana, entre outros. 2. Informações técnicas relevantes encontradas: - **Torrefação própria**: Hola │
│ Coffee tem roastery próprio, The Fix é torrefador e distribuidor, Café Angélica torram à mão em pequenas │
│ tandas - **Origem dos grãos**: Mencionam cafés de origem única, pequenos produtores, comércio justo, países │
│ como Colômbia, Puerto Rico, Brasil, Kenia, Tanzania, Guatemala, Etiópia - **Métodos de preparo**: V60, Chemex, │
│ Aeropress, espresso, cafés filtrados - **Blends especiais**: Braco tem blend exclusivo de Brasil, Colômbia e │
│ Perú - **Formação**: Hola Coffee oferece cursos para baristas **Lacunas identificadas:** 1. Preciso de │
│ informações mais específicas sobre perfis sensoriais (notas de degustação, acidez, corpo) 2. Falta │
│ detalhamento sobre equipamentos profissionais utilizados 3. Preciso de mais informações sobre certificações e │
│ relacionamento direto com produtores 4. Necessito de avaliações mais específicas de especialistas e críticos │
│ gastronômicos 5. Faltam detalhes sobre processos de torrefação e perfis de torra **Decisão │
│ estratégica:** Vou fazer buscas mais específicas focando em: 1. Avaliações detalhadas e rankings de │
│ especialistas 2. Informações técnicas sobre torrefação e métodos específicos de algumas das principais │
│ cafeterias identificadas 3. Perfis sensoriais e avaliações especializadas Ainda tenho margem para 3-4 │
│ buscas adicionais antes de atingir o limite para consultas complexas. " │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 0.0s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Reflection recorded: │
│ Análise dos resultados da primeira busca: │
│ │
│ **Informações importantes encontradas:** │
│ 1. Identificei uma lista sólida de cafeterias specialty em Madrid, incluindo: HanSo Café, Toma Café, Misión │
│ Café, Hola Coffee, Ruda Café, Acid Café, Geisha Coffee, Santa Kafeina, The Fix, Cafelito, Café Angélica, Porte │
│ Coffee &amp; Cream, Braco Specialty Coffee, Dromme Kaffé House, Bô Specialty Coffee, Norah Coffee, Obrar, Bianchi │
│ Kiosko Caffé, ÖSS Kaffe, Libis, Masamune Coffee, Cafeteando, Ōfi Café, Fanático by Cafés La Mexicana, entre │
│ outros. │
│ │
│ 2. Informações técnicas relevantes encontradas: │
│ - **Torrefação própria**: Hola Coffee tem roastery próprio, The Fix é torrefador e distribuidor, Café Angélica │
│ torram à mão em pequenas tandas │
│ - **Origem dos grãos**: Mencionam cafés de origem única, pequenos produtores, comércio justo, países como │
│ Colômbia, Puerto Rico, Brasil, Kenia, Tanzania, Guatemala, Etiópia │
│ - **Métodos de preparo**: V60, Chemex, Aeropress, espresso, cafés filtrados │
│ - **Blends especiais**: Braco tem blend exclusivo de Brasil, Colômbia e Perú │
│ - **Formação**: Hola Coffee oferece cursos para baristas │
│ │
│ **Lacunas identificadas:** │
│ 1. Preciso de informações mais específicas sobre perfis sensoriais (notas de degustação, acidez, corpo) │
│ 2. Falta detalhamento sobre equipamentos profissionais utilizados │
│ 3. Preciso de mais informações sobre certificações e relacionamento direto com produtores │
│ 4. Necessito de avaliações mais específicas de especialistas e críticos gastronômicos │
│ 5. Faltam detalhes sobre processos de torrefação e perfis de torra │
│ │
│ **Decisão estratégica:** │
│ Vou fazer buscas mais específicas focando em: │
│ 1. Avaliações detalhadas e rankings de especialistas │
│ 2. Informações técnicas sobre torrefação e métodos específicos de algumas das principais cafeterias │
│ identificadas │
│ 3. Perfis sensoriais e avaliações especializadas │
│ │
│ Ainda tenho margem para 3-4 buscas adicionais antes de atingir o limite para consultas complexas. │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 4.3s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "Toma Café Hola Coffee HanSo Madrid torrefacción origen granos perfil notas degustación" │
│ } │
│ ID: toolu_015KxRuPtAt4gsHYzCtaUUxf │
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "mejores cafeterias Madrid 2024 2025 ranking críticos especialistas café specialty reviews" │
│ } │
│ ID: toolu_01SdQCcVr1XihT6j5RyipPei │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: tavily_search │
│ ID: toolu_015KxRuPtAt4gsHYzCtaUUxf │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "Toma Café Hola Coffee HanSo Madrid torrefacción origen granos perfil notas degustación" │
│ } │
│ │
│ Tool Call 2: │
│ Name: tavily_search │
│ ID: toolu_01SdQCcVr1XihT6j5RyipPei │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "mejores cafeterias Madrid 2024 2025 ranking críticos especialistas café specialty reviews" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 8.9s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: ▷ HANSO Café《 Cafés, Carta y Opiniones 》 - Specialty Coffee --- │
│ URL: https://myspecialtycoffee.es/madrid/hanso-cafe/ │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ HanSo Café es un establecimiento de café de especialidad en Madrid, con dos ubicaciones céntricas: Corre. Baja │
│ de San Pablo, 51 y Cost.ª de los Ángeles, 7. Abierto de lunes a viernes de 9:00 a 20:00 y fines de semana de │
│ 10:00 a 20:00, ofrece una experiencia acogedora y minimalista para amantes del café. Su menú incluye cafés de │
│ origen de Etiopía, Colombia y Burundi, preparados mediante métodos como espresso, V60 y AeroPress, además de │
│ bebidas alternativas como matcha latte y chai latte. Complementan la oferta con brunch y repostería artesanal, │
│ con opciones vegetarianas y posiblemente veganas. HanSo también vende accesorios para preparar café en casa, │
│ como AeroPress, V60 y molinillos Porlex Tall, disponibles en sus locales y tienda online. Organizan catas y │
│ talleres para fomentar la comunidad cafetera en Madrid. La reputación es excelente, con 4.5 estrellas en Google │
│ Maps y TripAdvisor, destacando la calidad del café, ambiente y atención. Se recomienda consultar su Instagram │
│ para novedades y ofertas. │
...
│ --- SOURCE 3: Hola Coffee - Facebook --- │
│ URL: https://www.facebook.com/holacoffeeroasters/ │
│ │
│ SUMMARY: │
│ Sin lugar a dudas es de los que te hacen cerrar los ojos y disfrutar Es dulce y jugoso, con notas a gominola de │
│ sandía, melón y ralladura de lima. Dulzura │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 6.1s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: Top 10 Best Coffee Shops in Madrid 2025 | Spain Cafe Guide --- │
│ URL: https://www.youtube.com/watch?v=WmE8eVinDlA │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ O vídeo "Top 10 Best Coffee Shops in Madrid 2025 | Spain Cafe Guide", publicado pelo canal Trip Xtreme em 16 de │
│ janeiro de 2024, apresenta um guia detalhado das dez melhores cafeterias de Madrid, destacando a diversidade e │
│ riqueza da cultura cafeeira da cidade. O conteúdo explora desde estabelecimentos com decoração vintage e │
│ industrial até cafés modernos e minimalistas, enfatizando a qualidade do café, o ambiente e as opções │
│ gastronômicas oferecidas. Entre os cafés listados estão Mur Cafe, Pum Pum Cafe, Cafelito, Cafés Tornasol, Café │
│ de la Luz, Lolina Vintage Cafe, Nomade Cafe, HanSo Café, Misión Café e o Café de Oriente, este último situado │
│ próximo ao Palácio Real e conhecido por sua história e culinária francesa contemporânea. O vídeo também │
│ menciona especialidades como cafés com grãos importados, opções veganas e vegetarianas, brunches variados, │
│ coquetéis de café e ambientes que vão do tradicional ao moderno. O guia serve como um convite para explorar a │
│ cena cafeeira madrilena, combinando sabores, história e atmosfera única em cada local. │
...
│ --- SOURCE 3: THE 10 BEST Cafés in Madrid (Updated 2025) - Tripadvisor --- │
│ URL: https://www.tripadvisor.com/Restaurants-g187514-c8-Madrid.html │
│ │
│ SUMMARY: │
│ Cafés in Madrid ; 1. Crema Y Nata · (156 reviews) · Phenomenal food and tea! ; 2. Motteau · (318 reviews) · │
│ Excellent cakes and coffee provided │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 11.6s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": " Análise da segunda rodada de buscas: **Novas informações importantes:** 1. **HanSo │
│ Café**: Grãos de origem de Etiopía, Colômbia e Burundi; métodos espresso, V60 e AeroPress; 4.5 estrelas no │
│ Google Maps e TripAdvisor; organizam catas e talleres; vendem equipamentos (AeroPress, V60, molinillos │
│ Porlex) 2. **Hola Coffee**: Grano Fazenda Serra de Brasil (Catuai Vermelho, proceso natural) com notas a fruta │
│ de hueso, chocolate; outro café com notas a gominola de sandía, melón e ralladura de lima - perfil dulce e │
│ jugoso 3. Rankings confirmam: Toma Café, Café de la Luz, Cafelito, Misión Café entre os mais citados **O │
│ que ainda falta:** 1. Informações mais detalhadas sobre The Fix, Café Angélica, Ruda Café, Misión Café 2. │
│ Mais detalhes sobre equipamentos profissionais utilizados (máquinas de espresso, molinillos) 3. Certificações │
│ específicas (SCA, Q-Grader, etc.) 4. Informações sobre tostadores parceiros **Avaliação de progresso:** - │
│ Já tenho uma lista sólida de pelo menos 15-20 cafeterias - Tenho informações sobre origem de grãos para várias │
│ delas - Tenho alguns perfis sensoriais específicos - Tenho informação sobre métodos de preparo - Já realizei │
│ 4 buscas **Decisão:** Vou fazer UMA última busca focada em obter informações mais específicas sobre as │
│ cafeterias que ainda têm lacunas e sobre torrefadores/tostadores de Madrid que fornecem para estas cafeterias. │
│ Depois disso, terei informação suficiente para compilar um relatório abrangente. " │
│ } │
│ ID: toolu_01PteCY3eAWMuAj9uMdKYtmF │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: think_tool │
│ ID: toolu_01PteCY3eAWMuAj9uMdKYtmF │
│ Type: tool_call │
│ Args: │
│ { │
│ "reflection": " Análise da segunda rodada de buscas: **Novas informações importantes:** 1. **HanSo │
│ Café**: Grãos de origem de Etiopía, Colômbia e Burundi; métodos espresso, V60 e AeroPress; 4.5 estrelas no │
│ Google Maps e TripAdvisor; organizam catas e talleres; vendem equipamentos (AeroPress, V60, molinillos │
│ Porlex) 2. **Hola Coffee**: Grano Fazenda Serra de Brasil (Catuai Vermelho, proceso natural) com notas a fruta │
│ de hueso, chocolate; outro café com notas a gominola de sandía, melón e ralladura de lima - perfil dulce e │
│ jugoso 3. Rankings confirmam: Toma Café, Café de la Luz, Cafelito, Misión Café entre os mais citados **O │
│ que ainda falta:** 1. Informações mais detalhadas sobre The Fix, Café Angélica, Ruda Café, Misión Café 2. │
│ Mais detalhes sobre equipamentos profissionais utilizados (máquinas de espresso, molinillos) 3. Certificações │
│ específicas (SCA, Q-Grader, etc.) 4. Informações sobre tostadores parceiros **Avaliação de progresso:** - │
│ Já tenho uma lista sólida de pelo menos 15-20 cafeterias - Tenho informações sobre origem de grãos para várias │
│ delas - Tenho alguns perfis sensoriais específicos - Tenho informação sobre métodos de preparo - Já realizei │
│ 4 buscas **Decisão:** Vou fazer UMA última busca focada em obter informações mais específicas sobre as │
│ cafeterias que ainda têm lacunas e sobre torrefadores/tostadores de Madrid que fornecem para estas cafeterias. │
│ Depois disso, terei informação suficiente para compilar um relatório abrangente. " │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 0.0s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Reflection recorded: │
│ Análise da segunda rodada de buscas: │
│ │
│ **Novas informações importantes:** │
│ 1. **HanSo Café**: Grãos de origem de Etiopía, Colômbia e Burundi; métodos espresso, V60 e AeroPress; 4.5 │
│ estrelas no Google Maps e TripAdvisor; organizam catas e talleres; vendem equipamentos (AeroPress, V60, │
│ molinillos Porlex) │
│ 2. **Hola Coffee**: Grano Fazenda Serra de Brasil (Catuai Vermelho, proceso natural) com notas a fruta de │
│ hueso, chocolate; outro café com notas a gominola de sandía, melón e ralladura de lima - perfil dulce e jugoso │
│ 3. Rankings confirmam: Toma Café, Café de la Luz, Cafelito, Misión Café entre os mais citados │
│ │
│ **O que ainda falta:** │
│ 1. Informações mais detalhadas sobre The Fix, Café Angélica, Ruda Café, Misión Café │
│ 2. Mais detalhes sobre equipamentos profissionais utilizados (máquinas de espresso, molinillos) │
│ 3. Certificações específicas (SCA, Q-Grader, etc.) │
│ 4. Informações sobre tostadores parceiros │
│ │
│ **Avaliação de progresso:** │
│ - Já tenho uma lista sólida de pelo menos 15-20 cafeterias │
│ - Tenho informações sobre origem de grãos para várias delas │
│ - Tenho alguns perfis sensoriais específicos │
│ - Tenho informação sobre métodos de preparo │
│ - Já realizei 4 buscas │
│ │
│ **Decisão:** │
│ Vou fazer UMA última busca focada em obter informações mais específicas sobre as cafeterias que ainda têm │
│ lacunas e sobre torrefadores/tostadores de Madrid que fornecem para estas cafeterias. Depois disso, terei │
│ informação suficiente para compilar um relatório abrangente. │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 2.8s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: tavily_search │
│ Args: { │
│ "query": "Misión Café Ruda Café The Fix Café Angélica Madrid tostadores equipamiento baristas specialty" │
│ } │
│ ID: toolu_01BDgEamPP3UoyEBN7zjc8Xg │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: tavily_search │
│ ID: toolu_01BDgEamPP3UoyEBN7zjc8Xg │
│ Type: tool_call │
│ Args: │
│ { │
│ "query": "Misión Café Ruda Café The Fix Café Angélica Madrid tostadores equipamiento baristas specialty" │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 9.4s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Search results: │
│ │
│ │
│ │
│ --- SOURCE 1: Ruda Cafe La latina --- │
│ URL: https://rudacafe.com/ │
│ │
│ SUMMARY: │
│ &lt;summary&gt; │
│ Ruda Café é uma pequena cafeteria de especialidade localizada no bairro La Latina, em Madrid, próxima ao metrô │
│ La Latina e ao famoso Rastro. Aberta de segunda a sexta das 8h às 20h e aos fins de semana das 9h às 20h, │
│ oferece cafés 100% Arábica de diversas origens, preparados com atenção ao detalhe, além de uma variedade de │
│ chás e doces caseiros, incluindo opções veganas e sem açúcar. O ambiente é acolhedor, ideal para quem deseja um │
│ café para levar ou um ponto de encontro para amantes do café. A carta inclui espresso, bebidas com leite │
│ fresco, cafés especiais preparados semanalmente em métodos como V60, Aeropress e Batchbrew, além de uma seleção │
│ de chás que vão do sencha japonês ao clássico pu erh. A cafeteria valoriza a qualidade e o atendimento │
│ profissional e simpático. Contato e endereço: Calle Ruda 11, 28005 Madrid, telefone 910 465 932, e-mail │
│ info@rudacafe.com. Também possui loja online aberta 24 horas. │
│ &lt;/summary&gt; │
...
│ --- SOURCE 3: The Fix Coffee Roasters (@thefixcoffeeroasters) · Madrid - Instagram --- │
│ URL: https://www.instagram.com/thefixcoffeeroasters/?hl=en │
│ │
│ SUMMARY: │
│ THE FIX COFFEE ROASTER | Madrid Este nuevo espacio no es solo un tostador: es un punto de encuentro para │
│ quienes disfrutan el café como una forma de expresión. │
│ │
│ -------------------------------------------------------------------------------- │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 11.0s
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": " Análise da quinta busca: **Novas informações obtidas:** 1. **Ruda Café**: 100% │
│ Arábica de distintas procedências, métodos V60, Aeropress e Batchbrew, café semanal rotativo, baristas │
│ profesionales, localização em La Latina próximo ao Rastro, doces caseiros incluindo opções veganas 2. **Misión │
│ Café**: Localização na Calle Reyes 5, horários L-V 8:30-20h / S-D 9-20h, parceria com Misión Bakehouse 3. │
│ **The Fix Coffee Roasters**: É torrefador próprio (roastery), espaço que funciona como ponto de │
│ encontro **Avaliação final:** Já realizei 5 buscas e coletei informações substanciais sobre: - Mais de 20 │
│ cafeterias de especialidade em Madrid - Informações específicas sobre origem de grãos (Etiópia, Colômbia, │
│ Brasil, Burundi, Kenia, Tanzania, Guatemala, Puerto Rico, Perú) - Métodos de preparo (V60, Chemex, AeroPress, │
│ espresso, Batchbrew, French Press, cold brew) - Torrefação própria (Hola Coffee, The Fix, Café Angélica) - │
│ Perfis sensoriais específicos de alguns cafés - Avaliações e rankings - Comércio justo e relacionamento com │
│ pequenos produtores **Decisão final:** Tenho informação suficiente para criar um relatório abrangente das │
│ melhores cafeterias de Madrid focado nos critérios técnicos solicitados. Embora pudesse buscar mais detalhes │
│ sobre equipamentos específicos ou certificações, já possuo uma base sólida que permite uma comparação │
│ fundamentada. Vou parar aqui e compilar o relatório final. " │
│ } │
│ ID: toolu_01LdoQxsJy1hysu2JHsd7Bqz │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────── 🔧 Researcher Agent - Should continue ─────────────────────────────────────╮
│ Last message contains tool calls. Continuing to tool execution... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭─────────────────────────────────────── 🔧 Researcher Agent - Tool calls ────────────────────────────────────────╮
│ Tool Call Name: Tool Calls │
│ ID: tool_call_id │
│ │
│ Tool Call 1: │
│ Name: think_tool │
│ ID: toolu_01LdoQxsJy1hysu2JHsd7Bqz │
│ Type: tool_call │
│ Args: │
│ { │
│ "reflection": " Análise da quinta busca: **Novas informações obtidas:** 1. **Ruda Café**: 100% │
│ Arábica de distintas procedências, métodos V60, Aeropress e Batchbrew, café semanal rotativo, baristas │
│ profesionales, localização em La Latina próximo ao Rastro, doces caseiros incluindo opções veganas 2. **Misión │
│ Café**: Localização na Calle Reyes 5, horários L-V 8:30-20h / S-D 9-20h, parceria com Misión Bakehouse 3. │
│ **The Fix Coffee Roasters**: É torrefador próprio (roastery), espaço que funciona como ponto de │
│ encontro **Avaliação final:** Já realizei 5 buscas e coletei informações substanciais sobre: - Mais de 20 │
│ cafeterias de especialidade em Madrid - Informações específicas sobre origem de grãos (Etiópia, Colômbia, │
│ Brasil, Burundi, Kenia, Tanzania, Guatemala, Puerto Rico, Perú) - Métodos de preparo (V60, Chemex, AeroPress, │
│ espresso, Batchbrew, French Press, cold brew) - Torrefação própria (Hola Coffee, The Fix, Café Angélica) - │
│ Perfis sensoriais específicos de alguns cafés - Avaliações e rankings - Comércio justo e relacionamento com │
│ pequenos produtores **Decisão final:** Tenho informação suficiente para criar um relatório abrangente das │
│ melhores cafeterias de Madrid focado nos critérios técnicos solicitados. Embora pudesse buscar mais detalhes │
│ sobre equipamentos específicos ou certificações, já possuo uma base sólida que permite uma comparação │
│ fundamentada. Vou parar aqui e compilar o relatório final. " │
│ } │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 0.0s
>_ Output
			
╭──────────────────────────────────── 🔧 Researcher Agent - Tool calls result ────────────────────────────────────╮
│ Reflection recorded: │
│ Análise da quinta busca: │
│ │
│ **Novas informações obtidas:** │
│ 1. **Ruda Café**: 100% Arábica de distintas procedências, métodos V60, Aeropress e Batchbrew, café semanal │
│ rotativo, baristas profesionales, localização em La Latina próximo ao Rastro, doces caseiros incluindo opções │
│ veganas │
│ 2. **Misión Café**: Localização na Calle Reyes 5, horários L-V 8:30-20h / S-D 9-20h, parceria com Misión │
│ Bakehouse │
│ 3. **The Fix Coffee Roasters**: É torrefador próprio (roastery), espaço que funciona como ponto de encontro │
│ │
│ **Avaliação final:** │
│ Já realizei 5 buscas e coletei informações substanciais sobre: │
│ - Mais de 20 cafeterias de especialidade em Madrid │
│ - Informações específicas sobre origem de grãos (Etiópia, Colômbia, Brasil, Burundi, Kenia, Tanzania, │
│ Guatemala, Puerto Rico, Perú) │
│ - Métodos de preparo (V60, Chemex, AeroPress, espresso, Batchbrew, French Press, cold brew) │
│ - Torrefação própria (Hola Coffee, The Fix, Café Angélica) │
│ - Perfis sensoriais específicos de alguns cafés │
│ - Avaliações e rankings │
│ - Comércio justo e relacionamento com pequenos produtores │
│ │
│ **Decisão final:** │
│ Tenho informação suficiente para criar um relatório abrangente das melhores cafeterias de Madrid focado nos │
│ critérios técnicos solicitados. Embora pudesse buscar mais detalhes sobre equipamentos específicos ou │
│ certificações, já possuo uma base sólida que permite uma comparação fundamentada. Vou parar aqui e compilar o │
│ relatório final. │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Researcher agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 1:08.7
>_ Output
			
╭───────────────────────────────────────── 🤖 Researcher Agent response ──────────────────────────────────────────╮
│ --- │
│ │
│ # 🏆 AS MELHORES CAFETERIAS DE MADRI - ANÁLISE TÉCNICA DA QUALIDADE DO CAFÉ │
│ │
│ ## RESUMO EXECUTIVO │
│ │
│ Madrid consolidou-se como um destino de referência para café de especialidade (specialty coffee) na Europa, com │
│ dezenas de estabelecimentos que priorizam a qualidade do grão, a torrefação artesanal e técnicas de preparo │
│ profissionais. Esta pesquisa identificou mais de 20 cafeterias que se destacam pelos critérios técnicos │
│ avaliados. │
│ │
│ --- │
│ │
│ ## 🥇 TOP 10 - CAFETERIAS DE EXCELÊNCIA TÉCNICA │
│ │
│ ### 1. **HOLA COFFEE** ⭐⭐⭐⭐⭐ │
│ │
│ **🌍 ORIGEM E SELEÇÃO DOS GRÃOS (EXCELÊNCIA)** │
│ - **Torrefação própria (roastery)**: Possui roastery in-house │
...
│ ### **CHAMBERÍ** │
│ - Obrar ⭐⭐⭐⭐ │
│ │
│ ### **CENTRO** │
│ - Misión Café ⭐⭐⭐⭐ (Calle Reyes) │
│ │
│ --- │
│ │
│ ## 🔬 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────── 🔧 Researcher Agent - Should compress research ─────────────────────────────────╮
│ No tool calls found. Stopping research and compressing findings... │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Compressing Research:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 36.4s
>_ Output
			
╭─────────────────────────────────── 🤖 Researcher Agent - Compressed Research ───────────────────────────────────╮
│ **Lista de consultas e chamadas a ferramentas realizadas** │
│ │
│ 1. Pesquisa por “mejores cafeterías specialty coffee Madrid calidad café origen granos” │
│ 2. Pesquisa por “cafeterias torrefacción propia Madrid baristas profesionales métodos extracción” │
│ 3. Pesquisa por “Toma Café Hola Coffee HanSo Madrid torrefacción origen granos perfil notas degustación” │
│ 4. Pesquisa por “mejores cafeterias Madrid 2024 2025 ranking críticos especialistas café specialty reviews” │
│ 5. Pesquisa por “Misión Café Ruda Café The Fix Café Angélica Madrid tostadores equipamiento baristas specialty” │
│ │
│ --- │
│ │
│ **Resultados completos** │
│ │
│ - A página apresenta um guia detalhado das melhores cafeterias de especialidade em Madrid, destacando 10 │
│ estabelecimentos principais como HanSo Café, Toma Café, Misión Café, Hola Coffee, Ruda Café, Acid Café, Geisha │
│ Coffee, Santa Kafeina, The Fix e Cafelito. Cada café é descrito com sua localização, horário, preço médio, │
│ especialidades em métodos de preparo (como V60, Chemex, Aeropress, espresso), tipos de grãos (origem única, │
│ torrefação local e internacional), e ofertas gastronômicas complementares, incluindo opções veganas e produtos │
│ artesanais. A página também lista uma extensa seleção de outras cafeterias de especialidade em Madrid, │
│ reforçando a diversidade e qualidade da cena cafeeira local. Explica as qualidades do café de especialidade, │
...
│ [10] Top 10 Best Coffee Shops in Madrid 2025 | Spain Cafe Guide: https://www.youtube.com/watch?v=WmE8eVinDlA │
│ [11] Best Cafe Madrid, Spain - Last Updated November 2025 - Yelp: │
│ https://m.yelp.com/search?find_desc=best+cafe&amp;find_loc=Madrid │
│ [12] THE 10 BEST Cafés in Madrid (Updated 2025) - Tripadvisor: │
│ https://www.tripadvisor.com/Restaurants-g187514-c8-Madrid.html │
│ [13] Ruda Cafe La latina: https://rudacafe.com/ │
│ [14] Misión Café (@misioncafe) · Madrid - Instagram: https://www.instagram.com/misioncafe/?hl=en │
│ [15] The Fix Coffee Roasters (@thefixcoffeeroasters) · Madrid - Instagram: │
│ https://www.instagram.com/thefixcoffeeroasters/?hl=en │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Supervisor agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 23.8s
>_ Output
			
╭──────────────────────────────── 🤖 Supervisor Agent tools - Call to think tool ─────────────────────────────────╮
│ │
│ 🔧 Tool Call: think_tool │
│ Args: { │
│ "reflection": " Excelente! A pesquisa retornou informações muito ricas e detalhadas sobre as melhores │
│ cafeterias de especialidade em Madrid. Vou analisar o que foi encontrado: **INFORMAÇÕES COLETADAS:** 1. │
│ **Cafeterias Identificadas:** Lista extensa incluindo HanSo Café, Toma Café, Misión Café, Hola Coffee, Ruda │
│ Café, The Fix, Café Angélica, Braco Specialty Coffee, Dromme Kaffé House, Bô Specialty Coffee, Norah Coffee, │
│ Acid Café, Geisha Coffee, Santa Kafeina, Cafelito, entre outras. 2. **Origem e Seleção dos Grãos:** - │
│ HanSo Café: grãos de Etiópia, Colômbia e Burundi - Hola Coffee: cafés de pequenos produtores de Colômbia, │
│ Porto Rico, Brasil, Kenia, Tanzânia - possui roastery próprio - Café Angélica: comércio justo de Colômbia, │
│ Guatemala e Etiópia - Braco Specialty Coffee: blend exclusivo de Brasil, Colômbia e Peru - The Fix: │
│ também é torrefador e distribuidor - Ruda Café: 100% Arábica de diversas origens - Enfoque geral em │
│ cafés de origem única e torrefação artesanal 3. **Métodos de Torrefação:** - Café Angélica: torrefação │
│ manual em pequenos lotes - Hola Coffee: possui roastery próprio - The Fix: é torrefador (roaster) - │
│ Fanático by Cafés La Mexicana: compromisso com frescura - Muitos estabelecimentos trabalham com │
│ torrefadores locais e internacionais 4. **Técnicas de Preparo:** - HanSo Café: espresso, V60, │
│ AeroPress - Ruda Café: V60, Aeropress, Batchbrew, espresso "naked" - Menção frequente a: Chemex, pour │
│ over, cold brew, French Press - Baristas profissionais treinados - Hola Coffee: oferece cursos de │
│ formação para baristas 5. **Avaliação Sensorial:** - Fazenda Serra do Hola Coffee: notas a fruta de │
│ hueso, chocolate - Outro café do Hola: doce e jugoso, com notas a gominola de sandía, melón e ralladura de │
│ lima - ÖSS Kaffe: promove consumo sem açúcar para ressaltar notas naturais - Ênfase geral em perfis │
│ complexos e qualidade sensorial 6. **Fontes:** - Sites especializados em café (myspecialtycoffee.es, │
│ sugarbmd.com, madridsecreto.co) - Publicação HOLA (revista reconhecida) - Sites oficiais (Ruda Café, │
│ Mafrens, HanSo) - Instagram das cafeterias - Plataformas de avaliação: Google Reviews, TripAdvisor, │
│ Yelp - Conteúdo em espanhol predominante **GAPS IDENTIFICADOS:** - Poderia ter mais detalhes │
│ específicos sobre perfis sensoriais de cada cafeteria - Informações mais técnicas sobre equipamentos │
│ utilizados - Avaliações mais detalhadas de especialistas específicos **AVALIAÇÃO:** A pesquisa está muito │
│ completa e atende bem aos critérios solicitados: ✓ Identificou múltiplas cafeterias especializadas ✓ │
│ Informações sobre origem e seleção de grãos ✓ Métodos de torrefação (própria e parceiros) ✓ Técnicas de │
│ preparo variadas ✓ Algumas notas de degustação e avaliação sensorial ✓ Fontes em espanhol ✓ Mix de fontes │
│ oficiais, especialistas e plataformas de avaliação **DECISÃO:** Tenho informações suficientes para fornecer │
│ uma resposta abrangente e útil ao usuário. A pesquisa cobriu os critérios prioritários solicitados e │
│ identificou as principais cafeterias de qualidade em Madrid com detalhes técnicos relevantes. Vou finalizar a │
│ pesquisa chamando ResearchComplete. " │
│ } │
│ ID: toolu_01Bk8QrRfuMLbCkQP28KA1y5 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────── 🔧 Supervisor Agent tools - Research iterations ────────────────────────────────╮
│ Research iterations: 3 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────────── 🔧 Supervisor Agent - think tool result ────────────────────────────────────╮
│ Reflection recorded: │
│ Excelente! A pesquisa retornou informações muito ricas e detalhadas sobre as melhores cafeterias de │
│ especialidade em Madrid. Vou analisar o que foi encontrado: │
│ │
│ **INFORMAÇÕES COLETADAS:** │
│ │
│ 1. **Cafeterias Identificadas:** Lista extensa incluindo HanSo Café, Toma Café, Misión Café, Hola Coffee, Ruda │
│ Café, The Fix, Café Angélica, Braco Specialty Coffee, Dromme Kaffé House, Bô Specialty Coffee, Norah Coffee, │
│ Acid Café, Geisha Coffee, Santa Kafeina, Cafelito, entre outras. │
│ │
│ 2. **Origem e Seleção dos Grãos:** │
│ - HanSo Café: grãos de Etiópia, Colômbia e Burundi │
│ - Hola Coffee: cafés de pequenos produtores de Colômbia, Porto Rico, Brasil, Kenia, Tanzânia - possui │
│ roastery próprio │
│ - Café Angélica: comércio justo de Colômbia, Guatemala e Etiópia │
│ - Braco Specialty Coffee: blend exclusivo de Brasil, Colômbia e Peru │
│ - The Fix: também é torrefador e distribuidor │
│ - Ruda Café: 100% Arábica de diversas origens │
│ - Enfoque geral em cafés de origem única e torrefação artesanal │
...
│ ✓ Algumas notas de degustação e avaliação sensorial │
│ ✓ Fontes em espanhol │
│ ✓ Mix de fontes oficiais, especialistas e plataformas de avaliação │
│ │
│ **DECISÃO:** │
│ Tenho informações suficientes para fornecer uma resposta abrangente e útil ao usuário. A pesquisa cobriu os │
│ critérios prioritários solicitados e identificou as principais cafeterias de qualidade em Madrid com detalhes │
│ técnicos relevantes. Vou finalizar a pesquisa chamando ResearchComplete. │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Supervisor agent:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 2.3s
>_ Output
			
╭──────────────────────────────────── 🤖 Supervisor Agent tools - Tool Calls ─────────────────────────────────────╮
│ │
│ 🔧 Tool Call: ResearchComplete │
│ Args: {} │
│ ID: toolu_018E1YkMBrHJHgfjnb3Bt5Hk │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭──────────────────────────────── 🔧 Supervisor Agent tools - Research iterations ────────────────────────────────╮
│ Research iterations: 4 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
╭───────────────────────────────────────────── 🔧 Research complete ─────────────────────────────────────────────╮
│ Exceeded iterations or no tool calls or research complete. Ending supervisor... Research iterations: 4 and │
│ supervisor messages: [HumanMessage(content='Quero identificar as melhores cafeterias de Madri avaliando │
│ especificamente a qualidade do café servido. Para isso, desejo que a pesquisa considere fatores como a origem e │
│ seleção dos grãos, métodos de torrefação, técnicas de preparo e avaliação sensorial (sabor, aroma, corpo e │
│ acidez) do café oferecido em cada estabelecimento. Não especifiquei preferências quanto a preço, localização, │
│ ambiente ou outros serviços, portanto, esses aspectos podem ser tratados como flexíveis ou secundários. │
│ Priorize fontes oficiais das cafeterias, avaliações de especialistas em café e plataformas reconhecidas por │
│ avaliações de consumidores, preferencialmente em espanhol ou português..', additional_kwargs={}, │
│ response_metadata={}, id='3a867f3a-eec5-4a3e-9478-4b3746e3a569'), AIMessage(content=[{'id': │
│ 'toolu_01TpMrafwRYTuXhcJRF5PNUP', 'input': {'reflection': ' Analisando a solicitação do usuário, preciso │
│ identificar as melhores cafeterias de Madri com foco específico na qualidade do café. Os critérios prioritários │
│ são: 1. Origem e seleção dos grãos de café 2. Métodos de torrefação 3. Técnicas de preparo 4. Avaliação │
│ sensorial (sabor, aroma, corpo e acidez) Aspectos secundários: preço, localização, ambiente, outros │
│ serviços. Fontes preferenciais: - Fontes oficiais das cafeterias (sites, redes sociais) - Avaliações de │
│ especialistas em café - Plataformas reconhecidas de avaliações de consumidores - Idiomas: espanhol ou │
│ português Esta é uma pesquisa que pode ser tratada como uma única tarefa integrada, pois: - Foca em um │
│ único mercado geográfico (Madri) - Tem critérios de avaliação bem definidos e interconectados - Requer │
│ análise comparativa das cafeterias baseada nos mesmos parâmetros - Um único agente pode fazer uma pesquisa │
│ mais coesa e comparativa Vou delegar esta pesquisa a um único subagente especializado que poderá: - │
...
│ 'tool_use'}], additional_kwargs={}, response_metadata={'id': 'msg_01Rtopy6qvfgskhpzjGzxjZ3', 'model': │
│ 'claude-sonnet-4-5-20250929', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'cache_creation': │
│ {'ephemeral_1h_input_tokens': 0, 'ephemeral_5m_input_tokens': 0}, 'cache_creation_input_tokens': 0, │
│ 'cache_read_input_tokens': 0, 'input_tokens': 11697, 'output_tokens': 36, 'server_tool_use': None, │
│ 'service_tier': 'standard'}, 'model_name': 'claude-sonnet-4-5-20250929', 'model_provider': 'anthropic'}, │
│ id='lc_run--7af3c566-939a-4ea8-8ea5-744c4c7b283f-0', tool_calls=[{'name': 'ResearchComplete', 'args': {}, 'id': │
│ 'toolu_018E1YkMBrHJHgfjnb3Bt5Hk', 'type': 'tool_call'}], usage_metadata={'input_tokens': 11697, │
│ 'output_tokens': 36, 'total_tokens': 11733, 'input_token_details': {'cache_read': 0, 'cache_creation': 0, │
│ 'ephemeral_5m_input_tokens': 0, 'ephemeral_1h_input_tokens': 0}})] │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
>_ Output
			
⏳ Writer agent - Final report generation:
|▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| in 31.0s
>_ Output
			
╭──────────────────────────────────────── 🤖 Writer Agent - Final Report ─────────────────────────────────────────╮
│ # Melhores Cafeterias de Madrid: Foco na Qualidade do Café │
│ │
│ ## Introdução │
│ │
│ A cena cafeeira de Madrid evoluiu significativamente nos últimos anos, consolidando-se como referência em cafés │
│ de especialidade. A cidade abriga uma variedade de cafeterias que priorizam a excelência do café, desde a │
│ seleção dos grãos até a experiência sensorial na xícara. Este relatório apresenta uma análise detalhada das │
│ melhores cafeterias de Madrid, avaliando critérios como origem e seleção dos grãos, métodos de torrefação, │
│ técnicas de preparo e avaliação sensorial, com base em fontes oficiais, avaliações de especialistas e │
│ plataformas reconhecidas. │
│ │
│ ## Critérios de Avaliação │
│ │
│ - **Origem e Seleção dos Grãos:** Preferência por cafés de origem única, de pequenos produtores, com práticas │
│ de comércio justo e rastreabilidade. │
│ - **Métodos de Torrefação:** Torrefação própria ou parceria com torrefadores artesanais, priorizando frescor e │
│ perfis sensoriais complexos. │
│ - **Técnicas de Preparo:** Variedade de métodos (espresso, V60, Aeropress, Chemex, etc.), baristas treinados e │
│ atenção ao detalhe. │
...
│ [10] Top 10 Best Coffee Shops in Madrid 2025 | Spain Cafe Guide: https://www.youtube.com/watch?v=WmE8eVinDlA │
│ [11] Best Cafe Madrid, Spain - Last Updated November 2025 - Yelp: │
│ https://m.yelp.com/search?find_desc=best+cafe&amp;find_loc=Madrid │
│ [12] THE 10 BEST Cafés in Madrid (Updated 2025) - Tripadvisor: │
│ https://www.tripadvisor.com/Restaurants-g187514-c8-Madrid.html │
│ [13] Ruda Cafe La latina: https://rudacafe.com/ │
│ [14] Misión Café (@misioncafe) · Madrid - Instagram: https://www.instagram.com/misioncafe/?hl=en │
│ [15] The Fix Coffee Roasters (@thefixcoffeeroasters) · Madrid - Instagram: │
│ https://www.instagram.com/thefixcoffeeroasters/?hl=en │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

Como vemos agora, o agente completo foi executado: primeiro, nos perguntou sobre o que queremos investigar, depois solicitou mais informações para realizar a pesquisa, em seguida entrou em ação o agente Supervisor para conduzir a investigação, gerando um relatório, e por fim entrou o agente Writer para gerar o relatório final de uma forma que seja confortável para o usuário ler.

Como o agente Writer gera o relatório em formato Markdown, mostramos com o seguinte código:

	
< > Input
Python
from rich.markdown import Markdown
Markdown(result["final_report"])
Copied
>_ Output
			
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Melhores Cafeterias de Madrid: Foco na Qualidade do Café ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
Introdução
A cena cafeeira de Madrid evoluiu significativamente nos últimos anos, consolidando-se como referência em cafés de
especialidade. A cidade abriga uma variedade de cafeterias que priorizam a excelência do café, desde a seleção dos
grãos até a experiência sensorial na xícara. Este relatório apresenta uma análise detalhada das melhores cafeterias
de Madrid, avaliando critérios como origem e seleção dos grãos, métodos de torrefação, técnicas de preparo e
avaliação sensorial, com base em fontes oficiais, avaliações de especialistas e plataformas reconhecidas.
Critérios de Avaliação
• Origem e Seleção dos Grãos: Preferência por cafés de origem única, de pequenos produtores, com práticas de
comércio justo e rastreabilidade.
• Métodos de Torrefação: Torrefação própria ou parceria com torrefadores artesanais, priorizando frescor e perfis
sensoriais complexos.
• Técnicas de Preparo: Variedade de métodos (espresso, V60, Aeropress, Chemex, etc.), baristas treinados e atenção
ao detalhe.
• Avaliação Sensorial: Sabor, aroma, corpo e acidez destacados, com notas de degustação específicas e ênfase na
experiência sensorial.
Principais Cafeterias de Especialidade em Madrid
HanSo Café
...
[9] Hola Coffee - Facebook: https://www.facebook.com/holacoffeeroasters/
[10] Top 10 Best Coffee Shops in Madrid 2025 | Spain Cafe Guide: https://www.youtube.com/watch?v=WmE8eVinDlA
[11] Best Cafe Madrid, Spain - Last Updated November 2025 - Yelp:
https://m.yelp.com/search?find_desc=best+cafe&amp;find_loc=Madrid
[12] THE 10 BEST Cafés in Madrid (Updated 2025) - Tripadvisor:
https://www.tripadvisor.com/Restaurants-g187514-c8-Madrid.html
[13] Ruda Cafe La latina: https://rudacafe.com/
[14] Misión Café (@misioncafe) · Madrid - Instagram: https://www.instagram.com/misioncafe/?hl=en
[15] The Fix Coffee Roasters (@thefixcoffeeroasters) · Madrid - Instagram:
https://www.instagram.com/thefixcoffeeroasters/?hl=en

Conclusõeslink image 152

Vimos como desenvolver um agente de pesquisa profundo, que nos permite realizar pesquisas aprofundadas e gerar relatórios completos e detalhados.

Continuar lendo

Últimos posts -->

Você viu esses projetos?

Gymnasia

Gymnasia Gymnasia
React Native
Expo
TypeScript
FastAPI
Next.js
OpenAI
Anthropic

Aplicativo móvel de treino pessoal com assistente de IA, biblioteca de exercícios, acompanhamento de rotinas, dieta e medidas corporais

Horeca chatbot

Horeca chatbot Horeca chatbot
Python
LangChain
PostgreSQL
PGVector
React
Kubernetes
Docker
GitHub Actions

Chatbot conversacional para cozinheiros de hotéis e restaurantes. Um cozinheiro, gerente de cozinha ou serviço de quarto de um hotel ou restaurante pode falar com o chatbot para obter informações sobre receitas e menus. Mas também implementa agentes, com os quais pode editar ou criar novas receitas ou menus

Naviground

Naviground Naviground
Ver todos os projetos -->
>_ Disponível para projetos

Tem um projeto com IA?

Vamos conversar.

maximofn@gmail.com

Especialista em Machine Learning e Inteligência Artificial. Desenvolvo soluções com IA generativa, agentes inteligentes e modelos personalizados.

Quer assistir alguma palestra?

Últimas palestras -->

Quer melhorar com essas dicas?

Últimos tips -->

Use isso localmente

Os espaços do Hugging Face nos permitem executar modelos com demos muito simples, mas e se a demo quebrar? Ou se o usuário a deletar? Por isso, criei contêineres docker com alguns espaços interessantes, para poder usá-los localmente, aconteça o que acontecer. Na verdade, se você clicar em qualquer botão de visualização de projeto, ele pode levá-lo a um espaço que não funciona.

Flow edit

Flow edit Flow edit

Edite imagens com este modelo de Flow. Baseado em SD3 ou FLUX, você pode editar qualquer imagem e gerar novas

FLUX.1-RealismLora

FLUX.1-RealismLora FLUX.1-RealismLora
Ver todos os contêineres -->
>_ Disponível para projetos

Tem um projeto com IA?

Vamos conversar.

maximofn@gmail.com

Especialista em Machine Learning e Inteligência Artificial. Desenvolvo soluções com IA generativa, agentes inteligentes e modelos personalizados.

Você quer treinar seu modelo com esses datasets?

short-jokes-dataset

HuggingFace

Dataset com piadas em inglês

Uso: Fine-tuning de modelos de geração de texto humorístico

231K linhas 2 colunas 45 MB
Ver no HuggingFace →

opus100

HuggingFace

Dataset com traduções de inglês para espanhol

Uso: Treinamento de modelos de tradução inglês-espanhol

1M linhas 2 colunas 210 MB
Ver no HuggingFace →

netflix_titles

HuggingFace

Dataset com filmes e séries da Netflix

Uso: Análise de catálogo Netflix e sistemas de recomendação

8.8K linhas 12 colunas 3.5 MB
Ver no HuggingFace →
Ver mais datasets -->