refactor: flatten Microsoft skills from nested to flat directory structure
Rewrote sync_microsoft_skills.py (v4) to use each SKILL.md's frontmatter 'name' field as the flat directory name under skills/, replacing the nested skills/official/microsoft/<lang>/<category>/<service>/ hierarchy. This fixes CI failures caused by the indexing, validation, and catalog scripts expecting skills/<id>/SKILL.md (depth 1). Changes: - Rewrite scripts/sync_microsoft_skills.py for flat output with collision detection - Update scripts/tests/inspect_microsoft_repo.py for flat name mapping - Update scripts/tests/test_comprehensive_coverage.py for name uniqueness checks - Delete skills/official/ nested directory - Add 129 Microsoft skills as flat directories (e.g. skills/azure-mgmt-botservice-dotnet/) - Move attribution files to docs/ (LICENSE-MICROSOFT, microsoft-skills-attribution.json) - Rebuild skills_index.json, CATALOG.md, README.md (845 total skills)
This commit is contained in:
289
skills/azure-ai-projects-ts/SKILL.md
Normal file
289
skills/azure-ai-projects-ts/SKILL.md
Normal file
@@ -0,0 +1,289 @@
|
||||
---
|
||||
name: azure-ai-projects-ts
|
||||
description: Build AI applications using Azure AI Projects SDK for JavaScript (@azure/ai-projects). Use when working with Foundry project clients, agents, connections, deployments, datasets, indexes, evaluations, or getting OpenAI clients.
|
||||
package: @azure/ai-projects
|
||||
---
|
||||
|
||||
# Azure AI Projects SDK for TypeScript
|
||||
|
||||
High-level SDK for Azure AI Foundry projects with agents, connections, deployments, and evaluations.
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
npm install @azure/ai-projects @azure/identity
|
||||
```
|
||||
|
||||
For tracing:
|
||||
```bash
|
||||
npm install @azure/monitor-opentelemetry @opentelemetry/api
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
```bash
|
||||
AZURE_AI_PROJECT_ENDPOINT=https://<resource>.services.ai.azure.com/api/projects/<project>
|
||||
MODEL_DEPLOYMENT_NAME=gpt-4o
|
||||
```
|
||||
|
||||
## Authentication
|
||||
|
||||
```typescript
|
||||
import { AIProjectClient } from "@azure/ai-projects";
|
||||
import { DefaultAzureCredential } from "@azure/identity";
|
||||
|
||||
const client = new AIProjectClient(
|
||||
process.env.AZURE_AI_PROJECT_ENDPOINT!,
|
||||
new DefaultAzureCredential()
|
||||
);
|
||||
```
|
||||
|
||||
## Operation Groups
|
||||
|
||||
| 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 |
|
||||
|
||||
## Getting OpenAI Client
|
||||
|
||||
```typescript
|
||||
const 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!" }]
|
||||
});
|
||||
```
|
||||
|
||||
## Agents
|
||||
|
||||
### Create Agent
|
||||
|
||||
```typescript
|
||||
const agent = await client.agents.createVersion("my-agent", {
|
||||
kind: "prompt",
|
||||
model: "gpt-4o",
|
||||
instructions: "You are a helpful assistant."
|
||||
});
|
||||
```
|
||||
|
||||
### Agent with Tools
|
||||
|
||||
```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"
|
||||
}]
|
||||
});
|
||||
```
|
||||
|
||||
### Run Agent
|
||||
|
||||
```typescript
|
||||
const 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);
|
||||
```
|
||||
|
||||
## Connections
|
||||
|
||||
```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);
|
||||
```
|
||||
|
||||
## Deployments
|
||||
|
||||
```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");
|
||||
```
|
||||
|
||||
## Datasets
|
||||
|
||||
```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");
|
||||
```
|
||||
|
||||
## Indexes
|
||||
|
||||
```typescript
|
||||
import { 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");
|
||||
```
|
||||
|
||||
## Key Types
|
||||
|
||||
```typescript
|
||||
import {
|
||||
AIProjectClient,
|
||||
AIProjectClientOptionalParams,
|
||||
Connection,
|
||||
ModelDeployment,
|
||||
DatasetVersionUnion,
|
||||
AzureAISearchIndex
|
||||
} from "@azure/ai-projects";
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Use getOpenAIClient()** - For responses, conversations, files, and vector stores
|
||||
2. **Version your agents** - Use `createVersion` for reproducible agent definitions
|
||||
3. **Clean up resources** - Delete agents, conversations when done
|
||||
4. **Use connections** - Get credentials from project connections, don't hardcode
|
||||
5. **Filter deployments** - Use `modelPublisher` filter to find specific models
|
||||
Reference in New Issue
Block a user