claudient 0.1.0

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.
Files changed (283) hide show
  1. package/.claude-plugin/plugin.json +42 -0
  2. package/CONTEXT.md +58 -0
  3. package/README.md +165 -0
  4. package/agents/build-resolvers/de/python-resolver.md +64 -0
  5. package/agents/build-resolvers/de/typescript-resolver.md +65 -0
  6. package/agents/build-resolvers/es/python-resolver.md +64 -0
  7. package/agents/build-resolvers/es/typescript-resolver.md +65 -0
  8. package/agents/build-resolvers/fr/python-resolver.md +64 -0
  9. package/agents/build-resolvers/fr/typescript-resolver.md +65 -0
  10. package/agents/build-resolvers/nl/python-resolver.md +64 -0
  11. package/agents/build-resolvers/nl/typescript-resolver.md +65 -0
  12. package/agents/build-resolvers/python-resolver.md +62 -0
  13. package/agents/build-resolvers/typescript-resolver.md +63 -0
  14. package/agents/core/architect.md +64 -0
  15. package/agents/core/code-reviewer.md +78 -0
  16. package/agents/core/de/architect.md +66 -0
  17. package/agents/core/de/code-reviewer.md +80 -0
  18. package/agents/core/de/planner.md +63 -0
  19. package/agents/core/de/security-reviewer.md +93 -0
  20. package/agents/core/es/architect.md +66 -0
  21. package/agents/core/es/code-reviewer.md +80 -0
  22. package/agents/core/es/planner.md +63 -0
  23. package/agents/core/es/security-reviewer.md +93 -0
  24. package/agents/core/fr/architect.md +66 -0
  25. package/agents/core/fr/code-reviewer.md +80 -0
  26. package/agents/core/fr/planner.md +63 -0
  27. package/agents/core/fr/security-reviewer.md +93 -0
  28. package/agents/core/nl/architect.md +66 -0
  29. package/agents/core/nl/code-reviewer.md +80 -0
  30. package/agents/core/nl/planner.md +63 -0
  31. package/agents/core/nl/security-reviewer.md +93 -0
  32. package/agents/core/planner.md +61 -0
  33. package/agents/core/security-reviewer.md +91 -0
  34. package/guides/agent-orchestration.md +231 -0
  35. package/guides/de/agent-orchestration.md +174 -0
  36. package/guides/de/getting-started.md +164 -0
  37. package/guides/de/hooks-cookbook.md +160 -0
  38. package/guides/de/memory-management.md +153 -0
  39. package/guides/de/security.md +180 -0
  40. package/guides/de/skill-authoring.md +214 -0
  41. package/guides/de/token-optimization.md +156 -0
  42. package/guides/es/agent-orchestration.md +174 -0
  43. package/guides/es/getting-started.md +164 -0
  44. package/guides/es/hooks-cookbook.md +160 -0
  45. package/guides/es/memory-management.md +153 -0
  46. package/guides/es/security.md +180 -0
  47. package/guides/es/skill-authoring.md +214 -0
  48. package/guides/es/token-optimization.md +156 -0
  49. package/guides/fr/agent-orchestration.md +174 -0
  50. package/guides/fr/getting-started.md +164 -0
  51. package/guides/fr/hooks-cookbook.md +227 -0
  52. package/guides/fr/memory-management.md +169 -0
  53. package/guides/fr/security.md +180 -0
  54. package/guides/fr/skill-authoring.md +214 -0
  55. package/guides/fr/token-optimization.md +158 -0
  56. package/guides/getting-started.md +164 -0
  57. package/guides/hooks-cookbook.md +423 -0
  58. package/guides/memory-management.md +192 -0
  59. package/guides/nl/agent-orchestration.md +174 -0
  60. package/guides/nl/getting-started.md +164 -0
  61. package/guides/nl/hooks-cookbook.md +160 -0
  62. package/guides/nl/memory-management.md +153 -0
  63. package/guides/nl/security.md +180 -0
  64. package/guides/nl/skill-authoring.md +214 -0
  65. package/guides/nl/token-optimization.md +156 -0
  66. package/guides/security.md +229 -0
  67. package/guides/skill-authoring.md +226 -0
  68. package/guides/token-optimization.md +169 -0
  69. package/hooks/lifecycle/cost-tracker.md +49 -0
  70. package/hooks/lifecycle/cost-tracker.sh +59 -0
  71. package/hooks/lifecycle/pre-compact-save.md +56 -0
  72. package/hooks/lifecycle/pre-compact-save.sh +37 -0
  73. package/hooks/lifecycle/session-start.md +50 -0
  74. package/hooks/lifecycle/session-start.sh +47 -0
  75. package/hooks/post-tool-use/audit-log.md +53 -0
  76. package/hooks/post-tool-use/audit-log.sh +53 -0
  77. package/hooks/post-tool-use/prettier.md +53 -0
  78. package/hooks/post-tool-use/prettier.sh +49 -0
  79. package/hooks/pre-tool-use/block-dangerous.md +48 -0
  80. package/hooks/pre-tool-use/block-dangerous.sh +76 -0
  81. package/hooks/pre-tool-use/git-push-confirm.md +46 -0
  82. package/hooks/pre-tool-use/git-push-confirm.sh +36 -0
  83. package/mcp/configs/github.json +11 -0
  84. package/mcp/configs/postgres.json +11 -0
  85. package/mcp/de/recommended-servers.md +170 -0
  86. package/mcp/es/recommended-servers.md +170 -0
  87. package/mcp/fr/recommended-servers.md +170 -0
  88. package/mcp/nl/recommended-servers.md +170 -0
  89. package/mcp/recommended-servers.md +168 -0
  90. package/package.json +45 -0
  91. package/prompts/project-starters/de/fastapi-project.md +62 -0
  92. package/prompts/project-starters/de/nextjs-project.md +82 -0
  93. package/prompts/project-starters/es/fastapi-project.md +62 -0
  94. package/prompts/project-starters/es/nextjs-project.md +82 -0
  95. package/prompts/project-starters/fastapi-project.md +60 -0
  96. package/prompts/project-starters/fr/fastapi-project.md +62 -0
  97. package/prompts/project-starters/fr/nextjs-project.md +82 -0
  98. package/prompts/project-starters/nextjs-project.md +80 -0
  99. package/prompts/project-starters/nl/fastapi-project.md +62 -0
  100. package/prompts/project-starters/nl/nextjs-project.md +82 -0
  101. package/prompts/system-prompts/ai-product.md +80 -0
  102. package/prompts/system-prompts/data-pipeline.md +76 -0
  103. package/prompts/system-prompts/de/ai-product.md +82 -0
  104. package/prompts/system-prompts/de/data-pipeline.md +78 -0
  105. package/prompts/system-prompts/de/saas-backend.md +71 -0
  106. package/prompts/system-prompts/es/ai-product.md +82 -0
  107. package/prompts/system-prompts/es/data-pipeline.md +78 -0
  108. package/prompts/system-prompts/es/saas-backend.md +71 -0
  109. package/prompts/system-prompts/fr/ai-product.md +82 -0
  110. package/prompts/system-prompts/fr/data-pipeline.md +78 -0
  111. package/prompts/system-prompts/fr/saas-backend.md +71 -0
  112. package/prompts/system-prompts/nl/ai-product.md +82 -0
  113. package/prompts/system-prompts/nl/data-pipeline.md +78 -0
  114. package/prompts/system-prompts/nl/saas-backend.md +71 -0
  115. package/prompts/system-prompts/saas-backend.md +69 -0
  116. package/prompts/task-specific/changelog.md +81 -0
  117. package/prompts/task-specific/de/changelog.md +83 -0
  118. package/prompts/task-specific/de/debugging.md +78 -0
  119. package/prompts/task-specific/de/pr-description.md +69 -0
  120. package/prompts/task-specific/debugging.md +76 -0
  121. package/prompts/task-specific/es/changelog.md +83 -0
  122. package/prompts/task-specific/es/debugging.md +78 -0
  123. package/prompts/task-specific/es/pr-description.md +69 -0
  124. package/prompts/task-specific/fr/changelog.md +83 -0
  125. package/prompts/task-specific/fr/debugging.md +78 -0
  126. package/prompts/task-specific/fr/pr-description.md +69 -0
  127. package/prompts/task-specific/nl/changelog.md +83 -0
  128. package/prompts/task-specific/nl/debugging.md +78 -0
  129. package/prompts/task-specific/nl/pr-description.md +69 -0
  130. package/prompts/task-specific/pr-description.md +67 -0
  131. package/rules/common/coding-style.md +45 -0
  132. package/rules/common/de/coding-style.md +47 -0
  133. package/rules/common/de/git.md +48 -0
  134. package/rules/common/de/performance.md +40 -0
  135. package/rules/common/de/security.md +45 -0
  136. package/rules/common/de/testing.md +45 -0
  137. package/rules/common/es/coding-style.md +47 -0
  138. package/rules/common/es/git.md +48 -0
  139. package/rules/common/es/performance.md +40 -0
  140. package/rules/common/es/security.md +45 -0
  141. package/rules/common/es/testing.md +45 -0
  142. package/rules/common/fr/coding-style.md +47 -0
  143. package/rules/common/fr/git.md +48 -0
  144. package/rules/common/fr/performance.md +40 -0
  145. package/rules/common/fr/security.md +45 -0
  146. package/rules/common/fr/testing.md +45 -0
  147. package/rules/common/git.md +46 -0
  148. package/rules/common/nl/coding-style.md +47 -0
  149. package/rules/common/nl/git.md +48 -0
  150. package/rules/common/nl/performance.md +40 -0
  151. package/rules/common/nl/security.md +45 -0
  152. package/rules/common/nl/testing.md +45 -0
  153. package/rules/common/performance.md +38 -0
  154. package/rules/common/security.md +43 -0
  155. package/rules/common/testing.md +43 -0
  156. package/rules/language-specific/de/go.md +48 -0
  157. package/rules/language-specific/de/python.md +38 -0
  158. package/rules/language-specific/de/typescript.md +51 -0
  159. package/rules/language-specific/es/go.md +48 -0
  160. package/rules/language-specific/es/python.md +38 -0
  161. package/rules/language-specific/es/typescript.md +51 -0
  162. package/rules/language-specific/fr/go.md +48 -0
  163. package/rules/language-specific/fr/python.md +38 -0
  164. package/rules/language-specific/fr/typescript.md +51 -0
  165. package/rules/language-specific/go.md +46 -0
  166. package/rules/language-specific/nl/go.md +48 -0
  167. package/rules/language-specific/nl/python.md +38 -0
  168. package/rules/language-specific/nl/typescript.md +51 -0
  169. package/rules/language-specific/python.md +36 -0
  170. package/rules/language-specific/typescript.md +49 -0
  171. package/scripts/cli.js +161 -0
  172. package/scripts/link-skills.sh +35 -0
  173. package/scripts/list-skills.sh +34 -0
  174. package/skills/ai-engineering/agent-construction.md +285 -0
  175. package/skills/ai-engineering/claude-api.md +248 -0
  176. package/skills/ai-engineering/de/agent-construction.md +287 -0
  177. package/skills/ai-engineering/de/claude-api.md +250 -0
  178. package/skills/ai-engineering/es/agent-construction.md +287 -0
  179. package/skills/ai-engineering/es/claude-api.md +250 -0
  180. package/skills/ai-engineering/fr/agent-construction.md +287 -0
  181. package/skills/ai-engineering/fr/claude-api.md +250 -0
  182. package/skills/ai-engineering/nl/agent-construction.md +287 -0
  183. package/skills/ai-engineering/nl/claude-api.md +250 -0
  184. package/skills/backend/dotnet/csharp.md +304 -0
  185. package/skills/backend/dotnet/de/csharp.md +306 -0
  186. package/skills/backend/dotnet/es/csharp.md +306 -0
  187. package/skills/backend/dotnet/fr/csharp.md +306 -0
  188. package/skills/backend/dotnet/nl/csharp.md +306 -0
  189. package/skills/backend/go/de/go.md +307 -0
  190. package/skills/backend/go/es/go.md +307 -0
  191. package/skills/backend/go/fr/go.md +307 -0
  192. package/skills/backend/go/go.md +305 -0
  193. package/skills/backend/go/nl/go.md +307 -0
  194. package/skills/backend/nodejs/de/nestjs.md +274 -0
  195. package/skills/backend/nodejs/de/nextjs.md +222 -0
  196. package/skills/backend/nodejs/es/nestjs.md +274 -0
  197. package/skills/backend/nodejs/es/nextjs.md +222 -0
  198. package/skills/backend/nodejs/fr/nestjs.md +274 -0
  199. package/skills/backend/nodejs/fr/nextjs.md +222 -0
  200. package/skills/backend/nodejs/nestjs.md +272 -0
  201. package/skills/backend/nodejs/nextjs.md +220 -0
  202. package/skills/backend/nodejs/nl/nestjs.md +274 -0
  203. package/skills/backend/nodejs/nl/nextjs.md +222 -0
  204. package/skills/backend/python/de/django.md +285 -0
  205. package/skills/backend/python/de/fastapi.md +244 -0
  206. package/skills/backend/python/django.md +283 -0
  207. package/skills/backend/python/es/django.md +285 -0
  208. package/skills/backend/python/es/fastapi.md +244 -0
  209. package/skills/backend/python/fastapi.md +242 -0
  210. package/skills/backend/python/fr/django.md +285 -0
  211. package/skills/backend/python/fr/fastapi.md +244 -0
  212. package/skills/backend/python/nl/django.md +285 -0
  213. package/skills/backend/python/nl/fastapi.md +244 -0
  214. package/skills/data-ml/dbt-data-pipelines.md +155 -0
  215. package/skills/data-ml/de/dbt-data-pipelines.md +157 -0
  216. package/skills/data-ml/de/pandas-polars.md +147 -0
  217. package/skills/data-ml/de/pytorch-tensorflow.md +171 -0
  218. package/skills/data-ml/es/dbt-data-pipelines.md +157 -0
  219. package/skills/data-ml/es/pandas-polars.md +147 -0
  220. package/skills/data-ml/es/pytorch-tensorflow.md +171 -0
  221. package/skills/data-ml/fr/dbt-data-pipelines.md +157 -0
  222. package/skills/data-ml/fr/pandas-polars.md +147 -0
  223. package/skills/data-ml/fr/pytorch-tensorflow.md +171 -0
  224. package/skills/data-ml/nl/dbt-data-pipelines.md +157 -0
  225. package/skills/data-ml/nl/pandas-polars.md +147 -0
  226. package/skills/data-ml/nl/pytorch-tensorflow.md +171 -0
  227. package/skills/data-ml/pandas-polars.md +145 -0
  228. package/skills/data-ml/pytorch-tensorflow.md +169 -0
  229. package/skills/database/de/graphql.md +181 -0
  230. package/skills/database/es/graphql.md +181 -0
  231. package/skills/database/fr/graphql.md +181 -0
  232. package/skills/database/graphql.md +179 -0
  233. package/skills/database/nl/graphql.md +181 -0
  234. package/skills/devops-infra/de/docker.md +133 -0
  235. package/skills/devops-infra/de/github-actions.md +179 -0
  236. package/skills/devops-infra/de/kubernetes.md +129 -0
  237. package/skills/devops-infra/de/terraform.md +130 -0
  238. package/skills/devops-infra/docker.md +131 -0
  239. package/skills/devops-infra/es/docker.md +133 -0
  240. package/skills/devops-infra/es/github-actions.md +179 -0
  241. package/skills/devops-infra/es/kubernetes.md +129 -0
  242. package/skills/devops-infra/es/terraform.md +130 -0
  243. package/skills/devops-infra/fr/docker.md +133 -0
  244. package/skills/devops-infra/fr/github-actions.md +179 -0
  245. package/skills/devops-infra/fr/kubernetes.md +129 -0
  246. package/skills/devops-infra/fr/terraform.md +130 -0
  247. package/skills/devops-infra/github-actions.md +177 -0
  248. package/skills/devops-infra/kubernetes.md +127 -0
  249. package/skills/devops-infra/nl/docker.md +133 -0
  250. package/skills/devops-infra/nl/github-actions.md +179 -0
  251. package/skills/devops-infra/nl/kubernetes.md +129 -0
  252. package/skills/devops-infra/nl/terraform.md +130 -0
  253. package/skills/devops-infra/terraform.md +128 -0
  254. package/skills/finance-payments/de/stripe.md +187 -0
  255. package/skills/finance-payments/es/stripe.md +187 -0
  256. package/skills/finance-payments/fr/stripe.md +187 -0
  257. package/skills/finance-payments/nl/stripe.md +187 -0
  258. package/skills/finance-payments/stripe.md +185 -0
  259. package/workflows/code-review.md +151 -0
  260. package/workflows/de/code-review.md +153 -0
  261. package/workflows/de/debugging-session.md +146 -0
  262. package/workflows/de/feature-development.md +155 -0
  263. package/workflows/de/new-project-bootstrap.md +175 -0
  264. package/workflows/de/refactor-safely.md +150 -0
  265. package/workflows/debugging-session.md +144 -0
  266. package/workflows/es/code-review.md +153 -0
  267. package/workflows/es/debugging-session.md +146 -0
  268. package/workflows/es/feature-development.md +155 -0
  269. package/workflows/es/new-project-bootstrap.md +175 -0
  270. package/workflows/es/refactor-safely.md +150 -0
  271. package/workflows/feature-development.md +153 -0
  272. package/workflows/fr/code-review.md +153 -0
  273. package/workflows/fr/debugging-session.md +146 -0
  274. package/workflows/fr/feature-development.md +155 -0
  275. package/workflows/fr/new-project-bootstrap.md +175 -0
  276. package/workflows/fr/refactor-safely.md +150 -0
  277. package/workflows/new-project-bootstrap.md +173 -0
  278. package/workflows/nl/code-review.md +153 -0
  279. package/workflows/nl/debugging-session.md +146 -0
  280. package/workflows/nl/feature-development.md +155 -0
  281. package/workflows/nl/new-project-bootstrap.md +175 -0
  282. package/workflows/nl/refactor-safely.md +150 -0
  283. package/workflows/refactor-safely.md +148 -0
