87 lines
3.4 KiB
C#
Executable File
87 lines
3.4 KiB
C#
Executable File
#!/usr/bin/dotnet run
|
|
#:package Microsoft.Extensions.AI.Abstractions@9.9.1
|
|
#:package Azure.AI.Agents.Persistent@1.2.0-beta.4
|
|
#:package Azure.AI.OpenAI@2.1.0
|
|
#:package Azure.Identity@1.15.0
|
|
#:package System.Linq.Async@6.0.3
|
|
#:package Microsoft.Extensions.AI@9.9.1
|
|
#:package DotNetEnv@3.1.1
|
|
#:package OpenTelemetry.Api@1.12.0
|
|
#:package Microsoft.Agents.AI.Workflows@1.0.0-preview.251001.3
|
|
#:package Microsoft.Agents.AI.OpenAI@1.0.0-preview.251001.2
|
|
|
|
using System;
|
|
using System.Text.Json;
|
|
using System.Text.Json.Serialization;
|
|
using Microsoft.Extensions.AI;
|
|
using Microsoft.Agents.AI;
|
|
using Microsoft.Agents.AI.Workflows;
|
|
using Azure.AI.OpenAI;
|
|
using Azure.Identity;
|
|
using DotNetEnv;
|
|
|
|
// Load environment variables
|
|
Env.Load("../../../.env");
|
|
|
|
// Azure OpenAI with the Responses API (stable v1 endpoint). Sign in with `az login`.
|
|
var azureEndpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
|
|
?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
|
|
var deployment = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT") ?? "gpt-4o-mini";
|
|
|
|
var azureClient = new AzureOpenAIClient(new Uri(azureEndpoint), new AzureCliCredential());
|
|
|
|
// Define agent roles and instructions
|
|
const string REVIEWER_NAME = "Concierge";
|
|
const string REVIEWER_INSTRUCTIONS = @"""
|
|
You are an are hotel concierge who has opinions about providing the most local and authentic experiences for travelers.
|
|
The goal is to determine if the front desk travel agent has recommended the best non-touristy experience for a traveler.
|
|
If so, state that it is approved.
|
|
If not, provide insight on how to refine the recommendation without using a specific example.
|
|
""";
|
|
|
|
const string FRONTDESK_NAME = "FrontDesk";
|
|
const string FRONTDESK_INSTRUCTIONS = @"""
|
|
You are a Front Desk Travel Agent with ten years of experience and are known for brevity as you deal with many customers.
|
|
The goal is to provide the best activities and locations for a traveler to visit.
|
|
Only provide a single recommendation per response.
|
|
You're laser focused on the goal at hand.
|
|
Don't waste time with chit chat.
|
|
Consider suggestions when refining an idea.
|
|
""";
|
|
|
|
// Create agent options
|
|
ChatClientAgentOptions frontdeskAgentOptions = new(name: FRONTDESK_NAME, instructions: FRONTDESK_INSTRUCTIONS);
|
|
ChatClientAgentOptions reviewerAgentOptions = new(name: REVIEWER_NAME, instructions: REVIEWER_INSTRUCTIONS);
|
|
|
|
// Create agents
|
|
AIAgent reviewerAgent = azureClient.GetOpenAIResponseClient(deployment).CreateAIAgent(
|
|
reviewerAgentOptions);
|
|
AIAgent frontdeskAgent = azureClient.GetOpenAIResponseClient(deployment).CreateAIAgent(
|
|
frontdeskAgentOptions);
|
|
|
|
// Build workflow with agent coordination
|
|
var workflow = new WorkflowBuilder(frontdeskAgent)
|
|
.AddEdge(frontdeskAgent, reviewerAgent)
|
|
.Build();
|
|
|
|
// Execute workflow with streaming
|
|
StreamingRun run = await InProcessExecution.StreamAsync(workflow, new ChatMessage(ChatRole.User, "I would like to go to Paris."));
|
|
|
|
await run.TrySendMessageAsync(new TurnToken(emitEvents: true));
|
|
|
|
string strResult = "";
|
|
|
|
// Process streaming events
|
|
await foreach (WorkflowEvent evt in run.WatchStreamAsync().ConfigureAwait(false))
|
|
{
|
|
if (evt is AgentRunUpdateEvent executorComplete)
|
|
{
|
|
strResult += executorComplete.Data;
|
|
Console.WriteLine($"{executorComplete.ExecutorId}: {executorComplete.Data}");
|
|
}
|
|
}
|
|
|
|
// Display final result
|
|
Console.WriteLine("\nFinal Result:");
|
|
Console.WriteLine(strResult);
|