Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 41 additions & 6 deletions api/OpenAI.net8.0.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3592,8 +3592,16 @@ public class GeneratedImage : IJsonModel<GeneratedImage>, IPersistableModel<Gene
public override readonly string ToString();
}
public class GeneratedImageCollection : ObjectModel.ReadOnlyCollection<GeneratedImage>, IJsonModel<GeneratedImageCollection>, IPersistableModel<GeneratedImageCollection> {
[Experimental("OPENAI001")]
public GeneratedImageBackground? Background { get; }
public DateTimeOffset CreatedAt { get; }
[Experimental("OPENAI001")]
public GeneratedImageFileFormat? OutputFileFormat { get; set; }
[Experimental("OPENAI001")]
public GeneratedImageQuality? Quality { get; }
[Experimental("OPENAI001")]
public GeneratedImageSize? Size { get; }
[Experimental("OPENAI001")]
public ImageTokenUsage Usage { get; }
[Experimental("OPENAI001")]
protected virtual GeneratedImageCollection JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
Expand Down Expand Up @@ -3658,6 +3666,7 @@ public class GeneratedImageCollection : ObjectModel.ReadOnlyCollection<Generated
public GeneratedImageQuality(string value);
[Experimental("OPENAI001")]
public static GeneratedImageQuality Auto { get; }
public static GeneratedImageQuality HD { get; }
public static GeneratedImageQuality High { get; }
[Experimental("OPENAI001")]
public static GeneratedImageQuality Low { get; }
Expand Down Expand Up @@ -3767,6 +3776,12 @@ public class ImageEditOptions : IJsonModel<ImageEditOptions>, IPersistableModel<
public GeneratedImageBackground? Background { get; set; }
public string EndUserId { get; set; }
[Experimental("OPENAI001")]
public ImageInputFidelity? InputFidelity { get; set; }
[Experimental("OPENAI001")]
public int? OutputCompressionFactor { get; set; }
[Experimental("OPENAI001")]
public GeneratedImageFileFormat? OutputFileFormat { get; set; }
[Experimental("OPENAI001")]
public GeneratedImageQuality? Quality { get; set; }
public GeneratedImageFormat? ResponseFormat { get; set; }
public GeneratedImageSize? Size { get; set; }
Expand Down Expand Up @@ -3803,20 +3818,36 @@ public class ImageGenerationOptions : IJsonModel<ImageGenerationOptions>, IPersi
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
}
[Experimental("OPENAI001")]
public readonly partial struct ImageInputFidelity : IEquatable<ImageInputFidelity> {
public ImageInputFidelity(string value);
public static ImageInputFidelity High { get; }
public static ImageInputFidelity Low { get; }
public readonly bool Equals(ImageInputFidelity other);
[EditorBrowsable(EditorBrowsableState.Never)]
public override readonly bool Equals(object obj);
[EditorBrowsable(EditorBrowsableState.Never)]
public override readonly int GetHashCode();
public static bool operator ==(ImageInputFidelity left, ImageInputFidelity right);
public static implicit operator ImageInputFidelity(string value);
public static implicit operator ImageInputFidelity?(string value);
public static bool operator !=(ImageInputFidelity left, ImageInputFidelity right);
public override readonly string ToString();
}
[Experimental("OPENAI001")]
public class ImageInputTokenUsageDetails : IJsonModel<ImageInputTokenUsageDetails>, IPersistableModel<ImageInputTokenUsageDetails> {
public int ImageTokenCount { get; }
public int TextTokenCount { get; }
public long ImageTokenCount { get; }
public long TextTokenCount { get; }
protected virtual ImageInputTokenUsageDetails JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
protected virtual ImageInputTokenUsageDetails PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
}
[Experimental("OPENAI001")]
public class ImageTokenUsage : IJsonModel<ImageTokenUsage>, IPersistableModel<ImageTokenUsage> {
public int InputTokenCount { get; }
public long InputTokenCount { get; }
public ImageInputTokenUsageDetails InputTokenDetails { get; }
public int OutputTokenCount { get; }
public int TotalTokenCount { get; }
public long OutputTokenCount { get; }
public long TotalTokenCount { get; }
protected virtual ImageTokenUsage JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
protected virtual ImageTokenUsage PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
Expand All @@ -3838,9 +3869,13 @@ public class ImageVariationOptions : IJsonModel<ImageVariationOptions>, IPersist
public static class OpenAIImagesModelFactory {
public static GeneratedImage GeneratedImage(BinaryData imageBytes = null, Uri imageUri = null, string revisedPrompt = null);
[Experimental("OPENAI001")]
public static GeneratedImageCollection GeneratedImageCollection(DateTimeOffset createdAt = default, IEnumerable<GeneratedImage> items = null, ImageTokenUsage usage = null);
public static GeneratedImageCollection GeneratedImageCollection(DateTimeOffset createdAt = default, IEnumerable<GeneratedImage> items = null, GeneratedImageBackground? background = null, GeneratedImageFileFormat? outputFileFormat = null, GeneratedImageSize? size = null, GeneratedImageQuality? quality = null, ImageTokenUsage usage = null);
[EditorBrowsable(EditorBrowsableState.Never)]
public static GeneratedImageCollection GeneratedImageCollection(DateTimeOffset createdAt, IEnumerable<GeneratedImage> items);
[Experimental("OPENAI001")]
public static ImageInputTokenUsageDetails ImageInputTokenUsageDetails(long textTokenCount = 0, long imageTokenCount = 0);
[Experimental("OPENAI001")]
public static ImageTokenUsage ImageTokenUsage(long inputTokenCount = 0, long outputTokenCount = 0, long totalTokenCount = 0, ImageInputTokenUsageDetails inputTokenDetails = null);
}
}
namespace OpenAI.Models {
Expand Down
37 changes: 31 additions & 6 deletions api/OpenAI.netstandard2.0.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3116,7 +3116,11 @@ public class GeneratedImage : IJsonModel<GeneratedImage>, IPersistableModel<Gene
public override readonly string ToString();
}
public class GeneratedImageCollection : ObjectModel.ReadOnlyCollection<GeneratedImage>, IJsonModel<GeneratedImageCollection>, IPersistableModel<GeneratedImageCollection> {
public GeneratedImageBackground? Background { get; }
public DateTimeOffset CreatedAt { get; }
public GeneratedImageFileFormat? OutputFileFormat { get; set; }
public GeneratedImageQuality? Quality { get; }
public GeneratedImageSize? Size { get; }
public ImageTokenUsage Usage { get; }
protected virtual GeneratedImageCollection JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
Expand Down Expand Up @@ -3173,6 +3177,7 @@ public class GeneratedImageCollection : ObjectModel.ReadOnlyCollection<Generated
public readonly partial struct GeneratedImageQuality : IEquatable<GeneratedImageQuality> {
public GeneratedImageQuality(string value);
public static GeneratedImageQuality Auto { get; }
public static GeneratedImageQuality HD { get; }
public static GeneratedImageQuality High { get; }
public static GeneratedImageQuality Low { get; }
public static GeneratedImageQuality Medium { get; }
Expand Down Expand Up @@ -3271,6 +3276,9 @@ public class ImageClient {
public class ImageEditOptions : IJsonModel<ImageEditOptions>, IPersistableModel<ImageEditOptions> {
public GeneratedImageBackground? Background { get; set; }
public string EndUserId { get; set; }
public ImageInputFidelity? InputFidelity { get; set; }
public int? OutputCompressionFactor { get; set; }
public GeneratedImageFileFormat? OutputFileFormat { get; set; }
public GeneratedImageQuality? Quality { get; set; }
public GeneratedImageFormat? ResponseFormat { get; set; }
public GeneratedImageSize? Size { get; set; }
Expand All @@ -3294,19 +3302,34 @@ public class ImageGenerationOptions : IJsonModel<ImageGenerationOptions>, IPersi
protected virtual ImageGenerationOptions PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
}
public readonly partial struct ImageInputFidelity : IEquatable<ImageInputFidelity> {
public ImageInputFidelity(string value);
public static ImageInputFidelity High { get; }
public static ImageInputFidelity Low { get; }
public readonly bool Equals(ImageInputFidelity other);
[EditorBrowsable(EditorBrowsableState.Never)]
public override readonly bool Equals(object obj);
[EditorBrowsable(EditorBrowsableState.Never)]
public override readonly int GetHashCode();
public static bool operator ==(ImageInputFidelity left, ImageInputFidelity right);
public static implicit operator ImageInputFidelity(string value);
public static implicit operator ImageInputFidelity?(string value);
public static bool operator !=(ImageInputFidelity left, ImageInputFidelity right);
public override readonly string ToString();
}
public class ImageInputTokenUsageDetails : IJsonModel<ImageInputTokenUsageDetails>, IPersistableModel<ImageInputTokenUsageDetails> {
public int ImageTokenCount { get; }
public int TextTokenCount { get; }
public long ImageTokenCount { get; }
public long TextTokenCount { get; }
protected virtual ImageInputTokenUsageDetails JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
protected virtual ImageInputTokenUsageDetails PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
}
public class ImageTokenUsage : IJsonModel<ImageTokenUsage>, IPersistableModel<ImageTokenUsage> {
public int InputTokenCount { get; }
public long InputTokenCount { get; }
public ImageInputTokenUsageDetails InputTokenDetails { get; }
public int OutputTokenCount { get; }
public int TotalTokenCount { get; }
public long OutputTokenCount { get; }
public long TotalTokenCount { get; }
protected virtual ImageTokenUsage JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
protected virtual ImageTokenUsage PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
Expand All @@ -3323,9 +3346,11 @@ public class ImageVariationOptions : IJsonModel<ImageVariationOptions>, IPersist
}
public static class OpenAIImagesModelFactory {
public static GeneratedImage GeneratedImage(BinaryData imageBytes = null, Uri imageUri = null, string revisedPrompt = null);
public static GeneratedImageCollection GeneratedImageCollection(DateTimeOffset createdAt = default, IEnumerable<GeneratedImage> items = null, ImageTokenUsage usage = null);
public static GeneratedImageCollection GeneratedImageCollection(DateTimeOffset createdAt = default, IEnumerable<GeneratedImage> items = null, GeneratedImageBackground? background = null, GeneratedImageFileFormat? outputFileFormat = null, GeneratedImageSize? size = null, GeneratedImageQuality? quality = null, ImageTokenUsage usage = null);
[EditorBrowsable(EditorBrowsableState.Never)]
public static GeneratedImageCollection GeneratedImageCollection(DateTimeOffset createdAt, IEnumerable<GeneratedImage> items);
public static ImageInputTokenUsageDetails ImageInputTokenUsageDetails(long textTokenCount = 0, long imageTokenCount = 0);
public static ImageTokenUsage ImageTokenUsage(long inputTokenCount = 0, long outputTokenCount = 0, long totalTokenCount = 0, ImageInputTokenUsageDetails inputTokenDetails = null);
}
}
namespace OpenAI.Models {
Expand Down
2 changes: 2 additions & 0 deletions codegen/generator/src/OpenAILibraryGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ protected override void Configure()
base.Configure();
// This should be first, as it recomputes the type
AddVisitor(new NonAbstractPublicTypesVisitor());
AddVisitor(new NumericPropertiesVisitor());
AddVisitor(new ConstructorFixupVisitor());
AddVisitor(new KindRenameVisitor());
AddVisitor(new VisibilityVisitor());
Expand All @@ -33,6 +34,7 @@ protected override void Configure()
AddVisitor(new ModelDirectoryVisitor());
AddVisitor(new PaginationVisitor());
AddVisitor(new MetadataQueryParamVisitor());
AddVisitor(new ItemsPropertyVisitor());
}
}
}
40 changes: 40 additions & 0 deletions codegen/generator/src/Visitors/ItemsPropertyVisitor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using Microsoft.TypeSpec.Generator.ClientModel;
using Microsoft.TypeSpec.Generator.Providers;
using System;
using System.Collections.Generic;
using System.Linq;

