Pular para o conteúdo principal

Tutorial Mercury 3: construindo um assistente de análise de incidentes em tempo real

Aprenda como o Mercury 3 usa geração baseada em difusão para criar um assistente de análise de incidentes, visualizar estados de refinamento e comparar esforço de raciocínio baixo vs. alto.
· 11 min leer

Explore com IA

Mercury 3 é um Large Language Model por difusão da Inception.ai. Diferente dos LLMs autorregressivos convencionais que geram texto um token por vez, o Mercury usa difusão para refinar iterativamente várias partes da resposta. O modelo supera o GPT-6 Luna e o Claude Haiku 5.5, rodando de 4 a 8 vezes mais rápido a 1.000+ tokens por segundo em GPUs NVIDIA e com janela de contexto de 1M de tokens.

Neste tutorial, vamos construir um pequeno assistente de análise de incidentes que recebe logs de aplicação, informações de deploy, métricas de GPU e traces de requisição. Depois, vamos usar essa mesma tarefa para explorar duas propriedades do Mercury 3:

  • Como o streaming por difusão é diferente do streaming tradicional de LLM

  • O que muda quando aumentamos o reasoning_effort de baixo para alto?

No caminho, também vamos esbarrar em uma questão importante de orçamento de tokens que faz diferença ao usar os modos de raciocínio do Mercury. Ao final, você vai saber como:

  • Chamar o Mercury 3 usando o SDK Python da Inception.
  • Entender a diferença básica entre geração por difusão e autorregressiva.
  • Construir um fluxo de análise de suporte.
  • Fazer streaming de respostas no modo normal e com difusão ativada.
  • Inspecionar como o Mercury reescreve uma resposta entre estados de difusão.
  • Interpretar corretamente o uso de tokens de raciocínio e a latência.

Código completo no repositório.

O que é o Mercury 3?

Diferente dos LLMs autorregressivos convencionais que geram uma resposta estritamente da esquerda para a direita, o Mercury faz parte de uma família de modelos que refinam iterativamente várias posições de tokens durante a geração. A abordagem da Inception é ideal para workloads sensíveis a latência, como agentes, busca, suporte ao cliente, educação e outras aplicações em que chamadas repetidas ao modelo se acumulam rapidamente.

O Mercury 3 combina esse processo de geração por difusão com capacidades esperadas de um modelo de API de uso geral, incluindo entrada de longo contexto, controles de raciocínio, chamada de ferramentas, saídas estruturadas e endpoints compatíveis com OpenAI. Ele também oferece um modo de streaming diffusing=True que permite aos aplicativos receber os estados intermediários de refinamento de texto completo do modelo, em vez de apenas blocos de saída anexados ao final.

No momento da escrita, o Mercury 3 oferece suporte ao seguinte:

Propriedade

Mercury 3

Janela de contexto

1M tokens

Saída máxima

131.072 tokens

Esforço de raciocínio

instant, low, medium, high

Chamada de ferramentas

Suportado

Saída estruturada

Suportado

Streaming

Suportado

Streaming por difusão

Suportado

Temperatura

0,5–1,0

API

Compatível com OpenAI

A Inception atualmente lista o Mercury 3 com preço de lançamento de US$ 0,10 por milhão de tokens de entrada, US$ 0,01 por milhão de tokens de entrada em cache e US$ 0,35 por milhão de tokens de saída. Os tokens em cache têm 90% de desconto no preço de entrada.

O Mercury 3 é 40x maior que o Mercury 1 e muito mais inteligente, sem perder velocidade.

Qualidade do modelo vs. tamanho do modelo

Figura: qualidade do modelo vs. tamanho do modelo (Fonte)

Como o Mercury 3 funciona?

A maioria dos LLMs gera texto de forma autorregressiva da esquerda para a direita, um token por vez. Veja como LLMs tradicionais geram texto:

The
The server
The server is
The server is overloaded

Cada novo token depende de tudo que foi gerado antes.

