Packages
claude_code
0.8.0
0.36.5
0.36.4
0.36.3
0.36.2
0.36.1
0.36.0
0.35.0
0.34.0
0.33.1
0.32.2
0.32.0
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.1
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Claude Agent SDK for Elixir – Build AI agents with Claude Code
Current section
46 Versions
Jump to
Current section
46 Versions
Compare versions
31
files changed
+1419
additions
-1127
deletions
| @@ -5,7 +5,33 @@ All notable changes to this project will be documented in this file. | |
| 5 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), |
| 6 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). |
| 7 7 | |
| 8 | - ## [Unreleased] |
| 8 | + ## [0.8.0] - 2026-01-06 |
| 9 | + |
| 10 | + ### Changed |
| 11 | + - **BREAKING: Renamed message type modules** - Added "Message" suffix for clarity |
| 12 | + - `ClaudeCode.Message.Assistant` → `ClaudeCode.Message.AssistantMessage` |
| 13 | + - `ClaudeCode.Message.User` → `ClaudeCode.Message.UserMessage` |
| 14 | + - `ClaudeCode.Message.Result` → `ClaudeCode.Message.ResultMessage` |
| 15 | + - `ClaudeCode.Message.StreamEvent` → `ClaudeCode.Message.StreamEventMessage` |
| 16 | + - New `ClaudeCode.Message.SystemMessage` and `ClaudeCode.Message.CompactBoundaryMessage` message types |
| 17 | + - **BREAKING: Renamed content block modules** - Added "Block" suffix for consistency |
| 18 | + - `ClaudeCode.Content.Text` → `ClaudeCode.Content.TextBlock` |
| 19 | + - `ClaudeCode.Content.ToolUse` → `ClaudeCode.Content.ToolUseBlock` |
| 20 | + - `ClaudeCode.Content.ToolResult` → `ClaudeCode.Content.ToolResultBlock` |
| 21 | + - `ClaudeCode.Content.Thinking` → `ClaudeCode.Content.ThinkingBlock` |
| 22 | + |
| 23 | + ### Added |
| 24 | + - **New system message fields** - Support for additional Claude Code features |
| 25 | + - `:output_style` - Claude's configured output style |
| 26 | + - `:slash_commands` - Available slash commands |
| 27 | + - `:uuid` - Session UUID |
| 28 | + - **Extended message type fields** - Better access to API response metadata |
| 29 | + - `AssistantMessage`: `:priority`, `:sequence_id`, `:finalize_stack` |
| 30 | + - `ResultMessage`: `:session_id`, `:duration_ms`, `:usage`, `:parent_message_id`, `:sequence_id` |
| 31 | + - `UserMessage`: `:priority`, `:sequence_id`, `:finalize_stack` |
| 32 | + |
| 33 | + ### Fixed |
| 34 | + - **`:mcp_servers` option validation** - Fixed handling of MCP server configurations ([0c7e849]) |
| 9 35 | |
| 10 36 | ## [0.7.0] - 2026-01-02 |
| @@ -38,7 +38,7 @@ IO.puts(answer) # => "Your favorite language is Elixir!" | |
| 38 38 | **Step 1:** Add to your `mix.exs` |
| 39 39 | ```elixir |
| 40 40 | def deps do |
| 41 | - [{:claude_code, "~> 0.7.0"}] |
| 41 | + [{:claude_code, "~> 0.8.0"}] |
| 42 42 | end |
| 43 43 | ``` |
| @@ -3,7 +3,7 @@ | |
| 3 3 | <<"https://github.com/guess/claude_code/blob/main/CHANGELOG.md">>}, |
| 4 4 | {<<"GitHub">>,<<"https://github.com/guess/claude_code">>}]}. |
| 5 5 | {<<"name">>,<<"claude_code">>}. |
| 6 | - {<<"version">>,<<"0.7.0">>}. |
| 6 | + {<<"version">>,<<"0.8.0">>}. |
| 7 7 | {<<"description">>,<<"An idiomatic Elixir SDK for Claude Code AI assistant">>}. |
| 8 8 | {<<"elixir">>,<<"~> 1.18">>}. |
| 9 9 | {<<"app">>,<<"claude_code">>}. |
| @@ -12,17 +12,19 @@ | |
| 12 12 | <<"lib/claude_code/message.ex">>,<<"lib/claude_code/session.ex">>, |
| 13 13 | <<"lib/claude_code/stream.ex">>,<<"lib/claude_code/types.ex">>, |
| 14 14 | <<"lib/claude_code/options.ex">>,<<"lib/claude_code/tool_callback.ex">>, |
| 15 | - <<"lib/claude_code/content">>,<<"lib/claude_code/content/tool_use.ex">>, |
| 16 | - <<"lib/claude_code/content/tool_result.ex">>, |
| 17 | - <<"lib/claude_code/content/thinking.ex">>, |
| 18 | - <<"lib/claude_code/content/text.ex">>,<<"lib/claude_code/message">>, |
| 19 | - <<"lib/claude_code/message/assistant.ex">>, |
| 20 | - <<"lib/claude_code/message/system.ex">>, |
| 21 | - <<"lib/claude_code/message/user.ex">>, |
| 22 | - <<"lib/claude_code/message/stream_event.ex">>, |
| 23 | - <<"lib/claude_code/message/result.ex">>,<<"lib/claude_code/mcp">>, |
| 24 | - <<"lib/claude_code/mcp/server.ex">>,<<"lib/claude_code/mcp/config.ex">>, |
| 25 | - <<"lib/claude_code/hooks">>,<<"lib/claude_code/cli.ex">>, |
| 15 | + <<"lib/claude_code/content">>,<<"lib/claude_code/content/text_block.ex">>, |
| 16 | + <<"lib/claude_code/content/tool_use_block.ex">>, |
| 17 | + <<"lib/claude_code/content/tool_result_block.ex">>, |
| 18 | + <<"lib/claude_code/content/thinking_block.ex">>, |
| 19 | + <<"lib/claude_code/message">>, |
| 20 | + <<"lib/claude_code/message/system_message.ex">>, |
| 21 | + <<"lib/claude_code/message/compact_boundary_message.ex">>, |
| 22 | + <<"lib/claude_code/message/stream_event_message.ex">>, |
| 23 | + <<"lib/claude_code/message/user_message.ex">>, |
| 24 | + <<"lib/claude_code/message/result_message.ex">>, |
| 25 | + <<"lib/claude_code/message/assistant_message.ex">>, |
| 26 | + <<"lib/claude_code/mcp">>,<<"lib/claude_code/mcp/server.ex">>, |
| 27 | + <<"lib/claude_code/mcp/config.ex">>,<<"lib/claude_code/cli.ex">>, |
| 26 28 | <<"lib/claude_code/mcp.ex">>,<<"lib/claude_code/content.ex">>, |
| 27 29 | <<"lib/claude_code/input.ex">>,<<"lib/claude_code.ex">>, |
| 28 30 | <<".formatter.exs">>,<<"mix.exs">>,<<"README.md">>,<<"LICENSE">>, |
| @@ -82,12 +82,12 @@ defmodule ClaudeCode do | |
| 82 82 | See `ClaudeCode.Supervisor` for advanced supervision patterns. |
| 83 83 | """ |
| 84 84 | |
| 85 | - alias ClaudeCode.Message.Result |
| 85 | + alias ClaudeCode.Message.ResultMessage |
| 86 86 | alias ClaudeCode.Session |
| 87 87 | |
| 88 88 | @type session :: pid() | atom() | {:via, module(), any()} |
| 89 89 | @type query_response :: |
| 90 | - {:ok, Result.t()} | {:error, Result.t() | term()} |
| 90 | + {:ok, ResultMessage.t()} | {:error, ResultMessage.t() | term()} |
| 91 91 | @type message_stream :: Enumerable.t(ClaudeCode.Message.t()) |
| 92 92 | |
| 93 93 | @doc """ |
| @@ -165,7 +165,7 @@ defmodule ClaudeCode do | |
| 165 165 | # Handle errors |
| 166 166 | case ClaudeCode.query(session, "Do something risky") do |
| 167 167 | {:ok, result} -> IO.puts(result.result) |
| 168 | - {:error, %ClaudeCode.Message.Result{is_error: true} = result} -> |
| 168 | + {:error, %ClaudeCode.Message.ResultMessage{is_error: true} = result} -> |
| 169 169 | IO.puts("Claude error: \#{result.result}") |
| 170 170 | {:error, :timeout} -> IO.puts("Request timed out") |
| 171 171 | {:error, reason} -> IO.puts("Error: \#{inspect(reason)}") |
| @@ -6,12 +6,12 @@ defmodule ClaudeCode.Content do | |
| 6 6 | This module provides functions to parse and work with any content type. |
| 7 7 | """ |
| 8 8 | |
| 9 | - alias ClaudeCode.Content.Text |
| 10 | - alias ClaudeCode.Content.Thinking |
| 11 | - alias ClaudeCode.Content.ToolResult |
| 12 | - alias ClaudeCode.Content.ToolUse |
| 9 | + alias ClaudeCode.Content.TextBlock |
| 10 | + alias ClaudeCode.Content.ThinkingBlock |
| 11 | + alias ClaudeCode.Content.ToolResultBlock |
| 12 | + alias ClaudeCode.Content.ToolUseBlock |
| 13 13 | |
| 14 | - @type t :: Text.t() | Thinking.t() | ToolUse.t() | ToolResult.t() |
| 14 | + @type t :: TextBlock.t() | ThinkingBlock.t() | ToolUseBlock.t() | ToolResultBlock.t() |
| 15 15 | |
| 16 16 | @doc """ |
| 17 17 | Parses a content block from JSON data based on its type. |
| @@ -19,7 +19,7 @@ defmodule ClaudeCode.Content do | |
| 19 19 | ## Examples |
| 20 20 | |
| 21 21 | iex> Content.parse(%{"type" => "text", "text" => "Hello"}) |
| 22 | - {:ok, %Text{type: :text, text: "Hello"}} |
| 22 | + {:ok, %TextBlock{type: :text, text: "Hello"}} |
| 23 23 | |
| 24 24 | iex> Content.parse(%{"type" => "unknown"}) |
| 25 25 | {:error, {:unknown_content_type, "unknown"}} |
| @@ -27,10 +27,10 @@ defmodule ClaudeCode.Content do | |
| 27 27 | @spec parse(map()) :: {:ok, t()} | {:error, term()} |
| 28 28 | def parse(%{"type" => type} = data) do |
| 29 29 | case type do |
| 30 | - "text" -> Text.new(data) |
| 31 | - "thinking" -> Thinking.new(data) |
| 32 | - "tool_use" -> ToolUse.new(data) |
| 33 | - "tool_result" -> ToolResult.new(data) |
| 30 | + "text" -> TextBlock.new(data) |
| 31 | + "thinking" -> ThinkingBlock.new(data) |
| 32 | + "tool_use" -> ToolUseBlock.new(data) |
| 33 | + "tool_result" -> ToolResultBlock.new(data) |
| 34 34 | other -> {:error, {:unknown_content_type, other}} |
| 35 35 | end |
| 36 36 | end |
| @@ -63,18 +63,18 @@ defmodule ClaudeCode.Content do | |
| 63 63 | Checks if a value is any type of content block. |
| 64 64 | """ |
| 65 65 | @spec content?(any()) :: boolean() |
| 66 | - def content?(%Text{}), do: true |
| 67 | - def content?(%Thinking{}), do: true |
| 68 | - def content?(%ToolUse{}), do: true |
| 69 | - def content?(%ToolResult{}), do: true |
| 66 | + def content?(%TextBlock{}), do: true |
| 67 | + def content?(%ThinkingBlock{}), do: true |
| 68 | + def content?(%ToolUseBlock{}), do: true |
| 69 | + def content?(%ToolResultBlock{}), do: true |
| 70 70 | def content?(_), do: false |
| 71 71 | |
| 72 72 | @doc """ |
| 73 73 | Returns the type of a content block. |
| 74 74 | """ |
| 75 75 | @spec content_type(t()) :: :text | :thinking | :tool_use | :tool_result |
| 76 | - def content_type(%Text{type: type}), do: type |
| 77 | - def content_type(%Thinking{type: type}), do: type |
| 78 | - def content_type(%ToolUse{type: type}), do: type |
| 79 | - def content_type(%ToolResult{type: type}), do: type |
| 76 | + def content_type(%TextBlock{type: type}), do: type |
| 77 | + def content_type(%ThinkingBlock{type: type}), do: type |
| 78 | + def content_type(%ToolUseBlock{type: type}), do: type |
| 79 | + def content_type(%ToolResultBlock{type: type}), do: type |
| 80 80 | end |
Loading more files…