Plugin do Composio
connector-composio é um RuntimePlugin comum do OHarness. Ele usa a API REST oficial do Composio para inspeção de contas, descoberta de schemas e execução de ferramentas. Ele não introduz MCP, outro loop do Agent, um segundo plugin host nem uma dependência de SDK. createConnectorPlugin continua sendo o helper de adaptador independente de fornecedor.
Escopo e verificação
- Implementado: listas explícitas de ferramentas permitidas, vínculo de conta/usuário, conversão de schemas, fixação de versão, cancelamento, limites de tamanho de resposta e os portões de permissão do OHarness.
- Implementado: criação explícita, operada por uma pessoa, de links de autenticação hospedados e status da conta.
- Não implementado: Pipedream, webhooks, ACLs de contas compartilhadas, verificação automática de identidade do callback OAuth no OHarness Cloud, instalação remota de plugins, automação de upload/download de arquivos nem recarregamento a quente em runtime.
- Os testes usam respostas HTTP simuladas e não exigem credenciais. Um teste de fumaça com uma conta real precisa ser feito à parte, com as suas próprias credenciais e o seu consentimento.
O Composio recomenda Sessions para novas integrações de agentes e classifica a execução direta como legada. Este primeiro adaptador usa de propósito os endpoints diretos, ainda documentados, para manter no controle o registro de ferramentas existente do OHarness e as permissões por ferramenta. Só as ferramentas escolhidas explicitamente são expostas, em vez de um roteador genérico capaz de invocar uma ação arbitrária. Veja o guia oficial de execução direta.
Este adaptador direto é para uso em desenvolvimento/auto-hospedado configurado explicitamente. No produto hospedado, a chave do Composio da plataforma pertence ao Cloud, não a cada cliente. Use o conector do Cloud no produto hospedado: ele oferece cartões de autorização, vínculo de usuário verificado pelo servidor e continuação da tarefa.
1. Defina a chave de API do projeto
Defina COMPOSIO_API_KEY no ambiente do processo que roda o OHarness. Não a coloque no seu repositório, em mensagens de chat nem no JSON do plugin. A configuração pode indicar outra variável de ambiente via apiKeyEnv.
O transporte só envia essa chave para https://backend.composio.dev, recusa redirecionamentos HTTP e não aceita uma origem de API configurável. Todas as chamadas remotas são requisições explícitas do cliente; construir/importar o plugin não faz nenhuma chamada.
2. Veja o que já está conectado
Toda entrada de toolkit na configuração precisa de um connectedAccountId, e a primeira pergunta é se você já tem um:
npm run composio:auth -- list --user YOUR_USER_ID
Somente leitura, restrito a esse usuário e paginado — passe --toolkit SLUG para filtrar, --limit N (1-100, padrão 50) para definir o tamanho da página e --cursor com o cursor retornado por uma chamada anterior. Ele imprime id, toolkit, status e disabled de cada conta e nada mais: as linhas de origem trazem campos de credencial e de estado, e este comando os descarta do mesmo jeito que a inspeção de contas.
Uma conta listada sob outro usuário é recusada em vez de escondida, já que uma resposta que mistura usuários não é confiável nem para as linhas que bateram.
3. Conecte uma conta
Se a lista estiver vazia, ou se faltar nela o toolkit de que você precisa, crie uma configuração de autenticação para o app no Composio e depois solicite explicitamente um Connect Link hospedado a partir do repositório:
npm run composio:auth -- link --user YOUR_USER_ID --auth-config ac_YOUR_AUTH_CONFIG
O comando faz um POST remoto e imprime redirectUrl, connectedAccountId e uma expiração opcional. Abra essa URL você mesmo e conclua o consentimento. Trate-a como um link de autorização privado: não a compartilhe com outro usuário. O comando não abre navegador, não aprova acesso, não salva configuração nem expõe ao Agent uma ferramenta de criação de links.
Inspecione a conexão resultante com uma requisição somente leitura:
npm run composio:auth -- status --user YOUR_USER_ID --account ca_YOUR_ACCOUNT
Continue quando o status for ACTIVE, o toolkit estiver correto e disabled for false. Use o mesmo ID de usuário para vincular e para executar. O adaptador rejeita de propósito uma conta que pertença a outro usuário, mesmo que a chave de API do projeto consiga acessá-la. A inspeção de contas nunca retorna campos de credencial/estado.
Em um produto hospedado multiusuário, derive userId do estado autenticado do aplicativo e crie instâncias do Harness devidamente isoladas. Não o aceite como entrada do modelo. A verificação opcional de identidade do callback do Composio exige um verificador HTTPS autenticado no seu aplicativo; este adaptador local não implementa esse servidor. Veja a documentação oficial de conexão e identidade do callback.
4. Habilite o plugin
Compile o espaço de trabalho (npm run build) e adicione uma entrada ao seu arquivo de plugins do OHarness do usuário, normalmente ~/.oharness/plugins.json (ou $OHARNESS_HOME/plugins.json). Substitua o caminho do módulo, o ID de usuário e o ID da conta; não copie os placeholders como estão.
{
"runtimePlugins": [
{
"id": "connector-composio",
"module": "/absolute/path/to/OHarness/packages/engine/dist/runtime-plugins/composio/index.js",
"enabled": true,
"required": false,
"config": {
"userId": "YOUR_USER_ID",
"apiKeyEnv": "COMPOSIO_API_KEY",
"timeoutMs": 30000,
"toolkits": [
{
"slug": "gmail",
"connectedAccountId": "ca_YOUR_ACCOUNT",
"version": "latest",
"tools": ["GMAIL_GET_PROFILE"]
}
]
}
}
]
}
required: false mantém o OHarness utilizável se este conector opcional não conseguir iniciar; a falha aparece em /plugins e na lista de plugins da Web. Defina como true só se a inicialização tiver de falhar sem o conector. A configuração do projeto não pode habilitar plugins executáveis nem substituir a configuração de conta confiável deles.
Para embutir, use a mesma implementação diretamente:
import { Harness, composioPlugin, jsonlAuditPlugin } from "@oharness/engine";
const harness = await Harness.create({
runtimePlugins: [
{
plugin: composioPlugin,
config: {
userId: authenticatedUserId,
toolkits: [{
slug: "gmail", connectedAccountId: approvedAccountId,
version: "latest", tools: ["GMAIL_GET_PROFILE"],
}],
},
},
{ plugin: jsonlAuditPlugin, config: { path: "/absolute/path/to/audit.jsonl" } },
],
});
// Use the existing Session / Agent API, then await harness.close().
Semântica de execução
- A inicialização verifica se cada conta configurada pertence ao usuário configurado, tem o toolkit configurado e está ativa/não desabilitada.
- Só os slugs de ferramenta nomeados são buscados; no máximo 40 ferramentas em 20 toolkits.
- O slug/toolkit retornado precisa bater com a lista de permissões.
latesté resolvido na inicialização para uma versão datada concreta, reutilizada na execução. Uma versão datada configurada precisa bater exatamente com a versão do schema retornado. - As ferramentas são registradas como
composio__SLUG. Nomes com mais de 64 caracteres são encurtados com um sufixo de hash estável. Os nomes exatos aparecem no ToolRegistry. - As chamadas passam pelo engine de permissões normal do OHarness. Todas as ferramentas do Composio têm
readOnly: falseesessionLocal: false, mesmo as operações remotas de leitura. A aprovação só é pulada quando a sua política de permissões explícita normal permite. - Antes de cada execução, a posse, o status e o toolkit da conta são verificados de novo. O envelope do POST usa o usuário/a conta confiáveis e a versão fixada; os parâmetros do modelo ficam aninhados em
argumentse não podem substituir esses campos. - Os dados de sucesso são convertidos em um ToolResult e entram no fluxo normal do Agent e na auditoria de execução. Falhas de HTTP/API viram erros de ferramenta.
A entrada da ferramenta precisa ser um objeto. A validação detalhada do schema dos argumentos é feita pelo Composio; o JSON Schema retornado é fornecido ao modelo. Só implementações explícitas de ferramentas são suportadas, e não execução via proxy, substituições de autenticação personalizadas, execução em linguagem natural nem URLs remotas arbitrárias. Este adaptador não lê nem envia nenhum arquivo local.
Nenhuma chamada HTTP é repetida automaticamente. Um POST cancelado ou com falha pode já ter executado a ação remota: inspecione o serviço externo ou o log do Composio antes de tentar de novo. O timeout por requisição tem padrão de 30 segundos e é configurável de 100 ms a 120 segundos. As respostas são limitadas a 2 MiB. Corpos de erro brutos e chaves de API não são repassados para os logs; os dados de sucesso continuam sendo dados sensíveis do aplicativo e ficam visíveis para o Agent, como esperado.
As primeiras requisições de conta/metadados acontecem quando o plugin é habilitado na inicialização; a inicialização não cria uma conta nova nem executa nenhuma ação da lista de permissões.
Contrato da API oficial usado
- Ler os detalhes da conta
- Criar link de autenticação hospedado
- Obter o schema/a versão de uma ferramenta
- Executar uma ferramenta
O adaptador usa as rotas documentadas /api/v3 em backend.composio.dev. Elas foram conferidas com a documentação oficial em 2026-09-02; testes de contrato HTTP não comprovam a autorização de uma conta real nem a disponibilidade do fornecedor.