O Mercury usa difusão no lugar disso.

A Inception descreve seus LLMs de difusão como modelos baseados em Transformer que aprimoram progressivamente uma saída ao modificar vários tokens em paralelo. Pesquisas anteriores sobre o Mercury descrevem isso como um processo de geração do grosso para o detalhe, em vez de uma previsão estritamente da esquerda para a direita do próximo token. 

Uma ilustração simplificada poderia ser assim:

Este é apenas um exemplo conceitual, não a representação interna exata do Mercury 3.

A API da Inception pode expor esses estados intermediários. Com o streaming normal, o Mercury retorna blocos de texto refinados que podem ser anexados à resposta. Com diffusing=True, cada chunk passa a conter a versão completa atual da resposta conforme o modelo a refina.

Daqui a pouco vamos ver a diferença.

Demo: criando um assistente de escalonamento de suporte em tempo real

Antes de montar a demo, vamos separar as configurações do modelo do próprio aplicativo de suporte.

O caso de suporte é apenas o input que usamos para exercitar o Mercury 3. Os controles importantes do lado do modelo são o orçamento de raciocínio, o orçamento de conclusão e o modo de streaming.

Configuração

Valor usado

Por que importa

Temperatura

0,75

Mantida fixa para não mudar a amostragem ao comparar os modos

Esforço de raciocínio

low, high

Permite comparar uso de raciocínio oculto e latência

Orçamento de conclusão

8192

Grande o suficiente para as execuções medidas da demo

Streaming padrão

stream=True

Retorna blocos de texto anexáveis

Streaming por difusão

stream=True, diffusing=True

Retorna sucessivos estados de refinamento do texto completo

Prompt

Caso de suporte fixo

Mantém a tarefa constante enquanto alteramos as configurações do modelo

Repetições

5 por condição

Mostra a variação entre execuções em vez de depender de um único request

Essas são configurações de trabalho para este experimento, não os parâmetros globalmente ideais do Mercury 3.

Passo 1: pré-requisitos

O Mercury 3 exige apenas alguns passos para começar. Para acompanhar, você vai precisar de:

  • Uma chave de API da Inception
  • Python 3
  • O pacote inceptionai
  • O caso de suporte salvo como case_support.json

Comece criando sua conta na plataforma Inception e gerando a chave de API. Clique em Get Started e preencha os dados:

Sign up page

Observação: no momento em que escrevemos, a Inception oferece 100 milhões de tokens gratuitos para novas contas testarem a API.

Você pode nomear sua chave de API ou simplesmente pular essa etapa e clicar em Create Key.

Create API Key

Em seguida, copie a chave de API e faça sua primeira chamada à API. 

Copy API Key

Passo 2: experimente o Mercury 3

Antes de escrever qualquer código, você pode testar o Mercury 3 diretamente pela Inception Platform. Depois de criar sua chave de API, clique em Next e selecione o botão Run it now na aba Try It Out.

Try out Mercury 3

Isso é útil para testar rapidamente prompts e configurações do modelo antes de levá-los para um aplicativo.

Passo 3: prepare o ambiente e faça uma chamada à API

No restante deste tutorial, vamos chamar o Mercury 3 a partir do Python. Comece instalando o SDK da Inception e exportando a chave de API assim:

!pip install -q inceptionai

Depois, importe os pacotes usados na demo:

import getpass, json, os, time, difflib
from pathlib import Path
from inceptionai import Inception
from IPython.display import clear_output

getpass solicita a chave da API sem exibi-la, os a coloca onde o SDK procura, Path e json carregam o case_support.json e o serializam no prompt, e time.perf_counter() registra quando cada resposta e estado de refinamento chegam.

difflib compara estados consecutivos de difusão e clear_output() substitui a saída da célula para que o replay aconteça no mesmo lugar, em vez de empilhar ao longo da página.

Se a chave de API ainda não estiver definida, você pode solicitá-la interativamente:

if not os.environ.get("INCEPTION_API_KEY"):
    os.environ["INCEPTION_API_KEY"] = getpass.getpass(
        "Inception API key: "
    )
client = Inception()
MODEL = "mercury-3"
print("ready")

Inception() lê a chave de API do ambiente. Enquanto isso, os outros imports, como time, registram quando os estados de refinamento chegam, difflib ajuda a comparar o texto intermediário e clear_output() permite reproduzir o processo de difusão no mesmo local.

Passo 4: monte as mensagens do modelo

O caso de suporte fica separado em case_support.json. O arquivo do caso contém a mensagem do cliente, informações do pedido, registros de pagamento, logs de fulfillment, política de suporte e os prompts que queremos usar neste cenário.

Você pode criar o seu próprio ou usar este como está:

{
  "scenario": "Customer reports two charges for one order",
  "system_prompt": "You are a customer-support escalation assistant.\nUse only the evidence in the supplied case file.\nSeparate what the evidence shows from what you infer.\nDo not state that a refund has been issued unless the case file says so.\nIf the evidence is insufficient to decide, say so explicitly.",
  "task_prompt": "Analyze this customer-support case.\n\nReturn:\n1. The most likely explanation.\n2. Three pieces of evidence from the case file that support it.\n3. Two alternative explanations, and what is still uncertain.\n4. The next three actions for the agent, in priority order.\n\nKeep the answer concise. Write it so the customer could read it.",
  "packet_label": "CASE FILE",
  "customer_message": "I ordered one pair of headphones yesterday evening and my card now shows two charges of $129 each. I have one confirmation email and one tracking number. I only pressed buy once. Please refund the second charge today, I cannot afford to be out $258.",
  "order": {
    "order_id": "ORD-1048",
    "placed_at": "2026-10-28T19:41:08Z",
    "status": "shipped",
    "shipped_at": "2026-10-29T08:12:00Z",
    "item": "wireless headphones",
    "quantity": 1,
    "amount_usd": 129,
    "orders_on_account_that_day": 1
  },
  "payment_records": [
    {
      "entry": 1,
      "at": "2026-10-28T19:41:11Z",
      "amount_usd": 129,
      "status": "completed",
      "authorization_code": "A7X41K",
      "card_last_four": "4417"
    },
    {
      "entry": 2,
      "at": "2026-10-28T19:42:45Z",
      "amount_usd": 129,
      "status": "pending",
      "authorization_code": "B2M09T",
      "card_last_four": "4417"
    }
  ],
  "fulfillment_log": [
    "19:41:12 reserved 1 unit for ORD-1048",
    "19:42:47 reserved 1 unit (no order id attached)",
    "19:58:30 released 1 unreserved unit back to stock",
    "08:12:00 shipped 1 unit against ORD-1048, one tracking number issued"
  ],
  "customer_history": [
    {
      "date": "2026-10-07",
      "contact_reason": "reported two charges for one order",
      "outcome": "both charges settled; agent issued a refund for one of them"
    },
    {
      "date": "2026-06-19",
      "contact_reason": "delivery address change",
      "outcome": "resolved, no payment involved"
    }
  ],
  "support_policy": [
    "A pending card authorization can appear on a customer statement as a second charge.",
    "A pending authorization that is never captured usually disappears within 3-5 business days.",
    "Escalate to the payments team if both charges settle.",
    "Agents may not issue a refund against an authorization that has not settled.",
    "Tell the customer what you have confirmed and what you have not."
  ],
  "available_agent_actions": [
    "explain the pending authorization to the customer",
    "set a follow-up for a named number of business days",
    "escalate to the payments team",
    "issue a refund for a settled charge",
    "request the authorization expiry date from the payment processor"
  ]
}

Agora, vamos carregar o arquivo JSON:

def load_incident(path: str) -> dict:
    return json.loads(Path(path).read_text())
case = load_incident("case_support.json")

Antes de enviar ao Mercury 3, separamos a configuração do prompt das evidências:

