claude: Servant bindings to Anthropic's Claude API

[ ai, api, bsd3, library, llm, program ] [ Propose Tags ] [ Report a vulnerability ]

This package provides comprehensive and type-safe bindings to Anthropic's Claude API, providing both a Servant interface and non-Servant interface for convenience.

Read the README below for a fully worked usage example.

Otherwise, browse the Claude.V1 module, which is the intended package entrypoint.


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

Versions [RSS] 1.0.0, 1.0.1
Change log CHANGELOG.md
Dependencies aeson (>=2.0 && <2.3), base (>=4.15.0.0 && <5), base64-bytestring (>=1.0 && <1.3), bytestring (>=0.10 && <0.13), claude, containers (>=0.6 && <0.8), filepath (>=1.4 && <1.6), http-api-data (>=0.4 && <0.7), http-client (>=0.7 && <0.8), http-client-tls (>=0.3 && <0.4), http-types (>=0.12 && <0.13), servant (>=0.19 && <0.21), servant-client (>=0.19 && <0.21), text (>=1.2 && <2.2), time (>=1.9 && <1.15), vector (>=0.12 && <0.14) [details]
License BSD-3-Clause
Copyright 2025
Author Paul-Arthur Asselin
Maintainer pa@mercury.com
Category AI, API, LLM
Source repo head: git clone https://github.com/MercuryTechnologies/claude
Uploaded by asselinpaul at 2025-12-17T23:25:32Z
Distributions
Executables claude-structured-outputs-example, claude-programmatic-tool-calling-example, claude-tool-search-example, claude-vision-example, claude-tool-example, claude-stream-example, claude-example
Downloads 2 total (2 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2025-12-18 [all 1 reports]

Readme for claude-1.0.1

[back to package description]

claude

Haskell bindings to Anthropic's Claude API using servant.

Example usage

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

import Claude.V1
import Claude.V1.Messages
import Data.Foldable (traverse_)
import qualified Data.Text as Text
import qualified Data.Text.IO as Text.IO
import qualified System.Environment as Environment

main :: IO ()
main = do
    key <- Environment.getEnv "ANTHROPIC_KEY"
    clientEnv <- getClientEnv "https://api.anthropic.com"
    let Methods{ createMessage } = makeMethods clientEnv (Text.pack key) (Just "2023-06-01")

    MessageResponse{ content } <- createMessage _CreateMessage
        { model = "claude-sonnet-4-5-20250929"
        , messages = [ Message{ role = User, content = [ textContent "Hello!" ] } ]
        , max_tokens = 1024
        }

    let display (ContentBlock_Text{ text }) = Text.IO.putStrLn text
        display _ = pure ()
    traverse_ display content

Setup

  1. Ensure you have Nix with flakes enabled
  2. Copy the sample environment file:
cp .envrc.sample .envrc
  1. Edit .envrc with your Anthropic API key
  2. Run direnv allow

Manual Setup

cabal build

Environment Variables

Set your Anthropic API key as an environment variable:

# Option 1: Set directly in your shell
export ANTHROPIC_KEY="your-anthropic-api-key"

# Option 2: Using .envrc with direnv (recommended)
cp .envrc.sample .envrc
# Edit .envrc to add your API key
direnv allow

The API key is needed for running the test suite and example programs.

Testing

Run the test suite:

cabal test

Running the Examples

See examples/README.md for descriptions of each example.

cabal run claude-example
cabal run claude-stream-example
cabal run claude-tool-example
cabal run claude-vision-example
cabal run claude-tool-search-example
cabal run claude-programmatic-tool-calling-example
cabal run claude-structured-outputs-example

Advanced Examples

Several examples demonstrate beta features:

Tool Search & Programmatic Tool Calling (advanced-tool-use-2025-11-20):

Structured Outputs (structured-outputs-2025-11-13):

  • Structured Outputs: Constrain Claude's responses to follow a specific JSON schema, or validate tool parameters with strict mode

To enable beta features, use makeMethodsWith with the appropriate beta header:

let options = defaultClientOptions
        { apiKey = key
        , anthropicBeta = Just "structured-outputs-2025-11-13"
        }
let Methods{ createMessage } = makeMethodsWith clientEnv options