packages feed

claude-1.2.0: examples/claude-stream-example/Main.hs

{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns        #-}
{-# LANGUAGE OverloadedLists       #-}
{-# LANGUAGE OverloadedStrings     #-}

module Main where

import System.Environment (getEnv)
import System.IO (hFlush, hPutStrLn, stderr, stdout)

import qualified Claude.V1 as V1
import qualified Claude.V1.Messages as Messages
import qualified Data.Text as T
import qualified Data.Text.IO as TIO

main :: IO ()
main = do
    key <- T.pack <$> getEnv "ANTHROPIC_KEY"
    env <- V1.getClientEnv "https://api.anthropic.com"

    let V1.Methods{ createMessageStreamTyped } = V1.makeMethods env key (Just "2023-06-01")

    let onEvent (Left err) = hPutStrLn stderr ("stream error: " <> T.unpack err)
        onEvent (Right ev) = case ev of
            -- Print text deltas as they arrive
            Messages.Content_Block_Delta{ Messages.delta = d } ->
                case d of
                    Messages.Delta_Text_Delta{ Messages.text = t } ->
                        TIO.putStr t >> hFlush stdout
                    Messages.Delta_Thinking_Delta{ Messages.thinking = t } ->
                        TIO.putStr t >> hFlush stdout
                    _ -> pure ()
            -- Print newline when message is done
            Messages.Message_Stop -> putStrLn ""
            -- Ignore other events
            _ -> pure ()

    -- Simple haiku test
    let req = Messages._CreateMessage
            { Messages.model = "claude-sonnet-4-5-20250929"
            , Messages.messages =
                [ Messages.Message
                    { Messages.role = Messages.User
                    , Messages.content =
                        [ Messages.textContent "Write a short haiku about the sea."
                        ]
                    , Messages.cache_control = Nothing
                    }
                ]
            , Messages.max_tokens = 200
            }

    createMessageStreamTyped req onEvent