PROMPT_KEYS = (
    "system_prompt",
    "task_prompt",
    "packet_label",
)
def build_messages(case: dict):
    system = case.get("system_prompt", SYSTEM)
    task = case.get("task_prompt", TASK)
    label = case.get(
        "packet_label",
        "INCIDENT PACKET",
    )
    evidence = {
        k: v
        for k, v in case.items()
        if k not in PROMPT_KEYS
    }
    packet = json.dumps(evidence, indent=2)
    return [
        {
            "role": "system",
            "content": system,
        },
        {
            "role": "user",
            "content": (
                f"{task}\n\n"
                f"{label}:\n{packet}"
            ),
        },
    ]

As chaves system_prompt, task_prompt e packet_label controlam como instruímos o Mercury, então são removidas das evidências antes de o caso em si ser serializado. Agora podemos preparar as mensagens finais:

messages = build_messages(case)

Não há sistema de busca nem ferramenta externa envolvida aqui. Tudo o que o Mercury precisa para esta análise é fornecido diretamente no request.

Passo 5: faça um request ao Mercury 3 

Antes de testar o streaming, vamos fazer um request normal, sem streaming. O helper a seguir encapsula a chamada à API do Mercury e registra os metadados da resposta:

def usage_dict(response) -> dict:
    usage = getattr(response, "usage", None)

    if usage is None:
        return {}

    if hasattr(usage, "model_dump"):
        return usage.model_dump()

    return dict(usage)

Agora vamos definir uma chamada ao modelo:

def run_nonstream(
    client,
    messages,
    effort: str,
    max_tokens: int,
):
    start = time.perf_counter()
    response = client.chat.completions.create(
        model=MODEL,
        messages=messages,
        reasoning_effort=effort,
        temperature=0.75,
        max_completion_tokens=max_tokens,
    )
    elapsed = time.perf_counter() - start
    choice = response.choices[0]
    text = choice.message.content or ""
    usage = usage_dict(response)
    return {
        "effort": effort,
        "elapsed_s": elapsed,
        "finish_reason": choice.finish_reason,
        "usage": usage,
        "text": text,
    }

Os controles principais do lado do modelo são:

reasoning_effort=effort
temperature=0.75
max_completion_tokens=max_tokens

Agora podemos fazer uma chamada de baseline:

result = run_nonstream(
    client,
    messages,
    effort="low",
    max_tokens=8192,
)
print(result["text"])

O Mercury recebe o caso de suporte completo e retorna a análise solicitada, incluindo a explicação mais provável, evidências que a sustentam, explicações alternativas, incertezas e as próximas ações recomendadas.

A função também registra os campos elapsed_s e usage. O primeiro mede o tempo de ponta a ponta do request, enquanto o outro inclui a contabilidade de tokens, incluindo o uso reportado de tokens de raciocínio.

Ao longo das execuções usadas neste tutorial, o Mercury identificou de forma consistente a segunda entrada de pagamento como sendo, muito provavelmente, uma autorização pendente, e não evidência de um segundo pedido confirmado. Porém, o caso propositalmente não tem informação suficiente para saber se essa autorização pendente vai desaparecer depois ou se será capturada.

Passo 6: adicione o streaming padrão

Um request normal espera o Mercury terminar para então retornar a resposta completa. Para receber a resposta de forma incremental, precisamos ativar stream=True. A função de streaming padrão fica assim:

def run_standard_stream(
    client,
    messages,
    effort: str,
    max_tokens: int,
):
    start = time.perf_counter()
    first_output = None
    finish_reason = None
    chunks = []
    stream = client.chat.completions.create(
        model=MODEL,
        messages=messages,
        reasoning_effort=effort,
        temperature=0.75,
        max_completion_tokens=max_tokens,
        stream=True,
    )
    for chunk in stream:
        choices = getattr(
            chunk,
            "choices",
            None,
        ) or []
        if (
            choices
            and getattr(
                choices[0],
                "finish_reason",
                None,
            )
        ):
            finish_reason = choices[0].finish_reason
        content = extract_delta_text(chunk)
        if content:
            now = time.perf_counter()
            if first_output is None:
                first_output = now
            chunks.append(content)
            print(
                content,
                end="",
                flush=True,
            )
    end = time.perf_counter()
    return {
        "time_to_first_output_s": (
            first_output - start
            if first_output
            else None
        ),
        "total_s": end - start,
        "num_chunks": len(chunks),
        "finish_reason": finish_reason,
        "final_text": "".join(chunks),
    }

