From 8a5353d838abac0ecca68292e4773321e6ba9886 Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Fri, 31 Oct 2025 17:13:12 +0100 Subject: [PATCH 01/17] Implement core chat functionality with API endpoints, message handling, and UI integration --- .../ContosoLiveChatApp.csproj | 9 + .../Controllers/ChatController.cs | 92 ++++++ .../ContosoLiveChatApp/Models/ChatMessage.cs | 14 + .../ContosoLiveChatApp/Program.cs | 34 ++ .../ContosoLiveChatApp/README.md | 154 +++++++++ .../Services/ChatService.cs | 21 ++ .../Services/WebhookService.cs | 51 +++ .../ContosoLiveChatApp/appsettings.json | 12 + .../ContosoLiveChatApp/wwwroot/index.html | 307 ++++++++++++++++++ 9 files changed, 694 insertions(+) create mode 100644 HandoverToLiveAgent/ContosoLiveChatApp/ContosoLiveChatApp.csproj create mode 100644 HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs create mode 100644 HandoverToLiveAgent/ContosoLiveChatApp/Models/ChatMessage.cs create mode 100644 HandoverToLiveAgent/ContosoLiveChatApp/Program.cs create mode 100644 HandoverToLiveAgent/ContosoLiveChatApp/README.md create mode 100644 HandoverToLiveAgent/ContosoLiveChatApp/Services/ChatService.cs create mode 100644 HandoverToLiveAgent/ContosoLiveChatApp/Services/WebhookService.cs create mode 100644 HandoverToLiveAgent/ContosoLiveChatApp/appsettings.json create mode 100644 HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/ContosoLiveChatApp.csproj b/HandoverToLiveAgent/ContosoLiveChatApp/ContosoLiveChatApp.csproj new file mode 100644 index 00000000..1b28a01c --- /dev/null +++ b/HandoverToLiveAgent/ContosoLiveChatApp/ContosoLiveChatApp.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs new file mode 100644 index 00000000..09215f7d --- /dev/null +++ b/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs @@ -0,0 +1,92 @@ +using Microsoft.AspNetCore.Mvc; + +[ApiController] +[Route("api/[controller]")] +public class ChatController : ControllerBase +{ + private readonly ChatService _chatService; + private readonly WebhookService _webhookService; + private readonly ILogger _logger; + + public ChatController(ChatService chatService, WebhookService webhookService, ILogger logger) + { + _chatService = chatService; + _webhookService = webhookService; + _logger = logger; + } + + // GET: api/chat/messages - Get all chat messages + [HttpGet("messages")] + public ActionResult> GetMessages() + { + var messages = _chatService.GetAllMessages(); + return Ok(messages); + } + + // POST: api/chat/send - Send a message (from user to webhook) + [HttpPost("send")] + public async Task SendMessage([FromBody] SendMessageRequest request) + { + if (string.IsNullOrWhiteSpace(request.Text)) + { + return BadRequest(new { error = "Message text cannot be empty" }); + } + + var message = new ChatMessage + { + Text = request.Text, + Sender = "Contoso Support", + Direction = MessageDirection.Outgoing, + Timestamp = DateTime.UtcNow + }; + + // Add to chat history + _chatService.AddMessage(message); + + // Send to webhook + var success = await _webhookService.SendMessageAsync(message); + + if (success) + { + return Ok(new { message = "Message sent successfully", messageId = message.Id }); + } + else + { + return StatusCode(500, new { error = "Failed to send message to webhook" }); + } + } + + // POST: api/chat/receive - Receive a message (from remote party) + [HttpPost("receive")] + public ActionResult ReceiveMessage([FromBody] ReceiveMessageRequest request) + { + if (string.IsNullOrWhiteSpace(request.Text)) + { + return BadRequest(new { error = "Message text cannot be empty" }); + } + + var message = new ChatMessage + { + Text = request.Text, + Sender = request.Sender ?? "Remote", + Direction = MessageDirection.Incoming, + Timestamp = DateTime.UtcNow + }; + + _chatService.AddMessage(message); + _logger.LogInformation("Received message from {Sender}: {Text}", message.Sender, message.Text); + + return Ok(new { message = "Message received successfully", messageId = message.Id }); + } +} + +public class SendMessageRequest +{ + public string Text { get; set; } = string.Empty; +} + +public class ReceiveMessageRequest +{ + public string Text { get; set; } = string.Empty; + public string? Sender { get; set; } +} diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Models/ChatMessage.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Models/ChatMessage.cs new file mode 100644 index 00000000..81782221 --- /dev/null +++ b/HandoverToLiveAgent/ContosoLiveChatApp/Models/ChatMessage.cs @@ -0,0 +1,14 @@ +public class ChatMessage +{ + public string Id { get; set; } = Guid.NewGuid().ToString(); + public string Text { get; set; } = string.Empty; + public string Sender { get; set; } = string.Empty; + public DateTime Timestamp { get; set; } = DateTime.UtcNow; + public MessageDirection Direction { get; set; } +} + +public enum MessageDirection +{ + Outgoing, + Incoming +} diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Program.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Program.cs new file mode 100644 index 00000000..235ce4d1 --- /dev/null +++ b/HandoverToLiveAgent/ContosoLiveChatApp/Program.cs @@ -0,0 +1,34 @@ +var builder = WebApplication.CreateBuilder(args); + +// Configure to host on port 5000 +builder.WebHost.ConfigureKestrel(serverOptions => +{ + serverOptions.ListenAnyIP(5000); +}); + +// Add services to the container. +builder.Services.AddControllers(); +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSingleton(); +builder.Services.AddHttpClient(); + +var app = builder.Build(); + +// Validate webhook configuration +var webhookUrl = app.Configuration["WebhookSettings:OutgoingWebhookUrl"]; +if (string.IsNullOrWhiteSpace(webhookUrl) || webhookUrl == "https://your-webhook-endpoint.com/api/messages") +{ + throw new InvalidOperationException( + "Invalid webhook configuration. Please set a valid 'WebhookSettings:OutgoingWebhookUrl' in appsettings.json. " + + "The default placeholder value 'https://your-webhook-endpoint.com/api/messages' is not allowed."); +} + +app.Logger.LogInformation("Webhook URL configured: {WebhookUrl}", webhookUrl); + +// Configure the HTTP request pipeline. +app.UseDefaultFiles(); +app.UseStaticFiles(); +app.UseRouting(); +app.MapControllers(); + +app.Run(); diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/README.md b/HandoverToLiveAgent/ContosoLiveChatApp/README.md new file mode 100644 index 00000000..56eb1f75 --- /dev/null +++ b/HandoverToLiveAgent/ContosoLiveChatApp/README.md @@ -0,0 +1,154 @@ +# Contoso Live Chat App + +A simple ASP.NET Core live chat application with webhook integration. + +## Features + +- Real-time chat interface with message history +- Send messages to a preconfigured webhook endpoint +- Receive messages from remote parties via POST endpoint +- Clean, modern UI with responsive design +- In-memory message storage + +## Project Structure + +``` +ContosoLiveChatApp/ +├── Controllers/ +│ └── ChatController.cs # API endpoints for chat operations +├── Models/ +│ └── ChatMessage.cs # Chat message data model +├── Services/ +│ ├── ChatService.cs # In-memory chat history management +│ └── WebhookService.cs # Outgoing webhook sender +├── wwwroot/ +│ └── index.html # Chat UI +├── Program.cs # Application entry point +├── appsettings.json # Configuration (webhook URL) +└── ContosoLiveChatApp.csproj # Project file +``` + +## Configuration + +**⚠️ IMPORTANT:** Before running the application, you **must** configure a valid webhook URL in `appsettings.json`: + +```json +{ + "WebhookSettings": { + "OutgoingWebhookUrl": "https://your-webhook-endpoint.com/api/messages" + } +} +``` + +Replace `https://your-webhook-endpoint.com/api/messages` with your actual webhook endpoint URL. + +**The application will not start if:** +- The webhook URL is not set (empty or null) +- The webhook URL is still set to the default placeholder value + +This validation ensures you don't accidentally run the application with an invalid webhook configuration. + +## Running the Application + +1. Navigate to the project directory: +```powershell +cd CopilotStudioSamples\HandoverToLiveAgent\ContosoLiveChatApp +``` + +2. Restore dependencies and run: +```powershell +dotnet run +``` + +3. Open your browser and navigate to: +``` +http://localhost:5000 +``` + +## API Endpoints + +### 1. Get All Messages +- **Endpoint**: `GET /api/chat/messages` +- **Description**: Retrieves all chat messages +- **Response**: Array of ChatMessage objects + +### 2. Send Message +- **Endpoint**: `POST /api/chat/send` +- **Description**: Sends a message from the user (forwards to webhook) +- **Request Body**: +```json +{ + "text": "Your message here" +} +``` +- **Response**: +```json +{ + "message": "Message sent successfully", + "messageId": "guid" +} +``` + +### 3. Receive Message +- **Endpoint**: `POST /api/chat/receive` +- **Description**: Receives incoming messages from remote parties +- **Request Body**: +```json +{ + "text": "Incoming message", + "sender": "Remote Party Name" +} +``` +- **Response**: +```json +{ + "message": "Message received successfully", + "messageId": "guid" +} +``` + +## Usage + +### Sending Messages (User Interface) +1. Type your message in the input field at the bottom +2. Click the "Send" button or press Enter +3. The message will be displayed in the chat history +4. The message will be sent to the configured webhook endpoint + +### Receiving Messages (Via API) +Remote parties can send messages to your chat by making a POST request to: +``` +POST http://localhost:5000/api/chat/receive +Content-Type: application/json + +{ + "text": "Hello from remote party", + "sender": "Agent Name" +} +``` + +The message will automatically appear in the chat history. + +## Testing the Webhook + +To test the webhook functionality without a real endpoint, you can use services like: +- [webhook.site](https://webhook.site) - Provides a temporary webhook URL +- [RequestBin](https://requestbin.com) - Inspect HTTP requests +- [ngrok](https://ngrok.com) - Create a tunnel to your local machine + +## Notes + +- Messages are stored in-memory and will be lost when the application restarts +- The chat automatically polls for new messages every 2 seconds +- The UI is responsive and works on mobile devices +- All timestamps are in UTC + +## Future Enhancements + +Consider adding: +- Database persistence for messages +- WebSocket/SignalR for real-time updates +- User authentication +- Message delivery confirmation +- File attachments support +- Typing indicators diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Services/ChatService.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Services/ChatService.cs new file mode 100644 index 00000000..e3deea4a --- /dev/null +++ b/HandoverToLiveAgent/ContosoLiveChatApp/Services/ChatService.cs @@ -0,0 +1,21 @@ +using System.Collections.Concurrent; + +public class ChatService +{ + private readonly ConcurrentBag _messages = new(); + + public void AddMessage(ChatMessage message) + { + _messages.Add(message); + } + + public IEnumerable GetAllMessages() + { + return _messages.OrderBy(m => m.Timestamp); + } + + public ChatMessage? GetMessageById(string id) + { + return _messages.FirstOrDefault(m => m.Id == id); + } +} diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Services/WebhookService.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Services/WebhookService.cs new file mode 100644 index 00000000..96e1a3e1 --- /dev/null +++ b/HandoverToLiveAgent/ContosoLiveChatApp/Services/WebhookService.cs @@ -0,0 +1,51 @@ +using System.Text; +using System.Text.Json; + +public class WebhookService +{ + private readonly HttpClient _httpClient; + private readonly IConfiguration _configuration; + private readonly ILogger _logger; + + public WebhookService(HttpClient httpClient, IConfiguration configuration, ILogger logger) + { + _httpClient = httpClient; + _configuration = configuration; + _logger = logger; + } + + public async Task SendMessageAsync(ChatMessage message) + { + try + { + var webhookUrl = _configuration["WebhookSettings:OutgoingWebhookUrl"]; + + if (string.IsNullOrEmpty(webhookUrl)) + { + _logger.LogWarning("Webhook URL is not configured"); + return false; + } + + var json = JsonSerializer.Serialize(message); + var content = new StringContent(json, Encoding.UTF8, "application/json"); + + var response = await _httpClient.PostAsync(webhookUrl, content); + + if (response.IsSuccessStatusCode) + { + _logger.LogInformation("Message sent successfully to webhook: {MessageId}", message.Id); + return true; + } + else + { + _logger.LogWarning("Failed to send message to webhook. Status: {StatusCode}", response.StatusCode); + return false; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Error sending message to webhook"); + return false; + } + } +} diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/appsettings.json b/HandoverToLiveAgent/ContosoLiveChatApp/appsettings.json new file mode 100644 index 00000000..dc479f92 --- /dev/null +++ b/HandoverToLiveAgent/ContosoLiveChatApp/appsettings.json @@ -0,0 +1,12 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "WebhookSettings": { + "OutgoingWebhookUrl": "https://your-webhook-endpoint.com/api/messages" + } +} diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html b/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html new file mode 100644 index 00000000..54452ea3 --- /dev/null +++ b/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html @@ -0,0 +1,307 @@ + + + + + + Contoso Live Chat + + + +
+
+ Contoso Live Chat +
+
+
Loading messages...
+
+
+ + +
+
+ + + + From 83cd0091187c8dbeeb0405dc03f2f00239493fbb Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Mon, 3 Nov 2025 12:39:51 +0100 Subject: [PATCH 02/17] Update project to .NET 9, implement live chat service, and add webhook handling --- .../ContosoLiveChatApp.csproj | 2 +- .../Controllers/ChatController.cs | 8 +- .../ContosoLiveChatApp/Program.cs | 12 +- .../ContosoLiveChatApp/appsettings.json | 2 +- .../ContosoLiveChatApp/wwwroot/index.html | 6 +- .../CopilotStudio/CopilotStudioAgent.cs | 72 +++++++++++ .../CopilotStudio/SkillController.cs | 15 +++ .../HandoverToLiveAgentSample.csproj | 17 +++ .../LiveChat/LiveChatService.cs | 117 ++++++++++++++++++ .../LiveChat/LiveChatWebhookController.cs | 40 ++++++ .../HandoverToLiveAgentSample/Program.cs | 72 +++++++++++ .../appsettings.Development.json | 11 ++ .../appsettings.json | 12 ++ .../wwwroot/skill-manifest.json | 54 ++++++++ HandoverToLiveAgent/README.md | 6 + 15 files changed, 431 insertions(+), 15 deletions(-) create mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs create mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/SkillController.cs create mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/HandoverToLiveAgentSample.csproj create mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatService.cs create mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs create mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs create mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.Development.json create mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.json create mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json create mode 100644 HandoverToLiveAgent/README.md diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/ContosoLiveChatApp.csproj b/HandoverToLiveAgent/ContosoLiveChatApp/ContosoLiveChatApp.csproj index 1b28a01c..6568b3dc 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/ContosoLiveChatApp.csproj +++ b/HandoverToLiveAgent/ContosoLiveChatApp/ContosoLiveChatApp.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs index 09215f7d..db9a98f4 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs +++ b/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs @@ -56,18 +56,18 @@ public async Task SendMessage([FromBody] SendMessageRequest reques } } - // POST: api/chat/receive - Receive a message (from remote party) + // POST: api/chat/receive - Receive a message (from Copilot Studio ) [HttpPost("receive")] public ActionResult ReceiveMessage([FromBody] ReceiveMessageRequest request) { - if (string.IsNullOrWhiteSpace(request.Text)) + if (string.IsNullOrWhiteSpace(request.Message)) { return BadRequest(new { error = "Message text cannot be empty" }); } var message = new ChatMessage { - Text = request.Text, + Text = request.Message, Sender = request.Sender ?? "Remote", Direction = MessageDirection.Incoming, Timestamp = DateTime.UtcNow @@ -87,6 +87,6 @@ public class SendMessageRequest public class ReceiveMessageRequest { - public string Text { get; set; } = string.Empty; + public string Message { get; set; } = string.Empty; public string? Sender { get; set; } } diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Program.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Program.cs index 235ce4d1..c79f7939 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/Program.cs +++ b/HandoverToLiveAgent/ContosoLiveChatApp/Program.cs @@ -16,12 +16,12 @@ // Validate webhook configuration var webhookUrl = app.Configuration["WebhookSettings:OutgoingWebhookUrl"]; -if (string.IsNullOrWhiteSpace(webhookUrl) || webhookUrl == "https://your-webhook-endpoint.com/api/messages") -{ - throw new InvalidOperationException( - "Invalid webhook configuration. Please set a valid 'WebhookSettings:OutgoingWebhookUrl' in appsettings.json. " + - "The default placeholder value 'https://your-webhook-endpoint.com/api/messages' is not allowed."); -} +// if (string.IsNullOrWhiteSpace(webhookUrl) || webhookUrl == "https://your-webhook-endpoint.com/api/messages") +// { +// throw new InvalidOperationException( +// "Invalid webhook configuration. Please set a valid 'WebhookSettings:OutgoingWebhookUrl' in appsettings.json. " + +// "The default placeholder value 'https://your-webhook-endpoint.com/api/messages' is not allowed."); +// } app.Logger.LogInformation("Webhook URL configured: {WebhookUrl}", webhookUrl); diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/appsettings.json b/HandoverToLiveAgent/ContosoLiveChatApp/appsettings.json index dc479f92..4bd1dc96 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/appsettings.json +++ b/HandoverToLiveAgent/ContosoLiveChatApp/appsettings.json @@ -7,6 +7,6 @@ }, "AllowedHosts": "*", "WebhookSettings": { - "OutgoingWebhookUrl": "https://your-webhook-endpoint.com/api/messages" + "OutgoingWebhookUrl": "http://localhost:5001/api/livechatwebhook/message" } } diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html b/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html index 54452ea3..42c86310 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html +++ b/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html @@ -180,7 +180,7 @@ // Disable send button initially sendButton.disabled = true; messageInput.disabled = true; - messageInput.placeholder = ""; + messageInput.placeholder = "Waiting for first message..."; // Load messages on page load loadMessages(); @@ -219,7 +219,7 @@ return; } - // Check if there's any incoming message + // Check if there's any incoming message and enable input const hasIncoming = messages.some(msg => msg.direction === 1); if (hasIncoming && !hasReceivedMessage) { hasReceivedMessage = true; @@ -284,7 +284,7 @@ console.error('Error sending message:', error); showError('Failed to send message. Please try again.'); } finally { - // Re-enable input only if we've received a message + // Re-enable input if we have received a message if (hasReceivedMessage) { sendButton.disabled = false; messageInput.disabled = false; diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs new file mode 100644 index 00000000..b59d07d8 --- /dev/null +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs @@ -0,0 +1,72 @@ +using Microsoft.Agents.Builder; +using Microsoft.Agents.Builder.App; +using Microsoft.Agents.Builder.State; +using Microsoft.Agents.Core.Models; +using HandoverToLiveAgent.LiveChat; + +namespace HandoverToLiveAgent.CopilotStudio; + +// NOTE: Avoid injecting scoped services directly because the Agents SDK registers the agent as a singleton. +// We instead create a scope per turn to resolve required scoped dependencies. +public class CopilotStudioAgent : AgentApplication +{ + private readonly ILogger _logger; + private readonly IServiceScopeFactory _scopeFactory; + + public CopilotStudioAgent(AgentApplicationOptions options, ILogger logger, IServiceScopeFactory scopeFactory) : base(options) + { + _logger = logger; + _scopeFactory = scopeFactory; + + OnActivity(ActivityTypes.Message, OnMessageAsync); + OnActivity(ActivityTypes.Event, OnEventAsync); + } + + private async Task OnEventAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken ct) + { + _logger.LogInformation("Copilot event received: {EventName}", turnContext.Activity.Name); + using var scope = _scopeFactory.CreateScope(); + var liveChatService = scope.ServiceProvider.GetRequiredService(); + + if (turnContext.Activity.Name == "endOfConversation") + { + _logger.LogInformation("EndOfConversation event received. Performing any necessary cleanup."); + await liveChatService.SendMessageAsync(message: "The conversation ended by user.", sender: "System"); + //sending EndOfConversation activity back to Copilot Studio + await turnContext.SendActivityAsync(new Activity + { + Type = ActivityTypes.EndOfConversation, + Name = "endOfConversation", + Text = string.Empty, + Code = EndOfConversationCodes.CompletedSuccessfully + }, ct); + await turnState.Conversation.DeleteStateAsync(turnContext, ct); + _logger.LogInformation("Conversation ended and state cleared."); + } + else + { + _logger.LogError("Unhandled event type: {EventName}", turnContext.Activity.Name); + throw new NotImplementedException($"Event '{turnContext.Activity.Name}' not implemented."); + } + await Task.CompletedTask; + } + + private async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken ct) + { + _logger.LogInformation("Copilot message received: {Message}", turnContext.Activity.Text); + var conversationId = turnContext.Activity.Conversation?.Id ?? "unknown-conversatioin-id"; + var userName = turnContext.Activity.From?.Name ?? "unknown-user"; + var message = turnContext.Activity.Text ?? string.Empty; + + using var scope = _scopeFactory.CreateScope(); + var liveChatService = scope.ServiceProvider.GetRequiredService(); + if (turnContext.Activity.ChannelId != "msteams") + { + _logger.LogError("Unsupported channel ID for proactive messages: {ChannelId}", turnContext.Activity.ChannelId); + return; + } + + await liveChatService.SendMessageAsync(message, userName); + _logger.LogInformation("Message sent to live chat"); + } +} \ No newline at end of file diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/SkillController.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/SkillController.cs new file mode 100644 index 00000000..de0466ee --- /dev/null +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/SkillController.cs @@ -0,0 +1,15 @@ +using Microsoft.AspNetCore.Mvc; + +namespace HandoverToLiveAgent.CopilotStudio; + +[ApiController] +[Route("api/skill")] +public class SkillController : ControllerBase +{ + private readonly ILogger _logger; + + public SkillController(ILogger logger) + { + _logger = logger; + } +} \ No newline at end of file diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/HandoverToLiveAgentSample.csproj b/HandoverToLiveAgent/HandoverToLiveAgentSample/HandoverToLiveAgentSample.csproj new file mode 100644 index 00000000..650136a3 --- /dev/null +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/HandoverToLiveAgentSample.csproj @@ -0,0 +1,17 @@ + + + + net9.0 + enable + enable + + + + + + + + + + + diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatService.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatService.cs new file mode 100644 index 00000000..5adf1134 --- /dev/null +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatService.cs @@ -0,0 +1,117 @@ + + +using System.Text; +using System.Text.Json; + +namespace HandoverToLiveAgent.LiveChat; + +public interface ILiveChatService +{ + Task StartConversationAsync(); + Task SendMessageAsync(string message, string sender); +} + +public class LiveChatService : ILiveChatService +{ + private readonly HttpClient _httpClient; + private readonly IConfiguration _configuration; + private readonly ILogger _logger; + + public LiveChatService(HttpClient httpClient, IConfiguration configuration, ILogger logger) + { + _httpClient = httpClient; + _configuration = configuration; + _logger = logger; + } + + public async Task StartConversationAsync() + { + try + { + var baseUrl = _configuration["LiveChatSettings:BaseUrl"]; + if (string.IsNullOrEmpty(baseUrl)) + { + _logger.LogWarning("BaseUrl is not configured in LiveChatSettings"); + return null; + } + + var conversationUrl = $"{baseUrl}/api/chat/conversation"; + _logger.LogInformation("Starting a new live chat conversation at {Url}", conversationUrl); + + var response = await _httpClient.PostAsync(conversationUrl, null); + + if (response.IsSuccessStatusCode) + { + var responseContent = await response.Content.ReadAsStringAsync(); + var result = JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }); + + _logger.LogInformation("Conversation started successfully with session ID: {SessionId}", result?.SessionId); + return result?.SessionId; + } + else + { + _logger.LogWarning("Failed to start conversation. Status: {StatusCode}", response.StatusCode); + return null; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Error starting conversation"); + return null; + } + } + + public async Task SendMessageAsync(string message, string sender) + { + try + { + var baseUrl = _configuration["LiveChatSettings:BaseUrl"]; + if (string.IsNullOrEmpty(baseUrl)) + { + _logger.LogWarning("BaseUrl is not configured in LiveChatSettings"); + return false; + } + + var sendMessageUrl = $"{baseUrl}/api/chat/receive"; + _logger.LogInformation("Sending message to {Url}: {Message}", sendMessageUrl, message); + + var payload = new + { + message, + sender + }; + + var json = JsonSerializer.Serialize(payload); + var content = new StringContent(json, Encoding.UTF8, "application/json"); + + //Sending message to the Live Chat endpoint. The response message response will + //come back over a webhook configured in the Live Chat system. + var response = await _httpClient.PostAsync(sendMessageUrl, content); + + if (response.IsSuccessStatusCode) + { + _logger.LogInformation("Message sent successfully"); + return true; + } + else + { + _logger.LogWarning("Failed to send message. Status: {StatusCode}", response.StatusCode); + return false; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Error sending message"); + return false; + } + } +} + +public class ConversationResponse +{ + public Guid SessionId { get; set; } + public string Message { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs new file mode 100644 index 00000000..db09352f --- /dev/null +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs @@ -0,0 +1,40 @@ +using Microsoft.AspNetCore.Mvc; + +namespace HandoverToLiveAgent.LiveChat; + +[ApiController] +[Route("api/[controller]")] +public class LiveChatWebhookController : ControllerBase +{ + private readonly ILogger _logger; + + public LiveChatWebhookController(ILogger logger) + { + _logger = logger; + } + + // POST: api/messages + // Used to receive webhook messages from the Live Chat system + [HttpPost] + public ActionResult ReceiveMessage([FromBody] MessageRequest request) + { + _logger.LogDebug("Full message details: {@Request}", request); + + throw new NotImplementedException("Processing incoming live chat messages is not implemented yet."); + + return Ok(new + { + message = "Message received successfully", + timestamp = DateTime.UtcNow, + receivedFrom = request.Sender + }); + } +} + +public class MessageRequest +{ + public string Id { get; set; } = string.Empty; + public string Text { get; set; } = string.Empty; + public string Sender { get; set; } = string.Empty; + public DateTime Timestamp { get; set; } +} diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs new file mode 100644 index 00000000..0f4dfd0c --- /dev/null +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs @@ -0,0 +1,72 @@ +using Microsoft.Agents.Builder; +using Microsoft.Agents.CopilotStudio.Client; +using Microsoft.Agents.Hosting.AspNetCore; +using Microsoft.Extensions.Options; +using HandoverToLiveAgent.LiveChat; +using Microsoft.Agents.CopilotStudio; + +var builder = WebApplication.CreateBuilder(args); + +// Configure to host on port 5001 +builder.WebHost.ConfigureKestrel(serverOptions => +{ + serverOptions.ListenAnyIP(5001); +}); + +builder.Services.AddScoped(); +builder.Services.AddControllers(); +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddHttpClient(); + +// Add services to the container. +//builder.Services.AddControllers(); +//builder.Services.AddHttpClient(); + + +// Agents SDK setup +builder.Services.AddHttpClient(); +builder.AddAgentApplicationOptions(); +builder.AddAgent(); +// Agents storage for conversation state +builder.Services.AddSingleton(); +// Ensure AgentApplicationOptions is available for AgentApplication-based skills +builder.Services.AddSingleton(); + +// CORS +// builder.Services.AddCors(options => +// { +// options.AddDefaultPolicy(policy => +// { +// policy.AllowAnyOrigin() +// .AllowAnyMethod() +// .AllowAnyHeader(); +// }); +// }); + +var app = builder.Build(); + +// Only enforce HTTPS when an HTTPS binding is configured (avoid warnings when running HTTP-only locally) +var hasHttpsBinding = + !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("HTTPS_PORTS")) || + !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ASPNETCORE_HTTPS_PORT")) || + builder.Configuration.GetSection("Kestrel:Endpoints:Https").Exists(); + +if (!app.Environment.IsDevelopment() && hasHttpsBinding) +{ + app.UseHttpsRedirection(); +} + +// app.UseCors(); +app.UseStaticFiles(); +// app.UseRouting(); +// Bot middleware is configured via the Bot Adapter, not ASP.NET pipeline. None registered here for local run. +// app.UseAuthorization(); +app.MapControllers(); + +// Agents endpoint: /api/messages for incoming messages and activities from Copilot Studio skills +var incomingRoute = app.MapPost("/api/messages", async (HttpRequest request, + HttpResponse response, IAgentHttpAdapter adapter, IAgent agent, CancellationToken ct) => +{ + await adapter.ProcessAsync(request, response, agent, ct); +}); +app.Run(); diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.Development.json b/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.Development.json new file mode 100644 index 00000000..76373f39 --- /dev/null +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.Development.json @@ -0,0 +1,11 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "LiveChatSettings": { + "BaseUrl": "http://localhost:5000" + } +} diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.json b/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.json new file mode 100644 index 00000000..4a9076d1 --- /dev/null +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.json @@ -0,0 +1,12 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "LiveChatSettings": { + "BaseUrl": "http://localhost:5000" + } +} diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json b/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json new file mode 100644 index 00000000..3641781d --- /dev/null +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json @@ -0,0 +1,54 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/skills/skill-manifest-2.0.0.json", + "$id": "handoff-skill", + "name": "Handoff Skill", + "version": "1.0.0", + "description": "Handoff skill for Copilot Studio sample", + "publisherName": "Microsoft", + "copyright": "Copyright (c) Microsoft. All rights reserved.", + "license": "", + "tags": [ + "handoff" + ], + "endpoints": [ + { + "name": "default", + "protocol": "BotFrameworkV3", + "description": "Default endpoint for the Handoff Skill", + "endpointUrl": "https://td7k9vbg-5001.euw.devtunnels.ms/api/messages", + "msAppId": "dd48c5ae-fa3d-4bfd-a747-734b5279f470" + } + ], + "activities": { + "sendMessage": { + "type": "message", + "description": "Sends a message to the Contoso Live Chat", + "value": { + "$ref": "#/definitions/messageInput" + } + }, + "endOfConversation": { + "name": "endOfConversation", + "type": "event", + "description": "End a conversation with the Contoso Live Chat", + "value": { + "$ref": "#/definitions/endOfConversationInput" + } + } + }, + "definitions": { + "messageInput": { + "type": "object", + "properties": { + "ProblemDescription": { + "type": "string" + } + } + }, + "endOfConversationInput": { + "type": "object", + "properties": { + } + } + } +} \ No newline at end of file diff --git a/HandoverToLiveAgent/README.md b/HandoverToLiveAgent/README.md new file mode 100644 index 00000000..28bab5e9 --- /dev/null +++ b/HandoverToLiveAgent/README.md @@ -0,0 +1,6 @@ + +```shell +devtunnel create contoso --allow-anonymous +devtunnel port create contoso -p 5001 +devtunnel host contoso +``` \ No newline at end of file From 2b916c6b5645675f0b1ae44acd32b76ff7715b66 Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Mon, 3 Nov 2025 13:24:35 +0100 Subject: [PATCH 03/17] Refactor message handling in ChatController and WebhookService; improve error handling and UI feedback for failed messages --- .../Controllers/ChatController.cs | 13 +- .../Services/WebhookService.cs | 11 +- .../ContosoLiveChatApp/wwwroot/index.html | 128 ++++++++++++++++-- .../LiveChat/LiveChatWebhookController.cs | 17 ++- 4 files changed, 137 insertions(+), 32 deletions(-) diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs index db9a98f4..7ba6cac0 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs +++ b/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs @@ -40,19 +40,18 @@ public async Task SendMessage([FromBody] SendMessageRequest reques Timestamp = DateTime.UtcNow }; - // Add to chat history - _chatService.AddMessage(message); - - // Send to webhook - var success = await _webhookService.SendMessageAsync(message); + // Send to webhook first + var (statusCode, errorMessage) = await _webhookService.SendMessageAsync(message); - if (success) + if (statusCode.HasValue && statusCode >= 200 && statusCode < 300) { + // Only add to chat history if webhook send was successful + _chatService.AddMessage(message); return Ok(new { message = "Message sent successfully", messageId = message.Id }); } else { - return StatusCode(500, new { error = "Failed to send message to webhook" }); + return StatusCode(statusCode ?? 500, new { error = errorMessage }); } } diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Services/WebhookService.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Services/WebhookService.cs index 96e1a3e1..d26748ce 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/Services/WebhookService.cs +++ b/HandoverToLiveAgent/ContosoLiveChatApp/Services/WebhookService.cs @@ -14,7 +14,7 @@ public WebhookService(HttpClient httpClient, IConfiguration configuration, ILogg _logger = logger; } - public async Task SendMessageAsync(ChatMessage message) + public async Task> SendMessageAsync(ChatMessage message) { try { @@ -23,7 +23,7 @@ public async Task SendMessageAsync(ChatMessage message) if (string.IsNullOrEmpty(webhookUrl)) { _logger.LogWarning("Webhook URL is not configured"); - return false; + return new Tuple(null, "Webhook URL is not configured"); } var json = JsonSerializer.Serialize(message); @@ -34,18 +34,19 @@ public async Task SendMessageAsync(ChatMessage message) if (response.IsSuccessStatusCode) { _logger.LogInformation("Message sent successfully to webhook: {MessageId}", message.Id); - return true; + return new Tuple((int)response.StatusCode, null); } else { _logger.LogWarning("Failed to send message to webhook. Status: {StatusCode}", response.StatusCode); - return false; + var errorMessage = await response.Content.ReadAsStringAsync(); + return new Tuple((int)response.StatusCode, errorMessage); } } catch (Exception ex) { _logger.LogError(ex, "Error sending message to webhook"); - return false; + return new Tuple(null, ex.Message); } } } diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html b/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html index 42c86310..528db107 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html +++ b/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html @@ -86,6 +86,12 @@ border-bottom-right-radius: 4px; } + .message.outgoing.failed .message-bubble { + background: #d32f2f; + color: white; + border-bottom-right-radius: 4px; + } + .message.incoming .message-bubble { background: #e4e6eb; color: #050505; @@ -176,6 +182,8 @@ const messageInput = document.getElementById('messageInput'); const sendButton = document.getElementById('sendButton'); let hasReceivedMessage = false; + let lastMessageCount = 0; + let failedMessagesMap = new Map(); // Store failed messages with timestamps // Disable send button initially sendButton.disabled = true; @@ -215,7 +223,9 @@ function displayMessages(messages) { if (messages.length === 0) { - chatHistory.innerHTML = '
No messages yet. Waiting for first incoming message...
'; + if (lastMessageCount === 0) { + chatHistory.innerHTML = '
No messages yet. Waiting for first incoming message...
'; + } return; } @@ -228,30 +238,80 @@ messageInput.placeholder = "Type your message..."; } - chatHistory.innerHTML = ''; - messages.forEach(message => { + // Remove expired failed messages (older than 5 seconds) + const now = Date.now(); + for (let [id, data] of failedMessagesMap.entries()) { + if (now - data.timestamp > 5000) { + failedMessagesMap.delete(id); + } + } + + // Only update if message count changed or there are failed messages to show + if (messages.length === lastMessageCount && failedMessagesMap.size === 0) { + return; + } + + const shouldScroll = chatHistory.scrollTop + chatHistory.clientHeight >= chatHistory.scrollHeight - 30; + + if (messages.length < lastMessageCount) { // Messages were cleared or reloaded + chatHistory.innerHTML = ''; + } + lastMessageCount = messages.length; + + // Remove existing failed messages from DOM to re-add them at the end + document.querySelectorAll('.message.failed').forEach(el => el.remove()); + + const existingMessages = chatHistory.querySelectorAll('.message:not(.failed)'); + + messages.forEach((message, index) => { + if (index >= existingMessages.length) { + const messageDiv = document.createElement('div'); + messageDiv.className = `message ${message.direction === 0 ? 'outgoing' : 'incoming'}`; + + const bubble = document.createElement('div'); + bubble.className = 'message-bubble'; + + const text = document.createElement('div'); + text.textContent = message.text; + + const info = document.createElement('div'); + info.className = 'message-info'; + const time = new Date(message.timestamp).toLocaleTimeString(); + info.textContent = `${message.sender} • ${time}`; + + bubble.appendChild(text); + bubble.appendChild(info); + messageDiv.appendChild(bubble); + chatHistory.appendChild(messageDiv); + } + }); + + // Re-add failed messages at the end + failedMessagesMap.forEach((data, id) => { const messageDiv = document.createElement('div'); - messageDiv.className = `message ${message.direction === 0 ? 'outgoing' : 'incoming'}`; + messageDiv.className = 'message outgoing failed'; + messageDiv.dataset.failedId = id; const bubble = document.createElement('div'); bubble.className = 'message-bubble'; - const text = document.createElement('div'); - text.textContent = message.text; + const messageText = document.createElement('div'); + messageText.textContent = data.text; const info = document.createElement('div'); info.className = 'message-info'; - const time = new Date(message.timestamp).toLocaleTimeString(); - info.textContent = `${message.sender} • ${time}`; + info.textContent = `Failed: ${data.error}`; - bubble.appendChild(text); + bubble.appendChild(messageText); bubble.appendChild(info); messageDiv.appendChild(bubble); chatHistory.appendChild(messageDiv); }); - // Scroll to bottom - chatHistory.scrollTop = chatHistory.scrollHeight; + // Scroll to bottom only if user was already at the bottom + if (shouldScroll) { + chatHistory.scrollTop = chatHistory.scrollHeight; + } } async function sendMessage() { @@ -272,17 +332,32 @@ }); if (!response.ok) { - throw new Error('Failed to send message'); + const errorData = await response.json().catch(() => ({})); + const errorMessage = errorData.error || 'Failed to send message'; + throw new Error(errorMessage); } - // Clear input + // Clear input only on success messageInput.value = ''; - // Reload messages + // Reload messages to display the sent message await loadMessages(); } catch (error) { console.error('Error sending message:', error); - showError('Failed to send message. Please try again.'); + + // Add failed message to map with timestamp + const failedId = Date.now().toString(); + failedMessagesMap.set(failedId, { + text: text, + error: error.message || 'Failed to send message', + timestamp: Date.now() + }); + + // Clear input after showing failed message + messageInput.value = ''; + + // Trigger immediate display update + await loadMessages(); } finally { // Re-enable input if we have received a message if (hasReceivedMessage) { @@ -293,6 +368,29 @@ } } + function addFailedMessage(text, errorMessage) { + const messageDiv = document.createElement('div'); + messageDiv.className = 'message outgoing failed'; + + const bubble = document.createElement('div'); + bubble.className = 'message-bubble'; + + const messageText = document.createElement('div'); + messageText.textContent = text; + + const info = document.createElement('div'); + info.className = 'message-info'; + info.textContent = `Failed: ${errorMessage}`; + + bubble.appendChild(messageText); + bubble.appendChild(info); + messageDiv.appendChild(bubble); + chatHistory.appendChild(messageDiv); + + // Scroll to bottom + chatHistory.scrollTop = chatHistory.scrollHeight; + } + function showError(message) { const errorDiv = document.createElement('div'); errorDiv.className = 'error'; diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs index db09352f..4445f5df 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs @@ -3,7 +3,7 @@ namespace HandoverToLiveAgent.LiveChat; [ApiController] -[Route("api/[controller]")] +[Route("api/livechat")] public class LiveChatWebhookController : ControllerBase { private readonly ILogger _logger; @@ -13,14 +13,21 @@ public LiveChatWebhookController(ILogger logger) _logger = logger; } - // POST: api/messages + // POST: api/livechat/messages // Used to receive webhook messages from the Live Chat system - [HttpPost] + [HttpPost("messages")] public ActionResult ReceiveMessage([FromBody] MessageRequest request) { _logger.LogDebug("Full message details: {@Request}", request); - - throw new NotImplementedException("Processing incoming live chat messages is not implemented yet."); + try + { + throw new NotImplementedException("Processing incoming live chat messages is not implemented yet."); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error processing live chat message"); + return StatusCode(500, ex.Message); + } return Ok(new { From 014dcb70f3182b710fa7b37363a6b82475d73b4b Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Mon, 3 Nov 2025 13:26:27 +0100 Subject: [PATCH 04/17] Update OutgoingWebhookUrl in appsettings.json to correct endpoint for live chat messages --- HandoverToLiveAgent/ContosoLiveChatApp/appsettings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/appsettings.json b/HandoverToLiveAgent/ContosoLiveChatApp/appsettings.json index 4bd1dc96..22c4e051 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/appsettings.json +++ b/HandoverToLiveAgent/ContosoLiveChatApp/appsettings.json @@ -7,6 +7,6 @@ }, "AllowedHosts": "*", "WebhookSettings": { - "OutgoingWebhookUrl": "http://localhost:5001/api/livechatwebhook/message" + "OutgoingWebhookUrl": "http://localhost:5001/api/livechat/messages" } } From 59c1296691c64364fe6c2b18dd11d28e7267ad80 Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Mon, 3 Nov 2025 13:37:19 +0100 Subject: [PATCH 05/17] Remove development appsettings.json file for live chat configuration --- .../appsettings.Development.json | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.Development.json diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.Development.json b/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.Development.json deleted file mode 100644 index 76373f39..00000000 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.Development.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "LiveChatSettings": { - "BaseUrl": "http://localhost:5000" - } -} From 41ff0f10ab0bcb7a327da352a7bd54a162649e94 Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Tue, 4 Nov 2025 11:21:47 +0100 Subject: [PATCH 06/17] Implement conversation management and proactive messaging for live chat integration --- .../CopilotStudio/ConversationManager.cs | 194 ++++++++++++++++++ .../CopilotStudio/CopilotStudioAgent.cs | 29 +++ .../CopilotStudio/MsTeamsProactiveMesssage.cs | 107 ++++++++++ .../LiveChat/LiveChatWebhookController.cs | 22 +- .../HandoverToLiveAgentSample/Program.cs | 5 +- 5 files changed, 353 insertions(+), 4 deletions(-) create mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/ConversationManager.cs create mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/MsTeamsProactiveMesssage.cs diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/ConversationManager.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/ConversationManager.cs new file mode 100644 index 00000000..343dd512 --- /dev/null +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/ConversationManager.cs @@ -0,0 +1,194 @@ + +using System.Data; +using Microsoft.Agents.Core.Models; + +namespace HandoverToLiveAgent.CopilotStudio; + +public class ProactiveConversation +{ + public string ConversationId { get; set; } = string.Empty; + public string UserId { get; set; } = string.Empty; + public string? ChannelId { get; set; } + public string? ServiceUrl { get; set; } + public string? BotId { get; set; } + public string? BotName { get; set; } +} + +public class CopilotStudioConversationMapping +{ + public string ConversationId { get; set; } = string.Empty; + public string UserId { get; set; } = string.Empty; + public ProactiveConversation ProactiveConversation { get; set; } = new(); +} + + +public interface IConversationManager +{ + Task UpsertProactiveConversation(string copilotConversationId, IActivity activity); + Task UpdateServiceUrlMapping(CopilotStudioConversationMapping mapping, IActivity activity); + Task TEST_GetCConversationId(string liveChatConversationId); + public static CopilotStudioConversationMapping? Mapping1 { get; set; } = null; +} + +public class ConversationManager : IConversationManager +{ + private readonly ILogger _logger; + private readonly IConfiguration _config; + public ConversationManager(IConfiguration config, ILogger logger) + { + _config = config; + _logger = logger; + } + + public Task TEST_GetCConversationId(string liveChatConversationId){ + return Task.FromResult(Guid.Empty.ToString()); + } + + public Task UpsertProactiveConversation(string copilotConversationId, IActivity activity) + { + var cref = new ProactiveConversation + { + ConversationId = copilotConversationId + }; + + var userId = activity.From?.Id ?? "unknown-user"; + var serviceUrl = !string.IsNullOrWhiteSpace(activity.ServiceUrl) + ? activity.ServiceUrl + : activity.RelatesTo?.ServiceUrl; + + var region = ResolveSmbaRegion(serviceUrl); + var tenantId = ResolveTenantId(); + if (string.IsNullOrWhiteSpace(cref.UserId) && !string.IsNullOrWhiteSpace(userId)) cref.UserId = userId; + if (string.IsNullOrWhiteSpace(cref.ChannelId) && !string.IsNullOrWhiteSpace(activity.ChannelId)) cref.ChannelId = activity.ChannelId; + if (string.IsNullOrWhiteSpace(cref.ServiceUrl)) + { + var su = serviceUrl; + // If Teams channel is reporting a PVA runtime URL, prefer SMBA for proactive continuation + if (!string.IsNullOrWhiteSpace(su) + && string.Equals(activity.ChannelId, "msteams", StringComparison.OrdinalIgnoreCase) + && su.Contains("pvaruntime", StringComparison.OrdinalIgnoreCase) + && !su.Contains("smba.trafficmanager.net", StringComparison.OrdinalIgnoreCase)) + { + var smba = !string.IsNullOrWhiteSpace(tenantId) + ? $"https://smba.trafficmanager.net/{region}/{tenantId}/" + : "https://smba.trafficmanager.net/teams/"; + _logger.LogInformation("[Proactive][RefCapture] Overriding PVA ServiceUrl to SMBA for Teams channel. From={From} To={To} ConvId={ConversationId}", su, smba, cref.ConversationId); + su = smba; + } + if (!string.IsNullOrWhiteSpace(su)) cref.ServiceUrl = su; + } + if (string.IsNullOrWhiteSpace(cref.BotId) && !string.IsNullOrWhiteSpace(activity.Recipient?.Id)) cref.BotId = activity.Recipient!.Id; + if (string.IsNullOrWhiteSpace(cref.BotName) && !string.IsNullOrWhiteSpace(activity.Recipient?.Name)) cref.BotName = activity.Recipient!.Name; + + //_cache.Set(key, cref, TimeSpan.FromHours(24)); + //TODO + if(IConversationManager.Mapping1 == null) + { + IConversationManager.Mapping1 = new CopilotStudioConversationMapping + { + ConversationId = copilotConversationId, + UserId = userId, + ProactiveConversation = cref + }; + } + else + { + IConversationManager.Mapping1.ConversationId = copilotConversationId; + IConversationManager.Mapping1.UserId = userId; + IConversationManager.Mapping1.ProactiveConversation = cref; + } + // + return Task.CompletedTask; + } + + public async Task UpdateServiceUrlMapping(CopilotStudioConversationMapping mapping, IActivity activity) + { + if (mapping?.ProactiveConversation is { } cref) + { + var region = ResolveSmbaRegion(activity.ServiceUrl); + var tenantId = ResolveTenantId(); + bool changed = false; + if (string.IsNullOrEmpty(cref.ChannelId) && activity.ChannelId is { } channelId) + { + cref.ChannelId = channelId; + changed = true; + } + if (string.IsNullOrEmpty(cref.ServiceUrl)) + { + string? su = null; + // 1. Primary: Activity.ServiceUrl + if (!string.IsNullOrWhiteSpace(activity.ServiceUrl)) + { + su = activity.ServiceUrl; + _logger.LogDebug("[Proactive][RefCapture] Captured ServiceUrl from Activity.ServiceUrl={ServiceUrl} ConvId={ConversationId}", su, cref.ConversationId); + } + // 2. Secondary: RelatesTo.ServiceUrl (some adapters populate here on skill replies) + else if (!string.IsNullOrWhiteSpace(activity.RelatesTo?.ServiceUrl)) + { + su = activity.RelatesTo.ServiceUrl; + _logger.LogInformation("[Proactive][RefCapture] Using RelatesTo.ServiceUrl={ServiceUrl} ConvId={ConversationId}", su, cref.ConversationId); + } + // Teams-specific: if PVA runtime URL appears for Teams channel, prefer SMBA + if (!string.IsNullOrWhiteSpace(su) + && string.Equals(activity.ChannelId, "msteams", StringComparison.OrdinalIgnoreCase) + && su.Contains("pvaruntime", StringComparison.OrdinalIgnoreCase) + && !su.Contains("smba.trafficmanager.net", StringComparison.OrdinalIgnoreCase)) + { + var smba = !string.IsNullOrWhiteSpace(tenantId) + ? $"https://smba.trafficmanager.net/{region}/{tenantId}/" + : "https://smba.trafficmanager.net/teams/"; + _logger.LogInformation("[Proactive][RefCapture] Overriding PVA ServiceUrl to SMBA for Teams channel. From={From} To={To} ConvId={ConversationId}", su, smba, cref.ConversationId); + su = smba; + } + // 3. Fallback: Static Teams global endpoint (only if still unknown) + if (string.IsNullOrWhiteSpace(su)) + { + su = "https://smba.trafficmanager.net/teams/"; // safe generic; real continuation normally needs exact host instance + _logger.LogInformation("[Proactive][RefCapture] ServiceUrl absent; applying generic fallback {ServiceUrl} ConvId={ConversationId}", su, cref.ConversationId); + } + cref.ServiceUrl = su; + changed = true; + } + if (string.IsNullOrEmpty(cref.BotId) && activity.Recipient?.Id is { } bid) + { + cref.BotId = bid; + changed = true; + } + if (string.IsNullOrEmpty(cref.BotName) && activity.Recipient?.Name is { } bname) + { + cref.BotName = bname; + changed = true; + } + //TODO + if (changed) + { + if (IConversationManager.Mapping1 != null) + { + IConversationManager.Mapping1.ProactiveConversation = cref; + //await UpdateMapping(mapping); + } + else + { + IConversationManager.Mapping1 = mapping; + } + } + } + return; + } + + private string ResolveSmbaRegion(string? url) + { + if (string.IsNullOrWhiteSpace(url)) return "amer"; + var u = url.ToLowerInvariant(); + if (u.Contains("-us") || u.Contains(".us-")) return "amer"; + if (u.Contains("-eu") || u.Contains(".eu-") || u.Contains(".uk")) return "emea"; + if (u.Contains("-ap") || u.Contains(".ap-") || u.Contains("asia") || u.Contains("-jp")) return "apac"; + return "amer"; + } + + private string? ResolveTenantId() + { + var tid = _config["Connections:default:Settings:TenantId"]; + return string.IsNullOrWhiteSpace(tid) ? null : tid; + } +} \ No newline at end of file diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs index b59d07d8..1cce97e8 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs @@ -12,11 +12,13 @@ public class CopilotStudioAgent : AgentApplication { private readonly ILogger _logger; private readonly IServiceScopeFactory _scopeFactory; + private readonly IConversationManager _conversationManager; public CopilotStudioAgent(AgentApplicationOptions options, ILogger logger, IServiceScopeFactory scopeFactory) : base(options) { _logger = logger; _scopeFactory = scopeFactory; + OnActivity(ActivityTypes.Message, OnMessageAsync); OnActivity(ActivityTypes.Event, OnEventAsync); @@ -27,6 +29,7 @@ private async Task OnEventAsync(ITurnContext turnContext, ITurnState turnState, _logger.LogInformation("Copilot event received: {EventName}", turnContext.Activity.Name); using var scope = _scopeFactory.CreateScope(); var liveChatService = scope.ServiceProvider.GetRequiredService(); + if (turnContext.Activity.Name == "endOfConversation") { @@ -60,12 +63,38 @@ private async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState using var scope = _scopeFactory.CreateScope(); var liveChatService = scope.ServiceProvider.GetRequiredService(); + var conversationManager = scope.ServiceProvider.GetRequiredService(); + + if (turnContext.Activity.ChannelId != "msteams") { _logger.LogError("Unsupported channel ID for proactive messages: {ChannelId}", turnContext.Activity.ChannelId); return; } + /// Proactive message setup + await conversationManager.UpsertProactiveConversation(conversationId, turnContext.Activity); + var testId = await conversationManager.TEST_GetCConversationId(conversationId); + + //var mapping = await conversationManager.GetMappingByCopilotConversationId(conversationId); + + if (IConversationManager.Mapping1 == null) + { + + _logger.LogError("NO MAPPING FOUND!"); + throw new Exception("No mapping found!"); + } + + // if (mapping == null) + // { + // _logger.LogWarning("No mapping found for Copilot conversation ID: {ConversationId}", conversationId); + // //todo we should support userId from both sides so we can support more than as single live conversation + // var mapping = conversationManager.CreateMappingForConversationId(conversationId, testId); + + // conversationManager.UpdateMapping(mapping); + // } + ///---end proactive message setup + await liveChatService.SendMessageAsync(message, userName); _logger.LogInformation("Message sent to live chat"); } diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/MsTeamsProactiveMesssage.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/MsTeamsProactiveMesssage.cs new file mode 100644 index 00000000..4f48a11a --- /dev/null +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/MsTeamsProactiveMesssage.cs @@ -0,0 +1,107 @@ +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Microsoft.Agents.Builder; +using Microsoft.Agents.Core.Models; +using ChannelAccount = Microsoft.Agents.Core.Models.ChannelAccount; +using ConversationAccount = Microsoft.Agents.Core.Models.ConversationAccount; + + +namespace HandoverToLiveAgent.CopilotStudio; + +public interface IProactiveMessenger +{ + Task SendTextAsync(ProactiveConversation reference, string message, string? userName = null, CancellationToken ct = default); +} + +public class MsTeamsProactiveMessage : IProactiveMessenger +{ + private readonly ILogger _logger; + private readonly IChannelAdapter? _channelAdapter; + private readonly IConfiguration? _configuration; + + public MsTeamsProactiveMessage(ILogger logger, + IServiceProvider serviceProvider) + { + _logger = logger; + _channelAdapter = serviceProvider.GetService(typeof(IChannelAdapter)) as IChannelAdapter; + _configuration = serviceProvider.GetService(typeof(IConfiguration)) as IConfiguration; + } + + public async Task SendTextAsync(ProactiveConversation reference, string message, string? userName = null, CancellationToken ct = default) + { + if (_channelAdapter == null) + { + _logger.LogWarning("Channel adapter is not available. Cannot send proactive message."); + return; + } + + var effectiveServiceUrl = reference.ServiceUrl!; + var channelId = reference.ChannelId; + + var appId = ResolveAppIdForServiceUrl(effectiveServiceUrl); + if (appId == null) + { + _logger.LogWarning("Could not resolve App ID for service URL: {ServiceUrl}", effectiveServiceUrl); + return; + } + + if (!string.Equals(channelId, "msteams", StringComparison.OrdinalIgnoreCase) + && effectiveServiceUrl.Contains("smba.trafficmanager.net", StringComparison.OrdinalIgnoreCase)) + { + _logger.LogWarning("Non-Teams channel with SMBA ServiceUrl. Using as-is. Conv={ConversationId} Ch={ChannelId} ServiceUrl={ServiceUrl}", reference.ConversationId, channelId, effectiveServiceUrl); + } + _logger.LogInformation("Sending proactive message to Teams user: {UserName}, Conv={ConversationId} Ch={ChannelId} ServiceUrl={ServiceUrl}", userName, reference.ConversationId, channelId, effectiveServiceUrl); + + try + { + //TODO + var sdkRef = new Microsoft.Agents.Core.Models.ConversationReference + { + Agent = new ChannelAccount { Id = reference.BotId }, + ChannelId = channelId!, + ServiceUrl = effectiveServiceUrl, + Conversation = new ConversationAccount { Id = reference.ConversationId } + }; + await _channelAdapter.ContinueConversationAsync( + appId, + sdkRef, + async (turnContext, token) => + { + await turnContext.SendActivityAsync(message, cancellationToken: token); + }, + ct); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error sending proactive message to Teams user: {UserName}", reference.ConversationId); + throw; + } + + } + + private string? ResolveAppIdForServiceUrl(string serviceUrl) + { + if (_configuration is null) return null; + var map = _configuration.GetSection("ConnectionsMap"); + if (!map.Exists()) return null; + foreach (var entry in map.GetChildren()) + { + var pattern = entry.GetValue("ServiceUrl"); + var connectionName = entry.GetValue("Connection"); + if (string.IsNullOrWhiteSpace(pattern) || string.IsNullOrWhiteSpace(connectionName)) continue; + if (WildcardMatch(serviceUrl, pattern)) + { + var conn = _configuration.GetSection("Connections").GetSection(connectionName); + var clientId = conn.GetSection("Settings").GetValue("ClientId"); + if (!string.IsNullOrWhiteSpace(clientId)) return clientId; + } + } + return null; + } + + private bool WildcardMatch(string text, string pattern) + { + var regex = "^" + Regex.Escape(pattern).Replace("\\*", ".*") + "$"; + return Regex.IsMatch(text, regex, RegexOptions.IgnoreCase); + } +} diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs index 4445f5df..33d36130 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Mvc; +using HandoverToLiveAgent.CopilotStudio; namespace HandoverToLiveAgent.LiveChat; @@ -7,21 +8,36 @@ namespace HandoverToLiveAgent.LiveChat; public class LiveChatWebhookController : ControllerBase { private readonly ILogger _logger; + private readonly IConversationManager _conversationManager; + private readonly IProactiveMessenger _proactiveMessenger; - public LiveChatWebhookController(ILogger logger) + public LiveChatWebhookController(ILogger logger, IConversationManager conversationManager, IProactiveMessenger proactiveMessenger) { _logger = logger; + _conversationManager = conversationManager; + _proactiveMessenger = proactiveMessenger; } // POST: api/livechat/messages // Used to receive webhook messages from the Live Chat system [HttpPost("messages")] - public ActionResult ReceiveMessage([FromBody] MessageRequest request) + public async Task ReceiveMessageAsync([FromBody] MessageRequest request) { _logger.LogDebug("Full message details: {@Request}", request); try { - throw new NotImplementedException("Processing incoming live chat messages is not implemented yet."); + + //contoso conv id? + var contosoUserName = request.Sender; + var contosoMessage = request.Text; + _logger.LogInformation("Received message from Live Chat. Sender: {Sender}, Text: {Text}", contosoUserName, contosoMessage); + + // Find corresponding Copilot Studio conversation + //var mapping = await _conversationManager.GetMappingByZendeskConversationId(zendeskConversationId); + var testid = _conversationManager.TEST_GetCConversationId(request.Id); //get contoso sessions id? + await _proactiveMessenger.SendTextAsync(IConversationManager.Mapping1!.ProactiveConversation, contosoMessage, contosoUserName); + _logger.LogInformation("Proactive message sent to Copilot Studio for user: {UserName}", contosoUserName); + } catch (Exception ex) { diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs index 0f4dfd0c..0070f4ab 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.Options; using HandoverToLiveAgent.LiveChat; using Microsoft.Agents.CopilotStudio; +using HandoverToLiveAgent.CopilotStudio; var builder = WebApplication.CreateBuilder(args); @@ -20,7 +21,9 @@ // Add services to the container. //builder.Services.AddControllers(); -//builder.Services.AddHttpClient(); +//builder.Services.AddHttpClient(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); // Agents SDK setup From 9a5ff18009c60fc98f7fd005c3be411dc8cae3f8 Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Tue, 4 Nov 2025 11:29:06 +0100 Subject: [PATCH 07/17] Refactor IConversationManager to change UpdateServiceUrlMapping method from Task to void; remove unused conversation manager field in CopilotStudioAgent --- .../CopilotStudio/ConversationManager.cs | 5 ++--- .../CopilotStudio/CopilotStudioAgent.cs | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/ConversationManager.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/ConversationManager.cs index 343dd512..65c191a6 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/ConversationManager.cs +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/ConversationManager.cs @@ -25,7 +25,7 @@ public class CopilotStudioConversationMapping public interface IConversationManager { Task UpsertProactiveConversation(string copilotConversationId, IActivity activity); - Task UpdateServiceUrlMapping(CopilotStudioConversationMapping mapping, IActivity activity); + void UpdateServiceUrlMapping(CopilotStudioConversationMapping mapping, IActivity activity); Task TEST_GetCConversationId(string liveChatConversationId); public static CopilotStudioConversationMapping? Mapping1 { get; set; } = null; } @@ -101,7 +101,7 @@ public Task UpsertProactiveConversation(string copilotConversationId, IActivity return Task.CompletedTask; } - public async Task UpdateServiceUrlMapping(CopilotStudioConversationMapping mapping, IActivity activity) + public void UpdateServiceUrlMapping(CopilotStudioConversationMapping mapping, IActivity activity) { if (mapping?.ProactiveConversation is { } cref) { @@ -173,7 +173,6 @@ public async Task UpdateServiceUrlMapping(CopilotStudioConversationMapping mappi } } } - return; } private string ResolveSmbaRegion(string? url) diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs index 1cce97e8..3abd608e 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs @@ -12,7 +12,6 @@ public class CopilotStudioAgent : AgentApplication { private readonly ILogger _logger; private readonly IServiceScopeFactory _scopeFactory; - private readonly IConversationManager _conversationManager; public CopilotStudioAgent(AgentApplicationOptions options, ILogger logger, IServiceScopeFactory scopeFactory) : base(options) { From 258f89d49e1ce3d927eace9f54247391b249f210 Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Tue, 4 Nov 2025 14:02:29 +0100 Subject: [PATCH 08/17] working v1 --- .../CopilotStudio/CopilotS2STokenHandler.cs | 42 +++++++++++++++++++ .../HandoverToLiveAgentSample/Program.cs | 15 ------- .../appsettings.json | 34 ++++++++++++++- 3 files changed, 74 insertions(+), 17 deletions(-) create mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotS2STokenHandler.cs diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotS2STokenHandler.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotS2STokenHandler.cs new file mode 100644 index 00000000..a73f256c --- /dev/null +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotS2STokenHandler.cs @@ -0,0 +1,42 @@ +// using System.Net.Http.Headers; +// using Microsoft.Agents.CopilotStudio.Client; +// using Microsoft.Extensions.Options; +// using Microsoft.Identity.Client; + +namespace HandoverToLiveAgent.CopilotStudio; + +// public class CopilotS2STokenHandler : DelegatingHandler +// { +// private readonly IConfidentialClientApplication _cca; +// private readonly string[] _scopes; + +// public CopilotS2STokenHandler(ConnectionSettings settings, IOptions m365Opts) +// { +// var o = m365Opts.Value; +// _scopes = [CopilotClient.ScopeFromSettings(settings)]; +// _cca = ConfidentialClientApplicationBuilder.Create(o.ClientId) +// .WithAuthority(AzureCloudInstance.AzurePublic, o.TenantId) +// .WithClientSecret(o.ClientSecret) +// .Build(); +// } + +// protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) +// { +// if (request.Headers.Authorization is null) +// { +// var result = await _cca.AcquireTokenForClient(_scopes).ExecuteAsync(cancellationToken); +// request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken); +// } +// return await base.SendAsync(request, cancellationToken); +// } +// } + +// public class M365AgentOptions +// { +// public string TenantId { get; set; } = string.Empty; +// public string ClientId { get; set; } = string.Empty; +// public string ClientSecret { get; set; } = string.Empty; +// public string EnvironmentId { get; set; } = string.Empty; +// public string BotId { get; set; } = string.Empty; +// public string Scope { get; set; } = "https://graph.microsoft.com/.default"; +// } diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs index 0070f4ab..9dd66162 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs @@ -8,7 +8,6 @@ var builder = WebApplication.CreateBuilder(args); -// Configure to host on port 5001 builder.WebHost.ConfigureKestrel(serverOptions => { serverOptions.ListenAnyIP(5001); @@ -20,12 +19,9 @@ builder.Services.AddHttpClient(); // Add services to the container. -//builder.Services.AddControllers(); -//builder.Services.AddHttpClient(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); - // Agents SDK setup builder.Services.AddHttpClient(); builder.AddAgentApplicationOptions(); @@ -35,17 +31,6 @@ // Ensure AgentApplicationOptions is available for AgentApplication-based skills builder.Services.AddSingleton(); -// CORS -// builder.Services.AddCors(options => -// { -// options.AddDefaultPolicy(policy => -// { -// policy.AllowAnyOrigin() -// .AllowAnyMethod() -// .AllowAnyHeader(); -// }); -// }); - var app = builder.Build(); // Only enforce HTTPS when an HTTPS binding is configured (avoid warnings when running HTTP-only locally) diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.json b/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.json index 4a9076d1..8fedd7b4 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.json +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.json @@ -7,6 +7,36 @@ }, "AllowedHosts": "*", "LiveChatSettings": { + // The base URL of your Live Chat web service "BaseUrl": "http://localhost:5000" - } -} + }, + "Connections": { + // credential used to authenticate and send proactive messages and messages back to MCS from skill code (CopilotStudioAgent class) + "CopilotStudioBot": { + "ConnectionType": "AzureAD", + "Settings": { + // Your Tenant ID + "TenantId": "00000000-0000-0000-0000-000000000000", + // Your Agent Bot's App ID (Same as Service Principal ID) + "ClientId": "00000000-0000-0000-0000-000000000000", + // Your Agent Bot's Client Secret + "ClientSecret": "", + "Scopes": [ + "https://api.botframework.com/.default" + ] + } + } + }, + "ConnectionsMap": [ + { + // SMBA runtime URL pattern to handle proactive messages to MS Teams + "ServiceUrl": "https://smba*", + "Connection": "CopilotStudioBot" + }, + { + // PVA runtime URL pattern to handle non-proactive messages back to MCS + "ServiceUrl": "https://pvaruntime*", + "Connection": "CopilotStudioBot" + } + ] +} \ No newline at end of file From eef05db8fbba5d219cf81a6e6bb7755a0258065e Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Wed, 5 Nov 2025 15:13:02 +0100 Subject: [PATCH 09/17] Refactor chat management by introducing ChatStorageService for conversation handling; update ChatController and LiveChatService for new conversation flow; enhance frontend to display conversation ID and manage chat state. --- .../Controllers/ChatController.cs | 81 +++++++++++++------ .../ContosoLiveChatApp/Models/ChatMessage.cs | 12 +-- .../ContosoLiveChatApp/Program.cs | 13 +-- .../Services/ChatService.cs | 21 ----- .../Services/ChatStorageService.cs | 58 +++++++++++++ .../Services/WebhookService.cs | 2 +- .../ContosoLiveChatApp/wwwroot/index.html | 65 +++++++++++++-- .../CopilotStudio/CopilotS2STokenHandler.cs | 42 ---------- .../CopilotStudio/MsTeamsProactiveMesssage.cs | 31 +++---- .../CopilotStudio/SkillController.cs | 15 ---- .../LiveChat/LiveChatService.cs | 62 +++++++++++--- .../LiveChat/LiveChatWebhookController.cs | 20 +++-- .../HandoverToLiveAgentSample/Program.cs | 7 +- .../wwwroot/skill-manifest.json | 30 ++++++- 14 files changed, 285 insertions(+), 174 deletions(-) delete mode 100644 HandoverToLiveAgent/ContosoLiveChatApp/Services/ChatService.cs create mode 100644 HandoverToLiveAgent/ContosoLiveChatApp/Services/ChatStorageService.cs delete mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotS2STokenHandler.cs delete mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/SkillController.cs diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs index 7ba6cac0..8f04d81d 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs +++ b/HandoverToLiveAgent/ContosoLiveChatApp/Controllers/ChatController.cs @@ -1,42 +1,81 @@ +using System.Runtime.ExceptionServices; +using System.Security; using Microsoft.AspNetCore.Mvc; [ApiController] [Route("api/[controller]")] public class ChatController : ControllerBase { - private readonly ChatService _chatService; + private readonly ChatStorageService _chatStorage; private readonly WebhookService _webhookService; private readonly ILogger _logger; - public ChatController(ChatService chatService, WebhookService webhookService, ILogger logger) + public ChatController(ChatStorageService chatStorage, WebhookService webhookService, ILogger logger) { - _chatService = chatService; + _chatStorage = chatStorage; _webhookService = webhookService; _logger = logger; } // GET: api/chat/messages - Get all chat messages [HttpGet("messages")] - public ActionResult> GetMessages() + public ActionResult> GetMessages(string? conversationId = null) { - var messages = _chatService.GetAllMessages(); + var messages = _chatStorage.GetAllMessages(conversationId); return Ok(messages); } - // POST: api/chat/send - Send a message (from user to webhook) + // POST: api/chat/start - Start a new conversation and return conversation ID + [HttpPost("start")] + public ActionResult StartConversation() + { + try + { + var conversationId = Guid.NewGuid().ToString()[..5]; + _logger.LogInformation("Started new conversation with ID: {ConversationId}", conversationId); + + _chatStorage.StartConversation(conversationId); + + return Ok(new { conversationId }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error starting conversation"); + return StatusCode(500, new { error = ex.Message }); + } + } + + // POST: api/chat/end - End a conversation + [HttpPost("end")] + public ActionResult EndConversation([FromBody] MessageRequest request) + { + try + { + _logger.LogInformation("Ending conversation with ID: {ConversationId}", request.ConversationId); + _chatStorage.EndConversation(request.ConversationId); + return Ok(new { message = "Conversation ended successfully" }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error ending conversation"); + return StatusCode(500, new { error = ex.Message }); + } + } + + // POST: api/chat/send - Send a message (from Live Chat to Copilot Studio webhook) [HttpPost("send")] - public async Task SendMessage([FromBody] SendMessageRequest request) + public async Task SendMessage([FromBody] MessageRequest request) { - if (string.IsNullOrWhiteSpace(request.Text)) + if (string.IsNullOrWhiteSpace(request.Message)) { return BadRequest(new { error = "Message text cannot be empty" }); } var message = new ChatMessage { - Text = request.Text, + ConversationId = request.ConversationId, + Message = request.Message, Sender = "Contoso Support", - Direction = MessageDirection.Outgoing, Timestamp = DateTime.UtcNow }; @@ -46,8 +85,8 @@ public async Task SendMessage([FromBody] SendMessageRequest reques if (statusCode.HasValue && statusCode >= 200 && statusCode < 300) { // Only add to chat history if webhook send was successful - _chatService.AddMessage(message); - return Ok(new { message = "Message sent successfully", messageId = message.Id }); + _chatStorage.AddMessage(message.ConversationId, message); + return Ok(new { message = "Message sent successfully", messageId = message.Id, timestamp = message.Timestamp, sender = message.Sender, conversationId = message.ConversationId }); } else { @@ -57,7 +96,7 @@ public async Task SendMessage([FromBody] SendMessageRequest reques // POST: api/chat/receive - Receive a message (from Copilot Studio ) [HttpPost("receive")] - public ActionResult ReceiveMessage([FromBody] ReceiveMessageRequest request) + public ActionResult ReceiveMessage([FromBody] MessageRequest request) { if (string.IsNullOrWhiteSpace(request.Message)) { @@ -66,26 +105,22 @@ public ActionResult ReceiveMessage([FromBody] ReceiveMessageRequest request) var message = new ChatMessage { - Text = request.Message, + ConversationId = request.ConversationId, + Message = request.Message, Sender = request.Sender ?? "Remote", - Direction = MessageDirection.Incoming, Timestamp = DateTime.UtcNow }; - _chatService.AddMessage(message); - _logger.LogInformation("Received message from {Sender}: {Text}", message.Sender, message.Text); + _chatStorage.AddMessage(message.ConversationId, message); + _logger.LogInformation("Received message from {Sender}: {Text}", message.Sender, message.Message); return Ok(new { message = "Message received successfully", messageId = message.Id }); } } -public class SendMessageRequest -{ - public string Text { get; set; } = string.Empty; -} - -public class ReceiveMessageRequest +public class MessageRequest { + public string ConversationId { get; set; } = string.Empty; public string Message { get; set; } = string.Empty; public string? Sender { get; set; } } diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Models/ChatMessage.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Models/ChatMessage.cs index 81782221..420ee507 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/Models/ChatMessage.cs +++ b/HandoverToLiveAgent/ContosoLiveChatApp/Models/ChatMessage.cs @@ -1,14 +1,8 @@ public class ChatMessage { + public string ConversationId { get; set; } = string.Empty; public string Id { get; set; } = Guid.NewGuid().ToString(); - public string Text { get; set; } = string.Empty; + public string Message { get; set; } = string.Empty; public string Sender { get; set; } = string.Empty; public DateTime Timestamp { get; set; } = DateTime.UtcNow; - public MessageDirection Direction { get; set; } -} - -public enum MessageDirection -{ - Outgoing, - Incoming -} +} \ No newline at end of file diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Program.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Program.cs index c79f7939..a9a40256 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/Program.cs +++ b/HandoverToLiveAgent/ContosoLiveChatApp/Program.cs @@ -1,31 +1,20 @@ var builder = WebApplication.CreateBuilder(args); -// Configure to host on port 5000 builder.WebHost.ConfigureKestrel(serverOptions => { serverOptions.ListenAnyIP(5000); }); -// Add services to the container. builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); -builder.Services.AddSingleton(); +builder.Services.AddSingleton(); builder.Services.AddHttpClient(); var app = builder.Build(); -// Validate webhook configuration var webhookUrl = app.Configuration["WebhookSettings:OutgoingWebhookUrl"]; -// if (string.IsNullOrWhiteSpace(webhookUrl) || webhookUrl == "https://your-webhook-endpoint.com/api/messages") -// { -// throw new InvalidOperationException( -// "Invalid webhook configuration. Please set a valid 'WebhookSettings:OutgoingWebhookUrl' in appsettings.json. " + -// "The default placeholder value 'https://your-webhook-endpoint.com/api/messages' is not allowed."); -// } - app.Logger.LogInformation("Webhook URL configured: {WebhookUrl}", webhookUrl); -// Configure the HTTP request pipeline. app.UseDefaultFiles(); app.UseStaticFiles(); app.UseRouting(); diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Services/ChatService.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Services/ChatService.cs deleted file mode 100644 index e3deea4a..00000000 --- a/HandoverToLiveAgent/ContosoLiveChatApp/Services/ChatService.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Concurrent; - -public class ChatService -{ - private readonly ConcurrentBag _messages = new(); - - public void AddMessage(ChatMessage message) - { - _messages.Add(message); - } - - public IEnumerable GetAllMessages() - { - return _messages.OrderBy(m => m.Timestamp); - } - - public ChatMessage? GetMessageById(string id) - { - return _messages.FirstOrDefault(m => m.Id == id); - } -} diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Services/ChatStorageService.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Services/ChatStorageService.cs new file mode 100644 index 00000000..789c8ad2 --- /dev/null +++ b/HandoverToLiveAgent/ContosoLiveChatApp/Services/ChatStorageService.cs @@ -0,0 +1,58 @@ +using System.Collections.Concurrent; + +public class ChatStorageService +{ + private readonly ConcurrentDictionary> _activeConversations = new(); + private readonly ILogger _logger; + + public ChatStorageService(ILogger logger) + { + _logger = logger; + } + + public void AddMessage(string conversationId, ChatMessage message) + { + _logger.LogInformation("Adding message to conversation ID: {ConversationId}", conversationId); + if (_activeConversations.TryGetValue(conversationId, out var messages)) + { + messages.Add(message); + } + else + { + _logger.LogWarning("No active conversation found with ID: {ConversationId}", conversationId); + } + } + + public void StartConversation(string conversationId) + { + _activeConversations[conversationId] = new List(); + _logger.LogInformation("Started conversation with ID: {ConversationId}", conversationId); + } + + public void EndConversation(string conversationId) + { + _activeConversations.TryRemove(conversationId, out _); + _logger.LogInformation("Ended conversation with ID: {ConversationId}", conversationId); + } + + public IEnumerable GetAllMessages(string? conversationId) + { + if (string.IsNullOrEmpty(conversationId)) + { + return _activeConversations.Values + .SelectMany(messages => messages) + .OrderBy(m => m.Timestamp); + } + + _logger.LogInformation("Retrieving messages for conversation ID: {ConversationId}", conversationId); + if (_activeConversations.TryGetValue(conversationId, out var messages)) + { + return messages.OrderBy(m => m.Timestamp); + } + else + { + _logger.LogWarning("No active conversation found with ID: {ConversationId}", conversationId); + return Enumerable.Empty(); + } + } +} diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/Services/WebhookService.cs b/HandoverToLiveAgent/ContosoLiveChatApp/Services/WebhookService.cs index d26748ce..bc9af236 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/Services/WebhookService.cs +++ b/HandoverToLiveAgent/ContosoLiveChatApp/Services/WebhookService.cs @@ -34,7 +34,7 @@ public WebhookService(HttpClient httpClient, IConfiguration configuration, ILogg if (response.IsSuccessStatusCode) { _logger.LogInformation("Message sent successfully to webhook: {MessageId}", message.Id); - return new Tuple((int)response.StatusCode, null); + return new Tuple((int)response.StatusCode, string.Empty); } else { diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html b/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html index 528db107..90762e44 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html +++ b/HandoverToLiveAgent/ContosoLiveChatApp/wwwroot/index.html @@ -39,6 +39,18 @@ border-radius: 12px 12px 0 0; font-size: 20px; font-weight: 600; + display: flex; + justify-content: space-between; + align-items: center; + } + + .conversation-id { + font-size: 12px; + opacity: 0.8; + font-weight: 400; + background: rgba(255, 255, 255, 0.2); + padding: 4px 8px; + border-radius: 4px; } .chat-history { @@ -166,7 +178,8 @@
- Contoso Live Chat + Contoso Live Chat + No conversation
Loading messages...
@@ -181,9 +194,12 @@ const chatHistory = document.getElementById('chatHistory'); const messageInput = document.getElementById('messageInput'); const sendButton = document.getElementById('sendButton'); + const conversationIdElement = document.getElementById('conversationId'); + let chatMessage = '
No messages yet. Waiting for first incoming message...
'; let hasReceivedMessage = false; let lastMessageCount = 0; let failedMessagesMap = new Map(); // Store failed messages with timestamps + let currentConversationId = null; // Disable send button initially sendButton.disabled = true; @@ -214,7 +230,14 @@ } const messages = await response.json(); + displayMessages(messages); + + // Check if current conversation has ended (no messages for this conversation ID) + if (currentConversationId && messages.length === 0) { + // Conversation has ended, reset UI + resetConversation(); + } } catch (error) { console.error('Error loading messages:', error); showError('Failed to load messages. Please refresh the page.'); @@ -224,13 +247,19 @@ function displayMessages(messages) { if (messages.length === 0) { if (lastMessageCount === 0) { - chatHistory.innerHTML = '
No messages yet. Waiting for first incoming message...
'; + chatHistory.innerHTML = chatMessage; } return; } - // Check if there's any incoming message and enable input - const hasIncoming = messages.some(msg => msg.direction === 1); + // Extract conversation ID from the first message and update display + if (messages.length > 0 && !currentConversationId) { + currentConversationId = messages[0].conversationId; + conversationIdElement.textContent = `ID: ${currentConversationId}`; + } + + // Check if there's any incoming message (from Remote sender) and enable input + const hasIncoming = messages.some(msg => msg.sender !== "Contoso Support"); if (hasIncoming && !hasReceivedMessage) { hasReceivedMessage = true; sendButton.disabled = false; @@ -266,13 +295,14 @@ messages.forEach((message, index) => { if (index >= existingMessages.length) { const messageDiv = document.createElement('div'); - messageDiv.className = `message ${message.direction === 0 ? 'outgoing' : 'incoming'}`; + // Outgoing if from Contoso Support, incoming if from others + messageDiv.className = `message ${message.sender === "Contoso Support" ? 'outgoing' : 'incoming'}`; const bubble = document.createElement('div'); bubble.className = 'message-bubble'; const text = document.createElement('div'); - text.textContent = message.text; + text.textContent = message.message; const info = document.createElement('div'); info.className = 'message-info'; @@ -316,7 +346,7 @@ async function sendMessage() { const text = messageInput.value.trim(); - if (!text || !hasReceivedMessage) return; + if (!text || !hasReceivedMessage || !currentConversationId) return; // Disable input while sending sendButton.disabled = true; @@ -328,7 +358,10 @@ headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ text }) + body: JSON.stringify({ + message: text, + conversationId: currentConversationId + }) }); if (!response.ok) { @@ -391,6 +424,22 @@ chatHistory.scrollTop = chatHistory.scrollHeight; } + function resetConversation() { + // Reset conversation state + currentConversationId = null; + conversationIdElement.textContent = 'No conversation'; + + // Disable input + sendButton.disabled = true; + messageInput.disabled = true; + messageInput.placeholder = "Waiting for first message..."; + hasReceivedMessage = false; + lastMessageCount = 0; + failedMessagesMap.clear(); + chatMessage = '
User has ended the conversation. Waiting for new conversation...
'; + chatHistory.innerHTML = chatMessage; + } + function showError(message) { const errorDiv = document.createElement('div'); errorDiv.className = 'error'; diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotS2STokenHandler.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotS2STokenHandler.cs deleted file mode 100644 index a73f256c..00000000 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotS2STokenHandler.cs +++ /dev/null @@ -1,42 +0,0 @@ -// using System.Net.Http.Headers; -// using Microsoft.Agents.CopilotStudio.Client; -// using Microsoft.Extensions.Options; -// using Microsoft.Identity.Client; - -namespace HandoverToLiveAgent.CopilotStudio; - -// public class CopilotS2STokenHandler : DelegatingHandler -// { -// private readonly IConfidentialClientApplication _cca; -// private readonly string[] _scopes; - -// public CopilotS2STokenHandler(ConnectionSettings settings, IOptions m365Opts) -// { -// var o = m365Opts.Value; -// _scopes = [CopilotClient.ScopeFromSettings(settings)]; -// _cca = ConfidentialClientApplicationBuilder.Create(o.ClientId) -// .WithAuthority(AzureCloudInstance.AzurePublic, o.TenantId) -// .WithClientSecret(o.ClientSecret) -// .Build(); -// } - -// protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) -// { -// if (request.Headers.Authorization is null) -// { -// var result = await _cca.AcquireTokenForClient(_scopes).ExecuteAsync(cancellationToken); -// request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken); -// } -// return await base.SendAsync(request, cancellationToken); -// } -// } - -// public class M365AgentOptions -// { -// public string TenantId { get; set; } = string.Empty; -// public string ClientId { get; set; } = string.Empty; -// public string ClientSecret { get; set; } = string.Empty; -// public string EnvironmentId { get; set; } = string.Empty; -// public string BotId { get; set; } = string.Empty; -// public string Scope { get; set; } = "https://graph.microsoft.com/.default"; -// } diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/MsTeamsProactiveMesssage.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/MsTeamsProactiveMesssage.cs index 4f48a11a..c86001e9 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/MsTeamsProactiveMesssage.cs +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/MsTeamsProactiveMesssage.cs @@ -34,7 +34,7 @@ public async Task SendTextAsync(ProactiveConversation reference, string message, _logger.LogWarning("Channel adapter is not available. Cannot send proactive message."); return; } - + var effectiveServiceUrl = reference.ServiceUrl!; var channelId = reference.ChannelId; @@ -44,36 +44,37 @@ public async Task SendTextAsync(ProactiveConversation reference, string message, _logger.LogWarning("Could not resolve App ID for service URL: {ServiceUrl}", effectiveServiceUrl); return; } - + if (!string.Equals(channelId, "msteams", StringComparison.OrdinalIgnoreCase) && effectiveServiceUrl.Contains("smba.trafficmanager.net", StringComparison.OrdinalIgnoreCase)) { - _logger.LogWarning("Non-Teams channel with SMBA ServiceUrl. Using as-is. Conv={ConversationId} Ch={ChannelId} ServiceUrl={ServiceUrl}", reference.ConversationId, channelId, effectiveServiceUrl); + _logger.LogWarning("Non-Teams channel with SMBA ServiceUrl. Using as-is. Conv={ConversationId} Ch={ChannelId} ServiceUrl={ServiceUrl}", reference.CopilotConversationId, channelId, effectiveServiceUrl); } - _logger.LogInformation("Sending proactive message to Teams user: {UserName}, Conv={ConversationId} Ch={ChannelId} ServiceUrl={ServiceUrl}", userName, reference.ConversationId, channelId, effectiveServiceUrl); + _logger.LogInformation("Sending proactive message to Teams user: {UserName}, Conv={ConversationId} Ch={ChannelId} ServiceUrl={ServiceUrl}", userName, reference.CopilotConversationId, channelId, effectiveServiceUrl); try { - //TODO - var sdkRef = new Microsoft.Agents.Core.Models.ConversationReference + var sdkRef = new ConversationReference { Agent = new ChannelAccount { Id = reference.BotId }, ChannelId = channelId!, ServiceUrl = effectiveServiceUrl, - Conversation = new ConversationAccount { Id = reference.ConversationId } + Conversation = new ConversationAccount { Id = reference.CopilotConversationId } }; await _channelAdapter.ContinueConversationAsync( - appId, - sdkRef, - async (turnContext, token) => - { - await turnContext.SendActivityAsync(message, cancellationToken: token); - }, - ct); + appId, + sdkRef, + async (turnContext, token) => + { + var msg = $"**{userName}**: {message}"; + _logger.LogInformation("Proactive message content: {Message}", msg); + await turnContext.SendActivityAsync(msg, cancellationToken: token); + }, + ct); } catch (Exception ex) { - _logger.LogError(ex, "Error sending proactive message to Teams user: {UserName}", reference.ConversationId); + _logger.LogError(ex, "Error sending proactive message to Teams user: {UserName}", reference.CopilotConversationId); throw; } diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/SkillController.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/SkillController.cs deleted file mode 100644 index de0466ee..00000000 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/SkillController.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Microsoft.AspNetCore.Mvc; - -namespace HandoverToLiveAgent.CopilotStudio; - -[ApiController] -[Route("api/skill")] -public class SkillController : ControllerBase -{ - private readonly ILogger _logger; - - public SkillController(ILogger logger) - { - _logger = logger; - } -} \ No newline at end of file diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatService.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatService.cs index 5adf1134..114df31c 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatService.cs +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatService.cs @@ -7,8 +7,9 @@ namespace HandoverToLiveAgent.LiveChat; public interface ILiveChatService { - Task StartConversationAsync(); - Task SendMessageAsync(string message, string sender); + Task StartConversationAsync(); + Task EndConversationAsync(string liveChatConversationId); + Task SendMessageAsync(string liveChatConversationId, string message, string sender); } public class LiveChatService : ILiveChatService @@ -24,18 +25,18 @@ public LiveChatService(HttpClient httpClient, IConfiguration configuration, ILog _logger = logger; } - public async Task StartConversationAsync() + public async Task StartConversationAsync() { try { var baseUrl = _configuration["LiveChatSettings:BaseUrl"]; if (string.IsNullOrEmpty(baseUrl)) { - _logger.LogWarning("BaseUrl is not configured in LiveChatSettings"); - return null; + _logger.LogError("BaseUrl is not configured in LiveChatSettings"); + throw new Exception("BaseUrl is not configured in LiveChatSettings"); } - var conversationUrl = $"{baseUrl}/api/chat/conversation"; + var conversationUrl = $"{baseUrl}/api/chat/start"; _logger.LogInformation("Starting a new live chat conversation at {Url}", conversationUrl); var response = await _httpClient.PostAsync(conversationUrl, null); @@ -48,8 +49,8 @@ public LiveChatService(HttpClient httpClient, IConfiguration configuration, ILog PropertyNameCaseInsensitive = true }); - _logger.LogInformation("Conversation started successfully with session ID: {SessionId}", result?.SessionId); - return result?.SessionId; + _logger.LogInformation("Conversation started successfully with conversation ID: {ConversationId}", result?.ConversationId); + return result?.ConversationId; } else { @@ -64,7 +65,46 @@ public LiveChatService(HttpClient httpClient, IConfiguration configuration, ILog } } - public async Task SendMessageAsync(string message, string sender) + public async Task EndConversationAsync(string liveChatConversationId) + { + try + { + var baseUrl = _configuration["LiveChatSettings:BaseUrl"]; + if (string.IsNullOrEmpty(baseUrl)) + { + _logger.LogError("BaseUrl is not configured in LiveChatSettings"); + throw new Exception("BaseUrl is not configured in LiveChatSettings"); + } + + var endConversationUrl = $"{baseUrl}/api/chat/end"; + _logger.LogInformation("Ending live chat conversation at {Url}", endConversationUrl); + + var payload = new + { + conversationId = liveChatConversationId + }; + + var json = JsonSerializer.Serialize(payload); + var content = new StringContent(json, Encoding.UTF8, "application/json"); + + var response = await _httpClient.PostAsync(endConversationUrl, content); + + if (response.IsSuccessStatusCode) + { + _logger.LogInformation("Conversation ended successfully for ID: {ConversationId}", liveChatConversationId); + } + else + { + _logger.LogWarning("Failed to end conversation. Status: {StatusCode}", response.StatusCode); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Error ending conversation"); + } + } + + public async Task SendMessageAsync(string liveChatConversationId, string message, string sender) { try { @@ -80,6 +120,7 @@ public async Task SendMessageAsync(string message, string sender) var payload = new { + conversationId = liveChatConversationId, message, sender }; @@ -112,6 +153,5 @@ public async Task SendMessageAsync(string message, string sender) public class ConversationResponse { - public Guid SessionId { get; set; } - public string Message { get; set; } = string.Empty; + public string? ConversationId { get; set; } } \ No newline at end of file diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs index 33d36130..e8b90a4f 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/LiveChat/LiveChatWebhookController.cs @@ -27,15 +27,19 @@ public async Task ReceiveMessageAsync([FromBody] MessageRequest re try { - //contoso conv id? var contosoUserName = request.Sender; - var contosoMessage = request.Text; + var contosoMessage = request.Message; + var liveChatConversationId = request.ConversationId; _logger.LogInformation("Received message from Live Chat. Sender: {Sender}, Text: {Text}", contosoUserName, contosoMessage); - // Find corresponding Copilot Studio conversation - //var mapping = await _conversationManager.GetMappingByZendeskConversationId(zendeskConversationId); - var testid = _conversationManager.TEST_GetCConversationId(request.Id); //get contoso sessions id? - await _proactiveMessenger.SendTextAsync(IConversationManager.Mapping1!.ProactiveConversation, contosoMessage, contosoUserName); + var mapping = await _conversationManager.GetMapping(liveChatConversationId); + if (mapping == null) + { + _logger.LogError("No mapping found for Live Chat conversation ID: {LiveChatConversationId}", liveChatConversationId); + throw new Exception("No mapping found for conversation. Make sure a Copilot Studio conversation has been started."); + } + // proactive messages are only supported in MS Teams channel + await _proactiveMessenger.SendTextAsync(mapping, contosoMessage, contosoUserName); _logger.LogInformation("Proactive message sent to Copilot Studio for user: {UserName}", contosoUserName); } @@ -56,8 +60,8 @@ public async Task ReceiveMessageAsync([FromBody] MessageRequest re public class MessageRequest { - public string Id { get; set; } = string.Empty; - public string Text { get; set; } = string.Empty; + public string ConversationId { get; set; } = string.Empty; + public string Message { get; set; } = string.Empty; public string Sender { get; set; } = string.Empty; public DateTime Timestamp { get; set; } } diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs index 9dd66162..02ec15fc 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/Program.cs @@ -23,7 +23,6 @@ builder.Services.AddSingleton(); // Agents SDK setup -builder.Services.AddHttpClient(); builder.AddAgentApplicationOptions(); builder.AddAgent(); // Agents storage for conversation state @@ -44,11 +43,9 @@ app.UseHttpsRedirection(); } -// app.UseCors(); app.UseStaticFiles(); -// app.UseRouting(); -// Bot middleware is configured via the Bot Adapter, not ASP.NET pipeline. None registered here for local run. -// app.UseAuthorization(); +app.UseDefaultFiles(); +app.UseRouting(); app.MapControllers(); // Agents endpoint: /api/messages for incoming messages and activities from Copilot Studio skills diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json b/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json index 3641781d..f9296923 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json @@ -27,12 +27,20 @@ "$ref": "#/definitions/messageInput" } }, - "endOfConversation": { - "name": "endOfConversation", + "endConversation": { + "name": "endConversation", "type": "event", "description": "End a conversation with the Contoso Live Chat", "value": { - "$ref": "#/definitions/endOfConversationInput" + "$ref": "#/definitions/endConversationInput" + } + }, + "startConversation": { + "name": "startConversation", + "type": "event", + "description": "Start a conversation with the Contoso Live Chat", + "resultValue": { + "$ref": "#/definitions/startConversationOutput" } } }, @@ -40,14 +48,28 @@ "messageInput": { "type": "object", "properties": { + "LiveChatConversationId": { + "type": "string" + }, "ProblemDescription": { "type": "string" } } }, - "endOfConversationInput": { + "endConversationInput": { + "type": "object", + "properties": { + "LiveChatConversationId": { + "type": "string" + } + } + }, + "startConversationOutput": { "type": "object", "properties": { + "LiveChatConversationId": { + "type": "string" + } } } } From 72741d6b7e1c932977e1240699527bb71a1207e4 Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Wed, 5 Nov 2025 15:21:01 +0100 Subject: [PATCH 10/17] Refactor conversation management: update IConversationManager and ConversationManager to support new mapping methods; modify CopilotStudioAgent and MsTeamsProactiveMessage to use ConversationMapping for proactive messaging. --- .../CopilotStudio/ConversationManager.cs | 202 +++++++----------- .../CopilotStudio/CopilotStudioAgent.cs | 79 ++++--- .../CopilotStudio/MsTeamsProactiveMesssage.cs | 4 +- 3 files changed, 125 insertions(+), 160 deletions(-) diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/ConversationManager.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/ConversationManager.cs index 65c191a6..911952a5 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/ConversationManager.cs +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/ConversationManager.cs @@ -4,51 +4,64 @@ namespace HandoverToLiveAgent.CopilotStudio; -public class ProactiveConversation -{ - public string ConversationId { get; set; } = string.Empty; - public string UserId { get; set; } = string.Empty; - public string? ChannelId { get; set; } - public string? ServiceUrl { get; set; } - public string? BotId { get; set; } - public string? BotName { get; set; } -} - -public class CopilotStudioConversationMapping -{ - public string ConversationId { get; set; } = string.Empty; - public string UserId { get; set; } = string.Empty; - public ProactiveConversation ProactiveConversation { get; set; } = new(); -} - - public interface IConversationManager { - Task UpsertProactiveConversation(string copilotConversationId, IActivity activity); - void UpdateServiceUrlMapping(CopilotStudioConversationMapping mapping, IActivity activity); - Task TEST_GetCConversationId(string liveChatConversationId); - public static CopilotStudioConversationMapping? Mapping1 { get; set; } = null; + Task GetMapping(string id); + Task UpsertMappingByCopilotConversationId(IActivity activity, string liveChatConversationId); + Task RemoveMappingByCopilotConversationId(string id); } public class ConversationManager : IConversationManager { private readonly ILogger _logger; private readonly IConfiguration _config; + private static readonly Dictionary _mappingsByCopilotId = new(); + private static readonly Dictionary _mappingsByLiveChatId = new(); public ConversationManager(IConfiguration config, ILogger logger) { _config = config; _logger = logger; } - public Task TEST_GetCConversationId(string liveChatConversationId){ - return Task.FromResult(Guid.Empty.ToString()); + public async Task GetMapping(string id) + { + _logger.LogInformation("Retrieving mapping for CopilotConversationId={CopilotConversationId}", id); + if (_mappingsByCopilotId.TryGetValue(id, out var mapping)) + { + return await Task.FromResult(mapping); + } + if (_mappingsByLiveChatId.TryGetValue(id, out mapping)) + { + return await Task.FromResult(mapping); + } + return await Task.FromResult(null); + } + + public Task RemoveMappingByCopilotConversationId(string id) + { + _logger.LogInformation("Removing mapping for CopilotConversationId={CopilotConversationId}", id); + _mappingsByCopilotId.Remove(id); + _mappingsByLiveChatId.Remove(id); + return Task.CompletedTask; + } + + public async Task UpsertMappingByCopilotConversationId(IActivity activity, string liveChatConversationId) + { + _logger.LogInformation("Storing mapping: CopilotConversationId={CopilotConversationId}, LiveChatConversationId={LiveChatConversationId}", activity.Conversation?.Id, liveChatConversationId); + + var mapping = await UpsertProactiveConversation(activity.Conversation!.Id, activity); + mapping!.LiveChatConversationId = liveChatConversationId; + _mappingsByCopilotId[activity.Conversation!.Id] = mapping; + _mappingsByLiveChatId[liveChatConversationId] = mapping; + + return mapping; } - public Task UpsertProactiveConversation(string copilotConversationId, IActivity activity) + private async Task UpsertProactiveConversation(string copilotConversationId, IActivity activity) { - var cref = new ProactiveConversation + var mapping = new ConversationMapping { - ConversationId = copilotConversationId + CopilotConversationId = copilotConversationId }; var userId = activity.From?.Id ?? "unknown-user"; @@ -58,9 +71,24 @@ public Task UpsertProactiveConversation(string copilotConversationId, IActivity var region = ResolveSmbaRegion(serviceUrl); var tenantId = ResolveTenantId(); - if (string.IsNullOrWhiteSpace(cref.UserId) && !string.IsNullOrWhiteSpace(userId)) cref.UserId = userId; - if (string.IsNullOrWhiteSpace(cref.ChannelId) && !string.IsNullOrWhiteSpace(activity.ChannelId)) cref.ChannelId = activity.ChannelId; - if (string.IsNullOrWhiteSpace(cref.ServiceUrl)) + + if (string.IsNullOrWhiteSpace(mapping.UserId) && !string.IsNullOrWhiteSpace(userId)) + { + mapping.UserId = userId; + } + if (string.IsNullOrWhiteSpace(mapping.ChannelId) && !string.IsNullOrWhiteSpace(activity.ChannelId)) + { + mapping.ChannelId = activity.ChannelId; + } + if (string.IsNullOrWhiteSpace(mapping.BotId) && !string.IsNullOrWhiteSpace(activity.Recipient?.Id)) + { + mapping.BotId = activity.Recipient!.Id; + } + if (string.IsNullOrWhiteSpace(mapping.BotName) && !string.IsNullOrWhiteSpace(activity.Recipient?.Name)) + { + mapping.BotName = activity.Recipient!.Name; + } + if (string.IsNullOrWhiteSpace(mapping.ServiceUrl)) { var su = serviceUrl; // If Teams channel is reporting a PVA runtime URL, prefer SMBA for proactive continuation @@ -72,107 +100,12 @@ public Task UpsertProactiveConversation(string copilotConversationId, IActivity var smba = !string.IsNullOrWhiteSpace(tenantId) ? $"https://smba.trafficmanager.net/{region}/{tenantId}/" : "https://smba.trafficmanager.net/teams/"; - _logger.LogInformation("[Proactive][RefCapture] Overriding PVA ServiceUrl to SMBA for Teams channel. From={From} To={To} ConvId={ConversationId}", su, smba, cref.ConversationId); + _logger.LogInformation("[Proactive][RefCapture] Overriding PVA ServiceUrl to SMBA for Teams channel. From={From} To={To} ConvId={ConversationId}", su, smba, mapping.CopilotConversationId); su = smba; } - if (!string.IsNullOrWhiteSpace(su)) cref.ServiceUrl = su; - } - if (string.IsNullOrWhiteSpace(cref.BotId) && !string.IsNullOrWhiteSpace(activity.Recipient?.Id)) cref.BotId = activity.Recipient!.Id; - if (string.IsNullOrWhiteSpace(cref.BotName) && !string.IsNullOrWhiteSpace(activity.Recipient?.Name)) cref.BotName = activity.Recipient!.Name; - - //_cache.Set(key, cref, TimeSpan.FromHours(24)); - //TODO - if(IConversationManager.Mapping1 == null) - { - IConversationManager.Mapping1 = new CopilotStudioConversationMapping - { - ConversationId = copilotConversationId, - UserId = userId, - ProactiveConversation = cref - }; - } - else - { - IConversationManager.Mapping1.ConversationId = copilotConversationId; - IConversationManager.Mapping1.UserId = userId; - IConversationManager.Mapping1.ProactiveConversation = cref; - } - // - return Task.CompletedTask; - } - - public void UpdateServiceUrlMapping(CopilotStudioConversationMapping mapping, IActivity activity) - { - if (mapping?.ProactiveConversation is { } cref) - { - var region = ResolveSmbaRegion(activity.ServiceUrl); - var tenantId = ResolveTenantId(); - bool changed = false; - if (string.IsNullOrEmpty(cref.ChannelId) && activity.ChannelId is { } channelId) - { - cref.ChannelId = channelId; - changed = true; - } - if (string.IsNullOrEmpty(cref.ServiceUrl)) - { - string? su = null; - // 1. Primary: Activity.ServiceUrl - if (!string.IsNullOrWhiteSpace(activity.ServiceUrl)) - { - su = activity.ServiceUrl; - _logger.LogDebug("[Proactive][RefCapture] Captured ServiceUrl from Activity.ServiceUrl={ServiceUrl} ConvId={ConversationId}", su, cref.ConversationId); - } - // 2. Secondary: RelatesTo.ServiceUrl (some adapters populate here on skill replies) - else if (!string.IsNullOrWhiteSpace(activity.RelatesTo?.ServiceUrl)) - { - su = activity.RelatesTo.ServiceUrl; - _logger.LogInformation("[Proactive][RefCapture] Using RelatesTo.ServiceUrl={ServiceUrl} ConvId={ConversationId}", su, cref.ConversationId); - } - // Teams-specific: if PVA runtime URL appears for Teams channel, prefer SMBA - if (!string.IsNullOrWhiteSpace(su) - && string.Equals(activity.ChannelId, "msteams", StringComparison.OrdinalIgnoreCase) - && su.Contains("pvaruntime", StringComparison.OrdinalIgnoreCase) - && !su.Contains("smba.trafficmanager.net", StringComparison.OrdinalIgnoreCase)) - { - var smba = !string.IsNullOrWhiteSpace(tenantId) - ? $"https://smba.trafficmanager.net/{region}/{tenantId}/" - : "https://smba.trafficmanager.net/teams/"; - _logger.LogInformation("[Proactive][RefCapture] Overriding PVA ServiceUrl to SMBA for Teams channel. From={From} To={To} ConvId={ConversationId}", su, smba, cref.ConversationId); - su = smba; - } - // 3. Fallback: Static Teams global endpoint (only if still unknown) - if (string.IsNullOrWhiteSpace(su)) - { - su = "https://smba.trafficmanager.net/teams/"; // safe generic; real continuation normally needs exact host instance - _logger.LogInformation("[Proactive][RefCapture] ServiceUrl absent; applying generic fallback {ServiceUrl} ConvId={ConversationId}", su, cref.ConversationId); - } - cref.ServiceUrl = su; - changed = true; - } - if (string.IsNullOrEmpty(cref.BotId) && activity.Recipient?.Id is { } bid) - { - cref.BotId = bid; - changed = true; - } - if (string.IsNullOrEmpty(cref.BotName) && activity.Recipient?.Name is { } bname) - { - cref.BotName = bname; - changed = true; - } - //TODO - if (changed) - { - if (IConversationManager.Mapping1 != null) - { - IConversationManager.Mapping1.ProactiveConversation = cref; - //await UpdateMapping(mapping); - } - else - { - IConversationManager.Mapping1 = mapping; - } - } + if (!string.IsNullOrWhiteSpace(su)) mapping.ServiceUrl = su; } + return await Task.FromResult(mapping); } private string ResolveSmbaRegion(string? url) @@ -190,4 +123,15 @@ private string ResolveSmbaRegion(string? url) var tid = _config["Connections:default:Settings:TenantId"]; return string.IsNullOrWhiteSpace(tid) ? null : tid; } -} \ No newline at end of file +} + +public class ConversationMapping +{ + public string CopilotConversationId { get; set; } = string.Empty; + public string LiveChatConversationId { get; set; } = string.Empty; + public string UserId { get; set; } = string.Empty; + public string? ChannelId { get; set; } + public string? ServiceUrl { get; set; } + public string? BotId { get; set; } + public string? BotName { get; set; } +} diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs index 3abd608e..7b7787de 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/CopilotStudioAgent.cs @@ -17,7 +17,7 @@ public CopilotStudioAgent(AgentApplicationOptions options, ILogger(); - + var conversationManager = scope.ServiceProvider.GetRequiredService(); - if (turnContext.Activity.Name == "endOfConversation") + if (turnContext.Activity.Name == "startConversation") + { + _logger.LogInformation("StartConversation event received. Initiating live chat conversation."); + var liveChatConversationId = await liveChatService.StartConversationAsync(); + if (string.IsNullOrEmpty(liveChatConversationId)) + { + _logger.LogError("Failed to start live chat conversation."); + throw new Exception("Failed to start live chat conversation."); + } + _logger.LogInformation("Live chat conversation started with ID: {LiveChatConversationId}", liveChatConversationId); + + // update mapping in ConversationManager with current activity state + await conversationManager.UpsertMappingByCopilotConversationId(turnContext.Activity, liveChatConversationId); + + //sending EndConversation activity back to Copilot Studio. Every activity must have a response to allow topical flow to complete. + await turnContext.SendActivityAsync(new Activity + { + Type = ActivityTypes.EndOfConversation, + Name = "startConversation", + Text = string.Empty, + Code = EndOfConversationCodes.CompletedSuccessfully, + Value = new + { + LiveChatConversationId = liveChatConversationId + } + }, ct); + } + else if (turnContext.Activity.Name == "endConversation") { _logger.LogInformation("EndOfConversation event received. Performing any necessary cleanup."); - await liveChatService.SendMessageAsync(message: "The conversation ended by user.", sender: "System"); - //sending EndOfConversation activity back to Copilot Studio + + //sending EndOfConversation activity back to Copilot Studio. Every activity must have a response to allow topical flow to complete. await turnContext.SendActivityAsync(new Activity { Type = ActivityTypes.EndOfConversation, - Name = "endOfConversation", + Name = "endConversation", Text = string.Empty, Code = EndOfConversationCodes.CompletedSuccessfully }, ct); + + var mapping = await conversationManager.GetMapping(turnContext.Activity.Conversation!.Id); + if (mapping == null) + { + _logger.LogWarning("No mapping found for Copilot conversation ID: {ConversationId}", turnContext.Activity.Conversation?.Id); + return; + } + await liveChatService.SendMessageAsync(mapping.LiveChatConversationId, message: "The conversation ended by user.", sender: "System"); + await liveChatService.EndConversationAsync(mapping.LiveChatConversationId); + await conversationManager.RemoveMappingByCopilotConversationId(turnContext.Activity.Conversation!.Id); await turnState.Conversation.DeleteStateAsync(turnContext, ct); _logger.LogInformation("Conversation ended and state cleared."); } @@ -56,7 +93,6 @@ await turnContext.SendActivityAsync(new Activity private async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken ct) { _logger.LogInformation("Copilot message received: {Message}", turnContext.Activity.Text); - var conversationId = turnContext.Activity.Conversation?.Id ?? "unknown-conversatioin-id"; var userName = turnContext.Activity.From?.Name ?? "unknown-user"; var message = turnContext.Activity.Text ?? string.Empty; @@ -68,33 +104,18 @@ private async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState if (turnContext.Activity.ChannelId != "msteams") { _logger.LogError("Unsupported channel ID for proactive messages: {ChannelId}", turnContext.Activity.ChannelId); - return; + throw new NotImplementedException($"Channel '{turnContext.Activity.ChannelId}' not supported for proactive messages."); } - /// Proactive message setup - await conversationManager.UpsertProactiveConversation(conversationId, turnContext.Activity); - var testId = await conversationManager.TEST_GetCConversationId(conversationId); - - //var mapping = await conversationManager.GetMappingByCopilotConversationId(conversationId); - - if (IConversationManager.Mapping1 == null) + var mapping = await conversationManager.GetMapping(turnContext.Activity.Conversation!.Id); + if (mapping == null) { - - _logger.LogError("NO MAPPING FOUND!"); - throw new Exception("No mapping found!"); + _logger.LogError("No mapping found for Copilot conversation ID: {ConversationId}", turnContext.Activity.Conversation?.Id); + throw new Exception("No mapping found for conversation. Make sure a live chat conversation has been started."); } + mapping = await conversationManager.UpsertMappingByCopilotConversationId(turnContext.Activity, mapping.LiveChatConversationId); - // if (mapping == null) - // { - // _logger.LogWarning("No mapping found for Copilot conversation ID: {ConversationId}", conversationId); - // //todo we should support userId from both sides so we can support more than as single live conversation - // var mapping = conversationManager.CreateMappingForConversationId(conversationId, testId); - - // conversationManager.UpdateMapping(mapping); - // } - ///---end proactive message setup - - await liveChatService.SendMessageAsync(message, userName); + await liveChatService.SendMessageAsync(mapping!.LiveChatConversationId, message, userName); _logger.LogInformation("Message sent to live chat"); } } \ No newline at end of file diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/MsTeamsProactiveMesssage.cs b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/MsTeamsProactiveMesssage.cs index c86001e9..d7b623a4 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/MsTeamsProactiveMesssage.cs +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/CopilotStudio/MsTeamsProactiveMesssage.cs @@ -10,7 +10,7 @@ namespace HandoverToLiveAgent.CopilotStudio; public interface IProactiveMessenger { - Task SendTextAsync(ProactiveConversation reference, string message, string? userName = null, CancellationToken ct = default); + Task SendTextAsync(ConversationMapping reference, string message, string? userName = null, CancellationToken ct = default); } public class MsTeamsProactiveMessage : IProactiveMessenger @@ -27,7 +27,7 @@ public MsTeamsProactiveMessage(ILogger logger, _configuration = serviceProvider.GetService(typeof(IConfiguration)) as IConfiguration; } - public async Task SendTextAsync(ProactiveConversation reference, string message, string? userName = null, CancellationToken ct = default) + public async Task SendTextAsync(ConversationMapping reference, string message, string? userName = null, CancellationToken ct = default) { if (_channelAdapter == null) { From 00782e6288d5ba30a227997150f7e2a51152e0fc Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Wed, 5 Nov 2025 16:38:31 +0100 Subject: [PATCH 11/17] Update README.md to enhance project description and clarify webhook configuration; streamline API endpoints section and remove outdated features. --- .../ContosoLiveChatApp/README.md | 154 ++++++------------ 1 file changed, 46 insertions(+), 108 deletions(-) diff --git a/HandoverToLiveAgent/ContosoLiveChatApp/README.md b/HandoverToLiveAgent/ContosoLiveChatApp/README.md index 56eb1f75..82bf962f 100644 --- a/HandoverToLiveAgent/ContosoLiveChatApp/README.md +++ b/HandoverToLiveAgent/ContosoLiveChatApp/README.md @@ -1,52 +1,36 @@ # Contoso Live Chat App -A simple ASP.NET Core live chat application with webhook integration. - -## Features - -- Real-time chat interface with message history -- Send messages to a preconfigured webhook endpoint -- Receive messages from remote parties via POST endpoint -- Clean, modern UI with responsive design -- In-memory message storage +A simple live chat application designed as mock live agent handover scenarios with Copilot Studio. This application simulates a live chat support system that can receive conversations from Copilot Studio and send messages back. ## Project Structure ``` ContosoLiveChatApp/ ├── Controllers/ -│ └── ChatController.cs # API endpoints for chat operations +│ └── ChatController.cs # API endpoints for chat operations (used by Copilot Studio agent) ├── Models/ │ └── ChatMessage.cs # Chat message data model ├── Services/ -│ ├── ChatService.cs # In-memory chat history management -│ └── WebhookService.cs # Outgoing webhook sender +│ ├── ChatStorageService.cs # Conversation-based message storage +│ └── WebhookService.cs # Outgoing webhook sender (send messages to Copilot Studio agent) ├── wwwroot/ -│ └── index.html # Chat UI +│ └── index.html # Chat UI with conversation management ├── Program.cs # Application entry point ├── appsettings.json # Configuration (webhook URL) -└── ContosoLiveChatApp.csproj # Project file ``` ## Configuration -**⚠️ IMPORTANT:** Before running the application, you **must** configure a valid webhook URL in `appsettings.json`: +Configure the webhook URL in `appsettings.json`: ```json { "WebhookSettings": { - "OutgoingWebhookUrl": "https://your-webhook-endpoint.com/api/messages" + "OutgoingWebhookUrl": "http://localhost:5001/api/livechat/messages" } } ``` - -Replace `https://your-webhook-endpoint.com/api/messages` with your actual webhook endpoint URL. - -**The application will not start if:** -- The webhook URL is not set (empty or null) -- The webhook URL is still set to the default placeholder value - -This validation ensures you don't accidentally run the application with an invalid webhook configuration. +This endpoint points to the Copilot Studio agent skill URL. The default configuration assumes the HandoverToLiveAgentSample is running on port 5001. ## Running the Application @@ -67,88 +51,42 @@ http://localhost:5000 ## API Endpoints -### 1. Get All Messages -- **Endpoint**: `GET /api/chat/messages` -- **Description**: Retrieves all chat messages -- **Response**: Array of ChatMessage objects - -### 2. Send Message -- **Endpoint**: `POST /api/chat/send` -- **Description**: Sends a message from the user (forwards to webhook) -- **Request Body**: -```json -{ - "text": "Your message here" -} +| Method | Endpoint | Description | +|--------|----------|-------------| +| `POST` | `/api/chat/start` | Start a new conversation, returns `conversationId` | +| `GET` | `/api/chat/messages?conversationId={id}` | Get messages for a conversation | +| `POST` | `/api/chat/send` | Send message to Copilot Studio via webhook | +| `POST` | `/api/chat/receive` | Receive message from Copilot Studio | +| `POST` | `/api/chat/end` | End conversation and clear from memory | + +## Architecture + +### API Flow + +```mermaid +sequenceDiagram + participant CS as Copilot Studio + participant API as Chat API + participant Storage as ChatStorageService + participant UI as Live Chat UI + + CS->>API: POST /api/chat/start + API-->>CS: conversationId + + Note over API,Storage: Conversation Active + + CS->>API: POST /api/chat/receive (from MCS) + API->>Storage: Store message + Storage-->>UI: Display message + + UI->>API: POST /api/chat/send (message) + API->>Storage: Store message + API->>CS: Forward via webhook (to MCS) + CS-->>UI: Message delivered + + Note over CS,UI: Messages exchanged... + + CS->>API: POST /api/chat/end + API->>Storage: Clear conversation + API-->>CS: Conversation ended ``` -- **Response**: -```json -{ - "message": "Message sent successfully", - "messageId": "guid" -} -``` - -### 3. Receive Message -- **Endpoint**: `POST /api/chat/receive` -- **Description**: Receives incoming messages from remote parties -- **Request Body**: -```json -{ - "text": "Incoming message", - "sender": "Remote Party Name" -} -``` -- **Response**: -```json -{ - "message": "Message received successfully", - "messageId": "guid" -} -``` - -## Usage - -### Sending Messages (User Interface) -1. Type your message in the input field at the bottom -2. Click the "Send" button or press Enter -3. The message will be displayed in the chat history -4. The message will be sent to the configured webhook endpoint - -### Receiving Messages (Via API) -Remote parties can send messages to your chat by making a POST request to: -``` -POST http://localhost:5000/api/chat/receive -Content-Type: application/json - -{ - "text": "Hello from remote party", - "sender": "Agent Name" -} -``` - -The message will automatically appear in the chat history. - -## Testing the Webhook - -To test the webhook functionality without a real endpoint, you can use services like: -- [webhook.site](https://webhook.site) - Provides a temporary webhook URL -- [RequestBin](https://requestbin.com) - Inspect HTTP requests -- [ngrok](https://ngrok.com) - Create a tunnel to your local machine - -## Notes - -- Messages are stored in-memory and will be lost when the application restarts -- The chat automatically polls for new messages every 2 seconds -- The UI is responsive and works on mobile devices -- All timestamps are in UTC - -## Future Enhancements - -Consider adding: -- Database persistence for messages -- WebSocket/SignalR for real-time updates -- User authentication -- Message delivery confirmation -- File attachments support -- Typing indicators From 5bf2dd8960f47eb765bfe855f22cd1db4d5bea79 Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Wed, 5 Nov 2025 16:50:33 +0100 Subject: [PATCH 12/17] Add README.md to document project structure, configuration, and API flow for Handover To Live Agent Sample --- .../HandoverToLiveAgentSample/README.md | 188 ++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 HandoverToLiveAgent/HandoverToLiveAgentSample/README.md diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/README.md b/HandoverToLiveAgent/HandoverToLiveAgentSample/README.md new file mode 100644 index 00000000..b13d22b9 --- /dev/null +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/README.md @@ -0,0 +1,188 @@ +# Handover To Live Agent Sample + +A .NET 9.0 Copilot Studio skill that enables seamless handover of conversations from Copilot Studio to a live chat system. This application acts as a bridge between Copilot Studio agents and live support systems, managing bidirectional message flow and conversation state. + +## Project Structure + +``` +HandoverToLiveAgentSample/ +├── CopilotStudio/ +│ ├── CopilotStudioAgent.cs # Main agent handling Copilot Studio activities via bot skill +│ ├── ConversationManager.cs # Manages conversation mappings between MCS and Live Chat mockup app +│ └── MsTeamsProactiveMessage.cs # Sends proactive messages to MS Teams +├── LiveChat/ +│ ├── LiveChatService.cs # Service to communicate with live chat app +│ └── LiveChatWebhookController.cs # Receives webhook messages from live chat app +├── wwwroot/ +│ └── skill-manifest.json # Copilot Studio skill manifest +├── Program.cs # Application entry point +├── appsettings.json # Configuration (credentials & URLs) +``` + +## Configuration + +Configure authentication and live chat settings in `appsettings.json`: + +```json +{ + "LiveChatSettings": { + "BaseUrl": "http://localhost:5000" + }, + "Connections": { + "CopilotStudioBot": { + "ConnectionType": "AzureAD", + "Settings": { + "TenantId": "your-tenant-id", + "ClientId": "your-bot-app-id", + "ClientSecret": "your-bot-client-secret", + "Scopes": ["https://api.botframework.com/.default"] + } + } + }, + "ConnectionsMap": [ + { + "ServiceUrl": "https://smba*", + "Connection": "CopilotStudioBot" + }, + { + "ServiceUrl": "https://pvaruntime*", + "Connection": "CopilotStudioBot" + } + ] +} +``` + +### Configuration Details + +- **LiveChatSettings.BaseUrl**: URL of the live chat application (ContosoLiveChatApp) +- **TenantId**: Your Azure AD tenant ID +- **ClientId**: Your Copilot Studio bot's App ID (Service Principal ID) +- **ClientSecret**: Your Copilot Studio bot's client secret +- **ConnectionsMap**: Maps service URLs to authentication connections for proactive messaging + +## Running the Application + +1. Navigate to the project directory: +```powershell +cd CopilotStudioSamples\HandoverToLiveAgent\HandoverToLiveAgentSample +``` + +2. Restore dependencies and run: +```powershell +dotnet run +``` + +3. The application will start on: +``` +http://localhost:5001 +``` + +4. The skill endpoint will be available at: +``` +http://localhost:5001/api/messages +``` + +5. Expose the app over a reverse proxy such as devtunnel. And make sure that the same public endpoint URL is set in the Copilot Studio Sample Agent + + +## API Endpoints + +| Method | Endpoint | Description | +|--------|----------|-------------| +| `POST` | `/api/messages` | Main Copilot Studio skill endpoint (handles skill activities) | +| `POST` | `/api/livechat/messages` | Webhook endpoint to receive messages from live chat app | + +## Architecture + +### API Flow + +```mermaid +sequenceDiagram + participant User as MS Teams User + participant CS as Copilot Studio + participant Skill as Agent Skill Sample + participant LC as Live Chat API + participant Agent as Live Agent + + User->>CS: Chat with bot + CS->>Skill: Event: startConversation + Skill->>LC: POST /api/chat/start + LC-->>Skill: conversationId (liveChatId) + Note over Skill: Store mapping (copilotId ↔ liveChatId) + Skill-->>CS: EndOfConversation (success) + + Note over CS,Agent: Conversation Active + + User->>CS: Send message + CS->>Skill: Message activity + Note over Skill: Update mapping with activity details + Skill->>LC: POST /api/chat/receive + LC-->>Agent: Display message + + Agent->>LC: Send response + LC->>Skill: POST /api/livechat/messages (webhook) + Note over Skill: Get conversation mapping + Skill->>CS: Proactive message (MS Teams) + CS-->>User: Display response + + Note over User,Agent: Messages exchanged... + + User->>CS: End conversation + CS->>Skill: Event: endConversation + Skill->>LC: POST /api/chat/end + Note over Skill: Remove mapping + Skill-->>CS: EndOfConversation (success) +``` + +### Key Components + +#### CopilotStudioAgent +Main agent class that handles incoming activities from Copilot Studio: +- **OnEventAsync**: Handles `startConversation` and `endConversation` events +- **OnMessageAsync**: Forwards user messages to live chat system +- Uses scoped services to resolve dependencies per turn + +#### ConversationManager +Manages bidirectional conversation mappings: +- Stores mapping between Copilot conversation IDs and live chat conversation IDs +- Tracks conversation metadata (user ID, channel ID, service URL) +- Resolves SMBA regions for MS Teams proactive messaging +- In-memory storage using static dictionaries + +#### LiveChatService +Communicates with the live chat system: +- **StartConversationAsync**: Initiates a new conversation in live chat app +- **SendMessageAsync**: Forwards messages from Copilot Studio to live chat app +- **EndConversationAsync**: Terminates the live chat conversation + +#### MsTeamsProactiveMessage +Sends proactive messages back to MS Teams users: +- Uses IChannelAdapter for proactive messaging +- Resolves App ID based on service URL patterns +- Supports SMBA (MS Teams) runtime URLs +- Formats messages with sender name + +#### LiveChatWebhookController +Receives webhook callbacks from live chat: +- Accepts messages from live agents +- Looks up conversation mapping +- Sends proactive messages back to Copilot Studio conversation + +## Skill Manifest + +The `skill-manifest.json` defines the skill's capabilities for Copilot Studio: + +**Activities:** +- **startConversation** (event): Initiates a live chat session +- **sendMessage** (message): Sends user messages to live chat +- **endConversation** (event): Terminates the live chat session + +**Endpoint Configuration:** +```json +{ + "endpointUrl": "https://your-tunnel-url.com/api/messages", + "msAppId": "your-bot-app-id" +} +``` + +Update the `endpointUrl` to your deployed URL or dev tunnel. From 87bc8aaa9b5b714f134ee311411df2f60156eb88 Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Thu, 6 Nov 2025 16:54:02 +0100 Subject: [PATCH 13/17] Add images and zip files for Handover To Live Agent Sample documentation --- .../.img/app_registration_setup.png | Bin 0 -> 161914 bytes HandoverToLiveAgent/.img/solution_import.png | Bin 0 -> 53641 bytes HandoverToLiveAgent/HandoverAgentSample.zip | Bin 0 -> 49937 bytes .../HandoverAgentSample_1_0_0_1.zip | Bin 0 -> 49937 bytes HandoverToLiveAgent/README.md | 98 +++++++++++++++++- 5 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 HandoverToLiveAgent/.img/app_registration_setup.png create mode 100644 HandoverToLiveAgent/.img/solution_import.png create mode 100644 HandoverToLiveAgent/HandoverAgentSample.zip create mode 100644 HandoverToLiveAgent/HandoverAgentSample_1_0_0_1.zip diff --git a/HandoverToLiveAgent/.img/app_registration_setup.png b/HandoverToLiveAgent/.img/app_registration_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..a944a94b7358ec1d5d44acc1064da5cc4c6f9025 GIT binary patch literal 161914 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Ü=J7weB~xc1vjx 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

