Set up OpenAI in the AppHost
This article is the reference for the Aspire OpenAI hosting integration. It enumerates the AppHost APIs — with examples for both AppHost.cs and apphost.ts — that you use to model an OpenAI parent resource and model resources in your AppHost project.
If you’re new to the OpenAI integration, start with the Get started with OpenAI integrations guide. For how consuming apps read the connection information this page exposes, see Connect to OpenAI.
Installation
Section titled “Installation”To start building an Aspire app that uses OpenAI, install the 📦 Aspire.Hosting.OpenAI NuGet package:
aspire add openaiLearn more about aspire add in the command reference.
Or, choose a manual installation approach:
#:package Aspire.Hosting.OpenAI@*<PackageReference Include="Aspire.Hosting.OpenAI" Version="*" />aspire add openaiLearn more about aspire add in the command reference.
This updates your aspire.config.json with the OpenAI hosting integration package:
{ "packages": { "Aspire.Hosting.OpenAI": "13.3.0" }}Add OpenAI resource
Section titled “Add OpenAI resource”Once you’ve installed the hosting integration in your AppHost project, you can add an OpenAI parent resource and then add one or more model resources beneath it:
var builder = DistributedApplication.CreateBuilder(args);
var openai = builder.AddOpenAI("openai");
var chat = openai.AddModel("chat", "gpt-4o-mini");
var exampleProject = builder.AddProject<Projects.ExampleProject>("apiservice") .WithReference(chat);
// After adding all resources, run the app...import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
const const openai: OpenAIResource
openai = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addOpenAI(name: string): OpenAIResource
Adds an OpenAI resource to the distributed application model.
addOpenAI("openai");
const const chat: OpenAIModelResource
chat = await const openai: OpenAIResource
openai.OpenAIResource.addModel(name: string, model: string): OpenAIModelResource
Adds an OpenAI model resource.
addModel("chat", "gpt-4o-mini");
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addNodeApp(name: string, appDirectory: string, scriptPath: string): NodeAppResource
Adds a Node.js application resource
addNodeApp("api", "./api", "index.js") .ExecutableResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): NodeAppResource (+2 overloads)
Adds a reference to another resource
withReference(const chat: OpenAIModelResource
chat);
// After adding all resources, run the app...-
Calling
AddOpenAI(oraddOpenAI) creates anOpenAIResourcethat models the OpenAI account. It registers a secret parameter for the API key that defaults to theOPENAI_API_KEYenvironment variable. -
Calling
AddModel(oraddModel) creates anOpenAIModelResourcechild whose connection string is composed from the parent endpoint, API key, and the model name you supply. -
The AppHost reference call configures a connection in the consuming project named after the referenced model resource, such as
chatin the preceding example. Multiple models can share the single API key and endpoint from the parent resource.
Add multiple OpenAI model resources
Section titled “Add multiple OpenAI model resources”Add multiple model children beneath the same parent to share a single API key and endpoint:
var builder = DistributedApplication.CreateBuilder(args);
var openai = builder.AddOpenAI("openai");
var chat = openai.AddModel("chat", "gpt-4o-mini");var embeddings = openai.AddModel("embeddings", "text-embedding-3-small");
var exampleProject = builder.AddProject<Projects.ExampleProject>("apiservice") .WithReference(chat) .WithReference(embeddings);
// After adding all resources, run the app...import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
const const openai: OpenAIResource
openai = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addOpenAI(name: string): OpenAIResource
Adds an OpenAI resource to the distributed application model.
addOpenAI("openai");
const const chat: OpenAIModelResource
chat = await const openai: OpenAIResource
openai.OpenAIResource.addModel(name: string, model: string): OpenAIModelResource
Adds an OpenAI model resource.
addModel("chat", "gpt-4o-mini");const const embeddings: OpenAIModelResource
embeddings = await const openai: OpenAIResource
openai.OpenAIResource.addModel(name: string, model: string): OpenAIModelResource
Adds an OpenAI model resource.
addModel("embeddings", "text-embedding-3-small");
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addNodeApp(name: string, appDirectory: string, scriptPath: string): NodeAppResource
Adds a Node.js application resource
addNodeApp("api", "./api", "index.js") .ExecutableResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): NodeAppResource (+2 overloads)
Adds a reference to another resource
withReference(const chat: OpenAIModelResource
chat) .ExecutableResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): NodeAppResource (+2 overloads)
Adds a reference to another resource
withReference(const embeddings: OpenAIModelResource
embeddings);
// After adding all resources, run the app...Referencing chat passes a connection string named chat to the project, and referencing embeddings passes a connection string named embeddings. Both share the parent API key and endpoint.
Use default API key parameter
Section titled “Use default API key parameter”Calling AddOpenAI("openai") (or addOpenAI("openai")) automatically creates a secret parameter named openai-openai-apikey. Aspire resolves its value in this order:
- The
Parameters:openai-openai-apikeyconfiguration key (user secrets,appsettings.*, or environment variables). - The
OPENAI_API_KEYenvironment variable.
If neither source provides a value, startup throws an exception. Provide the key via the Aspire CLI:
aspire secret set Parameters:openai-openai-apikey sk-your-api-keyUse custom API key parameter
Section titled “Use custom API key parameter”Replace the default parameter by creating your own secret parameter and passing it to WithApiKey (or withApiKey) on the parent:
var builder = DistributedApplication.CreateBuilder(args);
var apiKey = builder.AddParameter("my-api-key", secret: true);
var openai = builder.AddOpenAI("openai") .WithApiKey(apiKey);
var chat = openai.AddModel("chat", "gpt-4o-mini");
var exampleProject = builder.AddProject<Projects.ExampleProject>("apiservice") .WithReference(chat);
// After adding all resources, run the app...import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
const const apiKey: ParameterResource
apiKey = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addParameter(name: string, options?: { value?: string; publishValueAsDefault?: boolean; secret?: boolean;}): ParameterResource (+1 overload)
Adds a parameter resource
addParameter("my-api-key", { secret?: boolean | undefined
secret: true });
const const openai: OpenAIResource
openai = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addOpenAI(name: string): OpenAIResource
Adds an OpenAI resource to the distributed application model.
addOpenAI("openai");await const openai: OpenAIResource
openai.OpenAIResource.withApiKey(apiKey: string | ParameterResource): OpenAIResource
Configures the API key for the OpenAI resource.
withApiKey(const apiKey: ParameterResource
apiKey);
const const chat: OpenAIModelResource
chat = await const openai: OpenAIResource
openai.OpenAIResource.addModel(name: string, model: string): OpenAIModelResource
Adds an OpenAI model resource.
addModel("chat", "gpt-4o-mini");
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addNodeApp(name: string, appDirectory: string, scriptPath: string): NodeAppResource
Adds a Node.js application resource
addNodeApp("api", "./api", "index.js") .ExecutableResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): NodeAppResource (+2 overloads)
Adds a reference to another resource
withReference(const chat: OpenAIModelResource
chat);
// After adding all resources, run the app...Add a custom endpoint
Section titled “Add a custom endpoint”Override the default https://api.openai.com/v1 endpoint to use a proxy, an Azure OpenAI endpoint, or any OpenAI-compatible gateway. Call WithEndpoint (or withEndpoint) on the parent resource:
var builder = DistributedApplication.CreateBuilder(args);
var openai = builder.AddOpenAI("openai") .WithEndpoint("https://my-gateway.example.com/v1");
var chat = openai.AddModel("chat", "gpt-4o-mini");
var exampleProject = builder.AddProject<Projects.ExampleProject>("apiservice") .WithReference(chat);
// After adding all resources, run the app...import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
const const openai: OpenAIResource
openai = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addOpenAI(name: string): OpenAIResource
Adds an OpenAI resource to the distributed application model.
addOpenAI("openai");await const openai: OpenAIResource
openai.OpenAIResource.withEndpoint(endpoint: string): OpenAIResource
Configures the endpoint URI for the OpenAI resource.
withEndpoint("https://my-gateway.example.com/v1");
const const chat: OpenAIModelResource
chat = await const openai: OpenAIResource
openai.OpenAIResource.addModel(name: string, model: string): OpenAIModelResource
Adds an OpenAI model resource.
addModel("chat", "gpt-4o-mini");
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addNodeApp(name: string, appDirectory: string, scriptPath: string): NodeAppResource
Adds a Node.js application resource
addNodeApp("api", "./api", "index.js") .ExecutableResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): NodeAppResource (+2 overloads)
Adds a reference to another resource
withReference(const chat: OpenAIModelResource
chat);
// After adding all resources, run the app...All model resources beneath the parent inherit the overridden endpoint. The overridden endpoint is reflected in the Endpoint and Uri connection properties that Aspire injects into consuming apps.
Add health check per model
Section titled “Add health check per model”Add an optional health check to a model resource to validate endpoint reachability, API key validity, and model existence at startup:
var builder = DistributedApplication.CreateBuilder(args);
var openai = builder.AddOpenAI("openai");
var chat = openai.AddModel("chat", "gpt-4o-mini") .WithHealthCheck();
var exampleProject = builder.AddProject<Projects.ExampleProject>("apiservice") .WithReference(chat);
// After adding all resources, run the app...import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
const const openai: OpenAIResource
openai = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addOpenAI(name: string): OpenAIResource
Adds an OpenAI resource to the distributed application model.
addOpenAI("openai");
const const chat: OpenAIModelResource
chat = await const openai: OpenAIResource
openai.OpenAIResource.addModel(name: string, model: string): OpenAIModelResource
Adds an OpenAI model resource.
addModel("chat", "gpt-4o-mini");await const chat: OpenAIModelResource
chat.OpenAIModelResource.withHealthCheck(): OpenAIModelResource
Adds a health check for the OpenAI model resource.
withHealthCheck();
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addNodeApp(name: string, appDirectory: string, scriptPath: string): NodeAppResource
Adds a Node.js application resource
addNodeApp("api", "./api", "index.js") .ExecutableResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): NodeAppResource (+2 overloads)
Adds a reference to another resource
withReference(const chat: OpenAIModelResource
chat);
// After adding all resources, run the app...The model health check validates endpoint reachability, API key validity (401), and model existence (404). It executes only once per application instance to limit rate-limit implications.
Available models
Section titled “Available models”Common model identifiers for the OpenAI API:
| Category | Model identifiers |
|---|---|
| Chat | gpt-5, gpt-4o, gpt-4o-mini, gpt-4-turbo |
| Reasoning | o3, o3-mini, o4-mini |
| Realtime | gpt-realtime |
| Embeddings | text-embedding-3-small, text-embedding-3-large |
| Images | dall-e-3 |
| Audio | whisper-1 |
For the full and up-to-date list, see the OpenAI models documentation.
Connection properties
Section titled “Connection properties”For the full reference of OpenAI connection properties — and how consuming apps in C#, TypeScript, Python, and Go read them — see Connect to OpenAI.