O comportamento importante aqui é chunks.append(content) no streaming padrão, em que cada chunk contém o próximo trecho da resposta; assim, os chunks podem ser acumulados e reconstruídos na resposta final com "".join(chunks).

Observação: a mediana do tempo até a primeira saída visível foi de 2,903 segundos, enquanto a mediana da latência total foi de 3,375 segundos.

Passo 7: mude para diffusion streaming

Para ativar o diffusion streaming, defina os seguintes parâmetros como True:

stream=True
diffusing=True

A chamada de API difere do streaming padrão por apenas um argumento adicional, ou seja, diffusing=True. 

def run_diffusion_stream(
    client,
    messages,
    effort: str,
    max_tokens: int,
    live: bool = True,
):
    start = time.perf_counter()
    first_output = None
    finish_reason = None
    states = []
    empty_chunks = 0
    stream = client.chat.completions.create(
        model=MODEL,
        messages=messages,
        reasoning_effort=effort,
        temperature=0.75,
        max_completion_tokens=max_tokens,
        stream=True,
        diffusing=True,
    )
    for chunk in stream:
        choices = getattr(
            chunk,
            "choices",
            None,
        ) or []
        if (
            choices
            and getattr(
                choices[0],
                "finish_reason",
                None,
            )
        ):
            finish_reason = choices[0].finish_reason
        content = extract_delta_text(chunk)
        if not content:
            empty_chunks += 1
            continue
        now = time.perf_counter()
        if first_output is None:
            first_output = now
        states.append({
            "t_s": now - start,
            "text": content,
        })
        if live:
            clear_output(wait=True)
            print(content, flush=True)
    end = time.perf_counter()
    return {
        "time_to_first_output_s": (
            first_output - start
            if first_output
            else None
        ),
        "total_s": end - start,
        "num_refinement_states": len(states),
        "finish_reason": finish_reason,
        "final_text": (
            states[-1]["text"]
            if states
            else ""
        ),
        "states": states,
    }

No streaming padrão, os chunks são anexados. Já no diffusion streaming, o chunk não vazio mais recente representa a versão atual completa da resposta. Então, em vez de anexá-lo, substituímos o que foi exibido anteriormente.

Também guardamos os estados retornados para medir quantos estados de refinamento houve e verificar se estados posteriores realmente revisam texto que apareceu antes.

Em cinco execuções, o diffusion streaming retornou uma mediana de 9 estados visíveis de refinamento, variando de 7 a 12. O tempo mediano até o primeiro estado visível foi de 1,896 segundos, e a latência total mediana foi de 2,560 segundos.

Passo 8: compare o streaming padrão e o diffusion

Agora que entendemos ambos os caminhos de código, podemos comparar o comportamento medido.

Métrica

Padrão

Difusão

Mediana de chunks/estados

6

9

Variação

5–7

7–12

Mediana do primeiro output visível

2,903 s

1,896 s

Latência total mediana

3,375 s

2,560 s

A difusão teve latência mediana menor para este prompt de suporte específico, mas os intervalos se sobrepõem bastante. Portanto, não devemos concluir que o diffusion streaming é inerentemente mais rápido.

12-state run, transition by transition

Figura: execução com 12 estados, transição por transição. A barra marrom é texto que o Mercury 3 já havia escrito e depois substituiu, enquanto a barra azul é o novo texto além do fim anterior. Um fluxo puramente por anexação não mostraria marrom algum.

