Skip to content

Commit

Permalink
fix: Fixed warnings.
Browse files Browse the repository at this point in the history
  • Loading branch information
HavenDV committed Mar 2, 2024
1 parent 3290566 commit 7990f48
Show file tree
Hide file tree
Showing 14 changed files with 127 additions and 67 deletions.
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// ReSharper disable once CheckNamespace
namespace LangChain.Providers;

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// ReSharper disable once CheckNamespace
namespace LangChain.Providers;

/// <summary>
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
// ReSharper disable once CheckNamespace
// ReSharper disable ConditionalAccessQualifierIsNonNullableAccordingToAPIContract
namespace LangChain.Providers;

#pragma warning disable CA2225
Expand Down
12 changes: 0 additions & 12 deletions src/Providers/Abstractions/src/ImageToText/ImageToTextSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,13 @@ public class ImageToTextSettings
public static ImageToTextSettings Default { get; } = new()
{
User = string.Empty,
Endpoint = "https://api-inference.huggingface.co/models/"
};

/// <summary>
/// Unique user identifier.
/// </summary>
public string? User { get; init; }

/// <summary>
/// Endpoint url for api.
/// </summary>
public string Endpoint { get; set; }


/// <summary>
/// Calculate the settings to use for the request.
Expand All @@ -44,12 +38,6 @@ public static ImageToTextSettings Calculate(
providerSettings?.User ??
Default.User ??
throw new InvalidOperationException("Default User is not set."),
Endpoint =
requestSettings?.Endpoint ??
modelSettings?.Endpoint ??
providerSettings?.Endpoint ??
Default.Endpoint ??
throw new InvalidOperationException("Default Endpoint is not set."),
};
}
}
27 changes: 27 additions & 0 deletions src/Providers/Abstractions/src/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
abstract LangChain.Providers.ChatModel.GenerateAsync(LangChain.Providers.ChatRequest! request, LangChain.Providers.ChatSettings? settings = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<LangChain.Providers.ChatResponse!>!
abstract LangChain.Providers.ImageToTextModel.GenerateTextFromImageAsync(LangChain.Providers.ImageToTextRequest! request, LangChain.Providers.ImageToTextSettings? settings = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<LangChain.Providers.ImageToTextResponse!>!
LangChain.Providers.ChatModel
LangChain.Providers.ChatModel.ChatModel(string! id) -> void
LangChain.Providers.ChatModel.CompletedResponseGenerated -> System.EventHandler<string!>?
Expand Down Expand Up @@ -67,6 +68,28 @@ LangChain.Providers.IChatModelWithTokenCounting
LangChain.Providers.IEmbeddingModel
LangChain.Providers.IEmbeddingModel.CreateEmbeddingsAsync(LangChain.Providers.EmbeddingRequest! request, LangChain.Providers.EmbeddingSettings? settings = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<LangChain.Providers.EmbeddingResponse!>!
LangChain.Providers.IEmbeddingModel.MaximumInputLength.get -> int
LangChain.Providers.IImageToTextModel
LangChain.Providers.IImageToTextModel.GenerateTextFromImageAsync(LangChain.Providers.ImageToTextRequest! request, LangChain.Providers.ImageToTextSettings? settings = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<LangChain.Providers.ImageToTextResponse!>!
LangChain.Providers.IImageToTextModel<TRequest, TResponse, TSettings>
LangChain.Providers.IImageToTextModel<TRequest, TResponse, TSettings>.GenerateTextFromImageAsync(TRequest request, TSettings? settings = default(TSettings?), System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TResponse>!
LangChain.Providers.ImageToTextModel
LangChain.Providers.ImageToTextModel.ImageToTextModel(string! id) -> void
LangChain.Providers.ImageToTextRequest
LangChain.Providers.ImageToTextRequest.Image.get -> System.BinaryData!
LangChain.Providers.ImageToTextRequest.Image.init -> void
LangChain.Providers.ImageToTextRequest.ImageToTextRequest() -> void
LangChain.Providers.ImageToTextResponse
LangChain.Providers.ImageToTextResponse.ImageToTextResponse() -> void
LangChain.Providers.ImageToTextResponse.Text.get -> string?
LangChain.Providers.ImageToTextResponse.Text.set -> void
LangChain.Providers.ImageToTextResponse.Usage.get -> LangChain.Providers.Usage
LangChain.Providers.ImageToTextResponse.Usage.init -> void
LangChain.Providers.ImageToTextResponse.UsedSettings.get -> LangChain.Providers.ImageToTextSettings!
LangChain.Providers.ImageToTextResponse.UsedSettings.init -> void
LangChain.Providers.ImageToTextSettings
LangChain.Providers.ImageToTextSettings.ImageToTextSettings() -> void
LangChain.Providers.ImageToTextSettings.User.get -> string?
LangChain.Providers.ImageToTextSettings.User.init -> void
LangChain.Providers.IMaximumInputTokens
LangChain.Providers.IMaximumInputTokens.MaximumInputTokens.get -> int
LangChain.Providers.IModel
Expand Down Expand Up @@ -151,6 +174,8 @@ LangChain.Providers.Provider.ChatSettings.get -> LangChain.Providers.ChatSetting
LangChain.Providers.Provider.ChatSettings.init -> void
LangChain.Providers.Provider.EmbeddingSettings.get -> LangChain.Providers.EmbeddingSettings?
LangChain.Providers.Provider.EmbeddingSettings.init -> void
LangChain.Providers.Provider.ImageToTextSettings.get -> LangChain.Providers.ImageToTextSettings?
LangChain.Providers.Provider.ImageToTextSettings.init -> void
LangChain.Providers.Provider.ModerationSettings.get -> LangChain.Providers.ModerationSettings?
LangChain.Providers.Provider.ModerationSettings.init -> void
LangChain.Providers.Provider.Provider(string! id) -> void
Expand Down Expand Up @@ -262,6 +287,8 @@ static LangChain.Providers.EmbeddingRequest.ToEmbeddingRequest(string![]! messag
static LangChain.Providers.EmbeddingResponse.implicit operator float[]!(LangChain.Providers.EmbeddingResponse! response) -> float[]!
static LangChain.Providers.EmbeddingResponse.implicit operator float[]![]!(LangChain.Providers.EmbeddingResponse! response) -> float[]![]!
static LangChain.Providers.EmbeddingSettings.Default.get -> LangChain.Providers.EmbeddingSettings!
static LangChain.Providers.ImageToTextSettings.Calculate(LangChain.Providers.ImageToTextSettings? requestSettings, LangChain.Providers.ImageToTextSettings? modelSettings, LangChain.Providers.ImageToTextSettings? providerSettings) -> LangChain.Providers.ImageToTextSettings!
static LangChain.Providers.ImageToTextSettings.Default.get -> LangChain.Providers.ImageToTextSettings!
static LangChain.Providers.Message.Add(LangChain.Providers.Message left, LangChain.Providers.Message right) -> LangChain.Providers.Message
static LangChain.Providers.Message.Ai(string! content) -> LangChain.Providers.Message
static LangChain.Providers.Message.Empty.get -> LangChain.Providers.Message
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,9 @@ public static IReadOnlyList<string> Split(
$"InvokeModelAsync failed with status code: {response.HttpStatusCode}");
}

#if NET6_0_OR_GREATER && !NET8_0_OR_GREATER
return JsonNode.Parse(utf8Json: response.Body);
#else
return await JsonNode.ParseAsync(
utf8Json: response.Body,
cancellationToken: cancellationToken).ConfigureAwait(false);
#endif
}

public static async Task<JsonNode?> InvokeModelAsync(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public async Task<TextToImageResponse> GenerateImageAsync(
},
cancellationToken).ConfigureAwait(false);

var images = response.Images.Select(image => Data.FromBase64(image)).ToList();
var images = response?.Images.Select(Data.FromBase64).ToList() ?? [];

var usage = Usage.Empty with
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
using System.Text.Json.Serialization;

// ReSharper disable once CheckNamespace
namespace LangChain.Providers.Amazon.Bedrock;

public class AmazonTitanTextToImageResponse
{
[JsonPropertyName("images")]
public IList<string> Images { get; set; }
public IReadOnlyList<string> Images { get; set; } = new List<string>();
}
16 changes: 6 additions & 10 deletions src/Providers/Amazon.Bedrock/test/EmbeddedResource.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
// Copyright (c) Microsoft. All rights reserved.

using System;
using System.Configuration;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;

namespace Resources;

Expand All @@ -20,20 +16,20 @@ namespace Resources;
/// </summary>
internal static class EmbeddedResource
{
private static readonly string? s_namespace = typeof(EmbeddedResource).Namespace;
private static readonly string? SNamespace = typeof(EmbeddedResource).Namespace;

internal static string Read(string fileName)
{
// Get the current assembly. Note: this class is in the same assembly where the embedded resources are stored.
Assembly assembly =
typeof(EmbeddedResource).GetTypeInfo().Assembly ??
throw new ConfigurationException($"[{s_namespace}] {fileName} assembly not found");
throw new ArgumentException($"[{SNamespace}] {fileName} assembly not found");

// Resources are mapped like types, using the namespace and appending "." (dot) and the file name
var resourceName = $"{s_namespace}." + fileName;
var resourceName = $"{SNamespace}." + fileName;
using Stream resource =
assembly.GetManifestResourceStream(resourceName) ??
throw new ConfigurationException($"{resourceName} resource not found");
throw new ArgumentException($"{resourceName} resource not found");

// Return the resource content, in text format.
using var reader = new StreamReader(resource);
Expand All @@ -45,10 +41,10 @@ internal static string Read(string fileName)
// Get the current assembly. Note: this class is in the same assembly where the embedded resources are stored.
Assembly assembly =
typeof(EmbeddedResource).GetTypeInfo().Assembly ??
throw new ConfigurationException($"[{s_namespace}] {fileName} assembly not found");
throw new ArgumentException($"[{SNamespace}] {fileName} assembly not found");

// Resources are mapped like types, using the namespace and appending "." (dot) and the file name
var resourceName = $"{s_namespace}." + fileName;
var resourceName = $"{SNamespace}." + fileName;
return assembly.GetManifestResourceStream(resourceName);
}

Expand Down
42 changes: 19 additions & 23 deletions src/Providers/HuggingFace/src/HuggingFaceImageToTextModel.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System.Diagnostics;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace LangChain.Providers.HuggingFace;

Expand All @@ -11,29 +13,33 @@ public class HuggingFaceImageToTextModel(
string id)
: ImageToTextModel(id), IImageToTextModel
{
public override async Task<ImageToTextResponse> GenerateTextFromImageAsync(ImageToTextRequest request, ImageToTextSettings? settings = default,
public override async Task<ImageToTextResponse> GenerateTextFromImageAsync(
ImageToTextRequest request,
ImageToTextSettings? settings = default,
CancellationToken cancellationToken = default)
{
request = request ?? throw new ArgumentNullException(nameof(request));

var watch = Stopwatch.StartNew();

var usedSettings = ImageToTextSettings.Calculate(
var usedSettings = HuggingFaceImageToTextSettings.Calculate(
requestSettings: settings,
modelSettings: Settings,
providerSettings: provider.ImageToTextSettings);

var imageContent = new ByteArrayContent(request.Image.ToArray());
if (request.Image.MediaType != null) imageContent.Headers.ContentType = new(request.Image.MediaType);

var httpRequest = new HttpRequestMessage(HttpMethod.Post, usedSettings.Endpoint + id)
if (request.Image.MediaType != null)
{
Content = imageContent
};
imageContent.Headers.ContentType = new MediaTypeHeaderValue(request.Image.MediaType);
}

using var httpRequest = new HttpRequestMessage(HttpMethod.Post, usedSettings.Endpoint + Id);
httpRequest.Content = imageContent;

var response = await provider.HttpClient.SendAsync(httpRequest, HttpCompletionOption.ResponseContentRead, cancellationToken).ConfigureAwait(false);
var body = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
var deserializeResponse = DeserializeResponse<ImageToTextGenerationResponse>(body);
var json = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
var generation = JsonSerializer.Deserialize(json, SourceGenerationContext.Default.ImageToTextGenerationResponse) ??
throw new InvalidOperationException("Response is null");

var usage = Usage.Empty with
{
Expand All @@ -44,22 +50,12 @@ public override async Task<ImageToTextResponse> GenerateTextFromImageAsync(Image

return new ImageToTextResponse
{
Text = deserializeResponse.SingleOrDefault()?.GeneratedText,
Text = generation.SingleOrDefault()?.GeneratedText,
UsedSettings = usedSettings,
Usage = usage,
};
}
}

private static T DeserializeResponse<T>(string body)
{
body = body ?? throw new ArgumentNullException(nameof(body));

T? deserializedResponse = JsonSerializer.Deserialize<T>(body);
if (deserializedResponse is null)
{
throw new JsonException("Response is null");
}

return deserializedResponse;
}
}
[JsonSerializable(typeof(ImageToTextGenerationResponse))]
public partial class SourceGenerationContext : JsonSerializerContext;
54 changes: 54 additions & 0 deletions src/Providers/HuggingFace/src/HuggingFaceImageToTextSettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// ReSharper disable once CheckNamespace
namespace LangChain.Providers;

/// <summary>
/// Base class for image to text request settings.
/// </summary>
public class HuggingFaceImageToTextSettings : ImageToTextSettings
{
public new static HuggingFaceImageToTextSettings Default { get; } = new()
{
User = ImageToTextSettings.Default.User,
Endpoint = "https://api-inference.huggingface.co/models/"
};

/// <summary>
/// Endpoint url for api.
/// </summary>
public string? Endpoint { get; set; }


/// <summary>
/// Calculate the settings to use for the request.
/// </summary>
/// <param name="requestSettings"></param>
/// <param name="modelSettings"></param>
/// <param name="providerSettings"></param>
/// <returns></returns>
/// <exception cref="InvalidOperationException"></exception>
public new static HuggingFaceImageToTextSettings Calculate(
ImageToTextSettings? requestSettings,
ImageToTextSettings? modelSettings,
ImageToTextSettings? providerSettings)
{
var requestSettingsCasted = requestSettings as HuggingFaceImageToTextSettings;
var modelSettingsCasted = modelSettings as HuggingFaceImageToTextSettings;
var providerSettingsCasted = providerSettings as HuggingFaceImageToTextSettings;

return new HuggingFaceImageToTextSettings
{
User =
requestSettings?.User ??
modelSettings?.User ??
providerSettings?.User ??
Default.User ??
throw new InvalidOperationException("Default User is not set."),
Endpoint =
requestSettingsCasted?.Endpoint ??
modelSettingsCasted?.Endpoint ??
providerSettingsCasted?.Endpoint ??
Default.Endpoint ??
throw new InvalidOperationException("Default Endpoint is not set."),
};
}
}
15 changes: 15 additions & 0 deletions src/Providers/HuggingFace/src/ImageToTextGenerationResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.Text.Json.Serialization;

// ReSharper disable once CheckNamespace
namespace LangChain.Providers;

public class ImageToTextGenerationResponse : List<GeneratedTextItem>;

public sealed class GeneratedTextItem
{
/// <summary>
/// The continuated string
/// </summary>
[JsonPropertyName("generated_text")]
public string? GeneratedText { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\Utilities\Pollyfils\src\LangChain.Polyfills.csproj" />
<ProjectReference Include="..\..\Abstractions\src\LangChain.Providers.Abstractions.csproj" />
</ItemGroup>

Expand Down

0 comments on commit 7990f48

Please sign in to comment.