style: 调整架构引用
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Yi.Framework.AiHub.Domain.Shared.Dtos.OpenAi.Embeddings;
|
||||
|
||||
//TODO add model validation
|
||||
//TODO check what is string or array for prompt,..
|
||||
public record EmbeddingCreateRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// Input text to get embeddings for, encoded as a string or array of tokens. To get embeddings for multiple inputs
|
||||
/// in a single request, pass an array of strings or array of token arrays. Each input must not exceed 2048 tokens in
|
||||
/// length.
|
||||
/// Unless your are embedding code, we suggest replacing newlines (`\n`) in your input with a single space, as we have
|
||||
/// observed inferior results when newlines are present.
|
||||
/// </summary>
|
||||
/// <see href="https://platform.openai.com/docs/api-reference/embeddings/create#embeddings/create-input" />
|
||||
[JsonIgnore]
|
||||
public List<string>? InputAsList { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Input text to get embeddings for, encoded as a string or array of tokens. To get embeddings for multiple inputs
|
||||
/// in a single request, pass an array of strings or array of token arrays. Each input must not exceed 2048 tokens in
|
||||
/// length.
|
||||
/// Unless your are embedding code, we suggest replacing newlines (`\n`) in your input with a single space, as we have
|
||||
/// observed inferior results when newlines are present.
|
||||
/// </summary>
|
||||
/// <see href="https://platform.openai.com/docs/api-reference/embeddings/create#embeddings/create-input" />
|
||||
[JsonIgnore]
|
||||
public string? Input { get; set; }
|
||||
|
||||
|
||||
[JsonPropertyName("input")]
|
||||
public IList<string>? InputCalculated
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Input != null && InputAsList != null)
|
||||
{
|
||||
throw new ValidationException(
|
||||
"Input and InputAsList can not be assigned at the same time. One of them is should be null.");
|
||||
}
|
||||
|
||||
if (Input != null)
|
||||
{
|
||||
return new List<string> { Input };
|
||||
}
|
||||
|
||||
return InputAsList;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ID of the model to use. You can use the [List models](/docs/api-reference/models/list) API to see all of your
|
||||
/// available models, or see our [Model overview](/docs/models/overview) for descriptions of them.
|
||||
/// </summary>
|
||||
/// <see href="https://platform.openai.com/docs/api-reference/embeddings/create#embeddings/create-model" />
|
||||
[JsonPropertyName("model")]
|
||||
public string? Model { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The number of dimensions the resulting output embeddings should have. Only supported in text-embedding-3 and later models.
|
||||
/// </summary>
|
||||
/// <see href="https://platform.openai.com/docs/api-reference/embeddings/create#embeddings-create-dimensions" />
|
||||
[JsonPropertyName("dimensions")]
|
||||
public int? Dimensions { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The format to return the embeddings in. Can be either float or base64.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[JsonPropertyName("encoding_format")]
|
||||
public string? EncodingFormat { get; set; }
|
||||
|
||||
public IEnumerable<ValidationResult> Validate()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
using System.Buffers;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Yi.Framework.AiHub.Domain.Shared.Dtos.OpenAi.Embeddings;
|
||||
|
||||
public record EmbeddingCreateResponse : ThorBaseResponse
|
||||
{
|
||||
[JsonPropertyName("model")] public string Model { get; set; }
|
||||
|
||||
[JsonPropertyName("data")] public List<EmbeddingResponse> Data { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 类型转换,如果类型是base64,则将float[]转换为base64,如果是空或是float和原始类型一样,则不转换
|
||||
/// </summary>
|
||||
public void ConvertEmbeddingData(string? encodingFormat)
|
||||
{
|
||||
if (Data.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch (encodingFormat)
|
||||
{
|
||||
// 判断第一个是否是float[],如果是则不转换
|
||||
case null or "float" when Data[0].Embedding is float[]:
|
||||
return;
|
||||
// 否则转换成float[]
|
||||
case null or "float":
|
||||
{
|
||||
foreach (var embeddingResponse in Data)
|
||||
{
|
||||
if (embeddingResponse.Embedding is string base64)
|
||||
{
|
||||
embeddingResponse.Embedding = Convert.FromBase64String(base64);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
// 判断第一个是否是string,如果是则不转换
|
||||
case "base64" when Data[0].Embedding is string:
|
||||
return;
|
||||
// 否则转换成base64
|
||||
case "base64":
|
||||
{
|
||||
foreach (var embeddingResponse in Data)
|
||||
{
|
||||
if (embeddingResponse.Embedding is JsonElement str)
|
||||
{
|
||||
if (str.ValueKind == JsonValueKind.Array)
|
||||
{
|
||||
var floats = str.EnumerateArray().Select(element => element.GetSingle()).ToArray();
|
||||
|
||||
embeddingResponse.Embedding = ConvertFloatArrayToBase64(floats);
|
||||
}
|
||||
}
|
||||
else if (embeddingResponse.Embedding is IList<double> doubles)
|
||||
{
|
||||
embeddingResponse.Embedding = ConvertFloatArrayToBase64(doubles.ToArray());
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static string ConvertFloatArrayToBase64(double[] floatArray)
|
||||
{
|
||||
// 将 float[] 转换成 byte[]
|
||||
byte[] byteArray = ArrayPool<byte>.Shared.Rent(floatArray.Length * sizeof(float));
|
||||
try
|
||||
{
|
||||
Buffer.BlockCopy(floatArray, 0, byteArray, 0, byteArray.Length);
|
||||
|
||||
// 将 byte[] 转换成 base64 字符串
|
||||
return Convert.ToBase64String(byteArray);
|
||||
}
|
||||
finally
|
||||
{
|
||||
ArrayPool<byte>.Shared.Return(byteArray);
|
||||
}
|
||||
}
|
||||
|
||||
public static string ConvertFloatArrayToBase64(float[] floatArray)
|
||||
{
|
||||
// 将 float[] 转换成 byte[]
|
||||
byte[] byteArray = ArrayPool<byte>.Shared.Rent(floatArray.Length * sizeof(float));
|
||||
try
|
||||
{
|
||||
Buffer.BlockCopy(floatArray, 0, byteArray, 0, floatArray.Length);
|
||||
|
||||
// 将 byte[] 转换成 base64 字符串
|
||||
return Convert.ToBase64String(byteArray);
|
||||
}
|
||||
finally
|
||||
{
|
||||
ArrayPool<byte>.Shared.Return(byteArray);
|
||||
}
|
||||
}
|
||||
|
||||
[JsonPropertyName("usage")] public ThorUsageResponse? Usage { get; set; }
|
||||
}
|
||||
|
||||
public record EmbeddingResponse
|
||||
{
|
||||
[JsonPropertyName("index")] public int? Index { get; set; }
|
||||
|
||||
[JsonPropertyName("embedding")] public object Embedding { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Yi.Framework.AiHub.Domain.Shared.Dtos.OpenAi.Embeddings;
|
||||
|
||||
public sealed class ThorEmbeddingInput
|
||||
{
|
||||
[JsonPropertyName("model")]
|
||||
public string Model { get; set; }
|
||||
|
||||
[JsonPropertyName("input")]
|
||||
public object Input { get; set; }
|
||||
|
||||
[JsonPropertyName("encoding_format")]
|
||||
public string EncodingFormat { get; set; }
|
||||
|
||||
[JsonPropertyName("dimensions")]
|
||||
public int? Dimensions { get; set; }
|
||||
|
||||
[JsonPropertyName("user")]
|
||||
public string? User { get; set; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user