Skip to content
DocsTry Aspire
DocsTry

Set up Azure AI Foundry in the AppHost

Azure AI Foundry logo

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.mts — 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.

To start building an Aspire app that uses Azure AI Foundry, install the 📦 Aspire.Hosting.Foundry NuGet package:

Terminal
aspire add azure-ai-foundry

Learn more about aspire add in the command reference.

This updates your aspire.config.json with the Azure AI Foundry hosting integration package:

aspire.config.json
{
"packages": {
"Aspire.Hosting.Foundry": "13.5.3-preview.1.26425.3"
}
}

For an introduction to working with the Azure AI Foundry hosting integration, see Get started with Azure AI Foundry integrations.

To add an Azure AI Foundry resource to your AppHost project, call the AddFoundry method providing a name:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
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 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 (+1 overload)

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.

To add a Foundry deployment resource, call the AddDeployment method with one of the generated FoundryModel entries:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
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 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 | undefined
name
: 'gpt-5-mini',
FoundryModel.version?: string | undefined
version
: '2025-06-01',
FoundryModel.format?: string | undefined
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 (+1 overload)

Adds a reference to another resource

withReference
(
const chat: FoundryDeploymentResource
chat
)
.
ProjectResource.waitFor(dependency: IResource | IResourceWithConnectionString, 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 chat using the generated FoundryModel.OpenAI.Gpt5Mini descriptor.

If you need a different generated model descriptor, use the corresponding nested type. The FoundryModel class organizes models by provider family: FoundryModel.Microsoft, FoundryModel.OpenAI, FoundryModel.Cohere, FoundryModel.MistralAI, and others. For example, to use FoundryModel.Microsoft.Phi4Reasoning:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
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 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 | undefined
name
: 'Phi-4-reasoning',
FoundryModel.version?: string | undefined
version
: '1',
FoundryModel.format?: string | undefined
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 (+1 overload)

Adds a reference to another resource

withReference
(
const chat: FoundryDeploymentResource
chat
)
.
ProjectResource.waitFor(dependency: IResource | IResourceWithConnectionString, 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
();

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.

Use the AddProject method to create an Azure AI Foundry project for agents, project-scoped connections, and related Azure resources:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
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 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 the application model. This will also attach the project as a deployment target for agents.

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;
} | undefined): FoundryDeploymentResource (+1 overload)

Adds a model deployment to the parent Microsoft Foundry resource.

