Skip to content

Repository files navigation

Haskell Google GenAI Client

Unofficial low-level Haskell client for the Google Gemini API (also known as GenAI API or Generative Language API).

This library provides a type-safe way to interact with Google's Gemini API services directly from your Haskell code.

🚧 Notice

This repository is not maintained for now. Contact me if someone wants to take over. It seems there are alternatives to call Gemini chat completion API, such as louter.

Note

  • The code is automatically generated from the OpenAPI specification using openapi-generator.
  • APIs include text/image/audio generation, embeddings, model tuning, semantic retrieval API, and more. See Google API reference for full details.

Development

First, run nix develop to enter the development shell. Non-Nix users should install the dependencies such as openapi-generator and pre-commit.

# Generate the Haskell client code from the OpenAPI specification
./run-generator.sh
# Format the code and check for linting issues
pre-commit run --all-files
# Build the project
cabal build
# Run the tests
cabal test

Example Usage

Here is a working example that uses 'generateContent' API to generate text using Gemini model:

{-# LANGUAGE OverloadedStrings #-}
import GenAI.Client
import Network.HTTP.Client (responseBody)
import Network.HTTP.Client.TLS (newTlsManager)
import Network.HTTP.Types (QueryItem)
import Data.ByteString.Lazy qualified as LBS

apiKeyParam :: QueryItem
apiKeyParam = ("key", Just "<GEMINI_API_KEY>")

model :: Model2
model = Model2 "gemini-2.0-flash-001"

requestBody :: GenerateContentRequest
requestBody = mkGenerateContentRequest [content] "gemini-2.0-flash-001" where
  content = mkContent { contentParts = Just [textPart] }
  textPart = mkPart { partText = Just query }
  query = "What is the capital of Korea?"

request :: ClientRequest GenerateContent MimeJSON GenerateContentResponse MimeJSON
request = flip addQuery [apiKeyParam] $ flip setBodyParam requestBody $ generateContent model

main :: IO ()
main = do
  config <- withStdoutLogging =<< newConfig
  manager <- newTlsManager
  response <- dispatchLbs manager config request
  LBS.putStr $ responseBody response

Running code above will produce:

{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "The capital of South Korea is **Seoul**.\n"
          }
        ],
        "role": "model"
      },
      "finishReason": "STOP",
      "avgLogprobs": -0.024313041940331459
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 7,
    "candidatesTokenCount": 8,
    "totalTokenCount": 15,
    "promptTokensDetails": [
      {
        "modality": "TEXT",
        "tokenCount": 7
      }
    ],
    "candidatesTokensDetails": [
      {
        "modality": "TEXT",
        "tokenCount": 8
      }
    ]
  },
  "modelVersion": "gemini-2.0-flash-001",
  "responseId": "ZQc_aPa7JcXWnvgP3LDNsAw"
}

About

Unofficial Haskell client for Google GenAI API, including Gemini

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages