Class: ClaudeAgentSDK::Client
- Inherits:
-
Object
- Object
- ClaudeAgentSDK::Client
- Defined in:
- lib/claude_agent_sdk.rb
Overview
Client for bidirectional, interactive conversations with Claude Code
This client provides full control over the conversation flow with support for streaming, hooks, permission callbacks, and dynamic message sending. The Client class always uses streaming mode for bidirectional communication.
Instance Attribute Summary collapse
-
#query_handler ⇒ Object
readonly
Returns the value of attribute query_handler.
Instance Method Summary collapse
-
#connect(prompt = nil) ⇒ Object
Connect to Claude with optional initial prompt.
-
#disconnect ⇒ Object
Disconnect from Claude.
-
#initialize(options: nil) ⇒ Client
constructor
A new instance of Client.
-
#interrupt ⇒ Object
Send interrupt signal.
-
#query(prompt, session_id: 'default') ⇒ Object
Send a query to Claude.
-
#receive_messages {|Message| ... } ⇒ Object
Receive all messages from Claude.
-
#receive_response {|Message| ... } ⇒ Object
Receive messages until a ResultMessage is received.
-
#server_info ⇒ Hash?
Get server initialization info.
-
#set_model(model) ⇒ Object
Change the AI model during conversation.
-
#set_permission_mode(mode) ⇒ Object
Change permission mode during conversation.
Constructor Details
#initialize(options: nil) ⇒ Client
Returns a new instance of Client.
124 125 126 127 128 129 130 |
# File 'lib/claude_agent_sdk.rb', line 124 def initialize(options: nil) @options = || ClaudeAgentOptions.new @transport = nil @query_handler = nil @connected = false ENV['CLAUDE_CODE_ENTRYPOINT'] = 'sdk-rb-client' end |
Instance Attribute Details
#query_handler ⇒ Object (readonly)
Returns the value of attribute query_handler.
122 123 124 |
# File 'lib/claude_agent_sdk.rb', line 122 def query_handler @query_handler end |
Instance Method Details
#connect(prompt = nil) ⇒ Object
Connect to Claude with optional initial prompt
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
# File 'lib/claude_agent_sdk.rb', line 134 def connect(prompt = nil) return if @connected # Validate and configure permission settings = @options if @options.can_use_tool # can_use_tool requires streaming mode if prompt.is_a?(String) raise ArgumentError, 'can_use_tool callback requires streaming mode' end # can_use_tool and permission_prompt_tool_name are mutually exclusive if @options. raise ArgumentError, 'can_use_tool callback cannot be used with permission_prompt_tool_name' end # Set permission_prompt_tool_name to stdio for control protocol = @options.dup_with(permission_prompt_tool_name: 'stdio') end # Auto-connect with empty enumerator if no prompt is provided # This matches the Python SDK pattern where ClaudeSDKClient always uses streaming mode # An empty enumerator keeps stdin open for bidirectional communication actual_prompt = prompt || [].to_enum @transport = SubprocessCLITransport.new(actual_prompt, ) @transport.connect # Extract SDK MCP servers sdk_mcp_servers = {} if .mcp_servers.is_a?(Hash) .mcp_servers.each do |name, config| sdk_mcp_servers[name] = config[:instance] if config.is_a?(Hash) && config[:type] == 'sdk' end end # Convert hooks to internal format hooks = convert_hooks_to_internal_format(.hooks) if .hooks # Create Query handler @query_handler = Query.new( transport: @transport, is_streaming_mode: true, can_use_tool: .can_use_tool, hooks: hooks, sdk_mcp_servers: sdk_mcp_servers ) # Start query handler and initialize @query_handler.start @query_handler.initialize_protocol @connected = true end |
#disconnect ⇒ Object
Disconnect from Claude
254 255 256 257 258 259 260 261 |
# File 'lib/claude_agent_sdk.rb', line 254 def disconnect return unless @connected @query_handler&.close @query_handler = nil @transport = nil @connected = false end |
#interrupt ⇒ Object
Send interrupt signal
228 229 230 231 |
# File 'lib/claude_agent_sdk.rb', line 228 def interrupt raise CLIConnectionError, 'Not connected. Call connect() first' unless @connected @query_handler.interrupt end |
#query(prompt, session_id: 'default') ⇒ Object
Send a query to Claude
191 192 193 194 195 196 197 198 199 200 201 |
# File 'lib/claude_agent_sdk.rb', line 191 def query(prompt, session_id: 'default') raise CLIConnectionError, 'Not connected. Call connect() first' unless @connected = { type: 'user', message: { role: 'user', content: prompt }, parent_tool_use_id: nil, session_id: session_id } @transport.write(JSON.generate() + "\n") end |
#receive_messages {|Message| ... } ⇒ Object
Receive all messages from Claude
205 206 207 208 209 210 211 212 213 214 |
# File 'lib/claude_agent_sdk.rb', line 205 def (&block) return enum_for(:receive_messages) unless block raise CLIConnectionError, 'Not connected. Call connect() first' unless @connected @query_handler. do |data| = MessageParser.parse(data) block.call() end end |
#receive_response {|Message| ... } ⇒ Object
Receive messages until a ResultMessage is received
218 219 220 221 222 223 224 225 |
# File 'lib/claude_agent_sdk.rb', line 218 def receive_response(&block) return enum_for(:receive_response) unless block do || block.call() break if .is_a?(ResultMessage) end end |
#server_info ⇒ Hash?
Get server initialization info
249 250 251 |
# File 'lib/claude_agent_sdk.rb', line 249 def server_info @query_handler&.instance_variable_get(:@initialization_result) end |
#set_model(model) ⇒ Object
Change the AI model during conversation
242 243 244 245 |
# File 'lib/claude_agent_sdk.rb', line 242 def set_model(model) raise CLIConnectionError, 'Not connected. Call connect() first' unless @connected @query_handler.set_model(model) end |
#set_permission_mode(mode) ⇒ Object
Change permission mode during conversation
235 236 237 238 |
# File 'lib/claude_agent_sdk.rb', line 235 def (mode) raise CLIConnectionError, 'Not connected. Call connect() first' unless @connected @query_handler.(mode) end |