addModelDeployment
('chat', {
FoundryModel.name?: string | undefined
name
: 'gpt-5-mini',
FoundryModel.version?: string | undefined
version
: '2025-06-01',
FoundryModel.format?: string | undefined
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 (+1 overload)

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 (+1 overload)

Adds a reference to another resource

withReference
(
const chat: FoundryDeploymentResource
chat
)
.
ProjectResource.waitFor(dependency: IResource | IResourceWithConnectionString, 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.

You can customize the Azure resources associated with a Foundry project:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
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 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 to the application model.

addAzureApplicationInsights
('appinsights');
const
const keyVault: AzureKeyVaultResource
keyVault
= await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addAzureKeyVault(name: string): AzureKeyVaultResource

Adds an Azure Key Vault resource to the application model.

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 application model.

addAzureContainerRegistry
('agents');
await
const foundry: FoundryResource
foundry
.
FoundryResource.addProject(name: string): AzureCognitiveServicesProjectResource

Adds a Microsoft Foundry project resource to the application model. This will also attach the project as a deployment target for agents.

addProject
('my-project')
.
AzureCognitiveServicesProjectResource.withAppInsights(appInsights: AzureApplicationInsightsResource): AzureCognitiveServicesProjectResource

Adds an Application Insights resource to the Microsoft Foundry project, overriding the default (which is to create a new Application Insights resource).

withAppInsights
(
const appInsights: AzureApplicationInsightsResource
appInsights
)
.
AzureCognitiveServicesProjectResource.withKeyVault(keyVault: AzureKeyVaultResource): AzureCognitiveServicesProjectResource

Adds a Key Vault connection to the Microsoft Foundry project.

withKeyVault
(
const keyVault: AzureKeyVaultResource
keyVault
)
.
IResource.withContainerRegistry(registry: IResource): AzureCognitiveServicesProjectResource

Configures the resource to use the specified container registry for container image operations.

withContainerRegistry
(
const registry: AzureContainerRegistryResource
registry
);

AddProject creates a default Azure Container Registry for hosted agents only in publish mode (when deploying to Azure). In local run mode, no default registry is created. Use WithContainerRegistry when you want to point the project at a specific registry.

Use AsHostedAgent in C# or asHostedAgent in TypeScript to configure an executable or containerized app as a hosted agent in a Foundry project:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
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 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 the application model. This will also attach the project as a deployment target for agents.

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;
} | undefined): FoundryDeploymentResource (+1 overload)

Adds a model deployment to the parent Microsoft Foundry resource.

addModelDeployment
('chat', {
FoundryModel.name?: string | undefined
name
: 'gpt-5-mini',
FoundryModel.version?: string | undefined
version
: '2025-06-01',
FoundryModel.format?: string | undefined
format
: 'OpenAI',
});
await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.addPythonApp(name: string, appDirectory: string, scriptPath: string): PythonAppResource

Adds a Python application to the application model.

addPythonApp
('agent-python', '../agent', 'main:app')
.
ExecutableResource.withReference(source: EndpointReference | string | uri, options?: {
connectionName?: string;
optional?: boolean;
name?: string;
} | undefined): PythonAppResource (+1 overload)

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 (+1 overload)

Adds a reference to another resource

withReference
(
const chat: FoundryDeploymentResource
chat
)
.
ExecutableResource.asHostedAgent(project: AzureCognitiveServicesProjectResource, options?: HostedAgentOptions): IResourceWithEndpoints

Configures the resource to run and publish as a hosted agent in Microsoft Foundry using the Responses protocol version 2.0.0.

asHostedAgent
(
const project: AzureCognitiveServicesProjectResource
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 (+1 overload)

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 (+1 overload)

Adds a reference to another resource

withReference
(
const chat: FoundryDeploymentResource
chat
)
.
ProjectResource.asHostedAgent(project: AzureCognitiveServicesProjectResource, options?: HostedAgentOptions): IResourceWithEndpoints

Configures the resource to run and publish as a hosted agent in Microsoft Foundry using the Responses protocol version 2.0.0.

asHostedAgent
(
const project: AzureCognitiveServicesProjectResource
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, AsHostedAgent(...) 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 AsHostedAgent(...):

const dotnetWeatherAgent = await builder
.addProject(
'weather-agent-dotnet',
'../WeatherAgent.Dotnet/WeatherAgent.Dotnet.csproj'
)
.withHttpEndpoint({ targetPort: 9000 })
.withReference(project)
.waitFor(project)
.withReference(chat)
.waitFor(chat);
await dotnetWeatherAgent.asHostedAgent(project);

In run mode, Aspire also opens the agent’s dashboard URL at the selected protocol path, defaults that path to /responses, adds a dashboard command for sending a message to the selected path, 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.

For C# AppHosts, the parameterless AsHostedAgent() overload reuses an existing Foundry project from the app model or creates one automatically. TypeScript AppHosts pass the project resource explicitly.

AsHostedAgent defaults to the Responses protocol version 2.0.0. If your hosted agent implements a different protocol or protocol version, use the C# AsHostedAgent(project, protocol, version) overload or the polyglot/TypeScript asHostedAgentWithProtocol export. For example, some Microsoft Agent Framework (MAF) agents use the Invocations protocol:

await builder
.addPythonApp('agent-python', '../agent', 'main:app')
.withReference(project)
.withReference(chat)
.asHostedAgentWithProtocol(project, HostedAgentProtocol.Invocations, '1.0.0');

The defaulted asHostedAgent entry point and the explicit asHostedAgentWithProtocol entry point are both exported to polyglot AppHosts, so existing AppHosts that call asHostedAgent(project, options?) continue to work unchanged with the Responses 2.0.0 default. Reach for asHostedAgentWithProtocol only when you need a protocol or version other than the default.

For prompt-only scenarios, use AddPromptAgent on a Foundry project:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
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 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 the application model. This will also attach the project as a deployment target for agents.

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;
} | undefined): FoundryDeploymentResource (+1 overload)

Adds a model deployment to the parent Microsoft Foundry resource.

addModelDeployment
('chat', 'gpt-5-mini', {
modelVersion?: string | undefined
modelVersion
: '2025-06-01',
format?: string | undefined
format
: 'OpenAI',
});
const
const webSearch: WebSearchToolResource
webSearch
= await
const project: AzureCognitiveServicesProjectResource
project
.
AzureCognitiveServicesProjectResource.addWebSearchTool(name: string): WebSearchToolResource

Adds a Web Search tool to a Microsoft Foundry project, enabling agents to retrieve real-time information from the public web and return answers with inline citations.

addWebSearchTool
('web-search');
await
const project: AzureCognitiveServicesProjectResource
project
.
AzureCognitiveServicesProjectResource.addPromptAgent(name: string, model: FoundryDeploymentResource, options?: {
instructions?: string;
} | undefined): AzurePromptAgentResource (+1 overload)

Adds a prompt agent to a Microsoft Foundry project with the specified tools.

addPromptAgent
(
'web-researcher',
const chat: FoundryDeploymentResource
chat
,
{
instructions?: string | undefined
instructions
: `
You are the Web Researcher. Use web search for current information,
cite sources, summarize tradeoffs, and keep answers concise and practical.
`,
}
)
.
AzurePromptAgentResource.withTool(tool: FoundryToolResource): AzurePromptAgentResource

Adds a tool to a prompt agent.

withTool
(
const webSearch: WebSearchToolResource
webSearch
);
await
const builder: IDistributedApplicationBuilder
builder
.
IDistributedApplicationBuilder.build(): DistributedApplication

Builds the distributed application

build
().
DistributedApplication.run(cancellationToken?: cancellationToken): void

Runs the distributed application

run
();

Parameter details:

APIParameterDescription
AddPromptAgent(...)modelThe Foundry model deployment resource the prompt agent uses, such as chat from project.AddModelDeployment(...).
AddPromptAgent(...)nameThe Aspire resource name and Foundry agent name. This also drives generated environment variable prefixes, for example web-researcher becomes WEB_RESEARCHER.
AddPromptAgent(...)instructionsOptional system instructions for the prompt agent. Use this to define behavior, tool-use guidance, and response style.
WithTool(...)toolA 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.

Aspire also makes the declared agents easy to try from the dashboard. Prompt agents get a Send Message command from AddPromptAgent(...). Hosted agents configured with AsHostedAgent(...) get a highlighted Send Message command that posts to the selected protocol path, which defaults to the local /responses endpoint.

Aspire dashboard showing prompt and hosted agent resources with Send Message commands. Hosted agent responses invocation result in the Aspire dashboard.

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:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
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 application model.

addFoundry
('foundry')
.
AzureBicepResource.asExisting(name: string | ParameterResource, resourceGroup?: string | ParameterResource): IAzureResource

Marks the resource as an existing resource 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 (+1 overload)

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
();

Aspire supports the usage of Foundry Local for local development. Add the following to your AppHost project:

apphost.mts
import {
function createBuilder(): IDistributedApplicationBuilder

Creates a new distributed application builder

createBuilder
} from './.aspire/modules/aspire.mjs';
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 application model.

addFoundry
('foundry').
FoundryResource.runAsFoundryLocal(): FoundryResource

Adds a Foundry Local resource to the distributed application builder.

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 | undefined
name
: 'Phi-4',
FoundryModel.version?: string | undefined
version
: '1',
FoundryModel.format?: string | undefined
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 (+1 overload)

Adds a reference to another resource

withReference
(
const chat: FoundryDeploymentResource
chat
)
.
ProjectResource.waitFor(dependency: IResource | IResourceWithConnectionString, 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, Aspire automatically starts the Foundry Local service using the foundry CLI (foundry service start). It then discovers the service endpoint, downloads and loads the specified models via CLI commands, and stops the service (foundry service stop) when the AppHost shuts down or is disposed. You do not need to pre-start Foundry Local manually.

This requires the foundry CLI to be installed and available on PATH. For installation instructions, see Foundry Local get started.

The RunAsFoundryLocal method configures the resource to use the local service. It downloads and loads the specified models locally, provides health checks for the local service, and fully manages the Foundry Local lifecycle — including start and stop — through the foundry CLI.

You can assign specific roles to resources that need to access the Azure AI Foundry service. Use the WithRoleAssignments method:

apphost.mts
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 './.aspire/modules/aspire.mjs';
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 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.withFoundryRoleAssignments(target: FoundryResource, roles: FoundryRole[]): ProjectResource

Assigns the specified roles to the given resource, granting it the necessary permissions on the target Microsoft Foundry resource. This replaces the default role assignments for the resource.

withFoundryRoleAssignments
(
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 (+1 overload)

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.

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.

Generated Bicep — ai-foundry.bicep
@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.name

The 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:

Generated Bicep — ai-foundry-roles.bicep
@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.

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:

AppHost.cs
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 ConfigureInfrastructure API:
    • The infra parameter is an instance of the AzureResourceInfrastructure type.
    • The provisionable resources are retrieved by calling the GetProvisionableResources method.
    • The single CognitiveServicesAccount resource is retrieved.
    • The Sku property is assigned to a new instance of CognitiveServicesSku with an E0 name and Enterprise tier.
    • A tag is added to the Cognitive Services resource with a key of ExampleKey and a value of Example value.