Nas minhas execuções, os estados de difusão retornados revisaram texto anteriormente visível, em vez de se comportarem como chunks apenas anexáveis. Na execução acima, nenhuma das 11 transições de estado foi um append puro, e todas divergiram do estado anterior já nos primeiros 14 caracteres.

Passo 9: teste o orçamento de conclusão

Agora, vamos observar o comportamento do Mercury 3 em relação a como os tokens de raciocínio interagem com o orçamento de conclusão. As chamadas normais acima usam max_completion_tokens=8192, mas, para evidenciar melhor o comportamento, precisamos reduzir max_completion_tokens para 1600.

Agora, rode o mesmo request uma vez com esforço de raciocínio baixo e outra com alto. Aqui está o resultado medido:

LOW
completion_tokens: 964
reasoning_tokens:  620
finish_reason:     stop
visible answer:    returned

HIGH
completion_tokens: 1539
reasoning_tokens:  1539
finish_reason:     length
visible answer:    none

No alto, todos os 1.539 tokens de conclusão foram reportados como tokens de raciocínio. O modelo, portanto, atingiu o limite de conclusão antes de retornar texto visível na resposta.

High-effort completion budget at a 1,600 and an 8,192 token cap

Figura: orçamento de conclusão em esforço alto com limite de 1.600 e de 8.192 tokens 

Com o limite em 1.600, todo o orçamento foi para raciocínio e nada sobrou para emissão. Com 8.192, a execução mediana em esforço alto gastou 2.292 tokens raciocinando e ainda teve espaço para uma resposta de 412 tokens. O limite de 8.192 fica fora da borda direita dessa escala, por isso só a primeira linha na imagem acima mostra uma linha tracejada de limite.

O sinal importante no request malsucedido em alto é response.choices[0].finish_reason, que retornou length. Isso significa que o request atingiu seu orçamento máximo de tokens de conclusão (max_completion_tokens). Esse orçamento inclui tanto tokens de raciocínio quanto tokens de saída visível. Nessa execução, o Mercury 3 reportou todos os 1.539 tokens de conclusão como tokens de raciocínio, então o request atingiu o limite de conclusão antes de produzir uma resposta visível.

Observação: para esta demo, max_completion_tokens=8192 foi suficiente para as demais execuções, mas isso não deve ser tratado como um mínimo universal.

Passo 10: compare esforço de raciocínio baixo e alto

Agora volte ao orçamento normal de 8192 para conclusão e varie apenas o reasoning_effort entre baixo e alto. Vamos usar o helper run_nonstream() do Passo 5 para fazer um request com esforço de raciocínio baixo e outro com alto:

results = []

for effort in ["low", "high"]:
    result = run_nonstream(
        client,
        messages,
        effort=effort,
        max_tokens=8192,
    )
    results.append(result)

    print(
        effort,
        result["elapsed_s"],
        result["usage"],
    )

Para os resultados reportados, repeti cada configuração cinco vezes em vez de depender de um único request.

As medianas foram:

Métrica

Baixo

Alto

Latência de ponta a ponta

2,936 s

8,146 s

Tokens de conclusão

1312

2723

Tokens de raciocínio

828

2292

Tokens visíveis (aprox.)

468

412

Participação do raciocínio

63%

84%

O uso mediano de tokens de raciocínio subiu de 828 para 2.292, enquanto a latência mediana aumentou de 2,936 para 8,146 segundos (algo em torno de 2,77x).

Tokens de conclusão medianos divididos entre raciocínio oculto e resposta visível

Figura: para onde vai o orçamento de conclusão em cada nível de esforço?

O tamanho da resposta visível quase não mudou:

  • Baixo: mediana de 468 tokens
  • Alto: mediana de 412 tokens

e as faixas observadas se sobrepõem:

  • Baixo: 393–494
  • Alto: 356–469

Portanto, essas execuções não sustentam a afirmação de que aumentar o esforço de raciocínio torna a resposta visível mais curta. As faixas de latência também mostram por que uma única execução não basta:

  • Baixo: 1,602–4,993 s
  • Alto: 4,102–9,068 s