namespace OpenAILibraryPlugin.Visitors;

/// <summary>
/// There are a few models that represent collections of other models. We have customized some of
/// these models to be classes derived from collection types (e.g., `ReadOnlyCollection<T>`).
/// But because these collection types already have an `Items` property that is inherited by the
/// derived class, there is a conflict when a second `Items` property is generated from the schema.
/// The purpose of this visitor is simply to remove that duplicated `Items` property and let the
/// classes use the inherited property instead.
/// </summary>
public class ItemsPropertyVisitor : ScmLibraryVisitor
{
// Classes that have been customized to derive from collection types, e.g., `ReadOnlyCollection<T>`.
private static readonly HashSet<string> _collectionTypes = new(StringComparer.OrdinalIgnoreCase)
{
"OpenAI.Embeddings.OpenAIEmbeddingCollection",
"OpenAI.Images.GeneratedImageCollection",
"OpenAI.Models.OpenAIModelCollection",
};

protected override TypeProvider? PostVisitType(TypeProvider typeProvider)
{
if (typeProvider is not null
&& _collectionTypes.Contains($"{typeProvider.Type.Namespace}.{typeProvider.Name}"))
{
// Remove the "Items" property from collection types.
typeProvider.Update(
properties: typeProvider.Properties
.Where(p => !p.Name.Equals("Items", StringComparison.OrdinalIgnoreCase)));
}

return typeProvider;
}
}
41 changes: 41 additions & 0 deletions codegen/generator/src/Visitors/NumericPropertiesVisitor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
using Microsoft.TypeSpec.Generator.ClientModel;
using Microsoft.TypeSpec.Generator.Input;
using Microsoft.TypeSpec.Generator.Primitives;
using Microsoft.TypeSpec.Generator.Providers;
using System;
using System.Collections.Generic;

