Skip to content

Commit fb56de8

Browse files
added a model factory to responses
1 parent 0042302 commit fb56de8

File tree

3 files changed

+253
-2
lines changed

3 files changed

+253
-2
lines changed

src/Custom/Responses/Items/ReasoningResponseItem.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System.Collections.Generic;
2-
using System.Diagnostics.CodeAnalysis;
32
using System.Linq;
43

54
namespace OpenAI.Responses;
@@ -12,7 +11,7 @@ public partial class ReasoningResponseItem
1211
{
1312
// CUSTOM: Retain optionality of OpenAPI read-only property value
1413
[CodeGenMember("Status")]
15-
public ReasoningStatus? Status { get; }
14+
public ReasoningStatus? Status { get; internal set; }
1615

1716
// CUSTOM: Rename for collection clarity
1817
[CodeGenMember("Summary")]
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
namespace OpenAI.Responses;
6+
7+
/// <summary> Model factory for models. </summary>
8+
public static partial class OpenAIResponsesModelFactory
9+
{
10+
/// <summary> Initializes a new instance of <see cref="OpenAI.Responses.OpenAIResponse"/>. </summary>
11+
/// <returns> A new <see cref="OpenAI.Responses.OpenAIResponse"/> instance for mocking. </returns>
12+
public static OpenAIResponse OpenAIResponse(
13+
string id = null,
14+
DateTimeOffset createdAt = default,
15+
ResponseStatus? status = null,
16+
ResponseError error = null,
17+
ResponseTokenUsage usage = null,
18+
string endUserId = null,
19+
ResponseReasoningOptions reasoningOptions = null,
20+
int? maxOutputTokenCount = null,
21+
ResponseTextOptions textOptions = null,
22+
ResponseTruncationMode? truncationMode = null,
23+
ResponseIncompleteStatusDetails incompleteStatusDetails = null,
24+
IEnumerable<ResponseItem> outputItems = null,
25+
bool parallelToolCallsEnabled = default,
26+
ResponseToolChoice toolChoice = null,
27+
string model = null,
28+
IDictionary<string, string> metadata = null,
29+
float? temperature = null,
30+
float? topP = null,
31+
string previousResponseId = null,
32+
bool? background = null,
33+
string instructions = null,
34+
IEnumerable<ResponseTool> tools = null)
35+
{
36+
outputItems ??= new List<ResponseItem>();
37+
tools ??= new List<ResponseTool>();
38+
metadata ??= new Dictionary<string, string>();
39+
40+
return new OpenAIResponse(
41+
metadata: metadata,
42+
temperature: temperature,
43+
topP: topP,
44+
serviceTier: null,
45+
previousResponseId: previousResponseId,
46+
background: background,
47+
instructions: instructions,
48+
tools: tools.ToList(),
49+
id: id,
50+
status: status,
51+
createdAt: createdAt,
52+
error: error,
53+
usage: usage,
54+
endUserId: endUserId,
55+
reasoningOptions: reasoningOptions,
56+
maxOutputTokenCount: maxOutputTokenCount,
57+
textOptions: textOptions,
58+
truncationMode: truncationMode,
59+
incompleteStatusDetails: incompleteStatusDetails,
60+
outputItems: outputItems.ToList(),
61+
parallelToolCallsEnabled: parallelToolCallsEnabled,
62+
toolChoice: toolChoice,
63+
model: model,
64+
@object: "response",
65+
additionalBinaryDataProperties: null);
66+
}
67+
68+
/// <summary> Initializes a new instance of <see cref="OpenAI.Responses.MessageResponseItem"/>. </summary>
69+
/// <returns> A new <see cref="OpenAI.Responses.MessageResponseItem"/> instance for mocking. </returns>
70+
public static MessageResponseItem MessageResponseItem(
71+
string id = null,
72+
MessageRole role = MessageRole.Assistant,
73+
MessageStatus? status = null)
74+
{
75+
// Convert the public MessageRole to the internal role type
76+
InternalResponsesMessageRole internalRole = role.ToSerialString();
77+
78+
return new MessageResponseItem(
79+
id: id,
80+
internalRole: internalRole,
81+
status: status);
82+
}
83+
84+
/// <summary> Initializes a new instance of <see cref="OpenAI.Responses.ReasoningResponseItem"/>. </summary>
85+
/// <param name="id">The ID of the reasoning response item.</param>
86+
/// <param name="encryptedContent">The encrypted reasoning content.</param>
87+
/// <param name="status">The status of the reasoning response item.</param>
88+
/// <param name="summaryParts">The collection of summary parts.</param>
89+
/// <returns> A new <see cref="OpenAI.Responses.ReasoningResponseItem"/> instance for mocking. </returns>
90+
public static ReasoningResponseItem ReasoningResponseItem(
91+
string id = null,
92+
string encryptedContent = null,
93+
ReasoningStatus? status = null,
94+
IEnumerable<ReasoningSummaryPart> summaryParts = null)
95+
{
96+
summaryParts ??= new List<ReasoningSummaryPart>();
97+
98+
var item = new ReasoningResponseItem(
99+
kind: InternalItemType.Reasoning,
100+
id: id,
101+
additionalBinaryDataProperties: null,
102+
encryptedContent: encryptedContent,
103+
summaryParts: summaryParts.ToList());
104+
105+
item.Status = status;
106+
return item;
107+
}
108+
109+
/// <summary> Initializes a new instance of <see cref="OpenAI.Responses.ReasoningResponseItem"/> with summary text. </summary>
110+
/// <param name="id">The ID of the reasoning response item.</param>
111+
/// <param name="encryptedContent">The encrypted reasoning content.</param>
112+
/// <param name="status">The status of the reasoning response item.</param>
113+
/// <param name="summaryText">The summary text to create a ReasoningSummaryTextPart from.</param>
114+
/// <returns> A new <see cref="OpenAI.Responses.ReasoningResponseItem"/> instance for mocking. </returns>
115+
public static ReasoningResponseItem ReasoningResponseItem(
116+
string id = null,
117+
string encryptedContent = null,
118+
ReasoningStatus? status = null,
119+
string summaryText = null)
120+
{
121+
var summaryParts = !string.IsNullOrEmpty(summaryText)
122+
? new List<ReasoningSummaryPart> { new ReasoningSummaryTextPart(summaryText) }
123+
: new List<ReasoningSummaryPart>();
124+
125+
var item = new ReasoningResponseItem(
126+
kind: InternalItemType.Reasoning,
127+
id: id,
128+
additionalBinaryDataProperties: null,
129+
encryptedContent: encryptedContent,
130+
summaryParts: summaryParts);
131+
132+
item.Status = status;
133+
return item;
134+
}
135+
136+
/// <summary> Initializes a new instance of <see cref="OpenAI.Responses.ReferenceResponseItem"/>. </summary>
137+
/// <returns> A new <see cref="OpenAI.Responses.ReferenceResponseItem"/> instance for mocking. </returns>
138+
public static ReferenceResponseItem ReferenceResponseItem(
139+
string id = null)
140+
{
141+
return new ReferenceResponseItem(
142+
kind: InternalItemType.ItemReference,
143+
id: id,
144+
additionalBinaryDataProperties: null);
145+
}
146+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using NUnit.Framework;
5+
using OpenAI.Responses;
6+
7+
namespace OpenAI.Tests.Responses;
8+
9+
[Parallelizable(ParallelScope.All)]
10+
[Category("Responses")]
11+
[Category("Smoke")]
12+
public partial class OpenAIResponsesModelFactoryTests
13+
{
14+
[Test]
15+
public void OpenAIResponseWorks()
16+
{
17+
string id = "response_123";
18+
DateTimeOffset createdAt = DateTimeOffset.UtcNow;
19+
ResponseStatus status = ResponseStatus.Completed;
20+
string model = "gpt-4o";
21+
IEnumerable<ResponseItem> outputItems = [
22+
OpenAIResponsesModelFactory.MessageResponseItem(id: "msg_1", role: MessageRole.User, status: MessageStatus.Completed),
23+
OpenAIResponsesModelFactory.ReasoningResponseItem(id: "reason_1", encryptedContent: "encrypted", status: ReasoningStatus.InProgress, summaryText: "summary")
24+
];
25+
26+
OpenAIResponse response = OpenAIResponsesModelFactory.OpenAIResponse(
27+
id: id,
28+
createdAt: createdAt,
29+
status: status,
30+
model: model,
31+
outputItems: outputItems);
32+
33+
Assert.That(response.Id, Is.EqualTo(id));
34+
Assert.That(response.CreatedAt, Is.EqualTo(createdAt));
35+
Assert.That(response.Status, Is.EqualTo(status));
36+
Assert.That(response.Model, Is.EqualTo(model));
37+
Assert.That(response.OutputItems.SequenceEqual(outputItems), Is.True);
38+
}
39+
40+
[Test]
41+
public void MessageResponseItemWorks()
42+
{
43+
string id = "message_123";
44+
MessageRole role = MessageRole.Developer;
45+
MessageStatus status = MessageStatus.InProgress;
46+
47+
MessageResponseItem messageItem = OpenAIResponsesModelFactory.MessageResponseItem(
48+
id: id,
49+
role: role,
50+
status: status);
51+
52+
Assert.That(messageItem.Id, Is.EqualTo(id));
53+
Assert.That(messageItem.Role, Is.EqualTo(role));
54+
Assert.That(messageItem.Status, Is.EqualTo(status));
55+
}
56+
57+
[Test]
58+
public void ReasoningResponseItemWorks()
59+
{
60+
string id = "reasoning_123";
61+
string encryptedContent = "encrypted_reasoning_data";
62+
ReasoningStatus status = ReasoningStatus.Completed;
63+
var summaryParts = new List<ReasoningSummaryPart> { new ReasoningSummaryTextPart("test summary") };
64+
65+
ReasoningResponseItem reasoningItem = OpenAIResponsesModelFactory.ReasoningResponseItem(
66+
id: id,
67+
encryptedContent: encryptedContent,
68+
status: status,
69+
summaryParts: summaryParts);
70+
71+
Assert.That(reasoningItem.Id, Is.EqualTo(id));
72+
Assert.That(reasoningItem.EncryptedContent, Is.EqualTo(encryptedContent));
73+
Assert.That(reasoningItem.Status, Is.EqualTo(status));
74+
Assert.That(reasoningItem.SummaryParts.SequenceEqual(summaryParts), Is.True);
75+
}
76+
77+
[Test]
78+
public void ReasoningResponseItemWithSummaryTextWorks()
79+
{
80+
string id = "reasoning_456";
81+
string encryptedContent = "encrypted_data";
82+
ReasoningStatus status = ReasoningStatus.InProgress;
83+
string summaryText = "This is a reasoning summary";
84+
85+
ReasoningResponseItem reasoningItem = OpenAIResponsesModelFactory.ReasoningResponseItem(
86+
id: id,
87+
encryptedContent: encryptedContent,
88+
status: status,
89+
summaryText: summaryText);
90+
91+
Assert.That(reasoningItem.Id, Is.EqualTo(id));
92+
Assert.That(reasoningItem.EncryptedContent, Is.EqualTo(encryptedContent));
93+
Assert.That(reasoningItem.Status, Is.EqualTo(status));
94+
Assert.That(reasoningItem.GetSummaryText(), Is.EqualTo(summaryText));
95+
}
96+
97+
[Test]
98+
public void ReferenceResponseItemWorks()
99+
{
100+
string id = "reference_123";
101+
102+
ReferenceResponseItem referenceItem = OpenAIResponsesModelFactory.ReferenceResponseItem(id: id);
103+
104+
Assert.That(referenceItem.Id, Is.EqualTo(id));
105+
}
106+
}

0 commit comments

Comments
 (0)