GithubHelp home page GithubHelp logo

gsilvamartin / dotnet-gemini-sdk Goto Github PK

View Code? Open in Web Editor NEW
40.0 4.0 8.0 89 KB

.NET SDK for seamless and efficient integration with the Google Gemini

License: MIT License

C# 100.00%
dotnet gemini gemini-sdk csharp ai artificial-intelligence google machine-learning sdk googlegemini

dotnet-gemini-sdk's People

Contributors

gsilvamartin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

dotnet-gemini-sdk's Issues

issue with creating an object for "generationconfig" in the BuildGeminiRequest method.

hey bro, great package, helped a lot but i keep getting this issue every time i try to pass hyper parameters to the model, for that I'm using the same object that you created in the GeminiMessageRequest.cs class which is GenerationConfig, but I feel the BuildGeminiRequest in the GeminiClient is causing an issue which creates the payload for the request, to be precise this is the issue,

"error": {
"code": 400,
"message": "Invalid JSON payload received. Unknown name "generationconfig": Cannot find field.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"description": "Invalid JSON payload received. Unknown name "generationconfig": Cannot find field."
}
]
}
]
}
}

I feel the property name is being set in a wrong way, as per google's docs the property name should be "generationConfig". Can you please look into this?, thanks. The c should be in caps in the payload while we send the request.

Safety settings

How can I set multiple safety settings? I can set only 1 safety parameter in IGeminiClient::TextPrompt

  public interface IGeminiClient
  {
    Task<GeminiMessageResponse?> TextPrompt(
      string message,
      GenerationConfig? generationConfig = null,
      SafetySetting? safetySetting = null);

    Task<GeminiMessageResponse?> TextPrompt(
      List<DotnetGeminiSDK.Model.Request.Content> messages,
      GenerationConfig? generationConfig = null,
      SafetySetting? safetySetting = null);
...

Describe the solution you'd like
SafetySetting? safetySetting -> List<SafetySetting>? safetySetting

Prevent connection pool starvation

I was looking for a valid C# SDK to use in our integration with Gemini and I found your solution. Right now it can be used for dev/testing but not for production from my point of view. One of the important problems that I found by looking into the code is the way the requests are performed. You are using HttpClient and you are doing a new instance every time ApiRequester is created.

 public class ApiRequester : IApiRequester
   {
       private readonly HttpClient _httpClient;

       public ApiRequester()
       {
          _httpClient = new HttpClient();
       }

This approach will lead to connection pool starvation. You should use IHttpClientFactory instead and maybe allow dependency injection for it . Or make HttpClient static inisde the class and configure PooledConnectionLifetime and in this way you are avoiding the problems on how many instances of ApiRequester are created.

You can read more about this problem here:
https://learn.microsoft.com/en-us/dotnet/fundamentals/networking/http/httpclient-guidelines#recommended-use
or
https://devblogs.microsoft.com/azure-sdk/net-framework-connection-pool-limits/

I saw that you are making it AddSingleton in the services but is not enough, knowing that someone can invoke GeminiClient(GoogleGeminiConfig config) multiple times and here is build a new ApiRequester every time (is not making use of the singleton):

    public GeminiClient(GoogleGeminiConfig config)
    {
        _config = config;
        _apiRequester = new ApiRequester();
    }

Also in this context I suggest you increase the resilience of the connection by using Polly:
https://learn.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/implement-http-call-retries-exponential-backoff-polly

I hope this SKD will improve in the future. U are doing a great job.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.