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.
-
#get_mcp_status ⇒ Hash
Get current MCP server connection status (only works with streaming mode).
-
#get_server_info ⇒ Hash
Get server initialization info including available commands and output styles.
-
#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.
-
#rewind_files(user_message_uuid) ⇒ Object
Rewind files to a previous checkpoint (v0.1.15+) Restores file state to what it was at the given user message Requires enable_file_checkpointing to be true in options.
-
#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.
174 175 176 177 178 179 |
# File 'lib/claude_agent_sdk.rb', line 174 def initialize(options: nil) @options = || ClaudeAgentOptions.new @transport = nil @query_handler = nil @connected = false end |
Instance Attribute Details
#query_handler ⇒ Object (readonly)
Returns the value of attribute query_handler.
172 173 174 |
# File 'lib/claude_agent_sdk.rb', line 172 def query_handler @query_handler end |
Instance Method Details
#connect(prompt = nil) ⇒ Object
Connect to Claude with optional initial prompt.
Client always uses streaming mode for bidirectional communication. If you pass a String, it will be sent as an initial user message after the connection is established. If you pass an Enumerator, it should yield JSONL messages (e.g., from ClaudeAgentSDK::Streaming.user_message).
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 |
# File 'lib/claude_agent_sdk.rb', line 189 def connect(prompt = nil) return if @connected raise ArgumentError, "prompt must be a String, an Enumerator, or nil (got #{prompt.class})" unless prompt.nil? || prompt.is_a?(String) || prompt.respond_to?(:each) # Validate and configure permission settings = @options if @options.can_use_tool # can_use_tool and permission_prompt_tool_name are mutually exclusive raise ArgumentError, 'can_use_tool callback cannot be used with permission_prompt_tool_name' if @options. # Set permission_prompt_tool_name to stdio for control protocol = @options.dup_with(permission_prompt_tool_name: 'stdio') end = .dup_with( env: (.env || {}).merge('CLAUDE_CODE_ENTRYPOINT' => 'sdk-rb-client') ) # Client always uses streaming mode; keep stdin open for bidirectional communication. @transport = SubprocessCLITransport.new() @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, agents: .agents ) # Start query handler and initialize @query_handler.start @query_handler.initialize_protocol @connected = true # Optionally send initial prompt/messages after connection is ready. case prompt when nil nil when String query(prompt) else prompt.each do || = .to_s += "\n" unless .end_with?("\n") @transport.write() end end end |
#disconnect ⇒ Object
Disconnect from Claude
343 344 345 346 347 348 349 350 |
# File 'lib/claude_agent_sdk.rb', line 343 def disconnect return unless @connected @query_handler&.close @query_handler = nil @transport = nil @connected = false end |
#get_mcp_status ⇒ Hash
Get current MCP server connection status (only works with streaming mode)
330 331 332 333 |
# File 'lib/claude_agent_sdk.rb', line 330 def get_mcp_status raise CLIConnectionError, 'Not connected. Call connect() first' unless @connected @query_handler.get_mcp_status end |
#get_server_info ⇒ Hash
Get server initialization info including available commands and output styles
337 338 339 340 |
# File 'lib/claude_agent_sdk.rb', line 337 def get_server_info raise CLIConnectionError, 'Not connected. Call connect() first' unless @connected server_info end |
#interrupt ⇒ Object
Send interrupt signal
294 295 296 297 |
# File 'lib/claude_agent_sdk.rb', line 294 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
257 258 259 260 261 262 263 264 265 266 267 |
# File 'lib/claude_agent_sdk.rb', line 257 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
271 272 273 274 275 276 277 278 279 280 |
# File 'lib/claude_agent_sdk.rb', line 271 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
284 285 286 287 288 289 290 291 |
# File 'lib/claude_agent_sdk.rb', line 284 def receive_response(&block) return enum_for(:receive_response) unless block do || block.call() break if .is_a?(ResultMessage) end end |
#rewind_files(user_message_uuid) ⇒ Object
Rewind files to a previous checkpoint (v0.1.15+) Restores file state to what it was at the given user message Requires enable_file_checkpointing to be true in options
317 318 319 320 |
# File 'lib/claude_agent_sdk.rb', line 317 def rewind_files() raise CLIConnectionError, 'Not connected. Call connect() first' unless @connected @query_handler.rewind_files() end |
#server_info ⇒ Hash?
Get server initialization info
324 325 326 |
# File 'lib/claude_agent_sdk.rb', line 324 def server_info @query_handler&.instance_variable_get(:@initialization_result) end |
#set_model(model) ⇒ Object
Change the AI model during conversation
308 309 310 311 |
# File 'lib/claude_agent_sdk.rb', line 308 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
301 302 303 304 |
# File 'lib/claude_agent_sdk.rb', line 301 def (mode) raise CLIConnectionError, 'Not connected. Call connect() first' unless @connected @query_handler.(mode) end |