Pular para o conteúdo

A conversa no Canvas

Como funciona o cartão de conversa do quadro, o que ele tem de próprio e como dirigi-lo pela linha de comando.

Ver Markdown

O cartão de Conversa é onde a conversa com um assistente vive dentro do quadro. Ele é uma das superfícies de conversa do produto — e não é a mesma coisa que uma conversa da tela Conversa.

Um lugar próprio

A decisão de produto é que as telas sejam independentes: uma conversa no Canvas não é a conversa da tela Conversa vista de outro ângulo. As duas superfícies mantêm conversas separadas, cada uma com a sua própria sessão.

Cuidado com a expectativa. Não conte com “a conversa da tela Conversa aparece no Canvas” — e não conte com o contrário — como comportamento garantido. Trate as duas como lugares distintos.

O que isso significa na prática: abrir um cartão de conversa no quadro cria uma conversa ali. Ela não é a mesma que você tinha aberto na outra tela.

O cartão de conversa principal é o maestro

O cartão de conversa principal do projeto é o orquestrador: quando ele cria agentes filhos, cada filho aparece como um cartão ligado a ele por uma linha.

A sessão

  • A sessão vive no processo principal do app. Mudar o layout, minimizar o cartão ou trocar de tela não interrompe a conversa.
  • A sessão não aparece na lista de terminais. Uma conversa roda pelo SDK, com endereço próprio — procurá-la entre os terminais não acha nada. Isso é esperado, não é defeito.
  • Uma conversa ociosa pode ser recolhida e recriada. Depois de um tempo sem uso, a sessão ociosa é encerrada para liberar recursos e recriada no próximo envio. Por isso uma conversa parada não custa um processo para sempre.
  • O rascunho é preservado. O texto que você escreveu e ainda não enviou é guardado por conversa: ele sobrevive a trocar de tela, minimizar, recarregar a janela e reiniciar o app. Se a conversa terminar, o cartão mostra o que você tinha escrito, com as opções Copiar e Continuar em nova conversa.
  • Fechar o cartão encerra a conversa e o rascunho daquela conversa é descartado junto.

O assistente da conversa

O assistente é escolhido na criação do cartão, e o modelo também: --model é aceito no cartão de conversa e só nele.

O caminho de conversa do Elyra é o do SDK, não o de digitar num terminal. Onde o SDK não puder dirigir o assistente, a tela diz que a conversa está indisponível ali — ela nunca cai para uma interface de terminal por conta própria.

Em worktree remoto (SSH), o caminho do SDK atravessa a conexão. Os demais assistentes seguem pelo caminho de terminal e não são locais por construção nesse cenário.

A escolha do assistente muda o que existe depois. Nem toda combinação de assistente e host oferece o mesmo conjunto de recursos na conversa. O que a tela mostra é condicionado ao que aquele adaptador oferece — não há paridade universal entre provedores.

Dirigir a conversa pela linha de comando

Um cartão de conversa tem um endereço estável, derivado da aba da conversa, no formato chat_<12 hex>. Ele é o mesmo depois de recarregar a janela, reiniciar o app e mover o cartão, e nunca colide com o endereço de um terminal.

elyra chat list [--workspace <selector>] [--json]
elyra chat send --chat <handle|tabId|nodeId|título> (--text <text> | --text-file <path|->) [--json]
elyra chat read --chat <handle|tabId|nodeId|título> [--limit <n>] [--json]

A lista traz os cartões de conversa do Canvas daquele workspace, com handle, id do cartão, assistente, título e indicador de trabalho. Ela não é a tela Conversa: as conversas daquela tela não aparecem aqui.

O envio aceita handle, id da aba, id do cartão ou o título exato. Um título repetido não identifica um destino: o runtime pede para você listar e desambiguar. Prefira o handle.

O que a resposta do envio significa

A resposta é {ok: true, handle, queued}.

queued: true significa que o turno já estava em andamento e a mensagem foi enfileirada — não que o assistente respondeu. O envio confirmado é o envio, não a resposta. Para ver a resposta, leia a conversa.

O que a leitura traz

A leitura é uma projeção simplificada: cada mensagem vem como {role, text, at}. Blocos que não são texto — o raciocínio do assistente e as chamadas de ferramenta — não aparecem nessa saída. A resposta traz truncated: true quando mensagens mais antigas foram descartadas.

Limites que valem saber agora

  • A sessão precisa estar viva para receber mensagem. Um cartão cuja view ainda não montou não tem sessão no processo principal, e o envio é recusado com uma mensagem dizendo exatamente isso. Na prática: abra o Canvas para que o cartão monte e repita o envio. O envio não cria a sessão sozinho.
  • Por causa disso, um filho de orquestração deve ser cartão de terminal, não cartão de conversa. Um terminal nasce sem depender da view montada e recebe a tarefa pelo endereço dele. O cartão de conversa serve para a conversa que você acompanha.
  • A listagem pode mostrar cartões que o envio não alcança. O caminho de envio e leitura procura a sessão gerenciada no processo principal: ela existe para os cartões que rodam pelo SDK. Um cartão de outro assistente pode aparecer na lista sem ser alcançável pelo envio.
  • A conversa não aparece na lista de terminais. Isso é consequência de rodar pelo SDK, não um cartão ausente.
  • Título repetido não é endereço. Use o handle ou o id do cartão em qualquer automação.

Recuperação

Situação O que fazer
O envio recusa dizendo que a sessão não existe Abra o Canvas para montar o cartão e repita o envio.
O nome do cartão é ambíguo Liste os cartões com --json e use o handle.
A leitura não traz o raciocínio nem as ferramentas Esperado: a leitura pela linha de comando projeta só texto. Use o cartão na tela para a conversa completa.
A conversa terminou e você tinha texto escrito O cartão mostra o rascunho; use Copiar antes de continuar em nova conversa.