Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add GroqSharp provider #303

Merged
merged 1 commit into from
May 15, 2024
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
35 changes: 26 additions & 9 deletions LangChain.sln
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Samples.Sequentia
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{B4ED97D9-08F2-4531-B21B-EA1B9CB4E52B}"
ProjectSection(SolutionItems) = preProject
.github\workflows\auto-format.yml = .github\workflows\auto-format.yml
.github\workflows\auto-labeling.yml = .github\workflows\auto-labeling.yml
.github\workflows\auto-merge.yml = .github\workflows\auto-merge.yml
.github\workflows\deep-infra.yml = .github\workflows\deep-infra.yml
.github\dependabot.yml = .github\dependabot.yml
.github\workflows\dotnet.yml = .github\workflows\dotnet.yml
.github\workflows\github-releases-to-discord.yml = .github\workflows\github-releases-to-discord.yml
.github\workflows\open-router.yml = .github\workflows\open-router.yml
.github\workflows\pull-request.yml = .github\workflows\pull-request.yml
.github\workflows\together.yml = .github\workflows\together.yml
.github\workflows\deep-infra.yml = .github\workflows\deep-infra.yml
.github\workflows\auto-format.yml = .github\workflows\auto-format.yml
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Providers", "Providers", "{E2B9833C-0397-4FAF-A3A8-116E58749750}"
Expand Down Expand Up @@ -338,21 +338,27 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Providers.DeepInf
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Providers.DeepInfra.CodeGenerator", "src\Providers\DeepInfra\tools\LangChain.Providers.DeepInfra.CodeGenerator\LangChain.Providers.DeepInfra.CodeGenerator.csproj", "{44851579-7483-444F-BA01-E6D5427FFBFC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangChain.DocumentLoaders.IntegrationTests", "src\DocumentLoaders\IntegrationTests\LangChain.DocumentLoaders.IntegrationTests.csproj", "{53E59425-FC2A-468C-A1FC-E20C54F30F95}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.DocumentLoaders.IntegrationTests", "src\DocumentLoaders\IntegrationTests\LangChain.DocumentLoaders.IntegrationTests.csproj", "{53E59425-FC2A-468C-A1FC-E20C54F30F95}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IntegrationTests", "IntegrationTests", "{69CDDB03-DEBC-4760-A7BB-A9241278A8DD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Reka", "Reka", "{7CA5B2C7-37ED-47CA-92F2-E599370F0DCB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangChain.Providers.Reka", "src\Providers\Reka\src\LangChain.Providers.Reka.csproj", "{35D833D5-24A4-449E-815E-8A31077E6B37}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Providers.Reka", "src\Providers\Reka\src\LangChain.Providers.Reka.csproj", "{35D833D5-24A4-449E-815E-8A31077E6B37}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Providers.Reka.Tests", "src\Providers\Reka\test\LangChain.Providers.Reka.Tests.csproj", "{ADB8BA40-F8AA-41C9-A56E-0550061A4D71}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangChain.Providers.Reka.Tests", "src\Providers\Reka\test\LangChain.Providers.Reka.Tests.csproj", "{ADB8BA40-F8AA-41C9-A56E-0550061A4D71}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Serve.OpenAI", "src\Serve\OpenAI\LangChain.Serve.OpenAI.csproj", "{7538A00F-C5A1-4D74-A264-FA4E6861A19B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangChain.Serve.OpenAI", "src\Serve\OpenAI\LangChain.Serve.OpenAI.csproj", "{7538A00F-C5A1-4D74-A264-FA4E6861A19B}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Samples.Serve.OpenAI", "examples\LangChain.Samples.Serve.OpenAI\LangChain.Samples.Serve.OpenAI.csproj", "{B5D7CED5-EF1E-4539-9220-1ABBA2A70AE4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangChain.Samples.Serve.OpenAI", "examples\LangChain.Samples.Serve.OpenAI\LangChain.Samples.Serve.OpenAI.csproj", "{B5D7CED5-EF1E-4539-9220-1ABBA2A70AE4}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Samples.LocalRAG", "examples\LangChain.Samples.LocalRAG\LangChain.Samples.LocalRAG.csproj", "{3BCE1801-0354-4062-94E1-A3AE9CF82874}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangChain.Samples.LocalRAG", "examples\LangChain.Samples.LocalRAG\LangChain.Samples.LocalRAG.csproj", "{3BCE1801-0354-4062-94E1-A3AE9CF82874}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Providers.GroqSharp", "src\Providers\GroqSharp\src\LangChain.Providers.GroqSharp.csproj", "{FD0A56AD-AFB4-4A21-99C1-9BE5D074EB56}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GroqSharp", "GroqSharp", "{5DEC2707-DD62-4DCD-AC5D-6670AC2A1B01}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Providers.GroqSharp.Test", "src\Providers\GroqSharp\test\LangChain.Providers.GroqSharp.Test.csproj", "{CC7F58F4-C824-4BED-8C4A-760C9AB8FC6E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down Expand Up @@ -720,6 +726,14 @@ Global
{3BCE1801-0354-4062-94E1-A3AE9CF82874}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3BCE1801-0354-4062-94E1-A3AE9CF82874}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3BCE1801-0354-4062-94E1-A3AE9CF82874}.Release|Any CPU.Build.0 = Release|Any CPU
{FD0A56AD-AFB4-4A21-99C1-9BE5D074EB56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FD0A56AD-AFB4-4A21-99C1-9BE5D074EB56}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FD0A56AD-AFB4-4A21-99C1-9BE5D074EB56}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FD0A56AD-AFB4-4A21-99C1-9BE5D074EB56}.Release|Any CPU.Build.0 = Release|Any CPU
{CC7F58F4-C824-4BED-8C4A-760C9AB8FC6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CC7F58F4-C824-4BED-8C4A-760C9AB8FC6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CC7F58F4-C824-4BED-8C4A-760C9AB8FC6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CC7F58F4-C824-4BED-8C4A-760C9AB8FC6E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -842,6 +856,7 @@ Global
{DE30162A-5D05-4E9B-80D7-43A8927D450E} = {177349C8-4FD3-466E-A7F4-67983A5B2C1F}
{3E6FEA5C-3F34-4BFF-BB68-2AFFF3B86436} = {A098FF69-D8B5-4B2B-83D5-F777D3817F15}
{FFB4B70D-85F9-4C9D-BBAE-4863F83AF950} = {3E6FEA5C-3F34-4BFF-BB68-2AFFF3B86436}
{6B66A8D4-4536-4B3C-AD2E-F6F48D2C7C13} = {69CDDB03-DEBC-4760-A7BB-A9241278A8DD}
{1434F398-ACFA-47F4-8978-70E698D03684} = {E2B9833C-0397-4FAF-A3A8-116E58749750}
{58026C3B-69DC-49EA-BD6E-032E27AA44E7} = {1434F398-ACFA-47F4-8978-70E698D03684}
{F3A3A951-F83E-4072-92D7-A7D8C75CF9F0} = {1434F398-ACFA-47F4-8978-70E698D03684}
Expand All @@ -854,13 +869,15 @@ Global
{44851579-7483-444F-BA01-E6D5427FFBFC} = {97A6B334-EB72-4B7E-A4EA-2073604DD94B}
{53E59425-FC2A-468C-A1FC-E20C54F30F95} = {AD076803-F723-4C2E-8599-75C418A4A07F}
{69CDDB03-DEBC-4760-A7BB-A9241278A8DD} = {A098FF69-D8B5-4B2B-83D5-F777D3817F15}
{6B66A8D4-4536-4B3C-AD2E-F6F48D2C7C13} = {69CDDB03-DEBC-4760-A7BB-A9241278A8DD}
{7CA5B2C7-37ED-47CA-92F2-E599370F0DCB} = {E2B9833C-0397-4FAF-A3A8-116E58749750}
{35D833D5-24A4-449E-815E-8A31077E6B37} = {7CA5B2C7-37ED-47CA-92F2-E599370F0DCB}
{ADB8BA40-F8AA-41C9-A56E-0550061A4D71} = {7CA5B2C7-37ED-47CA-92F2-E599370F0DCB}
{7538A00F-C5A1-4D74-A264-FA4E6861A19B} = {C5C6EB91-CF9B-48F8-A198-9D9065E65BD1}
{B5D7CED5-EF1E-4539-9220-1ABBA2A70AE4} = {F17A86AE-A174-4B6C-BAA7-9D9A9704BE85}
{3BCE1801-0354-4062-94E1-A3AE9CF82874} = {F17A86AE-A174-4B6C-BAA7-9D9A9704BE85}
{FD0A56AD-AFB4-4A21-99C1-9BE5D074EB56} = {5DEC2707-DD62-4DCD-AC5D-6670AC2A1B01}
{5DEC2707-DD62-4DCD-AC5D-6670AC2A1B01} = {E2B9833C-0397-4FAF-A3A8-116E58749750}
{CC7F58F4-C824-4BED-8C4A-760C9AB8FC6E} = {5DEC2707-DD62-4DCD-AC5D-6670AC2A1B01}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {5C00D0F1-6138-4ED9-846B-97E43D6DFF1C}
Expand Down
1 change: 1 addition & 0 deletions src/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<PackageVersion Include="FluentAssertions" Version="6.12.0" />
<PackageVersion Include="GitHubActionsTestLogger" Version="2.3.3" />
<PackageVersion Include="Google_GenerativeAI" Version="0.1.20" />
<PackageVersion Include="GroqSharp" Version="1.1.2" />
<PackageVersion Include="H.Generators.Extensions" Version="1.22.0" />
<PackageVersion Include="H.NSwag.Generator" Version="14.0.7.76">
<PrivateAssets>all</PrivateAssets>
Expand Down
62 changes: 62 additions & 0 deletions src/Providers/GroqSharp/src/GroqSharpChatModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
using GroqSharp.Models;
using System.Diagnostics;
using MessageGroqSharp = GroqSharp.Models.Message;

namespace LangChain.Providers.GroqSharp
{
public class GroqSharpChatModel(
GroqSharpProvider provider,
string id)
: ChatModel(id), IChatModel
{
public GroqSharpProvider Provider { get; } = provider ?? throw new ArgumentNullException(nameof(provider));
public override async Task<ChatResponse> GenerateAsync(
ChatRequest request,
ChatSettings settings = null,
CancellationToken cancellationToken = default)
{
request = request ?? throw new ArgumentNullException(nameof(request));
var prompt = ToPrompt(request.Messages);
var watch = Stopwatch.StartNew();
var response = await Provider.Api.CreateChatCompletionAsync(prompt);

var usage = Usage.Empty with
{
Time = watch.Elapsed,
};
AddUsage(usage);
provider.AddUsage(usage);

var result = request.Messages.ToList();
result.Add(response.AsAiMessage());

return new ChatResponse
{
Messages = result,
Usage = usage,
UsedSettings = ChatSettings.Default,
};
}

protected static MessageGroqSharp[] ToPrompt(IEnumerable<Message> messages)
{
return messages.Select(ConvertMessage).ToArray();
}

protected static MessageGroqSharp ConvertMessage(Message message)
{
return new MessageGroqSharp { Role = ConvertRole(message.Role), Content = message.Content };
}
protected static MessageRoleType ConvertRole(MessageRole role)
{
return role switch
{
MessageRole.Human => MessageRoleType.User,
MessageRole.Ai => MessageRoleType.Assistant,
MessageRole.System => MessageRoleType.System,
_ => throw new NotSupportedException($"the role {role} is not supported")
};
}

}
}
14 changes: 14 additions & 0 deletions src/Providers/GroqSharp/src/GroqSharpConfiguration.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace LangChain.Providers.GroqSharp
{
public class GroqSharpConfiguration
{
public const string SectionName = "GroqSharp";
public string ApiKey { get; set; }
public string ModelId { get; set; }
public double Temperature { get; set; } = 0.5;
public int MaxTokens { get; set; } = int.MaxValue;
public double TopP { get; set; } = 1.0;
public string Stop { get; set; } = "NONE";
public int StructuredRetryPolicy { get; set; } = 5;
}
}
29 changes: 29 additions & 0 deletions src/Providers/GroqSharp/src/GroqSharpProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
namespace LangChain.Providers.GroqSharp
{
public class GroqSharpProvider : Provider
{
public IGroqClient Api { get; private set; }
public GroqSharpProvider(GroqClient groqClient)
: base(id: GroqSharpConfiguration.SectionName)
{
Api = groqClient ?? throw new ArgumentNullException(nameof(groqClient));
}

public GroqSharpProvider(GroqSharpConfiguration configuration)
: base(id: GroqSharpConfiguration.SectionName)
{
configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
var apiKey = configuration.ApiKey ?? throw new ArgumentException("ApiKey is not defined", nameof(configuration));
var apiModel = configuration.ModelId ?? throw new ArgumentException("ModelId is not defined", nameof(configuration));

Api = new GroqClient(apiKey, apiModel)
.SetTemperature(configuration.Temperature)
.SetMaxTokens(configuration.MaxTokens)
.SetTopP(configuration.TopP)
.SetStop(configuration.Stop)
.SetStructuredRetryPolicy(configuration.StructuredRetryPolicy);

}

}
}
23 changes: 23 additions & 0 deletions src/Providers/GroqSharp/src/LangChain.Providers.GroqSharp.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net8.0</TargetFrameworks>
<NoWarn>$(NoWarn);CA1054</NoWarn>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\Abstractions\src\LangChain.Providers.Abstractions.csproj" />
<PackageReference Include="GroqSharp" />
</ItemGroup>

<ItemGroup Label="Usings">
<Using Include="System.Net.Http" />
<Using Include="GroqSharp" Version="1.1.2" />
</ItemGroup>

<PropertyGroup Label="NuGet">
<Description>Groq model provider.</Description>
<PackageTags>$(PackageTags);groq;ai;api</PackageTags>
</PropertyGroup>

</Project>
16 changes: 16 additions & 0 deletions src/Providers/GroqSharp/src/Predefined/GroqSharpModels.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace LangChain.Providers.GroqSharp.Predefined
{

public class Llama38b8192(GroqSharpProvider provider)
: GroqSharpChatModel(provider, id: "llama3-8b-8192");
Comment on lines +4 to +5
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Class name should follow PascalCase naming convention.

- public class Llama38b8192(GroqSharpProvider provider)
+ public class Llama38B8192(GroqSharpProvider provider)

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
public class Llama38b8192(GroqSharpProvider provider)
: GroqSharpChatModel(provider, id: "llama3-8b-8192");
public class Llama38B8192(GroqSharpProvider provider)
: GroqSharpChatModel(provider, id: "llama3-8b-8192");


public class Llama370b8192(GroqSharpProvider provider)
: GroqSharpChatModel(provider, id: "llama3-70b-8192");
Comment on lines +7 to +8
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Class name should follow PascalCase naming convention.

- public class Llama370b8192(GroqSharpProvider provider)
+ public class Llama370B8192(GroqSharpProvider provider)

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
public class Llama370b8192(GroqSharpProvider provider)
: GroqSharpChatModel(provider, id: "llama3-70b-8192");
public class Llama370B8192(GroqSharpProvider provider)
: GroqSharpChatModel(provider, id: "llama3-70b-8192");


public class Mixtral8x7b32768(GroqSharpProvider provider)
: GroqSharpChatModel(provider, id: "mixtral-8x7b-32768");
Comment on lines +10 to +11
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Class name should follow PascalCase naming convention.

- public class Mixtral8x7b32768(GroqSharpProvider provider)
+ public class Mixtral8X7B32768(GroqSharpProvider provider)

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
public class Mixtral8x7b32768(GroqSharpProvider provider)
: GroqSharpChatModel(provider, id: "mixtral-8x7b-32768");
public class Mixtral8X7B32768(GroqSharpProvider provider)
: GroqSharpChatModel(provider, id: "mixtral-8x7b-32768");


public class Gemma7bIt(GroqSharpProvider provider)
: GroqSharpChatModel(provider, id: "gemma-7b-it");
Comment on lines +13 to +14
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Class name should follow PascalCase naming convention.

- public class Gemma7bIt(GroqSharpProvider provider)
+ public class Gemma7BIt(GroqSharpProvider provider)

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
public class Gemma7bIt(GroqSharpProvider provider)
: GroqSharpChatModel(provider, id: "gemma-7b-it");
public class Gemma7BIt(GroqSharpProvider provider)
: GroqSharpChatModel(provider, id: "gemma-7b-it");


}
29 changes: 29 additions & 0 deletions src/Providers/GroqSharp/test/GroqSharpTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using LangChain.Providers.GroqSharp.Predefined;
using NUnit.Framework;

namespace LangChain.Providers.GroqSharp.Test;

[TestFixture]
[Explicit]
public partial class GroqSharpTest
{
[Test]
public async Task Chat()
{

var config = new GroqSharpConfiguration()
{
ApiKey = Environment.GetEnvironmentVariable("GROQ_API_KEY") ??
throw new InconclusiveException("GROQ_API_KEY is not set."),
ModelId = "llama3-70b-8192"
};

var provider = new GroqSharpProvider(config);
var model = new Llama370b8192(provider);

string answer = await model.GenerateAsync("Generate some random name:");

Console.WriteLine(answer);
Comment on lines +10 to +26
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add assertions to verify the generated response.

- Console.WriteLine(answer);
+ Assert.IsNotNull(answer);
+ Assert.IsNotEmpty(answer);
+ Console.WriteLine(answer);

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
[Test]
public async Task Chat()
{
var config = new GroqSharpConfiguration()
{
ApiKey = Environment.GetEnvironmentVariable("GROQ_API_KEY") ??
throw new InconclusiveException("GROQ_API_KEY is not set."),
ModelId = "llama3-70b-8192"
};
var provider = new GroqSharpProvider(config);
var model = new Llama370b8192(provider);
string answer = await model.GenerateAsync("Generate some random name:");
Console.WriteLine(answer);
[Test]
public async Task Chat()
{
var config = new GroqSharpConfiguration()
{
ApiKey = Environment.GetEnvironmentVariable("GROQ_API_KEY") ??
throw new InconclusiveException("GROQ_API_KEY is not set."),
ModelId = "llama3-70b-8192"
};
var provider = new GroqSharpProvider(config);
var model = new Llama370b8192(provider);
string answer = await model.GenerateAsync("Generate some random name:");
Assert.IsNotNull(answer);
Assert.IsNotEmpty(answer);
Console.WriteLine(answer);

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="NUnit" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\Abstractions\src\LangChain.Providers.Abstractions.csproj" />
<ProjectReference Include="..\src\LangChain.Providers.GroqSharp.csproj" />
</ItemGroup>

</Project>
Loading