ai-agents-for-beginners

🌍 āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻĢāϟ āĻāĻœā§‡āĻ¨ā§āϟ āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• (.NET) āĻĻāĻŋāϝāĻŧ⧇ āĻāφāχ āĻŸā§āϰāĻžāϭ⧇āϞ āĻāĻœā§‡āĻ¨ā§āϟ

📋 āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋāϰ āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤ āĻŦāĻŋāĻŦāϰāĻŖ

āĻāχ āωāĻĻāĻžāĻšāϰāĻŖāϟāĻŋ āĻĻ⧇āĻ–āĻžāϝāĻŧ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻĢāϟ āĻāĻœā§‡āĻ¨ā§āϟ āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āĻŦ⧁āĻĻā§āϧāĻŋāĻŽāĻžāύ āĻ­ā§āϰāĻŽāĻŖ āĻĒāϰāĻŋāĻ•āĻ˛ā§āĻĒāύāĻž āĻāĻœā§‡āĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϝāĻžāϝāĻŧāĨ¤ āĻāĻœā§‡āĻ¨ā§āϟāϟāĻŋ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻŦāĻŋāĻļā§āĻŦ⧇āϰ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ¸ā§āĻĨāĻžāύ⧇āϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤāĻ•ā§ƒāϤ āĻĻāĻŋāύāĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āĻ­ā§āϰāĻŽāĻŖ āĻĒāϰāĻŋāĻ•āĻ˛ā§āĻĒāύāĻž āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āĻĒā§āϰāϧāĻžāύ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϏāĻŽā§‚āĻš:

🔧 āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋāĻ—āϤ āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āϝ

āĻŽā§‚āϞ āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋ

āĻĒā§āϰāϧāĻžāύ āωāĻĒāĻžāĻĻāĻžāύ

  1. AIAgent: āĻĒā§āϰāϧāĻžāύ āĻāĻœā§‡āĻ¨ā§āϟ āĻ…āĻ°ā§āϕ⧇āĻ¸ā§āĻŸā§āϰ⧇āϟāϰ āϝāĻž āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāύ⧇āϰ āĻĒā§āϰāĻŦāĻžāĻš āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧇
  2. āĻ•āĻžāĻ¸ā§āϟāĻŽ āϟ⧁āϞāϏ: āĻāĻœā§‡āĻ¨ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āωāĻĒāϞāĻŦā§āϧ GetRandomDestination() āĻĢāĻžāĻ‚āĻļāύ
  3. āĻšā§āϝāĻžāϟ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ: GitHub āĻŽāĻĄā§‡āϞ-āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāύ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ
  4. āĻ¸ā§āĻŸā§āϰāĻŋāĻŽāĻŋāĻ‚ āϏāĻžāĻĒā§‹āĻ°ā§āϟ: āϰāĻŋāϝāĻŧ⧇āϞ-āϟāĻžāχāĻŽ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϤ⧈āϰāĻŋāϰ āĻ•ā§āώāĻŽāϤāĻž

āχāĻ¨ā§āϟāĻŋāĻ—ā§āϰ⧇āĻļāύ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ

graph LR
    A[User Request] --> B[AI Agent]
    B --> C[GitHub Models API]
    B --> D[GetRandomDestination Tool]
    C --> E[Travel Itinerary]
    D --> E

🚀 āĻļ⧁āϰ⧁ āĻ•āϰāĻžāϰ āωāĻĒāĻžāϝāĻŧ

āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž

āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻĒāϰāĻŋāĻŦ⧇āĻļ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ

# zsh/bash
export GH_TOKEN=<your_github_token>
export GH_ENDPOINT=https://models.github.ai/inference
export GH_MODEL_ID=openai/gpt-5-mini
# PowerShell
$env:GH_TOKEN = "<your_github_token>"
$env:GH_ENDPOINT = "https://models.github.ai/inference"
$env:GH_MODEL_ID = "openai/gpt-5-mini"

