Install any skill in seconds. Free to start, no credit card required.
Get Started Free →High-level SDK for Azure AI Foundry projects with agents, connections, deployments, and evaluations.
.claude/skills/azure-ai-projects-ts/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-13 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-10 | ✗→✓ | ▲ Improved | — | — |
High-level SDK for Azure AI Foundry projects with agents, connections, deployments, and evaluations.
bashnpm install @azure/ai-projects @azure/identity
For tracing:
bashnpm install @azure/monitor-opentelemetry @opentelemetry/api
bashAZURE_AI_PROJECT_ENDPOINT=https://<resource>.services.ai.azure.com/api/projects/<project> MODEL_DEPLOYMENT_NAME=gpt-4o
typescriptimport { AIProjectClient } from "@azure/ai-projects"; import { DefaultAzureCredential } from "@azure/identity"; const client = new AIProjectClient( process.env.AZURE_AI_PROJECT_ENDPOINT!, new DefaultAzureCredential() );
| Group | Purpose | |-------|---------| | client.agents | Create and manage AI agents | | client.connections | List connected Azure resources | | client.deployments | List model deployments | | client.datasets | Upload and manage datasets | | client.indexes | Create and manage search indexes | | client.evaluators | Manage evaluation metrics | | client.memoryStores | Manage agent memory |
typescriptconst openAIClient = await client.getOpenAIClient(); // Use for responses const response = await openAIClient.responses.create({ model: "gpt-4o", input: "What is the capital of France?" }); // Use for conversations const conversation = await openAIClient.conversations.create({ items: [{ type: "message", role: "user", content: "Hello!" }] });
typescriptconst agent = await client.agents.createVersion("my-agent", { kind: "prompt", model: "gpt-4o", instructions: "You are a helpful assistant." });
typescript// Code Interpreter const agent = await client.agents.createVersion("code-agent", { kind: "prompt", model: "gpt-4o", instructions: "You can execute code.", tools: [{ type: "code_interpreter", container: { type: "auto" } }] }); // File Search const agent = await client.agents.createVersion("search-agent", { kind: "prompt", model: "gpt-4o", tools: [{ type: "file_search", vector_store_ids: [vectorStoreId] }] }); // Web Search const agent = await client.agents.createVersion("web-agent", { kind: "prompt", model: "gpt-4o", tools: [{ type: "web_search_preview", user_location: { type: "approximate", country: "US", city: "Seattle" } }] }); // Azure AI Search const agent = await client.agents.createVersion("aisearch-agent", { kind: "prompt", model: "gpt-4o", tools: [{ type: "azure_ai_search", azure_ai_search: { indexes: [{ project_connection_id: connectionId, index_name: "my-index", query_type: "simple" }] } }] }); // Function Tool const agent = await client.agents.createVersion("func-agent", { kind: "prompt", model: "gpt-4o", tools: [{ type: "function", function: { name: "get_weather", description: "Get weather for a location", strict: true, parameters: { type: "object", properties: { location: { type: "string" } }, required: ["location"] } } }] }); // MCP Tool const agent = await client.agents.createVersion("mcp-agent", { kind: "prompt", model: "gpt-4o", tools: [{ type: "mcp", server_label: "my-mcp", server_url: "https://mcp-server.example.com", require_approval: "always" }] });
typescriptconst openAIClient = await client.getOpenAIClient(); // Create conversation const conversation = await openAIClient.conversations.create({ items: [{ type: "message", role: "user", content: "Hello!" }] }); // Generate response using agent const response = await openAIClient.responses.create( { conversation: conversation.id }, { body: { agent: { name: agent.name, type: "agent_reference" } } } ); // Cleanup await openAIClient.conversations.delete(conversation.id); await client.agents.deleteVersion(agent.name, agent.version);
typescript// List all connections for await (const conn of client.connections.list()) { console.log(conn.name, conn.type); } // Get connection by name const conn = await client.connections.get("my-connection"); // Get connection with credentials const connWithCreds = await client.connections.getWithCredentials("my-connection"); // Get default connection by type const defaultAzureOpenAI = await client.connections.getDefault("AzureOpenAI", true);
typescript// List all deployments for await (const deployment of client.deployments.list()) { if (deployment.type === "ModelDeployment") { console.log(deployment.name, deployment.modelName); } } // Filter by publisher for await (const d of client.deployments.list({ modelPublisher: "OpenAI" })) { console.log(d.name); } // Get specific deployment const deployment = await client.deployments.get("gpt-4o");
typescript// Upload single file const dataset = await client.datasets.uploadFile( "my-dataset", "1.0", "./data/training.jsonl" ); // Upload folder const dataset = await client.datasets.uploadFolder( "my-dataset", "2.0", "./data/documents/" ); // Get dataset const ds = await client.datasets.get("my-dataset", "1.0"); // List versions for await (const version of client.datasets.listVersions("my-dataset")) { console.log(version); } // Delete await client.datasets.delete("my-dataset", "1.0");
typescriptimport { AzureAISearchIndex } from "@azure/ai-projects"; const indexConfig: AzureAISearchIndex = { name: "my-index", type: "AzureSearch", version: "1", indexName: "my-index", connectionName: "search-connection" }; // Create index const index = await client.indexes.createOrUpdate("my-index", "1", indexConfig); // List indexes for await (const idx of client.indexes.list()) { console.log(idx.name); } // Delete await client.indexes.delete("my-index", "1");
typescriptimport { AIProjectClient, AIProjectClientOptionalParams, Connection, ModelDeployment, DatasetVersionUnion, AzureAISearchIndex } from "@azure/ai-projects";
createVersion for reproducible agent definitionsmodelPublisher filter to find specific modelsThis skill is applicable to execute the workflow or actions described in the overview.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +74 percentage points is the difference between those two pass rates over the 23 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.