claude 1.0.1 → 1.1.0
raw patch · 7 files changed
+110/−38 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Claude.V1: instance GHC.Internal.Show.Show Claude.V1.ClientOptions
- Claude.V1.Error: instance GHC.Internal.Generics.Generic Claude.V1.Error.Error
- Claude.V1.Error: instance GHC.Internal.Generics.Generic Claude.V1.Error.ErrorType
- Claude.V1.Error: instance GHC.Internal.Show.Show Claude.V1.Error.Error
- Claude.V1.Error: instance GHC.Internal.Show.Show Claude.V1.Error.ErrorType
- Claude.V1.Messages: [output_format] :: CreateMessage -> Maybe OutputFormat
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.CacheControl
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.CodeExecutionResult
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.ContainerInfo
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.Content
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.ContentBlock
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.ContentBlockDelta
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.CountTokensRequest
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.CreateMessage
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.ImageSource
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.InputJsonDelta
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.Message
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.MessageDelta
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.MessageResponse
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.MessageStreamEvent
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.OutputFormat
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.Role
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.ServerToolUseUsage
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.StopReason
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.StreamUsage
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.TextContent
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.TextDelta
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.TokenCount
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.ToolReference
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.ToolResultContent
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.ToolUseContent
- Claude.V1.Messages: instance GHC.Internal.Generics.Generic Claude.V1.Messages.Usage
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.CacheControl
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.CodeExecutionResult
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.CodeExecutionToolResultContent
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.ContainerInfo
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.Content
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.ContentBlock
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.ContentBlockDelta
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.CountTokensRequest
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.CreateMessage
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.ImageSource
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.InputJsonDelta
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.Message
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.MessageDelta
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.MessageResponse
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.MessageStreamEvent
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.OutputFormat
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.Role
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.ServerToolUseUsage
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.StopReason
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.StreamUsage
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.TextContent
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.TextDelta
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.TokenCount
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.ToolCaller
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.ToolReference
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.ToolResultContent
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.ToolSearchToolResultContent
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.ToolUseContent
- Claude.V1.Messages: instance GHC.Internal.Show.Show Claude.V1.Messages.Usage
- Claude.V1.Messages.Batches: instance GHC.Internal.Generics.Generic Claude.V1.Messages.Batches.BatchObject
- Claude.V1.Messages.Batches: instance GHC.Internal.Generics.Generic Claude.V1.Messages.Batches.BatchRequest
- Claude.V1.Messages.Batches: instance GHC.Internal.Generics.Generic Claude.V1.Messages.Batches.BatchResult
- Claude.V1.Messages.Batches: instance GHC.Internal.Generics.Generic Claude.V1.Messages.Batches.BatchResultType
- Claude.V1.Messages.Batches: instance GHC.Internal.Generics.Generic Claude.V1.Messages.Batches.CreateBatch
- Claude.V1.Messages.Batches: instance GHC.Internal.Generics.Generic Claude.V1.Messages.Batches.ListBatchesResponse
- Claude.V1.Messages.Batches: instance GHC.Internal.Generics.Generic Claude.V1.Messages.Batches.ProcessingStatus
- Claude.V1.Messages.Batches: instance GHC.Internal.Generics.Generic Claude.V1.Messages.Batches.RequestCounts
- Claude.V1.Messages.Batches: instance GHC.Internal.Show.Show Claude.V1.Messages.Batches.BatchObject
- Claude.V1.Messages.Batches: instance GHC.Internal.Show.Show Claude.V1.Messages.Batches.BatchRequest
- Claude.V1.Messages.Batches: instance GHC.Internal.Show.Show Claude.V1.Messages.Batches.BatchResult
- Claude.V1.Messages.Batches: instance GHC.Internal.Show.Show Claude.V1.Messages.Batches.BatchResultType
- Claude.V1.Messages.Batches: instance GHC.Internal.Show.Show Claude.V1.Messages.Batches.CreateBatch
- Claude.V1.Messages.Batches: instance GHC.Internal.Show.Show Claude.V1.Messages.Batches.ListBatchesResponse
- Claude.V1.Messages.Batches: instance GHC.Internal.Show.Show Claude.V1.Messages.Batches.ProcessingStatus
- Claude.V1.Messages.Batches: instance GHC.Internal.Show.Show Claude.V1.Messages.Batches.RequestCounts
- Claude.V1.Tool: instance GHC.Internal.Generics.Generic Claude.V1.Tool.InputSchema
- Claude.V1.Tool: instance GHC.Internal.Generics.Generic Claude.V1.Tool.Tool
- Claude.V1.Tool: instance GHC.Internal.Generics.Generic Claude.V1.Tool.ToolChoice
- Claude.V1.Tool: instance GHC.Internal.Show.Show Claude.V1.Tool.InputSchema
- Claude.V1.Tool: instance GHC.Internal.Show.Show Claude.V1.Tool.Tool
- Claude.V1.Tool: instance GHC.Internal.Show.Show Claude.V1.Tool.ToolChoice
- Claude.V1.Tool: instance GHC.Internal.Show.Show Claude.V1.Tool.ToolDefinition
- Claude.V1.Tool: instance GHC.Internal.Show.Show Claude.V1.Tool.ToolSearchTool
- Claude.V1.Tool: instance GHC.Internal.Show.Show Claude.V1.Tool.ToolSearchToolType
+ Claude.V1: instance GHC.Show.Show Claude.V1.ClientOptions
+ Claude.V1.Error: instance GHC.Generics.Generic Claude.V1.Error.Error
+ Claude.V1.Error: instance GHC.Generics.Generic Claude.V1.Error.ErrorType
+ Claude.V1.Error: instance GHC.Show.Show Claude.V1.Error.Error
+ Claude.V1.Error: instance GHC.Show.Show Claude.V1.Error.ErrorType
+ Claude.V1.Messages: OutputConfig :: Maybe Text -> Maybe OutputFormat -> OutputConfig
+ Claude.V1.Messages: [effort] :: OutputConfig -> Maybe Text
+ Claude.V1.Messages: [format] :: OutputConfig -> Maybe OutputFormat
+ Claude.V1.Messages: [output_config] :: CreateMessage -> Maybe OutputConfig
+ Claude.V1.Messages: data OutputConfig
+ Claude.V1.Messages: effortConfig :: Text -> OutputConfig
+ Claude.V1.Messages: instance Data.Aeson.Types.FromJSON.FromJSON Claude.V1.Messages.OutputConfig
+ Claude.V1.Messages: instance Data.Aeson.Types.ToJSON.ToJSON Claude.V1.Messages.OutputConfig
+ Claude.V1.Messages: instance GHC.Classes.Eq Claude.V1.Messages.OutputConfig
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.CacheControl
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.CodeExecutionResult
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.ContainerInfo
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.Content
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.ContentBlock
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.ContentBlockDelta
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.CountTokensRequest
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.CreateMessage
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.ImageSource
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.InputJsonDelta
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.Message
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.MessageDelta
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.MessageResponse
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.MessageStreamEvent
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.OutputConfig
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.OutputFormat
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.Role
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.ServerToolUseUsage
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.StopReason
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.StreamUsage
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.TextContent
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.TextDelta
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.TokenCount
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.ToolReference
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.ToolResultContent
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.ToolUseContent
+ Claude.V1.Messages: instance GHC.Generics.Generic Claude.V1.Messages.Usage
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.CacheControl
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.CodeExecutionResult
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.CodeExecutionToolResultContent
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.ContainerInfo
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.Content
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.ContentBlock
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.ContentBlockDelta
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.CountTokensRequest
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.CreateMessage
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.ImageSource
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.InputJsonDelta
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.Message
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.MessageDelta
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.MessageResponse
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.MessageStreamEvent
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.OutputConfig
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.OutputFormat
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.Role
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.ServerToolUseUsage
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.StopReason
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.StreamUsage
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.TextContent
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.TextDelta
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.TokenCount
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.ToolCaller
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.ToolReference
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.ToolResultContent
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.ToolSearchToolResultContent
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.ToolUseContent
+ Claude.V1.Messages: instance GHC.Show.Show Claude.V1.Messages.Usage
+ Claude.V1.Messages: jsonSchemaConfig :: Value -> OutputConfig
+ Claude.V1.Messages.Batches: instance GHC.Generics.Generic Claude.V1.Messages.Batches.BatchObject
+ Claude.V1.Messages.Batches: instance GHC.Generics.Generic Claude.V1.Messages.Batches.BatchRequest
+ Claude.V1.Messages.Batches: instance GHC.Generics.Generic Claude.V1.Messages.Batches.BatchResult
+ Claude.V1.Messages.Batches: instance GHC.Generics.Generic Claude.V1.Messages.Batches.BatchResultType
+ Claude.V1.Messages.Batches: instance GHC.Generics.Generic Claude.V1.Messages.Batches.CreateBatch
+ Claude.V1.Messages.Batches: instance GHC.Generics.Generic Claude.V1.Messages.Batches.ListBatchesResponse
+ Claude.V1.Messages.Batches: instance GHC.Generics.Generic Claude.V1.Messages.Batches.ProcessingStatus
+ Claude.V1.Messages.Batches: instance GHC.Generics.Generic Claude.V1.Messages.Batches.RequestCounts
+ Claude.V1.Messages.Batches: instance GHC.Show.Show Claude.V1.Messages.Batches.BatchObject
+ Claude.V1.Messages.Batches: instance GHC.Show.Show Claude.V1.Messages.Batches.BatchRequest
+ Claude.V1.Messages.Batches: instance GHC.Show.Show Claude.V1.Messages.Batches.BatchResult
+ Claude.V1.Messages.Batches: instance GHC.Show.Show Claude.V1.Messages.Batches.BatchResultType
+ Claude.V1.Messages.Batches: instance GHC.Show.Show Claude.V1.Messages.Batches.CreateBatch
+ Claude.V1.Messages.Batches: instance GHC.Show.Show Claude.V1.Messages.Batches.ListBatchesResponse
+ Claude.V1.Messages.Batches: instance GHC.Show.Show Claude.V1.Messages.Batches.ProcessingStatus
+ Claude.V1.Messages.Batches: instance GHC.Show.Show Claude.V1.Messages.Batches.RequestCounts
+ Claude.V1.Tool: instance GHC.Generics.Generic Claude.V1.Tool.InputSchema
+ Claude.V1.Tool: instance GHC.Generics.Generic Claude.V1.Tool.Tool
+ Claude.V1.Tool: instance GHC.Generics.Generic Claude.V1.Tool.ToolChoice
+ Claude.V1.Tool: instance GHC.Show.Show Claude.V1.Tool.InputSchema
+ Claude.V1.Tool: instance GHC.Show.Show Claude.V1.Tool.Tool
+ Claude.V1.Tool: instance GHC.Show.Show Claude.V1.Tool.ToolChoice
+ Claude.V1.Tool: instance GHC.Show.Show Claude.V1.Tool.ToolDefinition
+ Claude.V1.Tool: instance GHC.Show.Show Claude.V1.Tool.ToolSearchTool
+ Claude.V1.Tool: instance GHC.Show.Show Claude.V1.Tool.ToolSearchToolType
- Claude.V1.Messages: CreateMessage :: Text -> Vector Message -> Natural -> Maybe Text -> Maybe Double -> Maybe Double -> Maybe Natural -> Maybe (Vector Text) -> Maybe Bool -> Maybe (Map Text Text) -> Maybe (Vector ToolDefinition) -> Maybe ToolChoice -> Maybe Text -> Maybe OutputFormat -> CreateMessage
+ Claude.V1.Messages: CreateMessage :: Text -> Vector Message -> Natural -> Maybe Text -> Maybe Double -> Maybe Double -> Maybe Natural -> Maybe (Vector Text) -> Maybe Bool -> Maybe (Map Text Text) -> Maybe (Vector ToolDefinition) -> Maybe ToolChoice -> Maybe Text -> Maybe OutputConfig -> CreateMessage
Files
- CHANGELOG.md +8/−0
- README.md +7/−8
- claude.cabal +1/−1
- examples/claude-structured-outputs-example/Main.hs +3/−7
- src/Claude/V1/Messages.hs +87/−8
- src/Claude/V1/Tool.hs +1/−3
- tasty/Main.hs +3/−11
CHANGELOG.md view
@@ -1,3 +1,11 @@+1.1.0:++- Replace `output_format` with `output_config` on `CreateMessage` (breaking change)+ - New `OutputConfig` type with `effort` and `format` fields+ - `effortConfig` helper for effort-only configuration+ - `jsonSchemaConfig` helper for structured output configuration+- Remove beta header requirement for structured outputs (now GA)+ 1.0.1: - Add structured outputs support (beta feature `structured-outputs-2025-11-13`)
README.md view
@@ -80,7 +80,7 @@ ## Running the Examples -See [examples/README.md](examples/README.md) for descriptions of each example.+See [examples](examples) for descriptions. ```bash cabal run claude-example@@ -94,21 +94,20 @@ ### Advanced Examples -Several examples demonstrate beta features:+- **[Structured Outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs)**: Constrain Claude's responses to follow a specific JSON schema, or validate tool parameters with strict mode -**Tool Search & Programmatic Tool Calling** (`advanced-tool-use-2025-11-20`):-- **[Tool Search Tool](https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/tool-search-tool)**: Server-side tool search for efficiently handling large numbers of tools-- **[Programmatic Tool Calling (PTC)](https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/programmatic-tool-calling)**: Claude writes and executes code to call multiple tools and aggregate results+The following examples require beta features: -**Structured Outputs** (`structured-outputs-2025-11-13`):-- **[Structured Outputs](https://docs.anthropic.com/en/docs/build-with-claude/structured-outputs)**: Constrain Claude's responses to follow a specific JSON schema, or validate tool parameters with strict mode+**Tool Search & Programmatic Tool Calling** (`advanced-tool-use-2025-11-20`):+- **[Tool Search Tool](https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool)**: Server-side tool search for efficiently handling large numbers of tools+- **[Programmatic Tool Calling (PTC)](https://platform.claude.com/docs/en/agents-and-tools/tool-use/programmatic-tool-calling)**: Claude writes and executes code to call multiple tools and aggregate results To enable beta features, use `makeMethodsWith` with the appropriate beta header: ```haskell let options = defaultClientOptions { apiKey = key- , anthropicBeta = Just "structured-outputs-2025-11-13"+ , anthropicBeta = Just "advanced-tool-use-2025-11-20" } let Methods{ createMessage } = makeMethodsWith clientEnv options ```
claude.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: claude-version: 1.0.1+version: 1.1.0 synopsis: Servant bindings to Anthropic's Claude API description: This package provides comprehensive and type-safe bindings to Anthropic's Claude API, providing both a Servant interface
examples/claude-structured-outputs-example/Main.hs view
@@ -6,10 +6,8 @@ -- | Example demonstrating structured outputs with Claude -- -- This example shows how to use:--- 1. JSON outputs (output_format) to get structured JSON responses+-- 1. JSON outputs (output_config.format) to get structured JSON responses -- 2. Strict tool use (strict: true) to validate tool parameters------ Requires the structured-outputs-2025-11-13 beta header. module Main where import Data.Aeson (FromJSON(..), (.:), (.=))@@ -48,10 +46,8 @@ key <- Text.pack <$> Environment.getEnv "ANTHROPIC_KEY" env <- V1.getClientEnv "https://api.anthropic.com" - -- Use makeMethodsWith to pass the structured outputs beta header let options = V1.defaultClientOptions { V1.apiKey = key- , V1.anthropicBeta = Just "structured-outputs-2025-11-13" } let V1.Methods{ V1.createMessage } = V1.makeMethodsWith env options@@ -66,7 +62,7 @@ Text.IO.putStrLn "=== Example 2: Strict Tool Use ===\n" strictToolUseExample createMessage --- | Example using output_format to get structured JSON responses+-- | Example using output_config to get structured JSON responses jsonOutputsExample :: (Messages.CreateMessage -> IO Messages.MessageResponse) -> IO () jsonOutputsExample createMessage = do let emailText = "Hi there! I'm John Smith from Acme Corp (john.smith@acme.com). \@@ -111,7 +107,7 @@ { Messages.model = "claude-sonnet-4-5-20250929" , Messages.messages = [message] , Messages.max_tokens = 1024- , Messages.output_format = Just (Messages.jsonSchemaFormat outputSchema)+ , Messages.output_config = Just (Messages.jsonSchemaConfig outputSchema) } let Messages.MessageResponse{ Messages.content = responseContent, Messages.stop_reason = stopReason } = response
src/Claude/V1/Messages.hs view
@@ -7,9 +7,12 @@ , _CreateMessage , MessageResponse(..) , MessageStreamEvent(..)- -- * Structured outputs+ -- * Output configuration+ , OutputConfig(..) , OutputFormat(..)+ , jsonSchemaConfig , jsonSchemaFormat+ , effortConfig -- * Content types , Content(..) , ContentBlock(..)@@ -558,12 +561,10 @@ -- | Output format specification for structured outputs ----- Use with the @structured-outputs-2025-11-13@ beta header.--- -- Example: -- -- @--- let outputFormat = jsonSchemaFormat $ Aeson.object+-- let schema = Aeson.object -- [ "type" .= ("object" :: Text) -- , "properties" .= Aeson.object -- [ "name" .= Aeson.object ["type" .= ("string" :: Text)]@@ -572,6 +573,10 @@ -- , "required" .= (["name", "age"] :: [Text]) -- , "additionalProperties" .= False -- ]+-- request = _CreateMessage+-- { output_config = Just $ jsonSchemaConfig schema+-- , ...+-- } -- @ data OutputFormat = OutputFormat { type_ :: Text -- ^ Currently only "json_schema" is supported@@ -584,9 +589,82 @@ instance ToJSON OutputFormat where toJSON = genericToJSON aesonOptions --- | Create a JSON schema output format+-- | Output configuration for the Messages API --+-- Controls both the structured output format and the effort level.+--+-- __Effort__ controls how many tokens Claude uses when responding, trading off+-- between response thoroughness and token efficiency. It affects all tokens+-- including text responses, tool calls, and extended thinking.+--+-- * @"low"@ — Most efficient. Significant token savings, some capability reduction.+-- Good for simple tasks, classification, or high-volume use cases.+-- * @"medium"@ — Balanced approach with moderate token savings.+-- * @"high"@ — Full capability (the default when effort is omitted).+-- * @"max"@ — Absolute maximum capability, no constraints on token spending.+-- Opus 4.6 only.+--+-- Setting @"high"@ is equivalent to not setting effort at all.+--+-- See <https://platform.claude.com/docs/en/build-with-claude/effort>+--+-- __Format__ specifies a JSON schema for structured outputs. See 'jsonSchemaFormat'.+--+-- Both fields are optional and can be used independently or together.+--+-- @+-- -- Effort only+-- output_config = Just $ effortConfig "low"+--+-- -- Structured output only+-- output_config = Just $ jsonSchemaConfig mySchema+--+-- -- Both+-- output_config = Just $ (jsonSchemaConfig mySchema) { effort = Just "low" }+-- @+data OutputConfig = OutputConfig+ { effort :: Maybe Text+ -- ^ Effort level: @"low"@, @"medium"@, @"high"@, or @"max"@.+ -- Controls token spend vs thoroughness. @"high"@ is the default.+ -- @"max"@ is Opus 4.6 only.+ -- See <https://platform.claude.com/docs/en/build-with-claude/effort>+ , format :: Maybe OutputFormat+ -- ^ Structured output format (use 'jsonSchemaFormat' to construct)+ } deriving stock (Eq, Generic, Show)++instance FromJSON OutputConfig where+ parseJSON = genericParseJSON aesonOptions++instance ToJSON OutputConfig where+ toJSON = genericToJSON aesonOptions++-- | Create an output configuration with only an effort level+--+-- @+-- output_config = Just $ effortConfig "low"+-- @+--+-- See <https://platform.claude.com/docs/en/build-with-claude/effort>+effortConfig :: Text -> OutputConfig+effortConfig e = OutputConfig+ { effort = Just e+ , format = Nothing+ }++-- | Create a JSON schema output configuration+-- -- This is the primary way to use structured outputs.+--+-- @+-- output_config = Just $ jsonSchemaConfig mySchema+-- @+jsonSchemaConfig :: Value -> OutputConfig+jsonSchemaConfig s = OutputConfig+ { effort = Nothing+ , format = Just $ jsonSchemaFormat s+ }++-- | Create a JSON schema output format jsonSchemaFormat :: Value -> OutputFormat jsonSchemaFormat s = OutputFormat { type_ = "json_schema"@@ -611,8 +689,9 @@ , tools :: Maybe (Vector ToolDefinition) , tool_choice :: Maybe ToolChoice , container :: Maybe Text- , output_format :: Maybe OutputFormat- -- ^ Structured output format (requires @structured-outputs-2025-11-13@ beta header)+ , output_config :: Maybe OutputConfig+ -- ^ Output configuration: effort level and/or structured output format.+ -- Use 'effortConfig', 'jsonSchemaConfig', or construct 'OutputConfig' directly. } deriving stock (Generic, Show) instance FromJSON CreateMessage where@@ -637,7 +716,7 @@ , tools = Nothing , tool_choice = Nothing , container = Nothing- , output_format = Nothing+ , output_config = Nothing } -- | Text delta in streaming
src/Claude/V1/Tool.hs view
@@ -109,13 +109,12 @@ -- it will return a @tool_use@ content block with the tool name and input arguments. -- -- Set @strict = Just True@ to enable strict schema validation (structured outputs).--- This requires the @structured-outputs-2025-11-13@ beta header. data Tool = Tool { name :: Text , description :: Maybe Text , input_schema :: InputSchema , strict :: Maybe Bool- -- ^ Enable strict schema validation for tool inputs (structured outputs beta)+ -- ^ Enable strict schema validation for tool inputs } deriving stock (Eq, Generic, Show) instance FromJSON Tool where@@ -161,7 +160,6 @@ -- -- This is like 'functionTool' but enables strict mode for structured outputs. -- Automatically sets @additionalProperties = False@ as required by the API.--- Requires the @structured-outputs-2025-11-13@ beta header. strictFunctionTool :: Text -- ^ Tool name (must match [a-zA-Z0-9_-]+) -> Maybe Text -- ^ Description of what the tool does
tasty/Main.hs view
@@ -232,14 +232,6 @@ HUnit.assertBool "Should have positive token count" (input_tokens > 0) - -- Structured outputs tests require beta header- let structuredOutputsOptions = V1.defaultClientOptions- { V1.apiKey = Text.pack key- , V1.anthropicBeta = Just "structured-outputs-2025-11-13"- }- let V1.Methods{ V1.createMessage = createMessageStructured } =- V1.makeMethodsWith clientEnv structuredOutputsOptions- let jsonOutputsTest = HUnit.testCase "Create message - JSON outputs" do -- Define output schema@@ -258,7 +250,7 @@ ] Messages.MessageResponse{ stop_reason, content } <-- createMessageStructured+ createMessage Messages._CreateMessage { Messages.model = model , Messages.messages =@@ -271,7 +263,7 @@ } ] , Messages.max_tokens = 200- , Messages.output_format = Just (Messages.jsonSchemaFormat outputSchema)+ , Messages.output_config = Just (Messages.jsonSchemaConfig outputSchema) } -- Should complete normally@@ -309,7 +301,7 @@ ] Messages.MessageResponse{ stop_reason, content } <-- createMessageStructured+ createMessage Messages._CreateMessage { Messages.model = model , Messages.messages =