|
1 | 1 | using AgentFrameworkToolkit.OpenAI; |
| 2 | +using Azure.AI.OpenAI; |
2 | 3 | using Azure.Core; |
3 | 4 | using JetBrains.Annotations; |
4 | 5 | using Microsoft.Agents.AI; |
5 | 6 | using Microsoft.Extensions.AI; |
6 | | -using OpenAI; |
7 | | -using OpenAI.Chat; |
8 | | -using OpenAI.Responses; |
9 | | - |
10 | | -#pragma warning disable OPENAI001 |
11 | 7 |
|
12 | 8 | namespace AgentFrameworkToolkit.AzureOpenAI; |
13 | 9 |
|
@@ -86,162 +82,14 @@ public AzureOpenAIAgent CreateAgent(string model, string? instructions = null, s |
86 | 82 | /// <returns>The Agent</returns> |
87 | 83 | public AzureOpenAIAgent CreateAgent(AgentOptions options) |
88 | 84 | { |
89 | | - OpenAIClient client = Connection.GetClient(options.RawHttpCallDetails); |
90 | | - |
91 | | - ChatClientAgentOptions chatClientAgentOptions = CreateChatClientAgentOptions(options); |
92 | | - |
93 | | - ChatClientAgent innerAgent; |
94 | | - switch (options.ClientType) |
95 | | - { |
96 | | - case ClientType.ChatClient: |
97 | | - innerAgent = client |
98 | | - .GetChatClient(options.Model) |
99 | | - .CreateAIAgent(chatClientAgentOptions, options.ClientFactory, options.LoggerFactory, options.Services); |
100 | | - break; |
101 | | - case ClientType.ResponsesApi: |
102 | | - innerAgent = client |
103 | | - .GetResponsesClient(options.Model) |
104 | | - .CreateAIAgent(chatClientAgentOptions, options.ClientFactory, options.LoggerFactory, options.Services); |
105 | | - break; |
106 | | - case null: |
107 | | - innerAgent = Connection.DefaultClientType switch |
108 | | - { |
109 | | - ClientType.ChatClient => client |
110 | | - .GetChatClient(options.Model) |
111 | | - .CreateAIAgent(chatClientAgentOptions, options.ClientFactory, options.LoggerFactory, options.Services), |
112 | | - ClientType.ResponsesApi => client |
113 | | - .GetResponsesClient(options.Model) |
114 | | - .CreateAIAgent(chatClientAgentOptions, options.ClientFactory, options.LoggerFactory, options.Services), |
115 | | - _ => throw new ArgumentOutOfRangeException() |
116 | | - }; |
117 | | - break; |
118 | | - default: |
119 | | - throw new ArgumentOutOfRangeException(); |
120 | | - } |
121 | | - |
122 | | - // ReSharper disable once ConvertIfStatementToReturnStatement |
123 | | - if (options.RawToolCallDetails != null || options.ToolCallingMiddleware != null || options.OpenTelemetryMiddleware != null || options.LoggingMiddleware != null) |
124 | | - { |
125 | | - return new AzureOpenAIAgent(options.ApplyMiddleware(innerAgent)); |
126 | | - } |
127 | | - |
128 | | - return new AzureOpenAIAgent(innerAgent); |
129 | | - } |
130 | | - |
131 | | - private ChatClientAgentOptions CreateChatClientAgentOptions(AgentOptions options) |
132 | | - { |
133 | | - bool anyOptionsSet = false; |
134 | | - ChatOptions chatOptions = new(); |
135 | | - if (options.Tools != null) |
136 | | - { |
137 | | - anyOptionsSet = true; |
138 | | - chatOptions.Tools = options.Tools; |
139 | | - } |
140 | | - |
141 | | - if (options.MaxOutputTokens.HasValue) |
142 | | - { |
143 | | - anyOptionsSet = true; |
144 | | - chatOptions.MaxOutputTokens = options.MaxOutputTokens.Value; |
145 | | - } |
146 | | - |
147 | | - if (options.Temperature != null && !OpenAIChatModels.ReasoningModels.Contains(options.Model)) |
148 | | - { |
149 | | - anyOptionsSet = true; |
150 | | - chatOptions.Temperature = options.Temperature; |
151 | | - } |
152 | | - |
153 | | - if (!string.IsNullOrWhiteSpace(options.Instructions)) |
154 | | - { |
155 | | - anyOptionsSet = true; |
156 | | - chatOptions.Instructions = options.Instructions; |
157 | | - } |
158 | | - |
159 | | - string? reasoningEffortAsString = null; |
160 | | - switch (options.ReasoningEffort) |
161 | | - { |
162 | | - case OpenAIReasoningEffort.None: |
163 | | - reasoningEffortAsString = "none"; |
164 | | - break; |
165 | | - case OpenAIReasoningEffort.Minimal: |
166 | | - reasoningEffortAsString = "minimal"; |
167 | | - break; |
168 | | - case OpenAIReasoningEffort.Low: |
169 | | - reasoningEffortAsString = "low"; |
170 | | - break; |
171 | | - case OpenAIReasoningEffort.Medium: |
172 | | - reasoningEffortAsString = "medium"; |
173 | | - break; |
174 | | - case OpenAIReasoningEffort.High: |
175 | | - reasoningEffortAsString = "high"; |
176 | | - break; |
177 | | - case OpenAIReasoningEffort.ExtraHigh: |
178 | | - reasoningEffortAsString = "xhigh"; |
179 | | - break; |
180 | | - } |
181 | | - |
182 | | - if (!string.IsNullOrWhiteSpace(reasoningEffortAsString) && !OpenAIChatModels.NonReasoningModels.Contains(options.Model)) |
183 | | - { |
184 | | - anyOptionsSet = true; |
185 | | - |
186 | | - switch (options.ClientType) |
187 | | - { |
188 | | - case ClientType.ChatClient: |
189 | | - chatOptions = chatOptions.WithOpenAIChatClientReasoning(new ChatReasoningEffortLevel(reasoningEffortAsString)); |
190 | | - break; |
191 | | - case ClientType.ResponsesApi: |
192 | | - switch (options.ReasoningSummaryVerbosity) |
193 | | - { |
194 | | - case OpenAIReasoningSummaryVerbosity.Auto: |
195 | | - chatOptions = chatOptions.WithOpenAIResponsesApiReasoning(new ResponseReasoningEffortLevel(reasoningEffortAsString), ResponseReasoningSummaryVerbosity.Auto); |
196 | | - break; |
197 | | - case OpenAIReasoningSummaryVerbosity.Concise: |
198 | | - chatOptions = chatOptions.WithOpenAIResponsesApiReasoning(new ResponseReasoningEffortLevel(reasoningEffortAsString), ResponseReasoningSummaryVerbosity.Concise); |
199 | | - break; |
200 | | - case OpenAIReasoningSummaryVerbosity.Detailed: |
201 | | - chatOptions = chatOptions.WithOpenAIResponsesApiReasoning(new ResponseReasoningEffortLevel(reasoningEffortAsString), ResponseReasoningSummaryVerbosity.Detailed); |
202 | | - break; |
203 | | - case null: |
204 | | - chatOptions = chatOptions.WithOpenAIResponsesApiReasoning(new ResponseReasoningEffortLevel(reasoningEffortAsString)); |
205 | | - break; |
206 | | - } |
207 | | - |
208 | | - break; |
209 | | - case null: |
210 | | - chatOptions = Connection.DefaultClientType switch |
211 | | - { |
212 | | - ClientType.ChatClient => chatOptions.WithOpenAIChatClientReasoning(new ChatReasoningEffortLevel(reasoningEffortAsString)), |
213 | | - ClientType.ResponsesApi => options.ReasoningSummaryVerbosity switch |
214 | | - { |
215 | | - OpenAIReasoningSummaryVerbosity.Auto => chatOptions.WithOpenAIResponsesApiReasoning(new ResponseReasoningEffortLevel(reasoningEffortAsString), ResponseReasoningSummaryVerbosity.Auto), |
216 | | - OpenAIReasoningSummaryVerbosity.Concise => chatOptions.WithOpenAIResponsesApiReasoning(new ResponseReasoningEffortLevel(reasoningEffortAsString), ResponseReasoningSummaryVerbosity.Concise), |
217 | | - OpenAIReasoningSummaryVerbosity.Detailed => chatOptions.WithOpenAIResponsesApiReasoning(new ResponseReasoningEffortLevel(reasoningEffortAsString), ResponseReasoningSummaryVerbosity.Detailed), |
218 | | - null => chatOptions.WithOpenAIResponsesApiReasoning(new ResponseReasoningEffortLevel(reasoningEffortAsString)), |
219 | | - _ => chatOptions |
220 | | - }, |
221 | | - _ => throw new ArgumentOutOfRangeException() |
222 | | - }; |
223 | | - |
224 | | - break; |
225 | | - default: |
226 | | - throw new ArgumentOutOfRangeException(); |
227 | | - } |
228 | | - } |
229 | | - |
230 | | - ChatClientAgentOptions chatClientAgentOptions = new() |
231 | | - { |
232 | | - Name = options.Name, |
233 | | - Description = options.Description, |
234 | | - Id = options.Id, |
235 | | - AIContextProviderFactory = options.AIContextProviderFactory, |
236 | | - ChatMessageStoreFactory = options.ChatMessageStoreFactory, |
237 | | - }; |
238 | | - if (anyOptionsSet) |
239 | | - { |
240 | | - chatClientAgentOptions.ChatOptions = chatOptions; |
241 | | - } |
242 | | - |
243 | | - options.AdditionalChatClientAgentOptions?.Invoke(chatClientAgentOptions); |
244 | | - |
245 | | - return chatClientAgentOptions; |
| 85 | + AzureOpenAIClient client = Connection.GetClient(options.RawHttpCallDetails); |
| 86 | + ChatClientAgent innerAgent = OpenAIAgentFactory.GetChatClientAgent(options, client, options.Model, Connection.DefaultClientType); |
| 87 | + return new AzureOpenAIAgent(MiddlewareHelper.ApplyMiddleware( |
| 88 | + innerAgent, |
| 89 | + options.RawToolCallDetails, |
| 90 | + options.ToolCallingMiddleware, |
| 91 | + options.OpenTelemetryMiddleware, |
| 92 | + options.LoggingMiddleware, |
| 93 | + options.Services)); |
246 | 94 | } |
247 | 95 | } |
0 commit comments