_)BS=CXbg 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

WI6DY;oF3$jH@i8VuJ7 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

S`7lfMM;5`LTq!gHe~=581Z7djKXE;WeRa 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 a+01Eu*74ayq7S-)(FybK$ltpD@P7cBON$-= literal 0 HcmV?d00001 diff --git a/HandoverToLiveAgent/HandoverAgentSample.zip b/HandoverToLiveAgent/HandoverAgentSample.zip new file mode 100644 index 0000000000000000000000000000000000000000..b3711413a67e1e7fd782b7c4d9ef89667631482d GIT binary patch literal 49937 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

lHq2J(+pBDGOr4^-xFV;+>D5l2h!x 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 NqXO)Kvdez__FsL(XA1xT literal 0 HcmV?d00001 diff --git a/HandoverToLiveAgent/HandoverAgentSample_1_0_0_1.zip b/HandoverToLiveAgent/HandoverAgentSample_1_0_0_1.zip new file mode 100644 index 0000000000000000000000000000000000000000..b3711413a67e1e7fd782b7c4d9ef89667631482d GIT binary patch literal 49937 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

lHq2J(+pBDGOr4^-xFV;+>D5l2h!x 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 NqXO)Kvdez__FsL(XA1xT literal 0 HcmV?d00001 diff --git a/HandoverToLiveAgent/README.md b/HandoverToLiveAgent/README.md index 28bab5e9..1b00d66b 100644 --- a/HandoverToLiveAgent/README.md +++ b/HandoverToLiveAgent/README.md @@ -1,6 +1,94 @@ +# Copilot Studio Handover To Live Agent Sample -```shell -devtunnel create contoso --allow-anonymous -devtunnel port create contoso -p 5001 -devtunnel host contoso -``` \ No newline at end of file +The solution shows how to create a handoff process from Copilot Studio agent to a 3rd party customer service system. + +## Overview + +This solution demonstrates how Copilot Studio agent can hand over a conversation to an external 3rd party application and return the conversation back to the agent. The solution uses [Microsoft Teams proactive messaging](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages?tabs=dotnet) feature to allow sending multiple asynchronous messages back to the human-to-agent conversation. + +## Solution + +The sample consists of the following elements: + +- ContosoLiveChatApp mimicking a 3rd party customer service app. More details on that project can be found in [./ContosoLiveChatApp/Readme.md](./ContosoLiveChatApp/README.md) + +- HandoverToLiveAgentSample that is the backend for [Copilot Studio skill](https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-use-skills) as a communication layer with ContosoLiveChatApp. More details on that project can be found in [./HandoverToLiveAgentSample/README.md](./HandoverToLiveAgentSample/README.md) + +- [HandoverAgentSample.zip](./HandoverAgentSample.zip) solution with an example agent using previously mentioned Copilot Studio skill + +## Installation + +1. In order to communicate MCS agent with locally running HandoverToLiveAgentSample app, a reverse proxy is required to expose the app over the internet. You can install [devtunnel](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/get-started?tabs=windows) and run the following commands: + + ```powershell + devtunnel login + devtunnel create --allow-anonymous + devtunnel port create -p 5001 + devtunnel host + ``` + + Take note of the `connect via browser` endpoint, it should look like `https://-5001.euw.devtunnels.ms` + + +1. In a new terminal, run the `.\HandoverToLiveAgentSample\HandoverToLiveAgentSample.csproj` skill hosting app + + ```powershell + dotnet run --project .\HandoverToLiveAgentSample\HandoverToLiveAgentSample.csproj + ``` + +1. Validate that the app is running by going to the devtunnel URL: `https://-5001.euw.devtunnels.ms/skill-manifest.json` + +1. In another terminal, run the `.\ContosoLiveChatApp\ContosoLiveChatApp.csproj` Contoso Live Chat app and in your browser open the following URL: `http://localhost:5000/` and validate that the app is running + + ```powershell + dotnet run --project .\ContosoLiveChatApp\ContosoLiveChatApp.csproj + ``` + +1. Import HandoverAgentSample.zip to your Dataverse environment. +During the import you will be asked to fill in environment variables: + - `[Contoso Agent] Handoff Skill endpointUrl`: override value with `https://-5001.euw.devtunnels.ms/api/messages` + - `[Contoso Agent] Handoff Skill msAppId`: will have to be updated after solution import + + ![env variables](./.img/solution_import.png) + +1. After solution import is finished, go to `https://copilotstudio.microsoft.com/`, open `Contoso Agent`. Go to "Settings" > "Advanced" > "Metadata" and note the `Agent App ID` + +1. Go to Azure Portal and in Entra ID find `App Registration` with `Application Client ID` that is the same as the `Agent App ID`. Go to "Branding & properties" and in the "Home page URL" save the same value as in the environment variable (`https://-5001.euw.devtunnels.ms/api/messages`) + + ![app registration](./.img/app_registration_setup.png) + +1. In the same app registration, create and note a new secret in "Certificates & secrets" + +1. Go to [appsettings.json](./HandoverToLiveAgentSample/appsettings.json) and set "TenantId", "ClientId" and "Secret" from the previous app registration + +1. Go to [skill-manifest.json](./HandoverToLiveAgentSample/wwwroot/skill-manifest.json) and replace "endpointUrl" and "msAppId" with `https://-5001.euw.devtunnels.ms/api/messages` and the app registration client ID used earlier. Don't forget to restart the app after changing config files. + +1. On the Copilot Studio page, publish the agent and add it to the "Teams and Microsoft 365 Copilot" channel. + +## Usage + +When chatting with your agent you can type: + +"I want to talk with a person" - to escalate your conversation to the Contoso Live Chat app. + +"Good bye" - to end escalation with the Contoso Live Chat app + +## Agent architecture + +Contoso Agent uses skills to communicate with the Contoso Live Chat app. Depending on the integration options of your customer service system, this example may require smaller or larger changes. + +Two topics have been customized: + +1. "Escalate to Live Chat" - responsible for creating a new handoff using the "endConversation" skill and "sendMessage" skill to maintain communication. + +1. "Goodbye Live Chat" - responsible for closing the handoff, so that the user can go seamlessly back to the agent. This is done by allowing the topic to jump into the "sendMessage" skill added in "Escalate to Live Chat". Without that, ending the handoff would be possible only in the backend code by hardcoding specific verbs. + +## Extending codebase + +You can control how the skills are built by changing the skill-manifest.json and refreshing it in Copilot Studio using the `https://-5001.euw.devtunnels.ms/skill-manifest.json` link. + +## Known limitations + +1. Proactive Messaging is required, so that the Live Chat user can respond back at any point in time. Without this feature, standard conversations are request-reply based, requiring the Live Chat user to wait for a message to write a reply back. This limits the current scope to only the Microsoft Teams channel (non-Microsoft apps not included). + +1. Due to how conversations are mapped between the systems, one MS Teams chat can chat with multiple Live Chat sessions, but that would mean that conversations are simultaneously being received in the same MS Teams agent conversation. Also, if a Teams user would have multiple sessions opened, the sample does not provide a UI that would allow them to pick which session they would like to go back to. From 7ce79a925f06647240996944f3e7caf8a8e0ef26 Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Thu, 6 Nov 2025 16:55:29 +0100 Subject: [PATCH 14/17] Remove outdated HandoverAgentSample zip file to streamline project resources. --- .../HandoverAgentSample_1_0_0_1.zip | Bin 49937 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 HandoverToLiveAgent/HandoverAgentSample_1_0_0_1.zip diff --git a/HandoverToLiveAgent/HandoverAgentSample_1_0_0_1.zip b/HandoverToLiveAgent/HandoverAgentSample_1_0_0_1.zip deleted file mode 100644 index b3711413a67e1e7fd782b7c4d9ef89667631482d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49937 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

lHq2J(+pBDGOr4^-xFV;+>D5l2h!x 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 NqXO)Kvdez__FsL(XA1xT From 55775119db2a3c38a89e969d686f81d760a116ad Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Thu, 6 Nov 2025 16:57:00 +0100 Subject: [PATCH 15/17] Update msAppId in skill manifest for Handoff Skill to reflect new application ID. --- .../HandoverToLiveAgentSample/wwwroot/skill-manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json b/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json index f9296923..fa2bed11 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json @@ -16,7 +16,7 @@ "protocol": "BotFrameworkV3", "description": "Default endpoint for the Handoff Skill", "endpointUrl": "https://td7k9vbg-5001.euw.devtunnels.ms/api/messages", - "msAppId": "dd48c5ae-fa3d-4bfd-a747-734b5279f470" + "msAppId": "715f8840-74e2-443d-a7df-50efb2ac7b1c" } ], "activities": { From 68e2878a8efbc42fce563610f456c9268c563507 Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Thu, 6 Nov 2025 16:59:24 +0100 Subject: [PATCH 16/17] Update endpointUrl and msAppId placeholders in skill manifest for clarity --- .../HandoverToLiveAgentSample/wwwroot/skill-manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json b/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json index fa2bed11..7e6989b6 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/wwwroot/skill-manifest.json @@ -15,8 +15,8 @@ "name": "default", "protocol": "BotFrameworkV3", "description": "Default endpoint for the Handoff Skill", - "endpointUrl": "https://td7k9vbg-5001.euw.devtunnels.ms/api/messages", - "msAppId": "715f8840-74e2-443d-a7df-50efb2ac7b1c" + "endpointUrl": "https://-5001.euw.devtunnels.ms/api/messages", + "msAppId": "", } ], "activities": { From 14ef03c0d6a0124466640736fe8b082e44a9bdce Mon Sep 17 00:00:00 2001 From: Mateusz Wasilewski Date: Thu, 27 Nov 2025 09:45:45 +0100 Subject: [PATCH 17/17] Enhance README and appsettings.json with detailed LiveChat configuration and setup instructions --- .../HandoverToLiveAgentSample/README.md | 26 +++++++++++++++---- .../appsettings.json | 24 ++++++++++------- HandoverToLiveAgent/README.md | 15 ++++++----- 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/README.md b/HandoverToLiveAgent/HandoverToLiveAgentSample/README.md index b13d22b9..5f7bdd5d 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/README.md +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/README.md @@ -21,7 +21,7 @@ HandoverToLiveAgentSample/ ## Configuration -Configure authentication and live chat settings in `appsettings.json`: +Configure authentication and live chat settings in `appsettings.json`. This sample supports using 2 separate app registrations for different service URL patterns: ```json { @@ -29,6 +29,15 @@ Configure authentication and live chat settings in `appsettings.json`: "BaseUrl": "http://localhost:5000" }, "Connections": { + "LiveChat": { + "ConnectionType": "AzureAD", + "Settings": { + "TenantId": "your-tenant-id", + "ClientId": "your-custom-service-principal-app-id", + "ClientSecret": "your-custom-service-principal-client-secret", + "Scopes": ["https://api.botframework.com/.default"] + } + }, "CopilotStudioBot": { "ConnectionType": "AzureAD", "Settings": { @@ -46,7 +55,7 @@ Configure authentication and live chat settings in `appsettings.json`: }, { "ServiceUrl": "https://pvaruntime*", - "Connection": "CopilotStudioBot" + "Connection": "LiveChat" } ] } @@ -54,11 +63,18 @@ Configure authentication and live chat settings in `appsettings.json`: ### Configuration Details -- **LiveChatSettings.BaseUrl**: URL of the live chat application (ContosoLiveChatApp) +#### LiveChat Connection (Custom Service Principal) - **TenantId**: Your Azure AD tenant ID -- **ClientId**: Your Copilot Studio bot's App ID (Service Principal ID) +- **ClientId**: App ID of your custom service principal created for the live chat integration +- **ClientSecret**: Client secret for the custom service principal + +#### CopilotStudioBot Connection (Bot App Registration) +- **TenantId**: Your Azure AD tenant ID (same as above) +- **ClientId**: Your Copilot Studio bot's App ID - **ClientSecret**: Your Copilot Studio bot's client secret -- **ConnectionsMap**: Maps service URLs to authentication connections for proactive messaging + +#### General Settings +- **LiveChatSettings.BaseUrl**: URL of the live chat application (ContosoLiveChatApp), default: `http://localhost:5000` ## Running the Application diff --git a/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.json b/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.json index 8fedd7b4..e3bde2d7 100644 --- a/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.json +++ b/HandoverToLiveAgent/HandoverToLiveAgentSample/appsettings.json @@ -7,20 +7,26 @@ }, "AllowedHosts": "*", "LiveChatSettings": { - // The base URL of your Live Chat web service "BaseUrl": "http://localhost:5000" }, "Connections": { - // credential used to authenticate and send proactive messages and messages back to MCS from skill code (CopilotStudioAgent class) + "LiveChat": { + "ConnectionType": "AzureAD", + "Settings": { + "TenantId": "", //Your Tenant ID + "ClientId": "", //Your custom Service Principal's App ID + "ClientSecret": "", //Your custom Service Principal's Client Secret + "Scopes": [ + "https://api.botframework.com/.default" + ] + } + }, "CopilotStudioBot": { "ConnectionType": "AzureAD", "Settings": { - // Your Tenant ID - "TenantId": "00000000-0000-0000-0000-000000000000", - // Your Agent Bot's App ID (Same as Service Principal ID) - "ClientId": "00000000-0000-0000-0000-000000000000", - // Your Agent Bot's Client Secret - "ClientSecret": "", + "TenantId": "", // Your Tenant ID + "ClientId": "", // Your Agent Bot's App ID (Same as Service Principal ID) + "ClientSecret": "", // Your Agent Bot's Client Secret "Scopes": [ "https://api.botframework.com/.default" ] @@ -36,7 +42,7 @@ { // PVA runtime URL pattern to handle non-proactive messages back to MCS "ServiceUrl": "https://pvaruntime*", - "Connection": "CopilotStudioBot" + "Connection": "LiveChat" } ] } \ No newline at end of file diff --git a/HandoverToLiveAgent/README.md b/HandoverToLiveAgent/README.md index 1b00d66b..d9e210a2 100644 --- a/HandoverToLiveAgent/README.md +++ b/HandoverToLiveAgent/README.md @@ -29,6 +29,7 @@ The sample consists of the following elements: Take note of the `connect via browser` endpoint, it should look like `https://-5001.euw.devtunnels.ms` +1. Create new App Registration `LiveChatSample` in your Micrsofot Entra ID and note its AppId and new Secret 1. In a new terminal, run the `.\HandoverToLiveAgentSample\HandoverToLiveAgentSample.csproj` skill hosting app @@ -47,21 +48,23 @@ The sample consists of the following elements: 1. Import HandoverAgentSample.zip to your Dataverse environment. During the import you will be asked to fill in environment variables: - `[Contoso Agent] Handoff Skill endpointUrl`: override value with `https://-5001.euw.devtunnels.ms/api/messages` - - `[Contoso Agent] Handoff Skill msAppId`: will have to be updated after solution import + - `[Contoso Agent] Handoff Skill msAppId`: use your new app registration AppId ![env variables](./.img/solution_import.png) 1. After solution import is finished, go to `https://copilotstudio.microsoft.com/`, open `Contoso Agent`. Go to "Settings" > "Advanced" > "Metadata" and note the `Agent App ID` -1. Go to Azure Portal and in Entra ID find `App Registration` with `Application Client ID` that is the same as the `Agent App ID`. Go to "Branding & properties" and in the "Home page URL" save the same value as in the environment variable (`https://-5001.euw.devtunnels.ms/api/messages`) +1. In the same app registration, create and note a new secret in "Certificates & secrets" - ![app registration](./.img/app_registration_setup.png) +1. Go to [appsettings.json](./HandoverToLiveAgentSample/appsettings.json) and set "TenantId", "ClientId" and "Secret" under `CopilotStudioBot` connection from the previous app registration (automatically created Copilot app registration) -1. In the same app registration, create and note a new secret in "Certificates & secrets" +1. In the same [appsettings.json](./HandoverToLiveAgentSample/appsettings.json) "TenantId", "ClientId" and "Secret" under `LiveChat` connection using you newly created app registration `LiveChatSample` -1. Go to [appsettings.json](./HandoverToLiveAgentSample/appsettings.json) and set "TenantId", "ClientId" and "Secret" from the previous app registration +1. For the `LiveChatSample` App Registration, go to "Branding & properties" and in the "Home page URL" save the same value as in the environment variable (`https://-5001.euw.devtunnels.ms/api/messages`) + + ![app registration](./.img/app_registration_setup.png) -1. Go to [skill-manifest.json](./HandoverToLiveAgentSample/wwwroot/skill-manifest.json) and replace "endpointUrl" and "msAppId" with `https://-5001.euw.devtunnels.ms/api/messages` and the app registration client ID used earlier. Don't forget to restart the app after changing config files. +1. Go to [skill-manifest.json](./HandoverToLiveAgentSample/wwwroot/skill-manifest.json) and replace "endpointUrl" and "msAppId" with `https://-5001.euw.devtunnels.ms/api/messages` and the `LiveChatSample` app registration AppId. Don't forget to restart the app after changing config files. 1. On the Copilot Studio page, publish the agent and add it to the "Teams and Microsoft 365 Copilot" channel.