Skip to content
Merged
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
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
# Release History

## 2.0.0-beta.9 (Unreleased)

### Features Added

- Added `OpenAIAudioModelFactory`, `OpenAIEmbeddingsModelFactory`, and `OpenAIImagesModelFactory` static classes to the `Audio`, `Embeddings`, and `Images` namespaces, respectively. Model factories can be used to instantiate OpenAI models for mocking in non-live test scenarios.

### Breaking Changes

### Bugs Fixed

### Other Changes

## 2.0.0-beta.8 (2024-07-31)

### Breaking Changes
Expand Down
72 changes: 72 additions & 0 deletions src/Custom/Audio/OpenAIAudioModelFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
using System;
using System.Collections.Generic;
using System.Linq;

namespace OpenAI.Audio;

/// <summary> Model factory for models. </summary>
public static partial class OpenAIAudioModelFactory
{
/// <summary> Initializes a new instance of <see cref="OpenAI.Audio.AudioTranscription"/>. </summary>
/// <returns> A new <see cref="OpenAI.Audio.AudioTranscription"/> instance for mocking. </returns>
public static AudioTranscription AudioTranscription(string language = null, TimeSpan? duration = null, string text = null, IEnumerable<TranscribedWord> words = null, IEnumerable<TranscribedSegment> segments = null)
{
words ??= new List<TranscribedWord>();
segments ??= new List<TranscribedSegment>();

return new AudioTranscription(
InternalCreateTranscriptionResponseVerboseJsonTask.Transcribe,
language,
duration,
text,
words.ToList(),
segments.ToList(),
serializedAdditionalRawData: null);
}

/// <summary> Initializes a new instance of <see cref="OpenAI.Audio.AudioTranslation"/>. </summary>
/// <returns> A new <see cref="OpenAI.Audio.AudioTranslation"/> instance for mocking. </returns>
public static AudioTranslation AudioTranslation(string language = null, TimeSpan? duration = null, string text = null, IEnumerable<TranscribedSegment> segments = null)
{
segments ??= new List<TranscribedSegment>();

return new AudioTranslation(
InternalCreateTranslationResponseVerboseJsonTask.Translate,
language,
duration,
text,
segments.ToList(),
serializedAdditionalRawData: null);
}

/// <summary> Initializes a new instance of <see cref="OpenAI.Audio.TranscribedSegment"/>. </summary>
/// <returns> A new <see cref="OpenAI.Audio.TranscribedSegment"/> instance for mocking. </returns>
public static TranscribedSegment TranscribedSegment(int id = default, long seekOffset = default, TimeSpan start = default, TimeSpan end = default, string text = null, IEnumerable<long> tokenIds = null, float temperature = default, double averageLogProbability = default, float compressionRatio = default, double noSpeechProbability = default)
{
tokenIds ??= new List<long>();

return new TranscribedSegment(
id,
seekOffset,
start,
end,
text,
tokenIds.ToList(),
temperature,
averageLogProbability,
compressionRatio,
noSpeechProbability,
serializedAdditionalRawData: null);
}

/// <summary> Initializes a new instance of <see cref="OpenAI.Audio.TranscribedWord"/>. </summary>
/// <returns> A new <see cref="OpenAI.Audio.TranscribedWord"/> instance for mocking. </returns>
public static TranscribedWord TranscribedWord(string word = null, TimeSpan start = default, TimeSpan end = default)
{
return new TranscribedWord(
word,
start,
end,
serializedAdditionalRawData: null);
}
}
10 changes: 10 additions & 0 deletions src/Custom/Embeddings/Embedding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,16 @@ internal Embedding(int index, BinaryData embeddingProperty, InternalEmbeddingObj
Vector = ConvertToVectorOfFloats(embeddingProperty);
}

// CUSTOM: Entirely custom constructor used by the Model Factory.
/// <summary> Initializes a new instance of <see cref="Embedding"/>. </summary>
/// <param name="index"> The index of the embedding in the list of embeddings. </param>
/// <param name="vector"> The embedding vector, which is a list of floats. </param>
internal Embedding(int index, ReadOnlyMemory<float> vector)
{
Index = index;
Vector = vector;
}

// CUSTOM: Added as a public, custom property. For slightly better performance, the embedding is always requested as a base64-encoded
// string and then manually transformed into a more user-friendly ReadOnlyMemory<float>.
/// <summary>
Expand Down
43 changes: 43 additions & 0 deletions src/Custom/Embeddings/OpenAIEmbeddingsModelFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using System.Collections.Generic;
using System.Linq;

namespace OpenAI.Embeddings;

/// <summary> Model factory for models. </summary>
public static partial class OpenAIEmbeddingsModelFactory
{
/// <summary> Initializes a new instance of <see cref="OpenAI.Embeddings.Embedding"/>. </summary>
/// <returns> A new <see cref="OpenAI.Embeddings.Embeddings"/> instance for mocking. </returns>
public static Embedding Embedding(int index = default, IEnumerable<float> vector = null)
{
vector ??= new List<float>();

return new Embedding(
index,
vector.ToArray());
}

/// <summary> Initializes a new instance of <see cref="OpenAI.Embeddings.EmbeddingCollection"/>. </summary>
/// <returns> A new <see cref="OpenAI.Embeddings.EmbeddingCollection"/> instance for mocking. </returns>
public static EmbeddingCollection EmbeddingCollection(IEnumerable<Embedding> items = null, string model = null, EmbeddingTokenUsage usage = null)
{
items ??= new List<Embedding>();

return new EmbeddingCollection(
items.ToList(),
model,
@object: default,
usage,
serializedAdditionalRawData: null);
}

/// <summary> Initializes a new instance of <see cref="OpenAI.Embeddings.EmbeddingTokenUsage"/>. </summary>
/// <returns> A new <see cref="OpenAI.Embeddings.EmbeddingTokenUsage"/> instance for mocking. </returns>
public static EmbeddingTokenUsage EmbeddingTokenUsage(int inputTokens = default, int totalTokens = default)
{
return new EmbeddingTokenUsage(
inputTokens,
totalTokens,
serializedAdditionalRawData: null);
}
}
32 changes: 32 additions & 0 deletions src/Custom/Images/OpenAIImagesModelFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;

namespace OpenAI.Images;

/// <summary> Model factory for models. </summary>
public static partial class OpenAIImagesModelFactory
{
/// <summary> Initializes a new instance of <see cref="OpenAI.Images.GeneratedImage"/>. </summary>
/// <returns> A new <see cref="OpenAI.Images.GeneratedImage"/> instance for mocking. </returns>
public static GeneratedImage GeneratedImage(BinaryData imageBytes = null, Uri imageUri = null, string revisedPrompt = null)
{
return new GeneratedImage(
imageBytes,
imageUri,
revisedPrompt,
serializedAdditionalRawData: null);
}

/// <summary> Initializes a new instance of <see cref="OpenAI.Images.GeneratedImageCollection"/>. </summary>
/// <returns> A new <see cref="OpenAI.Images.GeneratedImageCollection"/> instance for mocking. </returns>
public static GeneratedImageCollection GeneratedImageCollection(DateTimeOffset createdAt = default, IEnumerable<GeneratedImage> items = null)
{
items ??= new List<GeneratedImage>();

return new GeneratedImageCollection(
createdAt,
items.ToList(),
serializedAdditionalRawData: null);
}
}
Loading