Skip to content

Commit 3284295

Browse files
authored
[ModelFactory] Implemented Audio, Embedding, and Image factories (#139)
Adding Model Factories for Audio, Embedding, and Image output models. These factories can be used to instantiate models for mocking.
1 parent c63049e commit 3284295

8 files changed

+769
-0
lines changed

CHANGELOG.md

+12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
# Release History
22

3+
## 2.0.0-beta.9 (Unreleased)
4+
5+
### Features Added
6+
7+
- 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.
8+
9+
### Breaking Changes
10+
11+
### Bugs Fixed
12+
13+
### Other Changes
14+
315
## 2.0.0-beta.8 (2024-07-31)
416

517
### Breaking Changes
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
namespace OpenAI.Audio;
6+
7+
/// <summary> Model factory for models. </summary>
8+
public static partial class OpenAIAudioModelFactory
9+
{
10+
/// <summary> Initializes a new instance of <see cref="OpenAI.Audio.AudioTranscription"/>. </summary>
11+
/// <returns> A new <see cref="OpenAI.Audio.AudioTranscription"/> instance for mocking. </returns>
12+
public static AudioTranscription AudioTranscription(string language = null, TimeSpan? duration = null, string text = null, IEnumerable<TranscribedWord> words = null, IEnumerable<TranscribedSegment> segments = null)
13+
{
14+
words ??= new List<TranscribedWord>();
15+
segments ??= new List<TranscribedSegment>();
16+
17+
return new AudioTranscription(
18+
InternalCreateTranscriptionResponseVerboseJsonTask.Transcribe,
19+
language,
20+
duration,
21+
text,
22+
words.ToList(),
23+
segments.ToList(),
24+
serializedAdditionalRawData: null);
25+
}
26+
27+
/// <summary> Initializes a new instance of <see cref="OpenAI.Audio.AudioTranslation"/>. </summary>
28+
/// <returns> A new <see cref="OpenAI.Audio.AudioTranslation"/> instance for mocking. </returns>
29+
public static AudioTranslation AudioTranslation(string language = null, TimeSpan? duration = null, string text = null, IEnumerable<TranscribedSegment> segments = null)
30+
{
31+
segments ??= new List<TranscribedSegment>();
32+
33+
return new AudioTranslation(
34+
InternalCreateTranslationResponseVerboseJsonTask.Translate,
35+
language,
36+
duration,
37+
text,
38+
segments.ToList(),
39+
serializedAdditionalRawData: null);
40+
}
41+
42+
/// <summary> Initializes a new instance of <see cref="OpenAI.Audio.TranscribedSegment"/>. </summary>
43+
/// <returns> A new <see cref="OpenAI.Audio.TranscribedSegment"/> instance for mocking. </returns>
44+
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)
45+
{
46+
tokenIds ??= new List<long>();
47+
48+
return new TranscribedSegment(
49+
id,
50+
seekOffset,
51+
start,
52+
end,
53+
text,
54+
tokenIds.ToList(),
55+
temperature,
56+
averageLogProbability,
57+
compressionRatio,
58+
noSpeechProbability,
59+
serializedAdditionalRawData: null);
60+
}
61+
62+
/// <summary> Initializes a new instance of <see cref="OpenAI.Audio.TranscribedWord"/>. </summary>
63+
/// <returns> A new <see cref="OpenAI.Audio.TranscribedWord"/> instance for mocking. </returns>
64+
public static TranscribedWord TranscribedWord(string word = null, TimeSpan start = default, TimeSpan end = default)
65+
{
66+
return new TranscribedWord(
67+
word,
68+
start,
69+
end,
70+
serializedAdditionalRawData: null);
71+
}
72+
}

src/Custom/Embeddings/Embedding.cs

+10
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,16 @@ internal Embedding(int index, BinaryData embeddingProperty, InternalEmbeddingObj
8383
Vector = ConvertToVectorOfFloats(embeddingProperty);
8484
}
8585