namespace OpenAILibraryPlugin.Visitors;

/// <summary>
/// We prefer to use `int` (Int32) for numeric properties unless there is a specific reason to
/// use `long` (Int64). Because using `long` is therefore the exception, this visitor converts all
/// `long` properties to `int` by default unless they are explicitly excluded.
/// </summary>
public class NumericPropertiesVisitor : ScmLibraryVisitor
{
private static readonly HashSet<string> _excludedProperties = new(StringComparer.OrdinalIgnoreCase)
{
"OpenAI.Chat.ChatCompletionOptions.Seed",

"OpenAI.LegacyCompletions.InternalCreateCompletionRequest.Seed",

"OpenAI.Images.ImageTokenUsage.InputTokenCount",
"OpenAI.Images.ImageTokenUsage.OutputTokenCount",
"OpenAI.Images.ImageTokenUsage.TotalTokenCount",
"OpenAI.Images.ImageInputTokenUsageDetails.ImageTokens",
"OpenAI.Images.ImageInputTokenUsageDetails.TextTokens",
};

protected override PropertyProvider? PreVisitProperty(InputProperty property, PropertyProvider? propertyProvider)
{
if (propertyProvider is not null
&& propertyProvider.Type.Equals(typeof(long))
&& !_excludedProperties.Contains($"{propertyProvider.EnclosingType.Type.Namespace}.{propertyProvider.EnclosingType.Name}.{propertyProvider.Name}"))
{
propertyProvider.Update(type: new CSharpType(typeof(int), propertyProvider.Type.IsNullable));
}

return propertyProvider;
}
}
1 change: 1 addition & 0 deletions specification/base/typespec/embeddings/main.tsp
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
import "./models.tsp";
import "./operations.tsp";
Loading
Loading