Use a API do IBM Cloud Resource Controller para gerenciamento de instâncias
Você pode usar a API REST do IBM Cloud® Resource Controller para obter, criar e atualizar instâncias programaticamente.
Todos os endpoints do Resource Controller exigem que você se autentique enviando um cabeçalho chamado Authorization com o token bearer. Consulte o guia de configuração da API REST.
Obter uma instância
Use o GET /v2/resource_instances/{crn} endpoint para obter informações sobre uma instância específica. O CRN deve estar codificado como URL no caminho.
Além dos campos padrão de Resource Controller, a resposta inclui campos específicos do Quantum tanto parameters em quanto em extensions. extensions armazena os metadados normalizados da instância, enquanto parameters armazena apenas a solicitação mais recente para modificar a instância. Portanto, você deve ler a partir de extensions em vez de parameters.
O extensions objeto inclui os seguintes campos:
instance_limit_seconds— Número inteiro, ounull. O limite de tempo de uso da instância. Consulte Definir limites de alocação de instâncias.usage_allocation_seconds— Número inteiro, ounull. O tempo alocado a esta instância, utilizado pelo agendador de distribuição justa para determinar a prioridade da fila. Consulte Definir limites de alocação de instâncias.backends— Matriz de cadeias de caracteres. A lista de nomes de backends permitidos para esta instância.["ANY"]significa que todos os back-ends do plano estão disponíveis (por padrão).[]significa que não há back-ends disponíveis.
O backends campo no objeto extensions pode estar desatualizado. Isso pode ocorrer quando o Suporte d IBM Quantum a altera sua conta de uma forma que afeta as instâncias. Por exemplo, quando um backend é removido de uma conta, isso atualiza a backends configuração da instância, mas essa alteração ainda não se reflete na API do Resource Controller.
Em vez disso, a solução alternativa atual é usar o IBM Quantum API REST do Serviço de Computação com o GET /v1/backends ponto de conexão. (Certifique-se de definir o cabeçalho Service-CRN com o endereço CRN da sua instância.)
O CRN deve estar codificado como URL no caminho. Substitua cada : por %3A e cada / por %2F. Por exemplo, crn:v1:bluemix:... torna-se crn%3Av1%3Abluemix%3A....
curl \
--request GET \
--url 'https://resource-controller.cloud.ibm.com/v2/resource_instances/<YOUR_INSTANCE_CRN_URL_ENCODED>' \
--header 'Authorization: Bearer <YOUR_BEARER_TOKEN>'import urllib.parse
import requests
crn = "<YOUR_INSTANCE_CRN>"
# We use urllib.parse.quote to URL-encode the CRN.
url = (
"https://resource-controller.cloud.ibm.com/v2/resource_instances/"
+ urllib.parse.quote(crn, safe="")
)
resp = requests.get(
url,
headers={"Authorization": f"Bearer {token}"},
timeout=30,
)
resp.raise_for_status()
print(resp.json())Obter uma lista de todas as instâncias
Use o GET /v2/resource_instances endpoint para obter uma lista de todas as suas instâncias. Defina o resource_id parâmetro de consulta como b6049020-80f4-11eb-a0f7-e35ec9b4054f para filtrar as instâncias do IBM Quantum®.
Se sua conta tiver vários planos e você quiser filtrar por plano, defina o resource_plan_id parâmetro de consulta com um dos seguintes valores:
Plano | resource_plan_id |
|---|---|
| Prêmio | 7f666d17-7893-47d8-bf9d-2b2389fc4dfc |
| Flexível | 53bde9d3-cdbb-46f5-a98f-60ebcadf7260 |
| Pagamento por uso | 5304b575-3cff-4455-90dc-ae4367762093 |
| Aberta | 850b21a7-71de-4e53-9441-1abdd202f35d |
Cada resultado inclui os mesmos extensions campos descritos na seção Obter uma instância.
curl \
--request GET \
--url 'https://resource-controller.cloud.ibm.com/v2/resource_instances?resource_id=b6049020-80f4-11eb-a0f7-e35ec9b4054f' \
--header 'Authorization: Bearer <YOUR_BEARER_TOKEN>'import requests
resp = requests.get(
"https://resource-controller.cloud.ibm.com/v2/resource_instances?resource_id=b6049020-80f4-11eb-a0f7-e35ec9b4054f",
headers={"Authorization": f"Bearer {token}"},
timeout=30,
)
resp.raise_for_status()
print(resp.json())Atualizar uma instância
Use o PATCH /v2/resource_instances/{crn} endpoint para atualizar o limite, a alocação e os back-ends permitidos para uma instância. O CRN deve estar codificado como URL no caminho.
"Content-Type: application/json"Passe um parameters objeto JSON no corpo da solicitação com os campos que você deseja alterar, juntamente com o cabeçalho. Os campos omitidos permanecem inalterados.
instance_limit_seconds— Número inteiro, ounull. O limite de tempo de uso da instância. Consulte Definir limites de alocação de instâncias.usage_allocation_seconds— Número inteiro, ounull. O tempo alocado a esta instância, utilizado pelo agendador de distribuição justa para determinar a prioridade da fila. Consulte Definir limites de alocação de instâncias. Não se aplica a instâncias do modelo Pay-As-You-Go.backends— Matriz de cadeias de caracteres. A lista de nomes de backends permitidos para esta instância.["ANY"]significa que todos os back-ends do plano estão disponíveis.[]significa que não há back-ends disponíveis.
A API ignora silenciosamente a solicitação se parameters ela for idêntica à solicitação anterior. No objeto parameters , inclua sempre um timestamp campo definido com a hora atual, para que cada solicitação seja tratada como única.
A resposta do endpoint é semelhante à obtenção de uma instância, inclusive na forma como lida com o extensions objeto.
O CRN deve estar codificado como URL no caminho. Substitua cada : por %3A e cada / por %2F. Por exemplo, crn:v1:bluemix:... torna-se crn%3Av1%3Abluemix%3A....
curl \
--request PATCH \
--url 'https://resource-controller.cloud.ibm.com/v2/resource_instances/<YOUR_INSTANCE_CRN_URL_ENCODED>' \
--header 'Authorization: Bearer <YOUR_BEARER_TOKEN>' \
--header 'Content-Type: application/json' \
--data "{
\"parameters\": {
\"timestamp\": \"$(date -u +"%Y-%m-%dT%H:%M:%SZ")\",
\"usage_allocation_seconds\": 220
}
}"import urllib.parse
import datetime
import requests
crn = "<YOUR_INSTANCE_CRN>"
# We use urllib.parse.quote to URL-encode the CRN.
url = (
"https://resource-controller.cloud.ibm.com/v2/resource_instances/"
+ urllib.parse.quote(crn, safe="")
)
timestamp = datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
body = {
"parameters": {
"timestamp": timestamp,
"usage_allocation_seconds": 220,
}
}
resp = requests.patch(
url,
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
},
json=body,
timeout=30,
)
resp.raise_for_status()
print(resp.json())Criar uma nova instância
Use o POST /v2/resource_instances endpoint para criar (provisionar) uma nova instância. Envie um corpo JSON com o cabeçalho "Content-Type: application/json".
Campos obrigatórios:
name— Um nome legível para a instância.target— A região, como, por exemplo,us-eastoueu-de.resource_plan_id— O plano para este caso. Consulte a tabela de IDs de planos.resource_group— O grupo de recursos a ser utilizado.
Você também pode incluir um parameters objeto para definir valores específicos do quantum:
instance_limit_seconds— Número inteiro, ounull. O limite de tempo de uso da instância. Consulte Definir limites de alocação de instâncias.usage_allocation_seconds— Número inteiro, ounull. O tempo alocado a esta instância, utilizado pelo agendador de distribuição justa para determinar a prioridade da fila. Consulte Definir limites de alocação de instâncias. Não se aplica a instâncias do modelo Pay-As-You-Go.backends— Matriz de cadeias de caracteres. A lista de nomes de backends permitidos para esta instância.["ANY"]significa que todos os back-ends do plano estão disponíveis.[]significa que não há back-ends disponíveis.
curl \
--request POST \
--url 'https://resource-controller.cloud.ibm.com/v2/resource_instances' \
--header 'Authorization: Bearer <YOUR_BEARER_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"name": "my-new-instance",
"target": "us-east",
"resource_plan_id": "7f666d17-7893-47d8-bf9d-2b2389fc4dfc",
"resource_group": "<YOUR_RESOURCE_GROUP_ID>",
"parameters": {
"instance_limit_seconds": 300,
"usage_allocation_seconds": 220
}
}'import requests
body = {
"name": "my-new-instance",
"target": "us-east",
"resource_plan_id": "7f666d17-7893-47d8-bf9d-2b2389fc4dfc",
"resource_group": "<YOUR_RESOURCE_GROUP_ID>",
"parameters": {
"instance_limit_seconds": 300,
"usage_allocation_seconds": 220,
},
}
resp = requests.post(
"https://resource-controller.cloud.ibm.com/v2/resource_instances",
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
},
json=body,
timeout=30,
)
resp.raise_for_status()
print(resp.json())Configurar o acesso do Qiskit Functions em uma instância
Siga estas instruções para configurar o acesso ao “ Qiskit Functions ” em uma instância existente do “ IBM Quantum Compute Service”, utilizando a API “ IBM Cloud ” Resource Controller. Siga as instruções na ordem, pois os comandos se complementam. Por exemplo, variáveis como o token e o URL são definidas em uma etapa e reutilizadas nas etapas seguintes.
Pré-requisitos
- Uma chave de API do IBM Cloud (também chamada de token). Se necessário, crie sua chave de API no painel.
- O arquivo
CRNda instância que você deseja configurar. O endereço CRN da instância está listado na página “Instâncias ”.
Passo 1: Obter um token ao portador
Troque sua chave de API por um token de portador. Você deverá passar esse token no cabeçalho de autorização de todas as solicitações do controlador de recursos. Execute o código a seguir para gerar um token de portador:
curl --request POST \
--url 'https://iam.cloud.ibm.com/identity/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data 'apikey=<YOUR_API_KEY>&grant_type=urn%3Aibm%3Aparams%3Aoauth%3Agrant-type%3Aapikey'
--silent | jq .import requests
api_key = "<YOUR_API_KEY>"
resp = requests.post(
"https://iam.cloud.ibm.com/identity/token",
headers={"Content-Type": "application/x-www-form-urlencoded"},
params={
"apikey": api_key,
"grant_type": "urn:ibm:params:oauth:grant-type:apikey",
},
timeout=30,
)
resp.raise_for_status()
token = resp.json()["access_token"]
print(token) A resposta inclui um access_token campo, que é o seu token de portador. Copie este valor.
Etapa 2: Verificar o acesso
Antes de fazer qualquer alteração, verifique se o seu token está funcionando e analise a configuração atual da instância.
O CRN deve ser codificado manualmente como URL no caminho. Substitua cada : por %3A e cada por / %2F. Por exemplo, torna-se crn:v1:bluemix:... crn%3Av1%3Abluemix%3A....
curl --request GET \
--url 'https://resource-controller.cloud.ibm.com/v2/resource_instances/<YOUR_INSTANCE_CRN_URL_ENCODED>' \
--header 'Authorization: Bearer <YOUR_BEARER_TOKEN>'
import urllib.parse
crn = "<YOUR_INSTANCE_CRN>"
# The CRN will be URL-encoded into the path.
instance_url = (
"https://resource-controller.cloud.ibm.com/v2/resource_instances/"
+ urllib.parse.quote(crn, safe="")
)
headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
resp = requests.get(instance_url, headers=headers, timeout=30)
resp.raise_for_status()
print(resp.json()["extensions"])
Uma resposta 200 OK confirma que seu token é válido. A configuração atual da instância está no campo “extensões” da resposta. Use isso em vez de parâmetros, que podem estar desatualizados.
Etapa 3: Verifique a configuração das funções no nível da conta
Uma instância só pode ter acesso ao que a conta tem direito. Antes de configurar a instância, consulte a configuração da conta para saber quais funções, modelos de negócios e permissões estão disponíveis para concessão. Esta é a fonte de referência para os valores que você enviará na Etapa 4.
Chame GET /accounts/{id} a API do Qiskit Runtime usando sua chave de API. O é {id} o ID da sua conta sem o prefixo a/ . Você pode encontrá-lo na instância CRN (crn:v1:bluemix:public:quantum-computing:...:a/<ACCOUNT_ID>:...).
curl --request GET \
--url 'https://quantum.cloud.ibm.com/api/v1/accounts/<ACCOUNT_ID>' \
--header 'Authorization: apikey <YOUR_API_KEY>'
account_id = "<ACCOUNT_ID>" # from the CRN: crn:...:a/<ACCOUNT_ID>:...
resp = requests.get(
f"https://quantum.cloud.ibm.com/api/v1/accounts/{account_id}",
headers={"Authorization": f"apikey {api_key}"},
timeout=30,
)
resp.raise_for_status()
for plan in resp.json()["plans"]:
print(plan["plan_id"], plan.get("functions"), plan.get("custom_functions"))
Cada plano na resposta inclui uma matriz de funções e, se configurado, um objeto custom_functions . Essas informações incluem o nome exato, o provedor, o modelo de negócios e os valores das permissões que você pode conceder a uma instância nesse plano.
GET /accounts/{id} mostra o que está disponível para concessão no nível da conta. GET /functions (consulte “Verificar o resultado ”) mostra o que já foi concedido a uma instância específica. Use o endpoint de conta para identificar valores válidos e o endpoint de funções para confirmar o resultado.
Etapa 4: Configurar o acesso às funções
Atualize a instância para conceder acesso às funções do catálogo e às funções personalizadas.
- Os valores
business_modelname,provider, e nas funções devem corresponder exatamente às entradas configuradas no nível da conta (consulte a etapa anterior ). As permissões devem ser um subconjunto não vazio das permissões da conta para essa função. Da mesma forma,custom_functions.permissionsdeve ser um subconjunto não vazio das permissõescustom_functionsda conta. - Inclua um carimbo de data e hora nos parâmetros de cada chamada PATCH. O mecanismo de deduplicação de mensagens ( Resource Controller ) deduplica as solicitações PATCH comparando os parâmetros recebidos com o último valor armazenado. Se houver correspondência, a solicitação é descartada silenciosamente, sem
200 OKchegar ao serviço. Inclua um valor de carimbo de data/hora variável para evitar isso.
curl --request PATCH \
--url 'https://resource-controller.cloud.ibm.com/v2/resource_instances/<YOUR_INSTANCE_CRN_URL_ENCODED>' \
--header 'Authorization: Bearer <YOUR_BEARER_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"parameters": {
"timestamp": "2026-06-30T00:00:00Z",
"functions": [
{
"name": "<FUNCTION_NAME>",
"provider": "<PROVIDER>",
"business_model": "<BUSINESS_MODEL>",
"permissions": [
"function.read",
"function.run",
"function-files.read",
"function-files.write"
]
}
],
"custom_functions": {
"permissions": [
"function-custom.write",
"function-custom.run"
]
}
}
}'
from datetime import datetime, timezone
# A changing timestamp keeps the Resource Controller from de-duplicating the request.
_now = datetime.now(timezone.utc)
timestamp = _now.strftime("%Y-%m-%dT%H:%M:%S.") + f"{_now.microsecond:06d}000Z"
body = {
"parameters": {
"timestamp": timestamp,
"functions": [
{
"name": "<FUNCTION_NAME>",
"provider": "<PROVIDER>",
"business_model": "<BUSINESS_MODEL>",
"permissions": [
"function.read",
"function.run",
"function-files.read",
"function-files.write",
],
}
],
"custom_functions": {
"permissions": ["function-custom.write", "function-custom.run"],
},
}
}
resp = requests.patch(instance_url, headers=headers, json=body, timeout=30)
resp.raise_for_status()
print(resp.json()["extensions"])Uma resposta 200 OK indica que a operação foi bem-sucedida. A configuração atualizada aparece no campo “extensões” da resposta.
Remover acesso às funções
Funções do catálogo
Para remover as funções do catálogo de uma instância, envie uma solicitação PATCH com "functions": null:
--data '{
"parameters": {
"timestamp": "2026-06-30T00:00:01Z",
"functions": null
}
}'body = {"parameters": {"timestamp": timestamp, "functions": None}}
resp = requests.patch(instance_url, headers=headers, json=body, timeout=30)
resp.raise_for_status()Definir ( "functions": [] um array vazio) tem o mesmo efeito que limpar as Funções do Catálogo. null é a forma canônica.
Funções customizadas
Para remover funções personalizadas de uma instância, envie uma solicitação PATCH com "custom_functions": null:
--data '{
"parameters": {
"timestamp": "2026-06-30T00:00:02Z",
"custom_functions": null
}
}'body = {"parameters": {"timestamp": timestamp, "custom_functions": None}}
resp = requests.patch(instance_url, headers=headers, json=body, timeout=30)
resp.raise_for_status()Ao definir essa opção, as funções personalizadas também "custom_functions": {"permissions": []} são apagadas. null é a forma canônica.
Verifique o resultado
Para confirmar se a instância possui a configuração correta do Qiskit Functions, use a GET /functions API Qiskit Runtime em vez da Resource Controller. O estado armazenado do Resource Controller pode estar desatualizado se alterações no nível da conta tiverem atualizado a instância fora do Resource Controller.
curl --request GET \
--url 'https://quantum.cloud.ibm.com/api/v1/functions' \
--header 'Authorization: apikey <YOUR_API_KEY>' \
--header 'Service-CRN: <YOUR_INSTANCE_CRN>'# The Service-CRN header takes the raw CRN, not the URL-encoded form.
resp = requests.get(
"https://quantum.cloud.ibm.com/api/v1/functions",
headers={"Authorization": f"apikey {api_key}", "Service-CRN": crn},
timeout=30,
)
resp.raise_for_status()
print(resp.json())A resposta lista as funções às quais a instância tem acesso no momento.