import asyncio, json, shutil, sys
from pathlib import Path
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions, AssistantMessage, ToolUseBlock, ResultMessage
ROOT=Path("/tmp/exp-slide"); MAT=ROOT/"materials2"; OUT=ROOT/"runs2"
MODELS={"haiku":"claude-haiku-4-5-20251001","sonnet":"claude-sonnet-5-5","opus":"claude-opus-5-5"}
PROMPT=("同じフォルダの monthly.csv（地域別の月次売上、単位は百万円）をもとに、経営会議の詳細付録スライドを4枚作ってください。"
        "次の数字を含めます。\n"
        "1. 月別の全地域合計（4月〜9月）\n2. 月別合計の前月比（%、5月〜9月）\n3. Q2の地域別売上と、全体に占める構成比（%）\n4. 地域別のQ1→Q2の増加額と増加率（%）、および全体の増加額と増加率（%）\n"
        "Marp形式のMarkdownで、slides.md に保存します。スライドは --- で区切ります。")
TOOLS={"mental":["Read","Write"],"code":["Read","Write","Bash"]}
def opts(cwd,model,cond):
    return ClaudeAgentOptions(model=MODELS[model],cwd=str(cwd),tools=TOOLS[cond],allowed_tools=TOOLS[cond],setting_sources=[],
        extra_args={"strict-mcp-config":None},permission_mode="bypassPermissions",max_turns=30)
async def one(cond,model,i,sem):
    async with sem:
        d=OUT/f"{model}-{cond}{i:02d}"
        if d.exists(): shutil.rmtree(d)
        d.mkdir(parents=True)
        for f in MAT.iterdir(): shutil.copy(f,d/f.name)
        log=[]
        try:
            async with ClaudeSDKClient(opts(d,model,cond)) as c:
                await c.query(PROMPT)
                async for m in c.receive_response():
                    if isinstance(m,AssistantMessage):
                        for b in m.content:
                            if isinstance(b,ToolUseBlock): log.append({"tool":b.name,"input":b.input})
                    elif isinstance(m,ResultMessage): log.append({"result":{"cost":m.total_cost_usd}})
        except Exception as ex: print("FAIL",cond,model,i,repr(ex))
        (d/"log.json").write_text(json.dumps(log,ensure_ascii=False,indent=1))
        print("done",cond,model,i,flush=True)
async def main():
    sem=asyncio.Semaphore(18)
    await asyncio.gather(*[one(c,m,i,sem) for m in ["haiku","sonnet","opus"] for c in TOOLS for i in range(10)])
asyncio.run(main())
