microsoft/teams.net

Public

mirrored from https://github.com/microsoft/teams.netAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v2.0.0-preveiw.12

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

Libraries/Microsoft.Teams.AI/Prompts/ChatPrompt/ChatPrompt.Send.cs

114lines · modecode

1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT License.
3
4using Microsoft.Teams.AI.Messages;
5using Microsoft.Teams.AI.Models;
6
7namespace Microsoft.Teams.AI.Prompts;
8
9public partial class ChatPrompt<TOptions>
10{
11 public async Task<IMessage> Send(IMessage message, CancellationToken cancellationToken = default)
12 {
13 return await Send(message, null, null, cancellationToken);
14 }
15
16 public Task<ModelMessage<string>> Send(string text, IChatPrompt<TOptions>.RequestOptions? options = null, OnStreamChunk? onChunk = null, CancellationToken cancellationToken = default)
17 {
18 var message = UserMessage.Text(text);
19 return Send((IMessage)message, options, onChunk, cancellationToken);
20 }
21
22 public Task<ModelMessage<string>> Send(IContent[] content, IChatPrompt<TOptions>.RequestOptions? options = null, OnStreamChunk? onChunk = null, CancellationToken cancellationToken = default)
23 {
24 var message = UserMessage.Text(content);
25 return Send((IMessage)message, options, onChunk, cancellationToken);
26 }
27
28 public Task<ModelMessage<string>> Send(UserMessage<string> message, IChatPrompt<TOptions>.RequestOptions? options = null, OnStreamChunk? onChunk = null, CancellationToken cancellationToken = default)
29 {
30 return Send((IMessage)message, options, onChunk, cancellationToken);
31 }
32
33 public Task<ModelMessage<string>> Send(UserMessage<IEnumerable<IContent>> message, IChatPrompt<TOptions>.RequestOptions? options = null, OnStreamChunk? onChunk = null, CancellationToken cancellationToken = default)
34 {
35 return Send((IMessage)message, options, onChunk, cancellationToken);
36 }
37
38 public async Task<ModelMessage<string>> Send(IMessage message, IChatPrompt<TOptions>.RequestOptions? options = null, OnStreamChunk? onChunk = null, CancellationToken cancellationToken = default)
39 {
40 var messages = options?.Messages ?? Messages;
41 var buffer = string.Empty;
42 var prompt = Template is not null ? await Template.Render(null, cancellationToken) : null;
43
44 async Task OnChunk(string chunk)
45 {
46 if (chunk == string.Empty || onChunk is null) return;
47 buffer += chunk;
48
49 try
50 {
51 await onChunk(buffer);
52 buffer = string.Empty;
53 }
54 catch { return; }
55 }
56
57 var functions = new FunctionCollection();
58 foreach (var kvp in Functions)
59 {
60 functions[kvp.Key] = kvp.Value;
61 }
62 var instructions = prompt is null ? null : new DeveloperMessage(prompt);
63
64 // allow plugins to modify functions and instructions before each send
65 foreach (var plugin in Plugins)
66 {
67 functions = await plugin.OnBuildFunctions(this, functions, cancellationToken);
68 instructions = await plugin.OnBuildInstructions(this, instructions);
69 }
70
71 ChatModelOptions<TOptions> requestOptions = new(Invoke(functions))
72 {
73 Functions = functions.List,
74 Messages = messages,
75 Prompt = instructions,
76 Options = options is null ? default : options.Request,
77 };
78
79 ModelMessage<string>? res;
80
81 try
82 {
83 Logger.Debug(message);
84
85 foreach (var plugin in Plugins)
86 {
87 message = await plugin.OnBeforeSend(this, message, requestOptions.Options, cancellationToken);
88 }
89
90 if (onChunk is null)
91 {
92 res = await Model.Send(message, requestOptions, cancellationToken);
93 }
94 else
95 {
96 res = await Model.Send(message, requestOptions, new Stream(OnChunk), cancellationToken);
97 }
98
99 Logger.Debug(res);
100
101 foreach (var plugin in Plugins)
102 {
103 res = (ModelMessage<string>)await plugin.OnAfterSend(this, res, requestOptions.Options, cancellationToken);
104 }
105
106 return res;
107 }
108 catch (Exception ex)
109 {
110 ErrorEvent(Model, ex);
111 throw new Exception("An error occurred while attempting to send the message", ex);
112 }
113 }
114}