packages feed

langchain-hs-0.0.3.0: src/Langchain/Embeddings/Gemini.hs

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

{- |
Module      : Langchain.Embeddings.Gemini
Description : Gemini integration for text embeddings in LangChain Haskell
Copyright   : (c) 2025 Tushar Adhatrao
License     : MIT
Maintainer  : Tushar Adhatrao <tusharadhatrao@gmail.com>
Stability   : experimental

Gemini implementation of LangChain's embedding interface. Supports document and query
embedding generation through Gemini's OpenAI compatible API.
Checkout docs here: https://ai.google.dev/gemini-api/docs/openai#embeddings
-}
module Langchain.Embeddings.Gemini
  ( -- * Types
    GeminiEmbeddings (..)
  , defaultGeminiEmbeddings
  , module Langchain.Embeddings.Core
  ) where

import Data.Text (Text, unpack)
import GHC.Generics
import Langchain.Embeddings.Core
import Langchain.Embeddings.OpenAI

data GeminiEmbeddings = GeminiEmbeddings
  { apiKey :: Text
  -- ^ Gemini API Key
  , baseUrl :: Maybe String
  -- ^ base url; default "https://generativelanguage.googleapis.com/v1beta/openai"
  , model :: Text
  -- ^ Model name for embeddings
  , dimensions :: Maybe Int
  -- ^ The number of dimensions the resulting output embeddings should have.
  , encodingFormat :: Maybe EncodingFormat
  {- ^ The format to return the embeddings in.
  ^ For now, only float is supported
  -}
  , embeddingsUser :: Maybe Text
  -- ^ A unique identifier representing your end-user, which can help monitor and detect abuse.
  , timeout :: Maybe Int
  -- ^ Override default responsetime out. unit = seconds.
  }
  deriving (Eq, Generic)

instance Show GeminiEmbeddings where
  show GeminiEmbeddings {..} = "GeminiEmbeddings " <> "model " <> unpack model

-- | Default values GeminiEmbeddings, api-key is empty
defaultGeminiEmbeddings :: GeminiEmbeddings
defaultGeminiEmbeddings =
  GeminiEmbeddings
    { apiKey = ""
    , baseUrl = pure "https://generativelanguage.googleapis.com/v1beta/openai"
    , model = "gemini-embedding-001"
    , dimensions = Nothing
    , encodingFormat = Nothing
    , embeddingsUser = Nothing
    , timeout = Nothing
    }

instance Embeddings GeminiEmbeddings where
  embedDocuments GeminiEmbeddings {..} = embedDocuments OpenAIEmbeddings {..}
  embedQuery GeminiEmbeddings {..} = embedQuery OpenAIEmbeddings {..}