Olá! Bem-vindo à nossa última lição do Módulo 5.
Nas lições anteriores, construímos as ações fundamentais que permitem ao nosso agente interagir com um repositório Git: criar um branch e fazer commit de arquivos. Com essas capacidades, o agente pode isolar suas alterações e registrá-las no histórico do projeto. Agora, vamos completar o ciclo de contribuição de código.
O objetivo desta lição é implementar uma ação do agente para criar um pull request com um título, corpo e branches corretos. Esta ação é o que formalmente apresenta o trabalho do agente à equipe, solicitando que suas alterações sejam revisadas e integradas à base de código principal.
1. A Anatomia de uma Chamada de API para Pull Request
Assim como nas outras interações com o GitHub, a API REST nos fornece um endpoint específico para gerenciar pull requests. A criação de um PR é essencialmente uma requisição POST que informa ao GitHub que você deseja mesclar as alterações de um branch (o head) para outro (o base).
Para entender os detalhes, vamos consultar a documentação oficial.
REST API endpoints for pull requests - GitHub Docs
A documentação da API REST do GitHub detalha precisamente o endpoint 'Create a pull request'. Este recurso é a nossa fonte de verdade para a implementação.
Estude a seção principal 'Create a pull request'. Concentre-se nos 'Body parameters', que são os dados que enviaremos para criar o PR. Preste atenção especial aos seguintes quatro parâmetros, pois eles são o cerne da nossa ação: title: O título do pull request. head: O nome do branch onde suas alterações foram implementadas (nosso branch de funcionalidade). base: O nome do branch no qual você deseja que as alterações sejam aplicadas (por exemplo, main ou develop). body: O conteúdo do pull request, onde você descreve as alterações.
Esses quatro parâmetros se traduzem diretamente nos campos que você preenche na interface do usuário do GitHub ao criar um PR manualmente.

