Skip to content

Commit 5d1e125

Browse files
committed
Fix AOT errors
1 parent 60f496b commit 5d1e125

File tree

3 files changed

+24
-22
lines changed

3 files changed

+24
-22
lines changed

src/api/Elastic.Documentation.Api.Core/AskAi/AskAiUsecase.cs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// See the LICENSE file in the project root for more information
44

55
using System.Diagnostics;
6+
using System.Text.Json;
7+
using Elastic.Documentation.Api.Core;
68
using Microsoft.Extensions.Logging;
79

810
namespace Elastic.Documentation.Api.Core.AskAi;
@@ -21,18 +23,11 @@ public async Task<Stream> AskAi(AskAiRequest askAiRequest, Cancel ctx)
2123
_ = activity?.SetTag("gen_ai.operation.name", "chat");
2224
_ = activity?.SetTag("gen_ai.provider.name", streamTransformer.AgentProvider); // agent-builder or llm-gateway
2325
_ = activity?.SetTag("gen_ai.agent.id", streamTransformer.AgentId); // docs-agent or docs_assistant
24-
var inputMessages = new object[]
26+
var inputMessages = new[]
2527
{
26-
new
27-
{
28-
role = "user",
29-
parts = new object[]
30-
{
31-
new { type = "text", content = askAiRequest.Message }
32-
}
33-
}
28+
new InputMessage("user", [new MessagePart("text", askAiRequest.Message)])
3429
};
35-
var inputMessagesJson = System.Text.Json.JsonSerializer.Serialize(inputMessages);
30+
var inputMessagesJson = JsonSerializer.Serialize(inputMessages, ApiJsonContext.Default.InputMessageArray);
3631
_ = activity?.SetTag("gen_ai.input.messages", inputMessagesJson);
3732
logger.LogInformation("Streaming AskAI response");
3833
var rawStream = await askAiGateway.AskAi(askAiRequest, ctx);

src/api/Elastic.Documentation.Api.Core/SerializationContext.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,21 @@
88

99
namespace Elastic.Documentation.Api.Core;
1010

11+
/// <summary>
12+
/// Types for OpenTelemetry telemetry serialization (AOT-compatible)
13+
/// </summary>
14+
public record MessagePart(string Type, string Content);
15+
16+
public record InputMessage(string Role, MessagePart[] Parts);
17+
18+
public record OutputMessage(string Role, MessagePart[] Parts, string FinishReason);
1119

1220
[JsonSerializable(typeof(AskAiRequest))]
1321
[JsonSerializable(typeof(SearchRequest))]
1422
[JsonSerializable(typeof(SearchResponse))]
23+
[JsonSerializable(typeof(InputMessage))]
24+
[JsonSerializable(typeof(OutputMessage))]
25+
[JsonSerializable(typeof(MessagePart))]
26+
[JsonSerializable(typeof(InputMessage[]))]
1527
[JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase)]
1628
public partial class ApiJsonContext : JsonSerializerContext;

src/api/Elastic.Documentation.Api.Infrastructure/Adapters/AskAi/StreamTransformerBase.cs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Runtime.CompilerServices;
99
using System.Text;
1010
using System.Text.Json;
11+
using Elastic.Documentation.Api.Core;
1112
using Elastic.Documentation.Api.Core.AskAi;
1213
using Microsoft.Extensions.Logging;
1314

@@ -144,6 +145,7 @@ private async Task ProcessStreamAsync(PipeReader reader, PipeWriter writer, Acti
144145
{
145146
using var activity = StreamTransformerActivitySource.StartActivity("transform_stream");
146147
var result = new StreamProcessingResult();
148+
List<MessagePart> outputMessageParts = [];
147149
await foreach (var sseEvent in ParseSseEventsAsync(reader, cancellationToken))
148150
{
149151
AskAiEvent? transformedEvent = null;
@@ -181,8 +183,6 @@ private async Task ProcessStreamAsync(PipeReader reader, PipeWriter writer, Acti
181183
if (transformedEvent == null)
182184
continue;
183185

184-
List<object> outputMessageParts = [];
185-
186186
switch (transformedEvent)
187187
{
188188
case AskAiEvent.ConversationStart conversationStart:
@@ -195,8 +195,7 @@ private async Task ProcessStreamAsync(PipeReader reader, PipeWriter writer, Acti
195195
case AskAiEvent.Reasoning reasoning:
196196
{
197197
_ = activity?.AddEvent(new ActivityEvent("conversation_start"));
198-
outputMessageParts.Add((type: "reasoning", content: reasoning.Message));
199-
198+
outputMessageParts.Add(new MessagePart("reasoning", reasoning.Message ?? string.Empty));
200199
break;
201200
}
202201
case AskAiEvent.Chunk:
@@ -234,14 +233,10 @@ private async Task ProcessStreamAsync(PipeReader reader, PipeWriter writer, Acti
234233
}
235234
case AskAiEvent.ChunkComplete chunkComplete:
236235
{
237-
var parts = outputMessageParts.Prepend((type: "text", content: chunkComplete.FullContent)).ToArray();
238-
var outputMessages = new
239-
{
240-
role = "assistant",
241-
parts,
242-
finish_reason = "stop"
243-
};
244-
_ = activity?.SetTag("gen_ai.output.messages", JsonSerializer.Serialize(outputMessages));
236+
var parts = outputMessageParts.Prepend(new MessagePart("text", chunkComplete.FullContent)).ToArray();
237+
var outputMessages = new OutputMessage("assistant", parts, "stop");
238+
_ = activity?.SetTag("gen_ai.output.messages", JsonSerializer.Serialize(outputMessages, ApiJsonContext.Default.OutputMessage));
239+
_ = activity?.AddEvent(new ActivityEvent("message_chunk_complete"));
245240
break;
246241
}
247242
case AskAiEvent.ConversationEnd:

0 commit comments

Comments
 (0)