microsoft/teams.net

Public

mirrored fromhttps://github.com/microsoft/teams.netAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
aamirj/minimal

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

119lines · 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 async Task<ModelMessage<string>> Send(string text, OnStreamChunk? onChunk = null, CancellationToken cancellationToken = default)
17 {
18 return await Send(text, null, onChunk, cancellationToken);
19 }
20
21 public Task<ModelMessage<string>> Send(string text, IChatPrompt<TOptions>.RequestOptions? options = null, OnStreamChunk? onChunk = null, CancellationToken cancellationToken = default)
22 {
23 var message = UserMessage.Text(text);
24 return Send((IMessage)message, options, onChunk, cancellationToken);
25 }
26
27 public Task<ModelMessage<string>> Send(IContent[] content, IChatPrompt<TOptions>.RequestOptions? options = null, OnStreamChunk? onChunk = null, CancellationToken cancellationToken = default)
28 {
29 var message = UserMessage.Text(content);
30 return Send((IMessage)message, options, onChunk, cancellationToken);
31 }
32
33 public Task<ModelMessage<string>> Send(UserMessage<string> 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 Task<ModelMessage<string>> Send(UserMessage<IEnumerable<IContent>> message, IChatPrompt<TOptions>.RequestOptions? options = null, OnStreamChunk? onChunk = null, CancellationToken cancellationToken = default)
39 {
40 return Send((IMessage)message, options, onChunk, cancellationToken);
41 }
42
43 public async Task<ModelMessage<string>> Send(IMessage message, IChatPrompt<TOptions>.RequestOptions? options = null, OnStreamChunk? onChunk = null, CancellationToken cancellationToken = default)
44 {
45 var messages = options?.Messages ?? Messages;
46 var buffer = string.Empty;
47 var prompt = Template is not null ? await Template.Render(null, cancellationToken) : null;
48
49 async Task OnChunk(string chunk)
50 {
51 if (chunk == string.Empty || onChunk is null) return;
52 buffer += chunk;
53
54 try
55 {
56 await onChunk(buffer);
57 buffer = string.Empty;
58 }
59 catch { return; }
60 }
61
62 var functions = new FunctionCollection();
63 foreach (var kvp in Functions)
64 {
65 functions[kvp.Key] = kvp.Value;
66 }
67 var instructions = prompt is null ? null : new DeveloperMessage(prompt);
68
69 // allow plugins to modify functions and instructions before each send
70 foreach (var plugin in Plugins)
71 {
72 functions = await plugin.OnBuildFunctions(this, functions, cancellationToken);
73 instructions = await plugin.OnBuildInstructions(this, instructions);
74 }
75
76 ChatModelOptions<TOptions> requestOptions = new(Invoke(functions))
77 {
78 Functions = functions.List,
79 Messages = messages,
80 Prompt = instructions,
81 Options = options is null ? default : options.Request,
82 };
83
84 ModelMessage<string>? res;
85
86 try
87 {
88 Logger.Debug(message);
89
90 foreach (var plugin in Plugins)
91 {
92 message = await plugin.OnBeforeSend(this, message, requestOptions.Options, cancellationToken);
93 }
94
95 if (onChunk is null)
96 {
97 res = await Model.Send(message, requestOptions, cancellationToken);
98 }
99 else
100 {
101 res = await Model.Send(message, requestOptions, new Stream(OnChunk), cancellationToken);
102 }
103
104 Logger.Debug(res);
105
106 foreach (var plugin in Plugins)
107 {
108 res = (ModelMessage<string>)await plugin.OnAfterSend(this, res, requestOptions.Options, cancellationToken);
109 }
110
111 return res;
112 }
113 catch (Exception ex)
114 {
115 ErrorEvent(Model, ex);
116 throw new Exception("An error occurred while attempting to send the message", ex);
117 }
118 }
119}