Para realizar esta ação, nosso agente precisará da permissão de "Pull requests" (gravação) no repositório, algo que você configurou na lição sobre autenticação segura.
2. Implementando a Ação create-pull-request no Forge
Agora, vamos traduzir esse conhecimento da API em uma ação concreta do Forge. Primeiro, definimos a ação e seus parâmetros no manifest.yml.
# Em manifest.yml
rovo:agent:
# ...
actions:
# ... outras ações como create-branch e commit-file
- key: create-pull-request
function: createPullRequest # Nome da função JS a ser exportada
description: Cria um pull request em um repositório GitHub.
parameters:
type: object
properties:
repositoryOwner:
type: string
description: O proprietário do repositório GitHub.
repositoryName:
type: string
description: O nome do repositório.
headBranch:
type: string
description: O branch de origem contendo as alterações (o 'head').
baseBranch:
type: string
description: O branch de destino para o qual as alterações serão mescladas (o 'base').
title:
type: string
description: O título do pull request.
body:
type: string
description: A descrição detalhada (corpo) do pull request.
required:
- repositoryOwner
- repositoryName
- headBranch
- baseBranch
- title
Com a ação definida, implementamos a lógica correspondente em src/index.js. A função fará uma requisição POST para o endpoint /pulls com os dados fornecidos.
import api from '@forge/api';
// ... outras funções de ação ...
/**
* Cria um pull request em um repositório GitHub.
* @param {object} payload - O payload da ação do agente.
* @returns {Promise<object>} - Os detalhes do pull request criado, incluindo sua URL.
*/
export async function createPullRequest({
repositoryOwner,
repositoryName,
headBranch,
baseBranch,
title,
body
}) {
console.log(`Criando pull request: '${title}' de ${headBranch} para ${baseBranch}.`);
const githubApi = api.asUser().withProvider('github', 'github-api');
const endpoint = `/repos/${repositoryOwner}/${repositoryName}/pulls`;
// Preparar o corpo da requisição POST
const requestBody = {
title: title,
head: headBranch,
base: baseBranch,
body: body,
};
// Fazer a requisição POST para criar o pull request
const response = await githubApi.fetch(endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/vnd.github+json',
'X-GitHub-Api-Version': '2022-11-28'
},
body: JSON.stringify(requestBody),
});
if (response.status !== 201) { // 201 Created é o status de sucesso esperado
const errorText = await response.text();
console.error('Falha ao criar o pull request:', errorText);
throw new Error(`Falha ao criar o pull request. Status: ${response.status}. Resposta: ${errorText}`);
}
const prDetails = await response.json();
console.log(`Pull request criado com sucesso! URL: ${prDetails.html_url}`);
// Retornar informações úteis, como a URL e o número do PR.
return {
number: prDetails.number,
url: prDetails.html_url,
state: prDetails.state,
};
}
Análise do Código
- Endpoint e Método: Usamos o endpoint
/repos/{owner}/{repo}/pullscom o métodoPOST, conforme especificado na documentação. - Corpo da Requisição: O objeto
requestBodyé uma tradução direta dos parâmetros da nossa ação para o formato que a API do GitHub espera. - Manipulação de Resposta: Verificamos se o
statusda resposta é201, que é o código HTTP para "Created" e indica sucesso. Se não for, lançamos um erro detalhado para facilitar a depuração. - Valor de Retorno: Ao ter sucesso, extraímos e retornamos o
html_urldo pull request. Este é um dado extremamente valioso, pois permite que o agente (ou um sistema externo) tenha um link direto para o PR que acabou de criar, possibilitando, por exemplo, postar um comentário no Jira com o link para revisão.
3. Orquestrando o Fluxo de Trabalho Completo
Com as ações create-branch, commit-file e create-pull-request implementadas, nosso agente agora possui os blocos de construção para um fluxo de trabalho de desenvolvimento completo. O poder real emerge quando um orquestrador (como o próprio agente Rovo ou uma lógica de planejamento) invoca essas ações em sequência:
- Analisar Tarefa: O agente lê uma tarefa do Jira.
- Planejar Ações: Ele determina que precisa modificar o
arquivo-A.cse criar oarquivo-B.js. - Executar Ações:
- Chama
create-branchpara criarfeature/JIRA-123-new-login-flow. - Chama
commit-filepara oarquivo-A.csno novo branch. - Chama
commit-filepara oarquivo-B.jsno mesmo branch. - Chama
create-pull-requestcomhead: 'feature/JIRA-123...',base: 'main',title: '[JIRA-123] Novo Fluxo de Login'e umbodyque resume as alterações.
- Chama
O vídeo a seguir, embora use o framework LangGraph, ilustra perfeitamente este conceito de um agente executando um plano passo a passo para, no final, criar um pull request.
Este vídeo do canal Rabbitmetrics, intitulado 'Make Your Agent Work With Git', demonstra um agente de IA recebendo uma tarefa, gerando código para resolvê-la e, por fim, abrindo um pull request com a solução.
Assista ao segmento de 08:25 a 10:45. Observe como o fluxo de trabalho é definido como uma série de nós ('generate', 'test', 'create pull request') e como, no final, o agente invoca a função para criar o PR e fornece um link direto para ele no GitHub. A ideia de um grafo de estados e nós é análoga à forma como um agente Rovo orquestraria suas ações definidas.
Conclusão
Parabéns! Você acaba de implementar a peça final do quebra-cabeça para o ciclo básico de contribuição de código do seu agente. Agora ele pode não apenas executar o trabalho, mas também formalmente propô-lo para integração, fechando o loop do desenvolvimento de uma funcionalidade.
Principais Pontos:
- Endpoint Chave: A criação de pull requests é feita via
POST /repos/{owner}/{repo}/pulls. - Parâmetros Essenciais: Os parâmetros
head,base,title, ebodysão fundamentais e mapeiam diretamente para a funcionalidade do PR. - Valor do Retorno: A resposta da API em caso de sucesso contém informações vitais, como a URL do PR (
html_url), que são cruciais para a rastreabilidade. - Fluxo de Trabalho Completo: A combinação das ações de branch, commit e pull request forma um pipeline completo de contribuição de código que seu agente pode agora executar autonomamente.
Na Próxima Lição:
Com o Módulo 5, estabelecemos o "como" — como nosso agente pode agir no mundo externo (especificamente, no GitHub). No entanto, um agente poderoso precisa também do "o quê" e do "porquê". No próximo módulo, "Análise e Planejamento de Tarefas Orientados pelo Agente", vamos mergulhar na parte de "planejamento" do ciclo perceber-planejar-agir. Começaremos a ensinar nosso agente a pensar: como analisar um ticket do Jira, consultar a base de conhecimento e decompor uma tarefa complexa em uma sequência de ações como as que você acabou de construir.