Skip to content

Commit

Permalink
Merge branch 'refs/heads/main' into databases-abstractions
Browse files Browse the repository at this point in the history
# Conflicts:
#	LangChain.sln
#	src/Databases/Sqlite/src/LangChain.Databases.Sqlite.csproj
  • Loading branch information
HavenDV committed Apr 15, 2024
2 parents 14e7117 + 4947f83 commit 954d315
Show file tree
Hide file tree
Showing 70 changed files with 1,520 additions and 127 deletions.
29 changes: 29 additions & 0 deletions .github/workflows/dependabot-approve-and-automerge.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: dependabot auto-approve and auto-merge
on: pull_request

permissions:
contents: write
pull-requests: write

jobs:
dependabot:
runs-on: ubuntu-latest
if: ${{ github.actor == 'dependabot[bot]' && github.repository_owner == 'tryAGI' }}
steps:
- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@0fb21704c18a42ce5aa8d720ea4b912f5e6babef
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"

- name: Approve a PR
run: gh pr review --approve "$PR_URL"
env:
PR_URL: ${{ github.event.pull_request.html_url }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Enable auto-merge for Dependabot PRs
run: gh pr merge --auto --merge "$PR_URL"
env:
PR_URL: ${{ github.event.pull_request.html_url }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
58 changes: 40 additions & 18 deletions LangChain.sln
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{
.github\workflows\dotnet.yml = .github\workflows\dotnet.yml
.github\workflows\github-releases-to-discord.yml = .github\workflows\github-releases-to-discord.yml
.github\workflows\pull-request.yml = .github\workflows\pull-request.yml
.github\workflows\dependabot-approve-and-automerge.yml = .github\workflows\dependabot-approve-and-automerge.yml
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Providers", "Providers", "{E2B9833C-0397-4FAF-A3A8-116E58749750}"
Expand All @@ -48,6 +49,9 @@ EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Providers.Abstractions", "src\Providers\Abstractions\src\LangChain.Providers.Abstractions.csproj", "{39DD36B2-90B3-40B0-98EC-F1AB59CA7F91}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Abstractions", "Abstractions", "{FC28B45D-2604-4F4C-BC3E-F2301EDB3469}"
ProjectSection(SolutionItems) = preProject
src\Providers\Abstractions\README.md = src\Providers\Abstractions\README.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "OpenAI", "OpenAI", "{9855527C-805E-4B73-88F7-566EF9AC59C1}"
EndProject
Expand Down Expand Up @@ -298,11 +302,23 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Providers.Togethe
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Providers.TogetherAi.Tests", "src\Providers\TogetherAI\tests\LangChain.Providers.TogetherAi.Tests.csproj", "{0161A0F5-D55C-418A-BF54-AEE8EC73C52C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Abstractions", "Abstractions", "{847E2EAD-CDC7-47A9-ACA7-D0B0B6690074}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Serve.Abstractions", "src\Serve\Abstractions\LangChain.Serve.Abstractions\LangChain.Serve.Abstractions.csproj", "{4F7C9B03-84B8-47D9-9EA2-499BC5F1D4A6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangChain.Databases.Sqlite.IntegrationTests", "src\tests\LangChain.Databases.Sqlite.IntegrationTests\LangChain.Databases.Sqlite.IntegrationTests.csproj", "{9481A85D-F8B4-4DC6-9F05-71E52B76D46F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangChain.Databases.Abstractions", "src\Databases\Abstractions\src\LangChain.Databases.Abstractions.csproj", "{3D3FFFD5-534C-4C27-8040-F5BF24DA5727}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Bedrock", "Bedrock", "{6622DE9C-A23A-44E6-B661-EC784CE6C75C}"
ProjectSection(SolutionItems) = preProject
src\Providers\Amazon.Bedrock\README.md = src\Providers\Amazon.Bedrock\README.md
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SageMaker", "SageMaker", "{E6A4D04E-CC83-4F24-89B4-04F3EF61715F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Cli", "Cli", "{177349C8-4FD3-466E-A7F4-67983A5B2C1F}"
ProjectSection(SolutionItems) = preProject
src\Cli\README.md = src\Cli\README.md
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangChain.Databases.Abstractions.Tests", "src\Databases\Abstractions\test\LangChain.Databases.Abstractions.Tests.csproj", "{C0A29AA1-DBE8-4B6F-8A8F-716F0BDF5C72}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangChain.Cli", "src\Cli\src\LangChain.Cli.csproj", "{DE30162A-5D05-4E9B-80D7-43A8927D450E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down Expand Up @@ -630,14 +646,18 @@ Global
{0161A0F5-D55C-418A-BF54-AEE8EC73C52C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0161A0F5-D55C-418A-BF54-AEE8EC73C52C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0161A0F5-D55C-418A-BF54-AEE8EC73C52C}.Release|Any CPU.Build.0 = Release|Any CPU
{3D3FFFD5-534C-4C27-8040-F5BF24DA5727}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3D3FFFD5-534C-4C27-8040-F5BF24DA5727}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3D3FFFD5-534C-4C27-8040-F5BF24DA5727}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3D3FFFD5-534C-4C27-8040-F5BF24DA5727}.Release|Any CPU.Build.0 = Release|Any CPU
{C0A29AA1-DBE8-4B6F-8A8F-716F0BDF5C72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C0A29AA1-DBE8-4B6F-8A8F-716F0BDF5C72}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C0A29AA1-DBE8-4B6F-8A8F-716F0BDF5C72}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C0A29AA1-DBE8-4B6F-8A8F-716F0BDF5C72}.Release|Any CPU.Build.0 = Release|Any CPU
{4F7C9B03-84B8-47D9-9EA2-499BC5F1D4A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4F7C9B03-84B8-47D9-9EA2-499BC5F1D4A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4F7C9B03-84B8-47D9-9EA2-499BC5F1D4A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4F7C9B03-84B8-47D9-9EA2-499BC5F1D4A6}.Release|Any CPU.Build.0 = Release|Any CPU
{9481A85D-F8B4-4DC6-9F05-71E52B76D46F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9481A85D-F8B4-4DC6-9F05-71E52B76D46F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9481A85D-F8B4-4DC6-9F05-71E52B76D46F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9481A85D-F8B4-4DC6-9F05-71E52B76D46F}.Release|Any CPU.Build.0 = Release|Any CPU
{DE30162A-5D05-4E9B-80D7-43A8927D450E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DE30162A-5D05-4E9B-80D7-43A8927D450E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DE30162A-5D05-4E9B-80D7-43A8927D450E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DE30162A-5D05-4E9B-80D7-43A8927D450E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -666,10 +686,6 @@ Global
{0ACB8140-8198-4FA4-94DF-95A159E38E5C} = {E2B9833C-0397-4FAF-A3A8-116E58749750}
{E8880C1D-8C06-46B0-8C0D-345FE94FC2A3} = {E2B9833C-0397-4FAF-A3A8-116E58749750}
{96CCA968-1CE4-4DAB-9495-F8BA1249ADCD} = {E2B9833C-0397-4FAF-A3A8-116E58749750}
{8EE9C3E5-04E0-4D78-9CC3-DD2384490E48} = {96CCA968-1CE4-4DAB-9495-F8BA1249ADCD}
{10B7C532-327F-4424-85EE-A7D4E06E9976} = {96CCA968-1CE4-4DAB-9495-F8BA1249ADCD}
{08BA819F-538B-44A8-9463-3F90381F7F0D} = {96CCA968-1CE4-4DAB-9495-F8BA1249ADCD}
{08270801-B335-4DDE-8329-9D9198C3D3A1} = {96CCA968-1CE4-4DAB-9495-F8BA1249ADCD}
{F9B5D1B9-3390-47B5-BE37-219B66E44F70} = {B165FD5F-43B9-4A0C-A627-C4C94F6C027C}
{DA40F290-6B2D-451B-8BE2-9C577C4F1B11} = {0ACB8140-8198-4FA4-94DF-95A159E38E5C}
{4724E9F2-A344-4B64-9492-AD6A6964AF43} = {0ACB8140-8198-4FA4-94DF-95A159E38E5C}
Expand Down Expand Up @@ -761,9 +777,15 @@ Global
{CD001ADE-7B22-4325-9B3C-5C7D3B812797} = {E2B9833C-0397-4FAF-A3A8-116E58749750}
{15D318BC-3954-4B32-B72A-B0FC97048EB3} = {CD001ADE-7B22-4325-9B3C-5C7D3B812797}
{0161A0F5-D55C-418A-BF54-AEE8EC73C52C} = {CD001ADE-7B22-4325-9B3C-5C7D3B812797}
{847E2EAD-CDC7-47A9-ACA7-D0B0B6690074} = {A098FF69-D8B5-4B2B-83D5-F777D3817F15}
{3D3FFFD5-534C-4C27-8040-F5BF24DA5727} = {847E2EAD-CDC7-47A9-ACA7-D0B0B6690074}
{C0A29AA1-DBE8-4B6F-8A8F-716F0BDF5C72} = {847E2EAD-CDC7-47A9-ACA7-D0B0B6690074}
{4F7C9B03-84B8-47D9-9EA2-499BC5F1D4A6} = {C5C6EB91-CF9B-48F8-A198-9D9065E65BD1}
{9481A85D-F8B4-4DC6-9F05-71E52B76D46F} = {5168348E-52FD-4905-83B2-AAF546EAD676}
{6622DE9C-A23A-44E6-B661-EC784CE6C75C} = {96CCA968-1CE4-4DAB-9495-F8BA1249ADCD}
{8EE9C3E5-04E0-4D78-9CC3-DD2384490E48} = {6622DE9C-A23A-44E6-B661-EC784CE6C75C}
{10B7C532-327F-4424-85EE-A7D4E06E9976} = {6622DE9C-A23A-44E6-B661-EC784CE6C75C}
{E6A4D04E-CC83-4F24-89B4-04F3EF61715F} = {96CCA968-1CE4-4DAB-9495-F8BA1249ADCD}
{08BA819F-538B-44A8-9463-3F90381F7F0D} = {E6A4D04E-CC83-4F24-89B4-04F3EF61715F}
{08270801-B335-4DDE-8329-9D9198C3D3A1} = {E6A4D04E-CC83-4F24-89B4-04F3EF61715F}
{DE30162A-5D05-4E9B-80D7-43A8927D450E} = {177349C8-4FD3-466E-A7F4-67983A5B2C1F}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {5C00D0F1-6138-4ED9-846B-97E43D6DFF1C}
Expand Down
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 🦜️🔗 LangChain
# 🦜️🔗 LangChain .NET

[![Nuget package](https://img.shields.io/nuget/vpre/LangChain)](https://www.nuget.org/packages/LangChain/)
[![dotnet](https://github.com/tryAGI/LangChain/actions/workflows/dotnet.yml/badge.svg?branch=main)](https://github.com/tryAGI/LangChain/actions/workflows/dotnet.yml)
Expand Down Expand Up @@ -83,6 +83,9 @@ Console.WriteLine($"LLM usage: {llm.Usage}"); // Print usage and price
Console.WriteLine($"Embeddings usage: {embeddings.Usage}"); // Print usage and price
```

## Featured projects
- [LangChainChat](https://github.com/TesAnti/LangChainChat) - Allows you to run a chat based on a Blazor project using LangChain.Serve and any of the supported local or paid models

## Contributors

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
Expand Down Expand Up @@ -127,3 +130,10 @@ Console.WriteLine($"Embeddings usage: {embeddings.Usage}"); // Print usage and
Priority place for bugs: https://github.com/tryAGI/LangChain/issues
Priority place for ideas and general questions: https://github.com/tryAGI/LangChain/discussions
Discord: https://discord.gg/Ca2xhfBf3v

## Legal information and credits
It's licensed under [the MIT license](LICENSE). We do not plan to change the license in any foreseeable future for this project,
but projects based on this within the organization may have different licenses.
Some documentation is based on documentation from [dotnet/docs](https://github.com/dotnet/docs/) repository
under [CC BY 4.0 license](https://github.com/dotnet/docs/blob/main/LICENSE),
where code examples are changed to code examples for using this project.
3 changes: 2 additions & 1 deletion examples/LangChain.Samples.Serve/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
using LangChain.Providers;
using LangChain.Providers.Ollama;
using LangChain.Serve;
using LangChain.Serve.Classes.Repository;
using LangChain.Serve.Abstractions.Repository;
using LangChain.Serve.Classes;
using static LangChain.Chains.Chain;
using Message = LangChain.Providers.Message;

Expand Down
17 changes: 17 additions & 0 deletions src/Cli/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# LangChain CLI

This is a console utility that will help you use our library for such tasks:
- Summarize text
- Generate release notes
- Generate changelog
- Generate documentation
- Generate code snippets
- Generate code samples
- Generate code documentation

## Usage:
```
dotnet tool install -g langchain.cli
langchain auth openai OPENAI_API_KEY
langchain summarize --input README.md --output SUMMARY.md
```
12 changes: 12 additions & 0 deletions src/Cli/src/Commands/Auth/AuthCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.CommandLine;

namespace LangChain.Cli.Commands.Auth;

public class AuthCommand : Command
{
public AuthCommand() : base(name: "auth", description: "Authenticates a provider.")
{
AddCommand(new OpenAiCommand());
AddCommand(new OpenRouterCommand());
}
}
27 changes: 27 additions & 0 deletions src/Cli/src/Commands/Auth/OpenAiCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System.CommandLine;
using OpenAI.Constants;

namespace LangChain.Cli.Commands.Auth;

public class OpenAiCommand : Command
{
public OpenAiCommand() : base(name: Providers.OpenAi, description: "Authenticates OpenAI provider.")
{
var apiKeyArgument = new Argument<string>(
name: "Api key",
description: "OpenAI API key from https://platform.openai.com/account/api-keys");
var modelOption = new Option<string>(
aliases: ["--model", "-m"],
getDefaultValue: () => ChatModels.Gpt35Turbo,
description: "Model to use for commands");
AddArgument(apiKeyArgument);
AddOption(modelOption);

this.SetHandler(HandleAsync, apiKeyArgument, modelOption);
}

private static async Task HandleAsync(string apiKey, string model)
{
await Helpers.AuthenticateWithApiKeyAsync(apiKey, model, Providers.OpenAi).ConfigureAwait(false);
}
}
28 changes: 28 additions & 0 deletions src/Cli/src/Commands/Auth/OpenRouterCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System.CommandLine;
using LangChain.Providers.OpenRouter;
using OpenAI.Constants;

namespace LangChain.Cli.Commands.Auth;

public class OpenRouterCommand : Command
{
public OpenRouterCommand() : base(name: Providers.OpenRouter, description: "Authenticates OpenRouter provider.")
{
var apiKeyArgument = new Argument<string>(
name: "Api key",
description: "OpenRouter API key from https://openrouter.ai/keys");
var modelOption = new Option<string>(
aliases: ["--model", "-m"],
getDefaultValue: () => OpenRouterModelProvider.GetModelById(OpenRouterModelIds.Mistral7BInstructFree),
description: "Model to use for commands");
AddArgument(apiKeyArgument);
AddOption(modelOption);

this.SetHandler(HandleAsync, apiKeyArgument, modelOption);
}

private static async Task HandleAsync(string apiKey, string model)
{
await Helpers.AuthenticateWithApiKeyAsync(apiKey, model, Providers.OpenRouter).ConfigureAwait(false);
}
}
25 changes: 25 additions & 0 deletions src/Cli/src/Commands/GenerateCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System.CommandLine;

namespace LangChain.Cli.Commands;

public class GenerateCommand : Command
{
public GenerateCommand() : base(name: "generate", description: "Generates text using a prompt.")
{
var inputPathArgument = CommonArguments.InputPath;
var outputPathArgument = CommonArguments.OutputPath;
AddArgument(inputPathArgument);
AddArgument(outputPathArgument);

this.SetHandler(HandleAsync, inputPathArgument, outputPathArgument);
}

private static async Task HandleAsync(string inputPath, string outputPath)
{
var inputText = await File.ReadAllTextAsync(inputPath).ConfigureAwait(false);

var outputText = await Helpers.GenerateUsingAuthenticatedModelAsync(inputText).ConfigureAwait(false);

await File.WriteAllTextAsync(outputPath, outputText).ConfigureAwait(false);
}
}
33 changes: 33 additions & 0 deletions src/Cli/src/Commands/SummarizeCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System.CommandLine;

namespace LangChain.Cli.Commands;

public class SummarizeCommand : Command
{
public SummarizeCommand() : base(name: "summarize", description: "Summarizes text using a provider.")
{
var inputPathArgument = CommonArguments.InputPath;
var outputPathArgument = CommonArguments.OutputPath;
var wordCountOption = new Option<int>(
aliases: ["--word-count", "-w"], getDefaultValue: () => 20, description: "Word count for summary");

AddArgument(inputPathArgument);
AddArgument(outputPathArgument);
AddOption(wordCountOption);

this.SetHandler(HandleAsync, inputPathArgument, outputPathArgument, wordCountOption);
}

private static async Task HandleAsync(string inputPath, string outputPath, int wordCount)
{
var inputText = await File.ReadAllTextAsync(inputPath).ConfigureAwait(false);

var outputText = await Helpers.GenerateUsingAuthenticatedModelAsync(
$"""
Please summarize the the following text in {wordCount} words or less:
{inputText}
""").ConfigureAwait(false);

await File.WriteAllTextAsync(outputPath, outputText).ConfigureAwait(false);
}
}
14 changes: 14 additions & 0 deletions src/Cli/src/CommonArguments.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System.CommandLine;

namespace LangChain.Cli;

public static class CommonArguments
{
public static Argument<string> InputPath => new(
name: "Input file",
description: "Input file path");

public static Argument<string> OutputPath => new (
name: "Output file",
description: "Output file path");
}
52 changes: 52 additions & 0 deletions src/Cli/src/Helpers.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
using LangChain.Providers;
using LangChain.Providers.OpenAI;
using LangChain.Providers.OpenRouter;

namespace LangChain.Cli;

public static class Helpers
{
public static string GetSettingsFolder()
{
var folder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "LangChainDotnet.Cli");
Directory.CreateDirectory(folder);

return folder;
}

public static async Task AuthenticateWithApiKeyAsync(string apiKey, string model, string provider)
{
var settingsFolder = GetSettingsFolder();

await File.WriteAllTextAsync(Path.Combine(settingsFolder, "provider.txt"), provider).ConfigureAwait(false);
await File.WriteAllTextAsync(Path.Combine(settingsFolder, "model.txt"), model).ConfigureAwait(false);
await File.WriteAllTextAsync(Path.Combine(settingsFolder, "api_key.txt"), apiKey).ConfigureAwait(false);
}

public static async Task<string> GenerateUsingAuthenticatedModelAsync(string prompt)
{
var settingsFolder = GetSettingsFolder();

ChatModel model;
switch (await File.ReadAllTextAsync(Path.Combine(settingsFolder, "provider.txt")).ConfigureAwait(false))
{
case Providers.OpenAi:
{
var provider = new OpenAiProvider(apiKey: await File.ReadAllTextAsync(Path.Combine(settingsFolder, "api_key.txt")).ConfigureAwait(false));
model = new OpenAiChatModel(provider, id: await File.ReadAllTextAsync(Path.Combine(settingsFolder, "model.txt")).ConfigureAwait(false));
break;

}
case Providers.OpenRouter:
{
var provider = new OpenRouterProvider(apiKey: await File.ReadAllTextAsync(Path.Combine(settingsFolder, "api_key.txt")).ConfigureAwait(false));
model = new OpenRouterModel(provider, id: await File.ReadAllTextAsync(Path.Combine(settingsFolder, "model.txt")).ConfigureAwait(false));
break;
}
default:
throw new NotSupportedException("Provider not supported.");
}

return await model.GenerateAsync(prompt).ConfigureAwait(false);
}
}
Loading

0 comments on commit 954d315

Please sign in to comment.