[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6G8VMDCZMGEAP7CMSS3K08W":3,"skill-same:01M6G8VMDCZMGEAP7CMSS3K08W":71},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":13,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":50,"install":51,"resources":64},"01M6G8VMDCZMGEAP7CMSS3K08W","azure-ai-projects-dotnet",null,"Azure AI Projects SDK for .NET. High-level client for Azure AI Foundry projects including agents, connections, datasets, deployments, evaluations, and indexes. Use for AI Foundry project management, versioned agents, and orchestration. Triggers: \"AI Projects\", \"AIProjectClient\", \"Foundry project\", \"versioned agents\", \"evaluations\", \"datasets\", \"connections\", \"deployments .NET\".","ricardoaevt\u002Fnexus-roms","ricardoaevt","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F164531880?v=4","01M6DGFGSV6CF9AKPHABBREC79","01M6DGFGYNNPJVDFQA05TDPSBN",0,"AGPL-3.0","https:\u002F\u002Fgithub.com\u002Fricardoaevt\u002Fnexus-roms\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fmicrosoft_skills\u002F.github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-ai-projects-dotnet\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"dotnet","azure ai","azure","azure ai projects dotnet","azure ai projects","projects","client","sdk","triggers","project","connections","indexes","datasets","deployments","use","management","azure ai foundry","project management","foundry","orchestration","2026-11-10 10:12:30",false,"---\nname: azure-ai-projects-dotnet\ndescription: |\n  Azure AI Projects SDK for .NET. High-level client for Azure AI Foundry projects including agents, connections, datasets, deployments, evaluations, and indexes. Use for AI Foundry project management, versioned agents, and orchestration. Triggers: \"AI Projects\", \"AIProjectClient\", \"Foundry project\", \"versioned agents\", \"evaluations\", \"datasets\", \"connections\", \"deployments .NET\".\npackage: Azure.AI.Projects\n---\n\n# Azure.AI.Projects (.NET)\n\nHigh-level SDK for Azure AI Foundry project operations including agents, connections, datasets, deployments, evaluations, and indexes.\n\n## Installation\n\n```bash\ndotnet add package Azure.AI.Projects\ndotnet add package Azure.Identity\n\n# Optional: For versioned agents with OpenAI extensions\ndotnet add package Azure.AI.Projects.OpenAI --prerelease\n\n# Optional: For low-level agent operations\ndotnet add package Azure.AI.Agents.Persistent --prerelease\n```\n\n**Current Versions**: GA v1.1.0, Preview v1.2.0-beta.5\n\n## Environment Variables\n\n```bash\nPROJECT_ENDPOINT=https:\u002F\u002F\u003Cresource>.services.ai.azure.com\u002Fapi\u002Fprojects\u002F\u003Cproject>\nMODEL_DEPLOYMENT_NAME=gpt-4o-mini\nCONNECTION_NAME=\u003Cyour-connection-name>\nAI_SEARCH_CONNECTION_NAME=\u003Cai-search-connection>\n```\n\n## Authentication\n\n```csharp\nusing Azure.Identity;\nusing Azure.AI.Projects;\n\nvar endpoint = Environment.GetEnvironmentVariable(\"PROJECT_ENDPOINT\");\nAIProjectClient projectClient = new AIProjectClient(\n    new Uri(endpoint), \n    new DefaultAzureCredential());\n```\n\n## Client Hierarchy\n\n```\nAIProjectClient\n├── Agents          → AIProjectAgentsOperations (versioned agents)\n├── Connections     → ConnectionsClient\n├── Datasets        → DatasetsClient\n├── Deployments     → DeploymentsClient\n├── Evaluations     → EvaluationsClient\n├── Evaluators      → EvaluatorsClient\n├── Indexes         → IndexesClient\n├── Telemetry       → AIProjectTelemetry\n├── OpenAI          → ProjectOpenAIClient (preview)\n└── GetPersistentAgentsClient() → PersistentAgentsClient\n```\n\n## Core Workflows\n\n### 1. Get Persistent Agents Client\n\n```csharp\n\u002F\u002F Get low-level agents client from project client\nPersistentAgentsClient agentsClient = projectClient.GetPersistentAgentsClient();\n\n\u002F\u002F Create agent\nPersistentAgent agent = await agentsClient.Administration.CreateAgentAsync(\n    model: \"gpt-4o-mini\",\n    name: \"Math Tutor\",\n    instructions: \"You are a personal math tutor.\");\n\n\u002F\u002F Create thread and run\nPersistentAgentThread thread = await agentsClient.Threads.CreateThreadAsync();\nawait agentsClient.Messages.CreateMessageAsync(thread.Id, MessageRole.User, \"Solve 3x + 11 = 14\");\nThreadRun run = await agentsClient.Runs.CreateRunAsync(thread.Id, agent.Id);\n\n\u002F\u002F Poll for completion\ndo\n{\n    await Task.Delay(500);\n    run = await agentsClient.Runs.GetRunAsync(thread.Id, run.Id);\n}\nwhile (run.Status == RunStatus.Queued || run.Status == RunStatus.InProgress);\n\n\u002F\u002F Get messages\nawait foreach (var msg in agentsClient.Messages.GetMessagesAsync(thread.Id))\n{\n    foreach (var content in msg.ContentItems)\n    {\n        if (content is MessageTextContent textContent)\n            Console.WriteLine(textContent.Text);\n    }\n}\n\n\u002F\u002F Cleanup\nawait agentsClient.Threads.DeleteThreadAsync(thread.Id);\nawait agentsClient.Administration.DeleteAgentAsync(agent.Id);\n```\n\n### 2. Versioned Agents with Tools (Preview)\n\n```csharp\nusing Azure.AI.Projects.OpenAI;\n\n\u002F\u002F Create agent with web search tool\nPromptAgentDefinition agentDefinition = new(model: \"gpt-4o-mini\")\n{\n    Instructions = \"You are a helpful assistant that can search the web\",\n    Tools = {\n        ResponseTool.CreateWebSearchTool(\n            userLocation: WebSearchToolLocation.CreateApproximateLocation(\n                country: \"US\",\n                city: \"Seattle\",\n                region: \"Washington\"\n            )\n        ),\n    }\n};\n\nAgentVersion agentVersion = await projectClient.Agents.CreateAgentVersionAsync(\n    agentName: \"myAgent\",\n    options: new(agentDefinition));\n\n\u002F\u002F Get response client\nProjectResponsesClient responseClient = projectClient.OpenAI.GetProjectResponsesClientForAgent(agentVersion.Name);\n\n\u002F\u002F Create response\nResponseResult response = responseClient.CreateResponse(\"What's the weather in Seattle?\");\nConsole.WriteLine(response.GetOutputText());\n\n\u002F\u002F Cleanup\nprojectClient.Agents.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);\n```\n\n### 3. Connections\n\n```csharp\n\u002F\u002F List all connections\nforeach (AIProjectConnection connection in projectClient.Connections.GetConnections())\n{\n    Console.WriteLine($\"{connection.Name}: {connection.ConnectionType}\");\n}\n\n\u002F\u002F Get specific connection\nAIProjectConnection conn = projectClient.Connections.GetConnection(\n    connectionName, \n    includeCredentials: true);\n\n\u002F\u002F Get default connection\nAIProjectConnection defaultConn = projectClient.Connections.GetDefaultConnection(\n    includeCredentials: false);\n```\n\n### 4. Deployments\n\n```csharp\n\u002F\u002F List all deployments\nforeach (AIProjectDeployment deployment in projectClient.Deployments.GetDeployments())\n{\n    Console.WriteLine($\"{deployment.Name}: {deployment.ModelName}\");\n}\n\n\u002F\u002F Filter by publisher\nforeach (var deployment in projectClient.Deployments.GetDeployments(modelPublisher: \"Microsoft\"))\n{\n    Console.WriteLine(deployment.Name);\n}\n\n\u002F\u002F Get specific deployment\nModelDeployment details = (ModelDeployment)projectClient.Deployments.GetDeployment(\"gpt-4o-mini\");\n```\n\n### 5. Datasets\n\n```csharp\n\u002F\u002F Upload single file\nFileDataset fileDataset = projectClient.Datasets.UploadFile(\n    name: \"my-dataset\",\n    version: \"1.0\",\n    filePath: \"data\u002Ftraining.txt\",\n    connectionName: connectionName);\n\n\u002F\u002F Upload folder\nFolderDataset folderDataset = projectClient.Datasets.UploadFolder(\n    name: \"my-dataset\",\n    version: \"2.0\",\n    folderPath: \"data\u002Ftraining\",\n    connectionName: connectionName,\n    filePattern: new Regex(\".*\\\\.txt\"));\n\n\u002F\u002F Get dataset\nAIProjectDataset dataset = projectClient.Datasets.GetDataset(\"my-dataset\", \"1.0\");\n\n\u002F\u002F Delete dataset\nprojectClient.Datasets.Delete(\"my-dataset\", \"1.0\");\n```\n\n### 6. Indexes\n\n```csharp\n\u002F\u002F Create Azure AI Search index\nAzureAISearchIndex searchIndex = new(aiSearchConnectionName, aiSearchIndexName)\n{\n    Description = \"Sample Index\"\n};\n\nsearchIndex = (AzureAISearchIndex)projectClient.Indexes.CreateOrUpdate(\n    name: \"my-index\",\n    version: \"1.0\",\n    index: searchIndex);\n\n\u002F\u002F List indexes\nforeach (AIProjectIndex index in projectClient.Indexes.GetIndexes())\n{\n    Console.WriteLine(index.Name);\n}\n\n\u002F\u002F Delete index\nprojectClient.Indexes.Delete(name: \"my-index\", version: \"1.0\");\n```\n\n### 7. Evaluations\n\n```csharp\n\u002F\u002F Create evaluation configuration\nvar evaluatorConfig = new EvaluatorConfiguration(id: EvaluatorIDs.Relevance);\nevaluatorConfig.InitParams.Add(\"deployment_name\", BinaryData.FromObjectAsJson(\"gpt-4o\"));\n\n\u002F\u002F Create evaluation\nEvaluation evaluation = new Evaluation(\n    data: new InputDataset(\"\u003Cdataset_id>\"),\n    evaluators: new Dictionary\u003Cstring, EvaluatorConfiguration> \n    { \n        { \"relevance\", evaluatorConfig } \n    }\n)\n{\n    DisplayName = \"Sample Evaluation\"\n};\n\n\u002F\u002F Run evaluation\nEvaluation result = projectClient.Evaluations.Create(evaluation: evaluation);\n\n\u002F\u002F Get evaluation\nEvaluation getResult = projectClient.Evaluations.Get(result.Name);\n\n\u002F\u002F List evaluations\nforeach (var eval in projectClient.Evaluations.GetAll())\n{\n    Console.WriteLine($\"{eval.DisplayName}: {eval.Status}\");\n}\n```\n\n### 8. Get Azure OpenAI Chat Client\n\n```csharp\nusing Azure.AI.OpenAI;\nusing OpenAI.Chat;\n\nClientConnection connection = projectClient.GetConnection(typeof(AzureOpenAIClient).FullName!);\n\nif (!connection.TryGetLocatorAsUri(out Uri uri) || uri is null)\n    throw new InvalidOperationException(\"Invalid URI.\");\n\nuri = new Uri($\"https:\u002F\u002F{uri.Host}\");\n\nAzureOpenAIClient azureOpenAIClient = new AzureOpenAIClient(uri, new DefaultAzureCredential());\nChatClient chatClient = azureOpenAIClient.GetChatClient(\"gpt-4o-mini\");\n\nChatCompletion result = chatClient.CompleteChat(\"List all rainbow colors\");\nConsole.WriteLine(result.Content[0].Text);\n```\n\n## Available Agent Tools\n\n| Tool | Class | Purpose |\n|------|-------|---------|\n| Code Interpreter | `CodeInterpreterToolDefinition` | Execute Python code |\n| File Search | `FileSearchToolDefinition` | Search uploaded files |\n| Function Calling | `FunctionToolDefinition` | Call custom functions |\n| Bing Grounding | `BingGroundingToolDefinition` | Web search via Bing |\n| Azure AI Search | `AzureAISearchToolDefinition` | Search Azure AI indexes |\n| OpenAPI | `OpenApiToolDefinition` | Call external APIs |\n| Azure Functions | `AzureFunctionToolDefinition` | Invoke Azure Functions |\n| MCP | `MCPToolDefinition` | Model Context Protocol tools |\n\n## Key Types Reference\n\n| Type | Purpose |\n|------|---------|\n| `AIProjectClient` | Main entry point |\n| `PersistentAgentsClient` | Low-level agent operations |\n| `PromptAgentDefinition` | Versioned agent definition |\n| `AgentVersion` | Versioned agent instance |\n| `AIProjectConnection` | Connection to Azure resource |\n| `AIProjectDeployment` | Model deployment info |\n| `AIProjectDataset` | Dataset metadata |\n| `AIProjectIndex` | Search index metadata |\n| `Evaluation` | Evaluation configuration and results |\n\n## Best Practices\n\n1. **Use `DefaultAzureCredential`** for production authentication\n2. **Use async methods** (`*Async`) for all I\u002FO operations\n3. **Poll with appropriate delays** (500ms recommended) when waiting for runs\n4. **Clean up resources** — delete threads, agents, and files when done\n5. **Use versioned agents** (via `Azure.AI.Projects.OpenAI`) for production scenarios\n6. **Store connection IDs** rather than names for tool configurations\n7. **Use `includeCredentials: true`** only when credentials are needed\n8. **Handle pagination** — use `AsyncPageable\u003CT>` for listing operations\n\n## Error Handling\n\n```csharp\nusing Azure;\n\ntry\n{\n    var result = await projectClient.Evaluations.CreateAsync(evaluation);\n}\ncatch (RequestFailedException ex)\n{\n    Console.WriteLine($\"Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}\");\n}\n```\n\n## Related SDKs\n\n| SDK | Purpose | Install |\n|-----|---------|---------|\n| `Azure.AI.Projects` | High-level project client (this SDK) | `dotnet add package Azure.AI.Projects` |\n| `Azure.AI.Agents.Persistent` | Low-level agent operations | `dotnet add package Azure.AI.Agents.Persistent` |\n| `Azure.AI.Projects.OpenAI` | Versioned agents with OpenAI | `dotnet add package Azure.AI.Projects.OpenAI` |\n\n## Reference Links\n\n| Resource | URL |\n|----------|-----|\n| NuGet Package | https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FAzure.AI.Projects |\n| API Reference | https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fazure.ai.projects |\n| GitHub Source | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-net\u002Ftree\u002Fmain\u002Fsdk\u002Fai\u002FAzure.AI.Projects |\n| Samples | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-net\u002Ftree\u002Fmain\u002Fsdk\u002Fai\u002FAzure.AI.Projects\u002Fsamples |\n","# Azure.AI.Projects (.NET)\n\nHigh-level SDK for Azure AI Foundry project operations including agents, connections, datasets, deployments, evaluations, and indexes.\n\n## Installation\n\n```bash\ndotnet add package Azure.AI.Projects\ndotnet add package Azure.Identity\n\n# Optional: For versioned agents with OpenAI extensions\ndotnet add package Azure.AI.Projects.OpenAI --prerelease\n\n# Optional: For low-level agent operations\ndotnet add package Azure.AI.Agents.Persistent --prerelease\n```\n\n**Current Versions**: GA v1.1.0, Preview v1.2.0-beta.5\n\n## Environment Variables\n\n```bash\nPROJECT_ENDPOINT=https:\u002F\u002F\u003Cresource>.services.ai.azure.com\u002Fapi\u002Fprojects\u002F\u003Cproject>\nMODEL_DEPLOYMENT_NAME=gpt-4o-mini\nCONNECTION_NAME=\u003Cyour-connection-name>\nAI_SEARCH_CONNECTION_NAME=\u003Cai-search-connection>\n```\n\n## Authentication\n\n```csharp\nusing Azure.Identity;\nusing Azure.AI.Projects;\n\nvar endpoint = Environment.GetEnvironmentVariable(\"PROJECT_ENDPOINT\");\nAIProjectClient projectClient = new AIProjectClient(\n    new Uri(endpoint), \n    new DefaultAzureCredential());\n```\n\n## Client Hierarchy\n\n```\nAIProjectClient\n├── Agents          → AIProjectAgentsOperations (versioned agents)\n├── Connections     → ConnectionsClient\n├── Datasets        → DatasetsClient\n├── Deployments     → DeploymentsClient\n├── Evaluations     → EvaluationsClient\n├── Evaluators      → EvaluatorsClient\n├── Indexes         → IndexesClient\n├── Telemetry       → AIProjectTelemetry\n├── OpenAI          → ProjectOpenAIClient (preview)\n└── GetPersistentAgentsClient() → PersistentAgentsClient\n```\n\n## Core Workflows\n\n### 1. Get Persistent Agents Client\n\n```csharp\n\u002F\u002F Get low-level agents client from project client\nPersistentAgentsClient agentsClient = projectClient.GetPersistentAgentsClient();\n\n\u002F\u002F Create agent\nPersistentAgent agent = await agentsClient.Administration.CreateAgentAsync(\n    model: \"gpt-4o-mini\",\n    name: \"Math Tutor\",\n    instructions: \"You are a personal math tutor.\");\n\n\u002F\u002F Create thread and run\nPersistentAgentThread thread = await agentsClient.Threads.CreateThreadAsync();\nawait agentsClient.Messages.CreateMessageAsync(thread.Id, MessageRole.User, \"Solve 3x + 11 = 14\");\nThreadRun run = await agentsClient.Runs.CreateRunAsync(thread.Id, agent.Id);\n\n\u002F\u002F Poll for completion\ndo\n{\n    await Task.Delay(500);\n    run = await agentsClient.Runs.GetRunAsync(thread.Id, run.Id);\n}\nwhile (run.Status == RunStatus.Queued || run.Status == RunStatus.InProgress);\n\n\u002F\u002F Get messages\nawait foreach (var msg in agentsClient.Messages.GetMessagesAsync(thread.Id))\n{\n    foreach (var content in msg.ContentItems)\n    {\n        if (content is MessageTextContent textContent)\n            Console.WriteLine(textContent.Text);\n    }\n}\n\n\u002F\u002F Cleanup\nawait agentsClient.Threads.DeleteThreadAsync(thread.Id);\nawait agentsClient.Administration.DeleteAgentAsync(agent.Id);\n```\n\n### 2. Versioned Agents with Tools (Preview)\n\n```csharp\nusing Azure.AI.Projects.OpenAI;\n\n\u002F\u002F Create agent with web search tool\nPromptAgentDefinition agentDefinition = new(model: \"gpt-4o-mini\")\n{\n    Instructions = \"You are a helpful assistant that can search the web\",\n    Tools = {\n        ResponseTool.CreateWebSearchTool(\n            userLocation: WebSearchToolLocation.CreateApproximateLocation(\n                country: \"US\",\n                city: \"Seattle\",\n                region: \"Washington\"\n            )\n        ),\n    }\n};\n\nAgentVersion agentVersion = await projectClient.Agents.CreateAgentVersionAsync(\n    agentName: \"myAgent\",\n    options: new(agentDefinition));\n\n\u002F\u002F Get response client\nProjectResponsesClient responseClient = projectClient.OpenAI.GetProjectResponsesClientForAgent(agentVersion.Name);\n\n\u002F\u002F Create response\nResponseResult response = responseClient.CreateResponse(\"What's the weather in Seattle?\");\nConsole.WriteLine(response.GetOutputText());\n\n\u002F\u002F Cleanup\nprojectClient.Agents.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);\n```\n\n### 3. Connections\n\n```csharp\n\u002F\u002F List all connections\nforeach (AIProjectConnection connection in projectClient.Connections.GetConnections())\n{\n    Console.WriteLine($\"{connection.Name}: {connection.ConnectionType}\");\n}\n\n\u002F\u002F Get specific connection\nAIProjectConnection conn = projectClient.Connections.GetConnection(\n    connectionName, \n    includeCredentials: true);\n\n\u002F\u002F Get default connection\nAIProjectConnection defaultConn = projectClient.Connections.GetDefaultConnection(\n    includeCredentials: false);\n```\n\n### 4. Deployments\n\n```csharp\n\u002F\u002F List all deployments\nforeach (AIProjectDeployment deployment in projectClient.Deployments.GetDeployments())\n{\n    Console.WriteLine($\"{deployment.Name}: {deployment.ModelName}\");\n}\n\n\u002F\u002F Filter by publisher\nforeach (var deployment in projectClient.Deployments.GetDeployments(modelPublisher: \"Microsoft\"))\n{\n    Console.WriteLine(deployment.Name);\n}\n\n\u002F\u002F Get specific deployment\nModelDeployment details = (ModelDeployment)projectClient.Deployments.GetDeployment(\"gpt-4o-mini\");\n```\n\n### 5. Datasets\n\n```csharp\n\u002F\u002F Upload single file\nFileDataset fileDataset = projectClient.Datasets.UploadFile(\n    name: \"my-dataset\",\n    version: \"1.0\",\n    filePath: \"data\u002Ftraining.txt\",\n    connectionName: connectionName);\n\n\u002F\u002F Upload folder\nFolderDataset folderDataset = projectClient.Datasets.UploadFolder(\n    name: \"my-dataset\",\n    version: \"2.0\",\n    folderPath: \"data\u002Ftraining\",\n    connectionName: connectionName,\n    filePattern: new Regex(\".*\\\\.txt\"));\n\n\u002F\u002F Get dataset\nAIProjectDataset dataset = projectClient.Datasets.GetDataset(\"my-dataset\", \"1.0\");\n\n\u002F\u002F Delete dataset\nprojectClient.Datasets.Delete(\"my-dataset\", \"1.0\");\n```\n\n### 6. Indexes\n\n```csharp\n\u002F\u002F Create Azure AI Search index\nAzureAISearchIndex searchIndex = new(aiSearchConnectionName, aiSearchIndexName)\n{\n    Description = \"Sample Index\"\n};\n\nsearchIndex = (AzureAISearchIndex)projectClient.Indexes.CreateOrUpdate(\n    name: \"my-index\",\n    version: \"1.0\",\n    index: searchIndex);\n\n\u002F\u002F List indexes\nforeach (AIProjectIndex index in projectClient.Indexes.GetIndexes())\n{\n    Console.WriteLine(index.Name);\n}\n\n\u002F\u002F Delete index\nprojectClient.Indexes.Delete(name: \"my-index\", version: \"1.0\");\n```\n\n### 7. Evaluations\n\n```csharp\n\u002F\u002F Create evaluation configuration\nvar evaluatorConfig = new EvaluatorConfiguration(id: EvaluatorIDs.Relevance);\nevaluatorConfig.InitParams.Add(\"deployment_name\", BinaryData.FromObjectAsJson(\"gpt-4o\"));\n\n\u002F\u002F Create evaluation\nEvaluation evaluation = new Evaluation(\n    data: new InputDataset(\"\u003Cdataset_id>\"),\n    evaluators: new Dictionary\u003Cstring, EvaluatorConfiguration> \n    { \n        { \"relevance\", evaluatorConfig } \n    }\n)\n{\n    DisplayName = \"Sample Evaluation\"\n};\n\n\u002F\u002F Run evaluation\nEvaluation result = projectClient.Evaluations.Create(evaluation: evaluation);\n\n\u002F\u002F Get evaluation\nEvaluation getResult = projectClient.Evaluations.Get(result.Name);\n\n\u002F\u002F List evaluations\nforeach (var eval in projectClient.Evaluations.GetAll())\n{\n    Console.WriteLine($\"{eval.DisplayName}: {eval.Status}\");\n}\n```\n\n### 8. Get Azure OpenAI Chat Client\n\n```csharp\nusing Azure.AI.OpenAI;\nusing OpenAI.Chat;\n\nClientConnection connection = projectClient.GetConnection(typeof(AzureOpenAIClient).FullName!);\n\nif (!connection.TryGetLocatorAsUri(out Uri uri) || uri is null)\n    throw new InvalidOperationException(\"Invalid URI.\");\n\nuri = new Uri($\"https:\u002F\u002F{uri.Host}\");\n\nAzureOpenAIClient azureOpenAIClient = new AzureOpenAIClient(uri, new DefaultAzureCredential());\nChatClient chatClient = azureOpenAIClient.GetChatClient(\"gpt-4o-mini\");\n\nChatCompletion result = chatClient.CompleteChat(\"List all rainbow colors\");\nConsole.WriteLine(result.Content[0].Text);\n```\n\n## Available Agent Tools\n\n| Tool | Class | Purpose |\n|------|-------|---------|\n| Code Interpreter | `CodeInterpreterToolDefinition` | Execute Python code |\n| File Search | `FileSearchToolDefinition` | Search uploaded files |\n| Function Calling | `FunctionToolDefinition` | Call custom functions |\n| Bing Grounding | `BingGroundingToolDefinition` | Web search via Bing |\n| Azure AI Search | `AzureAISearchToolDefinition` | Search Azure AI indexes |\n| OpenAPI | `OpenApiToolDefinition` | Call external APIs |\n| Azure Functions | `AzureFunctionToolDefinition` | Invoke Azure Functions |\n| MCP | `MCPToolDefinition` | Model Context Protocol tools |\n\n## Key Types Reference\n\n| Type | Purpose |\n|------|---------|\n| `AIProjectClient` | Main entry point |\n| `PersistentAgentsClient` | Low-level agent operations |\n| `PromptAgentDefinition` | Versioned agent definition |\n| `AgentVersion` | Versioned agent instance |\n| `AIProjectConnection` | Connection to Azure resource |\n| `AIProjectDeployment` | Model deployment info |\n| `AIProjectDataset` | Dataset metadata |\n| `AIProjectIndex` | Search index metadata |\n| `Evaluation` | Evaluation configuration and results |\n\n## Best Practices\n\n1. **Use `DefaultAzureCredential`** for production authentication\n2. **Use async methods** (`*Async`) for all I\u002FO operations\n3. **Poll with appropriate delays** (500ms recommended) when waiting for runs\n4. **Clean up resources** — delete threads, agents, and files when done\n5. **Use versioned agents** (via `Azure.AI.Projects.OpenAI`) for production scenarios\n6. **Store connection IDs** rather than names for tool configurations\n7. **Use `includeCredentials: true`** only when credentials are needed\n8. **Handle pagination** — use `AsyncPageable\u003CT>` for listing operations\n\n## Error Handling\n\n```csharp\nusing Azure;\n\ntry\n{\n    var result = await projectClient.Evaluations.CreateAsync(evaluation);\n}\ncatch (RequestFailedException ex)\n{\n    Console.WriteLine($\"Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}\");\n}\n```\n\n## Related SDKs\n\n| SDK | Purpose | Install |\n|-----|---------|---------|\n| `Azure.AI.Projects` | High-level project client (this SDK) | `dotnet add package Azure.AI.Projects` |\n| `Azure.AI.Agents.Persistent` | Low-level agent operations | `dotnet add package Azure.AI.Agents.Persistent` |\n| `Azure.AI.Projects.OpenAI` | Versioned agents with OpenAI | `dotnet add package Azure.AI.Projects.OpenAI` |\n\n## Reference Links\n\n| Resource | URL |\n|----------|-----|\n| NuGet Package | https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FAzure.AI.Projects |\n| API Reference | https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fazure.ai.projects |\n| GitHub Source | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-net\u002Ftree\u002Fmain\u002Fsdk\u002Fai\u002FAzure.AI.Projects |\n| Samples | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-net\u002Ftree\u002Fmain\u002Fsdk\u002Fai\u002FAzure.AI.Projects\u002Fsamples |\n",{"name":5,"package":43,"description":44},"Azure.AI.Projects","Azure AI Projects SDK for .NET. High-level client for Azure AI Foundry projects including agents, connections, datasets, deployments, evaluations, and indexes. Use for AI Foundry project management, versioned agents, and orchestration. Triggers: \"AI Projects\", \"AIProjectClient\", \"Foundry project\", \"versioned agents\", \"evaluations\", \"datasets\", \"connections\", \"deployments .NET\".\n","main","d41309588593cee5c2fb44062474efc3a99fbcb6",".agent\u002Fskills\u002Fmicrosoft_skills\u002F.github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-ai-projects-dotnet","https:\u002F\u002Fgithub.com\u002Fricardoaevt\u002Fnexus-roms","https:\u002F\u002Fgithub.com\u002Fricardoaevt","2026-03-23 00:05:03",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add ricardoaevt\u002Fnexus-roms --skill azure-ai-projects-dotnet",{"tool":57,"command":58},"bunx","bunx skills add ricardoaevt\u002Fnexus-roms --skill azure-ai-projects-dotnet",{"tool":60,"command":61},"pnpm","pnpm dlx skills add ricardoaevt\u002Fnexus-roms --skill azure-ai-projects-dotnet","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fricardoaevt\u002Fnexus-roms\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fmicrosoft_skills\u002F.github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-ai-projects-dotnet\u002FSKILL.md",true,[65],{"path":66,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":70},"references\u002Facceptance-criteria.md","REFERENCE","参考文档",15740,"https:\u002F\u002Fgithub.com\u002Fricardoaevt\u002Fnexus-roms\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fmicrosoft_skills\u002F.github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-ai-projects-dotnet\u002Freferences\u002Facceptance-criteria.md",[72,96,112,127,138,147],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":76,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":38},"01M6G9HYKQRK6HBKVTZM3258M3","openspec-propose","Propose a new change with all artifacts generated in one step. Use when the user wants to quickly describe what they want to build and get a complete proposal with design, specs, and tasks ready for implementation.","MIT","https:\u002F\u002Fgithub.com\u002Fricardoaevt\u002Fnexus-roms\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fopenspec-propose\u002FSKILL.md",[],[80,81,82,83,84,85,86,87,88,89,90,32,91,92,93,94,95],"openspec propose","openspec","cli","generated","with","proposal","complete","get","build","implementation","ready","user","artifacts","tasks","change","design",{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":76,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":102,"publishedAt":38},"01M6G9HV9V20WFCHYVSDNQMJVK","openspec-new-change","Start a new OpenSpec change using the experimental artifact workflow. Use when the user wants to create a new feature, fix, or modification with a structured step-by-step approach.","https:\u002F\u002Fgithub.com\u002Fricardoaevt\u002Fnexus-roms\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fopenspec-new-change\u002FSKILL.md",[],[81,103,94,104,82,105,106,107,32,91,108,109,110,111,84],"openspec new change","new feature","structured","artifact","workflow","create","start","fix","feature",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":76,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":118,"publishedAt":38},"01M6G9HRF6R89QZXGSFC9DRQW3","openspec-explore","Enter explore mode - a thinking partner for exploring ideas, investigating problems, and clarifying requirements. Use when the user wants to think through something before or during a change.","https:\u002F\u002Fgithub.com\u002Fricardoaevt\u002Fnexus-roms\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fopenspec-explore\u002FSKILL.md",[],[119,120,81,32,121,82,94,91,122,123,124,125,126],"openspec explore","explore","partner","think","thinking partner","thinking","ideas","requirements",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":76,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":38},"01M6G9HP3APFCXZG7XRWBMM524","openspec-continue-change","Continue working on an OpenSpec change by creating the next artifact. Use when the user wants to progress their change, create the next artifact, or continue their workflow.","https:\u002F\u002Fgithub.com\u002Fricardoaevt\u002Fnexus-roms\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fopenspec-continue-change\u002FSKILL.md",[],[81,134,135,94,107,82,108,91,32,136,106,137],"continue","openspec continue change","next","progress",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":76,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":38},"01M6G9HKT3WMSDBSKA7YM4MSSQ","openspec-archive-change","Archive a completed change in the experimental workflow. Use when the user wants to finalize and archive a change after implementation is complete.","https:\u002F\u002Fgithub.com\u002Fricardoaevt\u002Fnexus-roms\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fopenspec-archive-change\u002FSKILL.md",[],[145,81,146,94,82,107,91,32,89,86],"openspec archive change","archive",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":76,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":38},"01M6G9HHEG0RJK4E0YTVZZ6A8T","openspec-apply-change","Implement tasks from an OpenSpec change. Use when the user wants to start implementing, continue implementation, or work through tasks.","https:\u002F\u002Fgithub.com\u002Fricardoaevt\u002Fnexus-roms\u002Fblob\u002Fmain\u002F.agent\u002Fskills\u002Fopenspec-apply-change\u002FSKILL.md",[],[81,94,154,155,93,109,134,156,91,32,89,82],"openspec apply change","implement","work"]