Resumo
Acesso
Os endpoints de EKM estão acessíveis na API de Gestão através de uma Admin API Key. https://platform.openai.com/settings/organization/admin-keys (não utilize uma API key normal). As Admin API keys estão disponíveis para os proprietários da organização.
Utilize
api.external_keys.writepara criar ou eliminar chaves externas, eapi.external_keys.readpara listar ou validar chaves externas. Uma única chave só precisa de ambos os scopes se tiver de executar operações de leitura e de escrita.Atualmente, precisamos de ativar uma feature flag para a sua organização nestes endpoints. Sabe que tem a feature flag se vir **external_key_id **devolvido pelo endpoint existente List Projects: https://api.openai.com/v1/organization/projects
Utilização
A sua configuração de EKM é registada ao nível da organização através de um novo endpoint https://api.openai.com/v1/organization/external_keys
O registo da sua configuração de EKM devolve um external_key_id no formato extkey_xxxx
As configurações de EKM são ativadas ao nível do projeto ao passar um external_key_id no corpo do endpoint existente Create Project https://api.openai.com/v1/organization/projects
Restrições
Tem primeiro de testar o EKM num novo projeto através da API de Gestão.
Recomendamos criar novos projetos para as suas cargas de trabalho de EKM. No entanto, se quiser EKM num projeto existente, podemos adicioná-lo à feature flag. Tenha em conta as seguintes boas práticas antes de implementar o EKM nos seus projetos de produção existentes.
Teste primeiro, no seu projeto de teste da API EKM, todas as funcionalidades da API que utiliza em produção
Aplique uma implementação gradual em vez de preencher com EKM todos os projetos da API de produção de uma só vez
Endpoints ao nível da organização
Registar uma chave externa na sua organização
AWS
Pedido de exemplo
type: string - sempre “aws”
name: string - Um nome amigável para a sua configuração
role_arn: string - O ARN da função que a OpenAI irá assumir na sua cloud
kms_arn: string - O ARN do Key Management System da chave mestra que gere
external_id: string - O ID da sua organização ou o ID do projeto API
curl -X POST \
-H "Content-type: application/json" \
-H "Authorization: Bearer $TOKEN" \
"https://api.openai.com/v1/organization/external_keys" \
-d '{
"type": "aws",
"name": "Configuração EKM AWS",
"role_arn": "arn:aws:iam::<12_DIGIT_ACCOUNT_NUMBER>:role/<ROLE>",
"kms_arn": "arn:aws:kms:<REGION>:<ACCOUNT_NUMBER>:key/<UUID>",
"external_id": <o id da sua organização ou do projeto>
}'Resposta de exemplo
{
"id": "extkey_xxxx",
"object": "organization.external_key",
"created_at": 1746175499,
"api_project_ids": [],
"type": "aws",
"name": "Configuração EKM AWS",
"role_arn": "arn:aws:iam::<ACCOUNT_NUMBER>:role/<ROLE>",
"kms_arn": "arn:aws:kms:<REGION>:<ACCOUNT_NUMBER>:key/<UUID>",
"external_id": <o id da sua organização ou do projeto>
} GCP
Pedido de exemplo
type: string - sempre "gcp",
name: string - Um nome amigável para a sua configuração
workload_identity_project_number: string - O número de projeto GCP de 12 dígitos onde registou a workload identity da OpenAI
workload_identity_pool_id: string - O pool que contém o fornecedor de Workload Identity que registou para a OpenAI
workload_identity_provider_id: string - O fornecedor de Workload Identity que registou para a OpenAI
audience: string - A audience que a OpenAI deve passar no token quando assumimos uma função através do seu GCP STS
kms_project_id: string - O nome do projeto GCP onde o seu KMS está alojado
kms_key_ring_name: string - O key ring do Key Management System que contém a chave mestra que gere
kms_key_name: string - O nome da chave mestra do Key Management System
kms_key_location: string - A região onde a sua chave mestra do Key Management System está localizada
Se o seu KMS estiver alojado num projeto GCP diferente daquele onde registou a Workload Identity da OpenAI, certifique-se de que o projeto que contém a Workload Identity da OpenAI tem pelo menos o KMS ativado, acedendo a https://console.developers.google.com/apis/api/cloudkms.googleapis.com/overview
curl -X POST \
-H "Content-type: application/json" \
-H "Authorization: Bearer $TOKEN" \
"https://api.openai.com/v1/organization/external_keys" \
-d '{
"type": "gcp",
"name": "Configuração EKM GCP",
"workload_identity_project_number": "123456789012",
"workload_identity_pool_id": "openai-azure",
"workload_identity_provider_id": "openai-ekm-service-role",
"audience": <o id da sua organização ou do projeto>,
"kms_project_id": "adjective-noun-12345",
"kms_key_name": "openai-kms-key",
"kms_key_ring_name": "openai-kms-key-ring",
"kms_key_location": "us-east1"
}'Resposta de exemplo
{
"id": "extkey_xxxxxx",
"object": "organization.external_key",
"created_at": 1746174349,
"api_project_ids": [],
"type": "gcp",
"name": "Configuração EKM GCP",
"workload_identity_project_number": "123456789012",
"kms_key_ring_name": "openai-kms-key-ring",
"kms_key_name": "openai-kms-key",
"kms_key_location": "us-east1",
"audience": <o id da sua organização ou do projeto>,
"kms_project_id": "adjective-noun-12345",
"workload_identity_pool_id": "openai-azure",
"workload_identity_provider_id": "openai-ekm-service-role"
}Azure
Pedido de exemplo
type: string - sempre "azure",
name: string - Um nome amigável para a sua configuração
tenant_id: string - O UUID do seu tenant Azure
vault_uri: string - O URI do cofre Azure que contém a chave mestra que gere
key_name: string - O nome da chave mestra do Azure Key Vault que gere.
Tem de ter o formato <org-xxx>--<any_name>
em que org-xxx é o ID da sua organização OpenAI, que pode encontrar em https://platform.openai.com/settings/organization/general
curl -X POST \
-H "Content-type: application/json" \
-H "Authorization: Bearer $TOKEN" \
"https://api.openai.com/v1/organization/external_keys" \
-d '{
"type": "azure",
"name": "Configuração EKM Azure",
"tenant_id": "<UUID>",
"vault_uri": "https://<VAULT_NAME>.vault.azure.net/",
"key_name": "org-xxx--some-key"
}'Resposta de exemplo
{
"id": "extkey_xxxx",
"object": "organization.external_key",
"created_at": 1746174377,
"api_project_ids": [],
"type": "azure",
"name": "Configuração EKM Azure",
"tenant_id": "<UUID>",
"vault_uri": "https://<VAULT_NAME>.vault.azure.net/",
"key_name": "org-xxx--some-key"
}Eliminar uma chave externa registada na sua organização
Nota: Só pode eliminar uma chave externa se esta não estiver associada a quaisquer projetos ativos. Se estiver associada a um projeto ativo, tem primeiro de arquivar esse projeto.
Pedido de exemplo
curl -X DELETE \
-H "Authorization: Bearer $TOKEN" \
"https://api.openai.com/v1/organization/external_keys/extkey_xxxx"Resposta de exemplo
{
"id": "extkey_xxxxx",
"object": "organization.external_key.deleted",
"created_at": 1746127808,
"api_project_ids": [],
"type": "aws",
"account_number": "123456789012",
"kms_arn": "arn:aws:kms:<REGION>:<ACCOUNT_NUMBER>:key/<UUID>",
"name": "Configuração EKM AWS",
"role_arn": "arn:aws:iam::<ACCOUNT_NUMBER>:role/<ROLE>"
}Obter as chaves externas registadas na sua organização
Pedido de exemplo
curl -X GET \
-H "Authorization: Bearer $TOKEN" \
"https://api.openai.com/v1/organization/external_keys"Resposta de exemplo
{
"object": "list",
"data": [
{
"id": "extkey_xxxx",
"object": "organization.external_key",
"created_at": 1746127808,
"api_project_ids": [],
"type": "aws",
"name": "Configuração EKM AWS",
"account_number": "123456789012",
"kms_arn": "arn:aws:kms:<REGION>:<ACCOUNT_NUMBER>:key/<UUID>",
role_arn": "arn:aws:iam::<ACCOUNT_NUMBER>:role/<ROLE>"
}
],
"first_id": "extkey_xxxx",
"has_more": false,
"last_id": "extkey_xxxx"
}Validar uma chave externa
Pode utilizar este endpoint para verificar várias coisas
A sua configuração de cloud externa continua válida com a OpenAI depois de ter efetuado alterações (verá uma resposta de sucesso)
A revogação da sua chave foi feita corretamente, está a ser processada pela OpenAI e produzirá efeito após o fim do TTL de cache de 1 hora (verá uma resposta de erro)
Pedido de exemplo
curl -X POST -H "Authorization: Bearer $TOKEN"
"https://api.openai.com/v1/organization/external_keys/extkey_xxx/validate"Resposta de exemplo
{
"status": "success"
}Ou um erro apresentado pelo fornecedor de cloud.
Endpoints ao nível do projeto
Criar um novo projeto com um ID de chave externa
É igual ao endpoint existente Create Project, com a adição do parâmetro external_key_id no pedido e na resposta.
Pedido de exemplo
curl -X POST \
-H "Content-type: application/json" \
-H "Authorization: Bearer $TOKEN" \
"https://api.openai.com/v1/organization/projects" \
-d '{
"name": "Algum Projeto",
"external_key_id": "extkey_xxxx"
}'Resposta de exemplo
{
"object": "project",
"id": "proj_xxxxx",
"title": "Algum Projeto",
"external_key_id": "extkey_xxxxx",
"created": 1740012721,
"organization_id": "org-xxxxx",
"is_initial": false,
"geography": null,
"scale_tier_enabled": false,
"disable_user_api_keys": false,
"zdr_type": null,
}[Restrito] Atualizar um projeto existente com um ID de chave externa
É igual ao endpoint existente Update Project, com a adição do parâmetro external_key_id no pedido e na resposta.
Recomendamos criar novos projetos de API para as suas cargas de trabalho de EKM. Se quiser EKM em todos os seus projetos de API existentes, peça-o ao seu diretor de conta e adicioná-lo-emos à feature flag. Tenha em conta as seguintes boas práticas antes de implementar o EKM nos seus projetos de produção existentes.
Teste primeiro, no seu projeto de teste da API EKM, todas as funcionalidades da API que utiliza em produção
Aplique uma implementação gradual em vez de preencher com EKM todos os projetos da API de produção de uma só vez
Pedido de exemplo
curl -X POST \
-H "Content-type: application/json" \
-H "Authorization: Bearer $TOKEN" \
"https://api.openai.com/v1/organization/projects/proj_xxx" \
-d '{
"external_key_id": "extkey_xxxx"
}'Listar todos os projetos da sua organização
É igual ao endpoint existente, mas com a adição de external_key_id na resposta da API
Pedido de exemplo
curl -X GET \
-H "Authorization: Bearer $TOKEN" \
"https://api.openai.com/v1/organization/projects"Resposta de exemplo
{
"object": "list",
"data": [
{
"object": "organization.project",
"id": "proj_xxxx",
"name": "Nome do Projeto",
"external_key_id": "extkey_xxxx",
"created_at": 1717798982,
"archived_at": null,
"status": "active"
}
],
"first_id": "proj_xxxx",
"last_id": "proj_xxxx",
"has_more": true
}