Guia de início rápido do DCP-AI¶
Tradução informativa da versão em inglês, atualizada em 28/10/2026. Em caso de divergência, prevalece a versão em inglês. Identificadores, comandos e blocos de código são mantidos sem tradução.
Este guia mostra como produzir e verificar evidências DCP com um SDK, e quais ferramentas são demonstrações.
Escolha um caminho¶
- Produzir e verificar evidências com um SDK. Instale um SDK publicado. Os exemplos de §3 TypeScript e §4 Python criam bundles assinados e os verificam; Outros SDKs traz a instalação e as referências de Go, Rust e WebAssembly. A verificação confere a integridade e as assinaturas; não estabelece a confiança no principal, a admissão nem a autorização (veja Admissão).
- Explorar com uma demonstração. O playground e os projetos iniciais dos atalhos sem instalação, e o assistente da CLI de §1 e §2, mostram os conceitos. Seus limites variam (chaves ou assinaturas PQ simuladas, chaves de exemplo, registros não assinados, verificações apenas de estrutura), e o que produzem não é evidência de verificação.
- Executar um verificador sem instalar um SDK. A imagem Docker opcional do servidor de verificação de referência, nos mesmos atalhos e em Executar os serviços de referência, verifica bundles; não os cria.
As versões atuais dos pacotes estão em Versões publicadas.
Pré-requisitos¶
Conforme o SDK que você usar:
- Node.js 18+ — para o SDK TypeScript, a CLI, o pacote WASM e as integrações
@dcp-ai/*; a versão atual do LangChain.js (v1) em QUICKSTART_LANGCHAIN.md precisa de Node.js 22+ - Python 3.10+ — para o SDK Python; o pacote separado
agno-dcpem QUICKSTART_AGNO.md precisa de 3.11+ - Go 1.25+ — para o SDK Go
- Rust estável — para o crate Rust
Você só precisa da linguagem com que vai trabalhar. Todos os SDKs implementam o mesmo formato de transmissão V2; os vetores compartilhados e a matriz de interoperabilidade testam a assinatura e a verificação entre SDKs, e o README de cada SDK lista o que ainda falta.
Pacotes publicados e este guia¶
Os exemplos TypeScript usam @dcp-ai/sdk 2.2.1 publicado, o CLI npm é @dcp-ai/cli 2.1.1 e Python é dcp-ai 2.10.1 no PyPI. Veja npm, Python e SECURITY.md. Go e Rust têm publicações separadas. Para desenvolvimento do código-fonte, use:
git clone https://github.com/dcp-ai-protocol/dcp-ai.git
cd dcp-ai/sdks/typescript && npm install && npm run build # TypeScript SDK of main
cd ../../cli && npm install --no-save --package-lock=false --ignore-scripts --install-links ../sdks/typescript
pip install -e /path/to/dcp-ai/sdks/python # Python SDK of main
Os comandos de registro deste guia instalam as versões publicadas.
Atalhos sem instalação¶
Estes atalhos usam pacotes e imagens publicados, não main. O playground e os projetos iniciais são demonstrações e não produzem evidências de verificação de um SDK (limites abaixo); a imagem Docker executa o servidor de verificação de referência, que verifica bundles mas não os cria:
- Playground interativo: https://docs.dcp-ai.org/playground/ — gere identidades, construa bundles e verifique assinaturas no navegador.
- Projeto inicial com scaffold: execute
npm create @dcp-ai/langchain my-app(ou/crewai,/openai,/express) para gerar um projeto inicial. - Docker numa linha:
docker run -p 3000:3000 ghcr.io/dcp-ai-protocol/dcp-ai/verification:latestinicia o servidor de verificação de referência sem clonar nada.
O playground é uma demonstração: suas assinaturas PQ são simuladas e a canonicalização e o tratamento de Merkle são simplificados, portanto seus bundles não são evidência para a verificação dos SDKs. Os templates iniciais também têm limites: LangChain, CrewAI e OpenAI usam chaves e assinaturas de preenchimento; Express verifica apenas a estrutura. Use os exemplos dos SDKs abaixo para obter bundles verificáveis.
1. Instalar a CLI¶
O assistente da CLI é uma demonstração para explorar: suas chaves «ML-DSA-65» são simuladas (bytes aleatórios), e o RPR e o passaporte que ele grava não são assinados nem seguem os esquemas V2. Para criar uma identidade e bundles que verifiquem, vá para a §3 ou a §4; os limites estão listados em Criação de agentes.
A versão publicada, instalada ou executada diretamente:
A partir de uma cópia do repositório (acima), execute o assistente do repositório no diretório do seu projeto: node /path/to/dcp-ai/cli/bin/dcp-ai.js init.
2. Inicializar o seu agente¶
Isso cria os seguintes arquivos de demonstração no seu projeto:
| Arquivo | Finalidade |
|---|---|
.dcp/config.json |
Configuração e metadados do agente |
.dcp/keys/ed25519_public.key, .dcp/keys/ed25519_secret.key |
Par de chaves Ed25519 |
.dcp/keys/ml_dsa_65_public.key, .dcp/keys/ml_dsa_65_secret.key |
Par de chaves «ML-DSA-65» simulado (bytes aleatórios), quando se escolhem chaves pós-quânticas |
.dcp/identity.json |
Registro com forma de RPR (não assinado e fora do esquema) |
.dcp/passport.json |
Registro com forma de passaporte (não assinado e fora do esquema) |
Os arquivos de chaves secretas são gravados com as permissões padrão (0644 com a umask habitual 022): execute chmod 600 .dcp/keys/*_secret.key e mantenha-os fora do controle de versão adicionando .dcp/keys/ ao seu .gitignore.
3. SDK TypeScript¶
Os exemplos TypeScript abaixo funcionam com o npm SDK 2.2.1 ou com um checkout de desenvolvimento (veja Pacotes publicados e este guia).
Instale uma das duas:
- o SDK de
main, compilado de um checkout, para desenvolvimento do código-fonte:
- ou o SDK 2.2.1 publicado, que inclui essas correções e funcionalidades:
Criar e assinar um bundle (V1 — Ed25519)¶
O RPR e o passaporte são assinados, cada um, sobre o objeto sem o campo signature. verifySignedBundle verifica a assinatura do bundle, seus hashes e a cadeia; as assinaturas internas são verificadas à parte.
import { BundleBuilder, generateKeypair, signBundle, signObject, verifyObject, verifySignedBundle } from '@dcp-ai/sdk';
import type { AgentPassport, ResponsiblePrincipalRecord } from '@dcp-ai/sdk';
const now = new Date().toISOString();
const principalKeys = generateKeypair();
const agentKeys = generateKeypair();
// Each artifact is signed over the object without its `signature` field.
const rprBody: Omit<ResponsiblePrincipalRecord, 'signature'> = {
dcp_version: '1.0', human_id: 'human:example-001', legal_name: 'Example Principal',
entity_type: 'natural_person', jurisdiction: 'ES', liability_mode: 'owner_responsible',
override_rights: true, issued_at: now, expires_at: null, contact: null,
};
const rpr: ResponsiblePrincipalRecord = { ...rprBody, signature: signObject(rprBody, principalKeys.secretKeyB64) };
const passportBody: Omit<AgentPassport, 'signature'> = {
dcp_version: '1.0', agent_id: 'agent:example-001', public_key: agentKeys.publicKeyB64,
principal_binding_reference: rpr.human_id, capabilities: ['browse', 'api_call'],
risk_tier: 'low', created_at: now, status: 'active',
};
const passport: AgentPassport = { ...passportBody, signature: signObject(passportBody, agentKeys.secretKeyB64) };
const bundle = new BundleBuilder()
.responsiblePrincipalRecord(rpr)
.agentPassport(passport)
.intent({
dcp_version: '1.0', intent_id: 'intent:example-001', agent_id: passport.agent_id, human_id: rpr.human_id,
timestamp: now, action_type: 'api_call', target: { channel: 'api', domain: 'api.example.com' },
data_classes: ['none'], estimated_impact: 'low', requires_consent: false,
})
.policyDecision({
dcp_version: '1.0', intent_id: 'intent:example-001', decision: 'approve', risk_score: 0.05,
reasons: ['low-impact call'], required_confirmation: null,
})
.createAuditEntry({
dcp_version: '1.0', audit_id: 'audit:example-001', timestamp: now, agent_id: passport.agent_id,
human_id: rpr.human_id, intent_id: 'intent:example-001', policy_decision: 'approved',
outcome: 'call_completed', evidence: { tool: 'http', result_ref: null },
})
.build();
const signed = signBundle(bundle, { secretKeyB64: principalKeys.secretKeyB64, signerType: 'human', signerId: rpr.human_id });
console.log(verifySignedBundle(signed, principalKeys.publicKeyB64)); // { verified: true }
// The inner signatures, over the same objects without `signature`
console.log(verifyObject(rprBody, rpr.signature, principalKeys.publicKeyB64)); // true
console.log(verifyObject(passportBody, passport.signature, agentKeys.publicKeyB64)); // true
Verificar um bundle¶
import { readFileSync } from 'node:fs';
import { getDefaultRegistry, registerDefaultProviders, verifySignedBundleV2 } from '@dcp-ai/sdk';
registerDefaultProviders();
const signedBundle = JSON.parse(readFileSync('bundle.signed.json', 'utf8'));
const result = await verifySignedBundleV2(signedBundle, getDefaultRegistry());
console.log(result.verified, result.errors);
V2 — Assinaturas híbridas pós-quânticas¶
Cada artefato é um SignedPayload assinado no seu contexto de separação de domínio com Ed25519 + ML-DSA-65; o principal assina o RPR e o manifesto, e o agente, o passaporte, a intenção e a decisão de política.
import {
AlgorithmRegistry, BundleBuilderV2, DCP_CONTEXTS, Ed25519Provider, MlDsa65Provider, compositeSign,
generateSessionNonce, preparePayload, sha256Hex, canonicalizeV2, signBundleV2, verifySignedBundleV2,
} from '@dcp-ai/sdk';
import type {
AgentPassportV2, AuditEventV2, CompositeKeyPair, DcpContext, IntentV2, KeyEntry, PolicyDecisionV2,
ResponsiblePrincipalRecordV2, SignedPayload,
} from '@dcp-ai/sdk';
const registry = new AlgorithmRegistry();
const ed25519 = new Ed25519Provider();
const mlDsa65 = new MlDsa65Provider();
registry.registerSigner(ed25519);
registry.registerSigner(mlDsa65);
async function hybridKeys(): Promise<CompositeKeyPair> {
const c = await ed25519.generateKeypair();
const p = await mlDsa65.generateKeypair();
return {
classical: { kid: c.kid, alg: 'ed25519', secretKeyB64: c.secretKeyB64, publicKeyB64: c.publicKeyB64 },
pq: { kid: p.kid, alg: 'ml-dsa-65', secretKeyB64: p.secretKeyB64, publicKeyB64: p.publicKeyB64 },
};
}
const keyEntries = (keys: CompositeKeyPair): KeyEntry[] => [keys.classical, keys.pq].map((k) => ({
kid: k.kid, alg: k.alg, public_key_b64: k.publicKeyB64, created_at: '2026-01-01T00:00:00Z', expires_at: null, status: 'active',
}));
const sha256Of = (value: unknown) => `sha256:${sha256Hex(new TextEncoder().encode(canonicalizeV2(value)))}`;
async function signed<T>(payload: T, context: DcpContext, keys: CompositeKeyPair): Promise<SignedPayload<T>> {
const { canonicalBytes, payloadHash } = preparePayload(payload);
return { payload, payload_hash: payloadHash, composite_sig: await compositeSign(registry, context, canonicalBytes, keys) };
}
const principal = await hybridKeys();
const agent = await hybridKeys();
const nonce = generateSessionNonce();
const now = new Date().toISOString();
const rpr: ResponsiblePrincipalRecordV2 = {
dcp_version: '2.0', human_id: 'human:example-001', session_nonce: nonce, legal_name: 'Example Principal',
entity_type: 'natural_person', jurisdiction: 'ES', liability_mode: 'owner_responsible', override_rights: true,
issued_at: now, expires_at: null, contact: null, binding_keys: keyEntries(principal),
};
const passport: AgentPassportV2 = {
dcp_version: '2.0', agent_id: 'agent:example-001', session_nonce: nonce, keys: keyEntries(agent),
principal_binding_reference: rpr.human_id, capabilities: ['browse', 'api_call'], risk_tier: 'low',
created_at: now, status: 'active',
};
const intent: IntentV2 = {
dcp_version: '2.0', intent_id: 'intent:example-001', session_nonce: nonce, agent_id: passport.agent_id,
human_id: rpr.human_id, timestamp: now, action_type: 'api_call', target: { channel: 'api', domain: 'api.example.com' },
data_classes: ['none'], estimated_impact: 'low', requires_consent: false,
};
const policy: PolicyDecisionV2 = {
dcp_version: '2.0', intent_id: intent.intent_id, session_nonce: nonce, decision: 'approve', risk_score: 50,
reasons: ['low-impact call'], required_confirmation: null, applied_policy_hash: sha256Of({ policy: 'default' }), timestamp: now,
};
const audit: AuditEventV2 = {
dcp_version: '2.0', audit_id: 'audit:example-001', session_nonce: nonce, prev_hash: 'GENESIS', hash_alg: 'sha256',
timestamp: now, agent_id: passport.agent_id, human_id: rpr.human_id, intent_id: intent.intent_id,
intent_hash: sha256Of(intent), policy_decision: 'approved', outcome: 'call_completed',
evidence: { tool: 'http', result_ref: null, evidence_hash: null }, pq_checkpoint_ref: null,
};
const bundle = new BundleBuilderV2(nonce)
.responsiblePrincipalRecord(await signed(rpr, DCP_CONTEXTS.ResponsiblePrincipal, principal))
.agentPassport(await signed(passport, DCP_CONTEXTS.AgentPassport, agent))
.intent(await signed(intent, DCP_CONTEXTS.Intent, agent))
.policyDecision(await signed(policy, DCP_CONTEXTS.PolicyDecision, agent))
.addAuditEntry(audit)
.build();
const signedBundle = await signBundleV2(bundle, { registry, signerType: 'human', signerId: rpr.human_id, keys: principal });
const result = await verifySignedBundleV2(signedBundle, registry);
console.log(result.verified, result.errors); // true []
4. SDK Python¶
Instale uma das duas:
- um checkout para desenvolver o SDK:
- ou a versão publicada 2.10.1, incluindo as correções e APIs descritas aqui:
Criar e verificar um bundle¶
from datetime import datetime, timezone
from dcp_ai import (
AgentPassport,
AuditEvidence,
BundleBuilder,
Intent,
PolicyDecision,
ResponsiblePrincipalRecord,
generate_keypair,
sign_bundle,
sign_object,
verify_object,
verify_signed_bundle,
)
now = datetime.now(timezone.utc).isoformat()
principal_keys = generate_keypair()
agent_keys = generate_keypair()
# 1. The responsible principal, signed with the principal's key (the object without "signature")
rpr_body = {
"dcp_version": "1.0", "human_id": "human:example-001", "legal_name": "Example Principal",
"entity_type": "natural_person", "jurisdiction": "ES", "liability_mode": "owner_responsible",
"override_rights": True, "issued_at": now, "expires_at": None, "contact": None,
}
rpr = {**rpr_body, "signature": sign_object(rpr_body, principal_keys["secret_key_b64"])}
# 2. The agent passport, signed with the agent's key (the object without "signature")
passport_body = {
"dcp_version": "1.0", "agent_id": "agent:example-001", "public_key": agent_keys["public_key_b64"],
"principal_binding_reference": "human:example-001", "capabilities": ["browse", "api_call"],
"risk_tier": "low", "created_at": now, "status": "active",
}
passport = {**passport_body, "signature": sign_object(passport_body, agent_keys["secret_key_b64"])}
# 3. Intent, policy decision and one audit entry
intent = Intent(
intent_id="intent:example-001", agent_id="agent:example-001", human_id="human:example-001",
timestamp=now, action_type="api_call", target={"channel": "api", "domain": "api.example.com"},
data_classes=["none"], estimated_impact="low", requires_consent=False,
)
policy = PolicyDecision(
intent_id="intent:example-001", decision="approve", risk_score=0.05, reasons=["low-impact call"],
)
bundle = (
BundleBuilder()
.responsible_principal_record(ResponsiblePrincipalRecord(**rpr))
.agent_passport(AgentPassport(**passport))
.intent(intent)
.policy_decision(policy)
.create_audit_entry(
audit_id="audit:example-001", timestamp=now, agent_id="agent:example-001",
human_id="human:example-001", intent_id="intent:example-001", policy_decision="approved",
outcome="call_completed", evidence=AuditEvidence(tool="http", result_ref=None),
)
.build()
)
# 4. Sign with the principal's key and verify against the principal's public key
signed = sign_bundle(bundle, principal_keys["secret_key_b64"])
print(verify_signed_bundle(signed, principal_keys["public_key_b64"])) # {'verified': True}
# 5. The inner signatures, over the same objects without "signature"
print(verify_object(rpr_body, rpr["signature"], principal_keys["public_key_b64"])) # True
print(verify_object(passport_body, passport["signature"], agent_keys["public_key_b64"])) # True
Para bundles V2 em Python, veja V2 Bundles.
5. Níveis de segurança¶
O DCP seleciona automaticamente um nível de segurança criptográfica com base no perfil de risco da intenção:
| Nível | Nome | Modo de verificação | Intervalo de checkpoints PQ | Gatilho |
|---|---|---|---|---|
| 0 | Routine | Somente clássico (Ed25519) | A cada 50 eventos | Nenhum dos gatilhos abaixo |
| 1 | Standard | Híbrido preferido | A cada 10 eventos | Pontuação de risco 200–499, estimated_impact: medium |
| 2 | Elevated | Híbrido obrigatório | A cada evento | Pontuação de risco 500–799, dados pessoais, financeiros ou de saúde, pagamentos, estimated_impact: high, valores desconhecidos |
| 3 | Maximum | Híbrido obrigatório | A cada evento | Pontuação de risco ≥ 800, credenciais, dados de crianças |
A pontuação de risco é o risk_score da decisão de política (spec §14.2).
import { computeSecurityTier, tierToVerificationMode } from '@dcp-ai/sdk';
const tier = computeSecurityTier(intent, policyDecision);
const mode = tierToVerificationMode(tier);
// tier: 'elevated', mode: 'hybrid_required'
6. Telemetria e observabilidade¶
import { dcpTelemetry } from '@dcp-ai/sdk';
dcpTelemetry.init({
serviceName: 'my-agent',
enabled: true,
exporterType: 'console', // or 'otlp'
});
// Automatic span tracking
const spanId = dcpTelemetry.startSpan('sign_bundle', { tier: 'elevated' });
// ... perform operation ...
dcpTelemetry.endSpan(spanId);
// Record metrics
dcpTelemetry.recordSignLatency(12.5, 'ed25519');
// Get summary
const summary = dcpTelemetry.getMetricsSummary();
console.log(summary.sign.p95); // p95 sign latency in ms
7. Comunicação entre agentes (A2A)¶
import { createHello, createWelcome, createSession, encryptMessage } from '@dcp-ai/sdk';
// Agent A initiates
const hello = createHello(bundleA, kemPublicKeyB64, ['api_call'], 'standard');
// Agent B responds
const welcome = createWelcome(bundleB, kemPubB, kemCiphertextB64, 'standard');
// Establish encrypted session
const session = createSession(sessionId, sessionKey, 'agent-a', 'agent-b', 'standard');
// Send encrypted messages
const encrypted = encryptMessage(session, { action: 'transfer', amount: 100 });
Outros SDKs¶
Go¶
import dcp "github.com/dcp-ai-protocol/dcp-ai/sdks/go/v2/dcp"
canonical, _ := dcp.Canonicalize(map[string]string{"b": "2", "a": "1"})
// produces {"a":"1","b":"2"}
Rust¶
Os provedores de ML-DSA-65, ML-KEM-768, SLH-DSA-192f e Ed25519 ficam em dcp_ai::providers::*. Veja a documentação do crate dcp-ai no docs.rs para a superfície completa.
WebAssembly (navegador)¶
npm install @dcp-ai/wasm@^2.1.1 # the published version; for main, see the WASM SDK's Release status
Expõe as primitivas do SDK Rust a navegadores e ao Node.js. No Node.js, initDcp() precisa do arquivo .wasm como URL data:: veja Inicialização.
Executar os serviços de referência¶
Os quatro serviços a que a especificação se refere (servidor de verificação, anchor, log de transparência, registro de revogações) são distribuídos como imagens Docker. A partir de um diretório vazio:
docker run -d -p 3000:3000 ghcr.io/dcp-ai-protocol/dcp-ai/verification:latest
docker run -d -p 3001:3001 ghcr.io/dcp-ai-protocol/dcp-ai/anchor:latest
docker run -d -p 3002:3002 ghcr.io/dcp-ai-protocol/dcp-ai/transparency-log:latest
docker run -d -p 3003:3003 ghcr.io/dcp-ai-protocol/dcp-ai/revocation:latest
Para hospedagem gerenciada, veja as configurações do Fly.io em deploy/fly/ e o guia de implantação para alternativas com Cloud Run, Railway ou Compose.
Próximos passos¶
- Integração com LangChain — Adicione o DCP a agentes LangChain
- Integração com CrewAI — Adicione o DCP a equipes CrewAI
- Integração com OpenAI — Adicione o DCP às chamadas de função da OpenAI
- Middleware Express — Verifique bundles DCP em APIs Express
- Referência da API — Documentação completa do SDK
- Especificação do protocolo — Especificação completa do DCP v2.0
- Modelo de segurança — Modelo de ameaças e arquitetura de segurança
- Guia do operador — Executar serviços de verificação e ancoragem em produção