Skip to content
Merged
6 changes: 6 additions & 0 deletions OpenAI.sln
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenAI", "src\OpenAI.csproj
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenAI.Examples", "examples\OpenAI.Examples.csproj", "{1F1CD1D4-9932-4B73-99D8-C252A67D4B46}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TrimmingHelper", "helpers\TrimmingHelper\TrimmingHelper.csproj", "{4C6C7FB5-DD4E-44A8-9CBF-D739284FDC23}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -20,6 +22,10 @@ Global
{1F1CD1D4-9932-4B73-99D8-C252A67D4B46}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1F1CD1D4-9932-4B73-99D8-C252A67D4B46}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1F1CD1D4-9932-4B73-99D8-C252A67D4B46}.Release|Any CPU.Build.0 = Release|Any CPU
{4C6C7FB5-DD4E-44A8-9CBF-D739284FDC23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4C6C7FB5-DD4E-44A8-9CBF-D739284FDC23}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4C6C7FB5-DD4E-44A8-9CBF-D739284FDC23}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4C6C7FB5-DD4E-44A8-9CBF-D739284FDC23}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
1 change: 1 addition & 0 deletions helpers/TrimmingHelper/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Console.WriteLine("Build, rebuild or publish this app to see trimming warnings.");
30 changes: 30 additions & 0 deletions helpers/TrimmingHelper/TrimmingHelper.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>

<PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\OpenAI.csproj" />
</ItemGroup>

<ItemGroup>
<TrimmerRootAssembly Include="OpenAI" />
</ItemGroup>

<PropertyGroup Label="Publish">
<RuntimeIdentifier Condition="$([MSBuild]::IsOSPlatform('windows'))">win-x64</RuntimeIdentifier>
<RuntimeIdentifier Condition="!$([MSBuild]::IsOSPlatform('windows'))">osx-arm64</RuntimeIdentifier>

<SelfContained>true</SelfContained>
</PropertyGroup>

<Target Name="ProduceTrimmingWarnings" AfterTargets="Build">
<CallTarget Targets="Publish"/>
</Target>

</Project>
25 changes: 16 additions & 9 deletions src/Custom/Common/InternalListHelpers.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.ClientModel;
using System.ClientModel.Primitives;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;

Expand All @@ -10,28 +11,34 @@ internal static class InternalListHelpers
internal delegate Task<ClientResult> AsyncListResponseFunc(string continuationToken, int? pageSize);
internal delegate ClientResult ListResponseFunc(string continuationToken, int? pageSize);

internal static AsyncPageableCollection<T> CreateAsyncPageable<T, U>(AsyncListResponseFunc listResponseFunc)
where U : IJsonModel<U>, IInternalListResponse<T>
internal static AsyncPageableCollection<T> CreateAsyncPageable<T,
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
TInternalList>(AsyncListResponseFunc listResponseFunc)
where TInternalList : IJsonModel<TInternalList>, IInternalListResponse<T>
{
async Task<ResultPage<T>> pageFunc(string continuationToken, int? pageSize)
=> GetPageFromProtocol<T,U>(await listResponseFunc(continuationToken, pageSize).ConfigureAwait(false));
=> GetPageFromProtocol<T,TInternalList>(await listResponseFunc(continuationToken, pageSize).ConfigureAwait(false));
return PageableResultHelpers.Create((pageSize) => pageFunc(null, pageSize), pageFunc);
}

