packages feed

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 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 =