SpyBara
Go Premium

Documentation 2026-07-25 05:59 UTC to 2026-07-27 17:02 UTC

6 files changed +215 −8. View all changes and history on the product overview
2026
Tue 28 21:00 Mon 27 17:02 Sat 25 05:59 Fri 24 19:01 Thu 23 03:02 Wed 22 20:02 Tue 21 15:00 Mon 20 21:59 Sat 18 22:00 Fri 17 19:58 Thu 16 17:00 Wed 15 16:58 Tue 14 21:58 Mon 13 21:58 Sat 11 07:01 Fri 10 23:02 Thu 9 17:03 Wed 8 22:02 Mon 6 22:58 Sat 4 16:59
Details

24- **Eligibility:** Available to Pro, Plus, Business, Enterprise, and Education accounts on the web.24- **Eligibility:** Available to Pro, Plus, Business, Enterprise, and Education accounts on the web.

25- **Enable developer mode:** In [ChatGPT](https://chatgpt.com), open **Settings → Security and login** and turn on **Developer mode**.25- **Enable developer mode:** In [ChatGPT](https://chatgpt.com), open **Settings → Security and login** and turn on **Developer mode**.

26- **Create apps from MCP servers:**26- **Create apps from MCP servers:**

27 - Open **Settings → Plugins** or go directly to [chatgpt.com/plugins](https://chatgpt.com/plugins).27 - Go to [ChatGPT Plugins](https://chatgpt.com/plugins).

28 - Select the plus button and create a developer-mode app for your remote MCP server. It will appear in the composer's **Developer mode** tool later during conversations. The plus button will only create developer-mode apps after you turn on Developer mode.28 - Select the plus button and create a developer-mode app for your remote MCP server. It will appear in the composer's **Developer mode** tool later during conversations. The plus button will only create developer-mode apps after you turn on Developer mode.

29 - Supported MCP protocols: SSE and streaming HTTP.29 - Supported MCP protocols: SSE and streaming HTTP.

30 - Authentication supported: OAuth, No Authentication, and Mixed Authentication30 - Authentication supported: OAuth, No Authentication, and Mixed Authentication

Details

502| Detail level | Best for |502| Detail level | Best for |

503| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |503| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |

504| `low` | Fast, low-cost understanding when fine visual detail is not important. The model receives a low-resolution 512px x 512px version of the image. |504| `low` | Fast, low-cost understanding when fine visual detail is not important. The model receives a low-resolution 512px x 512px version of the image. |

505| `high` | Standard high-fidelity image understanding. |505| `high` | Standard high-fidelity image understanding when precise original-image coordinates are not required. |

506| `original` | Large, dense, spatially sensitive, or computer-use images. Available on `gpt-5.4` and future models. |506| `original` | Large, dense, spatially sensitive, or computer-use images. Available on `gpt-5.4` and future models. |

507| `auto` | Automatic detail selection. On `gpt-5.5` and GPT-5.6 models, `auto` and the omitted/default behavior are equivalent to `original`. |507| `auto` | Automatic detail selection. On `gpt-5.5` and GPT-5.6 models, `auto` and the omitted/default behavior are equivalent to `original`. |

508 508 

509For computer use, localization, and click-accuracy use cases on `gpt-5.4` and future models, we recommend `"detail": "original"`. See the [Computer use guide](https://developers.openai.com/api/docs/guides/tools-computer-use) for more detail.509For high-accuracy tasks that require fine visual detail or precise coordinates in the original image, such as optical character recognition (OCR), small-object detection, bounding boxes, localization, or computer use, set `"detail": "original"` when supported. The `low` and `high` detail levels may resize the image before analysis, which can obscure small details and cause model-generated coordinates to no longer match the original image. On `gpt-5.4` and `gpt-5.5`, `original` can also resize images that exceed the model's patch or dimension limits; for coordinate-sensitive tasks, resize those images before sending them and remap returned coordinates to the original image. Use `low` or `high` when lower cost or latency is more important than fine-detail recognition or spatial accuracy. See the [Computer use guide](https://developers.openai.com/api/docs/guides/tools-computer-use) for more detail.

510 510 

511Read more about how models resize images in the [Model sizing511Read more about how models resize images in the [Model sizing

512 behavior](#model-sizing-behavior) section, and about token costs in the512 behavior](#model-sizing-behavior) section, and about token costs in the

Details

116 116 

117## Connect from ChatGPT117## Connect from ChatGPT

118 118 

119Open **Settings Plugins** or [chatgpt.com/plugins](https://chatgpt.com/plugins), select the plus button to create a developer-mode app, and choose **Tunnel** under **Connection**. Select an available tunnel when ChatGPT lists it, or paste a valid `tunnel_id` if you already have one.119Go to [ChatGPT Plugins](https://chatgpt.com/plugins), select the plus button to create a developer-mode app, and choose **Tunnel** under **Connection**. Select an available tunnel when ChatGPT lists it, or paste a valid `tunnel_id` if you already have one.

120 120 

121If the tunnel does not appear in ChatGPT, verify that the tunnel is associated with the target ChatGPT workspace, not only with a Platform organization, and that the app creator has Tunnels **Read** + **Use**.121If the tunnel does not appear in ChatGPT, verify that the tunnel is associated with the target ChatGPT workspace, not only with a Platform organization, and that the app creator has Tunnels **Read** + **Use**.

122 122 


170## Where to configure it170## Where to configure it

171 171 

172- Manage OpenAI-hosted MCP tunnel endpoints in [Platform tunnel settings](https://platform.openai.com/settings/organization/tunnels).172- Manage OpenAI-hosted MCP tunnel endpoints in [Platform tunnel settings](https://platform.openai.com/settings/organization/tunnels).

173- Use a tunnel when creating a developer-mode app from **Settings Plugins** or [chatgpt.com/plugins](https://chatgpt.com/plugins).173- Use a tunnel when creating a developer-mode app at [ChatGPT Plugins](https://chatgpt.com/plugins).

174- For Codex or API flows, use the tunnel-backed MCP target exposed by the supported product surface.174- For Codex or API flows, use the tunnel-backed MCP target exposed by the supported product surface.

175 175 

176## Next steps176## Next steps

177 177 

178- Create or manage the tunnel in [Platform tunnel settings](https://platform.openai.com/settings/organization/tunnels).178- Create or manage the tunnel in [Platform tunnel settings](https://platform.openai.com/settings/organization/tunnels).

179- Validate your `tunnel-client` profile with `tunnel-client doctor --profile <profile> --explain`.179- Validate your `tunnel-client` profile with `tunnel-client doctor --profile <profile> --explain`.

180- Connect the tunnel from **Settings → Plugins**, [chatgpt.com/plugins](https://chatgpt.com/plugins), or the supported OpenAI surface you are using.180- Connect the tunnel from [ChatGPT Plugins](https://chatgpt.com/plugins) or the supported OpenAI surface you are using.

181 181 

182<div class="not-prose my-8 grid gap-4 lg:grid-cols-2">182<div class="not-prose my-8 grid gap-4 lg:grid-cols-2">

183 <figure>183 <figure>

Details

38| OIDC Issuer URL | The expected OIDC issuer URL. Issuer comparisons ignore a trailing slash. |38| OIDC Issuer URL | The expected OIDC issuer URL. Issuer comparisons ignore a trailing slash. |

39| Audience | The expected `aud` claim on the external subject token. |39| Audience | The expected `aud` claim on the external subject token. |

40| Description | Optional description for the Workload Identity Provider. |40| Description | Optional description for the Workload Identity Provider. |

41| Use custom URL for OIDC discovery | When enabled, OpenAI fetches OIDC discovery metadata from a public HTTPS URL that can differ from the token issuer. |

42| Custom OIDC discovery URL | The discovery base URL or complete `/.well-known/openid-configuration` URL used when custom discovery is enabled. |

41| Use uploaded JWKS for token verification | When enabled, OpenAI verifies tokens against an uploaded JWKS instead of fetching keys from OIDC discovery. |43| Use uploaded JWKS for token verification | When enabled, OpenAI verifies tokens against an uploaded JWKS instead of fetching keys from OIDC discovery. |

42| JWKS JSON | The uploaded public JWKS object used when uploaded JWKS verification is enabled. The JWKS must contain a non-empty `keys` array and no private key material. |44| JWKS JSON | The uploaded public JWKS object used when uploaded JWKS verification is enabled. The JWKS must contain a non-empty `keys` array and no private key material. |

43| Attribute transformations | Optional CEL expressions that derive custom `openai.*` attributes from token claims for mapping decisions. |45| Attribute transformations | Optional CEL expressions that derive custom `openai.*` attributes from token claims for mapping decisions. |

44 46 

47Custom OIDC discovery and uploaded JWKS are mutually exclusive. Enabling custom discovery hides the uploaded JWKS option. The custom discovery URL must use public HTTPS and cannot contain credentials, a custom port, a query, or a fragment.

48 

49If **Use custom URL for OIDC discovery** does not appear in your dashboard, use standard OIDC discovery or enable **Use uploaded JWKS for token verification** instead. Use the public JWKS published by your identity provider and update it when the provider rotates its signing keys.

50 

51When the token issuer and discovery host differ, set **OIDC Issuer URL** to the token's `iss` claim and **Custom OIDC discovery URL** to the host that publishes the provider's discovery document. OpenAI still checks the token against the configured issuer; the custom URL only determines where it retrieves discovery metadata and public signing keys.

52 

45### Transform token claims with CEL53### Transform token claims with CEL

46 54 

47Attribute transformations use Common Expression Language (CEL). OpenAI supports the standard CEL operators specified in [langdef.md](https://github.com/google/cel-spec/blob/master/doc/langdef.md) and doesn't add custom workload identity federation-specific functions. Each expression receives one root object:55Attribute transformations use Common Expression Language (CEL). OpenAI supports the standard CEL operators specified in [langdef.md](https://github.com/google/cel-spec/blob/master/doc/langdef.md) and doesn't add custom workload identity federation-specific functions. Each expression receives one root object:


78]86]

79```87```

80 88 

81Transformation results must be scalar values: strings, booleans, integers, or finite numbers. Arrays, objects, null values, and evaluation errors fail mapping resolution. OpenAI converts scalar transformation results to strings before comparing them to mapping values. For example, `true` becomes `"true"` and `7` becomes `"7"`.89Transformation results must be scalar values: strings, boolean values, integers, or finite numbers. Arrays, objects, null values, and evaluation errors fail mapping resolution. OpenAI converts scalar transformation results to strings before comparing them to mapping values. For example, `true` becomes `"true"` and `7` becomes `"7"`.

82 90 

83Mapping keys that start with `openai.` resolve only from attribute transformations. Raw subject token claims that already use an `openai.` prefix don't affect mapping decisions unless you configure a matching transformation.91Mapping keys that start with `openai.` resolve only from attribute transformations. Raw subject token claims that already use an `openai.` prefix don't affect mapping decisions unless you configure a matching transformation.

84 92 


87OpenAI verifies OIDC subject tokens with the key source configured on the Workload Identity Provider.95OpenAI verifies OIDC subject tokens with the key source configured on the Workload Identity Provider.

88 96 

89- **OIDC discovery:** OpenAI fetches the issuer's `/.well-known/openid-configuration`, then fetches the discovered `jwks_uri`. Discovery documents and remote JWKS payloads are cached for 600 seconds.97- **OIDC discovery:** OpenAI fetches the issuer's `/.well-known/openid-configuration`, then fetches the discovered `jwks_uri`. Discovery documents and remote JWKS payloads are cached for 600 seconds.

98- **Custom OIDC discovery:** OpenAI fetches `/.well-known/openid-configuration` from the configured custom discovery base URL, then fetches the discovered `jwks_uri`. The token's `iss` claim must still match **OIDC Issuer URL**. Use this option when the issuer and discovery document use different hosts.

90- **Key refresh on miss:** If a token `kid` isn't found in the cached JWKS, OpenAI refreshes the JWKS and tries the lookup again before rejecting the token.99- **Key refresh on miss:** If a token `kid` isn't found in the cached JWKS, OpenAI refreshes the JWKS and tries the lookup again before rejecting the token.

91- **Uploaded JWKS:** When **Use uploaded JWKS for token verification** is enabled, OpenAI uses the uploaded JWKS stored on the Workload Identity Provider and doesn't perform OIDC discovery or remote JWKS fetching. After a provider update is saved and available to token exchange, new exchanges use the saved JWKS.100- **Uploaded JWKS:** When **Use uploaded JWKS for token verification** is enabled, OpenAI uses the uploaded JWKS stored on the Workload Identity Provider and doesn't perform OIDC discovery or remote JWKS fetching. After a provider update is saved and available to token exchange, new exchanges use the saved JWKS.

92- **Multiple keys:** A JWKS can contain multiple public keys, and each key must have a unique non-empty `kid`.101- **Multiple keys:** A JWKS can contain multiple public keys, and each key must have a unique non-empty `kid`.

Details

1# Configuring workload identity federation for Oracle Cloud Infrastructure

2 

3Use Oracle Cloud Infrastructure (OCI) as a Workload Identity Provider by exchanging an Oracle Identity Cloud Service (IDCS) access token for a short-lived OpenAI access token. An OCI instance principal signs a token exchange request to an identity domain in the same tenancy. OpenAI validates the resulting token and authorizes the OCI workload to act as a mapped OpenAI service account.

4 

5This setup does not require an OpenAI API key, a custom Oracle OAuth resource application, or dynamic group grants to a custom application.

6 

7## Set up the OCI workload

8 

9Run your workload on an OCI Compute instance with an instance principal. For Oracle Kubernetes Engine (OKE), confirm which identity signs the request: the standard instance principal signer typically identifies the worker node, not an individual Kubernetes pod.

10 

11The signer obtains credentials from the [OCI instance metadata service](https://docs.oracle.com/en-us/iaas/Content/Compute/Tasks/gettingmetadata.htm). Verify the workload can reach the link-local metadata endpoint:

12 

13```bash

14curl --fail --silent \

15 --header "Authorization: Bearer Oracle" \

16 http://169.254.169.254/opc/v2/instance/id

17```

18 

19The workload must also be able to make outbound HTTPS requests to the identity domain in its tenancy. The metadata endpoint itself does not require a NAT gateway or an internet connection.

20 

21### Request an Oracle identity token

22 

23Use `InstancePrincipalsSecurityTokenSigner` from the OCI Python SDK to sign an OAuth token exchange request to your identity domain:

24 

25```text

26POST https://<identity-domain>/oauth2/v1/token

27Content-Type: application/x-www-form-urlencoded;charset=utf-8

28 

29grant_type=urn:ietf:params:oauth:grant-type:token-exchange

30scope=urn:opc:idm:__myscopes__

31requested_token_type=urn:ietf:params:oauth:token-type:access_token

32```

33 

34The `urn:opc:idm:__myscopes__` scope uses the instance principal's existing authorization. Use the returned IDCS access token as the subject token for OpenAI workload identity federation. Do not replace the Oracle token audience with `https://api.openai.com/v1`; configure the OpenAI provider with an audience that appears in the actual Oracle token.

35 

36### Verify the token

37 

38Set `TOKEN` to an access token generated by the actual OCI workload, then use the existing local JWT decoder to inspect its claims:

39 

40```python

41import base64

42import json

43import os

44 

45payload = os.environ["TOKEN"].split(".")[1]

46payload += "=" * (-len(payload) % 4)

47print(json.dumps(json.loads(base64.urlsafe_b64decode(payload)), indent=2))

48```

49 

50 

51The decoder inspects the token without verifying its signature. Treat raw tokens as sensitive, do not log them, and do not paste production tokens into third-party JWT decoders.

52 

53A decoded Oracle access token can contain the following claims:

54 

55```json

56{

57 "iss": "https://identity.oraclecloud.com/",

58 "aud": [

59 "https://idcs-example.us-phoenix-1.identity.oraclecloud.com",

60 "https://idcs-example.identity.oraclecloud.com"

61 ],

62 "sub_type": "instance",

63 "ipst_instance": "ocid1.instance.oc1.phx.<instance-id>",

64 "ipst_compartment": "ocid1.compartment.oc1..<compartment-id>",

65 "domain_id": "ocid1.domain.oc1..<domain-id>",

66 "ca_ocid": "ocid1.tenancy.oc1..<tenancy-id>",

67 "tenant": "idcs-example",

68 "exp": 1782369434,

69 "iat": 1782365834

70}

71```

72 

73Use the token issued by your own identity domain as the source of truth. Configure the exact `iss` value and one of the token's `aud` values. Prefer the immutable `ipst_instance`, `ipst_compartment`, `domain_id`, and `ca_ocid` claims when authorizing a workload.

74 

75## Set up workload identity federation

76 

77Create a Workload Identity Provider for your Oracle identity domain, then add a mapping for the OCI instance or compartment that can use the target OpenAI service account.

78 

79### Set up the Workload Identity Provider

80 

811. **Create the Workload Identity Provider.** Set **Name** to a unique value, such as `oracle-cloud-prod`. Use **Description**, such as `Production OCI instance principal`, to identify the trusted workload.

82 

832. **Set the issuer and audience.** Set **OIDC Issuer URL** to the token's `iss` claim, such as `https://identity.oraclecloud.com/`. Set **Audience** to one of the `aud` values in the same token.

84 

853. **Configure tenant-specific OIDC discovery when available.** If **Use custom URL for OIDC discovery** appears under **Advanced**, enable it. Set **Custom OIDC discovery URL** to your tenant-specific identity domain, such as `https://idcs-example.identity.oraclecloud.com`. OpenAI retrieves `https://idcs-example.identity.oraclecloud.com/.well-known/openid-configuration`, then uses the discovery document's `jwks_uri` to retrieve the tenant's public signing keys. If the custom discovery option does not appear, enable **Use uploaded JWKS for token verification** and upload the public JWKS from `https://<identity-domain>/admin/v1/SigningCert/jwk` instead.

86 

874. **Add attribute transformations only when you need derived attributes.** You can use raw Oracle claims such as `ipst_instance`, `ipst_compartment`, `domain_id`, and `ca_ocid` directly in service account mapping assertions. For an explicitly derived instance attribute, enter `instance` with the expression `assertion.ipst_instance` to create `openai.instance`.

88 

89Oracle's [OpenID Connect discovery reference](https://docs.oracle.com/en/cloud/paas/identity-cloud/idcsa/op-well-known-openid-configuration-get.html) shows why custom discovery is important: the discovery document can declare the global issuer `https://identity.oraclecloud.com/` while publishing the token endpoint and `jwks_uri` on the tenant-specific identity domain. Keep the global issuer in **OIDC Issuer URL** and use the tenant domain for **Custom OIDC discovery URL**.

90 

91If your identity domain publishes discovery metadata at the token issuer,

92 leave custom discovery disabled and use standard OIDC discovery. If OpenAI

93 cannot reach the tenant discovery document or signing-key endpoint, disable

94 custom discovery, enable **Use uploaded JWKS for token verification**, and

95 upload the tenant's public JWKS from

96 `https://<identity-domain>/admin/v1/SigningCert/jwk`. Custom discovery and

97 uploaded JWKS cannot be enabled at the same time. Update uploaded keys when

98 Oracle rotates its signing certificates.

99 

100### Set up the service account mapping

101 

1021. **Create a service account mapping.** Set **Name** to a unique value, such as `oracle-instance-prod`, and add a description that identifies the trusted OCI workload.

103 

1042. **Match the narrowest stable OCI identity.** To grant access to one instance, set **Key** to `ipst_instance` and **Value** to the exact instance OCID from the verified token. To grant access to instances across one compartment, set **Key** to `ipst_compartment` and **Value** to the exact compartment OCID.

105 

1063. **Add domain and tenancy boundaries when needed.** Add further mapping rows for `domain_id` or `ca_ocid` to limit the workload to a particular Oracle identity domain or tenancy. Add `sub_type` with the value `instance` when the token includes that claim and you want to require an instance principal. All mapping rows must match.

107 

1084. **Choose the OpenAI target.** Set **Project** to the project that owns the service account, then select the **Service account** that the trusted OCI workload can use.

109 

1105. **Narrow API permissions if needed.** Select only the **Permissions** needed by the workload. Mapping permissions can restrict the selected service account but cannot grant permissions the service account does not already have.

111 

112An OKE workload that uses the standard instance principal signer inherits the

113 worker node's identity. An instance-level mapping authorizes that node, not

114 just one pod. Use a more specific, supported OCI workload identity when you

115 need isolation between pods sharing a worker node.

116 

117## Use the token in code

118 

119Install the OpenAI, OCI, and Requests Python packages:

120 

121```bash

122pip install openai oci requests

123```

124 

125Set `OCI_IDENTITY_DOMAIN_URL` to the base URL of the identity domain in the same tenancy as the workload. Set `OPENAI_IDENTITY_PROVIDER_ID` and `OPENAI_SERVICE_ACCOUNT_ID` to the IDs from your OpenAI provider and service account mapping.

126 

127The following example signs an Oracle token exchange request with the OCI instance principal, returns the IDCS access token to the OpenAI SDK, and lets the SDK exchange it for a short-lived OpenAI access token when needed:

128 

129Authenticate with an OCI instance principal

130 

131```python

132import os

133 

134import oci

135import requests

136from openai import OpenAI

137from openai.auth import SubjectTokenProvider

138 

139 

140def oracle_instance_principal_token_provider(

141 identity_domain_url: str,

142) -> SubjectTokenProvider:

143 def get_token() -> str:

144 signer = oci.auth.signers.InstancePrincipalsSecurityTokenSigner()

145 response = requests.post(

146 f"{identity_domain_url.rstrip('/')}/oauth2/v1/token",

147 data={

148 "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",

149 "scope": "urn:opc:idm:__myscopes__",

150 "requested_token_type": "urn:ietf:params:oauth:token-type:access_token",

151 },

152 headers={

153 "Content-Type": "application/x-www-form-urlencoded;charset=utf-8",

154 },

155 auth=signer,

156 timeout=30,

157 )

158 response.raise_for_status()

159 

160 token = response.json().get("access_token")

161 if not isinstance(token, str) or not token:

162 raise RuntimeError("Oracle IDCS did not return an access token.")

163 

164 return token

165 

166 return {"token_type": "jwt", "get_token": get_token}

167 

168 

169client = OpenAI(

170 workload_identity={

171 "identity_provider_id": os.environ["OPENAI_IDENTITY_PROVIDER_ID"],

172 "service_account_id": os.environ["OPENAI_SERVICE_ACCOUNT_ID"],

173 "provider": oracle_instance_principal_token_provider(

174 os.environ["OCI_IDENTITY_DOMAIN_URL"]

175 ),

176 },

177)

178 

179response = client.responses.create(

180 model="gpt-5.6-terra",

181 input="Say hello from Oracle Cloud Infrastructure workload identity federation.",

182)

183 

184print(response.output_text)

185```

186 

187 

188The subject token provider requests a fresh Oracle token when the OpenAI SDK needs to renew the workload identity credential. Never print or persist the Oracle subject token or the resulting OpenAI access token.

189 

190## OCI security recommendations

191 

192- Map one instance with `ipst_instance` when only one workload should have access.

193- Use `ipst_compartment` only when every eligible instance in that compartment should share the mapping.

194- Add `domain_id` or `ca_ocid` to enforce identity domain and tenancy boundaries.

195- Use a separate OpenAI service account for each application and environment.

196- Verify whether an OKE token represents a worker node before relying on pod-level isolation.

197- Use the audience present in the issued Oracle token rather than assuming an OpenAI-specific audience.

198- Rotate uploaded public keys when Oracle rotates its signing keys if your identity domain cannot use OIDC discovery.

mcp.md +1 −1

Details

465### Connect in ChatGPT465### Connect in ChatGPT

466 466 

4671. In [ChatGPT](https://chatgpt.com), open **Settings → Security and login** and turn on **Developer mode**.4671. In [ChatGPT](https://chatgpt.com), open **Settings → Security and login** and turn on **Developer mode**.

4681. Open **Settings → Plugins** or the [Plugins directory](https://chatgpt.com/plugins), select the plus button, and connect your server URL in developer mode.4681. Go to [ChatGPT Plugins](https://chatgpt.com/plugins), select the plus button, and connect your server URL in developer mode.

4691. Test your plugin by running prompts in chat and deep research.4691. Test your plugin by running prompts in chat and deep research.

470 470 

471For detailed setup steps, see [Connect and test your plugin](https://developers.openai.com/plugins/deploy/connect-chatgpt).471For detailed setup steps, see [Connect and test your plugin](https://developers.openai.com/plugins/deploy/connect-chatgpt).