adaptive-memory-multi-model-router 1.2.2 → 1.3.1
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/LICENSE +21 -0
- package/README.md +146 -66
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/integrations/airtable.js +20 -0
- package/dist/integrations/discord.js +18 -0
- package/dist/integrations/github.js +23 -0
- package/dist/integrations/gmail.js +19 -0
- package/dist/integrations/google-calendar.js +18 -0
- package/dist/integrations/index.js +61 -0
- package/dist/integrations/jira.js +21 -0
- package/dist/integrations/linear.js +19 -0
- package/dist/integrations/notion.js +19 -0
- package/dist/integrations/slack.js +18 -0
- package/dist/integrations/telegram.js +19 -0
- package/dist/providers/registry.js +7 -3
- package/docs/ARCHITECTURAL-IMPROVEMENTS-2025.md +1391 -0
- package/docs/ARCHITECTURAL-IMPROVEMENTS-REVISED-2025.md +1051 -0
- package/docs/CONFIGURATION.md +476 -0
- package/docs/COUNCIL_DECISION.json +308 -0
- package/docs/COUNCIL_SUMMARY.md +265 -0
- package/docs/COUNCIL_V2.2_DECISION.md +416 -0
- package/docs/IMPROVEMENT_ROADMAP.md +515 -0
- package/docs/LLM_COUNCIL_DECISION.md +508 -0
- package/docs/QUICK_START_VISIBILITY.md +782 -0
- package/docs/REDDIT_GAP_ANALYSIS.md +299 -0
- package/docs/RESEARCH_BACKED_IMPROVEMENTS.md +1180 -0
- package/docs/TMLPD_QNA.md +751 -0
- package/docs/TMLPD_V2.1_COMPLETE.md +763 -0
- package/docs/TMLPD_V2.2_RESEARCH_ROADMAP.md +754 -0
- package/docs/V2.2_IMPLEMENTATION_COMPLETE.md +446 -0
- package/docs/V2_IMPLEMENTATION_GUIDE.md +388 -0
- package/docs/VISIBILITY_ADOPTION_PLAN.md +1005 -0
- package/docs/launch-content/LAUNCH_EXECUTION_CHECKLIST.md +421 -0
- package/docs/launch-content/README.md +457 -0
- package/docs/launch-content/assets/cost_comparison_100_tasks.png +0 -0
- package/docs/launch-content/assets/cumulative_savings.png +0 -0
- package/docs/launch-content/assets/parallel_speedup.png +0 -0
- package/docs/launch-content/assets/provider_pricing_comparison.png +0 -0
- package/docs/launch-content/assets/task_breakdown_comparison.png +0 -0
- package/docs/launch-content/generate_charts.py +313 -0
- package/docs/launch-content/hn_show_post.md +139 -0
- package/docs/launch-content/partner_outreach_templates.md +745 -0
- package/docs/launch-content/reddit_posts.md +467 -0
- package/docs/launch-content/twitter_thread.txt +460 -0
- package/examples/QUICKSTART.md +1 -1
- package/openclaw-alexa-bridge/ALL_REMAINING_FIXES_PLAN.md +313 -0
- package/openclaw-alexa-bridge/REMAINING_FIXES_SUMMARY.md +277 -0
- package/openclaw-alexa-bridge/src/alexa_handler_no_tmlpd.js +1234 -0
- package/openclaw-alexa-bridge/test_fixes.js +77 -0
- package/package.json +120 -29
- package/package.json.tmp +0 -0
- package/qna/TMLPD_QNA.md +3 -3
- package/skill/SKILL.md +2 -2
- package/src/__tests__/integration/tmpld_integration.test.py +540 -0
- package/src/agents/skill_enhanced_agent.py +318 -0
- package/src/memory/__init__.py +15 -0
- package/src/memory/agentic_memory.py +353 -0
- package/src/memory/semantic_memory.py +444 -0
- package/src/memory/simple_memory.py +466 -0
- package/src/memory/working_memory.py +447 -0
- package/src/orchestration/__init__.py +52 -0
- package/src/orchestration/execution_engine.py +353 -0
- package/src/orchestration/halo_orchestrator.py +367 -0
- package/src/orchestration/mcts_workflow.py +498 -0
- package/src/orchestration/role_assigner.py +473 -0
- package/src/orchestration/task_planner.py +522 -0
- package/src/providers/__init__.py +67 -0
- package/src/providers/anthropic.py +304 -0
- package/src/providers/base.py +241 -0
- package/src/providers/cerebras.py +373 -0
- package/src/providers/registry.py +476 -0
- package/src/routing/__init__.py +30 -0
- package/src/routing/universal_router.py +621 -0
- package/src/skills/TMLPD-QUICKREF.md +210 -0
- package/src/skills/TMLPD-SETUP-SUMMARY.md +157 -0
- package/src/skills/TMLPD.md +540 -0
- package/src/skills/__tests__/skill_manager.test.ts +328 -0
- package/src/skills/skill_manager.py +385 -0
- package/src/skills/test-tmlpd.sh +108 -0
- package/src/skills/tmlpd-category.yaml +67 -0
- package/src/skills/tmlpd-monitoring.yaml +188 -0
- package/src/skills/tmlpd-phase.yaml +132 -0
- package/src/state/__init__.py +17 -0
- package/src/state/simple_checkpoint.py +508 -0
- package/src/tmlpd_agent.py +464 -0
- package/src/tmpld_v2.py +427 -0
- package/src/workflows/__init__.py +18 -0
- package/src/workflows/advanced_difficulty_classifier.py +377 -0
- package/src/workflows/chaining_executor.py +417 -0
- package/src/workflows/difficulty_integration.py +209 -0
- package/src/workflows/orchestrator.py +469 -0
- package/src/workflows/orchestrator_executor.py +456 -0
- package/src/workflows/parallelization_executor.py +382 -0
- package/src/workflows/router.py +311 -0
- package/test_integration_simple.py +86 -0
- package/test_mcts_workflow.py +150 -0
- package/test_templd_integration.py +262 -0
- package/test_universal_router.py +275 -0
- package/tmlpd-pi-extension/README.md +36 -0
- package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts +114 -0
- package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/cache/prefixCache.js +285 -0
- package/tmlpd-pi-extension/dist/cache/prefixCache.js.map +1 -0
- package/tmlpd-pi-extension/dist/cache/responseCache.d.ts +58 -0
- package/tmlpd-pi-extension/dist/cache/responseCache.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/cache/responseCache.js +153 -0
- package/tmlpd-pi-extension/dist/cache/responseCache.js.map +1 -0
- package/tmlpd-pi-extension/dist/cli.js +59 -0
- package/tmlpd-pi-extension/dist/cost/costTracker.d.ts +95 -0
- package/tmlpd-pi-extension/dist/cost/costTracker.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/cost/costTracker.js +240 -0
- package/tmlpd-pi-extension/dist/cost/costTracker.js.map +1 -0
- package/tmlpd-pi-extension/dist/index.d.ts +723 -0
- package/tmlpd-pi-extension/dist/index.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/index.js +239 -0
- package/tmlpd-pi-extension/dist/index.js.map +1 -0
- package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts +82 -0
- package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/memory/episodicMemory.js +145 -0
- package/tmlpd-pi-extension/dist/memory/episodicMemory.js.map +1 -0
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts +102 -0
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js +207 -0
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js.map +1 -0
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts +85 -0
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js +210 -0
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js.map +1 -0
- package/tmlpd-pi-extension/dist/providers/localProvider.d.ts +102 -0
- package/tmlpd-pi-extension/dist/providers/localProvider.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/providers/localProvider.js +338 -0
- package/tmlpd-pi-extension/dist/providers/localProvider.js.map +1 -0
- package/tmlpd-pi-extension/dist/providers/registry.d.ts +55 -0
- package/tmlpd-pi-extension/dist/providers/registry.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/providers/registry.js +138 -0
- package/tmlpd-pi-extension/dist/providers/registry.js.map +1 -0
- package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts +68 -0
- package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/routing/advancedRouter.js +332 -0
- package/tmlpd-pi-extension/dist/routing/advancedRouter.js.map +1 -0
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts +101 -0
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.js +368 -0
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.js.map +1 -0
- package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts +96 -0
- package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/utils/batchProcessor.js +170 -0
- package/tmlpd-pi-extension/dist/utils/batchProcessor.js.map +1 -0
- package/tmlpd-pi-extension/dist/utils/compression.d.ts +61 -0
- package/tmlpd-pi-extension/dist/utils/compression.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/utils/compression.js +281 -0
- package/tmlpd-pi-extension/dist/utils/compression.js.map +1 -0
- package/tmlpd-pi-extension/dist/utils/reliability.d.ts +74 -0
- package/tmlpd-pi-extension/dist/utils/reliability.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/utils/reliability.js +177 -0
- package/tmlpd-pi-extension/dist/utils/reliability.js.map +1 -0
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts +117 -0
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js +246 -0
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js.map +1 -0
- package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts +50 -0
- package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/utils/tokenUtils.js +124 -0
- package/tmlpd-pi-extension/dist/utils/tokenUtils.js.map +1 -0
- package/tmlpd-pi-extension/examples/QUICKSTART.md +183 -0
- package/tmlpd-pi-extension/package-lock.json +75 -0
- package/tmlpd-pi-extension/package.json +172 -0
- package/tmlpd-pi-extension/python/examples.py +53 -0
- package/tmlpd-pi-extension/python/integrations.py +330 -0
- package/tmlpd-pi-extension/python/setup.py +28 -0
- package/tmlpd-pi-extension/python/tmlpd.py +369 -0
- package/tmlpd-pi-extension/qna/REDDIT_GAP_ANALYSIS.md +299 -0
- package/tmlpd-pi-extension/qna/TMLPD_QNA.md +751 -0
- package/tmlpd-pi-extension/skill/SKILL.md +238 -0
- package/{src → tmlpd-pi-extension/src}/index.ts +1 -1
- package/tmlpd-pi-extension/tsconfig.json +18 -0
- package/demo/research-demo.js +0 -266
- package/notebooks/quickstart.ipynb +0 -157
- package/rust/tmlpd.h +0 -268
- package/src/cache/prefixCache.ts +0 -365
- package/src/routing/advancedRouter.ts +0 -406
- package/src/utils/speculativeDecoding.ts +0 -344
- /package/{src → tmlpd-pi-extension/src}/cache/responseCache.ts +0 -0
- /package/{src → tmlpd-pi-extension/src}/cost/costTracker.ts +0 -0
- /package/{src → tmlpd-pi-extension/src}/memory/episodicMemory.ts +0 -0
- /package/{src → tmlpd-pi-extension/src}/orchestration/haloOrchestrator.ts +0 -0
- /package/{src → tmlpd-pi-extension/src}/orchestration/mctsWorkflow.ts +0 -0
- /package/{src → tmlpd-pi-extension/src}/providers/localProvider.ts +0 -0
- /package/{src → tmlpd-pi-extension/src}/providers/registry.ts +0 -0
- /package/{src → tmlpd-pi-extension/src}/tools/tmlpdTools.ts +0 -0
- /package/{src → tmlpd-pi-extension/src}/utils/batchProcessor.ts +0 -0
- /package/{src → tmlpd-pi-extension/src}/utils/compression.ts +0 -0
- /package/{src → tmlpd-pi-extension/src}/utils/reliability.ts +0 -0
- /package/{src → tmlpd-pi-extension/src}/utils/tokenUtils.ts +0 -0
|
@@ -0,0 +1,1051 @@
|
|
|
1
|
+
# TMLPD v2.0: Revised Architecture Based on Anthropic's Latest Research
|
|
2
|
+
## Aligned with AI Engineer Summit 2025 Insights
|
|
3
|
+
|
|
4
|
+
**Document Version:** 2.0 (Revised)
|
|
5
|
+
**Last Updated:** January 2025
|
|
6
|
+
**Based On:** Anthropic's "Building Effective Agents" & "Agent Skills" (Dec 2024)
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## ⚠️ MAJOR PARADIGM SHIFT
|
|
11
|
+
|
|
12
|
+
After reviewing Anthropic's latest research from the AI Engineer Summit 2025, **the original architectural plan needs significant revision**.
|
|
13
|
+
|
|
14
|
+
### Key Insight from Barry Zhang (Anthropic):
|
|
15
|
+
|
|
16
|
+
> **"Don't Build Agents, Build Skills Instead"**
|
|
17
|
+
>
|
|
18
|
+
> Stop building "omnipotent agents" for every niche. Focus on building **modular, composable Skills** that can be mixed and matched.
|
|
19
|
+
|
|
20
|
+
**Sources:**
|
|
21
|
+
- [Building Effective Agents - Anthropic](https://www.anthropic.com/research/building-effective-agents) (Dec 19, 2024)
|
|
22
|
+
- [Agent Skills - Anthropic Engineering](https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills) (Dec 18, 2024)
|
|
23
|
+
- [How We Build Effective Agents: Barry Zhang](https://www.youtube.com/watch?v=D7_ipDqhtwk) (AI Engineer Summit 2025)
|
|
24
|
+
- [LinkedIn Discussion: Skills vs Agents](https://www.linkedin.com/posts/barry-z_building-effective-agents-activity-7275576927984267264-Tpms)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Part 1: What Anthropic Actually Says
|
|
29
|
+
|
|
30
|
+
### The Core Message: **Simplicity Over Complexity**
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
34
|
+
│ │
|
|
35
|
+
│ OLD THINKING (Complex) NEW THINKING (Simple) │
|
|
36
|
+
│ │
|
|
37
|
+
│ ❌ Build complex agent networks ✅ Start with simple │
|
|
38
|
+
│ ❌ Multi-agent orchestration ✅ Single LLM call │
|
|
39
|
+
│ ❌ Elaborate memory systems ✅ Workflows for │
|
|
40
|
+
│ ❌ Cross-agent communication ✅ predictable tasks │
|
|
41
|
+
│ ❌ Framework-heavy ✅ Agents only when │
|
|
42
|
+
│ ✅ necessary │
|
|
43
|
+
│ │
|
|
44
|
+
└─────────────────────────────────────────────────────────────┘
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Anthropic's Decision Tree
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
Should I build an agentic system?
|
|
51
|
+
│
|
|
52
|
+
▼
|
|
53
|
+
Can a single optimized LLM call solve it?
|
|
54
|
+
│
|
|
55
|
+
├── YES → Use single LLM call ✅ (80% of cases)
|
|
56
|
+
│
|
|
57
|
+
└── NO → Is the task predictable?
|
|
58
|
+
│
|
|
59
|
+
├── YES → Use WORKFLOW ✅ (15% of cases)
|
|
60
|
+
│ • Chaining
|
|
61
|
+
│ • Routing
|
|
62
|
+
│ • Parallelization
|
|
63
|
+
│ • Orchestrator-Workers
|
|
64
|
+
│ • Evaluator-Optimizer
|
|
65
|
+
│
|
|
66
|
+
└── NO → Use AGENT ⚠️ (5% of cases)
|
|
67
|
+
• Only when unpredictable
|
|
68
|
+
• When LLM needs autonomy
|
|
69
|
+
• Open-ended problems
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Statistics from Anthropic's Research
|
|
73
|
+
|
|
74
|
+
**Most successful implementations:**
|
|
75
|
+
- 80%: Single LLM call with retrieval
|
|
76
|
+
- 15%: Simple workflows (chaining, routing)
|
|
77
|
+
- 4%: Orchestrator-workers
|
|
78
|
+
- 1%: True autonomous agents
|
|
79
|
+
|
|
80
|
+
**Key Finding:** Complex multi-agent systems were rarely the best solution.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Part 2: Revised TMLPD Architecture
|
|
85
|
+
|
|
86
|
+
### Original Plan (Over-engineered)
|
|
87
|
+
|
|
88
|
+
❌ **What I originally proposed:**
|
|
89
|
+
1. Complex memory hierarchy (3 tiers)
|
|
90
|
+
2. Agentic RAG with multi-step retrieval
|
|
91
|
+
3. Cross-agent communication protocols
|
|
92
|
+
4. Elaborate state management
|
|
93
|
+
5. Multi-agent coordination frameworks
|
|
94
|
+
|
|
95
|
+
**Problem:** This violates Anthropic's core principle of simplicity.
|
|
96
|
+
|
|
97
|
+
### Revised Plan (Aligned with Anthropic)
|
|
98
|
+
|
|
99
|
+
✅ **What TMLPD v2.0 should actually be:**
|
|
100
|
+
|
|
101
|
+
**Instead of "Multi-Agent Orchestration" → Focus on "Workflow Optimization"**
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
TMLPD v2.0 = Skills + Workflows (NOT complex agents)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Part 3: Agent Skills Integration (Highest Priority)
|
|
110
|
+
|
|
111
|
+
### What Are Agent Skills?
|
|
112
|
+
|
|
113
|
+
From Anthropic's definition:
|
|
114
|
+
> "Agent Skills are organized folders of instructions, scripts, and resources that agents can discover and load dynamically to perform better at specific tasks."
|
|
115
|
+
|
|
116
|
+
**Key Concept:** Progressive Disclosure
|
|
117
|
+
```
|
|
118
|
+
Level 1: Metadata (name, description)
|
|
119
|
+
↓
|
|
120
|
+
Level 2: SKILL.md (main instructions)
|
|
121
|
+
↓
|
|
122
|
+
Level 3: Additional files (details as needed)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Example Skill Structure
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
tmlpd-skills/
|
|
129
|
+
├── frontend/
|
|
130
|
+
│ ├── SKILL.md
|
|
131
|
+
│ ├── react-best-practices.md
|
|
132
|
+
│ ├── component-templates.md
|
|
133
|
+
│ └── scripts/
|
|
134
|
+
│ └── generate-component.py
|
|
135
|
+
├── backend/
|
|
136
|
+
│ ├── SKILL.md
|
|
137
|
+
│ ├── api-patterns.md
|
|
138
|
+
│ └── testing-guidelines.md
|
|
139
|
+
└── testing/
|
|
140
|
+
├── SKILL.md
|
|
141
|
+
├── jest-patterns.md
|
|
142
|
+
└── test-templates.md
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### SKILL.md Format
|
|
146
|
+
|
|
147
|
+
```yaml
|
|
148
|
+
---
|
|
149
|
+
name: "React Frontend Development"
|
|
150
|
+
description: "Best practices for building React components with TypeScript, testing, and state management"
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
# React Frontend Skill
|
|
154
|
+
|
|
155
|
+
## Core Principles
|
|
156
|
+
|
|
157
|
+
1. **Type Safety**: Always use TypeScript with strict mode
|
|
158
|
+
2. **Component Design**: Favor composition over inheritance
|
|
159
|
+
3. **State Management**: Use Zustand for local state, Redux for global
|
|
160
|
+
|
|
161
|
+
## Common Patterns
|
|
162
|
+
|
|
163
|
+
### Component Structure
|
|
164
|
+
|
|
165
|
+
See `react-best-practices.md` for detailed component architecture.
|
|
166
|
+
|
|
167
|
+
### Testing
|
|
168
|
+
|
|
169
|
+
Always write tests before implementation (TDD approach).
|
|
170
|
+
|
|
171
|
+
## Scripts
|
|
172
|
+
|
|
173
|
+
Use `scripts/generate-component.py` to scaffold new components with:
|
|
174
|
+
- TypeScript types
|
|
175
|
+
- Jest test file
|
|
176
|
+
- Storybook story
|
|
177
|
+
- CSS modules
|
|
178
|
+
|
|
179
|
+
## When to Use This Skill
|
|
180
|
+
|
|
181
|
+
Trigger this skill when:
|
|
182
|
+
- Building React components
|
|
183
|
+
- Implementing UI features
|
|
184
|
+
- Creating frontend layouts
|
|
185
|
+
- Writing frontend tests
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Implementation
|
|
189
|
+
|
|
190
|
+
```python
|
|
191
|
+
# File: src/skills/skill_manager.py
|
|
192
|
+
|
|
193
|
+
from pathlib import Path
|
|
194
|
+
import yaml
|
|
195
|
+
from typing import Dict, List, Optional
|
|
196
|
+
from dataclasses import dataclass
|
|
197
|
+
|
|
198
|
+
@dataclass
|
|
199
|
+
class Skill:
|
|
200
|
+
"""Represents an Agent Skill"""
|
|
201
|
+
name: str
|
|
202
|
+
description: str
|
|
203
|
+
directory: Path
|
|
204
|
+
metadata: Dict[str, str]
|
|
205
|
+
content: Optional[str] = None
|
|
206
|
+
|
|
207
|
+
class SkillManager:
|
|
208
|
+
"""
|
|
209
|
+
Manages Agent Skills following Anthropic's specification.
|
|
210
|
+
Implements progressive disclosure.
|
|
211
|
+
"""
|
|
212
|
+
|
|
213
|
+
def __init__(self, skills_dir: str = "tmlpd-skills"):
|
|
214
|
+
self.skills_dir = Path(skills_dir)
|
|
215
|
+
self.skills: Dict[str, Skill] = {}
|
|
216
|
+
self._load_skills_metadata()
|
|
217
|
+
|
|
218
|
+
def _load_skills_metadata(self):
|
|
219
|
+
"""
|
|
220
|
+
Load Level 1: Metadata only (name, description)
|
|
221
|
+
This is loaded into system prompt at startup
|
|
222
|
+
"""
|
|
223
|
+
|
|
224
|
+
if not self.skills_dir.exists():
|
|
225
|
+
return
|
|
226
|
+
|
|
227
|
+
for skill_dir in self.skills_dir.iterdir():
|
|
228
|
+
if not skill_dir.is_dir():
|
|
229
|
+
continue
|
|
230
|
+
|
|
231
|
+
skill_md = skill_dir / "SKILL.md"
|
|
232
|
+
|
|
233
|
+
if not skill_md.exists():
|
|
234
|
+
continue
|
|
235
|
+
|
|
236
|
+
# Parse YAML frontmatter
|
|
237
|
+
with open(skill_md, "r") as f:
|
|
238
|
+
content = f.read()
|
|
239
|
+
|
|
240
|
+
# Extract YAML frontmatter
|
|
241
|
+
if content.startswith("---"):
|
|
242
|
+
_, frontmatter, _ = content.split("---", 2)
|
|
243
|
+
metadata = yaml.safe_load(frontmatter)
|
|
244
|
+
else:
|
|
245
|
+
continue
|
|
246
|
+
|
|
247
|
+
self.skills[metadata["name"]] = Skill(
|
|
248
|
+
name=metadata["name"],
|
|
249
|
+
description=metadata["description"],
|
|
250
|
+
directory=skill_dir,
|
|
251
|
+
metadata=metadata
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
def list_skills(self) -> List[str]:
|
|
255
|
+
"""List all available skills (Level 1 metadata)"""
|
|
256
|
+
return list(self.skills.keys())
|
|
257
|
+
|
|
258
|
+
def get_relevant_skills(self, task: str, top_k: int = 3) -> List[str]:
|
|
259
|
+
"""
|
|
260
|
+
Find relevant skills based on task description.
|
|
261
|
+
Uses simple keyword matching (can upgrade to semantic search later).
|
|
262
|
+
"""
|
|
263
|
+
|
|
264
|
+
task_lower = task.lower()
|
|
265
|
+
relevant = []
|
|
266
|
+
|
|
267
|
+
for skill_name, skill in self.skills.items():
|
|
268
|
+
# Check if task keywords match skill description
|
|
269
|
+
skill_desc_lower = skill.description.lower()
|
|
270
|
+
|
|
271
|
+
# Simple keyword matching
|
|
272
|
+
common_words = set(task_lower.split()) & set(skill_desc_lower.split())
|
|
273
|
+
|
|
274
|
+
if common_words:
|
|
275
|
+
relevance = len(common_words)
|
|
276
|
+
relevant.append((skill_name, relevance))
|
|
277
|
+
|
|
278
|
+
# Sort by relevance and return top_k
|
|
279
|
+
relevant.sort(key=lambda x: x[1], reverse=True)
|
|
280
|
+
return [skill_name for skill_name, _ in relevant[:top_k]]
|
|
281
|
+
|
|
282
|
+
def load_skill(self, skill_name: str) -> Skill:
|
|
283
|
+
"""
|
|
284
|
+
Load Level 2: Full SKILL.md content
|
|
285
|
+
Called only when skill is relevant to current task
|
|
286
|
+
"""
|
|
287
|
+
|
|
288
|
+
if skill_name not in self.skills:
|
|
289
|
+
raise ValueError(f"Skill {skill_name} not found")
|
|
290
|
+
|
|
291
|
+
skill = self.skills[skill_name]
|
|
292
|
+
skill_md = skill.directory / "SKILL.md"
|
|
293
|
+
|
|
294
|
+
with open(skill_md, "r") as f:
|
|
295
|
+
# Skip YAML frontmatter, get content
|
|
296
|
+
content = f.read()
|
|
297
|
+
if "---" in content:
|
|
298
|
+
_, _, content = content.split("---", 2)
|
|
299
|
+
|
|
300
|
+
skill.content = content.strip()
|
|
301
|
+
return skill
|
|
302
|
+
|
|
303
|
+
def load_additional_file(self, skill_name: str, filename: str) -> str:
|
|
304
|
+
"""
|
|
305
|
+
Load Level 3: Additional files from skill
|
|
306
|
+
Progressive disclosure - load only when needed
|
|
307
|
+
"""
|
|
308
|
+
|
|
309
|
+
if skill_name not in self.skills:
|
|
310
|
+
raise ValueError(f"Skill {skill_name} not found")
|
|
311
|
+
|
|
312
|
+
skill = self.skills[skill_name]
|
|
313
|
+
additional_file = skill.directory / filename
|
|
314
|
+
|
|
315
|
+
if not additional_file.exists():
|
|
316
|
+
raise FileNotFoundError(f"File {filename} not found in skill {skill_name}")
|
|
317
|
+
|
|
318
|
+
with open(additional_file, "r") as f:
|
|
319
|
+
return f.read()
|
|
320
|
+
|
|
321
|
+
# Usage Example
|
|
322
|
+
class TMLEnhancedAgent:
|
|
323
|
+
"""Agent with Skill capabilities"""
|
|
324
|
+
|
|
325
|
+
def __init__(self):
|
|
326
|
+
self.skill_manager = SkillManager()
|
|
327
|
+
|
|
328
|
+
def execute_task(self, task: str) -> str:
|
|
329
|
+
"""Execute task using relevant skills"""
|
|
330
|
+
|
|
331
|
+
# Step 1: Find relevant skills
|
|
332
|
+
relevant_skills = self.skill_manager.get_relevant_skills(task)
|
|
333
|
+
|
|
334
|
+
# Step 2: Build context from skills
|
|
335
|
+
context_parts = []
|
|
336
|
+
|
|
337
|
+
for skill_name in relevant_skills:
|
|
338
|
+
skill = self.skill_manager.load_skill(skill_name)
|
|
339
|
+
context_parts.append(f"## {skill.name}\n{skill.content}")
|
|
340
|
+
|
|
341
|
+
# Step 3: Combine with task
|
|
342
|
+
full_context = "\n\n".join(context_parts)
|
|
343
|
+
prompt = f"""
|
|
344
|
+
Task: {task}
|
|
345
|
+
|
|
346
|
+
Relevant Skills:
|
|
347
|
+
{full_context}
|
|
348
|
+
|
|
349
|
+
Please complete the task following the guidance from the relevant skills.
|
|
350
|
+
"""
|
|
351
|
+
|
|
352
|
+
# Step 4: Execute LLM call
|
|
353
|
+
return self._llm_call(prompt)
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Part 4: Workflow Patterns (Instead of Complex Agents)
|
|
359
|
+
|
|
360
|
+
### Pattern 1: Parallelization (What TMLPD Already Does!)
|
|
361
|
+
|
|
362
|
+
```python
|
|
363
|
+
# This IS the right approach! ✅
|
|
364
|
+
|
|
365
|
+
class ParallelWorkflow:
|
|
366
|
+
"""
|
|
367
|
+
Anthropic's "Parallelization: Sectioning" pattern
|
|
368
|
+
This is exactly what TMLPD v1.0 does!
|
|
369
|
+
"""
|
|
370
|
+
|
|
371
|
+
def execute(self, tasks: List[Dict]) -> Dict[str, Any]:
|
|
372
|
+
"""
|
|
373
|
+
Break task into independent subtasks, run in parallel.
|
|
374
|
+
This is a WORKFLOW, not a complex agent system.
|
|
375
|
+
"""
|
|
376
|
+
|
|
377
|
+
# This is simple, predictable, and effective
|
|
378
|
+
with ThreadPoolExecutor() as executor:
|
|
379
|
+
futures = {
|
|
380
|
+
executor.submit(self._execute_single_task, task): task
|
|
381
|
+
for task in tasks
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
results = {}
|
|
385
|
+
for future in as_completed(futures):
|
|
386
|
+
task = futures[future]
|
|
387
|
+
try:
|
|
388
|
+
results[task["id"]] = future.result()
|
|
389
|
+
except Exception as e:
|
|
390
|
+
results[task["id"]] = {"error": str(e)}
|
|
391
|
+
|
|
392
|
+
return results
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
**This is GOOD!** TMLPD v1.0 already follows Anthropic's recommendation.
|
|
396
|
+
|
|
397
|
+
### Pattern 2: Routing (Add to TMLPD v2.0)
|
|
398
|
+
|
|
399
|
+
```python
|
|
400
|
+
# File: src/workflows/router.py
|
|
401
|
+
|
|
402
|
+
class TaskRouter:
|
|
403
|
+
"""
|
|
404
|
+
Anthropic's "Routing" workflow.
|
|
405
|
+
Classify tasks and route to specialized handlers.
|
|
406
|
+
"""
|
|
407
|
+
|
|
408
|
+
def __init__(self):
|
|
409
|
+
self.routes = {
|
|
410
|
+
"frontend": FrontendSkill(),
|
|
411
|
+
"backend": BackendSkill(),
|
|
412
|
+
"testing": TestingSkill(),
|
|
413
|
+
"documentation": DocumentationSkill()
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
def route_and_execute(self, task: str) -> str:
|
|
417
|
+
"""
|
|
418
|
+
Step 1: Classify task type
|
|
419
|
+
Step 2: Route to appropriate skill
|
|
420
|
+
Step 3: Execute with specialized context
|
|
421
|
+
"""
|
|
422
|
+
|
|
423
|
+
# Simple classification (can use LLM)
|
|
424
|
+
task_type = self._classify_task(task)
|
|
425
|
+
|
|
426
|
+
# Get relevant skill
|
|
427
|
+
skill = self.routes[task_type]
|
|
428
|
+
|
|
429
|
+
# Load skill context
|
|
430
|
+
skill_context = skill.load_full_context()
|
|
431
|
+
|
|
432
|
+
# Execute with skill
|
|
433
|
+
return skill.execute_with_context(task, skill_context)
|
|
434
|
+
|
|
435
|
+
def _classify_task(self, task: str) -> str:
|
|
436
|
+
"""Classify task into frontend/backend/testing/docs"""
|
|
437
|
+
|
|
438
|
+
task_lower = task.lower()
|
|
439
|
+
|
|
440
|
+
if any(word in task_lower for word in ["ui", "component", "frontend", "react", "vue"]):
|
|
441
|
+
return "frontend"
|
|
442
|
+
elif any(word in task_lower for word in ["api", "endpoint", "backend", "server", "database"]):
|
|
443
|
+
return "backend"
|
|
444
|
+
elif any(word in task_lower for word in ["test", "spec", "coverage", "jest"]):
|
|
445
|
+
return "testing"
|
|
446
|
+
elif any(word in task_lower for word in ["doc", "readme", "guide", "tutorial"]):
|
|
447
|
+
return "documentation"
|
|
448
|
+
else:
|
|
449
|
+
return "frontend" # default
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### Pattern 3: Orchestrator-Workers (For Complex Tasks)
|
|
453
|
+
|
|
454
|
+
```python
|
|
455
|
+
# File: src/workflows/orchestrator.py
|
|
456
|
+
|
|
457
|
+
class OrchestratorWorkflow:
|
|
458
|
+
"""
|
|
459
|
+
Anthropic's "Orchestrator-Workers" pattern.
|
|
460
|
+
For complex tasks where subtasks aren't predictable.
|
|
461
|
+
|
|
462
|
+
NOTE: Only use this for truly complex, unpredictable tasks!
|
|
463
|
+
"""
|
|
464
|
+
|
|
465
|
+
def __init__(self, skill_manager: SkillManager):
|
|
466
|
+
self.skill_manager = skill_manager
|
|
467
|
+
|
|
468
|
+
def execute(self, complex_task: str) -> str:
|
|
469
|
+
"""
|
|
470
|
+
Step 1: Orchestrator breaks down task into subtasks
|
|
471
|
+
Step 2: Delegate to workers with relevant skills
|
|
472
|
+
Step 3: Synthesize results
|
|
473
|
+
"""
|
|
474
|
+
|
|
475
|
+
# Step 1: Break down task (LLM-driven)
|
|
476
|
+
subtasks = self._breakdown_task(complex_task)
|
|
477
|
+
|
|
478
|
+
# Step 2: Assign skills and execute
|
|
479
|
+
results = []
|
|
480
|
+
for subtask in subtasks:
|
|
481
|
+
# Find relevant skill
|
|
482
|
+
relevant_skill = self.skill_manager.get_relevant_skills(
|
|
483
|
+
subtask["description"],
|
|
484
|
+
top_k=1
|
|
485
|
+
)[0]
|
|
486
|
+
|
|
487
|
+
# Load skill
|
|
488
|
+
skill = self.skill_manager.load_skill(relevant_skill)
|
|
489
|
+
|
|
490
|
+
# Execute with skill context
|
|
491
|
+
result = self._execute_with_skill(subtask, skill)
|
|
492
|
+
results.append(result)
|
|
493
|
+
|
|
494
|
+
# Step 3: Synthesize
|
|
495
|
+
return self._synthesize_results(complex_task, results)
|
|
496
|
+
|
|
497
|
+
def _breakdown_task(self, task: str) -> List[Dict]:
|
|
498
|
+
"""Use LLM to break task into subtasks"""
|
|
499
|
+
|
|
500
|
+
prompt = f"""
|
|
501
|
+
Break down the following task into subtasks:
|
|
502
|
+
{task}
|
|
503
|
+
|
|
504
|
+
Return as JSON list:
|
|
505
|
+
[
|
|
506
|
+
{{"description": "...", "type": "frontend/backend/testing/docs"}},
|
|
507
|
+
...
|
|
508
|
+
]
|
|
509
|
+
"""
|
|
510
|
+
|
|
511
|
+
response = self._llm_call(prompt)
|
|
512
|
+
return json.loads(response)
|
|
513
|
+
|
|
514
|
+
def _execute_with_skill(self, subtask: Dict, skill: Skill) -> str:
|
|
515
|
+
"""Execute subtask with skill context"""
|
|
516
|
+
|
|
517
|
+
prompt = f"""
|
|
518
|
+
Subtask: {subtask['description']}
|
|
519
|
+
|
|
520
|
+
Skill Context:
|
|
521
|
+
{skill.content}
|
|
522
|
+
|
|
523
|
+
Complete the subtask following the skill's guidance.
|
|
524
|
+
"""
|
|
525
|
+
|
|
526
|
+
return self._llm_call(prompt)
|
|
527
|
+
|
|
528
|
+
def _synthesize_results(self, original_task: str, results: List[str]) -> str:
|
|
529
|
+
"""Synthesize worker results into final output"""
|
|
530
|
+
|
|
531
|
+
prompt = f"""
|
|
532
|
+
Original Task: {original_task}
|
|
533
|
+
|
|
534
|
+
Worker Results:
|
|
535
|
+
{json.dumps(results, indent=2)}
|
|
536
|
+
|
|
537
|
+
Synthesize these results into a coherent response.
|
|
538
|
+
"""
|
|
539
|
+
|
|
540
|
+
return self._llm_call(prompt)
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
---
|
|
544
|
+
|
|
545
|
+
## Part 5: Simplified Memory (If Needed)
|
|
546
|
+
|
|
547
|
+
### Do You Really Need Persistent Memory?
|
|
548
|
+
|
|
549
|
+
**Anthropic's guidance:** Probably not for most use cases.
|
|
550
|
+
|
|
551
|
+
**When you DO need memory:**
|
|
552
|
+
- Long-running projects
|
|
553
|
+
- Multi-session work
|
|
554
|
+
- Learning from patterns
|
|
555
|
+
|
|
556
|
+
### Simple Memory Approach (Not Complex Hierarchy)
|
|
557
|
+
|
|
558
|
+
```python
|
|
559
|
+
# File: src/memory/simple_memory.py
|
|
560
|
+
|
|
561
|
+
class SimpleProjectMemory:
|
|
562
|
+
"""
|
|
563
|
+
Simplified memory system aligned with Anthropic's principles.
|
|
564
|
+
No complex hierarchies - just project-level context.
|
|
565
|
+
"""
|
|
566
|
+
|
|
567
|
+
def __init__(self, project_dir: str):
|
|
568
|
+
self.project_dir = Path(project_dir)
|
|
569
|
+
self.memory_file = self.project_dir / ".tmlpd-memory.json"
|
|
570
|
+
|
|
571
|
+
self.memory = self._load_memory()
|
|
572
|
+
|
|
573
|
+
def _load_memory(self) -> Dict:
|
|
574
|
+
"""Load project memory"""
|
|
575
|
+
|
|
576
|
+
if not self.memory_file.exists():
|
|
577
|
+
return {
|
|
578
|
+
"project_context": "",
|
|
579
|
+
"successful_patterns": [],
|
|
580
|
+
"common_issues": [],
|
|
581
|
+
"decisions": []
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
with open(self.memory_file, "r") as f:
|
|
585
|
+
return json.load(f)
|
|
586
|
+
|
|
587
|
+
def save_memory(self):
|
|
588
|
+
"""Save project memory"""
|
|
589
|
+
|
|
590
|
+
with open(self.memory_file, "w") as f:
|
|
591
|
+
json.dump(self.memory, f, indent=2)
|
|
592
|
+
|
|
593
|
+
def remember_success(self, pattern: str, context: str):
|
|
594
|
+
"""Remember a successful pattern"""
|
|
595
|
+
|
|
596
|
+
self.memory["successful_patterns"].append({
|
|
597
|
+
"pattern": pattern,
|
|
598
|
+
"context": context,
|
|
599
|
+
"timestamp": datetime.now().isoformat()
|
|
600
|
+
})
|
|
601
|
+
|
|
602
|
+
self.save_memory()
|
|
603
|
+
|
|
604
|
+
def recall_similar(self, current_task: str) -> List[Dict]:
|
|
605
|
+
"""Recall similar successful patterns"""
|
|
606
|
+
|
|
607
|
+
# Simple keyword matching (can upgrade to semantic search)
|
|
608
|
+
current_lower = current_task.lower()
|
|
609
|
+
similar = []
|
|
610
|
+
|
|
611
|
+
for pattern in self.memory["successful_patterns"]:
|
|
612
|
+
pattern_lower = pattern["pattern"].lower()
|
|
613
|
+
|
|
614
|
+
# Check for keyword overlap
|
|
615
|
+
if any(word in pattern_lower for word in current_lower.split()):
|
|
616
|
+
similar.append(pattern)
|
|
617
|
+
|
|
618
|
+
return similar[:5] # Return top 5
|
|
619
|
+
|
|
620
|
+
def get_context_string(self) -> str:
|
|
621
|
+
"""Get context for LLM prompt"""
|
|
622
|
+
|
|
623
|
+
parts = []
|
|
624
|
+
|
|
625
|
+
if self.memory["project_context"]:
|
|
626
|
+
parts.append(f"## Project Context\n{self.memory['project_context']}")
|
|
627
|
+
|
|
628
|
+
if self.memory["successful_patterns"]:
|
|
629
|
+
parts.append("## Successful Patterns")
|
|
630
|
+
for pattern in self.memory["successful_patterns"][-5:]:
|
|
631
|
+
parts.append(f"- {pattern['pattern']}")
|
|
632
|
+
|
|
633
|
+
return "\n\n".join(parts)
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
**This is SIMPLE** - just a JSON file with project learning. No vector databases, no complex hierarchies.
|
|
637
|
+
|
|
638
|
+
---
|
|
639
|
+
|
|
640
|
+
## Part 6: Enhanced Checkpointing (Simplified)
|
|
641
|
+
|
|
642
|
+
### From LangGraph-Inspired to Simpler Approach
|
|
643
|
+
|
|
644
|
+
```python
|
|
645
|
+
# File: src/state/simple_checkpoint.py
|
|
646
|
+
|
|
647
|
+
class SimpleCheckpoint:
|
|
648
|
+
"""
|
|
649
|
+
Simplified checkpointing following Anthropic's principles.
|
|
650
|
+
No complex versioning - just save state for recovery.
|
|
651
|
+
"""
|
|
652
|
+
|
|
653
|
+
def __init__(self, project_dir: str):
|
|
654
|
+
self.checkpoint_dir = Path(project_dir) / ".tmlpd-checkpoints"
|
|
655
|
+
self.checkpoint_dir.mkdir(exist_ok=True)
|
|
656
|
+
|
|
657
|
+
def save_checkpoint(self, task_id: str, state: Dict):
|
|
658
|
+
"""Save task state"""
|
|
659
|
+
|
|
660
|
+
checkpoint_file = self.checkpoint_dir / f"{task_id}.json"
|
|
661
|
+
|
|
662
|
+
with open(checkpoint_file, "w") as f:
|
|
663
|
+
json.dump({
|
|
664
|
+
"task_id": task_id,
|
|
665
|
+
"state": state,
|
|
666
|
+
"timestamp": datetime.now().isoformat()
|
|
667
|
+
}, f, indent=2)
|
|
668
|
+
|
|
669
|
+
def load_checkpoint(self, task_id: str) -> Optional[Dict]:
|
|
670
|
+
"""Load task state"""
|
|
671
|
+
|
|
672
|
+
checkpoint_file = self.checkpoint_dir / f"{task_id}.json"
|
|
673
|
+
|
|
674
|
+
if not checkpoint_file.exists():
|
|
675
|
+
return None
|
|
676
|
+
|
|
677
|
+
with open(checkpoint_file, "r") as f:
|
|
678
|
+
data = json.load(f)
|
|
679
|
+
return data["state"]
|
|
680
|
+
|
|
681
|
+
def list_checkpoints(self) -> List[str]:
|
|
682
|
+
"""List all available checkpoints"""
|
|
683
|
+
|
|
684
|
+
return [
|
|
685
|
+
f.stem for f in self.checkpoint_dir.glob("*.json")
|
|
686
|
+
]
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
---
|
|
690
|
+
|
|
691
|
+
## Part 7: Revised YAML Config
|
|
692
|
+
|
|
693
|
+
### TMLPD v2.0 Config (Skills-Based)
|
|
694
|
+
|
|
695
|
+
```yaml
|
|
696
|
+
# tmlpd-v2.yml
|
|
697
|
+
|
|
698
|
+
deployment:
|
|
699
|
+
name: "Full-Stack Development with Skills"
|
|
700
|
+
|
|
701
|
+
# v1.0: Still works
|
|
702
|
+
agents:
|
|
703
|
+
- id: "frontend"
|
|
704
|
+
provider: "anthropic"
|
|
705
|
+
model: "claude-sonnet-4"
|
|
706
|
+
focus: "UI components"
|
|
707
|
+
|
|
708
|
+
- id: "backend"
|
|
709
|
+
provider: "openai"
|
|
710
|
+
model: "gpt-4-turbo"
|
|
711
|
+
focus: "API endpoints"
|
|
712
|
+
|
|
713
|
+
# v2.0 NEW: Skills integration
|
|
714
|
+
skills:
|
|
715
|
+
enabled: true
|
|
716
|
+
directory: "tmlpd-skills"
|
|
717
|
+
|
|
718
|
+
# Auto-discover and load relevant skills
|
|
719
|
+
auto_load: true
|
|
720
|
+
|
|
721
|
+
# Progressive disclosure
|
|
722
|
+
load_on_demand: true # Load SKILL.md only when relevant
|
|
723
|
+
|
|
724
|
+
# Skills to use per agent
|
|
725
|
+
agent_skills:
|
|
726
|
+
frontend:
|
|
727
|
+
- "React Frontend Development"
|
|
728
|
+
- "TypeScript Best Practices"
|
|
729
|
+
- "CSS-Styled Components"
|
|
730
|
+
|
|
731
|
+
backend:
|
|
732
|
+
- "Node.js API Development"
|
|
733
|
+
- "Database Modeling"
|
|
734
|
+
- "API Testing"
|
|
735
|
+
|
|
736
|
+
testing:
|
|
737
|
+
- "Jest Testing Framework"
|
|
738
|
+
- "Test-Driven Development"
|
|
739
|
+
|
|
740
|
+
# v2.0 NEW: Workflows (instead of complex orchestration)
|
|
741
|
+
workflows:
|
|
742
|
+
enabled: true
|
|
743
|
+
|
|
744
|
+
# Routing workflow
|
|
745
|
+
routing:
|
|
746
|
+
enabled: true
|
|
747
|
+
# Route tasks to appropriate agents based on type
|
|
748
|
+
|
|
749
|
+
# Parallelization workflow (already in v1.0)
|
|
750
|
+
parallelization:
|
|
751
|
+
enabled: true
|
|
752
|
+
max_parallel_tasks: 4
|
|
753
|
+
|
|
754
|
+
# Orchestrator-workers (for complex tasks only)
|
|
755
|
+
orchestrator:
|
|
756
|
+
enabled: false # Only enable for truly complex tasks
|
|
757
|
+
max_subtasks: 10
|
|
758
|
+
|
|
759
|
+
# v2.0 NEW: Simple project memory (no complex hierarchy)
|
|
760
|
+
memory:
|
|
761
|
+
enabled: true
|
|
762
|
+
type: "simple" # Options: "simple" | "none"
|
|
763
|
+
|
|
764
|
+
storage:
|
|
765
|
+
type: "file" # Options: "file" | "redis"
|
|
766
|
+
|
|
767
|
+
retention:
|
|
768
|
+
successful_patterns: 50 # Remember last 50 successful patterns
|
|
769
|
+
decisions: 20 # Remember last 20 decisions
|
|
770
|
+
|
|
771
|
+
# v2.0 NEW: Checkpointing (simplified)
|
|
772
|
+
checkpointing:
|
|
773
|
+
enabled: true
|
|
774
|
+
interval_minutes: 10
|
|
775
|
+
max_checkpoints: 5 # Keep last 5 checkpoints
|
|
776
|
+
```
|
|
777
|
+
|
|
778
|
+
---
|
|
779
|
+
|
|
780
|
+
## Part 8: Revised Implementation Roadmap
|
|
781
|
+
|
|
782
|
+
### Phase 1: Agent Skills (Weeks 1-4) ⭐ HIGHEST PRIORITY
|
|
783
|
+
|
|
784
|
+
**Why:** This is Anthropic's #1 recommendation for 2025.
|
|
785
|
+
|
|
786
|
+
- [ ] Implement `SkillManager` class
|
|
787
|
+
- [ ] Create SKILL.md format specification
|
|
788
|
+
- [ ] Build progressive disclosure system
|
|
789
|
+
- [ ] Create sample skills (frontend, backend, testing)
|
|
790
|
+
- [ ] Integrate with existing agents
|
|
791
|
+
- [ ] Add skill discovery system
|
|
792
|
+
|
|
793
|
+
**Deliverables:**
|
|
794
|
+
- Working Skills framework
|
|
795
|
+
- 5-10 example skills
|
|
796
|
+
- Documentation on creating skills
|
|
797
|
+
- Integration with YAML config
|
|
798
|
+
|
|
799
|
+
### Phase 2: Routing Workflow (Weeks 5-6)
|
|
800
|
+
|
|
801
|
+
**Why:** Simple workflow for predictable task classification.
|
|
802
|
+
|
|
803
|
+
- [ ] Implement `TaskRouter` class
|
|
804
|
+
- [ ] Add task classification (LLM-based or keyword)
|
|
805
|
+
- [ ] Route to relevant skills
|
|
806
|
+
- [ ] Add fallback to default skill
|
|
807
|
+
- [ ] Testing and validation
|
|
808
|
+
|
|
809
|
+
**Deliverables:**
|
|
810
|
+
- Working routing system
|
|
811
|
+
- Improved task-accuracy routing
|
|
812
|
+
- Performance benchmarks
|
|
813
|
+
|
|
814
|
+
### Phase 3: Simple Memory (Weeks 7-8)
|
|
815
|
+
|
|
816
|
+
**Why:** Project-level learning without complexity.
|
|
817
|
+
|
|
818
|
+
- [ ] Implement `SimpleProjectMemory` class
|
|
819
|
+
- [ ] Add JSON-based storage
|
|
820
|
+
- [ ] Remember successful patterns
|
|
821
|
+
- [ ] Recall similar patterns
|
|
822
|
+
- [ ] Integration with agents
|
|
823
|
+
|
|
824
|
+
**Deliverables:**
|
|
825
|
+
- Working memory system
|
|
826
|
+
- Pattern learning from past executions
|
|
827
|
+
- Documentation
|
|
828
|
+
|
|
829
|
+
### Phase 4: Enhanced Checkpointing (Weeks 9-10)
|
|
830
|
+
|
|
831
|
+
**Why:** Better state management for reliability.
|
|
832
|
+
|
|
833
|
+
- [ ] Implement `SimpleCheckpoint` class
|
|
834
|
+
- [ ] Add JSON-based checkpoints
|
|
835
|
+
- [ ] Automatic checkpoint saving
|
|
836
|
+
- [ ] Recovery from checkpoints
|
|
837
|
+
- [ ] Integration with existing system
|
|
838
|
+
|
|
839
|
+
**Deliverables:**
|
|
840
|
+
- Robust checkpointing
|
|
841
|
+
- Recovery functionality
|
|
842
|
+
- Testing
|
|
843
|
+
|
|
844
|
+
### Phase 5: Orchestrator-Workers (Weeks 11-12) - OPTIONAL
|
|
845
|
+
|
|
846
|
+
**Why:** Only for truly complex, unpredictable tasks.
|
|
847
|
+
|
|
848
|
+
- [ ] Implement `OrchestratorWorkflow` class
|
|
849
|
+
- [ ] LLM-based task breakdown
|
|
850
|
+
- [ ] Skill delegation
|
|
851
|
+
- [ ] Result synthesis
|
|
852
|
+
- [ ] Testing and validation
|
|
853
|
+
|
|
854
|
+
**Deliverables:**
|
|
855
|
+
- Working orchestrator system
|
|
856
|
+
- Documentation on when to use
|
|
857
|
+
- Performance benchmarks
|
|
858
|
+
|
|
859
|
+
**Decision Criteria:**
|
|
860
|
+
Only use orchestrator-workers if:
|
|
861
|
+
- Tasks are highly unpredictable
|
|
862
|
+
- Can't use parallelization (subtasks unknown)
|
|
863
|
+
- Need dynamic task breakdown
|
|
864
|
+
- Have budget for LLM costs
|
|
865
|
+
|
|
866
|
+
---
|
|
867
|
+
|
|
868
|
+
## Part 9: What NOT to Build (Important!)
|
|
869
|
+
|
|
870
|
+
Based on Anthropic's research, **avoid building:**
|
|
871
|
+
|
|
872
|
+
❌ **Complex Memory Hierarchies**
|
|
873
|
+
- Don't build 3-tier memory systems
|
|
874
|
+
- Don't use vector databases for simple projects
|
|
875
|
+
- Don't implement episodic memory unless necessary
|
|
876
|
+
- **Reason:** Most projects don't need this complexity
|
|
877
|
+
|
|
878
|
+
❌ **Cross-Agent Communication Protocols**
|
|
879
|
+
- Don't build message buses
|
|
880
|
+
- Don't implement agent-to-agent messaging
|
|
881
|
+
- Don't create shared memory spaces
|
|
882
|
+
- **Reason:** Workflows + Skills are simpler and more effective
|
|
883
|
+
|
|
884
|
+
❌ **Agentic RAG (Multi-Step)**
|
|
885
|
+
- Don't build multi-step retrieval loops
|
|
886
|
+
- Don't implement query reformulation
|
|
887
|
+
- Don't add sufficiency assessment
|
|
888
|
+
- **Reason:** Single-shot RAG is sufficient for most cases
|
|
889
|
+
|
|
890
|
+
❌ **Complex State Management**
|
|
891
|
+
- Don't build versioned state systems
|
|
892
|
+
- Don't implement rollback capabilities
|
|
893
|
+
- Don't create state diffing
|
|
894
|
+
- **Reason:** Simple JSON checkpoints are enough
|
|
895
|
+
|
|
896
|
+
❌ **Multi-Agent Orchestration Frameworks**
|
|
897
|
+
- Don't build frameworks for agent coordination
|
|
898
|
+
- Don't implement agent discovery protocols
|
|
899
|
+
- Don't create agent registries
|
|
900
|
+
- **Reason:** Workflows are predictable, simpler, and more effective
|
|
901
|
+
|
|
902
|
+
---
|
|
903
|
+
|
|
904
|
+
## Part 10: Decision Framework
|
|
905
|
+
|
|
906
|
+
### When to Use What
|
|
907
|
+
|
|
908
|
+
```
|
|
909
|
+
Task arrives
|
|
910
|
+
│
|
|
911
|
+
▼
|
|
912
|
+
Can single LLM call solve it?
|
|
913
|
+
│
|
|
914
|
+
├── YES → Use single LLM + Skills ✅
|
|
915
|
+
│
|
|
916
|
+
└── NO → Are subtasks predictable?
|
|
917
|
+
│
|
|
918
|
+
├── YES → Use WORKFLOW ✅
|
|
919
|
+
│ • Routing: Classify and route
|
|
920
|
+
│ • Parallelization: Independent tasks
|
|
921
|
+
│ • Chaining: Sequential steps
|
|
922
|
+
│ • Orchestrator-Workers: Dynamic breakdown
|
|
923
|
+
│
|
|
924
|
+
└── NO → Use simple AGENT ⚠️
|
|
925
|
+
(Only 5% of cases)
|
|
926
|
+
```
|
|
927
|
+
|
|
928
|
+
### Examples
|
|
929
|
+
|
|
930
|
+
**Single LLM + Skills:**
|
|
931
|
+
- "Build a React login form" → Use React skill
|
|
932
|
+
- "Write API tests" → Use Testing skill
|
|
933
|
+
- "Create documentation" → Use Docs skill
|
|
934
|
+
|
|
935
|
+
**Routing Workflow:**
|
|
936
|
+
- "Fix bug in authentication" → Route to backend skill
|
|
937
|
+
- "Add new UI feature" → Route to frontend skill
|
|
938
|
+
|
|
939
|
+
**Parallelization Workflow:**
|
|
940
|
+
- "Build CRUD app" → Frontend + Backend in parallel
|
|
941
|
+
- "Test all components" → Test files in parallel
|
|
942
|
+
|
|
943
|
+
**Orchestrator-Workers (Rare):**
|
|
944
|
+
- "Refactor entire codebase" → Break down, delegate, synthesize
|
|
945
|
+
- "Implement complex feature across 20 files" → Dynamic breakdown
|
|
946
|
+
|
|
947
|
+
---
|
|
948
|
+
|
|
949
|
+
## Part 11: Key Takeaways
|
|
950
|
+
|
|
951
|
+
### From Anthropic's Research:
|
|
952
|
+
|
|
953
|
+
1. **Simplicity > Complexity**
|
|
954
|
+
- Start with single LLM call
|
|
955
|
+
- Add workflows only when needed
|
|
956
|
+
- Use agents as last resort
|
|
957
|
+
|
|
958
|
+
2. **Skills > Agents**
|
|
959
|
+
- Build modular, composable skills
|
|
960
|
+
- Use progressive disclosure
|
|
961
|
+
- Share skills across projects
|
|
962
|
+
|
|
963
|
+
3. **Workflows > Orchestration**
|
|
964
|
+
- Use predefined patterns
|
|
965
|
+
- Keep it predictable
|
|
966
|
+
- Test and iterate
|
|
967
|
+
|
|
968
|
+
4. **Transparency > Magic**
|
|
969
|
+
- Show planning steps
|
|
970
|
+
- Make decisions explicit
|
|
971
|
+
- Debuggable system
|
|
972
|
+
|
|
973
|
+
### For TMLPD v2.0:
|
|
974
|
+
|
|
975
|
+
**DO:**
|
|
976
|
+
- ✅ Implement Agent Skills framework
|
|
977
|
+
- ✅ Add routing workflow
|
|
978
|
+
- ✅ Enhance parallelization workflow
|
|
979
|
+
- ✅ Simple project memory
|
|
980
|
+
- ✅ Better checkpointing
|
|
981
|
+
|
|
982
|
+
**DON'T:**
|
|
983
|
+
- ❌ Complex memory hierarchies
|
|
984
|
+
- ❌ Cross-agent communication
|
|
985
|
+
- ❌ Agentic RAG (multi-step)
|
|
986
|
+
- ❌ Complex state management
|
|
987
|
+
- ❌ Multi-agent orchestration
|
|
988
|
+
|
|
989
|
+
---
|
|
990
|
+
|
|
991
|
+
## Part 12: Research Sources
|
|
992
|
+
|
|
993
|
+
### Primary Sources (Anthropic):
|
|
994
|
+
|
|
995
|
+
1. **[Building Effective Agents](https://www.anthropic.com/research/building-effective-agents)** (Dec 19, 2024)
|
|
996
|
+
- Erik Schluntz, Barry Zhang
|
|
997
|
+
- Core principles: Simplicity, Transparency, ACI
|
|
998
|
+
|
|
999
|
+
2. **[Agent Skills](https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills)** (Dec 18, 2024)
|
|
1000
|
+
- Barry Zhang, Keith Lazuka, Mahesh Murag
|
|
1001
|
+
- Progressive disclosure, skill format
|
|
1002
|
+
|
|
1003
|
+
3. **[How We Build Effective Agents: Barry Zhang](https://www.youtube.com/watch?v=D7_ipDqhtwk)** (AI Engineer Summit 2025)
|
|
1004
|
+
- "Don't build agents, build skills instead"
|
|
1005
|
+
|
|
1006
|
+
4. **[LinkedIn: Building Effective Agents](https://www.linkedin.com/posts/barry-z_building-effective-agents-activity-7275576927984267264-Tpms)**
|
|
1007
|
+
- Discussion and insights
|
|
1008
|
+
|
|
1009
|
+
### Supporting Sources:
|
|
1010
|
+
|
|
1011
|
+
5. **[Architecting Multi-Agent Systems - Andrew Ng](https://www.youtube.com/watch?v=yi7doi-QGJI)** (Hypergrowth 2025)
|
|
1012
|
+
- Multi-agent patterns
|
|
1013
|
+
|
|
1014
|
+
6. **[AI Engineer World's Fair 2025](https://www.youtube.com/playlist?list=PLcfpQ4tk2k0WzqWDdWkN2DnZOhtYI9jyI)**
|
|
1015
|
+
- Latest agent engineering practices
|
|
1016
|
+
|
|
1017
|
+
7. **[LLM Agents in Production: Why Go](https://www.youtube.com/watch?v=3mvD_Ud7HLY)**
|
|
1018
|
+
- Production considerations
|
|
1019
|
+
|
|
1020
|
+
---
|
|
1021
|
+
|
|
1022
|
+
## Conclusion
|
|
1023
|
+
|
|
1024
|
+
The revised TMLPD v2.0 architecture:
|
|
1025
|
+
|
|
1026
|
+
1. **Focuses on Skills** (not complex agents)
|
|
1027
|
+
2. **Uses Workflows** (not orchestration frameworks)
|
|
1028
|
+
3. **Keeps it Simple** (following Anthropic's principles)
|
|
1029
|
+
4. **Adds Progressive Capability** (not premature complexity)
|
|
1030
|
+
|
|
1031
|
+
**Expected Impact:**
|
|
1032
|
+
- ✅ Faster implementation (simpler code)
|
|
1033
|
+
- ✅ Easier debugging (predictable patterns)
|
|
1034
|
+
- ✅ Better adoption (follows industry best practices)
|
|
1035
|
+
- ✅ Lower costs (fewer LLM calls)
|
|
1036
|
+
- ✅ More maintainable (less complexity)
|
|
1037
|
+
|
|
1038
|
+
**Key Insight:**
|
|
1039
|
+
> "Success isn't about building the most sophisticated system. It's about building the RIGHT system for your needs."
|
|
1040
|
+
> — Anthropic, Dec 2024
|
|
1041
|
+
|
|
1042
|
+
The "RIGHT" system for TMLPD is **Skills + Workflows**, not complex multi-agent orchestration.
|
|
1043
|
+
|
|
1044
|
+
---
|
|
1045
|
+
|
|
1046
|
+
**Next Steps:**
|
|
1047
|
+
1. Review and validate this approach
|
|
1048
|
+
2. Begin Phase 1: Agent Skills implementation
|
|
1049
|
+
3. Create sample skills for common tasks
|
|
1050
|
+
4. Test with real projects
|
|
1051
|
+
5. Gather feedback and iterate
|