@prismer/runtime 2.0.7 → 2.0.8
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.
- package/CHANGELOG.md +201 -0
- package/built-in-skills/agent-coordination/SKILL.md +235 -0
- package/built-in-skills/agent-meta/SKILL.md +52 -0
- package/built-in-skills/assets/SKILL.md +131 -0
- package/built-in-skills/canvas-design/LICENSE.txt +202 -0
- package/built-in-skills/canvas-design/SKILL.md +156 -0
- package/built-in-skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/built-in-skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/built-in-skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/built-in-skills/claim-agent-ownership/SKILL.md +254 -0
- package/built-in-skills/claude-api/LICENSE.txt +202 -0
- package/built-in-skills/claude-api/SKILL.md +324 -0
- package/built-in-skills/claude-api/csharp/claude-api.md +402 -0
- package/built-in-skills/claude-api/curl/examples.md +216 -0
- package/built-in-skills/claude-api/curl/managed-agents.md +336 -0
- package/built-in-skills/claude-api/go/claude-api.md +421 -0
- package/built-in-skills/claude-api/go/managed-agents/README.md +561 -0
- package/built-in-skills/claude-api/java/claude-api.md +432 -0
- package/built-in-skills/claude-api/java/managed-agents/README.md +442 -0
- package/built-in-skills/claude-api/php/claude-api.md +375 -0
- package/built-in-skills/claude-api/php/managed-agents/README.md +435 -0
- package/built-in-skills/claude-api/python/claude-api/README.md +420 -0
- package/built-in-skills/claude-api/python/claude-api/batches.md +185 -0
- package/built-in-skills/claude-api/python/claude-api/files-api.md +165 -0
- package/built-in-skills/claude-api/python/claude-api/streaming.md +162 -0
- package/built-in-skills/claude-api/python/claude-api/tool-use.md +590 -0
- package/built-in-skills/claude-api/python/managed-agents/README.md +332 -0
- package/built-in-skills/claude-api/ruby/claude-api.md +113 -0
- package/built-in-skills/claude-api/ruby/managed-agents/README.md +389 -0
- package/built-in-skills/claude-api/shared/agent-design.md +101 -0
- package/built-in-skills/claude-api/shared/error-codes.md +213 -0
- package/built-in-skills/claude-api/shared/live-sources.md +135 -0
- package/built-in-skills/claude-api/shared/managed-agents-api-reference.md +378 -0
- package/built-in-skills/claude-api/shared/managed-agents-client-patterns.md +209 -0
- package/built-in-skills/claude-api/shared/managed-agents-core.md +238 -0
- package/built-in-skills/claude-api/shared/managed-agents-environments.md +215 -0
- package/built-in-skills/claude-api/shared/managed-agents-events.md +195 -0
- package/built-in-skills/claude-api/shared/managed-agents-memory.md +197 -0
- package/built-in-skills/claude-api/shared/managed-agents-multiagent.md +99 -0
- package/built-in-skills/claude-api/shared/managed-agents-onboarding.md +114 -0
- package/built-in-skills/claude-api/shared/managed-agents-outcomes.md +106 -0
- package/built-in-skills/claude-api/shared/managed-agents-overview.md +68 -0
- package/built-in-skills/claude-api/shared/managed-agents-self-hosted-sandboxes.md +173 -0
- package/built-in-skills/claude-api/shared/managed-agents-tools.md +321 -0
- package/built-in-skills/claude-api/shared/managed-agents-webhooks.md +110 -0
- package/built-in-skills/claude-api/shared/model-migration.md +779 -0
- package/built-in-skills/claude-api/shared/models.md +121 -0
- package/built-in-skills/claude-api/shared/prompt-caching.md +171 -0
- package/built-in-skills/claude-api/shared/tool-use-concepts.md +327 -0
- package/built-in-skills/claude-api/typescript/claude-api/README.md +333 -0
- package/built-in-skills/claude-api/typescript/claude-api/batches.md +106 -0
- package/built-in-skills/claude-api/typescript/claude-api/files-api.md +98 -0
- package/built-in-skills/claude-api/typescript/claude-api/streaming.md +178 -0
- package/built-in-skills/claude-api/typescript/claude-api/tool-use.md +527 -0
- package/built-in-skills/claude-api/typescript/managed-agents/README.md +359 -0
- package/built-in-skills/doc-coauthoring/SKILL.md +375 -0
- package/built-in-skills/frontend-design/LICENSE.txt +177 -0
- package/built-in-skills/frontend-design/SKILL.md +42 -0
- package/built-in-skills/human-approval/SKILL.md +114 -0
- package/built-in-skills/image-generate/SKILL.md +327 -0
- package/built-in-skills/ingest/SKILL.md +105 -0
- package/built-in-skills/internal-comms/LICENSE.txt +202 -0
- package/built-in-skills/internal-comms/SKILL.md +32 -0
- package/built-in-skills/internal-comms/examples/3p-updates.md +47 -0
- package/built-in-skills/internal-comms/examples/company-newsletter.md +65 -0
- package/built-in-skills/internal-comms/examples/faq-answers.md +30 -0
- package/built-in-skills/internal-comms/examples/general-comms.md +16 -0
- package/built-in-skills/liteparse/SKILL.md +156 -0
- package/built-in-skills/mcp-builder/LICENSE.txt +202 -0
- package/built-in-skills/mcp-builder/SKILL.md +236 -0
- package/built-in-skills/mcp-builder/reference/evaluation.md +602 -0
- package/built-in-skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/built-in-skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/built-in-skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/built-in-skills/mcp-builder/scripts/connections.py +151 -0
- package/built-in-skills/mcp-builder/scripts/evaluation.py +373 -0
- package/built-in-skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/built-in-skills/mcp-builder/scripts/requirements.txt +2 -0
- package/built-in-skills/memory/SKILL.md +106 -0
- package/built-in-skills/memory-curation/SKILL.md +135 -0
- package/built-in-skills/office-artifacts/SKILL.md +198 -0
- package/built-in-skills/prismer-im-collab/SKILL.md +148 -0
- package/built-in-skills/skill-authoring/SKILL.md +124 -0
- package/built-in-skills/skill-authoring/skill.json +74 -0
- package/built-in-skills/skill-creator/LICENSE.txt +202 -0
- package/built-in-skills/skill-creator/SKILL.md +485 -0
- package/built-in-skills/skill-creator/agents/analyzer.md +274 -0
- package/built-in-skills/skill-creator/agents/comparator.md +202 -0
- package/built-in-skills/skill-creator/agents/grader.md +223 -0
- package/built-in-skills/skill-creator/assets/eval_review.html +146 -0
- package/built-in-skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/built-in-skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/built-in-skills/skill-creator/references/schemas.md +430 -0
- package/built-in-skills/skill-creator/scripts/__init__.py +0 -0
- package/built-in-skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/built-in-skills/skill-creator/scripts/generate_report.py +326 -0
- package/built-in-skills/skill-creator/scripts/improve_description.py +247 -0
- package/built-in-skills/skill-creator/scripts/package_skill.py +136 -0
- package/built-in-skills/skill-creator/scripts/quick_validate.py +103 -0
- package/built-in-skills/skill-creator/scripts/run_eval.py +310 -0
- package/built-in-skills/skill-creator/scripts/run_loop.py +328 -0
- package/built-in-skills/skill-creator/scripts/utils.py +47 -0
- package/built-in-skills/slack-gif-creator/LICENSE.txt +202 -0
- package/built-in-skills/slack-gif-creator/SKILL.md +271 -0
- package/built-in-skills/slack-gif-creator/core/easing.py +234 -0
- package/built-in-skills/slack-gif-creator/core/frame_composer.py +176 -0
- package/built-in-skills/slack-gif-creator/core/gif_builder.py +269 -0
- package/built-in-skills/slack-gif-creator/core/validators.py +136 -0
- package/built-in-skills/slack-gif-creator/requirements.txt +4 -0
- package/built-in-skills/tasks/SKILL.md +398 -0
- package/built-in-skills/team/SKILL.md +76 -0
- package/built-in-skills/web-artifacts-builder/LICENSE.txt +202 -0
- package/built-in-skills/web-artifacts-builder/SKILL.md +104 -0
- package/built-in-skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/built-in-skills/web-artifacts-builder/scripts/init-artifact.sh +334 -0
- package/built-in-skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/built-in-skills/webapp-testing/LICENSE.txt +202 -0
- package/built-in-skills/webapp-testing/SKILL.md +96 -0
- package/built-in-skills/webapp-testing/examples/console_logging.py +35 -0
- package/built-in-skills/webapp-testing/examples/element_discovery.py +40 -0
- package/built-in-skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/built-in-skills/webapp-testing/scripts/with_server.py +106 -0
- package/dist/cli.cjs +6195 -1631
- package/dist/cli.js +6148 -1585
- package/dist/index.cjs +6032 -1468
- package/dist/index.d.cts +813 -43
- package/dist/index.d.ts +813 -43
- package/dist/index.js +6017 -1454
- package/package.json +4 -2
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
# Managed Agents — Python
|
|
2
|
+
|
|
3
|
+
> **Bindings not shown here:** This README covers the most common managed-agents flows for Python. If you need a class, method, namespace, field, or behavior that isn't shown, WebFetch the Python SDK repo **or the relevant docs page** from `shared/live-sources.md` rather than guess. Do not extrapolate from cURL shapes or another language's SDK.
|
|
4
|
+
|
|
5
|
+
> **Agents are persistent — create once, reference by ID.** Store the agent ID returned by `agents.create` and pass it to every subsequent `sessions.create`; do not call `agents.create` in the request path. The Anthropic CLI is one convenient way to create agents and environments from version-controlled YAML — its URL is in `shared/live-sources.md`. The examples below show in-code creation for completeness; in production the create call belongs in setup, not in the request path.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pip install anthropic
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Client Initialization
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
import anthropic
|
|
17
|
+
|
|
18
|
+
# Default (uses ANTHROPIC_API_KEY env var)
|
|
19
|
+
client = anthropic.Anthropic()
|
|
20
|
+
|
|
21
|
+
# Explicit API key
|
|
22
|
+
client = anthropic.Anthropic(api_key="your-api-key")
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Create an Environment
|
|
28
|
+
|
|
29
|
+
```python
|
|
30
|
+
environment = client.beta.environments.create(
|
|
31
|
+
name="my-dev-env",
|
|
32
|
+
config={
|
|
33
|
+
"type": "cloud",
|
|
34
|
+
"networking": {"type": "unrestricted"},
|
|
35
|
+
},
|
|
36
|
+
)
|
|
37
|
+
print(environment.id) # env_...
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Create an Agent (required first step)
|
|
43
|
+
|
|
44
|
+
> ⚠️ **There is no inline agent config.** `model`/`system`/`tools` live on the agent object, not the session. Always start with `agents.create()` — the session only takes `agent={"type": "agent", "id": agent.id}`.
|
|
45
|
+
|
|
46
|
+
### Minimal
|
|
47
|
+
|
|
48
|
+
```python
|
|
49
|
+
# 1. Create the agent (reusable, versioned)
|
|
50
|
+
agent = client.beta.agents.create(
|
|
51
|
+
name="Coding Assistant",
|
|
52
|
+
model="claude-opus-4-7",
|
|
53
|
+
tools=[{"type": "agent_toolset_20260401", "default_config": {"enabled": True}}],
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
# 2. Start a session
|
|
57
|
+
session = client.beta.sessions.create(
|
|
58
|
+
agent={"type": "agent", "id": agent.id, "version": agent.version},
|
|
59
|
+
environment_id=environment.id,
|
|
60
|
+
)
|
|
61
|
+
print(session.id, session.status)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### With system prompt and custom tools
|
|
65
|
+
|
|
66
|
+
```python
|
|
67
|
+
import os
|
|
68
|
+
|
|
69
|
+
agent = client.beta.agents.create(
|
|
70
|
+
name="Code Reviewer",
|
|
71
|
+
model="claude-opus-4-7",
|
|
72
|
+
system="You are a senior code reviewer.",
|
|
73
|
+
tools=[
|
|
74
|
+
{"type": "agent_toolset_20260401"},
|
|
75
|
+
{
|
|
76
|
+
"type": "custom",
|
|
77
|
+
"name": "run_tests",
|
|
78
|
+
"description": "Run the test suite",
|
|
79
|
+
"input_schema": {
|
|
80
|
+
"type": "object",
|
|
81
|
+
"properties": {
|
|
82
|
+
"test_path": {"type": "string", "description": "Path to test file"}
|
|
83
|
+
},
|
|
84
|
+
"required": ["test_path"],
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
session = client.beta.sessions.create(
|
|
91
|
+
agent={"type": "agent", "id": agent.id, "version": agent.version},
|
|
92
|
+
environment_id=environment.id,
|
|
93
|
+
title="Code review session",
|
|
94
|
+
resources=[
|
|
95
|
+
{
|
|
96
|
+
"type": "github_repository",
|
|
97
|
+
"url": "https://github.com/owner/repo",
|
|
98
|
+
"mount_path": "/workspace/repo",
|
|
99
|
+
"authorization_token": os.environ["GITHUB_TOKEN"],
|
|
100
|
+
"branch": "main",
|
|
101
|
+
}
|
|
102
|
+
],
|
|
103
|
+
)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Send a User Message
|
|
109
|
+
|
|
110
|
+
```python
|
|
111
|
+
client.beta.sessions.events.send(
|
|
112
|
+
session_id=session.id,
|
|
113
|
+
events=[
|
|
114
|
+
{
|
|
115
|
+
"type": "user.message",
|
|
116
|
+
"content": [{"type": "text", "text": "Review the auth module"}],
|
|
117
|
+
}
|
|
118
|
+
],
|
|
119
|
+
)
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
> 💡 **Stream-first:** Open the stream *before* (or concurrently with) sending the message. The stream only delivers events that occur after it opens — stream-after-send means early events arrive buffered in one batch. See [Steering Patterns](../../shared/managed-agents-events.md#steering-patterns).
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Stream Events (SSE)
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
import json
|
|
130
|
+
|
|
131
|
+
# Stream-first: open stream, then send while stream is live
|
|
132
|
+
with client.beta.sessions.stream(
|
|
133
|
+
session_id=session.id,
|
|
134
|
+
) as stream:
|
|
135
|
+
client.beta.sessions.events.send(
|
|
136
|
+
session_id=session.id,
|
|
137
|
+
events=[{"type": "user.message", "content": [{"type": "text", "text": "..."}]}],
|
|
138
|
+
)
|
|
139
|
+
for event in stream:
|
|
140
|
+
... # process events
|
|
141
|
+
|
|
142
|
+
# Standalone stream iteration:
|
|
143
|
+
with client.beta.sessions.stream(
|
|
144
|
+
session_id=session.id,
|
|
145
|
+
) as stream:
|
|
146
|
+
for event in stream:
|
|
147
|
+
if event.type == "agent.message":
|
|
148
|
+
for block in event.content:
|
|
149
|
+
if block.type == "text":
|
|
150
|
+
print(block.text, end="", flush=True)
|
|
151
|
+
elif event.type == "agent.custom_tool_use":
|
|
152
|
+
# Custom tool invocation — session is now idle
|
|
153
|
+
print(f"\nCustom tool call: {event.tool_name}")
|
|
154
|
+
print(f"Input: {json.dumps(event.input)}")
|
|
155
|
+
# Send result back (see below)
|
|
156
|
+
elif event.type == "session.status_idle":
|
|
157
|
+
print("\n--- Agent idle ---")
|
|
158
|
+
elif event.type == "session.status_terminated":
|
|
159
|
+
print("\n--- Session terminated ---")
|
|
160
|
+
break
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Provide Custom Tool Result
|
|
166
|
+
|
|
167
|
+
```python
|
|
168
|
+
client.beta.sessions.events.send(
|
|
169
|
+
session_id=session.id,
|
|
170
|
+
events=[
|
|
171
|
+
{
|
|
172
|
+
"type": "user.custom_tool_result",
|
|
173
|
+
"custom_tool_use_id": "sevt_abc123",
|
|
174
|
+
"content": [{"type": "text", "text": "All 42 tests passed."}],
|
|
175
|
+
}
|
|
176
|
+
],
|
|
177
|
+
)
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Poll Events
|
|
183
|
+
|
|
184
|
+
```python
|
|
185
|
+
events = client.beta.sessions.events.list(
|
|
186
|
+
session_id=session.id,
|
|
187
|
+
)
|
|
188
|
+
for event in events.data:
|
|
189
|
+
print(f"{event.type}: {event.id}")
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
> ⚠️ **Prefer the SDK over raw `requests`/`httpx`.** If you hand-roll a poll loop, don't assume `timeout=(5, 60)` or `httpx.Timeout(120)` caps total call duration — both are **per-chunk** read timeouts (reset on every byte), so a trickling response can block forever. For a hard wall-clock deadline, track `time.monotonic()` at the loop level and bail explicitly, or wrap with `asyncio.wait_for()`. See [Receiving Events](../../shared/managed-agents-events.md#receiving-events).
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Full Streaming Loop with Custom Tools
|
|
197
|
+
|
|
198
|
+
```python
|
|
199
|
+
import json
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def run_custom_tool(tool_name: str, tool_input: dict) -> str:
|
|
203
|
+
"""Execute a custom tool and return the result."""
|
|
204
|
+
if tool_name == "run_tests":
|
|
205
|
+
# Your tool implementation here
|
|
206
|
+
return "All tests passed."
|
|
207
|
+
return f"Unknown tool: {tool_name}"
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def run_session(client, session_id: str):
|
|
211
|
+
"""Stream events and handle custom tool calls."""
|
|
212
|
+
while True:
|
|
213
|
+
with client.beta.sessions.stream(
|
|
214
|
+
session_id=session_id,
|
|
215
|
+
) as stream:
|
|
216
|
+
tool_calls = []
|
|
217
|
+
for event in stream:
|
|
218
|
+
if event.type == "agent.message":
|
|
219
|
+
for block in event.content:
|
|
220
|
+
if block.type == "text":
|
|
221
|
+
print(block.text, end="", flush=True)
|
|
222
|
+
elif event.type == "agent.custom_tool_use":
|
|
223
|
+
tool_calls.append(event)
|
|
224
|
+
elif event.type == "session.status_idle":
|
|
225
|
+
break
|
|
226
|
+
elif event.type == "session.status_terminated":
|
|
227
|
+
return
|
|
228
|
+
|
|
229
|
+
if not tool_calls:
|
|
230
|
+
break
|
|
231
|
+
|
|
232
|
+
# Process custom tool calls
|
|
233
|
+
results = []
|
|
234
|
+
for call in tool_calls:
|
|
235
|
+
result = run_custom_tool(call.tool_name, call.input)
|
|
236
|
+
results.append({
|
|
237
|
+
"type": "user.custom_tool_result",
|
|
238
|
+
"custom_tool_use_id": call.id,
|
|
239
|
+
"content": [{"type": "text", "text": result}],
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
client.beta.sessions.events.send(
|
|
243
|
+
session_id=session_id,
|
|
244
|
+
events=results,
|
|
245
|
+
)
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Upload a File
|
|
251
|
+
|
|
252
|
+
```python
|
|
253
|
+
with open("data.csv", "rb") as f:
|
|
254
|
+
file = client.beta.files.upload(
|
|
255
|
+
file=f,
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
# Use in a session
|
|
259
|
+
session = client.beta.sessions.create(
|
|
260
|
+
agent={"type": "agent", "id": agent.id, "version": agent.version},
|
|
261
|
+
environment_id=environment.id,
|
|
262
|
+
resources=[{"type": "file", "file_id": file.id, "mount_path": "/workspace/data.csv"}],
|
|
263
|
+
)
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## List and Download Session Files
|
|
269
|
+
|
|
270
|
+
List files the agent wrote to `/mnt/session/outputs/` during a session, then download them.
|
|
271
|
+
|
|
272
|
+
```python
|
|
273
|
+
# List files associated with a session
|
|
274
|
+
files = client.beta.files.list(
|
|
275
|
+
scope_id=session.id,
|
|
276
|
+
betas=["managed-agents-2026-04-01"],
|
|
277
|
+
)
|
|
278
|
+
for f in files.data:
|
|
279
|
+
print(f.filename, f.size_bytes)
|
|
280
|
+
# Download each file and save to disk
|
|
281
|
+
file_content = client.beta.files.download(f.id)
|
|
282
|
+
file_content.write_to_file(f.filename)
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
> 💡 There's a brief indexing lag (~1–3s) between `session.status_idle` and output files appearing in `files.list`. Retry once or twice if the list is empty.
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## Session Management
|
|
290
|
+
|
|
291
|
+
```python
|
|
292
|
+
# Get session details
|
|
293
|
+
session = client.beta.sessions.retrieve(session_id="sesn_011CZxAbc123Def456")
|
|
294
|
+
print(session.status, session.usage)
|
|
295
|
+
|
|
296
|
+
# List sessions
|
|
297
|
+
sessions = client.beta.sessions.list()
|
|
298
|
+
|
|
299
|
+
# Delete a session
|
|
300
|
+
client.beta.sessions.delete(session_id="sesn_011CZxAbc123Def456")
|
|
301
|
+
|
|
302
|
+
# Archive a session
|
|
303
|
+
client.beta.sessions.archive(session_id="sesn_011CZxAbc123Def456")
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## MCP Server Integration
|
|
309
|
+
|
|
310
|
+
```python
|
|
311
|
+
# Agent declares MCP server (no auth here — auth goes in a vault)
|
|
312
|
+
agent = client.beta.agents.create(
|
|
313
|
+
name="MCP Agent",
|
|
314
|
+
model="claude-opus-4-7",
|
|
315
|
+
mcp_servers=[
|
|
316
|
+
{"type": "url", "name": "my-tools", "url": "https://my-mcp-server.example.com/sse"},
|
|
317
|
+
],
|
|
318
|
+
tools=[
|
|
319
|
+
{"type": "agent_toolset_20260401", "default_config": {"enabled": True}},
|
|
320
|
+
{"type": "mcp_toolset", "mcp_server_name": "my-tools"},
|
|
321
|
+
],
|
|
322
|
+
)
|
|
323
|
+
|
|
324
|
+
# Session attaches vault(s) containing credentials for those MCP server URLs
|
|
325
|
+
session = client.beta.sessions.create(
|
|
326
|
+
agent=agent.id,
|
|
327
|
+
environment_id=environment.id,
|
|
328
|
+
vault_ids=[vault.id],
|
|
329
|
+
)
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
See `shared/managed-agents-tools.md` §Vaults for creating vaults and adding credentials.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Claude API — Ruby
|
|
2
|
+
|
|
3
|
+
> **Note:** The Ruby SDK supports the Claude API. A tool runner is available in beta via `client.beta.messages.tool_runner()`. Agent SDK is not yet available for Ruby.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
gem install anthropic
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Client Initialization
|
|
12
|
+
|
|
13
|
+
```ruby
|
|
14
|
+
require "anthropic"
|
|
15
|
+
|
|
16
|
+
# Default (uses ANTHROPIC_API_KEY env var)
|
|
17
|
+
client = Anthropic::Client.new
|
|
18
|
+
|
|
19
|
+
# Explicit API key
|
|
20
|
+
client = Anthropic::Client.new(api_key: "your-api-key")
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Basic Message Request
|
|
26
|
+
|
|
27
|
+
```ruby
|
|
28
|
+
message = client.messages.create(
|
|
29
|
+
model: :"claude-opus-4-7",
|
|
30
|
+
max_tokens: 16000,
|
|
31
|
+
messages: [
|
|
32
|
+
{ role: "user", content: "What is the capital of France?" }
|
|
33
|
+
]
|
|
34
|
+
)
|
|
35
|
+
# content is an array of polymorphic block objects (TextBlock, ThinkingBlock,
|
|
36
|
+
# ToolUseBlock, ...). .type is a Symbol — compare with :text, not "text".
|
|
37
|
+
# .text raises NoMethodError on non-TextBlock entries.
|
|
38
|
+
message.content.each do |block|
|
|
39
|
+
puts block.text if block.type == :text
|
|
40
|
+
end
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Streaming
|
|
46
|
+
|
|
47
|
+
```ruby
|
|
48
|
+
stream = client.messages.stream(
|
|
49
|
+
model: :"claude-opus-4-7",
|
|
50
|
+
max_tokens: 64000,
|
|
51
|
+
messages: [{ role: "user", content: "Write a haiku" }]
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
stream.text.each { |text| print(text) }
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Tool Use
|
|
60
|
+
|
|
61
|
+
The Ruby SDK supports tool use via raw JSON schema definitions and also provides a beta tool runner for automatic tool execution.
|
|
62
|
+
|
|
63
|
+
### Tool Runner (Beta)
|
|
64
|
+
|
|
65
|
+
```ruby
|
|
66
|
+
class GetWeatherInput < Anthropic::BaseModel
|
|
67
|
+
required :location, String, doc: "City and state, e.g. San Francisco, CA"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
class GetWeather < Anthropic::BaseTool
|
|
71
|
+
doc "Get the current weather for a location"
|
|
72
|
+
|
|
73
|
+
input_schema GetWeatherInput
|
|
74
|
+
|
|
75
|
+
def call(input)
|
|
76
|
+
"The weather in #{input.location} is sunny and 72°F."
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
client.beta.messages.tool_runner(
|
|
81
|
+
model: :"claude-opus-4-7",
|
|
82
|
+
max_tokens: 16000,
|
|
83
|
+
tools: [GetWeather.new],
|
|
84
|
+
messages: [{ role: "user", content: "What's the weather in San Francisco?" }]
|
|
85
|
+
).each_message do |message|
|
|
86
|
+
puts message.content
|
|
87
|
+
end
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Manual Loop
|
|
91
|
+
|
|
92
|
+
See the [shared tool use concepts](../shared/tool-use-concepts.md) for the tool definition format and agentic loop pattern.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Prompt Caching
|
|
97
|
+
|
|
98
|
+
`system_:` (trailing underscore — avoids shadowing `Kernel#system`) takes an array of text blocks; set `cache_control` on the last block. Plain hashes work via the `OrHash` type alias. For placement patterns and the silent-invalidator audit checklist, see `shared/prompt-caching.md`.
|
|
99
|
+
|
|
100
|
+
```ruby
|
|
101
|
+
message = client.messages.create(
|
|
102
|
+
model: :"claude-opus-4-7",
|
|
103
|
+
max_tokens: 16000,
|
|
104
|
+
system_: [
|
|
105
|
+
{ type: "text", text: long_system_prompt, cache_control: { type: "ephemeral" } }
|
|
106
|
+
],
|
|
107
|
+
messages: [{ role: "user", content: "Summarize the key points" }]
|
|
108
|
+
)
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
For 1-hour TTL: `cache_control: { type: "ephemeral", ttl: "1h" }`. There's also a top-level `cache_control:` on `messages.create` that auto-places on the last cacheable block.
|
|
112
|
+
|
|
113
|
+
Verify hits via `message.usage.cache_creation_input_tokens` / `message.usage.cache_read_input_tokens`.
|