claude-agent-sdk 0.1.2__py3-none-any.whl → 0.1.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-agent-sdk might be problematic. Click here for more details.
- claude_agent_sdk/__init__.py +17 -0
- claude_agent_sdk/_internal/query.py +22 -1
- claude_agent_sdk/_version.py +1 -1
- claude_agent_sdk/types.py +120 -14
- {claude_agent_sdk-0.1.2.dist-info → claude_agent_sdk-0.1.3.dist-info}/METADATA +1 -1
- {claude_agent_sdk-0.1.2.dist-info → claude_agent_sdk-0.1.3.dist-info}/RECORD +8 -8
- {claude_agent_sdk-0.1.2.dist-info → claude_agent_sdk-0.1.3.dist-info}/WHEEL +0 -0
- {claude_agent_sdk-0.1.2.dist-info → claude_agent_sdk-0.1.3.dist-info}/licenses/LICENSE +0 -0
claude_agent_sdk/__init__.py
CHANGED
|
@@ -18,11 +18,13 @@ from .query import query
|
|
|
18
18
|
from .types import (
|
|
19
19
|
AgentDefinition,
|
|
20
20
|
AssistantMessage,
|
|
21
|
+
BaseHookInput,
|
|
21
22
|
CanUseTool,
|
|
22
23
|
ClaudeAgentOptions,
|
|
23
24
|
ContentBlock,
|
|
24
25
|
HookCallback,
|
|
25
26
|
HookContext,
|
|
27
|
+
HookInput,
|
|
26
28
|
HookJSONOutput,
|
|
27
29
|
HookMatcher,
|
|
28
30
|
McpSdkServerConfig,
|
|
@@ -33,8 +35,13 @@ from .types import (
|
|
|
33
35
|
PermissionResultAllow,
|
|
34
36
|
PermissionResultDeny,
|
|
35
37
|
PermissionUpdate,
|
|
38
|
+
PostToolUseHookInput,
|
|
39
|
+
PreCompactHookInput,
|
|
40
|
+
PreToolUseHookInput,
|
|
36
41
|
ResultMessage,
|
|
37
42
|
SettingSource,
|
|
43
|
+
StopHookInput,
|
|
44
|
+
SubagentStopHookInput,
|
|
38
45
|
SystemMessage,
|
|
39
46
|
TextBlock,
|
|
40
47
|
ThinkingBlock,
|
|
@@ -42,6 +49,7 @@ from .types import (
|
|
|
42
49
|
ToolResultBlock,
|
|
43
50
|
ToolUseBlock,
|
|
44
51
|
UserMessage,
|
|
52
|
+
UserPromptSubmitHookInput,
|
|
45
53
|
)
|
|
46
54
|
|
|
47
55
|
# MCP Server Support
|
|
@@ -307,8 +315,17 @@ __all__ = [
|
|
|
307
315
|
"PermissionResultAllow",
|
|
308
316
|
"PermissionResultDeny",
|
|
309
317
|
"PermissionUpdate",
|
|
318
|
+
# Hook support
|
|
310
319
|
"HookCallback",
|
|
311
320
|
"HookContext",
|
|
321
|
+
"HookInput",
|
|
322
|
+
"BaseHookInput",
|
|
323
|
+
"PreToolUseHookInput",
|
|
324
|
+
"PostToolUseHookInput",
|
|
325
|
+
"UserPromptSubmitHookInput",
|
|
326
|
+
"StopHookInput",
|
|
327
|
+
"SubagentStopHookInput",
|
|
328
|
+
"PreCompactHookInput",
|
|
312
329
|
"HookJSONOutput",
|
|
313
330
|
"HookMatcher",
|
|
314
331
|
# Agent support
|
|
@@ -31,6 +31,25 @@ if TYPE_CHECKING:
|
|
|
31
31
|
logger = logging.getLogger(__name__)
|
|
32
32
|
|
|
33
33
|
|
|
34
|
+
def _convert_hook_output_for_cli(hook_output: dict[str, Any]) -> dict[str, Any]:
|
|
35
|
+
"""Convert Python-safe field names to CLI-expected field names.
|
|
36
|
+
|
|
37
|
+
The Python SDK uses `async_` and `continue_` to avoid keyword conflicts,
|
|
38
|
+
but the CLI expects `async` and `continue`. This function performs the
|
|
39
|
+
necessary conversion.
|
|
40
|
+
"""
|
|
41
|
+
converted = {}
|
|
42
|
+
for key, value in hook_output.items():
|
|
43
|
+
# Convert Python-safe names to JavaScript names
|
|
44
|
+
if key == "async_":
|
|
45
|
+
converted["async"] = value
|
|
46
|
+
elif key == "continue_":
|
|
47
|
+
converted["continue"] = value
|
|
48
|
+
else:
|
|
49
|
+
converted[key] = value
|
|
50
|
+
return converted
|
|
51
|
+
|
|
52
|
+
|
|
34
53
|
class Query:
|
|
35
54
|
"""Handles bidirectional control protocol on top of Transport.
|
|
36
55
|
|
|
@@ -244,11 +263,13 @@ class Query:
|
|
|
244
263
|
if not callback:
|
|
245
264
|
raise Exception(f"No hook callback found for ID: {callback_id}")
|
|
246
265
|
|
|
247
|
-
|
|
266
|
+
hook_output = await callback(
|
|
248
267
|
request_data.get("input"),
|
|
249
268
|
request_data.get("tool_use_id"),
|
|
250
269
|
{"signal": None}, # TODO: Add abort signal support
|
|
251
270
|
)
|
|
271
|
+
# Convert Python-safe field names (async_, continue_) to CLI-expected names (async, continue)
|
|
272
|
+
response_data = _convert_hook_output_for_cli(hook_output)
|
|
252
273
|
|
|
253
274
|
elif subtype == "mcp_message":
|
|
254
275
|
# Handle SDK MCP request
|
claude_agent_sdk/_version.py
CHANGED
claude_agent_sdk/types.py
CHANGED
|
@@ -157,6 +157,73 @@ HookEvent = (
|
|
|
157
157
|
)
|
|
158
158
|
|
|
159
159
|
|
|
160
|
+
# Hook input types - strongly typed for each hook event
|
|
161
|
+
class BaseHookInput(TypedDict):
|
|
162
|
+
"""Base hook input fields present across many hook events."""
|
|
163
|
+
|
|
164
|
+
session_id: str
|
|
165
|
+
transcript_path: str
|
|
166
|
+
cwd: str
|
|
167
|
+
permission_mode: NotRequired[str]
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
class PreToolUseHookInput(BaseHookInput):
|
|
171
|
+
"""Input data for PreToolUse hook events."""
|
|
172
|
+
|
|
173
|
+
hook_event_name: Literal["PreToolUse"]
|
|
174
|
+
tool_name: str
|
|
175
|
+
tool_input: dict[str, Any]
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
class PostToolUseHookInput(BaseHookInput):
|
|
179
|
+
"""Input data for PostToolUse hook events."""
|
|
180
|
+
|
|
181
|
+
hook_event_name: Literal["PostToolUse"]
|
|
182
|
+
tool_name: str
|
|
183
|
+
tool_input: dict[str, Any]
|
|
184
|
+
tool_response: Any
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class UserPromptSubmitHookInput(BaseHookInput):
|
|
188
|
+
"""Input data for UserPromptSubmit hook events."""
|
|
189
|
+
|
|
190
|
+
hook_event_name: Literal["UserPromptSubmit"]
|
|
191
|
+
prompt: str
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
class StopHookInput(BaseHookInput):
|
|
195
|
+
"""Input data for Stop hook events."""
|
|
196
|
+
|
|
197
|
+
hook_event_name: Literal["Stop"]
|
|
198
|
+
stop_hook_active: bool
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
class SubagentStopHookInput(BaseHookInput):
|
|
202
|
+
"""Input data for SubagentStop hook events."""
|
|
203
|
+
|
|
204
|
+
hook_event_name: Literal["SubagentStop"]
|
|
205
|
+
stop_hook_active: bool
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
class PreCompactHookInput(BaseHookInput):
|
|
209
|
+
"""Input data for PreCompact hook events."""
|
|
210
|
+
|
|
211
|
+
hook_event_name: Literal["PreCompact"]
|
|
212
|
+
trigger: Literal["manual", "auto"]
|
|
213
|
+
custom_instructions: str | None
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
# Union type for all hook inputs
|
|
217
|
+
HookInput = (
|
|
218
|
+
PreToolUseHookInput
|
|
219
|
+
| PostToolUseHookInput
|
|
220
|
+
| UserPromptSubmitHookInput
|
|
221
|
+
| StopHookInput
|
|
222
|
+
| SubagentStopHookInput
|
|
223
|
+
| PreCompactHookInput
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
|
|
160
227
|
# Hook-specific output types
|
|
161
228
|
class PreToolUseHookSpecificOutput(TypedDict):
|
|
162
229
|
"""Hook-specific output for PreToolUse events."""
|
|
@@ -198,18 +265,56 @@ HookSpecificOutput = (
|
|
|
198
265
|
|
|
199
266
|
# See https://docs.anthropic.com/en/docs/claude-code/hooks#advanced%3A-json-output
|
|
200
267
|
# for documentation of the output types.
|
|
268
|
+
#
|
|
269
|
+
# IMPORTANT: The Python SDK uses `async_` and `continue_` (with underscores) to avoid
|
|
270
|
+
# Python keyword conflicts. These fields are automatically converted to `async` and
|
|
271
|
+
# `continue` when sent to the CLI. You should use the underscore versions in your
|
|
272
|
+
# Python code.
|
|
201
273
|
class AsyncHookJSONOutput(TypedDict):
|
|
202
|
-
"""Async hook output that defers hook execution.
|
|
274
|
+
"""Async hook output that defers hook execution.
|
|
203
275
|
|
|
204
|
-
|
|
276
|
+
Fields:
|
|
277
|
+
async_: Set to True to defer hook execution. Note: This is converted to
|
|
278
|
+
"async" when sent to the CLI - use "async_" in your Python code.
|
|
279
|
+
asyncTimeout: Optional timeout in milliseconds for the async operation.
|
|
280
|
+
"""
|
|
281
|
+
|
|
282
|
+
async_: Literal[
|
|
283
|
+
True
|
|
284
|
+
] # Using async_ to avoid Python keyword (converted to "async" for CLI)
|
|
205
285
|
asyncTimeout: NotRequired[int]
|
|
206
286
|
|
|
207
287
|
|
|
208
288
|
class SyncHookJSONOutput(TypedDict):
|
|
209
|
-
"""Synchronous hook output with control and decision fields.
|
|
289
|
+
"""Synchronous hook output with control and decision fields.
|
|
290
|
+
|
|
291
|
+
This defines the structure for hook callbacks to control execution and provide
|
|
292
|
+
feedback to Claude.
|
|
293
|
+
|
|
294
|
+
Common Control Fields:
|
|
295
|
+
continue_: Whether Claude should proceed after hook execution (default: True).
|
|
296
|
+
Note: This is converted to "continue" when sent to the CLI.
|
|
297
|
+
suppressOutput: Hide stdout from transcript mode (default: False).
|
|
298
|
+
stopReason: Message shown when continue is False.
|
|
299
|
+
|
|
300
|
+
Decision Fields:
|
|
301
|
+
decision: Set to "block" to indicate blocking behavior.
|
|
302
|
+
systemMessage: Warning message displayed to the user.
|
|
303
|
+
reason: Feedback message for Claude about the decision.
|
|
304
|
+
|
|
305
|
+
Hook-Specific Output:
|
|
306
|
+
hookSpecificOutput: Event-specific controls (e.g., permissionDecision for
|
|
307
|
+
PreToolUse, additionalContext for PostToolUse).
|
|
308
|
+
|
|
309
|
+
Note: The CLI documentation shows field names without underscores ("async", "continue"),
|
|
310
|
+
but Python code should use the underscore versions ("async_", "continue_") as they
|
|
311
|
+
are automatically converted.
|
|
312
|
+
"""
|
|
210
313
|
|
|
211
314
|
# Common control fields
|
|
212
|
-
continue_: NotRequired[
|
|
315
|
+
continue_: NotRequired[
|
|
316
|
+
bool
|
|
317
|
+
] # Using continue_ to avoid Python keyword (converted to "continue" for CLI)
|
|
213
318
|
suppressOutput: NotRequired[bool]
|
|
214
319
|
stopReason: NotRequired[str]
|
|
215
320
|
|
|
@@ -227,21 +332,22 @@ class SyncHookJSONOutput(TypedDict):
|
|
|
227
332
|
HookJSONOutput = AsyncHookJSONOutput | SyncHookJSONOutput
|
|
228
333
|
|
|
229
334
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
"""Context information for hook callbacks."""
|
|
335
|
+
class HookContext(TypedDict):
|
|
336
|
+
"""Context information for hook callbacks.
|
|
233
337
|
|
|
234
|
-
|
|
338
|
+
Fields:
|
|
339
|
+
signal: Reserved for future abort signal support. Currently always None.
|
|
340
|
+
"""
|
|
341
|
+
|
|
342
|
+
signal: Any | None # Future: abort signal support
|
|
235
343
|
|
|
236
344
|
|
|
237
345
|
HookCallback = Callable[
|
|
238
346
|
# HookCallback input parameters:
|
|
239
|
-
# - input
|
|
240
|
-
#
|
|
241
|
-
#
|
|
242
|
-
|
|
243
|
-
# - context
|
|
244
|
-
[dict[str, Any], str | None, HookContext],
|
|
347
|
+
# - input: Strongly-typed hook input with discriminated unions based on hook_event_name
|
|
348
|
+
# - tool_use_id: Optional tool use identifier
|
|
349
|
+
# - context: Hook context with abort signal support (currently placeholder)
|
|
350
|
+
[HookInput, str | None, HookContext],
|
|
245
351
|
Awaitable[HookJSONOutput],
|
|
246
352
|
]
|
|
247
353
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-agent-sdk
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.3
|
|
4
4
|
Summary: Python SDK for Claude Code
|
|
5
5
|
Project-URL: Homepage, https://github.com/anthropics/claude-agent-sdk-python
|
|
6
6
|
Project-URL: Documentation, https://docs.anthropic.com/en/docs/claude-code/sdk
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
claude_agent_sdk/__init__.py,sha256=
|
|
1
|
+
claude_agent_sdk/__init__.py,sha256=6bpu7xdAzyHRRgxdXGBFbZgS-sVq2bvC7s2Z_whog7c,12035
|
|
2
2
|
claude_agent_sdk/_errors.py,sha256=nSdJNNeszvXG1PfnXd2sQpVNORqMct-MfPaiM3XeJL4,1579
|
|
3
|
-
claude_agent_sdk/_version.py,sha256=
|
|
3
|
+
claude_agent_sdk/_version.py,sha256=E5buSXiVJIZpoi3ylyUDKfQutllqoNUPcsm7cW4lC70,71
|
|
4
4
|
claude_agent_sdk/client.py,sha256=Bye3QKb-iTg6Yq34ZPGHzaMg1isT9RvyHs5TkC2jWDI,13926
|
|
5
5
|
claude_agent_sdk/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
6
|
claude_agent_sdk/query.py,sha256=WebhztsMZPdaxyy1LBEZv4_j23vjp_ceX9DtrBsZqCA,4530
|
|
7
|
-
claude_agent_sdk/types.py,sha256=
|
|
7
|
+
claude_agent_sdk/types.py,sha256=0CJP14sf1PJm1NdpLYvFQ_8bUrtuQMWaOPHsmvxB040,16646
|
|
8
8
|
claude_agent_sdk/_internal/__init__.py,sha256=zDdgjqp8SI9mTnwZbP2Be-w4LWlv4a3kA-TS2i75jsM,39
|
|
9
9
|
claude_agent_sdk/_internal/client.py,sha256=Z06Fj4t5mHkKHKBUwxmHMTEo7lzs3X4_D_c-xq6Wg4I,4603
|
|
10
10
|
claude_agent_sdk/_internal/message_parser.py,sha256=xxpOU3E8X21FCoy2OtLWKfEQr3AFYM454qJt6Xa0tmc,6475
|
|
11
|
-
claude_agent_sdk/_internal/query.py,sha256=
|
|
11
|
+
claude_agent_sdk/_internal/query.py,sha256=mfSiIfs58U1LYMnbj5GeLATvdI_cRVIxStV1He-cMTE,22015
|
|
12
12
|
claude_agent_sdk/_internal/transport/__init__.py,sha256=sv8Iy1b9YmPlXu4XsdN98gJIlyrLtwq8PKQyF4qnQLk,1978
|
|
13
13
|
claude_agent_sdk/_internal/transport/subprocess_cli.py,sha256=ViZxmHoAx3NdFNgLUFgNYuCjJZdVqKk2sxHlB57Z2ng,19097
|
|
14
|
-
claude_agent_sdk-0.1.
|
|
15
|
-
claude_agent_sdk-0.1.
|
|
16
|
-
claude_agent_sdk-0.1.
|
|
17
|
-
claude_agent_sdk-0.1.
|
|
14
|
+
claude_agent_sdk-0.1.3.dist-info/METADATA,sha256=UieBXMnHeT5-bVpX8aJWQtph4MtLpf4hL8O-vL1up-8,9648
|
|
15
|
+
claude_agent_sdk-0.1.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
16
|
+
claude_agent_sdk-0.1.3.dist-info/licenses/LICENSE,sha256=zr3eio-57lnl6q7RlXi_gIWqcEdWIlnDHzjyJcJvaBI,1070
|
|
17
|
+
claude_agent_sdk-0.1.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|