Observação: a requisição mais rápida em alto foi, na prática, mais rápida do que a mais lenta em baixo.

As dez requisições com esforço de raciocínio plotadas por latência

Figura: as dez requisições com esforço de raciocínio plotadas por latência

Assim, reasoning_effort="high" aumentou substancialmente o uso reportado de tokens de raciocínio e a latência neste experimento, enquanto o comprimento da resposta visível permaneceu amplamente semelhante.

Considerações finais

Há três comportamentos práticos do Mercury 3:

  • Diffusion streaming usa um contrato de saída diferente. O streaming padrão adiciona novo texto ao final, enquanto o diffusion streaming retorna estados completos sucessivos da resposta, que devem substituir o anterior.

  • Tokens de raciocínio compartilham o orçamento de conclusão. Um valor pequeno de max_completion_tokens pode ser consumido no raciocínio antes de o Mercury 3 produzir uma resposta visível.

  • Esforço de raciocínio mais alto troca mais computação por latência. Nas minhas execuções, o alto usou bem mais tokens de raciocínio reportados e levou mais tempo, como esperado, enquanto o comprimento da resposta visível ficou amplamente similar.

Esses resultados vêm de poucas execuções em um caso sintético de suporte, então devem ser tratados como observações deste demo, não como afirmações gerais de desempenho sobre o Mercury 3.

Aashi Dutt

Autor

Aashi Dutt

Sou Especialista Google Developers em ML (Gen AI), tricampeã no Kaggle e Embaixadora Women Techmakers, com mais de três anos de experiência na área de tecnologia. Cofundei uma startup de saúde em 2020 e atualmente faço um mestrado em ciência da computação na Georgia Tech, com foco em aprendizado de máquina.

Perguntas frequentes sobre o Mercury 3

Qual é a principal diferença entre o streaming padrão e o diffusion streaming no Mercury 3?

No streaming padrão, a resposta chega em blocos de texto que vão sendo adicionados em sequência. No diffusion streaming, a API expõe revisões sucessivas da resposta atual; por isso, o estado mais recente deve substituir o anterior, não ser anexado a ele.

reasoning_effort="high" sempre gera uma resposta melhor?

Não. Um esforço de raciocínio mais alto dá mais margem para o Mercury raciocinar, mas isso não garante uma resposta melhor em toda tarefa. Neste demo, o modo alto usou bem mais tokens de raciocínio e levou mais tempo, enquanto o tamanho da resposta visível permaneceu parecido. Ele também foi mais consistente em destacar uma evidência que faltava, mas o experimento foi pequeno demais para tirar conclusões amplas sobre qualidade.

Por que o Mercury 3 pode não retornar uma resposta visível quando o max_completion_tokens é muito baixo?

Tokens de raciocínio contam para o mesmo orçamento de tokens de conclusão que a resposta visível. Se o modelo consome a maior parte (ou todo) esse orçamento ao raciocinar, pode atingir o limite de conclusão antes de produzir saída visível. Nesses casos, verificar o finish_reason e o uso reportado de tokens de raciocínio ajuda a entender o que ocorreu.

Diffusion streaming é sempre mais rápido do que o streaming padrão?

Não. Neste demo, o diffusion streaming teve mediana menor de tempo até a primeira saída visível e menor latência total mediana, mas as faixas se sobrepuseram, e outro prompt produziu o oposto. A diferença mais confiável é o comportamento de streaming, não uma melhoria garantida de latência.

Quando devo usar o Mercury 3?

O Mercury 3 é especialmente interessante para apps sensíveis a latência, em que usuários se beneficiam de respostas rápidas enquanto o modelo ainda realiza raciocínio não trivial. O esforço de raciocínio e o orçamento de conclusão ideais dependem da tarefa, então vale ajustar considerando tanto a latência quanto a qualidade da resposta.

Temas