Skip to content

Commit c54d107

Browse files
committed
Add protocol method support for Conversations API
1 parent a9c80c4 commit c54d107

24 files changed

+15406
-11734
lines changed

api/OpenAI.net8.0.cs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public class OpenAIClient {
2020
public virtual ChatClient GetChatClient(string model);
2121
[Experimental("OPENAI001")]
2222
public virtual ContainerClient GetContainerClient();
23+
[Experimental("OPENAI001")]
24+
public virtual ConversationClient GetConversationClient();
2325
public virtual EmbeddingClient GetEmbeddingClient(string model);
2426
[Experimental("OPENAI001")]
2527
public virtual EvaluationClient GetEvaluationClient();
@@ -2596,6 +2598,59 @@ public class DeleteContainerResponse : IJsonModel<DeleteContainerResponse>, IPer
25962598
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
25972599
}
25982600
}
2601+
namespace OpenAI.Conversations {
2602+
[Experimental("OPENAI001")]
2603+
public class ConversationClient {
2604+
protected ConversationClient();
2605+
public ConversationClient(ApiKeyCredential credential, OpenAIClientOptions options);
2606+
public ConversationClient(ApiKeyCredential credential);
2607+
public ConversationClient(AuthenticationPolicy authenticationPolicy, OpenAIClientOptions options);
2608+
public ConversationClient(AuthenticationPolicy authenticationPolicy);
2609+
protected internal ConversationClient(ClientPipeline pipeline, OpenAIClientOptions options);
2610+
public ConversationClient(string apiKey);
2611+
[Experimental("OPENAI001")]
2612+
public Uri Endpoint { get; }
2613+
public ClientPipeline Pipeline { get; }
2614+
public virtual ClientResult CreateConversation(BinaryContent content, RequestOptions options = null);
2615+
public virtual Task<ClientResult> CreateConversationAsync(BinaryContent content, RequestOptions options = null);
2616+
public virtual ClientResult CreateConversationItems(string conversationId, BinaryContent content, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2617+
public virtual Task<ClientResult> CreateConversationItemsAsync(string conversationId, BinaryContent content, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2618+
public virtual ClientResult DeleteConversation(string conversationId, RequestOptions options = null);
2619+
public virtual Task<ClientResult> DeleteConversationAsync(string conversationId, RequestOptions options = null);
2620+
public virtual ClientResult DeleteConversationItem(string conversationId, string itemId, RequestOptions options = null);
2621+
public virtual Task<ClientResult> DeleteConversationItemAsync(string conversationId, string itemId, RequestOptions options = null);
2622+
public virtual ClientResult GetConversation(string conversationId, RequestOptions options = null);
2623+
public virtual Task<ClientResult> GetConversationAsync(string conversationId, RequestOptions options = null);
2624+
public virtual ClientResult GetConversationItem(string conversationId, string itemId, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2625+
public virtual Task<ClientResult> GetConversationItemAsync(string conversationId, string itemId, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2626+
public virtual ClientResult GetConversationItems(string conversationId, long? limit = null, string order = null, string after = null, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2627+
public virtual Task<ClientResult> GetConversationItemsAsync(string conversationId, long? limit = null, string order = null, string after = null, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2628+
public virtual ClientResult UpdateConversation(string conversationId, BinaryContent content, RequestOptions options = null);
2629+
public virtual Task<ClientResult> UpdateConversationAsync(string conversationId, BinaryContent content, RequestOptions options = null);
2630+
}
2631+
[Experimental("OPENAI001")]
2632+
public readonly partial struct IncludedConversationItemProperty : IEquatable<IncludedConversationItemProperty> {
2633+
public IncludedConversationItemProperty(string value);
2634+
public static IncludedConversationItemProperty CodeInterpreterCallOutputs { get; }
2635+
public static IncludedConversationItemProperty ComputerCallOutputImageUri { get; }
2636+
public static IncludedConversationItemProperty FileSearchCallResults { get; }
2637+
public static IncludedConversationItemProperty MessageInputImageUri { get; }
2638+
public static IncludedConversationItemProperty MessageOutputTextLogprobs { get; }
2639+
public static IncludedConversationItemProperty ReasoningEncryptedContent { get; }
2640+
public static IncludedConversationItemProperty WebSearchCallActionSources { get; }
2641+
public static IncludedConversationItemProperty WebSearchCallResults { get; }
2642+
public readonly bool Equals(IncludedConversationItemProperty other);
2643+
[EditorBrowsable(EditorBrowsableState.Never)]
2644+
public override readonly bool Equals(object obj);
2645+
[EditorBrowsable(EditorBrowsableState.Never)]
2646+
public override readonly int GetHashCode();
2647+
public static bool operator ==(IncludedConversationItemProperty left, IncludedConversationItemProperty right);
2648+
public static implicit operator IncludedConversationItemProperty(string value);
2649+
public static implicit operator IncludedConversationItemProperty?(string value);
2650+
public static bool operator !=(IncludedConversationItemProperty left, IncludedConversationItemProperty right);
2651+
public override readonly string ToString();
2652+
}
2653+
}
25992654
namespace OpenAI.Embeddings {
26002655
public class EmbeddingClient {
26012656
protected EmbeddingClient();
@@ -5792,6 +5847,7 @@ public class ResponseItem : IJsonModel<ResponseItem>, IPersistableModel<Response
57925847
public static WebSearchCallResponseItem CreateWebSearchCallItem();
57935848
protected virtual ResponseItem JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
57945849
protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
5850+
public static explicit operator ResponseItem(ClientResult result);
57955851
protected virtual ResponseItem PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
57965852
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
57975853
}

api/OpenAI.netstandard2.0.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class OpenAIClient {
1414
public virtual BatchClient GetBatchClient();
1515
public virtual ChatClient GetChatClient(string model);
1616
public virtual ContainerClient GetContainerClient();
17+
public virtual ConversationClient GetConversationClient();
1718
public virtual EmbeddingClient GetEmbeddingClient(string model);
1819
public virtual EvaluationClient GetEvaluationClient();
1920
public virtual FineTuningClient GetFineTuningClient();
@@ -2233,6 +2234,56 @@ public class DeleteContainerResponse : IJsonModel<DeleteContainerResponse>, IPer
22332234
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
22342235
}
22352236
}
2237+
namespace OpenAI.Conversations {
2238+
public class ConversationClient {
2239+
protected ConversationClient();
2240+
public ConversationClient(ApiKeyCredential credential, OpenAIClientOptions options);
2241+
public ConversationClient(ApiKeyCredential credential);
2242+
public ConversationClient(AuthenticationPolicy authenticationPolicy, OpenAIClientOptions options);
2243+
public ConversationClient(AuthenticationPolicy authenticationPolicy);
2244+
protected internal ConversationClient(ClientPipeline pipeline, OpenAIClientOptions options);
2245+
public ConversationClient(string apiKey);
2246+
public Uri Endpoint { get; }
2247+
public ClientPipeline Pipeline { get; }
2248+
public virtual ClientResult CreateConversation(BinaryContent content, RequestOptions options = null);
2249+
public virtual Task<ClientResult> CreateConversationAsync(BinaryContent content, RequestOptions options = null);
2250+
public virtual ClientResult CreateConversationItems(string conversationId, BinaryContent content, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2251+
public virtual Task<ClientResult> CreateConversationItemsAsync(string conversationId, BinaryContent content, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2252+
public virtual ClientResult DeleteConversation(string conversationId, RequestOptions options = null);
2253+
public virtual Task<ClientResult> DeleteConversationAsync(string conversationId, RequestOptions options = null);
2254+
public virtual ClientResult DeleteConversationItem(string conversationId, string itemId, RequestOptions options = null);
2255+
public virtual Task<ClientResult> DeleteConversationItemAsync(string conversationId, string itemId, RequestOptions options = null);
2256+
public virtual ClientResult GetConversation(string conversationId, RequestOptions options = null);
2257+
public virtual Task<ClientResult> GetConversationAsync(string conversationId, RequestOptions options = null);
2258+
public virtual ClientResult GetConversationItem(string conversationId, string itemId, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2259+
public virtual Task<ClientResult> GetConversationItemAsync(string conversationId, string itemId, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2260+
public virtual ClientResult GetConversationItems(string conversationId, long? limit = null, string order = null, string after = null, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2261+
public virtual Task<ClientResult> GetConversationItemsAsync(string conversationId, long? limit = null, string order = null, string after = null, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2262+
public virtual ClientResult UpdateConversation(string conversationId, BinaryContent content, RequestOptions options = null);
2263+
public virtual Task<ClientResult> UpdateConversationAsync(string conversationId, BinaryContent content, RequestOptions options = null);
2264+
}
2265+
public readonly partial struct IncludedConversationItemProperty : IEquatable<IncludedConversationItemProperty> {
2266+
public IncludedConversationItemProperty(string value);
2267+
public static IncludedConversationItemProperty CodeInterpreterCallOutputs { get; }
2268+
public static IncludedConversationItemProperty ComputerCallOutputImageUri { get; }
2269+
public static IncludedConversationItemProperty FileSearchCallResults { get; }
2270+
public static IncludedConversationItemProperty MessageInputImageUri { get; }
2271+
public static IncludedConversationItemProperty MessageOutputTextLogprobs { get; }
2272+
public static IncludedConversationItemProperty ReasoningEncryptedContent { get; }
2273+
public static IncludedConversationItemProperty WebSearchCallActionSources { get; }
2274+
public static IncludedConversationItemProperty WebSearchCallResults { get; }
2275+
public readonly bool Equals(IncludedConversationItemProperty other);
2276+
[EditorBrowsable(EditorBrowsableState.Never)]
2277+
public override readonly bool Equals(object obj);
2278+
[EditorBrowsable(EditorBrowsableState.Never)]
2279+
public override readonly int GetHashCode();
2280+
public static bool operator ==(IncludedConversationItemProperty left, IncludedConversationItemProperty right);
2281+
public static implicit operator IncludedConversationItemProperty(string value);
2282+
public static implicit operator IncludedConversationItemProperty?(string value);
2283+
public static bool operator !=(IncludedConversationItemProperty left, IncludedConversationItemProperty right);
2284+
public override readonly string ToString();
2285+
}
2286+
}
22362287
namespace OpenAI.Embeddings {
22372288
public class EmbeddingClient {
22382289
protected EmbeddingClient();
@@ -5084,6 +5135,7 @@ public class ResponseItem : IJsonModel<ResponseItem>, IPersistableModel<Response
50845135
public static WebSearchCallResponseItem CreateWebSearchCallItem();
50855136
protected virtual ResponseItem JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
50865137
protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
5138+
public static explicit operator ResponseItem(ClientResult result);
50875139
protected virtual ResponseItem PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
50885140
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
50895141
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using NUnit.Framework;
2+
using OpenAI.Conversations;
3+
using System;
4+
using System.ClientModel;
5+
using System.Text.Json;
6+
7+
namespace OpenAI.Examples;
8+
9+
// This example uses experimental APIs which are subject to change. To use experimental APIs,
10+
// please acknowledge their experimental status by suppressing the corresponding warning.
11+
#pragma warning disable OPENAI001
12+
13+
public partial class ConversationExamples
14+
{
15+
[Test]
16+
public void Example01_ConversationProtocol()
17+
{
18+
ConversationClient client = new(Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
19+
20+
BinaryData createConversationParameters = BinaryData.FromBytes("""
21+
{
22+
"metadata": { "topic": "test" },
23+
"items": [
24+
{
25+
"type": "message",
26+
"role": "user",
27+
"content": "Say 'this is a test.'"
28+
}
29+
]
30+
}
31+
"""u8.ToArray());
32+
33+
using BinaryContent createConversationRequestContent = BinaryContent.Create(createConversationParameters);
34+
ClientResult createConversationResult = client.CreateConversation(createConversationRequestContent);
35+
using JsonDocument createConversationResultAsJson = JsonDocument.Parse(createConversationResult.GetRawResponse().Content.ToString());
36+
string conversationId = createConversationResultAsJson.RootElement
37+
.GetProperty("id"u8)
38+
.GetString();
39+
40+
Console.WriteLine($"Conversation created. Conversation ID: {conversationId}");
41+
Console.WriteLine();
42+
43+
ClientResult getConversationItemsResult = client.GetConversationItems(conversationId);
44+
using JsonDocument getConversationItemsResultAsJson = JsonDocument.Parse(getConversationItemsResult.GetRawResponse().Content.ToString());
45+
string messageId = getConversationItemsResultAsJson.RootElement
46+
.GetProperty("data"u8)[0]
47+
.GetProperty("id"u8)
48+
.ToString();
49+
50+
Console.WriteLine($"Message retrieved. Message ID: {messageId}");
51+
Console.WriteLine();
52+
53+
ClientResult deleteConversationResult = client.DeleteConversation(conversationId);
54+
using JsonDocument deleteConversationResultAsJson = JsonDocument.Parse(deleteConversationResult.GetRawResponse().Content.ToString());
55+
bool deleted = deleteConversationResultAsJson.RootElement
56+
.GetProperty("deleted"u8)
57+
.GetBoolean();
58+
59+
Console.WriteLine($"Conversation deleted: {deleted}");
60+
Console.WriteLine();
61+
}
62+
}
63+
64+
#pragma warning restore OPENAI001
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using NUnit.Framework;
2+
using OpenAI.Conversations;
3+
using System;
4+
using System.ClientModel;
5+
using System.Text.Json;
6+
using System.Threading.Tasks;
7+
8+
namespace OpenAI.Examples;
9+
10+
// This example uses experimental APIs which are subject to change. To use experimental APIs,
11+
// please acknowledge their experimental status by suppressing the corresponding warning.
12+
#pragma warning disable OPENAI001
13+
14+
public partial class ConversationExamples
15+
{
16+
[Test]
17+
public async Task Example01_ConversationProtocolAsync()
18+
{
19+
ConversationClient client = new(Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
20+
21+
BinaryData createConversationParameters = BinaryData.FromBytes("""
22+
{
23+
"metadata": { "topic": "test" },
24+
"items": [
25+
{
26+
"type": "message",
27+
"role": "user",
28+
"content": "Say 'this is a test.'"
29+
}
30+
]
31+
}
32+
"""u8.ToArray());
33+
34+
using BinaryContent createConversationRequestContent = BinaryContent.Create(createConversationParameters);
35+
ClientResult createConversationResult = await client.CreateConversationAsync(createConversationRequestContent);
36+
using JsonDocument createConversationResultAsJson = JsonDocument.Parse(createConversationResult.GetRawResponse().Content.ToString());
37+
string conversationId = createConversationResultAsJson.RootElement
38+
.GetProperty("id"u8)
39+
.GetString();
40+
41+
Console.WriteLine($"Conversation created. Conversation ID: {conversationId}");
42+
Console.WriteLine();
43+
44+
ClientResult getConversationItemsResult = await client.GetConversationItemsAsync(conversationId);
45+
using JsonDocument getConversationItemsResultAsJson = JsonDocument.Parse(getConversationItemsResult.GetRawResponse().Content.ToString());
46+
string messageId = getConversationItemsResultAsJson.RootElement
47+
.GetProperty("data"u8)[0]
48+
.GetProperty("id"u8)
49+
.ToString();
50+
51+
Console.WriteLine($"Message retrieved. Message ID: {messageId}");
52+
Console.WriteLine();
53+
54+
ClientResult deleteConversationResult = await client.DeleteConversationAsync(conversationId);
55+
using JsonDocument deleteConversationResultAsJson = JsonDocument.Parse(deleteConversationResult.GetRawResponse().Content.ToString());
56+
bool deleted = deleteConversationResultAsJson.RootElement
57+
.GetProperty("deleted"u8)
58+
.GetBoolean();
59+
60+
Console.WriteLine($"Conversation deleted: {deleted}");
61+
Console.WriteLine();
62+
}
63+
}
64+
65+
#pragma warning restore OPENAI001

examples/OpenAI.Examples.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<TargetFramework>net9.0</TargetFramework>
44

examples/Videos/Example01_VideoCreation.cs renamed to examples/Videos/Example01_VideoCreationProtocol.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace OpenAI.Examples;
1616
public partial class VideoExamples
1717
{
1818
[Test]
19-
public void Example01_VideoCreation()
19+
public void Example01_VideoCreationProtocol()
2020
{
2121
// 1) Create the client
2222
VideoClient client = new(new ApiKeyCredential(Environment.GetEnvironmentVariable("OPENAI_API_KEY")));

examples/Videos/Example01_VideoCreationAsync.cs renamed to examples/Videos/Example01_VideoCreationProtocolAsync.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace OpenAI.Examples;
1717
public partial class VideoExamples
1818
{
1919
[Test]
20-
public async Task Example01_VideoCreationAsync()
20+
public async Task Example01_VideoCreationProtocolAsync()
2121
{
2222
// 1) Create the client
2323
VideoClient client = new(new ApiKeyCredential(Environment.GetEnvironmentVariable("OPENAI_API_KEY")));

scripts/Export-Api.ps1

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ function Invoke-GenAPI {
261261
$content = $content -creplace "Chat\.", ""
262262
$content = $content -creplace "Common\.", ""
263263
$content = $content -creplace "Containers\.", ""
264+
$content = $content -creplace "Conversations\.", ""
264265
$content = $content -creplace "Embeddings\.", ""
265266
$content = $content -creplace "Evals\.", ""
266267
$content = $content -creplace "Files\.", ""
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import "./models.tsp";
2+
import "./operations.tsp";

0 commit comments

Comments
 (0)