86+
// CUSTOM: Entirely custom constructor used by the Model Factory.
87+
/// <summary> Initializes a new instance of <see cref="Embedding"/>. </summary>
88+
/// <param name="index"> The index of the embedding in the list of embeddings. </param>
89+
/// <param name="vector"> The embedding vector, which is a list of floats. </param>
90+
internal Embedding(int index, ReadOnlyMemory<float> vector)
91+
{
92+
Index = index;
93+
Vector = vector;
94+
}
95+
8696
// CUSTOM: Added as a public, custom property. For slightly better performance, the embedding is always requested as a base64-encoded
8797
// string and then manually transformed into a more user-friendly ReadOnlyMemory<float>.
8898
/// <summary>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
4+
namespace OpenAI.Embeddings;
5+
6+
/// <summary> Model factory for models. </summary>
7+
public static partial class OpenAIEmbeddingsModelFactory
8+
{
9+
/// <summary> Initializes a new instance of <see cref="OpenAI.Embeddings.Embedding"/>. </summary>
10+
/// <returns> A new <see cref="OpenAI.Embeddings.Embeddings"/> instance for mocking. </returns>
11+
public static Embedding Embedding(int index = default, IEnumerable<float> vector = null)
12+
{
13+
vector ??= new List<float>();
14+
15+
return new Embedding(
16+
index,
17+
vector.ToArray());
18+
}
19+
20+
/// <summary> Initializes a new instance of <see cref="OpenAI.Embeddings.EmbeddingCollection"/>. </summary>
21+
/// <returns> A new <see cref="OpenAI.Embeddings.EmbeddingCollection"/> instance for mocking. </returns>
22+
public static EmbeddingCollection EmbeddingCollection(IEnumerable<Embedding> items = null, string model = null, EmbeddingTokenUsage usage = null)
23+
{
24+
items ??= new List<Embedding>();
25+
26+
return new EmbeddingCollection(
27+
items.ToList(),
28+
model,
29+
@object: default,
30+
usage,
31+
serializedAdditionalRawData: null);
32+
}
33+
34+
/// <summary> Initializes a new instance of <see cref="OpenAI.Embeddings.EmbeddingTokenUsage"/>. </summary>
35+
/// <returns> A new <see cref="OpenAI.Embeddings.EmbeddingTokenUsage"/> instance for mocking. </returns>
36+
public static EmbeddingTokenUsage EmbeddingTokenUsage(int inputTokens = default, int totalTokens = default)
37+
{
38+
return new EmbeddingTokenUsage(
39+
inputTokens,
40+
totalTokens,
41+
serializedAdditionalRawData: null);
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
namespace OpenAI.Images;
6+
7+
/// <summary> Model factory for models. </summary>
8+
public static partial class OpenAIImagesModelFactory
9+
{
10+
/// <summary> Initializes a new instance of <see cref="OpenAI.Images.GeneratedImage"/>. </summary>
11+
/// <returns> A new <see cref="OpenAI.Images.GeneratedImage"/> instance for mocking. </returns>
12+
public static GeneratedImage GeneratedImage(BinaryData imageBytes = null, Uri imageUri = null, string revisedPrompt = null)
13+
{
14+
return new GeneratedImage(
15+
imageBytes,
16+
imageUri,
17+
revisedPrompt,
18+
serializedAdditionalRawData: null);
19+
}
20+
21+
/// <summary> Initializes a new instance of <see cref="OpenAI.Images.GeneratedImageCollection"/>. </summary>
22+
/// <returns> A new <see cref="OpenAI.Images.GeneratedImageCollection"/> instance for mocking. </returns>
23+
public static GeneratedImageCollection GeneratedImageCollection(DateTimeOffset createdAt = default, IEnumerable<GeneratedImage> items = null)
24+
{
25+
items ??= new List<GeneratedImage>();
26+
27+
return new GeneratedImageCollection(
28+
createdAt,
29+
items.ToList(),
30+
serializedAdditionalRawData: null);
31+
}
32+
}

0 commit comments

Comments
 (0)