packages feed

openai-2.5.0: src/OpenAI/V1/Chat/Completions/Stream.hs

-- | Streaming payload types for @/v1/chat/completions@.
module OpenAI.V1.Chat.Completions.Stream
    ( ChatCompletionChunk(..)
    , ChunkChoice(..)
    , Delta(..)
    , ChatCompletionStreamEvent
    ) where

import OpenAI.Prelude
import OpenAI.V1.Chat.Completions (LogProbs, ServiceTier)
import OpenAI.V1.Models (Model)
import OpenAI.V1.ToolCall (ToolCall)
import OpenAI.V1.Usage
    ( CompletionTokensDetails
    , PromptTokensDetails
    , Usage
    )
import Prelude hiding (id)

-- | Delta message content for streaming
data Delta = Delta
    { delta_content :: Maybe Text
    , delta_refusal :: Maybe Text
    , delta_role :: Maybe Text
    , delta_tool_calls :: Maybe (Vector ToolCall)
    } deriving stock (Generic, Show)

deltaOptions :: Options
deltaOptions = aesonOptions
    { fieldLabelModifier = stripPrefix "delta_"
    }

instance FromJSON Delta where
    parseJSON = genericParseJSON deltaOptions

instance ToJSON Delta where
    toJSON = genericToJSON deltaOptions

-- | A streaming choice chunk
data ChunkChoice = ChunkChoice
    { delta :: Delta
    , finish_reason :: Maybe Text
    , index :: Natural
    , logprobs :: Maybe LogProbs
    } deriving stock (Generic, Show)
      deriving anyclass (FromJSON, ToJSON)

-- | Chat completion chunk (streaming response)
data ChatCompletionChunk = ChatCompletionChunk
    { id :: Text
    , choices :: Vector ChunkChoice
    , created :: POSIXTime
    , model :: Model
    , service_tier :: Maybe ServiceTier
    , system_fingerprint :: Maybe Text
    , object :: Text
    , usage :: Maybe (Usage CompletionTokensDetails PromptTokensDetails)
    } deriving stock (Generic, Show)
      deriving anyclass (FromJSON, ToJSON)

-- | Type alias for streaming events (currently just chunks)
type ChatCompletionStreamEvent = ChatCompletionChunk