āύāĻŽā§āύāĻž āϕ⧋āĻĄ

āϕ⧋āĻĄ āωāĻĻāĻžāĻšāϰāĻŖ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ,

# zsh/bash
chmod +x ./01-dotnet-agent-framework.cs
./01-dotnet-agent-framework.cs

āĻ…āĻĨāĻŦāĻž dotnet CLI āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇:

dotnet run ./01-dotnet-agent-framework.cs

āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āϕ⧋āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āĻĻ⧇āϖ⧁āύ 01-dotnet-agent-framework.csāĨ¤

#!/usr/bin/dotnet run

#:package Microsoft.Extensions.AI@9.*
#:package Microsoft.Agents.AI.OpenAI@1.*-*

using System.ClientModel;
using System.ComponentModel;

using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;

using OpenAI;

// Tool Function: Random Destination Generator
// This static method will be available to the agent as a callable tool
// The [Description] attribute helps the AI understand when to use this function
// This demonstrates how to create custom tools for AI agents
[Description("Provides a random vacation destination.")]
static string GetRandomDestination()
{
    // List of popular vacation destinations around the world
    // The agent will randomly select from these options
    var destinations = new List<string>
    {
        "Paris, France",
        "Tokyo, Japan",
        "New York City, USA",
        "Sydney, Australia",
        "Rome, Italy",
        "Barcelona, Spain",
        "Cape Town, South Africa",
        "Rio de Janeiro, Brazil",
        "Bangkok, Thailand",
        "Vancouver, Canada"
    };

    // Generate random index and return selected destination
    // Uses System.Random for simple random selection
    var random = new Random();
    int index = random.Next(destinations.Count);
    return destinations[index];
}

// Extract configuration from environment variables
// Retrieve the GitHub Models API endpoint, defaults to https://models.github.ai/inference if not specified
// Retrieve the model ID, defaults to openai/gpt-5-mini if not specified
// Retrieve the GitHub token for authentication, throws exception if not specified
var github_endpoint = Environment.GetEnvironmentVariable("GH_ENDPOINT") ?? "https://models.github.ai/inference";
var github_model_id = Environment.GetEnvironmentVariable("GH_MODEL_ID") ?? "openai/gpt-5-mini";
var github_token = Environment.GetEnvironmentVariable("GH_TOKEN") ?? throw new InvalidOperationException("GH_TOKEN is not set.");

// Configure OpenAI Client Options
// Create configuration options to point to GitHub Models endpoint
// This redirects OpenAI client calls to GitHub's model inference service
var openAIOptions = new OpenAIClientOptions()
{
    Endpoint = new Uri(github_endpoint)
};

// Initialize OpenAI Client with GitHub Models Configuration
// Create OpenAI client using GitHub token for authentication
// Configure it to use GitHub Models endpoint instead of OpenAI directly
var openAIClient = new OpenAIClient(new ApiKeyCredential(github_token), openAIOptions);

// Create AI Agent with Travel Planning Capabilities
// Initialize OpenAI client, get chat client for specified model, and create AI agent
// Configure agent with travel planning instructions and random destination tool
// The agent can now plan trips using the GetRandomDestination function
AIAgent agent = openAIClient
    .GetChatClient(github_model_id)
    .CreateAIAgent(
        instructions: "You are a helpful AI Agent that can help plan vacations for customers at random destinations",
        tools: [AIFunctionFactory.Create(GetRandomDestination)]
    );

// Execute Agent: Plan a Day Trip
// Run the agent with streaming enabled for real-time response display
// Shows the agent's thinking and response as it generates the content
// Provides better user experience with immediate feedback
await foreach (var update in agent.RunStreamingAsync("Plan me a day trip"))
{
    await Task.Delay(10);
    Console.Write(update);
}

