parallel-subagent-batch-merge
3
总安装量
3
周安装量
#61953
全站排名
安装命令
npx skills add https://github.com/shimo4228/claude-code-learned-skills --skill parallel-subagent-batch-merge
Agent 安装分布
replit
3
openclaw
3
mcpjam
2
claude-code
2
windsurf
2
zencoder
2
Skill 文档
並åãµãã¨ã¼ã¸ã§ã³ãã®ãããçæã¨ãã«ããã©ã¼ããããã¼ã¸
Extracted: 2026-02-11 Context: Claude Code ã§å¤§éãã¼ã¿ã並åãµãã¨ã¼ã¸ã§ã³ãã§çæããåºåã1ã¤ã®ãã¡ã¤ã«ã«çµ±åããå ´é¢
Problem
Claude Code ã®ãµãã¨ã¼ã¸ã§ã³ãï¼Task toolï¼ã大é並åèµ·åããã¨ã以ä¸ã®åé¡ãçºçãã:
- åºåãã©ã¼ãããã®ä¸çµ±ä¸ â åãããã³ããã§ããã¨ã¼ã¸ã§ã³ããã¨ã«åºåæ§é ãç°ãªã
- è¾æ¸å:
{ "id": { ...data } } - ãªã¹ã+id:
[{ "id": "...", "data": {...} }] - ãªã¹ã+å¥å:
[{ "questionId": "...", "data": {...} }]
- è¾æ¸å:
- æ§æã¨ã©ã¼ã®æ··å
¥ â
:=ãtrailing comma çã® JSON æ§æã¨ã©ã¼ - åã®æºã â
relatedConceptsãstringã®ã¯ããarrayã§è¿ãç - ã³ã³ãã³ãéè¤ â åã説ææãè¤æ°é¸æè¢ã«ã³ãã¼ããã
Solution
1. ãããåå²: ãã«ãã¼ã¹ã¯ãªããã§å ¥åãæ¨æºå
# prepare_batches.py: å
¥åãã¼ã¿ã N ä»¶ãã¤ã®ããã¹ããã¡ã¤ã«ã«åå²
# â åãµãã¨ã¼ã¸ã§ã³ãã1ãã¡ã¤ã«ã ãèªãã°ãã
batches = [items[i:i+BATCH_SIZE] for i in range(0, len(items), BATCH_SIZE)]
- ããããµã¤ãº 20 ãå®ç¸¾ããï¼ã³ã³ããã¹ãçªã¨ã®å ¼ãåãï¼
- æçµãããã¯ç«¯æ°ã«ãªãã®ã§æ³¨æ
2. 並åèµ·å: å
¨ãããã run_in_background=true ã§åæèµ·å
# 21ããã Ã Sonnet subagent ãåæèµ·å
for batch in 1..21:
Task(subagent_type="general-purpose", model="sonnet",
run_in_background=true, prompt=f"Read batch_{batch}.txt ...")
- åºåå
ã
batch_XX_output.jsonã§åé¢ï¼æ¸ãè¾¼ã¿ç«¶åã®åé¿ï¼ - å ¨ã¨ã¼ã¸ã§ã³ãå®äºå¾ã«ãã¼ã¸
3. æ£è¦åãã¼ã¸: 3種ãã©ã¼ããããçµ±ä¸
def normalize_batch(batch_data):
"""è¾æ¸åã»ãªã¹ãåã©ã¡ãã§ã { id: data } ã«æ£è¦å"""
if isinstance(batch_data, dict):
return batch_data
elif isinstance(batch_data, list):
result = {}
for item in batch_data:
qid = item.get("id") or item.get("questionId")
data = item.get("enhancedExplanation", item)
result[qid] = data
return result
4. åä¿®æ£: æå¾ ããåã«å¼·å¶å¤æ
# relatedConcepts: String? ãªã®ã« array ã§è¿ã£ã¦ããå ´å
if isinstance(val, list):
val = "".join(val) if val else None
5. æ§æã¨ã©ã¼ä¿®æ£: JSON parse åã«æ¢ç¥ãã¿ã¼ã³ãç½®æ
raw = raw.replace(':="', ': "') # := â : ã®ã¿ã¤ãä¿®æ£
6. å質æ¤è¨¼: éè¤æ¤åº + èªåä¿®æ£
# contrastTable ã® point éè¤ãã§ãã¯
points = [e["point"] for e in contrast_table]
if len(set(points)) < len(points):
# â æåã§åºæããã¹ãã«å·®ãæ¿ã
Key Metrics (å®ç¸¾)
| é ç® | æ°å¤ |
|---|---|
| 対象ãã¼ã¿ | 408å |
| ãããæ° | 21ï¼20åÃ20 + 8åÃ1ï¼ |
| 並åã¨ã¼ã¸ã§ã³ã | 21ï¼å ¨åæèµ·åï¼ |
| ãã©ã¼ãããç¨®é¡ | 3種ï¼è¾æ¸14 / ãªã¹ã+id 2 / ãªã¹ã+questionId 5ï¼ |
| æ§æã¨ã©ã¼ | 1ä»¶ï¼batch_21: :=ï¼ |
| åã®æºã | 8ä»¶ï¼batch_21: relatedConcepts ãé åï¼ |
| ã³ã³ãã³ãéè¤ | 7åï¼contrastTable point éè¤ï¼ |
| æçµçµæ | å ¨408åãã¼ã¸æåãæ¤è¨¼ ALL GREEN |
When to Use
- Claude Code ã§ 50ä»¶ä»¥ä¸ ã®ãã¼ã¿ãæ§é åçæããã¨ã
- åé ç®ã ç¬ç« ãã¦ãã並åå¦çå¯è½ãªã¨ã
- åºåã JSON ã§ãã¹ãã¼ããæç¢ºãªã¨ã
claude-code-self-generation-over-api.mdã®å¤æã§ãClaude Code ç´æ¥çæãã鏿ããå¾ã®å®è¡ãã¿ã¼ã³
Gotcha: ãã¼åä¸çµ±ä¸ã®æ¤åºã¨æ£è¦å
LLMãããçæã§ã¯ãåããã£ã¼ã«ãã«å¯¾ãã¦ããããã¨ã«ç°ãªããã¼åãåºåãããï¼ä¾: choice / choiceLabel / optionï¼ã
æ¤åº
key_sets = set()
for item in data['items']:
for entry in item.get('nested', []):
key_sets.add(tuple(sorted(entry.keys())))
print(f'Unique key patterns: {len(key_sets)}')
for ks in sorted(key_sets):
print(f' {ks}')
æ£è¦å
for entry in item.get('nested', []):
normalized = {}
normalized['choice'] = entry.get('choice') or entry.get('choiceLabel') or entry.get('option', '')
normalized['point'] = entry.get('point') or entry.get('reason', '')
# ...
æ¤è¨¼
bad = [(item['id'], set(e.keys()))
for item in data['items']
for e in item.get('nested', [])
if set(e.keys()) != EXPECTED_KEYS]
assert not bad, f'Still inconsistent: {bad}'
Anti-patterns
- ããããµã¤ãºã大ããããï¼50+ï¼â ã¨ã¼ã¸ã§ã³ãã®ã³ã³ããã¹ãæ¶è²»ã§å質ä½ä¸
- ãã¼ã¸ã¹ã¯ãªãããç¹å®ãã©ã¼ãããã ãæ³å® â å¿ ãå ¨ãã©ã¼ãããã«å¯¾å¿ãã
- æ¤è¨¼ãªãã§ãã¼ã¸å®äºã¨ãã â
validateã¹ã¯ãªãããå¿ ãå®è¡ - éè¤ã¨ã©ã¼ãç¡è¦ãã â UIã§åãããã¹ãã並ã¶ã¨èããå質ä½ä¸
- ãã¼åä¸çµ±ä¸ãè¦éã â Swift Codableçã®å³æ ¼ãªãã³ã¼ãã§å³åº§ã«ã¯ã©ãã·ã¥