@@ -0,0 +1,250 @@
1
+ > 🇩🇪 Dies ist die deutsche Übersetzung. [Englische Version](../claude-api.md).
2
+
3
+ # Claude API Skill
4
+
5
+ ## Wann aktivieren
6
+ - Code schreiben, der die Anthropic Claude API aufruft (Python oder TypeScript SDK)
7
+ - Prompt Caching, Streaming oder Batch-Verarbeitung implementieren
8
+ - Multi-Turn-Gesprächsverwaltung entwerfen
9
+ - Das richtige Claude-Modell (Haiku, Sonnet, Opus) für eine Aufgabe auswählen
10
+ - Tool Use / Funktionsaufrufe zu einer Claude-Integration hinzufügen
11
+ - Kosten oder Latenz in einer Produktions-Claude-App optimieren
12
+
13
+ ## Wann NICHT verwenden
14
+ - OpenAI oder andere Provider-APIs — anderes SDK, andere Muster
15
+ - Allgemeiner LLM-Rat ohne Bezug zur Anthropic API
16
+ - Projekte, die bereits LangChain- oder LlamaIndex-Abstraktionen verwenden — die Abstraktionsebene direkt ansprechen
17
+
18
+ ## Anweisungen
19
+
20
+ ### Modellauswahl-Leitfaden
21
+ | Modell | Verwenden wenn | Vermeiden wenn |
22
+ |-------|----------|------------|
23
+ | `claude-haiku-4-5-20251001` | Klassifikation, Extraktion, Routing, einfache Q&A, hohes Volumen mit niedrigen Kosten | Komplexes Reasoning, mehrstufige Code-Generierung |
24
+ | `claude-sonnet-4-6` | Allgemein: Code, Analyse, Schreiben, agentische Workflows | Token-beschränkte Budgets in massivem Maßstab |
25
+ | `claude-opus-4-7` | Expertenniveau-Reasoning, differenziertes Urteil, komplexe Langform | Die meisten Aufgaben — Sonnet ist meist ausreichend |
26
+
27
+ ### Einfacher Nachrichtenaufruf (Python)
28
+ ```python
29
+ import anthropic
30
+
31
+ client = anthropic.Anthropic() # liest ANTHROPIC_API_KEY aus der Umgebung
32
+
33
+ message = client.messages.create(
34
+ model="claude-sonnet-4-6",
35
+ max_tokens=1024,
36
+ system="You are a helpful assistant specialized in Python.",
37
+ messages=[
38
+ {"role": "user", "content": "Explain Python's GIL in 3 sentences."}
39
+ ]
40
+ )
41
+ print(message.content[0].text)
42
+ ```
43
+
44
+ ### Prompt Caching (kritisch für Kosten)
45
+ Prompt Caching kann die Kosten bei wiederholtem Kontext um bis zu 90% reduzieren. Stabilen Inhalt cachen (System-Prompts, große Dokumente, Few-Shot-Beispiele).
46
+
47
+ ```python
48
+ message = client.messages.create(
49
+ model="claude-sonnet-4-6",
50
+ max_tokens=1024,
51
+ system=[
52
+ {
53
+ "type": "text",
54
+ "text": "You are a code review assistant. Here are our coding standards: ...",
55
+ "cache_control": {"type": "ephemeral"} # Diesen Block cachen
56
+ }
57
+ ],
58
+ messages=[
59
+ {
60
+ "role": "user",
61
+ "content": [
62
+ {
63
+ "type": "text",
64
+ "text": large_document,
65
+ "cache_control": {"type": "ephemeral"} # Auch das Dokument cachen
66
+ },
67
+ {
68
+ "type": "text",
69
+ "text": "Summarize the key points."
70
+ }
71
+ ]
72
+ }
73
+ ]
74
+ )
75
+ # Cache-Nutzung in der Antwort prüfen
76
+ print(message.usage.cache_read_input_tokens) # Token aus dem Cache gelesen
77
+ print(message.usage.cache_creation_input_tokens) # Token in den Cache geschrieben
78
+ ```
79
+
80
+ Cache-Regeln:
81
+ - Minimaler cachebarer Block: 1024 Token (Sonnet/Opus), 2048 Token (Haiku)
82
+ - Cache-TTL: 5 Minuten
83
+ - Nur der letzte `cache_control`-Block in einem Nachrichten-Array ist relevant — Cache-Punkte sind kumulativ
84
+
85
+ ### Streaming
86
+ ```python
87
+ with client.messages.stream(
88
+ model="claude-sonnet-4-6",
89
+ max_tokens=1024,
90
+ messages=[{"role": "user", "content": prompt}]
91
+ ) as stream:
92
+ for text in stream.text_stream:
93
+ print(text, end="", flush=True)
94
+
95
+ # Oder mit Ereignissen:
96
+ with client.messages.stream(...) as stream:
97
+ for event in stream:
98
+ if event.type == "content_block_delta":
99
+ print(event.delta.text, end="")
100
+ elif event.type == "message_stop":
101
+ print() # Zeilenumbruch wenn fertig
102
+ ```
103
+
104
+ ### Tool Use
105
+ ```python
106
+ tools = [
107
+ {
108
+ "name": "get_weather",
109
+ "description": "Get current weather for a city",
110
+ "input_schema": {
111
+ "type": "object",
112
+ "properties": {
113
+ "city": {"type": "string", "description": "City name"},
114
+ "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
115
+ },
116
+ "required": ["city"]
117
+ }
118
+ }
119
+ ]
120
+
121
+ response = client.messages.create(
122
+ model="claude-sonnet-4-6",
123
+ max_tokens=1024,
124
+ tools=tools,
125
+ messages=[{"role": "user", "content": "What's the weather in Paris?"}]
126
+ )
127
+
128
+ # Prüfen ob Claude ein Tool verwenden möchte
129
+ if response.stop_reason == "tool_use":
130
+ tool_use = next(b for b in response.content if b.type == "tool_use")
131
+ tool_result = call_tool(tool_use.name, tool_use.input)
132
+
133
+ # Gespräch mit Tool-Ergebnis fortsetzen
134
+ follow_up = client.messages.create(
135
+ model="claude-sonnet-4-6",
136
+ max_tokens=1024,
137
+ tools=tools,
138
+ messages=[
139
+ {"role": "user", "content": "What's the weather in Paris?"},
140
+ {"role": "assistant", "content": response.content},
141
+ {
142
+ "role": "user",
143
+ "content": [{
144
+ "type": "tool_result",
145
+ "tool_use_id": tool_use.id,
146
+ "content": json.dumps(tool_result)
147
+ }]
148
+ }
149
+ ]
150
+ )
151
+ ```
152
+
153
+ ### Multi-Turn-Gespräch
154
+ ```python
155
+ class Conversation:
156
+ def __init__(self, system: str, model: str = "claude-sonnet-4-6"):
157
+ self.client = anthropic.Anthropic()
158
+ self.model = model
159
+ self.system = system
160
+ self.messages: list[dict] = []
161
+
162
+ def chat(self, user_message: str, max_tokens: int = 1024) -> str:
163
+ self.messages.append({"role": "user", "content": user_message})
164
+ response = self.client.messages.create(
165
+ model=self.model,
166
+ max_tokens=max_tokens,
167
+ system=self.system,
168
+ messages=self.messages,
169
+ )
170
+ assistant_message = response.content[0].text
171
+ self.messages.append({"role": "assistant", "content": assistant_message})
172
+ return assistant_message
173
+ ```
174
+
175
+ ### Batch-Verarbeitung
176
+ ```python
177
+ from anthropic.types.message_create_params import MessageCreateParamsNonStreaming
178
+ from anthropic.types.messages.batch_create_params import Request
179
+
180
+ requests = [
181
+ Request(
182
+ custom_id=f"review-{i}",
183
+ params=MessageCreateParamsNonStreaming(
184
+ model="claude-haiku-4-5-20251001",
185
+ max_tokens=256,
186
+ messages=[{"role": "user", "content": f"Classify: {review}"}],
187
+ )
188
+ )
189
+ for i, review in enumerate(reviews)
190
+ ]
191
+
192
+ batch = client.messages.batches.create(requests=requests)
193
+ print(f"Batch ID: {batch.id}")
194
+
195
+ # Auf Ergebnisse warten (oder Webhooks verwenden)
196
+ import time
197
+ while True:
198
+ batch = client.messages.batches.retrieve(batch.id)
199
+ if batch.processing_status == "ended":
200
+ break
201
+ time.sleep(60)
202
+
203
+ for result in client.messages.batches.results(batch.id):
204
+ print(result.custom_id, result.result.message.content[0].text)
205
+ ```
206
+
207
+ ### Fehlerbehandlung und Wiederholungen
208
+ ```python
209
+ from anthropic import APIStatusError, APITimeoutError, RateLimitError
210
+
211
+ def call_with_retry(client, **kwargs, max_retries=3):
212
+ for attempt in range(max_retries):
213
+ try:
214
+ return client.messages.create(**kwargs)
215
+ except RateLimitError:
216
+ wait = 2 ** attempt
217
+ time.sleep(wait)
218
+ except APITimeoutError:
219
+ if attempt == max_retries - 1:
220
+ raise
221
+ time.sleep(1)
222
+ except APIStatusError as e:
223
+ if e.status_code >= 500 and attempt < max_retries - 1:
224
+ time.sleep(2 ** attempt)
225
+ else:
226
+ raise
227
+ ```
228
+
229
+ ### Kostenoptimierungs-Checkliste
230
+ - Haiku für Klassifikation, Routing und einfache Extraktionsaufgaben verwenden
231
+ - Prompt Caching für jeden System-Prompt > 1024 Token aktivieren
232
+ - Batch-API für Offline-/Async-Workloads verwenden — 50% Kosteneinsparung
233
+ - `max_tokens` auf das benötigte Minimum setzen — Output-Token werden berechnet
234
+ - Große Dokumente in der Benutzernachricht cachen, nicht nur im System-Prompt
235
+ - Verhältnis `cache_read_input_tokens` zu `input_tokens` überwachen — >80% für stabile Kontexte anstreben
236
+
237
+ ## Beispiel
238
+
239
+ **Benutzer:** Eine Python-Klasse bauen, die Kundensupport-Tickets mit Claude in Kategorien klassifiziert, mit Prompt Caching für die Kategorieliste und Streaming für die Erklärung.
240
+
241
+ **Erwartete Ausgabe:**
242
+ - `TicketClassifier`-Klasse mit `ANTHROPIC_API_KEY` aus der Umgebung
243
+ - System-Prompt mit allen gecachten Kategorien via `cache_control: ephemeral`
244
+ - `classify(ticket_text)` → gibt `{category: str, confidence: str}` aus geparster strukturierter Ausgabe zurück
245
+ - `classify_and_explain(ticket_text)` → streamt die Erklärung zu stdout
246
+ - Verwendet `claude-haiku-4-5-20251001` für Klassifikation (kosteneffizient), `claude-sonnet-4-6` für Erklärung
247
+
248
+ ---
249
+
250
+ > **Mit uns arbeiten:** Claudient wird von [Uitbreiden](https://uitbreiden.com/) unterstützt — wir bauen KI-Produkte und B2B-Lösungen mit Entwickler-Communities. [uitbreiden.com](https://uitbreiden.com/)
@@ -0,0 +1,287 @@
1
+ > 🇪🇸 Esta es la traducción en español. [Versión en inglés](../agent-construction.md).
2
+
3
+ # Skill de Construcción de Agentes
4
+
5
+ ## Cuándo activar
6
+ - Diseñar un sistema multi-agente con Claude (orquestador + subagentes)
7
+ - Construir un agente impulsado por Claude que usa herramientas a lo largo de múltiples turnos
8
+ - Diseñar memoria para un agente de larga duración (en contexto vs. externa)
9
+ - Manejar errores, reintentos y condiciones de parada del agente
10
+ - Implementar transferencias de control entre subagentes especializados
11
+
12
+ ## Cuándo NO usar
13
+ - Llamadas de API a Claude de un solo turno — el skill de Claude API es suficiente
14
+ - Chatbots simples sin uso de herramientas ni toma de decisiones autónoma
15
+ - Abstracciones de LangChain/LlamaIndex — abordar la capa de abstracción directamente
16
+
17
+ ## Instrucciones
18
+
19
+ ### Patrones de arquitectura de agentes
20
+
21
+ **Agente único con herramientas** — una instancia de Claude, múltiples herramientas, bucles hasta completar la tarea:
22
+ ```
23
+ Usuario → Agente → [Herramienta A] → [Herramienta B] → Agente → Usuario
24
+ ```
25
+
26
+ **Orquestador + subagentes** — un padre genera hijos especializados:
27
+ ```
28
+ Usuario → Orquestador → [AgenteInvestigación] → [AgenteEscritura] → Orquestador → Usuario
29
+ ```
30
+
31
+ **Pipeline** — los agentes pasan resultados en secuencia:
32
+ ```
33
+ Usuario → Agente1(clasificar) → Agente2(extraer) → Agente3(generar) → Usuario
34
+ ```
35
+
36
+ Elige la arquitectura más simple que resuelva el problema. Un agente único con herramientas maneja la mayoría de los casos.
37
+
38
+ ### Diseño de herramientas
39
+ ```python
40
+ # Definiciones de herramientas para el bucle del agente multi-turno
41
+ tools = [
42
+ {
43
+ "name": "search_web",
44
+ "description": "Search the web for current information. Use when you need facts not in your training data.",
45
+ "input_schema": {
46
+ "type": "object",
47
+ "properties": {
48
+ "query": {"type": "string", "description": "Search query"}
49
+ },
50
+ "required": ["query"]
51
+ }
52
+ },
53
+ {
54
+ "name": "read_file",
55
+ "description": "Read contents of a file by path.",
56
+ "input_schema": {
57
+ "type": "object",
58
+ "properties": {
59
+ "path": {"type": "string", "description": "Absolute file path"}
60
+ },
61
+ "required": ["path"]
62
+ }
63
+ },
64
+ {
65
+ "name": "write_file",
66
+ "description": "Write content to a file. Creates the file if it doesn't exist.",
67
+ "input_schema": {
68
+ "type": "object",
69
+ "properties": {
70
+ "path": {"type": "string"},
71
+ "content": {"type": "string"}
72
+ },
73
+ "required": ["path", "content"]
74
+ }
75
+ }
76
+ ]
77
+ ```
78
+
79
+ Reglas de diseño de herramientas:
80
+ - La descripción debe decirle a Claude CUÁNDO usarla, no solo qué hace
81
+ - Mantén `input_schema` mínimo — solo campos requeridos, sin ruido opcional
82
+ - Devuelve datos estructurados (JSON), no prosa, para que Claude pueda usarlos de forma fiable
83
+ - Una herramienta por acción — no combines lectura+escritura en una sola herramienta
84
+
85
+ ### Bucle del agente
86
+ ```python
87
+ import anthropic
88
+ import json
89
+
90
+ client = anthropic.Anthropic()
91
+
92
+ def run_agent(task: str, max_iterations: int = 20) -> str:
93
+ messages = [{"role": "user", "content": task}]
94
+
95
+ for iteration in range(max_iterations):
96
+ response = client.messages.create(
97
+ model="claude-sonnet-4-6",
98
+ max_tokens=4096,
99
+ system=AGENT_SYSTEM_PROMPT,
100
+ tools=tools,
101
+ messages=messages,
102
+ )
103
+
104
+ # Agregar la respuesta del asistente
105
+ messages.append({"role": "assistant", "content": response.content})
106
+
107
+ if response.stop_reason == "end_turn":
108
+ # Extraer la respuesta de texto final
109
+ return next(b.text for b in response.content if hasattr(b, "text"))
110
+
111
+ if response.stop_reason == "tool_use":
112
+ # Ejecutar todas las llamadas a herramientas en esta respuesta
113
+ tool_results = []
114
+ for block in response.content:
115
+ if block.type == "tool_use":
116
+ result = execute_tool(block.name, block.input)
117
+ tool_results.append({
118
+ "type": "tool_result",
119
+ "tool_use_id": block.id,
120
+ "content": json.dumps(result) if not isinstance(result, str) else result
121
+ })
122
+
123
+ messages.append({"role": "user", "content": tool_results})
124
+ else:
125
+ # Razón de parada inesperada
126
+ break
127
+
128
+ raise RuntimeError(f"Agent exceeded {max_iterations} iterations without completing")
129
+
130
+
131
+ def execute_tool(name: str, inputs: dict) -> any:
132
+ match name:
133
+ case "search_web":
134
+ return search(inputs["query"])
135
+ case "read_file":
136
+ return Path(inputs["path"]).read_text()
137
+ case "write_file":
138
+ Path(inputs["path"]).write_text(inputs["content"])
139
+ return {"success": True, "path": inputs["path"]}
140
+ case _:
141
+ return {"error": f"Unknown tool: {name}"}
142
+ ```
143
+
144
+ ### Prompt de sistema para agentes
145
+ ```
146
+ AGENT_SYSTEM_PROMPT = """You are an autonomous agent completing tasks step by step.
147
+
148
+ Approach:
149
+ 1. Analyze the task before acting
150
+ 2. Use the minimum tools necessary
151
+ 3. Check your work before declaring done
152
+ 4. If a tool returns an error, diagnose and retry once — if it fails again, report the error
153
+
154
+ Stopping conditions — declare "DONE: <result>" when:
155
+ - The task is fully complete
156
+ - You've hit an unrecoverable error after retrying
157
+ - You've been asked to do something harmful or impossible
158
+
159
+ Never loop more than 3 times on the same tool call with the same inputs.
160
+ """
161
+ ```
162
+
163
+ ### Patrones de memoria
164
+
165
+ **Memoria en contexto** (array de mensajes) — para sesión única, estado pequeño:
166
+ ```python
167
+ # Resumir cuando el contexto crece
168
+ if count_tokens(messages) > 150_000:
169
+ summary = summarize_messages(messages[:-5]) # mantener los últimos 5 turnos
170
+ messages = [
171
+ {"role": "user", "content": f"[Previous context summary]\n{summary}"},
172
+ {"role": "assistant", "content": "Understood. Continuing from where we left off."},
173
+ *messages[-5:]
174
+ ]
175
+ ```
176
+
177
+ **Memoria externa** (para agentes multi-sesión):
178
+ ```python
179
+ # Memoria simple basada en archivos
180
+ class AgentMemory:
181
+ def __init__(self, path: str):
182
+ self.path = Path(path)
183
+ self.data = json.loads(self.path.read_text()) if self.path.exists() else {}
184
+
185
+ def remember(self, key: str, value: any):
186
+ self.data[key] = {"value": value, "timestamp": datetime.utcnow().isoformat()}
187
+ self.path.write_text(json.dumps(self.data, indent=2))
188
+
189
+ def recall(self, key: str) -> any:
190
+ entry = self.data.get(key)
191
+ return entry["value"] if entry else None
192
+
193
+ def as_context(self) -> str:
194
+ if not self.data:
195
+ return ""
196
+ lines = [f"- {k}: {v['value']}" for k, v in self.data.items()]
197
+ return "Known context:\n" + "\n".join(lines)
198
+ ```
199
+
200
+ ### Patrón de orquestador
201
+ ```python
202
+ def orchestrate(task: str) -> str:
203
+ # Paso 1: El agente de planificación descompone la tarea
204
+ plan = run_subagent(
205
+ model="claude-sonnet-4-6",
206
+ system="You are a planner. Decompose tasks into numbered steps.",
207
+ task=f"Decompose this task into steps: {task}",
208
+ tools=[] # No se necesitan herramientas para planificar
209
+ )
210
+
211
+ # Paso 2: Ejecutar cada paso con agentes especializados
212
+ results = []
213
+ for step in parse_steps(plan):
214
+ agent_type = classify_step(step) # "research" | "code" | "write"
215
+ result = run_subagent(
216
+ model=agent_model(agent_type),
217
+ system=agent_system_prompt(agent_type),
218
+ task=step,
219
+ tools=agent_tools(agent_type),
220
+ context="\n".join(results) # Dar contexto de pasos anteriores
221
+ )
222
+ results.append(f"Step result: {result}")
223
+
224
+ # Paso 3: El agente de síntesis combina los resultados
225
+ return run_subagent(
226
+ model="claude-sonnet-4-6",
227
+ system="You are a synthesizer. Combine step results into a final answer.",
228
+ task=f"Original task: {task}\n\nStep results:\n" + "\n".join(results),
229
+ tools=[]
230
+ )
231
+ ```
232
+
233
+ ### Manejo de errores y condiciones de parada
234
+ ```python
235
+ class AgentError(Exception):
236
+ pass
237
+
238
+ class MaxIterationsError(AgentError):
239
+ pass
240
+
241
+ class ToolFailureError(AgentError):
242
+ pass
243
+
244
+ def execute_tool_safe(name: str, inputs: dict, consecutive_failures: dict) -> dict:
245
+ try:
246
+ result = execute_tool(name, inputs)
247
+ consecutive_failures[name] = 0
248
+ return {"success": True, "result": result}
249
+ except Exception as e:
250
+ consecutive_failures[name] = consecutive_failures.get(name, 0) + 1
251
+ if consecutive_failures[name] >= 3:
252
+ raise ToolFailureError(f"Tool {name} failed 3 consecutive times: {e}")
253
+ return {"success": False, "error": str(e), "retry": True}
254
+ ```
255
+
256
+ ### Patrón de transferencia de control
257
+ ```python
258
+ # El agente padre pasa el contexto explícitamente — los subagentes no tienen memoria de sesión
259
+ def handoff_to_specialist(context: dict, task: str, specialist: str) -> str:
260
+ handoff_prompt = f"""
261
+ Context from orchestrator:
262
+ {json.dumps(context, indent=2)}
263
+
264
+ Your task:
265
+ {task}
266
+ """
267
+ return run_subagent(
268
+ system=SPECIALIST_PROMPTS[specialist],
269
+ task=handoff_prompt,
270
+ tools=SPECIALIST_TOOLS[specialist]
271
+ )
272
+ ```
273
+
274
+ ## Ejemplo
275
+
276
+ **Usuario:** Construir un agente de investigación que toma un tema, busca 3 fuentes en la web, lee cada URL y escribe un resumen de 500 palabras con citas en un archivo.
277
+
278
+ **Salida esperada:**
279
+ - Lista de `tools`: `search_web`, `fetch_url`, `write_file`
280
+ - Prompt de sistema: instruye al agente a buscar → obtener 3 URLs → sintetizar → escribir archivo antes de declarar terminado
281
+ - Bucle `run_agent(task)` con `max_iterations=15`
282
+ - Manejo de errores: si `fetch_url` falla, intentar con el siguiente resultado de búsqueda
283
+ - Salida final: ruta al archivo de resumen escrito
284
+
285
+ ---
286
+
287
+ > **Trabaja con nosotros:** Claudient está respaldado por [Uitbreiden](https://uitbreiden.com/) — construimos productos de IA y soluciones B2B con comunidades de desarrolladores. [uitbreiden.com](https://uitbreiden.com/)