🎓 āĻŽā§‚āϞ āĻļāĻŋāĻ•ā§āώāĻž

  1. āĻāĻœā§‡āĻ¨ā§āϟ āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āϝ: āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻĢāϟ āĻāĻœā§‡āĻ¨ā§āϟ āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• .NET-āĻ āĻāφāχ āĻāĻœā§‡āĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ, āϟāĻžāχāĻĒ-āϏ⧇āĻĢ āĻĒāĻĻā§āϧāϤāĻŋ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇
  2. āϟ⧁āϞ āχāĻ¨ā§āϟāĻŋāĻ—ā§āϰ⧇āĻļāύ: [Description] āĻ…ā§āϝāĻžāĻŸā§āϰāĻŋāĻŦāĻŋāωāϟ āĻĻāĻŋāϝāĻŧ⧇ āϏāĻœā§āϜāĻŋāϤ āĻĢāĻžāĻ‚āĻļāύāϗ⧁āϞāĻŋ āĻāĻœā§‡āĻ¨ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āωāĻĒāϞāĻŦā§āϧ āϟ⧁āϞ āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧ
  3. āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž: āĻĒāϰāĻŋāĻŦ⧇āĻļ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻāĻŦāĻ‚ āύāĻŋāϰāĻžāĻĒāĻĻ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž .NET-āĻāϰ āϏ⧇āϰāĻž āĻ…āύ⧁āĻļā§€āϞāύ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇
  4. OpenAI āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝāϤāĻž: GitHub āĻŽāĻĄā§‡āϞ āχāĻ¨ā§āϟāĻŋāĻ—ā§āϰ⧇āĻļāύ OpenAI-āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝāĻĒā§‚āĻ°ā§āĻŖ API-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āύāĻŋāĻ°ā§āĻŦāĻŋāĻ˜ā§āύ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇

🔗 āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āϏāĻŽā§āĻĒāĻĻ


āĻ…āĻ¸ā§āĻŦā§€āĻ•ā§ƒāϤāĻŋ:
āĻāχ āύāĻĨāĻŋāϟāĻŋ AI āĻ…āύ⧁āĻŦāĻžāĻĻ āĻĒāϰāĻŋāώ⧇āĻŦāĻž Co-op Translator āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ…āύ⧁āĻŦāĻžāĻĻ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āφāĻŽāϰāĻž āϝāĻĨāĻžāϏāĻŽā§āĻ­āĻŦ āϏāĻ āĻŋāĻ• āĻ…āύ⧁āĻŦāĻžāĻĻ⧇āϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻŋ, āϤāĻŦ⧇ āĻ…āύ⧁āĻ—ā§āϰāĻš āĻ•āϰ⧇ āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ āϝ⧇ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧ āĻ…āύ⧁āĻŦāĻžāĻĻ⧇ āĻ¤ā§āϰ⧁āϟāĻŋ āĻŦāĻž āĻ…āϏāĻ™ā§āĻ—āϤāĻŋ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āύāĻĨāĻŋāϟāĻŋāϰ āĻŽā§‚āϞ āĻ­āĻžāώāĻžāϝāĻŧ āĻĨāĻžāĻ•āĻž āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖāϟāĻŋāϕ⧇ āĻĒā§āϰāĻžāĻŽāĻžāĻŖāĻŋāĻ• āĻ‰ā§ŽāϏ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāĻž āωāϚāĻŋāϤāĨ¤ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ, āĻĒ⧇āĻļāĻžāĻĻāĻžāϰ āĻŽāĻžāύāĻŦ āĻ…āύ⧁āĻŦāĻžāĻĻ āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻāχ āĻ…āύ⧁āĻŦāĻžāĻĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻĢāϞ⧇ āϏ⧃āĻˇā§āϟ āϕ⧋āύ⧋ āϭ⧁āϞ āĻŦā§‹āĻāĻžāĻŦ⧁āĻāĻŋ āĻŦāĻž āϭ⧁āϞ āĻŦā§āϝāĻžāĻ–ā§āϝāĻžāϰ āϜāĻ¨ā§āϝ āφāĻŽāϰāĻž āĻĻāĻžāϝāĻŧā§€ āύāχāĨ¤