Set up Azure AI Foundry in the AppHost
This article is the reference for the Aspire Azure AI Foundry hosting integration. It enumerates the AppHost APIs — with examples for both AppHost.cs and apphost.ts — that you use to model a Foundry account, model deployments, Foundry projects, hosted agents, and prompt agents in your AppHost project.
If you’re new to the Azure AI Foundry integration, start with the Get started with Azure AI Foundry integrations guide. For how consuming apps read the connection information this page exposes, see Connect to Azure AI Foundry.
Installation
Section titled “Installation”To start building an Aspire app that uses Azure AI Foundry, install the 📦 Aspire.Hosting.Foundry NuGet package:
aspire add azure-ai-foundryLearn more about aspire add in the command reference.
Or, choose a manual installation approach:
#:package Aspire.Hosting.Foundry@*<PackageReference Include="Aspire.Hosting.Foundry" Version="*" />aspire add azure-ai-foundryLearn more about aspire add in the command reference.
This updates your aspire.config.json with the Azure AI Foundry hosting integration package:
{ "packages": { "Aspire.Hosting.Foundry": "13.3.0-preview.1.26256.5" }}For an introduction to working with the Azure AI Foundry hosting integration, see Get started with Azure AI Foundry integrations.
Add a Foundry resource
Section titled “Add a Foundry resource”To add an Azure AI Foundry resource to your AppHost project, call the AddFoundry method providing a name:
var builder = DistributedApplication.CreateBuilder(args);
var foundry = builder.AddFoundry("foundry");
builder.AddProject<Projects.ExampleProject>() .WithReference(foundry);
// 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 foundry: FoundryResource
foundry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addFoundry(name: string): FoundryResource
Adds a Microsoft Foundry resource to the distributed application model.
addFoundry('foundry');
await const builder: IDistributedApplicationBuilder
builder .IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileOrOptions?: ProjectResourceOptions;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject('api', '../ExampleProject/ExampleProject.csproj') .ProjectResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): ProjectResource (+2 overloads)
Adds a reference to another resource
withReference(const foundry: FoundryResource
foundry);
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.build(): DistributedApplication
Builds the distributed application
build().DistributedApplication.run(cancellationToken?: cancellationToken): void
Runs the distributed application
run();The preceding code adds an Azure AI Foundry resource named foundry to the AppHost project. The WithReference method passes the connection information to the ExampleProject project.
Add a Foundry deployment resource
Section titled “Add a Foundry deployment resource”To add a Foundry deployment resource, call the AddDeployment method with one of the generated FoundryModel entries:
var builder = DistributedApplication.CreateBuilder(args);
var foundry = builder.AddFoundry("foundry");
var chat = foundry.AddDeployment("chat", FoundryModel.OpenAI.Gpt5Mini);
builder.AddProject<Projects.ExampleProject>() .WithReference(chat) .WaitFor(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 foundry: FoundryResource
foundry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addFoundry(name: string): FoundryResource
Adds a Microsoft Foundry resource to the distributed application model.
addFoundry('foundry');
const const chat: FoundryDeploymentResource
chat = await const foundry: FoundryResource
foundry.FoundryResource.addDeployment(name: string, model: FoundryModel | string, options?: { modelVersion?: string; format?: string;} | undefined): FoundryDeploymentResource (+1 overload)
Adds a Microsoft Foundry deployment resource to a Microsoft Foundry resource.
addDeployment('chat', { FoundryModel.name: string
name: 'gpt-5-mini', FoundryModel.version: string
version: '2025-06-01', FoundryModel.format: string
format: 'OpenAI',});
await const builder: IDistributedApplicationBuilder
builder .IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileOrOptions?: ProjectResourceOptions;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject('api', '../ExampleProject/ExampleProject.csproj') .ProjectResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): ProjectResource (+2 overloads)
Adds a reference to another resource
withReference(const chat: FoundryDeploymentResource
chat) .ProjectResource.waitFor(dependency: IResource, waitBehavior?: WaitBehavior): ProjectResource
Waits for another resource to be ready
waitFor(const chat: FoundryDeploymentResource
chat);
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.build(): DistributedApplication
Builds the distributed application
build().DistributedApplication.run(cancellationToken?: cancellationToken): void
Runs the distributed application
run();The preceding code:
- Adds an Azure AI Foundry resource named
foundry. - Adds a Foundry deployment resource named
chatusing the generatedFoundryModel.OpenAI.Gpt5Minidescriptor.
If you need a different generated model descriptor, use the corresponding nested type, such as FoundryModel.Microsoft.Phi4Reasoning:
var builder = DistributedApplication.CreateBuilder(args);
var foundry = builder.AddFoundry("foundry");
var chat = foundry.AddDeployment("chat", FoundryModel.Microsoft.Phi4Reasoning);
builder.AddProject<Projects.ExampleProject>() .WithReference(chat) .WaitFor(chat);
builder.Build().Run();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 foundry: FoundryResource
foundry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addFoundry(name: string): FoundryResource
Adds a Microsoft Foundry resource to the distributed application model.
addFoundry('foundry');
const const chat: FoundryDeploymentResource
chat = await const foundry: FoundryResource
foundry.FoundryResource.addDeployment(name: string, model: FoundryModel | string, options?: { modelVersion?: string; format?: string;} | undefined): FoundryDeploymentResource (+1 overload)
Adds a Microsoft Foundry deployment resource to a Microsoft Foundry resource.
addDeployment('chat', { FoundryModel.name: string
name: 'Phi-4-reasoning', FoundryModel.version: string
version: '1', FoundryModel.format: string
format: 'Microsoft',});
await const builder: IDistributedApplicationBuilder
builder .IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileOrOptions?: ProjectResourceOptions;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject('api', '../ExampleProject/ExampleProject.csproj') .ProjectResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): ProjectResource (+2 overloads)
Adds a reference to another resource
withReference(const chat: FoundryDeploymentResource
chat) .ProjectResource.waitFor(dependency: IResource, waitBehavior?: WaitBehavior): ProjectResource
Waits for another resource to be ready
waitFor(const chat: FoundryDeploymentResource
chat);
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.build(): DistributedApplication
Builds the distributed application
build().DistributedApplication.run(cancellationToken?: cancellationToken): void
Runs the distributed application
run();Configure deployment properties
Section titled “Configure deployment properties”You can customize deployment properties using the WithProperties method:
var chat = foundry.AddDeployment("chat", FoundryModel.OpenAI.Gpt5Mini) .WithProperties(deployment => { deployment.SkuName = "Standard"; deployment.SkuCapacity = 10; });The preceding code sets the SKU name to Standard and capacity to 10 for the deployment.
Add a Foundry project
Section titled “Add a Foundry project”Use the AddProject method to create an Azure AI Foundry project for agents, project-scoped connections, and related Azure resources:
var builder = DistributedApplication.CreateBuilder(args);
var foundry = builder.AddFoundry("foundry");var project = foundry.AddProject("my-project");
var chat = project.AddModelDeployment("chat", FoundryModel.OpenAI.Gpt5Mini);
builder.AddProject<Projects.ExampleProject>("api") .WithReference(project) .WithReference(chat) .WaitFor(chat);
builder.Build().Run();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 foundry: FoundryResource
foundry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addFoundry(name: string): FoundryResource
Adds a Microsoft Foundry resource to the distributed application model.
addFoundry('foundry');const const project: AzureCognitiveServicesProjectResource
project = await const foundry: FoundryResource
foundry.FoundryResource.addProject(name: string): AzureCognitiveServicesProjectResource
Adds a Microsoft Foundry project resource to a Microsoft Foundry resource.
addProject('my-project');
const const chat: FoundryDeploymentResource
chat = await const project: AzureCognitiveServicesProjectResource
project.AzureCognitiveServicesProjectResource.addModelDeployment(name: string, model: FoundryModel | string, options?: { modelVersion?: string; format?: string;}): FoundryDeploymentResource (+1 overload)
Adds a model deployment to the parent Microsoft Foundry resource.
addModelDeployment('chat', { FoundryModel.name: string
name: 'gpt-5-mini', FoundryModel.version: string
version: '2025-06-01', FoundryModel.format: string
format: 'OpenAI',});
await const builder: IDistributedApplicationBuilder
builder .IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileOrOptions?: ProjectResourceOptions;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject('api', '../ExampleProject/ExampleProject.csproj') .ProjectResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): ProjectResource (+2 overloads)
Adds a reference to another resource
withReference(const project: AzureCognitiveServicesProjectResource
project) .ProjectResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): ProjectResource (+2 overloads)
Adds a reference to another resource
withReference(const chat: FoundryDeploymentResource
chat) .ProjectResource.waitFor(dependency: IResource, waitBehavior?: WaitBehavior): ProjectResource
Waits for another resource to be ready
waitFor(const chat: FoundryDeploymentResource
chat);
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.build(): DistributedApplication
Builds the distributed application
build().DistributedApplication.run(cancellationToken?: cancellationToken): void
Runs the distributed application
run();The preceding code creates a Foundry project and adds a deployment through AddModelDeployment. When you call WithReference(project), Aspire injects the standard connection string and project-specific connection properties such as the project endpoint and Application Insights connection string into the consuming resource.
Configure a Foundry project
Section titled “Configure a Foundry project”You can customize the Azure resources associated with a Foundry project:
var builder = DistributedApplication.CreateBuilder(args);
var foundry = builder.AddFoundry("foundry");var appInsights = builder.AddAzureApplicationInsights("appinsights");var keyVault = builder.AddAzureKeyVault("keyvault");var registry = builder.AddAzureContainerRegistry("agents");
var project = foundry.AddProject("my-project") .WithAppInsights(appInsights) .WithKeyVault(keyVault) .WithContainerRegistry(registry);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 foundry: FoundryResource
foundry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addFoundry(name: string): FoundryResource
Adds a Microsoft Foundry resource to the distributed application model.
addFoundry('foundry');const const appInsights: AzureApplicationInsightsResource
appInsights = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addAzureApplicationInsights(name: string): AzureApplicationInsightsResource
Adds an Azure Application Insights resource
addAzureApplicationInsights('appinsights');const const keyVault: AzureKeyVaultResource
keyVault = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addAzureKeyVault(name: string): AzureKeyVaultResource
Adds an Azure Key Vault resource
addAzureKeyVault('keyvault');const const registry: AzureContainerRegistryResource
registry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addAzureContainerRegistry(name: string): AzureContainerRegistryResource
Adds an Azure Container Registry resource to the distributed application model.
addAzureContainerRegistry('agents');
await const foundry: FoundryResource
foundry .FoundryResource.addProject(name: string): AzureCognitiveServicesProjectResource
Adds a Microsoft Foundry project resource to a Microsoft Foundry resource.
addProject('my-project') .AzureCognitiveServicesProjectResource.withAppInsights(appInsights: AzureApplicationInsightsResource): AzureCognitiveServicesProjectResource
Associates an Azure Application Insights resource with a Microsoft Foundry project.
withAppInsights(const appInsights: AzureApplicationInsightsResource
appInsights) .AzureCognitiveServicesProjectResource.withKeyVault(keyVault: AzureKeyVaultResource): AzureCognitiveServicesProjectResource
Associates an Azure Key Vault resource with a Microsoft Foundry project.
withKeyVault(const keyVault: AzureKeyVaultResource
keyVault) .IResource.withContainerRegistry(registry: IResource): AzureCognitiveServicesProjectResource
Configures a resource to use a container registry
withContainerRegistry(registry);Error ts(2345) ― AddProject creates a default Azure Container Registry for hosted agents. Use WithContainerRegistry when you want to point the project at a different registry.
Publish a hosted agent to Azure AI Foundry
Section titled “Publish a hosted agent to Azure AI Foundry”Use PublishAsHostedAgent to publish an executable or containerized app as a hosted agent in a Foundry project:
var builder = DistributedApplication.CreateBuilder(args);
var foundry = builder.AddFoundry("foundry");var project = foundry.AddProject("my-project");var chat = project.AddModelDeployment("chat", FoundryModel.OpenAI.Gpt5Mini);
builder.AddPythonApp("agent-python", "..\\agent", "main:app") .WithReference(project) .WithReference(chat) .PublishAsHostedAgent(project);
builder.AddProject<Projects.Agent>("agent-dotnet") .WithHttpEndpoint(targetPort: 9000) .WithReference(project) .WithReference(chat) .PublishAsHostedAgent(project);
builder.Build().Run();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 foundry: FoundryResource
foundry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addFoundry(name: string): FoundryResource
Adds a Microsoft Foundry resource to the distributed application model.
addFoundry('foundry');const const project: AzureCognitiveServicesProjectResource
project = await const foundry: FoundryResource
foundry.FoundryResource.addProject(name: string): AzureCognitiveServicesProjectResource
Adds a Microsoft Foundry project resource to a Microsoft Foundry resource.
addProject('my-project');const const chat: FoundryDeploymentResource
chat = await const project: AzureCognitiveServicesProjectResource
project.AzureCognitiveServicesProjectResource.addModelDeployment(name: string, model: FoundryModel | string, options?: { modelVersion?: string; format?: string;}): FoundryDeploymentResource (+1 overload)
Adds a model deployment to the parent Microsoft Foundry resource.
addModelDeployment('chat', { FoundryModel.name: string
name: 'gpt-5-mini', FoundryModel.version: string
version: '2025-06-01', FoundryModel.format: string
format: 'OpenAI',});
await const builder: IDistributedApplicationBuilder
builder .IDistributedApplicationBuilder.addPythonApp(name: string, appDirectory: string, scriptPath: string): PythonAppResource
Adds a Python script application resource
addPythonApp('agent-python', '../agent', 'main:app') .ExecutableResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): PythonAppResource (+2 overloads)
Adds a reference to another resource
withReference(const project: AzureCognitiveServicesProjectResource
project) .ExecutableResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): PythonAppResource (+2 overloads)
Adds a reference to another resource
withReference(const chat: FoundryDeploymentResource
chat) .ExecutableResource.publishAsHostedAgent(options?: { project?: AzureCognitiveServicesProjectResource; configure?: ((obj: HostedAgentConfiguration) => Promise<void>) | undefined;} | undefined): PythonAppResource (+1 overload)
Publishes an executable resource as a hosted agent in Microsoft Foundry.
publishAsHostedAgent({ project?: AzureCognitiveServicesProjectResource | undefined
project });
await const builder: IDistributedApplicationBuilder
builder .IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileOrOptions?: ProjectResourceOptions;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject('agent-dotnet', '../Agent/Agent.csproj') .ProjectResource.withHttpEndpoint(options?: { port?: number; targetPort?: number; name?: string; env?: string; isProxied?: boolean;} | undefined): ProjectResource (+1 overload)
Adds an HTTP endpoint
withHttpEndpoint({ targetPort?: number | undefined
targetPort: 9000 }) .ProjectResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): ProjectResource (+2 overloads)
Adds a reference to another resource
withReference(const project: AzureCognitiveServicesProjectResource
project) .ProjectResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): ProjectResource (+2 overloads)
Adds a reference to another resource
withReference(const chat: FoundryDeploymentResource
chat) .ProjectResource.publishAsHostedAgent(options?: { project?: AzureCognitiveServicesProjectResource; configure?: ((obj: HostedAgentConfiguration) => Promise<void>) | undefined;} | undefined): ProjectResource (+1 overload)
Publishes an executable resource as a hosted agent in Microsoft Foundry.
publishAsHostedAgent({ project?: AzureCognitiveServicesProjectResource | undefined
project });
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.build(): DistributedApplication
Builds the distributed application
build().DistributedApplication.run(cancellationToken?: cancellationToken): void
Runs the distributed application
run();In run mode, PublishAsHostedAgent(...) configures a local http endpoint for the agent. Aspire first checks whether the resource already has an endpoint named http. If that endpoint has a target port, Aspire preserves it. If there is no existing http target port, Aspire defaults to 8088.
Aspire also injects the selected port as DEFAULT_AD_PORT, so hosted-agent apps can bind to the right port:
var port = Environment.GetEnvironmentVariable("DEFAULT_AD_PORT") ?? "8088";builder.WebHost.UseUrls($"http://+:{port}");If your hosted agent listens on a different port, declare the endpoint before calling PublishAsHostedAgent(...):
var dotnetWeatherAgent = builder.AddProject<Projects.WeatherAgent_Dotnet>("weather-agent-dotnet") .WithHttpEndpoint(targetPort: 9000) .WithReference(project).WaitFor(project) .WithReference(chat).WaitFor(chat);
dotnetWeatherAgent.PublishAsHostedAgent(project);In run mode, Aspire also adds dashboard URLs for /responses, /liveness, and /readiness, configures /liveness as an HTTP health check, adds a dashboard command for sending a message to /responses, and enables OpenTelemetry environment variables for agent instrumentation.
For .NET hosted agents, add your Service Defaults project reference and call builder.AddServiceDefaults() in the hosted-agent app so logs, metrics, traces, HTTP instrumentation, and OTLP export flow into the Aspire dashboard. Then enable telemetry on the Foundry Responses chat client that backs the Microsoft Agent Framework (MAF) agent.
In publish mode, Aspire creates an AzureHostedAgentResource and publishes the container to the project-associated registry.
If you omit the project argument, Aspire uses an existing Foundry project from the app model or creates one automatically.
Add and publish a prompt agent
Section titled “Add and publish a prompt agent”For prompt-only scenarios, use AddPromptAgent on a Foundry project:
var builder = DistributedApplication.CreateBuilder(args);
var foundry = builder.AddFoundry("foundry");var project = foundry.AddProject("my-project");var chat = project.AddModelDeployment("chat", FoundryModel.OpenAI.Gpt5Mini);
var webSearch = project.AddWebSearchTool("web-search");
var webResearcher = project.AddPromptAgent(chat, name: "web-researcher", instructions: """ You are the Web Researcher. Use web search for current information, cite sources, summarize tradeoffs, and keep answers concise and practical. """) .WithTool(webSearch);
builder.Build().Run();import { createBuilder } from './.modules/aspire.js';
const builder = await createBuilder();
const foundry = await builder.addFoundry('foundry');const project = await foundry.addProject('my-project');const chat = await project.addModelDeploymentFromModel('chat', { name: 'gpt-5-mini', version: '2025-06-01', format: 'OpenAI',});
const webSearch = await project.addWebSearchTool('web-search');
await project .addPromptAgent( chat, 'web-researcher', ` You are the Web Researcher. Use web search for current information, cite sources, summarize tradeoffs, and keep answers concise and practical. ` ) .withTool(webSearch);
await builder.build().run();Parameter details:
| API | Parameter | Description |
|---|---|---|
AddPromptAgent(...) | model | The Foundry model deployment resource the prompt agent uses, such as chat from project.AddModelDeployment(...). |
AddPromptAgent(...) | name | The Aspire resource name and Foundry agent name. This also drives generated environment variable prefixes, for example web-researcher becomes WEB_RESEARCHER. |
AddPromptAgent(...) | instructions | Optional system instructions for the prompt agent. Use this to define behavior, tool-use guidance, and response style. |
WithTool(...) | tool | A Foundry tool resource created on the same Foundry project, such as AddWebSearchTool(...), AddCodeInterpreterTool(...), or AddAISearchTool(...). |
Prompt agents are deployed to Azure AI Foundry even during local development. Local apps call the cloud-provisioned agent through the injected project endpoint and agent name.
Invoke agents from the Aspire dashboard
Section titled “Invoke agents from the Aspire dashboard”Aspire also makes the declared agents easy to try from the dashboard. Prompt agents get a Send Message command from AddPromptAgent(...). Hosted agents published with PublishAsHostedAgent(...) get a highlighted Send Message command that posts to the local /responses endpoint, plus dashboard links for /responses, /liveness, and /readiness.
Connect to an existing Foundry service
Section titled “Connect to an existing Foundry service”You might have an existing Azure AI Foundry service that you want to connect to. You can chain a call to annotate that your FoundryResource is an existing resource:
var builder = DistributedApplication.CreateBuilder(args);
var existingFoundryName = builder.AddParameter("existingFoundryName");var existingFoundryResourceGroup = builder.AddParameter("existingFoundryResourceGroup");
var foundry = builder.AddFoundry("foundry") .AsExisting(existingFoundryName, existingFoundryResourceGroup);
builder.AddProject<Projects.ExampleProject>() .WithReference(foundry);
// 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 existingFoundryName: ParameterResource
existingFoundryName = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addParameter(name: string, options?: { value?: string; publishValueAsDefault?: boolean; secret?: boolean;}): ParameterResource (+1 overload)
Adds a parameter resource
addParameter('existingFoundryName');const const existingFoundryResourceGroup: ParameterResource
existingFoundryResourceGroup = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addParameter(name: string, options?: { value?: string; publishValueAsDefault?: boolean; secret?: boolean;}): ParameterResource (+1 overload)
Adds a parameter resource
addParameter( 'existingFoundryResourceGroup');
const const foundry: IAzureResource
foundry = await const builder: IDistributedApplicationBuilder
builder .IDistributedApplicationBuilder.addFoundry(name: string): FoundryResource
Adds a Microsoft Foundry resource to the distributed application model.
addFoundry('foundry') .AzureBicepResource.asExisting(name: string | ParameterResource, resourceGroup?: string | ParameterResource): IAzureResource
Marks an Azure resource as existing in both run and publish modes
asExisting(const existingFoundryName: ParameterResource
existingFoundryName, const existingFoundryResourceGroup: ParameterResource
existingFoundryResourceGroup);
await const builder: IDistributedApplicationBuilder
builder .IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileOrOptions?: ProjectResourceOptions;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject('api', '../ExampleProject/ExampleProject.csproj') .ProjectResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): ProjectResource (+2 overloads)
Adds a reference to another resource
withReference(const foundry: IAzureResource
foundry);
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.build(): DistributedApplication
Builds the distributed application
build().DistributedApplication.run(cancellationToken?: cancellationToken): void
Runs the distributed application
run();Use Foundry Local for development
Section titled “Use Foundry Local for development”Aspire supports the usage of Foundry Local for local development. Add the following to your AppHost project:
var builder = DistributedApplication.CreateBuilder(args);
var foundry = builder.AddFoundry("foundry") .RunAsFoundryLocal();
var chat = foundry.AddDeployment("chat", FoundryModel.Local.Phi4);
builder.AddProject<Projects.ExampleProject>() .WithReference(chat) .WaitFor(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 foundry: FoundryResource
foundry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addFoundry(name: string): FoundryResource
Adds a Microsoft Foundry resource to the distributed application model.
addFoundry('foundry').FoundryResource.runAsFoundryLocal(): FoundryResource
Configures the Microsoft Foundry resource to run by using Foundry Local.
runAsFoundryLocal();
const const chat: FoundryDeploymentResource
chat = await const foundry: FoundryResource
foundry.FoundryResource.addDeployment(name: string, model: FoundryModel | string, options?: { modelVersion?: string; format?: string;} | undefined): FoundryDeploymentResource (+1 overload)
Adds a Microsoft Foundry deployment resource to a Microsoft Foundry resource.
addDeployment('chat', { FoundryModel.name: string
name: 'Phi-4', FoundryModel.version: string
version: '1', FoundryModel.format: string
format: 'Microsoft',});
await const builder: IDistributedApplicationBuilder
builder .IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileOrOptions?: ProjectResourceOptions;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject('api', '../ExampleProject/ExampleProject.csproj') .ProjectResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): ProjectResource (+2 overloads)
Adds a reference to another resource
withReference(const chat: FoundryDeploymentResource
chat) .ProjectResource.waitFor(dependency: IResource, waitBehavior?: WaitBehavior): ProjectResource
Waits for another resource to be ready
waitFor(const chat: FoundryDeploymentResource
chat);
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.build(): DistributedApplication
Builds the distributed application
build().DistributedApplication.run(cancellationToken?: cancellationToken): void
Runs the distributed application
run();When the AppHost starts up, the local foundry service is also started. This requires the local machine to have Foundry Local installed and running.
The RunAsFoundryLocal method configures the resource to run as an emulator. It downloads and loads the specified models locally. The method provides health checks for the local service and automatically manages the Foundry Local lifecycle.
Assign roles to resources
Section titled “Assign roles to resources”You can assign specific roles to resources that need to access the Azure AI Foundry service. Use the WithRoleAssignments method:
var builder = DistributedApplication.CreateBuilder(args);
var foundry = builder.AddFoundry("chat");
builder.AddProject<Projects.Api>("api") .WithRoleAssignments(foundry, CognitiveServicesBuiltInRole.CognitiveServicesUser) .WithReference(foundry);
builder.Build().Run();import { function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder, type FoundryRole = "CognitiveServicesOpenAIContributor" | "CognitiveServicesOpenAIUser" | "CognitiveServicesUser"const FoundryRole: { readonly CognitiveServicesOpenAIContributor: "CognitiveServicesOpenAIContributor"; readonly CognitiveServicesOpenAIUser: "CognitiveServicesOpenAIUser"; readonly CognitiveServicesUser: "CognitiveServicesUser";}
Enum Aspire.Hosting.FoundryRole
FoundryRole } from './.modules/aspire.js';
const const builder: IDistributedApplicationBuilder
builder = await function createBuilder(): IDistributedApplicationBuilder
Creates a new distributed application builder
createBuilder();
const const foundry: FoundryResource
foundry = await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.addFoundry(name: string): FoundryResource
Adds a Microsoft Foundry resource to the distributed application model.
addFoundry('chat');
await const builder: IDistributedApplicationBuilder
builder .IDistributedApplicationBuilder.addProject(name: string, projectPath: string, options?: { launchProfileOrOptions?: ProjectResourceOptions;}): ProjectResource (+1 overload)
Adds a .NET project resource
addProject('api', '../Api/Api.csproj') .ProjectResource.withRoleAssignments(target: AzureOpenAIResource, roles: AzureOpenAIRole[]): ProjectResource (+9 overloads)
Assigns Cognitive Services roles to a resource
withRoleAssignments(const foundry: FoundryResource
foundry, [const FoundryRole: { readonly CognitiveServicesOpenAIContributor: "CognitiveServicesOpenAIContributor"; readonly CognitiveServicesOpenAIUser: "CognitiveServicesOpenAIUser"; readonly CognitiveServicesUser: "CognitiveServicesUser";}
Enum Aspire.Hosting.FoundryRole
FoundryRole.type CognitiveServicesUser: "CognitiveServicesUser"
CognitiveServicesUser]) .ProjectResource.withReference(source: EndpointReference | string | uri, options?: { connectionName?: string; optional?: boolean; name?: string;} | undefined): ProjectResource (+2 overloads)
Adds a reference to another resource
withReference(const foundry: FoundryResource
foundry);
await const builder: IDistributedApplicationBuilder
builder.IDistributedApplicationBuilder.build(): DistributedApplication
Builds the distributed application
build().DistributedApplication.run(cancellationToken?: cancellationToken): void
Runs the distributed application
run();The preceding code assigns the CognitiveServicesUser role to the api project, granting it the necessary permissions to access the Microsoft Foundry resource.
Provisioning-generated Bicep
Section titled “Provisioning-generated Bicep”If you’re new to Bicep, it’s a domain-specific language for defining Azure resources. With Aspire, you don’t need to write Bicep by-hand, instead the provisioning APIs generate Bicep for you. When you publish your app, the generated Bicep provisions an Azure AI Foundry resource with standard defaults.
@description('The location for the resource(s) to be deployed.')param location string = resourceGroup().location
resource ai_foundry 'Microsoft.CognitiveServices/accounts@2024-10-01' = { name: take('aifoundry-${uniqueString(resourceGroup().id)}', 64) location: location identity: { type: 'SystemAssigned' } kind: 'AIServices' properties: { customSubDomainName: toLower(take(concat('ai-foundry', uniqueString(resourceGroup().id)), 24)) publicNetworkAccess: 'Enabled' disableLocalAuth: true } sku: { name: 'S0' } tags: { 'aspire-resource-name': 'ai-foundry' }}
resource chat 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01' = { name: 'Phi-4' properties: { model: { format: 'Microsoft' name: 'Phi-4' version: '1' } } sku: { name: 'GlobalStandard' capacity: 1 } parent: ai_foundry}
output aiFoundryApiEndpoint string = ai_foundry.properties.endpoints['AI Foundry API']
output endpoint string = ai_foundry.properties.endpoint
output name string = ai_foundry.nameThe preceding Bicep is a module that provisions an Azure Cognitive Services resource configured for AI Services. Additionally, role assignments are created for the Azure resource in a separate module:
@description('The location for the resource(s) to be deployed.')param location string = resourceGroup().location
param ai_foundry_outputs_name string
param principalType string
param principalId string
resource ai_foundry 'Microsoft.CognitiveServices/accounts@2024-10-01' existing = { name: ai_foundry_outputs_name}
resource ai_foundry_CognitiveServicesUser 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid(ai_foundry.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'a97b65f3-24c7-4388-baec-2e87135dc908')) properties: { principalId: principalId roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'a97b65f3-24c7-4388-baec-2e87135dc908') principalType: principalType } scope: ai_foundry}
resource ai_foundry_CognitiveServicesOpenAIUser 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid(ai_foundry.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '5e0bd9bd-7b93-4f28-af87-19fc36ad61bd')) properties: { principalId: principalId roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '5e0bd9bd-7b93-4f28-af87-19fc36ad61bd') principalType: principalType } scope: ai_foundry}The generated Bicep is a starting point and is influenced by changes to the provisioning infrastructure in C#. Customizations to the Bicep file directly will be overwritten, so make changes through the C# provisioning APIs to ensure they’re reflected in the generated files.
Customize provisioning infrastructure
Section titled “Customize provisioning infrastructure”All Aspire Azure resources are subclasses of the AzureProvisioningResource type. This enables customization of the generated Bicep by providing a fluent API to configure the Azure resources—using the ConfigureInfrastructure API:
builder.AddFoundry("foundry") .ConfigureInfrastructure(infra => { var resources = infra.GetProvisionableResources(); var account = resources.OfType<CognitiveServicesAccount>().Single();
account.Sku = new CognitiveServicesSku { Tier = CognitiveServicesSkuTier.Enterprise, Name = "E0" }; account.Tags.Add("ExampleKey", "Example value"); });The preceding code:
- Chains a call to the
ConfigureInfrastructureAPI:- The
infraparameter is an instance of theAzureResourceInfrastructuretype. - The provisionable resources are retrieved by calling the
GetProvisionableResourcesmethod. - The single
CognitiveServicesAccountresource is retrieved. - The
Skuproperty is assigned to a new instance ofCognitiveServicesSkuwith anE0name andEnterprisetier. - A tag is added to the Cognitive Services resource with a key of
ExampleKeyand a value ofExample value.
- The