internal static PageableCollection<T> CreatePageable<T, U>(ListResponseFunc listResponseFunc)
where U : IJsonModel<U>, IInternalListResponse<T>
internal static PageableCollection<T> CreatePageable<T,
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
TInternalList>(ListResponseFunc listResponseFunc)
where TInternalList : IJsonModel<TInternalList>, IInternalListResponse<T>
{
ResultPage<T> pageFunc(string continuationToken, int? pageSize)
=> GetPageFromProtocol<T, U>(listResponseFunc(continuationToken, pageSize));
=> GetPageFromProtocol<T, TInternalList>(listResponseFunc(continuationToken, pageSize));
return PageableResultHelpers.Create((pageSize) => pageFunc(null, pageSize), pageFunc);
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static ResultPage<TInstance> GetPageFromProtocol<TInstance, UInternalList>(ClientResult protocolResult)
where UInternalList : IJsonModel<UInternalList>, IInternalListResponse<TInstance>
private static ResultPage<TInstance> GetPageFromProtocol<TInstance,
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
TInternalList>(ClientResult protocolResult)
where TInternalList : IJsonModel<TInternalList>, IInternalListResponse<TInstance>
{
PipelineResponse response = protocolResult.GetRawResponse();
IInternalListResponse<TInstance> values = ModelReaderWriter.Read<UInternalList>(response.Content);
IInternalListResponse<TInstance> values = ModelReaderWriter.Read<TInternalList>(response.Content);
return ResultPage<TInstance>.Create(values.Data, values.HasMore ? values.LastId : null, response);
}
}
12 changes: 6 additions & 6 deletions src/Custom/Embeddings/EmbeddingClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public virtual async Task<ClientResult<Embedding>> GenerateEmbeddingAsync(string
Argument.AssertNotNullOrEmpty(input, nameof(input));

options ??= new();
CreateEmbeddingGenerationOptions(BinaryData.FromObjectAsJson(input), ref options);
CreateEmbeddingGenerationOptions(BinaryData.FromObjectAsJson(input, SourceGenerationContext.Default.String), ref options);

using BinaryContent content = options.ToBinaryContent();
ClientResult result = await GenerateEmbeddingsAsync(content, (RequestOptions)null).ConfigureAwait(false);
Expand All @@ -99,7 +99,7 @@ public virtual ClientResult<Embedding> GenerateEmbedding(string input, Embedding
Argument.AssertNotNullOrEmpty(input, nameof(input));

options ??= new();
CreateEmbeddingGenerationOptions(BinaryData.FromObjectAsJson(input), ref options);
CreateEmbeddingGenerationOptions(BinaryData.FromObjectAsJson(input, SourceGenerationContext.Default.String), ref options);

using BinaryContent content = options.ToBinaryContent();
ClientResult result = GenerateEmbeddings(content, (RequestOptions)null);
Expand All @@ -117,7 +117,7 @@ public virtual async Task<ClientResult<EmbeddingCollection>> GenerateEmbeddingsA
Argument.AssertNotNullOrEmpty(inputs, nameof(inputs));

options ??= new();
CreateEmbeddingGenerationOptions(BinaryData.FromObjectAsJson(inputs), ref options);
CreateEmbeddingGenerationOptions(BinaryData.FromObjectAsJson(inputs, SourceGenerationContext.Default.IEnumerableString), ref options);

using BinaryContent content = options.ToBinaryContent();
ClientResult result = await GenerateEmbeddingsAsync(content, (RequestOptions)null).ConfigureAwait(false);
Expand All @@ -136,7 +136,7 @@ public virtual ClientResult<EmbeddingCollection> GenerateEmbeddings(IEnumerable<
Argument.AssertNotNullOrEmpty(inputs, nameof(inputs));

options ??= new();
CreateEmbeddingGenerationOptions(BinaryData.FromObjectAsJson(inputs), ref options);
CreateEmbeddingGenerationOptions(BinaryData.FromObjectAsJson(inputs, SourceGenerationContext.Default.IEnumerableString), ref options);

using BinaryContent content = options.ToBinaryContent();
ClientResult result = GenerateEmbeddings(content, (RequestOptions)null);
Expand All @@ -154,7 +154,7 @@ public virtual async Task<ClientResult<EmbeddingCollection>> GenerateEmbeddingsA
Argument.AssertNotNullOrEmpty(inputs, nameof(inputs));

options ??= new();
CreateEmbeddingGenerationOptions(BinaryData.FromObjectAsJson(inputs), ref options);
CreateEmbeddingGenerationOptions(BinaryData.FromObjectAsJson(inputs, SourceGenerationContext.Default.IEnumerableIEnumerableInt32), ref options);

using BinaryContent content = options.ToBinaryContent();
ClientResult result = await GenerateEmbeddingsAsync(content, (RequestOptions)null).ConfigureAwait(false);
Expand All @@ -172,7 +172,7 @@ public virtual ClientResult<EmbeddingCollection> GenerateEmbeddings(IEnumerable<
Argument.AssertNotNullOrEmpty(inputs, nameof(inputs));

options ??= new();
CreateEmbeddingGenerationOptions(BinaryData.FromObjectAsJson(inputs), ref options);
CreateEmbeddingGenerationOptions(BinaryData.FromObjectAsJson(inputs, SourceGenerationContext.Default.IEnumerableIEnumerableInt32), ref options);

using BinaryContent content = options.ToBinaryContent();
ClientResult result = GenerateEmbeddings(content, (RequestOptions)null);
Expand Down
8 changes: 4 additions & 4 deletions src/Custom/Moderations/ModerationClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public virtual async Task<ClientResult<ModerationResult>> ClassifyTextInputAsync
Argument.AssertNotNullOrEmpty(input, nameof(input));

ModerationOptions options = new();
CreateModerationOptions(BinaryData.FromObjectAsJson(input), ref options);
CreateModerationOptions(BinaryData.FromObjectAsJson(input, SourceGenerationContext.Default.String), ref options);

using BinaryContent content = options.ToBinaryContent();
ClientResult result = await ClassifyTextInputsAsync(content, (RequestOptions)null).ConfigureAwait(false);
Expand All @@ -90,7 +90,7 @@ public virtual ClientResult<ModerationResult> ClassifyTextInput(string input)
Argument.AssertNotNullOrEmpty(input, nameof(input));

ModerationOptions options = new();
CreateModerationOptions(BinaryData.FromObjectAsJson(input), ref options);
CreateModerationOptions(BinaryData.FromObjectAsJson(input, SourceGenerationContext.Default.String), ref options);

using BinaryContent content = options.ToBinaryContent();
ClientResult result = ClassifyTextInputs(content, (RequestOptions)null);
Expand All @@ -107,7 +107,7 @@ public virtual async Task<ClientResult<ModerationCollection>> ClassifyTextInputs
Argument.AssertNotNullOrEmpty(inputs, nameof(inputs));

ModerationOptions options = new();
CreateModerationOptions(BinaryData.FromObjectAsJson(inputs), ref options);
CreateModerationOptions(BinaryData.FromObjectAsJson(inputs, SourceGenerationContext.Default.IEnumerableString), ref options);

using BinaryContent content = options.ToBinaryContent();
ClientResult result = await ClassifyTextInputsAsync(content, (RequestOptions)null).ConfigureAwait(false);
Expand All @@ -123,7 +123,7 @@ public virtual ClientResult<ModerationCollection> ClassifyTextInputs(IEnumerable
Argument.AssertNotNullOrEmpty(inputs, nameof(inputs));

ModerationOptions options = new();
CreateModerationOptions(BinaryData.FromObjectAsJson(inputs), ref options);
CreateModerationOptions(BinaryData.FromObjectAsJson(inputs, SourceGenerationContext.Default.IEnumerableString), ref options);

using BinaryContent content = options.ToBinaryContent();
ClientResult result = ClassifyTextInputs(content, (RequestOptions)null);
Expand Down
2 changes: 1 addition & 1 deletion src/Custom/OpenAIModelFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public static EmbeddingCollection EmbeddingCollection(IEnumerable<Embedding> dat
public static Embedding Embedding(ReadOnlyMemory<float> vector = default, int index = default)
{
// TODO: Vector must be converted to base64-encoded string.
return new Embedding(index, BinaryData.FromObjectAsJson(vector), InternalEmbeddingObject.Embedding, serializedAdditionalRawData: null);
return new Embedding(index, BinaryData.FromObjectAsJson(vector, SourceGenerationContext.Default.ReadOnlyMemorySingle), InternalEmbeddingObject.Embedding, serializedAdditionalRawData: null);
}

}
3 changes: 2 additions & 1 deletion src/OpenAI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<VersionPrefix>2.0.0</VersionPrefix>
<VersionSuffix>beta.3</VersionSuffix>

<TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks>
<TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>
<LangVersion>latest</LangVersion>

<!-- Sign the assembly with the specified key file. -->
Expand Down Expand Up @@ -46,5 +46,6 @@
<ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
<PackageReference Include="System.ClientModel" Version="1.1.0-beta.4" />
<PackageReference Include="System.Memory.Data" Version="8.0.0" />
</ItemGroup>
</Project>
12 changes: 12 additions & 0 deletions src/SourceGenerationContext.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;

namespace OpenAI;

[JsonSourceGenerationOptions]
[JsonSerializable(typeof(string))]
[JsonSerializable(typeof(IEnumerable<string>))]
[JsonSerializable(typeof(IEnumerable<IEnumerable<int>>))]
[JsonSerializable(typeof(ReadOnlyMemory<float>))]
internal sealed partial class SourceGenerationContext : JsonSerializerContext;
Loading