Skip to content

Commit e0ca1a8

Browse files
committed
Enhance stored prompt handling by adding variable support and improving JSON serialization
1 parent aa6e1d7 commit e0ca1a8

File tree

3 files changed

+65
-4
lines changed

3 files changed

+65
-4
lines changed

examples/Responses/Example03_StoredPrompts.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using NUnit.Framework;
22
using OpenAI.Responses;
33
using System;
4+
using System.Collections.Generic;
45

56
namespace OpenAI.Examples;
67

@@ -25,7 +26,9 @@ public void Example03_StoredPrompts()
2526
options.Prompt.Variables["location"] = "San Francisco";
2627
options.Prompt.Variables["unit"] = "celsius";
2728

28-
OpenAIResponse response = client.CreateResponse([], options);
29+
// Use stored prompt with variables
30+
IEnumerable<ResponseItem> inputItems = Array.Empty<ResponseItem>();
31+
OpenAIResponse response = client.CreateResponse(inputItems, options);
2932

3033
Console.WriteLine($"[ASSISTANT]: {response.GetOutputText()}");
3134
}

examples/Responses/Example03_StoredPromptsAsync.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using NUnit.Framework;
22
using OpenAI.Responses;
33
using System;
4+
using System.Collections.Generic;
45
using System.Threading.Tasks;
56

67
namespace OpenAI.Examples;
@@ -26,7 +27,9 @@ public async Task Example03_StoredPromptsAsync()
2627
options.Prompt.Variables["location"] = "San Francisco";
2728
options.Prompt.Variables["unit"] = "celsius";
2829

29-
OpenAIResponse response = await client.CreateResponseAsync([], options);
30+
// Use stored prompt with variables
31+
IEnumerable<ResponseItem> inputItems = Array.Empty<ResponseItem>();
32+
OpenAIResponse response = await client.CreateResponseAsync(inputItems, options);
3033

3134
Console.WriteLine($"[ASSISTANT]: {response.GetOutputText()}");
3235
}

src/Custom/Responses/ResponsePrompt.Serialization.cs

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,51 @@ internal static void SerializeResponsePrompt(ResponsePrompt instance, Utf8JsonWr
4444
foreach (var variable in instance.Variables)
4545
{
4646
writer.WritePropertyName(variable.Key);
47-
JsonSerializer.Serialize(writer, variable.Value, options.Format == "W" ? null : (JsonSerializerOptions)null);
47+
if (variable.Value is JsonElement element)
48+
{
49+
#if NET6_0_OR_GREATER
50+
writer.WriteRawValue(element.GetRawText());
51+
#else
52+
using JsonDocument document = JsonDocument.Parse(element.GetRawText());
53+
JsonSerializer.Serialize(writer, document.RootElement);
54+
#endif
55+
}
56+
else if (variable.Value != null)
57+
{
58+
// Handle primitive types directly
59+
switch (variable.Value)
60+
{
61+
case string str:
62+
writer.WriteStringValue(str);
63+
break;
64+
case int intVal:
65+
writer.WriteNumberValue(intVal);
66+
break;
67+
case long longVal:
68+
writer.WriteNumberValue(longVal);
69+
break;
70+
case float floatVal:
71+
writer.WriteNumberValue(floatVal);
72+
break;
73+
case double doubleVal:
74+
writer.WriteNumberValue(doubleVal);
75+
break;
76+
case decimal decimalVal:
77+
writer.WriteNumberValue(decimalVal);
78+
break;
79+
case bool boolVal:
80+
writer.WriteBooleanValue(boolVal);
81+
break;
82+
default:
83+
// For other types, write as string value
84+
writer.WriteStringValue(variable.Value.ToString());
85+
break;
86+
}
87+
}
88+
else
89+
{
90+
writer.WriteNullValue();
91+
}
4892
}
4993
writer.WriteEndObject();
5094
}
@@ -77,7 +121,17 @@ internal static ResponsePrompt DeserializeResponsePrompt(JsonElement element, Mo
77121
{
78122
foreach (var variable in property.Value.EnumerateObject())
79123
{
80-
variables[variable.Name] = JsonSerializer.Deserialize<object>(variable.Value.GetRawText());
124+
// Handle different JSON value types appropriately
125+
object value = variable.Value.ValueKind switch
126+
{
127+
JsonValueKind.String => variable.Value.GetString(),
128+
JsonValueKind.Number => variable.Value.TryGetInt32(out int intVal) ? intVal : variable.Value.GetDouble(),
129+
JsonValueKind.True => true,
130+
JsonValueKind.False => false,
131+
JsonValueKind.Null => null,
132+
_ => variable.Value.GetRawText() // For objects/arrays, store as raw JSON string
133+
};
134+
variables[variable.Name] = value;
81135
}
82136
}
83137
}
@@ -86,6 +140,7 @@ internal static ResponsePrompt DeserializeResponsePrompt(JsonElement element, Mo
86140
result.Id = id;
87141
result.Version = version;
88142

143+
// Add variables to the existing dictionary (Variables property is get-only)
89144
if (variables.Count > 0)
90145
{
91146
foreach (var variable in variables)

0 commit comments

Comments
 (0)