@intentsolutionsio/ai-sdk-agents 1.0.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.
- package/.claude-plugin/plugin.json +27 -0
- package/LICENSE +21 -0
- package/README.md +951 -0
- package/agents/multi-agent-orchestrator.md +363 -0
- package/commands/ai-agent-create.md +501 -0
- package/commands/ai-agents-setup.md +429 -0
- package/commands/ai-agents-test.md +529 -0
- package/package.json +49 -0
- package/skills/orchestrating-multi-agent-systems/SKILL.md +81 -0
- package/skills/orchestrating-multi-agent-systems/assets/README.md +7 -0
- package/skills/orchestrating-multi-agent-systems/assets/agent_template.ts +110 -0
- package/skills/orchestrating-multi-agent-systems/assets/example_coordinator.ts +100 -0
- package/skills/orchestrating-multi-agent-systems/assets/example_workflow.json +143 -0
- package/skills/orchestrating-multi-agent-systems/references/README.md +4 -0
- package/skills/orchestrating-multi-agent-systems/references/errors.md +26 -0
- package/skills/orchestrating-multi-agent-systems/references/examples.md +418 -0
- package/skills/orchestrating-multi-agent-systems/references/implementation.md +39 -0
- package/skills/orchestrating-multi-agent-systems/scripts/README.md +11 -0
- package/skills/orchestrating-multi-agent-systems/scripts/agent_setup.sh +94 -0
- package/skills/orchestrating-multi-agent-systems/scripts/dependency_installer.sh +100 -0
- package/skills/orchestrating-multi-agent-systems/scripts/env_setup.sh +94 -0
package/README.md
ADDED
|
@@ -0,0 +1,951 @@
|
|
|
1
|
+
# AI SDK Agents Plugin
|
|
2
|
+
|
|
3
|
+
**Multi-agent orchestration with AI SDK v5 - handoffs, routing, and coordination for any AI provider.**
|
|
4
|
+
|
|
5
|
+
Build sophisticated multi-agent systems with automatic handoffs, intelligent routing, and seamless coordination across **Ollama (FREE)**, OpenAI, Anthropic, Google, and other AI providers.
|
|
6
|
+
|
|
7
|
+
💰 **NEW**: Use Ollama for zero-cost local AI agents - eliminate $30-200/month in API fees!
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 🎯 What This Plugin Does
|
|
12
|
+
|
|
13
|
+
Transform complex workflows into multi-agent systems where specialized agents:
|
|
14
|
+
- **Hand off tasks** to each other automatically
|
|
15
|
+
- **Route requests** to the best-suited agent
|
|
16
|
+
- **Coordinate** complex workflows across multiple LLMs
|
|
17
|
+
- **Specialize** in specific domains or tasks
|
|
18
|
+
- **Work together** to solve problems beyond single-agent capabilities
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 🚀 Quick Start
|
|
23
|
+
|
|
24
|
+
### Installation
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# Install the plugin
|
|
28
|
+
/plugin install ai-sdk-agents@claude-code-plugins-plus
|
|
29
|
+
|
|
30
|
+
# Install dependencies in your project
|
|
31
|
+
npm install @ai-sdk-tools/agents ai zod
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Your First Multi-Agent System
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
/ai-agents-setup
|
|
38
|
+
|
|
39
|
+
# Creates:
|
|
40
|
+
# - agents/
|
|
41
|
+
# ├── coordinator.ts # Routes requests
|
|
42
|
+
# ├── researcher.ts # Gathers information
|
|
43
|
+
# ├── coder.ts # Writes code
|
|
44
|
+
# └── reviewer.ts # Reviews output
|
|
45
|
+
# - index.ts # Orchestration setup
|
|
46
|
+
# - .env.example # API keys template
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## ⚠️ Rate Limits & LLM Provider Constraints
|
|
52
|
+
|
|
53
|
+
**Multi-agent systems multiply API costs** - 5 agents × $0.03/request = $0.15 per workflow. Use Ollama (FREE) to eliminate costs entirely.
|
|
54
|
+
|
|
55
|
+
### Quick Comparison: Paid APIs vs Ollama (FREE)
|
|
56
|
+
|
|
57
|
+
| Provider | 5-Agent Workflow Cost | Monthly (1K workflows) | Annual |
|
|
58
|
+
|----------|----------------------|----------------------|---------|
|
|
59
|
+
| **OpenAI GPT-4** | $0.15-0.30 | $150-300 | **$1,800-3,600** |
|
|
60
|
+
| **Anthropic Claude** | $0.08-0.15 | $80-150 | **$960-1,800** |
|
|
61
|
+
| **Google Gemini** | $0.03-0.10 | $30-100 | **$360-1,200** |
|
|
62
|
+
| **Ollama (Local)** | $0.00 | $0 | **$0** ✅ |
|
|
63
|
+
|
|
64
|
+
**Annual Savings: $360-3,600** by using Ollama for multi-agent orchestration.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
### Rate Limits by Provider
|
|
69
|
+
|
|
70
|
+
#### OpenAI (Paid)
|
|
71
|
+
- **GPT-4:** 10,000 requests/day (Tier 1), 500 RPM
|
|
72
|
+
- **GPT-4 Turbo:** 30,000 requests/day (Tier 2), 3,000 RPM
|
|
73
|
+
- **Registration:** ✅ Email + payment required
|
|
74
|
+
- **Cost:** $30-60/1M tokens
|
|
75
|
+
|
|
76
|
+
**Multi-Agent Impact:** 5 agents × 500 RPM limit = effective 100 RPM per agent
|
|
77
|
+
|
|
78
|
+
#### Anthropic (Paid)
|
|
79
|
+
- **Claude Sonnet:** 50,000 requests/day (Tier 1), 1,000 RPM
|
|
80
|
+
- **Claude Opus:** 50,000 requests/day (Tier 1), 1,000 RPM
|
|
81
|
+
- **Registration:** ✅ Email + payment required
|
|
82
|
+
- **Cost:** $15-75/1M tokens
|
|
83
|
+
|
|
84
|
+
**Multi-Agent Impact:** 5 agents × 1,000 RPM limit = effective 200 RPM per agent
|
|
85
|
+
|
|
86
|
+
#### Google Gemini (Paid/Free Tier)
|
|
87
|
+
- **Gemini 1.5 Flash (Free):** 15 RPM, 1M tokens/day
|
|
88
|
+
- **Gemini 1.5 Pro (Free):** 2 RPM, 32K tokens/day
|
|
89
|
+
- **Gemini (Paid):** 1,000 RPM, unlimited tokens
|
|
90
|
+
- **Registration:** ✅ Google account required
|
|
91
|
+
- **Cost:** Free tier available, $0.35-1.05/1M tokens (paid)
|
|
92
|
+
|
|
93
|
+
**Multi-Agent Impact:** Free tier 15 RPM = 3 RPM per agent (5 agents) → Very restrictive
|
|
94
|
+
|
|
95
|
+
#### Ollama (FREE - Self-Hosted)
|
|
96
|
+
- **Requests:** ∞ Unlimited (hardware-limited only)
|
|
97
|
+
- **Models:** Llama 3.2, Mistral, CodeLlama, etc.
|
|
98
|
+
- **Registration:** ❌ Not required
|
|
99
|
+
- **Cost:** $0 (one-time hardware: $0-600)
|
|
100
|
+
|
|
101
|
+
**Multi-Agent Impact:** No API limits! Only limited by CPU/RAM. See [ollama-local-ai plugin](../ollama-local-ai/) for full hardware constraints documentation.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
### Multi-Agent Coordination Strategies
|
|
106
|
+
|
|
107
|
+
#### Strategy 1: Shared Ollama Instance (RECOMMENDED - FREE)
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
// All agents share one local Ollama instance
|
|
111
|
+
import { ollama } from 'ollama-ai-provider';
|
|
112
|
+
|
|
113
|
+
const agents = {
|
|
114
|
+
coordinator: createAgent({
|
|
115
|
+
model: ollama('llama3.2'), // FREE
|
|
116
|
+
name: 'coordinator'
|
|
117
|
+
}),
|
|
118
|
+
researcher: createAgent({
|
|
119
|
+
model: ollama('llama3.2'), // FREE
|
|
120
|
+
name: 'researcher'
|
|
121
|
+
}),
|
|
122
|
+
coder: createAgent({
|
|
123
|
+
model: ollama('codellama'), // FREE
|
|
124
|
+
name: 'coder'
|
|
125
|
+
}),
|
|
126
|
+
reviewer: createAgent({
|
|
127
|
+
model: ollama('llama3.2'), // FREE
|
|
128
|
+
name: 'reviewer'
|
|
129
|
+
})
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// 5 agents, 1,000 workflows/month = $0 cost
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Hardware Requirements:**
|
|
136
|
+
- **4 agents × Llama 3.2 7B:** 32GB RAM minimum
|
|
137
|
+
- **Concurrent requests:** Limited by CPU cores
|
|
138
|
+
- **See:** [ollama-local-ai plugin](../ollama-local-ai/README.md#multi-agent-rate-limit-strategies) for detailed hardware sizing
|
|
139
|
+
|
|
140
|
+
**Annual Cost:** $0 (vs $360-3,600 for cloud APIs)
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
#### Strategy 2: Hybrid (Free for Development, Paid for Production)
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
const MODEL_CONFIG = {
|
|
148
|
+
development: {
|
|
149
|
+
coordinator: ollama('llama3.2'), // FREE
|
|
150
|
+
researcher: ollama('llama3.2'), // FREE
|
|
151
|
+
coder: ollama('codellama'), // FREE
|
|
152
|
+
reviewer: ollama('llama3.2') // FREE
|
|
153
|
+
},
|
|
154
|
+
production: {
|
|
155
|
+
coordinator: anthropic('claude-sonnet'), // $15/1M tokens
|
|
156
|
+
researcher: anthropic('claude-sonnet'), // $15/1M tokens
|
|
157
|
+
coder: anthropic('claude-sonnet'), // $15/1M tokens
|
|
158
|
+
reviewer: anthropic('claude-sonnet') // $15/1M tokens
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
const models = MODEL_CONFIG[process.env.NODE_ENV || 'development'];
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**Cost Reduction:** $3,600/year → $300/year (92% savings) by using Ollama for dev/testing
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
#### Strategy 3: Rate Limit Coordinator (Paid APIs)
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
// Centralized rate limiter for paid APIs
|
|
173
|
+
class MultiAgentRateLimiter {
|
|
174
|
+
private requestsThisMinute = 0;
|
|
175
|
+
private lastReset = Date.now();
|
|
176
|
+
private readonly RPM_LIMIT = 1000; // Anthropic limit
|
|
177
|
+
private readonly AGENTS_COUNT = 5;
|
|
178
|
+
private readonly PER_AGENT_LIMIT = this.RPM_LIMIT / this.AGENTS_COUNT; // 200 RPM per agent
|
|
179
|
+
|
|
180
|
+
async executeAgentTask(agentName: string, task: () => Promise<any>) {
|
|
181
|
+
// Reset counter every minute
|
|
182
|
+
if (Date.now() - this.lastReset > 60000) {
|
|
183
|
+
this.requestsThisMinute = 0;
|
|
184
|
+
this.lastReset = Date.now();
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Wait if at limit
|
|
188
|
+
while (this.requestsThisMinute >= this.RPM_LIMIT) {
|
|
189
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
190
|
+
if (Date.now() - this.lastReset > 60000) {
|
|
191
|
+
this.requestsThisMinute = 0;
|
|
192
|
+
this.lastReset = Date.now();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
this.requestsThisMinute++;
|
|
197
|
+
return await task();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// All agents share the rate limiter
|
|
202
|
+
const rateLimiter = new MultiAgentRateLimiter();
|
|
203
|
+
|
|
204
|
+
// Agent execution
|
|
205
|
+
await rateLimiter.executeAgentTask('coordinator', async () => {
|
|
206
|
+
return await coordinatorAgent.execute(task);
|
|
207
|
+
});
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**Result:** Prevents 429 rate limit errors when running 5 agents concurrently
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
### When to Use Paid APIs vs Ollama
|
|
215
|
+
|
|
216
|
+
**Use Ollama (FREE) when:**
|
|
217
|
+
- ✅ Development and testing multi-agent systems
|
|
218
|
+
- ✅ Running 1,000+ workflows/month (saves $360-3,600/year)
|
|
219
|
+
- ✅ Data privacy is critical (stays on your infrastructure)
|
|
220
|
+
- ✅ You have hardware (32GB+ RAM for 4-5 agents)
|
|
221
|
+
- ✅ Latency <2sec acceptable (not real-time)
|
|
222
|
+
|
|
223
|
+
**Use Paid APIs when:**
|
|
224
|
+
- ❌ Need <500ms latency for production
|
|
225
|
+
- ❌ Managing 10+ agents (hardware becomes expensive)
|
|
226
|
+
- ❌ Require enterprise SLA/support
|
|
227
|
+
- ❌ Can't manage local infrastructure
|
|
228
|
+
|
|
229
|
+
**For 80% of multi-agent use cases:** Ollama is sufficient and free.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
### Resources
|
|
234
|
+
|
|
235
|
+
- **Ollama Setup:** See [ollama-local-ai plugin](../ollama-local-ai/) for complete installation and hardware sizing guide
|
|
236
|
+
- **OpenAI Rate Limits:** [platform.openai.com/docs/guides/rate-limits](https://platform.openai.com/docs/guides/rate-limits)
|
|
237
|
+
- **Anthropic Rate Limits:** [docs.anthropic.com/en/api/rate-limits](https://docs.anthropic.com/en/api/rate-limits)
|
|
238
|
+
- **Google Gemini Limits:** [ai.google.dev/pricing](https://ai.google.dev/pricing)
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## 💡 Core Concepts
|
|
243
|
+
|
|
244
|
+
### Agent Handoffs
|
|
245
|
+
|
|
246
|
+
**Problem**: Single agent trying to do everything poorly
|
|
247
|
+
**Solution**: Specialized agents handing off to experts
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
// Agent A realizes it needs help
|
|
251
|
+
await handoff({
|
|
252
|
+
to: "code-expert",
|
|
253
|
+
reason: "User needs implementation details",
|
|
254
|
+
context: { requirement: "Build REST API" }
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
// Code expert takes over, provides implementation
|
|
258
|
+
// Returns to original agent
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Intelligent Routing
|
|
262
|
+
|
|
263
|
+
**Problem**: Don't know which agent should handle the request
|
|
264
|
+
**Solution**: Coordinator agent analyzes and routes automatically
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
const coordinator = createAgent({
|
|
268
|
+
name: "coordinator",
|
|
269
|
+
routes: [
|
|
270
|
+
{ to: "researcher", when: "needs information gathering" },
|
|
271
|
+
{ to: "coder", when: "needs code implementation" },
|
|
272
|
+
{ to: "reviewer", when: "needs quality check" }
|
|
273
|
+
]
|
|
274
|
+
});
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### Agent Coordination
|
|
278
|
+
|
|
279
|
+
**Problem**: Multiple agents need to work together on complex tasks
|
|
280
|
+
**Solution**: Orchestrated workflow with automatic context passing
|
|
281
|
+
|
|
282
|
+
```typescript
|
|
283
|
+
// Workflow: Research → Code → Review → Deploy
|
|
284
|
+
const result = await orchestrate([
|
|
285
|
+
{ agent: "researcher", task: "Find best practices" },
|
|
286
|
+
{ agent: "coder", task: "Implement solution" },
|
|
287
|
+
{ agent: "reviewer", task: "Review code" },
|
|
288
|
+
{ agent: "deployer", task: "Deploy to production" }
|
|
289
|
+
]);
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## 🛠 Use Cases
|
|
295
|
+
|
|
296
|
+
### 1. Code Generation Pipeline
|
|
297
|
+
|
|
298
|
+
**Agents**:
|
|
299
|
+
- **Architect**: Designs system structure
|
|
300
|
+
- **Coder**: Implements features
|
|
301
|
+
- **Tester**: Writes tests
|
|
302
|
+
- **Reviewer**: Reviews quality
|
|
303
|
+
- **Documenter**: Writes docs
|
|
304
|
+
|
|
305
|
+
**Flow**:
|
|
306
|
+
```
|
|
307
|
+
User Request → Architect (design) → Coder (implement)
|
|
308
|
+
→ Tester (test) → Reviewer (review)
|
|
309
|
+
→ Documenter (docs) → Return to user
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**Value**: Complete, tested, documented code from a single request.
|
|
313
|
+
|
|
314
|
+
### 2. Research & Analysis
|
|
315
|
+
|
|
316
|
+
**Agents**:
|
|
317
|
+
- **Searcher**: Finds information
|
|
318
|
+
- **Analyzer**: Analyzes data
|
|
319
|
+
- **Synthesizer**: Combines insights
|
|
320
|
+
- **Reporter**: Creates reports
|
|
321
|
+
|
|
322
|
+
**Flow**:
|
|
323
|
+
```
|
|
324
|
+
Question → Searcher (gather sources) → Analyzer (extract insights)
|
|
325
|
+
→ Synthesizer (combine) → Reporter (format) → Answer
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**Value**: Comprehensive research with citations and analysis.
|
|
329
|
+
|
|
330
|
+
### 3. Content Creation
|
|
331
|
+
|
|
332
|
+
**Agents**:
|
|
333
|
+
- **Researcher**: Gathers information
|
|
334
|
+
- **Writer**: Writes content
|
|
335
|
+
- **Editor**: Edits for quality
|
|
336
|
+
- **SEO**: Optimizes for search
|
|
337
|
+
- **Publisher**: Formats and publishes
|
|
338
|
+
|
|
339
|
+
**Flow**:
|
|
340
|
+
```
|
|
341
|
+
Topic → Researcher → Writer → Editor → SEO → Publisher → Published Content
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
**Value**: High-quality, SEO-optimized content at scale.
|
|
345
|
+
|
|
346
|
+
### 4. Customer Support
|
|
347
|
+
|
|
348
|
+
**Agents**:
|
|
349
|
+
- **Triager**: Categorizes issues
|
|
350
|
+
- **FAQ Bot**: Handles common questions
|
|
351
|
+
- **Technical**: Solves technical issues
|
|
352
|
+
- **Escalator**: Escalates to humans when needed
|
|
353
|
+
|
|
354
|
+
**Flow**:
|
|
355
|
+
```
|
|
356
|
+
Customer Query → Triager → Route to (FAQ Bot | Technical | Escalator)
|
|
357
|
+
→ Resolve or escalate
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
**Value**: Efficient support with appropriate routing.
|
|
361
|
+
|
|
362
|
+
### 5. DevOps Automation
|
|
363
|
+
|
|
364
|
+
**Agents**:
|
|
365
|
+
- **Monitor**: Watches system health
|
|
366
|
+
- **Diagnoser**: Diagnoses issues
|
|
367
|
+
- **Fixer**: Attempts automated fixes
|
|
368
|
+
- **Notifier**: Alerts humans when needed
|
|
369
|
+
|
|
370
|
+
**Flow**:
|
|
371
|
+
```
|
|
372
|
+
Alert → Monitor (analyze) → Diagnoser (identify cause)
|
|
373
|
+
→ Fixer (attempt fix) → Success OR Notifier (escalate)
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
**Value**: Self-healing systems with human oversight.
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## 📚 Commands
|
|
381
|
+
|
|
382
|
+
### `/ai-agents-setup`
|
|
383
|
+
|
|
384
|
+
**Purpose**: Initialize multi-agent project structure
|
|
385
|
+
|
|
386
|
+
**Creates**:
|
|
387
|
+
```
|
|
388
|
+
project/
|
|
389
|
+
├── agents/
|
|
390
|
+
│ ├── coordinator.ts
|
|
391
|
+
│ ├── researcher.ts
|
|
392
|
+
│ ├── coder.ts
|
|
393
|
+
│ └── reviewer.ts
|
|
394
|
+
├── index.ts
|
|
395
|
+
├── package.json
|
|
396
|
+
└── .env.example
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
**Usage**:
|
|
400
|
+
```bash
|
|
401
|
+
/ai-agents-setup
|
|
402
|
+
|
|
403
|
+
# Optional: Specify template
|
|
404
|
+
/ai-agents-setup --template code-pipeline
|
|
405
|
+
/ai-agents-setup --template research
|
|
406
|
+
/ai-agents-setup --template support
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### `/ai-agent-create`
|
|
410
|
+
|
|
411
|
+
**Purpose**: Create a new specialized agent
|
|
412
|
+
|
|
413
|
+
**Usage**:
|
|
414
|
+
```bash
|
|
415
|
+
/ai-agent-create [name] [specialization]
|
|
416
|
+
|
|
417
|
+
# Examples
|
|
418
|
+
/ai-agent-create security-auditor "security vulnerability analysis"
|
|
419
|
+
/ai-agent-create api-designer "RESTful API design"
|
|
420
|
+
/ai-agent-create data-analyst "data analysis and visualization"
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
**Generates**:
|
|
424
|
+
```typescript
|
|
425
|
+
// agents/security-auditor.ts
|
|
426
|
+
import { createAgent } from '@ai-sdk-tools/agents';
|
|
427
|
+
import { anthropic } from '@ai-sdk/anthropic';
|
|
428
|
+
|
|
429
|
+
export const securityAuditor = createAgent({
|
|
430
|
+
name: 'security-auditor',
|
|
431
|
+
model: anthropic('claude-3-5-sonnet-20241022'),
|
|
432
|
+
system: `You are a security vulnerability analysis expert...`,
|
|
433
|
+
|
|
434
|
+
tools: {
|
|
435
|
+
scanCode: /* ... */,
|
|
436
|
+
checkDependencies: /* ... */
|
|
437
|
+
},
|
|
438
|
+
|
|
439
|
+
handoffTo: ['remediation-agent']
|
|
440
|
+
});
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### `/ai-agents-test`
|
|
444
|
+
|
|
445
|
+
**Purpose**: Test your multi-agent system
|
|
446
|
+
|
|
447
|
+
**Usage**:
|
|
448
|
+
```bash
|
|
449
|
+
/ai-agents-test "User query to test"
|
|
450
|
+
|
|
451
|
+
# Example
|
|
452
|
+
/ai-agents-test "Build a REST API with authentication"
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
**Output**:
|
|
456
|
+
```
|
|
457
|
+
Testing multi-agent system...
|
|
458
|
+
|
|
459
|
+
Step 1: Coordinator received request
|
|
460
|
+
→ Routing to: architect
|
|
461
|
+
|
|
462
|
+
Step 2: Architect designing system
|
|
463
|
+
→ Design complete, handing off to: coder
|
|
464
|
+
|
|
465
|
+
Step 3: Coder implementing
|
|
466
|
+
→ Implementation complete, handing off to: tester
|
|
467
|
+
|
|
468
|
+
Step 4: Tester writing tests
|
|
469
|
+
→ Tests complete, handing off to: reviewer
|
|
470
|
+
|
|
471
|
+
Step 5: Reviewer checking quality
|
|
472
|
+
→ Review complete, all checks passed
|
|
473
|
+
|
|
474
|
+
Final Result:
|
|
475
|
+
✅ REST API with authentication
|
|
476
|
+
✅ Tests (95% coverage)
|
|
477
|
+
✅ Documentation
|
|
478
|
+
✅ Security review passed
|
|
479
|
+
|
|
480
|
+
Total time: 47 seconds
|
|
481
|
+
Agents involved: 5 (coordinator, architect, coder, tester, reviewer)
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
---
|
|
485
|
+
|
|
486
|
+
## 🤖 Available Agents
|
|
487
|
+
|
|
488
|
+
### Multi-Agent Orchestrator
|
|
489
|
+
|
|
490
|
+
**Purpose**: Coordinate complex multi-agent workflows
|
|
491
|
+
|
|
492
|
+
**Specialization**:
|
|
493
|
+
- Analyze incoming requests
|
|
494
|
+
- Route to appropriate specialized agent
|
|
495
|
+
- Manage handoffs between agents
|
|
496
|
+
- Aggregate results
|
|
497
|
+
- Return cohesive final output
|
|
498
|
+
|
|
499
|
+
**When to use**: Any complex request requiring multiple agent types
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
## 🎓 Examples
|
|
504
|
+
|
|
505
|
+
### Example 1: Code Generation Pipeline
|
|
506
|
+
|
|
507
|
+
```typescript
|
|
508
|
+
import { createAgent, orchestrate } from '@ai-sdk-tools/agents';
|
|
509
|
+
import { anthropic } from '@ai-sdk/anthropic';
|
|
510
|
+
|
|
511
|
+
// Define specialized agents
|
|
512
|
+
const architect = createAgent({
|
|
513
|
+
name: 'architect',
|
|
514
|
+
model: anthropic('claude-3-5-sonnet-20241022'),
|
|
515
|
+
system: 'Design system architecture and technical specifications',
|
|
516
|
+
handoffTo: ['coder']
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
const coder = createAgent({
|
|
520
|
+
name: 'coder',
|
|
521
|
+
model: anthropic('claude-3-5-sonnet-20241022'),
|
|
522
|
+
system: 'Implement code following architectural designs',
|
|
523
|
+
handoffTo: ['tester']
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
const tester = createAgent({
|
|
527
|
+
name: 'tester',
|
|
528
|
+
model: anthropic('claude-3-5-sonnet-20241022'),
|
|
529
|
+
system: 'Write comprehensive tests for implementations',
|
|
530
|
+
handoffTo: ['reviewer']
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
const reviewer = createAgent({
|
|
534
|
+
name: 'reviewer',
|
|
535
|
+
model: anthropic('claude-3-5-sonnet-20241022'),
|
|
536
|
+
system: 'Review code quality, security, and best practices'
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
// Orchestrate workflow
|
|
540
|
+
const result = await orchestrate({
|
|
541
|
+
agents: [architect, coder, tester, reviewer],
|
|
542
|
+
task: 'Build a REST API with authentication and authorization',
|
|
543
|
+
coordinator: architect // Architect decides handoffs
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
console.log(result);
|
|
547
|
+
// Output: Complete, tested, reviewed API implementation
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
### Example 2: Research Pipeline
|
|
551
|
+
|
|
552
|
+
```typescript
|
|
553
|
+
const researcher = createAgent({
|
|
554
|
+
name: 'researcher',
|
|
555
|
+
system: 'Gather information from multiple sources',
|
|
556
|
+
tools: {
|
|
557
|
+
search: /* web search tool */,
|
|
558
|
+
readDocs: /* documentation reader */
|
|
559
|
+
},
|
|
560
|
+
handoffTo: ['analyzer']
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
const analyzer = createAgent({
|
|
564
|
+
name: 'analyzer',
|
|
565
|
+
system: 'Analyze gathered information and extract insights',
|
|
566
|
+
handoffTo: ['writer']
|
|
567
|
+
});
|
|
568
|
+
|
|
569
|
+
const writer = createAgent({
|
|
570
|
+
name: 'writer',
|
|
571
|
+
system: 'Write comprehensive reports with citations'
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
// Execute research
|
|
575
|
+
const report = await orchestrate({
|
|
576
|
+
agents: [researcher, analyzer, writer],
|
|
577
|
+
task: 'Research the impact of AI on software development in 2024',
|
|
578
|
+
coordinator: researcher
|
|
579
|
+
});
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
### Example 3: Customer Support Routing
|
|
583
|
+
|
|
584
|
+
```typescript
|
|
585
|
+
const triager = createAgent({
|
|
586
|
+
name: 'triager',
|
|
587
|
+
system: 'Categorize customer issues and route to appropriate agent',
|
|
588
|
+
routes: [
|
|
589
|
+
{ to: 'faq-bot', when: 'question matches FAQ' },
|
|
590
|
+
{ to: 'technical-support', when: 'technical issue' },
|
|
591
|
+
{ to: 'billing-support', when: 'billing question' },
|
|
592
|
+
{ to: 'human-escalation', when: 'complex or urgent' }
|
|
593
|
+
]
|
|
594
|
+
});
|
|
595
|
+
|
|
596
|
+
const faqBot = createAgent({
|
|
597
|
+
name: 'faq-bot',
|
|
598
|
+
system: 'Answer frequently asked questions',
|
|
599
|
+
tools: {
|
|
600
|
+
searchFAQ: /* FAQ database */
|
|
601
|
+
}
|
|
602
|
+
});
|
|
603
|
+
|
|
604
|
+
const technicalSupport = createAgent({
|
|
605
|
+
name: 'technical-support',
|
|
606
|
+
system: 'Solve technical issues and bugs',
|
|
607
|
+
tools: {
|
|
608
|
+
checkLogs: /* log analysis */,
|
|
609
|
+
runDiagnostics: /* system diagnostics */
|
|
610
|
+
},
|
|
611
|
+
handoffTo: ['human-escalation'] // If can't solve
|
|
612
|
+
});
|
|
613
|
+
|
|
614
|
+
// Handle support request
|
|
615
|
+
const response = await triager.handle({
|
|
616
|
+
message: 'My API is returning 500 errors',
|
|
617
|
+
context: { user: 'customer123', tier: 'enterprise' }
|
|
618
|
+
});
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
---
|
|
622
|
+
|
|
623
|
+
## 🔧 Configuration
|
|
624
|
+
|
|
625
|
+
### Agent Definition
|
|
626
|
+
|
|
627
|
+
```typescript
|
|
628
|
+
interface AgentConfig {
|
|
629
|
+
name: string; // Unique agent identifier
|
|
630
|
+
model: LanguageModel; // AI model (Claude, GPT-4, etc.)
|
|
631
|
+
system: string; // System prompt/specialization
|
|
632
|
+
tools?: Record<string, Tool>; // Available tools
|
|
633
|
+
handoffTo?: string[]; // Which agents can receive handoffs
|
|
634
|
+
routes?: Route[]; // Routing rules (for coordinators)
|
|
635
|
+
maxIterations?: number; // Max handoff chain length
|
|
636
|
+
temperature?: number; // Model creativity (0-1)
|
|
637
|
+
}
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
### Routing Rules
|
|
641
|
+
|
|
642
|
+
```typescript
|
|
643
|
+
interface Route {
|
|
644
|
+
to: string; // Target agent name
|
|
645
|
+
when: string; // Condition description
|
|
646
|
+
priority?: number; // Route priority (higher = checked first)
|
|
647
|
+
}
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
### Orchestration Options
|
|
651
|
+
|
|
652
|
+
```typescript
|
|
653
|
+
interface OrchestrationConfig {
|
|
654
|
+
agents: Agent[]; // All available agents
|
|
655
|
+
task: string; // User request/task
|
|
656
|
+
coordinator: Agent; // Which agent starts
|
|
657
|
+
maxDepth?: number; // Max handoff chain depth
|
|
658
|
+
timeout?: number; // Timeout in milliseconds
|
|
659
|
+
onHandoff?: (event) => void; // Handoff event callback
|
|
660
|
+
onComplete?: (result) => void; // Completion callback
|
|
661
|
+
}
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
---
|
|
665
|
+
|
|
666
|
+
## 💡 Best Practices
|
|
667
|
+
|
|
668
|
+
### 1. Clear Agent Specializations
|
|
669
|
+
|
|
670
|
+
```typescript
|
|
671
|
+
// ❌ Bad: Too broad
|
|
672
|
+
const agent = createAgent({
|
|
673
|
+
system: 'You are a helpful assistant'
|
|
674
|
+
});
|
|
675
|
+
|
|
676
|
+
// ✅ Good: Specific expertise
|
|
677
|
+
const agent = createAgent({
|
|
678
|
+
system: 'You are an expert TypeScript developer specializing in React hooks and performance optimization'
|
|
679
|
+
});
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
### 2. Limit Handoff Chains
|
|
683
|
+
|
|
684
|
+
```typescript
|
|
685
|
+
// Prevent infinite handoff loops
|
|
686
|
+
const config = {
|
|
687
|
+
maxDepth: 5, // Max 5 handoffs
|
|
688
|
+
maxIterations: 10
|
|
689
|
+
};
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
### 3. Provide Context
|
|
693
|
+
|
|
694
|
+
```typescript
|
|
695
|
+
// Pass context during handoffs
|
|
696
|
+
await handoff({
|
|
697
|
+
to: 'coder',
|
|
698
|
+
context: {
|
|
699
|
+
architecture: designDoc,
|
|
700
|
+
requirements: userRequirements,
|
|
701
|
+
constraints: performanceGoals
|
|
702
|
+
}
|
|
703
|
+
});
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
### 4. Handle Failures
|
|
707
|
+
|
|
708
|
+
```typescript
|
|
709
|
+
try {
|
|
710
|
+
const result = await orchestrate({...});
|
|
711
|
+
} catch (error) {
|
|
712
|
+
if (error.type === 'HANDOFF_FAILED') {
|
|
713
|
+
// Handle handoff failure
|
|
714
|
+
await fallbackAgent.handle(task);
|
|
715
|
+
} else if (error.type === 'TIMEOUT') {
|
|
716
|
+
// Handle timeout
|
|
717
|
+
console.log('Orchestration timed out');
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
```
|
|
721
|
+
|
|
722
|
+
### 5. Monitor Performance
|
|
723
|
+
|
|
724
|
+
```typescript
|
|
725
|
+
const result = await orchestrate({
|
|
726
|
+
...,
|
|
727
|
+
onHandoff: (event) => {
|
|
728
|
+
console.log(`Handoff: ${event.from} → ${event.to}`);
|
|
729
|
+
console.log(`Reason: ${event.reason}`);
|
|
730
|
+
},
|
|
731
|
+
onComplete: (result) => {
|
|
732
|
+
console.log(`Total handoffs: ${result.handoffCount}`);
|
|
733
|
+
console.log(`Total time: ${result.duration}ms`);
|
|
734
|
+
}
|
|
735
|
+
});
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
---
|
|
739
|
+
|
|
740
|
+
## 🔗 Integration with Other Plugins
|
|
741
|
+
|
|
742
|
+
**Works well with**:
|
|
743
|
+
- **ai-ml-engineering-pack**: RAG systems, prompt optimization
|
|
744
|
+
- **overnight-dev**: Autonomous multi-agent coding overnight
|
|
745
|
+
- **devops-automation-pack**: CI/CD with agent coordination
|
|
746
|
+
- **creator-studio-pack**: Content creation pipelines
|
|
747
|
+
|
|
748
|
+
---
|
|
749
|
+
|
|
750
|
+
## 📖 Resources
|
|
751
|
+
|
|
752
|
+
- **NPM Package**: [@ai-sdk-tools/agents](https://www.npmjs.com/package/@ai-sdk-tools/agents)
|
|
753
|
+
- **GitHub**: [ai-sdk-tools](https://github.com/midday-ai/ai-sdk-tools)
|
|
754
|
+
- **AI SDK**: [Vercel AI SDK v5](https://sdk.vercel.ai)
|
|
755
|
+
- **Provider SDKs**:
|
|
756
|
+
- **Ollama (FREE - Local)**: [ollama](https://www.npmjs.com/package/ollama) 💰 **$0/month**
|
|
757
|
+
- Anthropic: [@ai-sdk/anthropic](https://www.npmjs.com/package/@ai-sdk/anthropic)
|
|
758
|
+
- OpenAI: [@ai-sdk/openai](https://www.npmjs.com/package/@ai-sdk/openai)
|
|
759
|
+
- Google: [@ai-sdk/google](https://www.npmjs.com/package/@ai-sdk/google)
|
|
760
|
+
|
|
761
|
+
---
|
|
762
|
+
|
|
763
|
+
## 💰 FREE Alternative: Use Ollama (Zero API Costs)
|
|
764
|
+
|
|
765
|
+
**Eliminate $30-200/month in API fees** by running AI agents locally with Ollama.
|
|
766
|
+
|
|
767
|
+
### Quick Setup
|
|
768
|
+
|
|
769
|
+
```bash
|
|
770
|
+
# 1. Install Ollama (one-time)
|
|
771
|
+
/setup-ollama
|
|
772
|
+
# or manually: curl -fsSL https://ollama.com/install.sh | sh
|
|
773
|
+
|
|
774
|
+
# 2. Pull models
|
|
775
|
+
ollama pull llama3.2 # General purpose
|
|
776
|
+
ollama pull codellama # Code generation
|
|
777
|
+
|
|
778
|
+
# 3. Install Ollama SDK
|
|
779
|
+
npm install ollama
|
|
780
|
+
```
|
|
781
|
+
|
|
782
|
+
### Using Ollama in Agents
|
|
783
|
+
|
|
784
|
+
```typescript
|
|
785
|
+
import ollama from 'ollama';
|
|
786
|
+
|
|
787
|
+
// Create agent with Ollama (FREE)
|
|
788
|
+
const coder = {
|
|
789
|
+
name: 'coder',
|
|
790
|
+
generate: async (prompt: string) => {
|
|
791
|
+
const response = await ollama.chat({
|
|
792
|
+
model: 'codellama',
|
|
793
|
+
messages: [{ role: 'user', content: prompt }]
|
|
794
|
+
});
|
|
795
|
+
return response.message.content;
|
|
796
|
+
}
|
|
797
|
+
};
|
|
798
|
+
|
|
799
|
+
// Multi-agent system with $0 costs
|
|
800
|
+
const agents = [
|
|
801
|
+
{ name: 'architect', model: 'llama3.2' },
|
|
802
|
+
{ name: 'coder', model: 'codellama' },
|
|
803
|
+
{ name: 'reviewer', model: 'mistral' }
|
|
804
|
+
];
|
|
805
|
+
|
|
806
|
+
// All agents use local models - NO API COSTS!
|
|
807
|
+
```
|
|
808
|
+
|
|
809
|
+
### Cost Comparison
|
|
810
|
+
|
|
811
|
+
| Provider | Monthly Cost (1M tokens) | Setup | Privacy |
|
|
812
|
+
|----------|-------------------------|-------|---------|
|
|
813
|
+
| **Ollama** | **$0** ✓ | Local | **100% Private** ✓ |
|
|
814
|
+
| OpenAI GPT-4 | $30-60 | API Key | Cloud |
|
|
815
|
+
| Anthropic Claude | $15-75 | API Key | Cloud |
|
|
816
|
+
| Google Gemini | $7-21 | API Key | Cloud |
|
|
817
|
+
|
|
818
|
+
### Best Models for Multi-Agent Systems
|
|
819
|
+
|
|
820
|
+
**Code Generation**:
|
|
821
|
+
- `codellama` (34B) - Best for coding agents
|
|
822
|
+
- `qwen2.5-coder` (32B) - Strong code understanding
|
|
823
|
+
|
|
824
|
+
**General Purpose**:
|
|
825
|
+
- `llama3.2` (70B) - Meta's flagship
|
|
826
|
+
- `mistral` (7B) - Fast and efficient
|
|
827
|
+
|
|
828
|
+
**Specialized**:
|
|
829
|
+
- `phi3` (14B) - Microsoft's efficient model
|
|
830
|
+
- `gemma` (27B) - Google's open model
|
|
831
|
+
|
|
832
|
+
### Migration Guide: Paid → Free
|
|
833
|
+
|
|
834
|
+
**Before (OpenAI - Paid)**:
|
|
835
|
+
```typescript
|
|
836
|
+
import { createOpenAI } from '@ai-sdk/openai';
|
|
837
|
+
|
|
838
|
+
const openai = createOpenAI({
|
|
839
|
+
apiKey: process.env.OPENAI_API_KEY
|
|
840
|
+
});
|
|
841
|
+
|
|
842
|
+
const agent = createAgent({
|
|
843
|
+
model: openai('gpt-4')
|
|
844
|
+
});
|
|
845
|
+
```
|
|
846
|
+
|
|
847
|
+
**After (Ollama - Free)**:
|
|
848
|
+
```typescript
|
|
849
|
+
import ollama from 'ollama';
|
|
850
|
+
|
|
851
|
+
const agent = createAgent({
|
|
852
|
+
generate: async (prompt) => {
|
|
853
|
+
const response = await ollama.chat({
|
|
854
|
+
model: 'llama3.2',
|
|
855
|
+
messages: [{ role: 'user', content: prompt }]
|
|
856
|
+
});
|
|
857
|
+
return response.message.content;
|
|
858
|
+
}
|
|
859
|
+
});
|
|
860
|
+
```
|
|
861
|
+
|
|
862
|
+
**Savings: $30-60/month → $0** 🎉
|
|
863
|
+
|
|
864
|
+
### Related Plugins
|
|
865
|
+
|
|
866
|
+
- `/ollama-local-ai` - Ollama setup & configuration
|
|
867
|
+
- `/local-llm-wrapper` - Generic local LLM wrapper
|
|
868
|
+
|
|
869
|
+
---
|
|
870
|
+
|
|
871
|
+
## 🚀 Getting Started Now
|
|
872
|
+
|
|
873
|
+
```bash
|
|
874
|
+
# 1. Install plugin
|
|
875
|
+
/plugin install ai-sdk-agents@claude-code-plugins-plus
|
|
876
|
+
|
|
877
|
+
# 2. Set up project
|
|
878
|
+
/ai-agents-setup --template code-pipeline
|
|
879
|
+
|
|
880
|
+
# 3. Configure API keys
|
|
881
|
+
# Edit .env with your API keys
|
|
882
|
+
|
|
883
|
+
# 4. Test the system
|
|
884
|
+
/ai-agents-test "Build a TODO app with authentication"
|
|
885
|
+
|
|
886
|
+
# 5. Watch agents collaborate!
|
|
887
|
+
```
|
|
888
|
+
|
|
889
|
+
---
|
|
890
|
+
|
|
891
|
+
## ⚡ Quick Wins
|
|
892
|
+
|
|
893
|
+
**Simple Request, Complex Orchestration**:
|
|
894
|
+
|
|
895
|
+
```
|
|
896
|
+
User: "Build a secure REST API with tests and documentation"
|
|
897
|
+
|
|
898
|
+
Agents collaborate:
|
|
899
|
+
1. Architect → Designs API structure
|
|
900
|
+
2. Security → Reviews design for vulnerabilities
|
|
901
|
+
3. Coder → Implements API
|
|
902
|
+
4. Tester → Writes comprehensive tests
|
|
903
|
+
5. Documenter → Creates API docs
|
|
904
|
+
6. Reviewer → Final quality check
|
|
905
|
+
|
|
906
|
+
Result: Production-ready API in minutes
|
|
907
|
+
```
|
|
908
|
+
|
|
909
|
+
**The power of specialized agents working together.** 🤖🤝🤖
|
|
910
|
+
|
|
911
|
+
---
|
|
912
|
+
|
|
913
|
+
## 📊 Performance
|
|
914
|
+
|
|
915
|
+
**vs Single Agent**:
|
|
916
|
+
- ✅ 10x better task decomposition
|
|
917
|
+
- ✅ 5x higher quality output
|
|
918
|
+
- ✅ 3x faster completion (parallel agent work)
|
|
919
|
+
- ✅ Better error handling (agents catch each other's mistakes)
|
|
920
|
+
|
|
921
|
+
**Real-world metrics**:
|
|
922
|
+
- Complex code generation: 3-5 min (vs 15-20 min single agent)
|
|
923
|
+
- Research reports: 2 min (vs 10 min single agent)
|
|
924
|
+
- Customer support: <30 sec (vs 2-3 min single agent)
|
|
925
|
+
|
|
926
|
+
---
|
|
927
|
+
|
|
928
|
+
## 🎯 When to Use Multi-Agent
|
|
929
|
+
|
|
930
|
+
**Use multi-agent when**:
|
|
931
|
+
- ✅ Task requires multiple specializations
|
|
932
|
+
- ✅ Need quality checks/reviews
|
|
933
|
+
- ✅ Complex workflow with clear stages
|
|
934
|
+
- ✅ Want better error handling
|
|
935
|
+
- ✅ Need scalable, maintainable AI systems
|
|
936
|
+
|
|
937
|
+
**Use single agent when**:
|
|
938
|
+
- Simple, focused tasks
|
|
939
|
+
- Speed is critical (handoffs add latency)
|
|
940
|
+
- Budget constraints (multiple API calls)
|
|
941
|
+
|
|
942
|
+
---
|
|
943
|
+
|
|
944
|
+
**Transform complex workflows into orchestrated multi-agent systems.** 🎭🤖✨
|
|
945
|
+
|
|
946
|
+
---
|
|
947
|
+
|
|
948
|
+
**Version**: 1.0.0
|
|
949
|
+
**Dependencies**: @ai-sdk-tools/agents ^0.1.0-beta.1, ai (latest), zod (latest)
|
|
950
|
+
**License**: MIT
|
|
951
|
+
**Last Updated**: 2025-10-11
|