Créer un Plugin API TypeSpec
Créez un plugin API TypeSpec complet pour Microsoft 365 Copilot qui s'intègre avec des API REST externes.
Exigences
Générez des fichiers TypeSpec avec :
main.tsp - Définition de l'Agent
import "@typespec/http";
import "@typespec/openapi3";
import "@microsoft/typespec-m365-copilot";
import "./actions.tsp";
using TypeSpec.Http;
using TypeSpec.M365.Copilot.Agents;
using TypeSpec.M365.Copilot.Actions;
@agent({
name: "[Agent Name]",
description: "[Description]"
})
@instructions("""
[Instructions for using the API operations]
""")
namespace [AgentName] {
// Reference operations from actions.tsp
op operation1 is [APINamespace].operationName;
}
actions.tsp - Opérations API
import "@typespec/http";
import "@microsoft/typespec-m365-copilot";
using TypeSpec.Http;
using TypeSpec.M365.Copilot.Actions;
@service
@actions(#{
nameForHuman: "[API Display Name]",
descriptionForModel: "[Model description]",
descriptionForHuman: "[User description]"
})
@server("[API_BASE_URL]", "[API Name]")
@useAuth([AuthType]) // Optional
namespace [APINamespace] {
@route("[/path]")
@get
@action
op operationName(
@path param1: string,
@query param2?: string
): ResponseModel;
model ResponseModel {
// Response structure
}
}
Options d'Authentification
Choisissez selon les exigences de l'API :
-
Pas d'Authentification (API Publiques)
// No @useAuth decorator needed -
Clé API
@useAuth(ApiKeyAuth<ApiKeyLocation.header, "X-API-Key">) -
OAuth2
@useAuth(OAuth2Auth<[{ type: OAuth2FlowType.authorizationCode; authorizationUrl: "https://oauth.example.com/authorize"; tokenUrl: "https://oauth.example.com/token"; refreshUrl: "https://oauth.example.com/token"; scopes: ["read", "write"]; }]>) -
Référence d'Authentification Enregistrée
@useAuth(Auth) @authReferenceId("registration-id-here") model Auth is ApiKeyAuth<ApiKeyLocation.header, "X-API-Key">
Capacités de Fonction
Dialogue de Confirmation
@capabilities(#{
confirmation: #{
type: "AdaptiveCard",
title: "Confirm Action",
body: """
Are you sure you want to perform this action?
* **Parameter**: {{ function.parameters.paramName }}
"""
}
})
Réponse Adaptive Card
@card(#{
dataPath: "$.items",
title: "$.title",
url: "$.link",
file: "cards/card.json"
})
Raisonnement et Instructions de Réponse
@reasoning("""
Consider user's context when calling this operation.
Prioritize recent items over older ones.
""")
@responding("""
Present results in a clear table format with columns: ID, Title, Status.
Include a summary count at the end.
""")
Bonnes Pratiques
- Noms d'Opérations : Utilisez des noms clairs et orientés action (listProjects, createTicket)
- Modèles : Définissez des modèles TypeScript-like pour les requêtes et réponses
- Méthodes HTTP : Utilisez les verbes appropriés (@get, @post, @patch, @delete)
- Chemins : Utilisez des conventions de chemin RESTful avec @route
- Paramètres : Utilisez @path, @query, @header, @body de manière appropriée
- Descriptions : Fournissez des descriptions claires pour la compréhension du modèle
- Confirmations : Ajoutez-les pour les opérations destructrices (suppression, mise à jour de données critiques)
- Cards : Utilisez-les pour les réponses visuelles enrichies avec plusieurs éléments de données
Flux de Travail
Posez à l'utilisateur :
- Quelle est l'URL de base de l'API et son objectif ?
- Quelles opérations sont nécessaires (opérations CRUD) ?
- Quelle méthode d'authentification l'API utilise-t-elle ?
- Des confirmations sont-elles requises pour certaines opérations ?
- Les réponses ont-elles besoin d'Adaptive Cards ?
Puis générez :
main.tspcomplet avec définition d'agentactions.tspcomplet avec opérations API et modèlescards/card.jsonoptionnel si des Adaptive Cards sont nécessaires