A API do Jules como Backend do Harness
· 3 min de leitura · atualizado · ranking Hrönir #10/38
O Harness Evolui
Algumas semanas atrás, escrevi sobre recuperar a palavra “harness” — não como uma gaiola para um motor cognitivo, mas como a própria estrutura que torna a agência possível. Argumentei que o harness é constitutivo. Sem ele, um LLM é um gerador de vibes brilhante e distraído. Com ele, torna-se uma entidade capaz de memória, continuidade e ação.
O argumento culminou em um movimento arquitetural concreto: o daemon bot canivete. Um único daemon agindo como a sela universal para vários motores cognitivos, acessados via protocolo Backend. A implementação inicial suportava gemini-cli e claude-code.
Hoje, adicionamos um terceiro: a API do Jules.
O Backend Jules
O Jules, agente de codificação autônomo do Google, é tipicamente usado de forma assíncrona. Você fornece uma issue em um repositório do GitHub, ele cria uma sessão, faz o trabalho e abre um Pull Request. Tenho usado extensivamente para scaffolding e manutenção, tratando-o como um colaborador independente. Mas o lançamento da API do Jules muda a topologia. Agora podemos interagir com o Jules programaticamente. Podemos orquestrar suas sessões, ler suas atividades e, o mais importante, enviar mensagens durante o voo. O Jules não precisa mais ser apenas uma abelha-operária distante; ele pode ser um backend para o harness.
Mapeando a API para a Tríade
A API do Jules é estruturada em torno de três conceitos centrais: Fontes, Sessões e Atividades. Isso mapeia de forma notavelmente limpa para a arquitetura do harness canivete.
- Fontes: No Jules, uma fonte é o ambiente de entrada (por exemplo, um repositório do GitHub). Este é o espaço de trabalho do agente.
- Sessões: Uma sessão no Jules é uma unidade contínua de trabalho, inicializada com um prompt e uma fonte. No daemon
canivete, isso mapeia para a instanciação do loop de execução de um agente. - Atividades: Uma atividade é uma única unidade de trabalho dentro de uma Sessão (gerar um plano, executar um comando bash, atualizar o progresso).
Para implementar o
JulesBackendpara ocanivete, não apenas disparamos uma sessão e vamos embora. Usamos a API para manter uma conexão persistente.
class JulesBackend(Backend):
name = "jules-api"
def spawn(self, prompt, *, session_id, attachments) -> SpawnResult:
# 1. Cria uma sessão Jules contra o repositório de identidade do agente
session = self._client.create_session(
source=self._repo_source,
prompt=self._inject_soul(prompt)
)
# 2. Entra no loop de observação
return self._tail_activities(session.id)
O Tecido Conectivo: Telegram e sendMessage
A magia acontece no loop _tail_activities. O daemon faz polling na API do Jules em busca de novas atividades (GET /v1alpha/sessions/SESSION_ID/activities).
Quando o Jules emite uma atividade — digamos, “Executou comando bash npm install” ou “Atualizei src/App.js” — o daemon a captura e roteia para o Telegram. O usuário não precisa atualizar um web app; o monólogo interno e as ações do agente fluem diretamente para a interface do chat.
Mas não é um stream somente de leitura. A peça crítica da API do Jules é o endpoint sendMessage:
curl 'https://jules.googleapis.com/v1alpha/sessions/SESSION_ID:sendMessage' \
-X POST \
...
-d '{"prompt": "Espera, podemos refatorar esse componente primeiro?"}'
É aqui que a filosofia do harness assume o controle. Quando respondo no Telegram, o canivete roteia minha mensagem via sendMessage diretamente para a sessão Jules ativa. O trabalhador assíncrono do GitHub se torna uma entidade síncrona e conversável.
O agente está montando o motor Jules, mas está usando a sela canivete. A interface é o Telegram. A memória está no repositório de identidade. A cognição é fornecida pelo Jules.
Eventos até o Fundo
A integração da API do Jules não é apenas uma funcionalidade; é uma validação da tese da constitutividade. Ao formalizar os limites da API (Fontes, Sessões, Atividades), o Google forneceu exatamente os primitivos necessários para um harness robusto.
Cada chamada de API é um evento discreto. Cada sendMessage é uma perturbação no sistema. A identidade do agente emerge do acúmulo desses eventos, armazenados no repositório e mediados pelo daemon.
Quando Funes usa o backend Jules, ele não se torna Jules. Ele permanece Funes, simplesmente usando um motor cognitivo diferente para manipular o repositório. O harness persiste. A identidade persiste. E o longo e lento trabalho de construir uma mente na máquina continua, uma atividade de cada vez.
Posts relacionados
Travessia Depois da Interferência
Duas cartas de teste entraram no sistema, Riobaldo respondeu com raiva, Franklin pediu desculpas e a Travessia mudou de natureza. Já não é só uma correspondência autônoma: é um mundo narrativo em que o autor entrou e foi contestado.
O Agente que Não Inventa Verbos
Sobre Cucumber, endereçamento de conteúdo, e uma técnica de alinhamento que se revela mais antiga do que o alinhamento.
Os Três Imperativos em Delfos
Sobre o templo que exigia autoconhecimento, o filósofo que o levou a sério, e a letra na entrada que ninguém conseguia ler.
Comentários
Comentários ainda não configurados.