AIProjectClient
Key Points
AIProjectClientis the entry point for Foundry SDK 2.0. Gives you typed clients for chat, embeddings, agents, evals, indexes.- Authenticated via managed identity /
DefaultAzureCredential. - Returns
IChatClient/IEmbeddingGenerator/ agent clients / etc. - Use across Foundry features.
Construction
var client = new AIProjectClient(
endpoint: new Uri("https://my-foundry.services.ai.azure.com/api/projects/my-project"),
credential: new DefaultAzureCredential());
Chat
IChatClient chat = client.GetChatClient("gpt-4o-mini").AsIChatClient();
var resp = await chat.GetResponseAsync("Hello");
Embeddings
IEmbeddingGenerator<string, Embedding<float>> embed =
client.GetEmbeddingsClient("text-embedding-3-small").AsIEmbeddingGenerator();
var emb = await embed.GenerateAsync("text");
Agents
var agentsClient = client.GetAgentsClient();
var agent = await agentsClient.CreateAgentAsync(new()
{
Name = "MyAgent",
Model = "gpt-4o-mini",
Instructions = "..."
});
var thread = await agentsClient.CreateThreadAsync();
await agentsClient.CreateMessageAsync(thread.Id, MessageRole.User, "Hello");
var run = await agentsClient.CreateRunAsync(thread.Id, agent.Id);
while (run.Status is "queued" or "in_progress")
{
await Task.Delay(500);
run = await agentsClient.GetRunAsync(thread.Id, run.Id);
}
var messages = await agentsClient.GetMessagesAsync(thread.Id);
Vector indexes
var indexes = client.GetIndexesClient();
var index = await indexes.GetAsync("my-index");
// Search
var results = await indexes.SearchAsync(index.Id, queryEmb);
Evaluations
var evals = client.GetEvaluationsClient();
var run = await evals.CreateRunAsync(new()
{
Dataset = ...,
Metrics = ["groundedness", "relevance"]
});
while (run.Status is "running") { /* poll */ }
Connections
Foundry projects can have configured connections (Azure AI Search, Cosmos, Blob, etc.):
var connections = client.GetConnectionsClient();
var conn = await connections.GetAsync("my-search-conn");
Use these in agents (RAG over a Search index).
Multi-project
Each Foundry project is isolated. App connects to one project; staging vs prod are different projects.
DI registration
builder.Services.AddSingleton<AIProjectClient>(sp =>
new AIProjectClient(uri, new DefaultAzureCredential()));
builder.Services.AddSingleton<IChatClient>(sp =>
sp.GetRequiredService<AIProjectClient>().GetChatClient("gpt-4o-mini").AsIChatClient());
Configuration
"AzureFoundry": {
"ProjectEndpoint": "https://...",
"ChatModel": "gpt-4o-mini",
"EmbedModel": "text-embedding-3-small"
}
Error handling
try { /* ... */ }
catch (RequestFailedException ex) when (ex.Status == 429) { /* rate limited */ }
catch (RequestFailedException ex) when (ex.Status == 401) { /* auth */ }
Senior considerations
- One AIProjectClient per process — singleton.
- DefaultAzureCredential chains correctly across dev / prod.
- Per-environment projects: separate auth, configs.
- Track project-level usage for cost.