Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Add serialization/deserialization example with chat completions
  • Loading branch information
joseharriaga committed Sep 21, 2024
commit 4eb919daf2b274f24c2186724b28e4c938724da8
4 changes: 2 additions & 2 deletions examples/Chat/Example03_FunctionCalling.cs
Original file line number Diff line number Diff line change
Expand Up @@ -151,9 +151,9 @@ public void Example03_FunctionCalling()
#endregion

#region
foreach (ChatMessage requestMessage in messages)
foreach (ChatMessage message in messages)
{
switch (requestMessage)
switch (message)
{
case SystemChatMessage systemMessage:
Console.WriteLine($"[SYSTEM]:");
Expand Down
4 changes: 2 additions & 2 deletions examples/Chat/Example03_FunctionCallingAsync.cs
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,9 @@ public async Task Example03_FunctionCallingAsync()
#endregion

#region
foreach (ChatMessage requestMessage in messages)
foreach (ChatMessage message in messages)
{
switch (requestMessage)
switch (message)
{
case SystemChatMessage systemMessage:
Console.WriteLine($"[SYSTEM]:");
Expand Down
4 changes: 2 additions & 2 deletions examples/Chat/Example04_FunctionCallingStreaming.cs
Original file line number Diff line number Diff line change
Expand Up @@ -172,9 +172,9 @@ StringBuilder argumentsBuilder
#endregion

#region
foreach (ChatMessage requestMessage in messages)
foreach (ChatMessage message in messages)
{
switch (requestMessage)
switch (message)
{
case SystemChatMessage systemMessage:
Console.WriteLine($"[SYSTEM]:");
Expand Down
4 changes: 2 additions & 2 deletions examples/Chat/Example04_FunctionCallingStreamingAsync.cs
Original file line number Diff line number Diff line change
Expand Up @@ -173,9 +173,9 @@ StringBuilder argumentsBuilder
#endregion

#region
foreach (ChatMessage requestMessage in messages)
foreach (ChatMessage message in messages)
{
switch (requestMessage)
switch (message)
{
case SystemChatMessage systemMessage:
Console.WriteLine($"[SYSTEM]:");
Expand Down
102 changes: 102 additions & 0 deletions examples/Chat/Example06_ChatSerialization.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
using NUnit.Framework;
using OpenAI.Chat;
using System;
using System.ClientModel.Primitives;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.Json;

namespace OpenAI.Examples;

public partial class ChatExamples
{
#region
public static List<ChatMessage> DeserializeMessages(BinaryData data)
{
List<ChatMessage> messages = [];
using JsonDocument messagesAsJson = JsonDocument.Parse(data.ToString());

foreach (JsonElement jsonElement in messagesAsJson.RootElement.EnumerateArray())
{
BinaryData jsonElementAsData = BinaryData.FromString(jsonElement.ToString());
ChatMessage message = ModelReaderWriter.Read<ChatMessage>(jsonElementAsData, ModelReaderWriterOptions.Json);
messages.Add(message);
}

return messages;
}
#endregion

#region
public static BinaryData SerializeMessages(IEnumerable<ChatMessage> messages)
{
using MemoryStream stream = new();
using Utf8JsonWriter writer = new(stream);

writer.WriteStartArray();
foreach (ChatMessage message in messages)
{
(message as IJsonModel<ChatMessage>).Write(writer, ModelReaderWriterOptions.Json);
}
writer.WriteEndArray();
writer.Flush();

return BinaryData.FromBytes(stream.ToArray());
}
#endregion

[Test]
public void Example06_ChatSerialization()
{
ChatClient client = new("gpt-4o", Environment.GetEnvironmentVariable("OPENAI_API_KEY"));

BinaryData serializedData = BinaryData.FromBytes("""
[
{
"role": "user",
"content": "Who won the world series in 2020?"
},
{
"role": "assistant",
"content": "The Los Angeles Dodgers won the World Series in 2020."
},
{
"role": "user",
"content": "Where was it played?"
}
]
"""u8.ToArray());

List<ChatMessage> messages = DeserializeMessages(serializedData);

ChatCompletion completion = client.CompleteChat(messages);
messages.Add(new AssistantChatMessage(completion));

foreach (ChatMessage message in messages)
{
switch (message)
{
case UserChatMessage userMessage:
Console.WriteLine($"[USER]:");
break;

case AssistantChatMessage assistantMessage when assistantMessage.Content.Count > 0:
Console.WriteLine($"[ASSISTANT]:");
break;

default:
break;
}

Console.WriteLine($"{message.Content[0].Text}");
Console.WriteLine();
}

serializedData = SerializeMessages(messages);

Console.WriteLine("****************************************************");
Console.WriteLine();
Console.WriteLine(serializedData.ToString());
}
}
64 changes: 64 additions & 0 deletions examples/Chat/Example06_ChatSerializationAsync.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
using NUnit.Framework;
using OpenAI.Chat;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace OpenAI.Examples;

public partial class ChatExamples
{
[Test]
public async Task Example06_ChatSerializationAsync()
{
ChatClient client = new("gpt-4o", Environment.GetEnvironmentVariable("OPENAI_API_KEY"));

BinaryData serializedData = BinaryData.FromBytes("""
[
{
"role": "user",
"content": "Who won the world series in 2020?"
},
{
"role": "assistant",
"content": "The Los Angeles Dodgers won the World Series in 2020."
},
{
"role": "user",
"content": "Where was it played?"
}
]
"""u8.ToArray());

List<ChatMessage> messages = DeserializeMessages(serializedData);

ChatCompletion completion = await client.CompleteChatAsync(messages);
messages.Add(new AssistantChatMessage(completion));

foreach (ChatMessage message in messages)
{
switch (message)
{
case UserChatMessage userMessage:
Console.WriteLine($"[USER]:");
break;

case AssistantChatMessage assistantMessage when assistantMessage.Content.Count > 0:
Console.WriteLine($"[ASSISTANT]:");
break;

default:
break;
}

Console.WriteLine($"{message.Content[0].Text}");
Console.WriteLine();
}

serializedData = SerializeMessages(messages);

Console.WriteLine("****************************************************");
Console.WriteLine();
Console.WriteLine(serializedData.ToString());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace OpenAI.Examples;
public partial class ChatExamples
{
[Test]
public void Example06_SimpleChatProtocol()
public void Example07_SimpleChatProtocol()
{
ChatClient client = new("gpt-4o", Environment.GetEnvironmentVariable("OPENAI_API_KEY"));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace OpenAI.Examples;
public partial class ChatExamples
{
[Test]
public async Task Example06_SimpleChatProtocolAsync()
public async Task Example07_SimpleChatProtocolAsync()
{
ChatClient client = new("gpt-4o", Environment.GetEnvironmentVariable("OPENAI_API_KEY"));

Expand Down