Skip to content

Commit c312252

Browse files
committed
Add protocol method support for Conversations API
1 parent bef01b5 commit c312252

23 files changed

+15399
-11727
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();
@@ -2560,6 +2562,59 @@ public class DeleteContainerResponse : IJsonModel<DeleteContainerResponse>, IPer
25602562
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
25612563
}
25622564
}
2565+
namespace OpenAI.Conversations {
2566+
[Experimental("OPENAI001")]
2567+
public class ConversationClient {
2568+
protected ConversationClient();
2569+
public ConversationClient(ApiKeyCredential credential, OpenAIClientOptions options);
2570+
public ConversationClient(ApiKeyCredential credential);
2571+
public ConversationClient(AuthenticationPolicy authenticationPolicy, OpenAIClientOptions options);
2572+
public ConversationClient(AuthenticationPolicy authenticationPolicy);
2573+
protected internal ConversationClient(ClientPipeline pipeline, OpenAIClientOptions options);
2574+
public ConversationClient(string apiKey);
2575+
[Experimental("OPENAI001")]
2576+
public Uri Endpoint { get; }
2577+
public ClientPipeline Pipeline { get; }
2578+
public virtual ClientResult CreateConversation(BinaryContent content, RequestOptions options = null);
2579+
public virtual Task<ClientResult> CreateConversationAsync(BinaryContent content, RequestOptions options = null);
2580+
public virtual ClientResult CreateConversationItems(string conversationId, BinaryContent content, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2581+
public virtual Task<ClientResult> CreateConversationItemsAsync(string conversationId, BinaryContent content, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2582+
public virtual ClientResult DeleteConversation(string conversationId, RequestOptions options = null);
2583+
public virtual Task<ClientResult> DeleteConversationAsync(string conversationId, RequestOptions options = null);
2584+
public virtual ClientResult DeleteConversationItem(string conversationId, string itemId, RequestOptions options = null);
2585+
public virtual Task<ClientResult> DeleteConversationItemAsync(string conversationId, string itemId, RequestOptions options = null);
2586+
public virtual ClientResult GetConversation(string conversationId, RequestOptions options = null);
2587+
public virtual Task<ClientResult> GetConversationAsync(string conversationId, RequestOptions options = null);
2588+
public virtual ClientResult GetConversationItem(string conversationId, string itemId, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2589+
public virtual Task<ClientResult> GetConversationItemAsync(string conversationId, string itemId, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2590+
public virtual ClientResult GetConversationItems(string conversationId, long? limit = null, string order = null, string after = null, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2591+
public virtual Task<ClientResult> GetConversationItemsAsync(string conversationId, long? limit = null, string order = null, string after = null, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2592+
public virtual ClientResult UpdateConversation(string conversationId, BinaryContent content, RequestOptions options = null);
2593+
public virtual Task<ClientResult> UpdateConversationAsync(string conversationId, BinaryContent content, RequestOptions options = null);
2594+
}
2595+
[Experimental("OPENAI001")]
2596+
public readonly partial struct IncludedConversationItemProperty : IEquatable<IncludedConversationItemProperty> {
2597+
public IncludedConversationItemProperty(string value);
2598+
public static IncludedConversationItemProperty CodeInterpreterCallOutputs { get; }
2599+
public static IncludedConversationItemProperty ComputerCallOutputImageUri { get; }
2600+
public static IncludedConversationItemProperty FileSearchCallResults { get; }
2601+
public static IncludedConversationItemProperty MessageInputImageUri { get; }
2602+
public static IncludedConversationItemProperty MessageOutputTextLogprobs { get; }
2603+
public static IncludedConversationItemProperty ReasoningEncryptedContent { get; }
2604+
public static IncludedConversationItemProperty WebSearchCallActionSources { get; }
2605+
public static IncludedConversationItemProperty WebSearchCallResults { get; }
2606+
public readonly bool Equals(IncludedConversationItemProperty other);
2607+
[EditorBrowsable(EditorBrowsableState.Never)]
2608+
public override readonly bool Equals(object obj);
2609+
[EditorBrowsable(EditorBrowsableState.Never)]
2610+
public override readonly int GetHashCode();
2611+
public static bool operator ==(IncludedConversationItemProperty left, IncludedConversationItemProperty right);
2612+
public static implicit operator IncludedConversationItemProperty(string value);
2613+
public static implicit operator IncludedConversationItemProperty?(string value);
2614+
public static bool operator !=(IncludedConversationItemProperty left, IncludedConversationItemProperty right);
2615+
public override readonly string ToString();
2616+
}
2617+
}
25632618
namespace OpenAI.Embeddings {
25642619
public class EmbeddingClient {
25652620
protected EmbeddingClient();
@@ -5756,6 +5811,7 @@ public class ResponseItem : IJsonModel<ResponseItem>, IPersistableModel<Response
57565811
public static WebSearchCallResponseItem CreateWebSearchCallItem();
57575812
protected virtual ResponseItem JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
57585813
protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
5814+
public static explicit operator ResponseItem(ClientResult result);
57595815
protected virtual ResponseItem PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
57605816
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
57615817
}

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();
@@ -2199,6 +2200,56 @@ public class DeleteContainerResponse : IJsonModel<DeleteContainerResponse>, IPer
21992200
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
22002201
}
22012202
}
2203+
namespace OpenAI.Conversations {
2204+
public class ConversationClient {
2205+
protected ConversationClient();
2206+
public ConversationClient(ApiKeyCredential credential, OpenAIClientOptions options);
2207+
public ConversationClient(ApiKeyCredential credential);
2208+
public ConversationClient(AuthenticationPolicy authenticationPolicy, OpenAIClientOptions options);
2209+
public ConversationClient(AuthenticationPolicy authenticationPolicy);
2210+
protected internal ConversationClient(ClientPipeline pipeline, OpenAIClientOptions options);
2211+
public ConversationClient(string apiKey);
2212+
public Uri Endpoint { get; }
2213+
public ClientPipeline Pipeline { get; }
2214+
public virtual ClientResult CreateConversation(BinaryContent content, RequestOptions options = null);
2215+
public virtual Task<ClientResult> CreateConversationAsync(BinaryContent content, RequestOptions options = null);
2216+
public virtual ClientResult CreateConversationItems(string conversationId, BinaryContent content, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2217+
public virtual Task<ClientResult> CreateConversationItemsAsync(string conversationId, BinaryContent content, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2218+
public virtual ClientResult DeleteConversation(string conversationId, RequestOptions options = null);
2219+
public virtual Task<ClientResult> DeleteConversationAsync(string conversationId, RequestOptions options = null);
2220+
public virtual ClientResult DeleteConversationItem(string conversationId, string itemId, RequestOptions options = null);
2221+
public virtual Task<ClientResult> DeleteConversationItemAsync(string conversationId, string itemId, RequestOptions options = null);
2222+
public virtual ClientResult GetConversation(string conversationId, RequestOptions options = null);
2223+
public virtual Task<ClientResult> GetConversationAsync(string conversationId, RequestOptions options = null);
2224+
public virtual ClientResult GetConversationItem(string conversationId, string itemId, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2225+
public virtual Task<ClientResult> GetConversationItemAsync(string conversationId, string itemId, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2226+
public virtual ClientResult GetConversationItems(string conversationId, long? limit = null, string order = null, string after = null, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2227+
public virtual Task<ClientResult> GetConversationItemsAsync(string conversationId, long? limit = null, string order = null, string after = null, IEnumerable<IncludedConversationItemProperty> include = null, RequestOptions options = null);
2228+
public virtual ClientResult UpdateConversation(string conversationId, BinaryContent content, RequestOptions options = null);
2229+
public virtual Task<ClientResult> UpdateConversationAsync(string conversationId, BinaryContent content, RequestOptions options = null);
2230+
}
2231+
public readonly partial struct IncludedConversationItemProperty : IEquatable<IncludedConversationItemProperty> {
2232+
public IncludedConversationItemProperty(string value);
2233+
public static IncludedConversationItemProperty CodeInterpreterCallOutputs { get; }
2234+
public static IncludedConversationItemProperty ComputerCallOutputImageUri { get; }
2235+
public static IncludedConversationItemProperty FileSearchCallResults { get; }
2236+
public static IncludedConversationItemProperty MessageInputImageUri { get; }
2237+
public static IncludedConversationItemProperty MessageOutputTextLogprobs { get; }
2238+
public static IncludedConversationItemProperty ReasoningEncryptedContent { get; }
2239+
public static IncludedConversationItemProperty WebSearchCallActionSources { get; }
2240+
public static IncludedConversationItemProperty WebSearchCallResults { get; }
2241+
public readonly bool Equals(IncludedConversationItemProperty other);
2242+
[EditorBrowsable(EditorBrowsableState.Never)]
2243+
public override readonly bool Equals(object obj);
2244+
[EditorBrowsable(EditorBrowsableState.Never)]
2245+
public override readonly int GetHashCode();
2246+
public static bool operator ==(IncludedConversationItemProperty left, IncludedConversationItemProperty right);
2247+
public static implicit operator IncludedConversationItemProperty(string value);
2248+
public static implicit operator IncludedConversationItemProperty?(string value);
2249+
public static bool operator !=(IncludedConversationItemProperty left, IncludedConversationItemProperty right);
2250+
public override readonly string ToString();
2251+
}
2252+
}
22022253
namespace OpenAI.Embeddings {
22032254
public class EmbeddingClient {
22042255
protected EmbeddingClient();
@@ -5050,6 +5101,7 @@ public class ResponseItem : IJsonModel<ResponseItem>, IPersistableModel<Response
50505101
public static WebSearchCallResponseItem CreateWebSearchCallItem();
50515102
protected virtual ResponseItem JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
50525103
protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
5104+
public static explicit operator ResponseItem(ClientResult result);
50535105
protected virtual ResponseItem PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
50545106
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
50555107
}
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)