Lab 024: Teams AI Library BotΒΆ
What You'll LearnΒΆ
- Build a code-first Teams bot with the Teams AI Library (JavaScript)
- Connect the bot to GitHub Models (no Azure OpenAI needed)
- Run locally with the Teams Toolkit and Teams App Test Tool
- Handle user messages, adaptive cards, and actions
- Add AI-powered responses using the AI module
IntroductionΒΆ
The Teams AI Library is a JavaScript/TypeScript SDK for building AI-powered bots that run natively in Microsoft Teams. Unlike Copilot Studio (no-code), Teams AI Library gives you full programmatic control β custom logic, webhook integrations, complex state management.
This lab builds the OutdoorGear customer service bot for Teams.
PrerequisitesΒΆ
- Node.js 18+ (
node --version) - Teams Toolkit VS Code extension (install from VS Code marketplace)
- Microsoft 365 Developer Program tenant (free at developer.microsoft.com/microsoft-365/dev-program)
GITHUB_TOKENset
Free M365 Developer tenant
The M365 Developer Program gives you a free 90-day sandbox tenant with Teams, SharePoint, and all Microsoft 365 apps β renewable if active.
Lab ExerciseΒΆ
Step 1: Create the projectΒΆ
# Install Teams Toolkit CLI
npm install -g @microsoft/teamsapp-cli
# Create a new bot project
teamsapp new
# Select: Bot β AI Bot β JavaScript β Teams AI Library
Or use VS Code:
1. Open VS Code β Teams Toolkit extension (left sidebar)
2. Click Create a New App β Bot β AI Bot β JavaScript
3. Name: OutdoorGearBot
Step 2: Project structureΒΆ
OutdoorGearBot/
βββ src/
β βββ app.js β Bot application entry point
β βββ config.js β Configuration (model, storage)
β βββ prompts/
β βββ chat/
β βββ skprompt.txt β System prompt
β βββ config.json β Model parameters
βββ appPackage/
β βββ manifest.json β Teams app manifest
β βββ ...
βββ teamsapp.yml β Teams Toolkit config
Step 3: Configure GitHub ModelsΒΆ
Edit src/config.js:
const config = {
botId: process.env.BOT_ID,
botPassword: process.env.BOT_PASSWORD,
// Use GitHub Models (OpenAI-compatible, free)
openAIKey: process.env.GITHUB_TOKEN,
openAIEndpoint: "https://models.inference.ai.azure.com",
openAIModel: "gpt-4o-mini",
};
module.exports = config;
Edit src/app.js:
const { Application, AI, preview } = require("@microsoft/teams-ai");
const { OpenAIModel, PromptManager, ActionPlanner } = preview;
const config = require("./config");
const path = require("path");
// Create OpenAI model pointing to GitHub Models
const model = new OpenAIModel({
apiKey: config.openAIKey,
endpoint: config.openAIEndpoint,
defaultModel: config.openAIModel,
useSystemPrompt: true,
logRequests: true,
});
const prompts = new PromptManager({
promptsFolder: path.join(__dirname, "prompts"),
});
const planner = new ActionPlanner({
model,
prompts,
defaultPrompt: "chat",
});
const app = new Application({
storage: new MemoryStorage(),
ai: { planner },
});
// Handle messages
app.message("/reset", async (context, state) => {
state.deleteConversationState();
await context.sendActivity("Conversation reset! How can I help you?");
});
// Default: handled by AI planner
module.exports = { app };
Step 4: Write the system promptΒΆ
Edit src/prompts/chat/skprompt.txt:
You are OutdoorGear Assistant β a friendly customer service bot for OutdoorGear Inc.
You help customers with:
- Product questions (boots, tents, packs, jackets, climbing gear)
- Order status and tracking
- Return policy (60-day window, unused items, not worn footwear)
- Shipping info ($5.99 standard 3-5 days, free over $75)
- Warranty claims (2-year standard, lifetime on climbing gear)
Key products:
- TrailBlazer X200 hiking boot β $189.99, Gore-Tex waterproof, Vibram outsole
- Summit Pro Tent β $349, 2-person 4-season, DAC aluminum poles
- OmniPack 45L pack β $279.99, technical backpack with hip belt
- StormShell Jacket β $349, 3-layer Gore-Tex Pro, 20k/20k waterproof
- ClimbTech Pro Harness β $129.99, CE EN12277, 15kN rated
Be friendly, concise, and always recommend visiting outdoorgear.com for purchases.
For order tracking, ask for the order number and direct to outdoorgear.com/orders.
Conversation history:
{{$conversation}}
Edit src/prompts/chat/config.json:
{
"schema": 1.1,
"description": "OutdoorGear customer service chat",
"type": "completion",
"completion": {
"model": "gpt-4o-mini",
"completion_type": "chat",
"include_history": true,
"include_input": true,
"max_input_tokens": 2800,
"max_tokens": 1000,
"temperature": 0.7
}
}
Step 5: Run locally with Teams App Test ToolΒΆ
This opens the Teams App Test Tool β a browser-based simulator that lets you test your bot without deploying to real Teams.
Try:
- What boots do you have?
- Tell me about your return policy
- I need a tent for 2 people in winter
- /reset
Step 6: Add an Adaptive Card responseΒΆ
Adaptive Cards make bot responses rich and interactive:
// In app.js β add after planner setup:
app.message("show products", async (context, state) => {
await context.sendActivity({
attachments: [{
contentType: "application/vnd.microsoft.card.adaptive",
content: {
type: "AdaptiveCard",
version: "1.5",
body: [
{ type: "TextBlock", text: "ποΈ OutdoorGear Products", size: "Large", weight: "Bolder" },
{ type: "FactSet", facts: [
{ title: "TrailBlazer X200", value: "$189.99 β Waterproof hiking boot" },
{ title: "Summit Pro Tent", value: "$349.00 β 4-season, 2-person" },
{ title: "OmniPack 45L", value: "$279.99 β Technical backpack" },
{ title: "StormShell Jacket", value: "$349.00 β Gore-Tex Pro shell" },
]},
],
actions: [
{ type: "Action.OpenUrl", title: "Shop Now", url: "https://outdoorgear.com" },
]
}
}]
});
});
ArchitectureΒΆ
Teams Client
β (Bot Framework)
βΌ
Bot Framework Adapter
β
βΌ
Teams AI Library Application
βββ Message router (custom handlers)
βββ AI Planner β OpenAI/GitHub Models
β βββ PromptManager (skprompt.txt)
βββ Adaptive Card renderer
Next StepsΒΆ
- No-code Teams agent: β Lab 011 β Copilot Studio
- Deploy to Azure: β Lab 028 β Deploy to Container Apps