# `ClaudeAgentSDK.ContentExtractor`
[🔗](https://github.com/nshkrdotcom/claude_agent_sdk/blob/v0.15.0/lib/claude_agent_sdk/content_extractor.ex#L1)

Content extraction helper for Claude Code SDK messages.

This module provides utilities to extract text content from Claude messages,
which can have various formats depending on the type of response. It handles
simple text, structured content blocks, tool responses, and nested formats.

## Content Format Examples

Claude messages can contain content in several formats:

### Simple Text
    %{"content" => "Hello, world!"}

### Text Blocks
    %{"content" => [
      %{"type" => "text", "text" => "Hello"},
      %{"type" => "text", "text" => "World"}
    ]}

### Tool Responses
    %{"content" => [
      %{"type" => "text", "text" => "I'll help you with that."},
      %{"type" => "tool_use", "name" => "bash", "input" => %{"command" => "ls"}},
      %{"type" => "tool_result", "content" => "file1.txt file2.txt"}
    ]}

## Basic Usage

    # Extract text from assistant messages
    content = ClaudeAgentSDK.ContentExtractor.extract_text(message)
    
    # Check if message has text content
    if ClaudeAgentSDK.ContentExtractor.has_text?(message) do
      IO.puts("Message contains: #{ClaudeAgentSDK.ContentExtractor.extract_text(message)}")
    end

    # Extract all text from a stream of messages
    all_text = 
      stream
      |> Stream.filter(&ClaudeAgentSDK.ContentExtractor.has_text?/1)
      |> Stream.map(&ClaudeAgentSDK.ContentExtractor.extract_text/1)
      |> Enum.join("\n")

# `extract_all_text`

```elixir
@spec extract_all_text(Enumerable.t(), String.t()) :: String.t()
```

Extracts all text content from a stream of messages.

Convenience function to extract and concatenate text from multiple
messages in a stream. Filters out messages without text content.

## Parameters

- `messages` - Stream or enumerable of `ClaudeAgentSDK.Message` structs
- `separator` - String to join messages with (default: "\n")

## Returns

- String containing all extracted text, joined with separator

## Examples

    messages = [
      %ClaudeAgentSDK.Message{type: :assistant, data: %{message: %{"content" => "Hello"}}},
      %ClaudeAgentSDK.Message{type: :assistant, data: %{message: %{"content" => "World"}}},
      %ClaudeAgentSDK.Message{type: :system, data: %{}}  # No text content
    ]
    
    ClaudeAgentSDK.ContentExtractor.extract_all_text(messages)
    # => "Hello\nWorld"
    
    ClaudeAgentSDK.ContentExtractor.extract_all_text(messages, " | ")
    # => "Hello | World"

# `extract_content_text`

```elixir
@spec extract_content_text(any()) :: String.t()
```

Extracts text from various content formats.

This function handles the actual content extraction from different
Claude content formats, including simple strings, text block arrays,
and mixed content with tool usage.

## Parameters

- `content` - Content in various formats (string, list, map, etc.)

## Returns

- String containing the extracted text

## Examples

    # Simple string
    ClaudeAgentSDK.ContentExtractor.extract_content_text("Hello")
    # => "Hello"

    # Text blocks
    ClaudeAgentSDK.ContentExtractor.extract_content_text([
      %{"type" => "text", "text" => "Hello"},
      %{"type" => "text", "text" => "World"}
    ])
    # => "Hello World"

    # Mixed content with tools
    ClaudeAgentSDK.ContentExtractor.extract_content_text([
      %{"type" => "text", "text" => "Let me help:"},
      %{"type" => "tool_use", "name" => "calculator", "input" => %{}},
      %{"type" => "text", "text" => "Done!"}
    ])
    # => "Let me help: [Tool: calculator] Done!"

# `extract_text`

```elixir
@spec extract_text(ClaudeAgentSDK.Message.t() | map()) :: String.t() | nil
```

Extracts text content from a Claude message.

Handles various message types and content formats, returning the readable
text portion of the message. Tool responses are represented as placeholders.

## Parameters

- `message` - A `ClaudeAgentSDK.Message` struct

## Returns

- String containing the extracted text content
- `nil` if the message doesn't contain extractable text

## Examples

    # Simple text content
    message = %ClaudeAgentSDK.Message{
      type: :assistant,
      data: %{message: %{"content" => "Hello, world!"}}
    }
    ClaudeAgentSDK.ContentExtractor.extract_text(message)
    # => "Hello, world!"
    
    # Array-based content with multiple text blocks
    message = %ClaudeAgentSDK.Message{
      type: :assistant,
      data: %{message: %{"content" => [
        %{"type" => "text", "text" => "Here's the answer:"},
        %{"type" => "text", "text" => "42"}
      ]}}
    }
    ClaudeAgentSDK.ContentExtractor.extract_text(message)
    # => "Here's the answer: 42"

    # Content with tool usage
    message = %ClaudeAgentSDK.Message{
      type: :assistant,
      data: %{message: %{"content" => [
        %{"type" => "text", "text" => "Let me check that file:"},
        %{"type" => "tool_use", "name" => "read_file", "input" => %{"path" => "data.txt"}},
        %{"type" => "text", "text" => "Done!"}
      ]}}
    }
    ClaudeAgentSDK.ContentExtractor.extract_text(message)
    # => "Let me check that file: [Tool: read_file] Done!"

# `has_text?`

```elixir
@spec has_text?(ClaudeAgentSDK.Message.t() | map()) :: boolean()
```

Checks if a message contains extractable text content.

## Parameters

- `message` - A `ClaudeAgentSDK.Message` struct

## Returns

- `true` if the message contains extractable text
- `false` otherwise

## Examples

    message = %ClaudeAgentSDK.Message{
      type: :assistant, 
      data: %{message: %{"content" => "Hello"}}
    }
    ClaudeAgentSDK.ContentExtractor.has_text?(message)
    # => true

    message = %ClaudeAgentSDK.Message{
      type: :system, 
      data: %{session_id: "123"}
    }
    ClaudeAgentSDK.ContentExtractor.has_text?(message)
    # => true (system messages can have extractable info)

    message = %ClaudeAgentSDK.Message{
      type: :unknown, 
      data: %{}
    }
    ClaudeAgentSDK.ContentExtractor.has_text?(message)
    # => false

# `summarize`

```elixir
@spec summarize(ClaudeAgentSDK.Message.t() | map(), pos_integer()) :: String.t()
```

Summarizes content from a message, truncating if too long.

Useful for logging or displaying preview text without overwhelming output.

## Parameters

- `message` - A `ClaudeAgentSDK.Message` struct
- `max_length` - Maximum length of summary (default: 100)

## Returns

- String containing truncated text with "..." if truncated, or full text if short enough

## Examples

    message = %ClaudeAgentSDK.Message{
      type: :assistant, 
      data: %{message: %{"content" => "This is a very long message that should be truncated"}}
    }
    
    ClaudeAgentSDK.ContentExtractor.summarize(message, 20)
    # => "This is a very long..."

---

*Consult [api-reference.md](api-reference.md) for complete listing*
