packages feed

openai-2.0.0: src/OpenAI/V1/VectorStores.hs

-- | @\/v1\/vector_stores@
module OpenAI.V1.VectorStores
    ( -- * Main types
      VectorStoreID(..)
    , CreateVectorStore(..)
    , _CreateVectorStore
    , ModifyVectorStore(..)
    , _ModifyVectorStore
    , VectorStoreObject(..)
      -- * Other types
    , ExpiresAfter(..)
    , Status(..)
      -- * Servant
    , API
    ) where

import OpenAI.Prelude
import OpenAI.V1.AutoOr
import OpenAI.V1.ChunkingStrategy
import OpenAI.V1.DeletionStatus
import OpenAI.V1.Files (FileID)
import OpenAI.V1.ListOf
import OpenAI.V1.Order
import OpenAI.V1.VectorStores.FileCounts

-- | Vector store ID
newtype VectorStoreID = VectorStoreID{ text :: Text }
    deriving newtype (FromJSON, IsString, Show, ToHttpApiData, ToJSON)

-- | The expiration policy for a vector store.
data ExpiresAfter = ExpiresAfter
    { anchor :: Text
    , days :: Natural
    } deriving stock (Generic, Show)
      deriving anyclass (FromJSON, ToJSON)

-- | Request body for @\/v1\/vector_stores@
data CreateVectorStore = CreateVectorStore
    { file_ids :: Vector FileID
    , name :: Maybe Text
    , expires_after :: Maybe ExpiresAfter
    , chunking_strategy :: Maybe (AutoOr ChunkingStrategy)
    , metadata :: Maybe (Map Text Text)
    } deriving stock (Generic, Show)
      deriving (FromJSON, ToJSON)

-- | Default `CreateVectorStore`
_CreateVectorStore :: CreateVectorStore
_CreateVectorStore = CreateVectorStore
    { name = Nothing
    , expires_after = Nothing
    , chunking_strategy = Nothing
    , metadata = Nothing
    }

-- | Request body for @\/v1\/vector_stores\/:vector_store_id@
data ModifyVectorStore = ModifyVectorStore
    { name :: Maybe Text
    , expires_after :: Maybe ExpiresAfter
    , metadata :: Maybe (Map Text Text)
    } deriving stock (Generic, Show)
      deriving (FromJSON, ToJSON)

-- | Default `ModifyVectorStore`
_ModifyVectorStore :: ModifyVectorStore
_ModifyVectorStore = ModifyVectorStore
    { name = Nothing
    , expires_after = Nothing
    , metadata = Nothing
    }

-- | The status of the vector store
data Status = Expired | In_Progress | Completed
    deriving stock (Generic, Show)

instance FromJSON Status where
    parseJSON = genericParseJSON aesonOptions

instance ToJSON Status where
    toJSON = genericToJSON aesonOptions

-- | A vector store is a collection of processed files can be used by the
-- @file_search@ tool.
data VectorStoreObject = VectorStoreObject
    { id :: VectorStoreID
    , object :: Text
    , created_at :: POSIXTime
    , name :: Maybe Text
    , usage_bytes :: Natural
    , file_counts :: FileCounts
    , status :: Status
    , expires_after :: Maybe ExpiresAfter
    , expires_at :: Maybe POSIXTime
    , last_active_at :: Maybe POSIXTime
    , metadata :: Map Text Text
    } deriving stock (Generic, Show)
      deriving anyclass (FromJSON, ToJSON)

-- | Servant API
type API =
        "vector_stores"
    :>  Header' '[Required, Strict] "OpenAI-Beta" Text
    :>  (         ReqBody '[JSON] CreateVectorStore
              :>  Post '[JSON] VectorStoreObject
        :<|>      QueryParam "limit" Natural
              :>  QueryParam "order" Order
              :>  QueryParam "after" Text
              :>  QueryParam "before" Text
              :>  Get '[JSON] (ListOf VectorStoreObject)
        :<|>      Capture "vector_store_id" VectorStoreID
              :>  Get '[JSON] VectorStoreObject
        :<|>      Capture "vector_store_id" VectorStoreID
              :>  ReqBody '[JSON] ModifyVectorStore
              :>  Post '[JSON] VectorStoreObject
        :<|>      Capture "vector_store_id" VectorStoreID
              :>  Delete '[JSON] DeletionStatus
        )