ollama-haskell-0.1.0.0: src/Data/Ollama/Ps.hs
{-# LANGUAGE OverloadedStrings #-}
module Data.Ollama.Ps
( ps
, RunningModels (..)
, RunningModel (..)
) where
import Data.Aeson
import Data.Ollama.Common.Types as CT
import Data.Ollama.Common.Utils as CU
import Data.Text (Text)
import Data.Text qualified as T
import Data.Time
import GHC.Int (Int64)
import Network.HTTP.Client
import Network.HTTP.Types.Status (statusCode)
-- Types for Ps API
newtype RunningModels = RunningModels [RunningModel]
deriving (Eq, Show)
data RunningModel = RunningModel
{ name_ :: Text
, modelName :: Text
, size_ :: Int64
, modelDigest :: Text
, modelDetails :: ModelDetails
, expiresAt :: UTCTime
, sizeVRam :: Int64
}
deriving (Eq, Show)
instance FromJSON RunningModels where
parseJSON = withObject "Models" $ \v -> RunningModels <$> v .: "models"
instance FromJSON RunningModel where
parseJSON = withObject "RunningModel" $ \v ->
RunningModel
<$> v .: "name"
<*> v .: "model"
<*> v .: "size"
<*> v .: "digest"
<*> v .: "details"
<*> v .: "expires_at"
<*> v .: "size_vram"
-- | List running models
ps :: IO (Maybe RunningModels)
ps = do
let url = CU.host defaultOllama
manager <- newManager defaultManagerSettings
request <- parseRequest $ T.unpack (url <> "/api/ps")
response <- httpLbs request manager
if statusCode (responseStatus response) /= 200
then pure Nothing
else do
let res = decode (responseBody response) :: Maybe RunningModels
case res of
Nothing -> pure Nothing
Just l -> pure $ Just l