apimem-tools-v1 · 17 commits ahead of mainget_subgoal 을 single-shot → multi-turn tool-using agent 로 refactor 완료. tool 3종: annotate_objects(GroundingDINO), track_objects(SAM2), save_keyframe(FIFO 5).tools=ALL_TOOLS, tool_choice="auto") 로 wiring. hard cap 8 calls/tick, keyframe 매 reasoning turn 자동 attach.tools_enabled flag 기본값 False → legacy path 와 byte-equivalent A/B 가능. P1 단위 테스트 8/8 PASS.현행 ApiMem (zero-shot Gemini πHL) 은 static frame 만 보고 swap motion 을 추적할 수 없어 VideoUnmaskSwap 류 task 에서 SR 4% 수준. LoRA-coord hybrid 도 64% 와의 격차 60pp. 가설: 모델이 능동적으로 (a) container 위치 annotation, (b) swap 중 추적, (c) milestone keyframe 저장을 할 수 있다면 swap reasoning 복원 가능.
P0/P1 (handoff 이전) 에서 SAM2 + GroundingDINO 로 swap motion sanity verified. 이번 phase 는 그 위에 multi-turn tool-using agent 를 wiring 해 production eval 직전까지 가져온 것.
tool_specs.py (commit 82db594)새 파일 88 LOC. OpenAI tools schema 3개 + ALL_TOOLS list. target_labels 선택형 + from_keyframe_idx 필수 + caption 필수로 schema-level guardrails.
api.py multi-turn refactor (4 commits)| Commit | 변경 내용 |
|---|---|
7fb7bae | eval.py Args: api_mem_tools_enabled / max_tool_calls=8 / max_keyframes=5 |
3baae41 | chore: 직전 세션 token-usage logging 8 lines 분리 commit (P2 mainline 과 안 섞이도록) |
381b2bc | predictor: get_subgoal(frames, full_frame_buffer=self._frame_buffer) 전달 (ApiMem + Hybrid 둘 다). api.py 는 kwarg shim 만 — commit 사이 green |
9d3426d | ApiMemModel.__init__ + start_new_episode: tools_enabled 일 때 ToolDispatcher lazy-init (episode_dir = save_dir) |
34ca959 | _get_subgoal_with_tools (~185 LOC): chat.completions.create(tools=ALL_TOOLS, tool_choice="auto") while-loop, tool_calls → _dispatch_tool → ToolDispatcher 라우팅 → tool message append → 모델이 final JSON 낼 때까지. budget 초과 시 "tool budget exhausted" 응답. 저장된 keyframes 매 turn 자동 attach |
2f6117a)새 TOOL_USE_GUIDANCE block (swap-style strategy: 1단계 annotate+save initial, 2단계 motion 의심 시 track+save post-swap, 3단계 budget=5 milestone 만). SYSTEM_PROMPT_WITH_MEMORY 가 Memory rules ↔ Coordinate grounding 사이에 interleave. GROUNDED_COORD_INFO 는 dual-mode 호환으로 압축 (legacy detected_objects 경로 + 새 annotate_objects 경로 둘 다 명시). 합성 prompt 5336 chars.
1328a0f)scripts/run_api_mem_one_episode.sh 에 7번째 positional TOOLS 추가. TOOLS=1 → --args.api-mem-tools-enabled 플래그 plumb. bash -n syntax OK.
| 항목 | 수치 |
|---|---|
| 새 commits (handoff 이후) | 7 |
| 새 파일 | tool_specs.py, progress log |
| api.py 변경 | +185 / -9 LOC |
| prompts/base.py 변경 | +45 / -17 LOC |
| Unit test pass rate | 8/8 (76.8s) — ApiMemModel/SAM2Tracker/GroundingDINODetector/ToolDispatcher |
| End-to-end production smoke | 미수행 — 2 GPU 요구 라 login 노드 §1 정책상 sbatch 강제 |
| Tool budget per tick | 8 calls hard cap |
| Keyframe budget | 5 FIFO |
| Expected sweep cost | $2-5 (GroundingDINO local) vs $5-10 원래 plan |
| Branch state | apimem-tools-v1 = main + 17 commits, clean working tree |
ApiMem 이 swap motion 을 능동적으로 추적·기억할 수 있는 agent shape 가 완성. tools_enabled flag 로 legacy 와 A/B compare 가능 (legacy 경로 byte-equivalent — 같은 prompt, 같은 detection, 같은 single-shot loop).
다음 sweep 결과가 핵심 가설 검증:
VideoUnmaskSwap 50 ep 전체 sweep 제출:
첫 ep 출력 모니터링: tail -f runs/api_mem_logs/VideoUnmaskSwap_tools_v1/client.log 에서 event=tool_round 가 나오는지 / annotate→save_keyframe 1턴 안에 처리되는지 / per-call prompt_tokens 으로 cost trajectory 추정.
sweep 종료 후 scripts/analyze_tool_calling.py — tool-call frequency / keyframe count / SR vs legacy 분석. result log claude/<date>/analysis-apimem_tools_v1.md.
gemini-2.5-flash (non-lite) escalate 필요 (단 thinking budget 위험성 — handoff §2).
_last_tool_image latch — annotate/track 직후만 save 가능. error "no recent annotate/track output to save" 가 self-correct 유도되도록 했지만 실측 필요.