[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-qwen-qwen-mm-plugins-omni-memory":3,"mdc--uu0c5d-key":40,"related-org-qwen-qwen-mm-plugins-omni-memory":2746,"related-repo-qwen-qwen-mm-plugins-omni-memory":2929},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":29,"repoUrl":30,"updatedAt":31,"license":32,"forks":33,"topics":34,"repo":35,"sourceUrl":38,"mdContent":39},"qwen-mm-plugins-omni-memory","build and query persistent audio-visual memory","Build and query persistent stateful audio-visual memory for long videos, including people, speaker-attributed dialogue, paralinguistics, non-speech sound, events, semantic facts, and selective source-clip replay.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"qwen","Qwen","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fqwen.png","QwenLM",[13,17,20,23,26],{"name":14,"slug":15,"type":16},"AI","ai","tag",{"name":18,"slug":19,"type":16},"Memory","memory",{"name":21,"slug":22,"type":16},"Multimodal","multimodal",{"name":24,"slug":25,"type":16},"Audio","audio",{"name":27,"slug":28,"type":16},"Video","video",54,"https:\u002F\u002Fgithub.com\u002FQwenLM\u002FQwen-MM-Plugins","2026-09-04T08:00:05.156968",null,0,[],{"repoUrl":30,"stars":29,"forks":33,"topics":36,"description":37},[],"Make any agent harness multimodal-native.","https:\u002F\u002Fgithub.com\u002FQwenLM\u002FQwen-MM-Plugins\u002Ftree\u002FHEAD\u002Fsrc\u002Fcapabilities\u002Fomni-memory\u002Fskill","---\nname: qwen-mm-plugins-omni-memory\ndescription: \"Build and query persistent stateful audio-visual memory for long videos, including people, speaker-attributed dialogue, paralinguistics, non-speech sound, events, semantic facts, and selective source-clip replay.\"\n---\n\n# Omni Memory — Joint Audio-Visual Memory for Long Videos\n\nCheck the `qwen-mm-plugins-omni-memory` tools in your tool list for full schemas and parameters.\n\n## First decide whether this video needs a memory at all\n\nBuilding one costs an omni call per 30s window, so over a short video it spends N calls indexing what\nfits in a single request. Decide by length, and by whether the user wants a memory.\n\n**How you learn the length: `get_memory_status(video_path=...)`.** It reports `duration_min` for the source video even when no memory exists, and its `next_step` already applies the table below — so the call you had to make anyway also answers this. (It reads the file with ffprobe; if that is unavailable the field is absent and building is the safe default.)\n\n| Length | What to do |\n|---|---|\n| **under ~10 min** | `watch_and_answer(video_path, question)` — no memory, one call, done |\n| **~10–30 min** | build a memory, *unless* the user has said they do not want one and just wants a quick answer — then `watch_and_answer` |\n| **over ~30 min** | **build a memory. No exceptions.** One request cannot hold that much video, so a watch will fail rather than answer badly |\n\nTwo things that override the table:\n\n- **Several questions about the same video → build the memory**, even a short one. A watch is stateless:\n  every question re-uploads and re-watches, while a memory is paid for once and then answers for free.\n  One question is cheaper as a watch; a conversation is cheaper as a memory.\n- **A memory already exists → use it.** `watch_and_answer` re-uploads the video and sees only what is\n  in it; the memory already holds every utterance with its speaker, and answers in milliseconds.\n\nIf a watch cannot get through, its result says so explicitly: `fallback: \"build_memory\"` plus the exact\ncommand. Run that and continue with the flow below. When the failure is throttling or a misconfigured\nendpoint there is no `fallback` field — retry or fix the configuration instead, because a build would\nhit the very same wall.\n\n## General Workflow\n\nEverything below is the memory path. Memory must exist before you can query it. **When a user asks about an audio-video, you are the one who retrieves memory and answers** — every tool here returns evidence, not an answer.\n\n1. `get_memory_status(video_path=...)` — **always start here.** It reports one of:\n   - `exists: false` → also carries `duration_min`, and a `next_step` that applies the routing table\n     above: short enough to watch instead, or build it (see \"Building memory\")\n   - `exists: true, complete: true` → query it\n   - `exists: true, complete: false` → **truncated.** Its answers cannot be trusted. An interrupted\n     build still finalizes the library, so it looks normal otherwise; continue it with `--mode resume`\n2. Query it (see \"Retrieval workflow\")\n3. Answer from what you retrieved. The record already carries the audio's content — every utterance\n   with its speaker, how it was said, and the non-speech sound around it — so this is where most\n   questions end.\n\n`replay_and_answer` is not step 4. It is an exception off the side of this flow, taken only when you can\nname a specific thing the record does not contain — and it re-watches only the few clips you name, so on\neverything else it knows less about the video than the memory does.\n\n## The Memory Layout\n\nFour retrievable containers plus the clip files, filled by one pass over the video:\n\n```\nEntities     canonical people: person_id, resolved name, appearance, attributes\nSemantic     induced facts as keyed triples, e.g. David\u002Frole → \"…\"      ← by EXACT key\nEpisodic     one record per 30s window: visual caption + every utterance\n             with its speaker_id, paralinguistics, acoustic events        ← by hybrid search\nScene env    durable environment\u002Flayout items, recalled on demand\nClips        the 30s files themselves, so an answer can re-watch the source\n```\n\nThree properties drive how you retrieve:\n\n- **`person_id` (`P001`, `P002`, …) is stable for the whole video.** Names are inferred separately by\n  reading the accumulated transcript, so a person may be `P003` with `name: null` until someone\n  addresses them by name — expected, not a failure. For those people, `get_memory_overview` carries\n  `also_heard_as` (the names they were heard called, e.g. `P003 also_heard_as [\"Dara\"]`); that is how\n  you map a name the user says onto an anonymous id.\n- **Semantic keys are an exact lookup, not a search.** Keys are built from the resolved *name*\n  (`David\u002Fprefers\u002Ftransport`). `get_memory_overview` gives you the complete directory, so you pick\n  from it rather than guessing — a key that does not exist simply returns nothing. Note which way round\n  this goes: the container named **Semantic** is the one reached by key, while hybrid search is what\n  reaches **Episodic**. To find a fact by its content instead of its key, use `search_facts(query=…)` —\n  a separate tool, not something a plan can do.\n- **Environment items are on demand, not resident.** Recalling them for every question measured\n  net-negative, so `include_scene` is a deliberate pick for \"where is X\" questions.\n\n## Building memory\n\n`build_memory\u002F` runs through Bash with the system Python, outside the MCP server's `uvx`\nenvironment. It requires Python 3.10+, `pip`, `ffmpeg`\u002F`ffprobe`, and `DASHSCOPE_API_KEY`; missing\nPython packages (`numpy\u003C3`, `openai`) are installed automatically. Run\n`qwen-mm-plugins-omni-memory --check-system` before building.\n\n```bash\n# one video → memory next to it, at \u003Cvideo>.memory\u002F\npython3 script\u002Fbuild_memory\u002Fbuild_memory.py \u002Fpath\u002Fto\u002Fvideo.mp4 --model qwen3.5-omni-plus\n\n# many videos → independent per-video memories, in parallel\npython3 script\u002Fbuild_memory\u002Fbuild_memory.py --video-dir \u002Fpath\u002Fto\u002Fdir -j 4 --model qwen3.5-omni-plus\n\npython3 script\u002Fbuild_memory\u002Fbuild_memory.py \u002Fpath\u002Fto\u002Fvideo.mp4 --mode rebuild  # discard and start over\n```\n\n`--model` is the omni model all three build stages use — per-clip extraction, semantic induction and\nname alignment. It defaults to `qwen3.5-omni-plus` (or `$QWEN_MM_API_OMNI_MODEL` if set), so it can\nbe omitted; name it explicitly when you want the record to say which model produced the memory. The\nendpoint comes from `DASHSCOPE_BASE_URL`, or DashScope's default host when it is unset.\n\nThe script writes its own log next to the memory (`build_\u003Ctimestamp>.log`, overridable with `--log`)\nand prints the model, endpoint and log path on startup, so there is nothing to redirect.\n\nPaths above are relative to this Skill directory. Everything the build needs is inside\n`script\u002Fbuild_memory\u002F` — it imports nothing from the MCP server's package, so it runs the same whether\nthat package is installed or not.\n\n### Streaming several videos into one memory\n\nGive the same `--namespace` to several videos and they become **one continuous memory**:\n\n```bash\npython3 script\u002Fbuild_memory\u002Fbuild_memory.py --video-dir \u002Fpath\u002Fto\u002Fsession --namespace my_stream\npython3 script\u002Fbuild_memory\u002Fbuild_memory.py next_part.mp4 --namespace my_stream --mode append\n```\n\nEach segment starts from the previous segment's state, so a person keeps the **same `person_id`**\nacross videos, semantic facts keep **accumulating and merging**, and timestamps are stitched end to\nend into one timeline. Use it when several files are really one recording session. Segments must be\ngiven in chronological order, run strictly serially (`-j` is ignored and reported), and a failed\nsegment stops the stream — later ones would start from missing state.\n\nBy default it lives at `\u003Cfirst-video-directory>\u002F\u003Cnamespace>\u002F`; query it with both `video_path` and\n`namespace`. Set `MEM_LOCAL_DIR` when you want a fixed shared library and namespace-only queries.\nVideos appended in separate commands must share a directory unless `MEM_LOCAL_DIR` is configured.\n\nRequirements: `ffmpeg`\u002F`ffprobe` on PATH and `DASHSCOPE_API_KEY`. Omni calls use\n`DASHSCOPE_BASE_URL` and `QWEN_MM_API_OMNI_MODEL` when configured.\n\n## Retrieval workflow\n\n### Step 1: pick an entry point by question type\n\n| Question type | Entry tool | Example |\n|---|---|---|\n| What one person said | `get_person_dialogue(person_id)` | \"What did David say about the budget?\" |\n| Who said something | `search_dialogue(query)` | \"Who offered to book a restaurant?\" |\n| Who these people are | `get_people` | \"Who is Allen? \u002F who is in this video?\" |\n| A stable fact or relationship | `search_facts(query \\| key_prefix \\| subject_id)` | \"What is Lucy's role?\" |\n| A specific time | `get_timeline(start_sec, end_sec)` → `get_moment` | \"What happens around 12:30?\" |\n| Full detail of known clips | `get_moment(idxs)` | — |\n| **Open-ended \u002F needs several kinds of evidence** | **`plan_and_search`** | \"What did they agree on in the end?\" |\n\nTargeted questions go straight to their tool — do not route everything through `plan_and_search`.\n\n### Step 2: orient, plan, search, answer\n\nFor the open-ended case, **you** are the planner. `plan_and_search` executes the plan you give it and\nnever answers. One search per question:\n\n```\n① orient — get_memory_overview\n   → people (person_id, name, appearance, also_heard_as)\n   → semantic_key_directory   ← the complete list of fact keys; you pick from it, never guess\n   → scene_env_available      ← a marker only; ask for the items via include_scene below\n\n② plan it yourself, then ONE search\n   plan_and_search(question=\"What did they agree on in the end?\",\n                   people=[\"P001\",\"P002\"],                    # from step ①\n                   fact_keys=[\"event:campaign\u002Fdecision\"],      # from the key directory\n                   queries=[\"two people settle on a plan\",     # descriptive statements\n                            \"someone agrees to a proposal\"],\n                   time_ranges=[[1500, 1800]],                 # only if time-bounded\n                   include_scene=False)                        # on only for \"where is X\"\n\n③ read the evidence and answer.\n   ↑ for most questions the flow ends here\n\n   ⤷ exception, only if you can name the specific unrecorded detail you need:\n     replay_and_answer(idxs=suggested_replay_idxs, question=...)\n```\n\nStep ① is not optional and not a probe: `fact_keys` is an exact lookup, so a plan that names no keys\ngets no facts at all. The directory is what makes the plan possible — get it first, then plan once.\nIt stays in your context for the rest of the conversation, so one call covers every later question\nabout the same video.\n\nIf a search comes back thin, re-plan and search again — but change the *axis* (name people, name keys,\nadd a time range) rather than rewording the same queries.\n\n### Decision flow\n\n```\nQuestion arrives\n  ├─ Short video (\u003C10 min), or user wants no memory (and it is \u003C30 min)?\n  │                                          → watch_and_answer — ends here, no memory involved\n  ├─ get_memory_status                       ← never skip; truncated libraries look fine\n  ├─ Names one person, asks what they said?  → get_person_dialogue\n  ├─ Asks who said something?                → search_dialogue\n  ├─ Asks about a fact \u002F role \u002F relation?    → search_facts\n  ├─ Names a time?                           → get_timeline → get_moment\n  └─ Open-ended?                             → get_memory_overview → plan → plan_and_search → answer\n                                                                                              ↑ ends here\n\nreplay_and_answer is not on this flow — see Usage Rules\n```\n\n## Tools Reference\n\n### Status and orientation\n\n**get_memory_status** — Does the memory exist, is it complete, and does this video need one?\n- Params: `video_path` or `namespace`\n- Returns: `exists`, `complete`, `clips`\u002F`episodic`\u002F`planned_clips`, `people`, `named_people`,\n  `semantic_facts`, `duration_sec`; `truncated` and `next_step` when incomplete\n- When `exists: false` it also reports the SOURCE video's `duration_sec` \u002F `duration_min` and a\n  `next_step` that applies the routing table at the top — this is where you learn whether the video is\n  short enough to answer with `watch_and_answer` instead of building anything\n- Use when: always, first. `complete: false` means the answers are not trustworthy.\n\n**get_memory_overview** — The vocabulary you plan with. **Read this before `plan_and_search`.**\n- Params: `video_path` or `namespace`\n- Returns: `people` (`person_id`, `name`, `appearance`, and `also_heard_as` for anyone still unnamed),\n  `semantic_key_directory` (complete), `scene_env_available`\n- Use when: before planning any open-ended retrieval. It costs one call and stays in your context for\n  every later question about the same video.\n- `scene_env_available` is a marker, not the items: pass `include_scene=True` to `plan_and_search`\n  when the question needs them\n\n### Answering an open-ended question\n\n**plan_and_search** — ONE retrieval from a plan you decide, fusing the containers. **Does not answer.**\n- Params: `question`, `people`, `fact_keys`, `queries`, `time_ranges`, `include_scene` (off by\n  default — turn it on for \"where is X\"), `top_k` (default 5)\n- Returns: `people`, `facts`, `moments` (briefs), `scene_env`, `evidence_text`,\n  `suggested_replay_idxs`, `plan_used`\n- `fact_keys` is an EXACT lookup — pick from `get_memory_overview`'s `semantic_key_directory`. Naming\n  no keys returns no facts; that is why the overview comes first\n- Query guide: `queries` take DESCRIPTIVE STATEMENTS, not questions\n  - Good: \"someone offers to bring an umbrella\"\n  - Bad: \"who brought an umbrella?\"\n  - Several short angles beat one long query — each contributes its own `top_k` recall\n  - These also decide `suggested_replay_idxs`, so describe what to look for\n\n**replay_and_answer** — Re-watch clips **with their audio** and have the omni model report what it sees.\n- Params: `question`, `idxs`, `evidence` (optional text context), `model` (optional omni model;\n  defaults to `qwen3.5-omni-plus`, and need not match the model the memory was built with)\n- Returns: `answer`, `watched_idxs`, `model`, `sent_mb`; `dropped_idxs` \u002F `missing_idxs` when applicable\n- It answers instead of returning evidence, because what it reads is in the video itself\n- Watches at most 3 clips per call (~3.5 MB each, inline) — every other clip stays invisible to it.\n  Extras come back in `dropped_idxs`\n- Use when: one **specific** detail the 30s record demonstrably lost — a fleeting object, a facial\n  expression, a count\n- **Not for what was said.** Every utterance is stored verbatim with its speaker and paralinguistics,\n  so `get_person_dialogue` \u002F `search_dialogue` \u002F `get_moment` answer wording questions better, and for\n  free\n\n### Answering without a memory\n\n**watch_and_answer** — Watch a SHORT video whole, in one call, with **no memory involved**.\n- Params: `video_path` (required — a source video, NOT a namespace), `question`, `model` (optional)\n- Returns: `answer`, `sent_mb`, `duration_sec`, `transcode_cached`, `model`\n- On failure: `error` + `failure` (`reject` \u002F `timeout` \u002F `empty` \u002F `rate` \u002F `config`). For the first\n  three it also carries `fallback: \"build_memory\"` and `next_step` — run that command, then use the\n  memory path. For `rate` (throttling) and `config` (wrong endpoint or key) there is deliberately **no**\n  `fallback`: a build runs against the same endpoint and would fail identically\n- Use when: the video is under ~10 min, or the user has said they do not want a memory built. See the\n  routing table at the top — over ~30 min this is not an option\n- The video is re-encoded once and that copy kept, so follow-ups skip the re-encode\n  (`transcode_cached: true`). The omni call is still paid every time, which is why several questions\n  are cheaper as a memory\n- It answers rather than returning evidence for the same reason `replay_and_answer` does — what it\n  reads is in the audio, which you cannot hear — but it sits **off** the retrieval flow, before there\n  is anything to retrieve\n\n### Direct access\n\n**get_people** — Full dossier for everyone, or one `person_id`.\n- Params: `person_id` (optional)\n- Returns: `person_id`, `name`, `appearance`, attributes, first\u002Flast appearance, clip indices\n- Use when: \"who are these people\", or you need one person's full record\n\n**get_person_dialogue** — **Every** line one person spoke, in order.\n- Params: `person_id` (optional — omit it for every speaker in time order), `start_sec`, `end_sec`, `limit`\n- Returns: `total` and the utterances with timestamps and paralinguistics\n- Use when: \"what did X say\" — this is exhaustive, where `plan_and_search` is top-k\n\n**get_timeline** — Moments in a time range, chronologically.\n- Params: `start_sec`, `end_sec` (`end_sec=0` means \"to the end\")\n- Returns: brief per moment — follow up with `get_moment` for detail\n- Use when: the question names a time and there is nothing to search for\n\n**get_moment** — Full detail for specific clips. **Most information-dense tool.**\n- Params: `idxs` (required)\n- Returns: full `visual_caption`, `scene_continuity`, `scene_env_update`, per-person actions, every\n  `utterance`, `acoustic_events`, and **`clip_path`**\n- Use when: a brief is not enough. `clip_path` is the 30s file on disk, should you have another tool\n  that can open it\n\n**search_dialogue** — Semantic search at the UTTERANCE level; every line comes back with its speaker.\n- Params: `query` (required), `top_k`\n- Use when: \"who said …\" — you know the content but not the person\n\n**search_facts** — Three ways into the semantic container.\n- Params: one of `query` (search statements by content), `key_prefix` (`\"David\u002F\"`, or a\n  `person_id` prefix, which is mapped for you), `subject_id`; plus `top_k`\n- Use when: you want facts by CONTENT rather than by exact key — `plan_and_search` cannot do this\n\n**search_memory** — Broad hybrid search across containers, with entity-anchored multi-hop.\n- Params: `query` (required), `top_k`\n- Use when: you know nothing about the library and want one wide net. `plan_and_search` is usually\n  the better entry point.\n\n## Usage Rules\n\n1. **On the memory path, never answer without checking status first** — a truncated library answers\n   confidently from half a video, and looks entirely normal while doing it. (`watch_and_answer` is not\n   on that path and needs no status check; it reads the video, not a library.)\n2. **The text memory is the answer path; replay is the exception.** Before reaching for it, you must be\n   able to name the specific thing you need that the record does not have. \"The record is only a\n   summary\" is not such a reason — a replay sees only the clips you name and nothing else, so a vague\n   replay returns a vaguer answer than the memory you already hold.\n3. **Stop when the open-ended path and a replay have both failed.** `get_memory_overview` →\n   `plan_and_search` → `replay_and_answer` is the deepest this memory goes; there is no further tool\n   that knows more. Do not go fishing through the others — say what the evidence did establish and\n   what it could not, and leave it there. More calls at that point produce a guess, not an answer.\n",{"data":41,"body":42},{"name":4,"description":6},{"type":43,"children":44},"root",[45,54,68,75,80,115,216,221,253,274,280,292,386,397,403,408,420,425,572,578,651,802,837,858,871,878,898,969,1001,1045,1085,1091,1097,1291,1302,1308,1327,1336,1349,1361,1367,1376,1382,1388,1398,1555,1575,1673,1679,1693,1873,1889,2036,2042,2057,2250,2256,2271,2312,2327,2385,2395,2439,2453,2529,2538,2563,2573,2635,2645,2675,2681,2740],{"type":46,"tag":47,"props":48,"children":50},"element","h1",{"id":49},"omni-memory-joint-audio-visual-memory-for-long-videos",[51],{"type":52,"value":53},"text","Omni Memory — Joint Audio-Visual Memory for Long Videos",{"type":46,"tag":55,"props":56,"children":57},"p",{},[58,60,66],{"type":52,"value":59},"Check the ",{"type":46,"tag":61,"props":62,"children":64},"code",{"className":63},[],[65],{"type":52,"value":4},{"type":52,"value":67}," tools in your tool list for full schemas and parameters.",{"type":46,"tag":69,"props":70,"children":72},"h2",{"id":71},"first-decide-whether-this-video-needs-a-memory-at-all",[73],{"type":52,"value":74},"First decide whether this video needs a memory at all",{"type":46,"tag":55,"props":76,"children":77},{},[78],{"type":52,"value":79},"Building one costs an omni call per 30s window, so over a short video it spends N calls indexing what\nfits in a single request. Decide by length, and by whether the user wants a memory.",{"type":46,"tag":55,"props":81,"children":82},{},[83,97,99,105,107,113],{"type":46,"tag":84,"props":85,"children":86},"strong",{},[87,89,95],{"type":52,"value":88},"How you learn the length: ",{"type":46,"tag":61,"props":90,"children":92},{"className":91},[],[93],{"type":52,"value":94},"get_memory_status(video_path=...)",{"type":52,"value":96},".",{"type":52,"value":98}," It reports ",{"type":46,"tag":61,"props":100,"children":102},{"className":101},[],[103],{"type":52,"value":104},"duration_min",{"type":52,"value":106}," for the source video even when no memory exists, and its ",{"type":46,"tag":61,"props":108,"children":110},{"className":109},[],[111],{"type":52,"value":112},"next_step",{"type":52,"value":114}," already applies the table below — so the call you had to make anyway also answers this. (It reads the file with ffprobe; if that is unavailable the field is absent and building is the safe default.)",{"type":46,"tag":116,"props":117,"children":118},"table",{},[119,138],{"type":46,"tag":120,"props":121,"children":122},"thead",{},[123],{"type":46,"tag":124,"props":125,"children":126},"tr",{},[127,133],{"type":46,"tag":128,"props":129,"children":130},"th",{},[131],{"type":52,"value":132},"Length",{"type":46,"tag":128,"props":134,"children":135},{},[136],{"type":52,"value":137},"What to do",{"type":46,"tag":139,"props":140,"children":141},"tbody",{},[142,165,195],{"type":46,"tag":124,"props":143,"children":144},{},[145,154],{"type":46,"tag":146,"props":147,"children":148},"td",{},[149],{"type":46,"tag":84,"props":150,"children":151},{},[152],{"type":52,"value":153},"under ~10 min",{"type":46,"tag":146,"props":155,"children":156},{},[157,163],{"type":46,"tag":61,"props":158,"children":160},{"className":159},[],[161],{"type":52,"value":162},"watch_and_answer(video_path, question)",{"type":52,"value":164}," — no memory, one call, done",{"type":46,"tag":124,"props":166,"children":167},{},[168,176],{"type":46,"tag":146,"props":169,"children":170},{},[171],{"type":46,"tag":84,"props":172,"children":173},{},[174],{"type":52,"value":175},"~10–30 min",{"type":46,"tag":146,"props":177,"children":178},{},[179,181,187,189],{"type":52,"value":180},"build a memory, ",{"type":46,"tag":182,"props":183,"children":184},"em",{},[185],{"type":52,"value":186},"unless",{"type":52,"value":188}," the user has said they do not want one and just wants a quick answer — then ",{"type":46,"tag":61,"props":190,"children":192},{"className":191},[],[193],{"type":52,"value":194},"watch_and_answer",{"type":46,"tag":124,"props":196,"children":197},{},[198,206],{"type":46,"tag":146,"props":199,"children":200},{},[201],{"type":46,"tag":84,"props":202,"children":203},{},[204],{"type":52,"value":205},"over ~30 min",{"type":46,"tag":146,"props":207,"children":208},{},[209,214],{"type":46,"tag":84,"props":210,"children":211},{},[212],{"type":52,"value":213},"build a memory. No exceptions.",{"type":52,"value":215}," One request cannot hold that much video, so a watch will fail rather than answer badly",{"type":46,"tag":55,"props":217,"children":218},{},[219],{"type":52,"value":220},"Two things that override the table:",{"type":46,"tag":222,"props":223,"children":224},"ul",{},[225,236],{"type":46,"tag":226,"props":227,"children":228},"li",{},[229,234],{"type":46,"tag":84,"props":230,"children":231},{},[232],{"type":52,"value":233},"Several questions about the same video → build the memory",{"type":52,"value":235},", even a short one. A watch is stateless:\nevery question re-uploads and re-watches, while a memory is paid for once and then answers for free.\nOne question is cheaper as a watch; a conversation is cheaper as a memory.",{"type":46,"tag":226,"props":237,"children":238},{},[239,244,246,251],{"type":46,"tag":84,"props":240,"children":241},{},[242],{"type":52,"value":243},"A memory already exists → use it.",{"type":52,"value":245}," ",{"type":46,"tag":61,"props":247,"children":249},{"className":248},[],[250],{"type":52,"value":194},{"type":52,"value":252}," re-uploads the video and sees only what is\nin it; the memory already holds every utterance with its speaker, and answers in milliseconds.",{"type":46,"tag":55,"props":254,"children":255},{},[256,258,264,266,272],{"type":52,"value":257},"If a watch cannot get through, its result says so explicitly: ",{"type":46,"tag":61,"props":259,"children":261},{"className":260},[],[262],{"type":52,"value":263},"fallback: \"build_memory\"",{"type":52,"value":265}," plus the exact\ncommand. Run that and continue with the flow below. When the failure is throttling or a misconfigured\nendpoint there is no ",{"type":46,"tag":61,"props":267,"children":269},{"className":268},[],[270],{"type":52,"value":271},"fallback",{"type":52,"value":273}," field — retry or fix the configuration instead, because a build would\nhit the very same wall.",{"type":46,"tag":69,"props":275,"children":277},{"id":276},"general-workflow",[278],{"type":52,"value":279},"General Workflow",{"type":46,"tag":55,"props":281,"children":282},{},[283,285,290],{"type":52,"value":284},"Everything below is the memory path. Memory must exist before you can query it. ",{"type":46,"tag":84,"props":286,"children":287},{},[288],{"type":52,"value":289},"When a user asks about an audio-video, you are the one who retrieves memory and answers",{"type":52,"value":291}," — every tool here returns evidence, not an answer.",{"type":46,"tag":293,"props":294,"children":295},"ol",{},[296,376,381],{"type":46,"tag":226,"props":297,"children":298},{},[299,304,306,311,313],{"type":46,"tag":61,"props":300,"children":302},{"className":301},[],[303],{"type":52,"value":94},{"type":52,"value":305}," — ",{"type":46,"tag":84,"props":307,"children":308},{},[309],{"type":52,"value":310},"always start here.",{"type":52,"value":312}," It reports one of:\n",{"type":46,"tag":222,"props":314,"children":315},{},[316,341,352],{"type":46,"tag":226,"props":317,"children":318},{},[319,325,327,332,334,339],{"type":46,"tag":61,"props":320,"children":322},{"className":321},[],[323],{"type":52,"value":324},"exists: false",{"type":52,"value":326}," → also carries ",{"type":46,"tag":61,"props":328,"children":330},{"className":329},[],[331],{"type":52,"value":104},{"type":52,"value":333},", and a ",{"type":46,"tag":61,"props":335,"children":337},{"className":336},[],[338],{"type":52,"value":112},{"type":52,"value":340}," that applies the routing table\nabove: short enough to watch instead, or build it (see \"Building memory\")",{"type":46,"tag":226,"props":342,"children":343},{},[344,350],{"type":46,"tag":61,"props":345,"children":347},{"className":346},[],[348],{"type":52,"value":349},"exists: true, complete: true",{"type":52,"value":351}," → query it",{"type":46,"tag":226,"props":353,"children":354},{},[355,361,363,368,370],{"type":46,"tag":61,"props":356,"children":358},{"className":357},[],[359],{"type":52,"value":360},"exists: true, complete: false",{"type":52,"value":362}," → ",{"type":46,"tag":84,"props":364,"children":365},{},[366],{"type":52,"value":367},"truncated.",{"type":52,"value":369}," Its answers cannot be trusted. An interrupted\nbuild still finalizes the library, so it looks normal otherwise; continue it with ",{"type":46,"tag":61,"props":371,"children":373},{"className":372},[],[374],{"type":52,"value":375},"--mode resume",{"type":46,"tag":226,"props":377,"children":378},{},[379],{"type":52,"value":380},"Query it (see \"Retrieval workflow\")",{"type":46,"tag":226,"props":382,"children":383},{},[384],{"type":52,"value":385},"Answer from what you retrieved. The record already carries the audio's content — every utterance\nwith its speaker, how it was said, and the non-speech sound around it — so this is where most\nquestions end.",{"type":46,"tag":55,"props":387,"children":388},{},[389,395],{"type":46,"tag":61,"props":390,"children":392},{"className":391},[],[393],{"type":52,"value":394},"replay_and_answer",{"type":52,"value":396}," is not step 4. It is an exception off the side of this flow, taken only when you can\nname a specific thing the record does not contain — and it re-watches only the few clips you name, so on\neverything else it knows less about the video than the memory does.",{"type":46,"tag":69,"props":398,"children":400},{"id":399},"the-memory-layout",[401],{"type":52,"value":402},"The Memory Layout",{"type":46,"tag":55,"props":404,"children":405},{},[406],{"type":52,"value":407},"Four retrievable containers plus the clip files, filled by one pass over the video:",{"type":46,"tag":409,"props":410,"children":414},"pre",{"className":411,"code":413,"language":52},[412],"language-text","Entities     canonical people: person_id, resolved name, appearance, attributes\nSemantic     induced facts as keyed triples, e.g. David\u002Frole → \"…\"      ← by EXACT key\nEpisodic     one record per 30s window: visual caption + every utterance\n             with its speaker_id, paralinguistics, acoustic events        ← by hybrid search\nScene env    durable environment\u002Flayout items, recalled on demand\nClips        the 30s files themselves, so an answer can re-watch the source\n",[415],{"type":46,"tag":61,"props":416,"children":418},{"__ignoreMap":417},"",[419],{"type":52,"value":413},{"type":46,"tag":55,"props":421,"children":422},{},[423],{"type":52,"value":424},"Three properties drive how you retrieve:",{"type":46,"tag":222,"props":426,"children":427},{},[428,500,554],{"type":46,"tag":226,"props":429,"children":430},{},[431,458,460,466,468,474,476,482,484,490,492,498],{"type":46,"tag":84,"props":432,"children":433},{},[434,440,442,448,450,456],{"type":46,"tag":61,"props":435,"children":437},{"className":436},[],[438],{"type":52,"value":439},"person_id",{"type":52,"value":441}," (",{"type":46,"tag":61,"props":443,"children":445},{"className":444},[],[446],{"type":52,"value":447},"P001",{"type":52,"value":449},", ",{"type":46,"tag":61,"props":451,"children":453},{"className":452},[],[454],{"type":52,"value":455},"P002",{"type":52,"value":457},", …) is stable for the whole video.",{"type":52,"value":459}," Names are inferred separately by\nreading the accumulated transcript, so a person may be ",{"type":46,"tag":61,"props":461,"children":463},{"className":462},[],[464],{"type":52,"value":465},"P003",{"type":52,"value":467}," with ",{"type":46,"tag":61,"props":469,"children":471},{"className":470},[],[472],{"type":52,"value":473},"name: null",{"type":52,"value":475}," until someone\naddresses them by name — expected, not a failure. For those people, ",{"type":46,"tag":61,"props":477,"children":479},{"className":478},[],[480],{"type":52,"value":481},"get_memory_overview",{"type":52,"value":483}," carries\n",{"type":46,"tag":61,"props":485,"children":487},{"className":486},[],[488],{"type":52,"value":489},"also_heard_as",{"type":52,"value":491}," (the names they were heard called, e.g. ",{"type":46,"tag":61,"props":493,"children":495},{"className":494},[],[496],{"type":52,"value":497},"P003 also_heard_as [\"Dara\"]",{"type":52,"value":499},"); that is how\nyou map a name the user says onto an anonymous id.",{"type":46,"tag":226,"props":501,"children":502},{},[503,508,510,515,517,523,525,530,532,537,539,544,546,552],{"type":46,"tag":84,"props":504,"children":505},{},[506],{"type":52,"value":507},"Semantic keys are an exact lookup, not a search.",{"type":52,"value":509}," Keys are built from the resolved ",{"type":46,"tag":182,"props":511,"children":512},{},[513],{"type":52,"value":514},"name",{"type":52,"value":516},"\n(",{"type":46,"tag":61,"props":518,"children":520},{"className":519},[],[521],{"type":52,"value":522},"David\u002Fprefers\u002Ftransport",{"type":52,"value":524},"). ",{"type":46,"tag":61,"props":526,"children":528},{"className":527},[],[529],{"type":52,"value":481},{"type":52,"value":531}," gives you the complete directory, so you pick\nfrom it rather than guessing — a key that does not exist simply returns nothing. Note which way round\nthis goes: the container named ",{"type":46,"tag":84,"props":533,"children":534},{},[535],{"type":52,"value":536},"Semantic",{"type":52,"value":538}," is the one reached by key, while hybrid search is what\nreaches ",{"type":46,"tag":84,"props":540,"children":541},{},[542],{"type":52,"value":543},"Episodic",{"type":52,"value":545},". To find a fact by its content instead of its key, use ",{"type":46,"tag":61,"props":547,"children":549},{"className":548},[],[550],{"type":52,"value":551},"search_facts(query=…)",{"type":52,"value":553}," —\na separate tool, not something a plan can do.",{"type":46,"tag":226,"props":555,"children":556},{},[557,562,564,570],{"type":46,"tag":84,"props":558,"children":559},{},[560],{"type":52,"value":561},"Environment items are on demand, not resident.",{"type":52,"value":563}," Recalling them for every question measured\nnet-negative, so ",{"type":46,"tag":61,"props":565,"children":567},{"className":566},[],[568],{"type":52,"value":569},"include_scene",{"type":52,"value":571}," is a deliberate pick for \"where is X\" questions.",{"type":46,"tag":69,"props":573,"children":575},{"id":574},"building-memory",[576],{"type":52,"value":577},"Building memory",{"type":46,"tag":55,"props":579,"children":580},{},[581,587,589,595,597,603,604,610,612,618,620,626,628,634,635,641,643,649],{"type":46,"tag":61,"props":582,"children":584},{"className":583},[],[585],{"type":52,"value":586},"build_memory\u002F",{"type":52,"value":588}," runs through Bash with the system Python, outside the MCP server's ",{"type":46,"tag":61,"props":590,"children":592},{"className":591},[],[593],{"type":52,"value":594},"uvx",{"type":52,"value":596},"\nenvironment. It requires Python 3.10+, ",{"type":46,"tag":61,"props":598,"children":600},{"className":599},[],[601],{"type":52,"value":602},"pip",{"type":52,"value":449},{"type":46,"tag":61,"props":605,"children":607},{"className":606},[],[608],{"type":52,"value":609},"ffmpeg",{"type":52,"value":611},"\u002F",{"type":46,"tag":61,"props":613,"children":615},{"className":614},[],[616],{"type":52,"value":617},"ffprobe",{"type":52,"value":619},", and ",{"type":46,"tag":61,"props":621,"children":623},{"className":622},[],[624],{"type":52,"value":625},"DASHSCOPE_API_KEY",{"type":52,"value":627},"; missing\nPython packages (",{"type":46,"tag":61,"props":629,"children":631},{"className":630},[],[632],{"type":52,"value":633},"numpy\u003C3",{"type":52,"value":449},{"type":46,"tag":61,"props":636,"children":638},{"className":637},[],[639],{"type":52,"value":640},"openai",{"type":52,"value":642},") are installed automatically. Run\n",{"type":46,"tag":61,"props":644,"children":646},{"className":645},[],[647],{"type":52,"value":648},"qwen-mm-plugins-omni-memory --check-system",{"type":52,"value":650}," before building.",{"type":46,"tag":409,"props":652,"children":656},{"className":653,"code":654,"language":655,"meta":417,"style":417},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# one video → memory next to it, at \u003Cvideo>.memory\u002F\npython3 script\u002Fbuild_memory\u002Fbuild_memory.py \u002Fpath\u002Fto\u002Fvideo.mp4 --model qwen3.5-omni-plus\n\n# many videos → independent per-video memories, in parallel\npython3 script\u002Fbuild_memory\u002Fbuild_memory.py --video-dir \u002Fpath\u002Fto\u002Fdir -j 4 --model qwen3.5-omni-plus\n\npython3 script\u002Fbuild_memory\u002Fbuild_memory.py \u002Fpath\u002Fto\u002Fvideo.mp4 --mode rebuild  # discard and start over\n","bash",[657],{"type":46,"tag":61,"props":658,"children":659},{"__ignoreMap":417},[660,672,703,713,722,763,771],{"type":46,"tag":661,"props":662,"children":665},"span",{"class":663,"line":664},"line",1,[666],{"type":46,"tag":661,"props":667,"children":669},{"style":668},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[670],{"type":52,"value":671},"# one video → memory next to it, at \u003Cvideo>.memory\u002F\n",{"type":46,"tag":661,"props":673,"children":675},{"class":663,"line":674},2,[676,682,688,693,698],{"type":46,"tag":661,"props":677,"children":679},{"style":678},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[680],{"type":52,"value":681},"python3",{"type":46,"tag":661,"props":683,"children":685},{"style":684},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[686],{"type":52,"value":687}," script\u002Fbuild_memory\u002Fbuild_memory.py",{"type":46,"tag":661,"props":689,"children":690},{"style":684},[691],{"type":52,"value":692}," \u002Fpath\u002Fto\u002Fvideo.mp4",{"type":46,"tag":661,"props":694,"children":695},{"style":684},[696],{"type":52,"value":697}," --model",{"type":46,"tag":661,"props":699,"children":700},{"style":684},[701],{"type":52,"value":702}," qwen3.5-omni-plus\n",{"type":46,"tag":661,"props":704,"children":706},{"class":663,"line":705},3,[707],{"type":46,"tag":661,"props":708,"children":710},{"emptyLinePlaceholder":709},true,[711],{"type":52,"value":712},"\n",{"type":46,"tag":661,"props":714,"children":716},{"class":663,"line":715},4,[717],{"type":46,"tag":661,"props":718,"children":719},{"style":668},[720],{"type":52,"value":721},"# many videos → independent per-video memories, in parallel\n",{"type":46,"tag":661,"props":723,"children":725},{"class":663,"line":724},5,[726,730,734,739,744,749,755,759],{"type":46,"tag":661,"props":727,"children":728},{"style":678},[729],{"type":52,"value":681},{"type":46,"tag":661,"props":731,"children":732},{"style":684},[733],{"type":52,"value":687},{"type":46,"tag":661,"props":735,"children":736},{"style":684},[737],{"type":52,"value":738}," --video-dir",{"type":46,"tag":661,"props":740,"children":741},{"style":684},[742],{"type":52,"value":743}," \u002Fpath\u002Fto\u002Fdir",{"type":46,"tag":661,"props":745,"children":746},{"style":684},[747],{"type":52,"value":748}," -j",{"type":46,"tag":661,"props":750,"children":752},{"style":751},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[753],{"type":52,"value":754}," 4",{"type":46,"tag":661,"props":756,"children":757},{"style":684},[758],{"type":52,"value":697},{"type":46,"tag":661,"props":760,"children":761},{"style":684},[762],{"type":52,"value":702},{"type":46,"tag":661,"props":764,"children":766},{"class":663,"line":765},6,[767],{"type":46,"tag":661,"props":768,"children":769},{"emptyLinePlaceholder":709},[770],{"type":52,"value":712},{"type":46,"tag":661,"props":772,"children":774},{"class":663,"line":773},7,[775,779,783,787,792,797],{"type":46,"tag":661,"props":776,"children":777},{"style":678},[778],{"type":52,"value":681},{"type":46,"tag":661,"props":780,"children":781},{"style":684},[782],{"type":52,"value":687},{"type":46,"tag":661,"props":784,"children":785},{"style":684},[786],{"type":52,"value":692},{"type":46,"tag":661,"props":788,"children":789},{"style":684},[790],{"type":52,"value":791}," --mode",{"type":46,"tag":661,"props":793,"children":794},{"style":684},[795],{"type":52,"value":796}," rebuild",{"type":46,"tag":661,"props":798,"children":799},{"style":668},[800],{"type":52,"value":801},"  # discard and start over\n",{"type":46,"tag":55,"props":803,"children":804},{},[805,811,813,819,821,827,829,835],{"type":46,"tag":61,"props":806,"children":808},{"className":807},[],[809],{"type":52,"value":810},"--model",{"type":52,"value":812}," is the omni model all three build stages use — per-clip extraction, semantic induction and\nname alignment. It defaults to ",{"type":46,"tag":61,"props":814,"children":816},{"className":815},[],[817],{"type":52,"value":818},"qwen3.5-omni-plus",{"type":52,"value":820}," (or ",{"type":46,"tag":61,"props":822,"children":824},{"className":823},[],[825],{"type":52,"value":826},"$QWEN_MM_API_OMNI_MODEL",{"type":52,"value":828}," if set), so it can\nbe omitted; name it explicitly when you want the record to say which model produced the memory. The\nendpoint comes from ",{"type":46,"tag":61,"props":830,"children":832},{"className":831},[],[833],{"type":52,"value":834},"DASHSCOPE_BASE_URL",{"type":52,"value":836},", or DashScope's default host when it is unset.",{"type":46,"tag":55,"props":838,"children":839},{},[840,842,848,850,856],{"type":52,"value":841},"The script writes its own log next to the memory (",{"type":46,"tag":61,"props":843,"children":845},{"className":844},[],[846],{"type":52,"value":847},"build_\u003Ctimestamp>.log",{"type":52,"value":849},", overridable with ",{"type":46,"tag":61,"props":851,"children":853},{"className":852},[],[854],{"type":52,"value":855},"--log",{"type":52,"value":857},")\nand prints the model, endpoint and log path on startup, so there is nothing to redirect.",{"type":46,"tag":55,"props":859,"children":860},{},[861,863,869],{"type":52,"value":862},"Paths above are relative to this Skill directory. Everything the build needs is inside\n",{"type":46,"tag":61,"props":864,"children":866},{"className":865},[],[867],{"type":52,"value":868},"script\u002Fbuild_memory\u002F",{"type":52,"value":870}," — it imports nothing from the MCP server's package, so it runs the same whether\nthat package is installed or not.",{"type":46,"tag":872,"props":873,"children":875},"h3",{"id":874},"streaming-several-videos-into-one-memory",[876],{"type":52,"value":877},"Streaming several videos into one memory",{"type":46,"tag":55,"props":879,"children":880},{},[881,883,889,891,896],{"type":52,"value":882},"Give the same ",{"type":46,"tag":61,"props":884,"children":886},{"className":885},[],[887],{"type":52,"value":888},"--namespace",{"type":52,"value":890}," to several videos and they become ",{"type":46,"tag":84,"props":892,"children":893},{},[894],{"type":52,"value":895},"one continuous memory",{"type":52,"value":897},":",{"type":46,"tag":409,"props":899,"children":901},{"className":653,"code":900,"language":655,"meta":417,"style":417},"python3 script\u002Fbuild_memory\u002Fbuild_memory.py --video-dir \u002Fpath\u002Fto\u002Fsession --namespace my_stream\npython3 script\u002Fbuild_memory\u002Fbuild_memory.py next_part.mp4 --namespace my_stream --mode append\n",[902],{"type":46,"tag":61,"props":903,"children":904},{"__ignoreMap":417},[905,935],{"type":46,"tag":661,"props":906,"children":907},{"class":663,"line":664},[908,912,916,920,925,930],{"type":46,"tag":661,"props":909,"children":910},{"style":678},[911],{"type":52,"value":681},{"type":46,"tag":661,"props":913,"children":914},{"style":684},[915],{"type":52,"value":687},{"type":46,"tag":661,"props":917,"children":918},{"style":684},[919],{"type":52,"value":738},{"type":46,"tag":661,"props":921,"children":922},{"style":684},[923],{"type":52,"value":924}," \u002Fpath\u002Fto\u002Fsession",{"type":46,"tag":661,"props":926,"children":927},{"style":684},[928],{"type":52,"value":929}," --namespace",{"type":46,"tag":661,"props":931,"children":932},{"style":684},[933],{"type":52,"value":934}," my_stream\n",{"type":46,"tag":661,"props":936,"children":937},{"class":663,"line":674},[938,942,946,951,955,960,964],{"type":46,"tag":661,"props":939,"children":940},{"style":678},[941],{"type":52,"value":681},{"type":46,"tag":661,"props":943,"children":944},{"style":684},[945],{"type":52,"value":687},{"type":46,"tag":661,"props":947,"children":948},{"style":684},[949],{"type":52,"value":950}," next_part.mp4",{"type":46,"tag":661,"props":952,"children":953},{"style":684},[954],{"type":52,"value":929},{"type":46,"tag":661,"props":956,"children":957},{"style":684},[958],{"type":52,"value":959}," my_stream",{"type":46,"tag":661,"props":961,"children":962},{"style":684},[963],{"type":52,"value":791},{"type":46,"tag":661,"props":965,"children":966},{"style":684},[967],{"type":52,"value":968}," append\n",{"type":46,"tag":55,"props":970,"children":971},{},[972,974,984,986,991,993,999],{"type":52,"value":973},"Each segment starts from the previous segment's state, so a person keeps the ",{"type":46,"tag":84,"props":975,"children":976},{},[977,979],{"type":52,"value":978},"same ",{"type":46,"tag":61,"props":980,"children":982},{"className":981},[],[983],{"type":52,"value":439},{"type":52,"value":985},"\nacross videos, semantic facts keep ",{"type":46,"tag":84,"props":987,"children":988},{},[989],{"type":52,"value":990},"accumulating and merging",{"type":52,"value":992},", and timestamps are stitched end to\nend into one timeline. Use it when several files are really one recording session. Segments must be\ngiven in chronological order, run strictly serially (",{"type":46,"tag":61,"props":994,"children":996},{"className":995},[],[997],{"type":52,"value":998},"-j",{"type":52,"value":1000}," is ignored and reported), and a failed\nsegment stops the stream — later ones would start from missing state.",{"type":46,"tag":55,"props":1002,"children":1003},{},[1004,1006,1012,1014,1020,1022,1028,1030,1036,1038,1043],{"type":52,"value":1005},"By default it lives at ",{"type":46,"tag":61,"props":1007,"children":1009},{"className":1008},[],[1010],{"type":52,"value":1011},"\u003Cfirst-video-directory>\u002F\u003Cnamespace>\u002F",{"type":52,"value":1013},"; query it with both ",{"type":46,"tag":61,"props":1015,"children":1017},{"className":1016},[],[1018],{"type":52,"value":1019},"video_path",{"type":52,"value":1021}," and\n",{"type":46,"tag":61,"props":1023,"children":1025},{"className":1024},[],[1026],{"type":52,"value":1027},"namespace",{"type":52,"value":1029},". Set ",{"type":46,"tag":61,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":52,"value":1035},"MEM_LOCAL_DIR",{"type":52,"value":1037}," when you want a fixed shared library and namespace-only queries.\nVideos appended in separate commands must share a directory unless ",{"type":46,"tag":61,"props":1039,"children":1041},{"className":1040},[],[1042],{"type":52,"value":1035},{"type":52,"value":1044}," is configured.",{"type":46,"tag":55,"props":1046,"children":1047},{},[1048,1050,1055,1056,1061,1063,1068,1070,1075,1077,1083],{"type":52,"value":1049},"Requirements: ",{"type":46,"tag":61,"props":1051,"children":1053},{"className":1052},[],[1054],{"type":52,"value":609},{"type":52,"value":611},{"type":46,"tag":61,"props":1057,"children":1059},{"className":1058},[],[1060],{"type":52,"value":617},{"type":52,"value":1062}," on PATH and ",{"type":46,"tag":61,"props":1064,"children":1066},{"className":1065},[],[1067],{"type":52,"value":625},{"type":52,"value":1069},". Omni calls use\n",{"type":46,"tag":61,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":52,"value":834},{"type":52,"value":1076}," and ",{"type":46,"tag":61,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":52,"value":1082},"QWEN_MM_API_OMNI_MODEL",{"type":52,"value":1084}," when configured.",{"type":46,"tag":69,"props":1086,"children":1088},{"id":1087},"retrieval-workflow",[1089],{"type":52,"value":1090},"Retrieval workflow",{"type":46,"tag":872,"props":1092,"children":1094},{"id":1093},"step-1-pick-an-entry-point-by-question-type",[1095],{"type":52,"value":1096},"Step 1: pick an entry point by question type",{"type":46,"tag":116,"props":1098,"children":1099},{},[1100,1121],{"type":46,"tag":120,"props":1101,"children":1102},{},[1103],{"type":46,"tag":124,"props":1104,"children":1105},{},[1106,1111,1116],{"type":46,"tag":128,"props":1107,"children":1108},{},[1109],{"type":52,"value":1110},"Question type",{"type":46,"tag":128,"props":1112,"children":1113},{},[1114],{"type":52,"value":1115},"Entry tool",{"type":46,"tag":128,"props":1117,"children":1118},{},[1119],{"type":52,"value":1120},"Example",{"type":46,"tag":139,"props":1122,"children":1123},{},[1124,1146,1168,1190,1212,1241,1263],{"type":46,"tag":124,"props":1125,"children":1126},{},[1127,1132,1141],{"type":46,"tag":146,"props":1128,"children":1129},{},[1130],{"type":52,"value":1131},"What one person said",{"type":46,"tag":146,"props":1133,"children":1134},{},[1135],{"type":46,"tag":61,"props":1136,"children":1138},{"className":1137},[],[1139],{"type":52,"value":1140},"get_person_dialogue(person_id)",{"type":46,"tag":146,"props":1142,"children":1143},{},[1144],{"type":52,"value":1145},"\"What did David say about the budget?\"",{"type":46,"tag":124,"props":1147,"children":1148},{},[1149,1154,1163],{"type":46,"tag":146,"props":1150,"children":1151},{},[1152],{"type":52,"value":1153},"Who said something",{"type":46,"tag":146,"props":1155,"children":1156},{},[1157],{"type":46,"tag":61,"props":1158,"children":1160},{"className":1159},[],[1161],{"type":52,"value":1162},"search_dialogue(query)",{"type":46,"tag":146,"props":1164,"children":1165},{},[1166],{"type":52,"value":1167},"\"Who offered to book a restaurant?\"",{"type":46,"tag":124,"props":1169,"children":1170},{},[1171,1176,1185],{"type":46,"tag":146,"props":1172,"children":1173},{},[1174],{"type":52,"value":1175},"Who these people are",{"type":46,"tag":146,"props":1177,"children":1178},{},[1179],{"type":46,"tag":61,"props":1180,"children":1182},{"className":1181},[],[1183],{"type":52,"value":1184},"get_people",{"type":46,"tag":146,"props":1186,"children":1187},{},[1188],{"type":52,"value":1189},"\"Who is Allen? \u002F who is in this video?\"",{"type":46,"tag":124,"props":1191,"children":1192},{},[1193,1198,1207],{"type":46,"tag":146,"props":1194,"children":1195},{},[1196],{"type":52,"value":1197},"A stable fact or relationship",{"type":46,"tag":146,"props":1199,"children":1200},{},[1201],{"type":46,"tag":61,"props":1202,"children":1204},{"className":1203},[],[1205],{"type":52,"value":1206},"search_facts(query | key_prefix | subject_id)",{"type":46,"tag":146,"props":1208,"children":1209},{},[1210],{"type":52,"value":1211},"\"What is Lucy's role?\"",{"type":46,"tag":124,"props":1213,"children":1214},{},[1215,1220,1236],{"type":46,"tag":146,"props":1216,"children":1217},{},[1218],{"type":52,"value":1219},"A specific time",{"type":46,"tag":146,"props":1221,"children":1222},{},[1223,1229,1230],{"type":46,"tag":61,"props":1224,"children":1226},{"className":1225},[],[1227],{"type":52,"value":1228},"get_timeline(start_sec, end_sec)",{"type":52,"value":362},{"type":46,"tag":61,"props":1231,"children":1233},{"className":1232},[],[1234],{"type":52,"value":1235},"get_moment",{"type":46,"tag":146,"props":1237,"children":1238},{},[1239],{"type":52,"value":1240},"\"What happens around 12:30?\"",{"type":46,"tag":124,"props":1242,"children":1243},{},[1244,1249,1258],{"type":46,"tag":146,"props":1245,"children":1246},{},[1247],{"type":52,"value":1248},"Full detail of known clips",{"type":46,"tag":146,"props":1250,"children":1251},{},[1252],{"type":46,"tag":61,"props":1253,"children":1255},{"className":1254},[],[1256],{"type":52,"value":1257},"get_moment(idxs)",{"type":46,"tag":146,"props":1259,"children":1260},{},[1261],{"type":52,"value":1262},"—",{"type":46,"tag":124,"props":1264,"children":1265},{},[1266,1274,1286],{"type":46,"tag":146,"props":1267,"children":1268},{},[1269],{"type":46,"tag":84,"props":1270,"children":1271},{},[1272],{"type":52,"value":1273},"Open-ended \u002F needs several kinds of evidence",{"type":46,"tag":146,"props":1275,"children":1276},{},[1277],{"type":46,"tag":84,"props":1278,"children":1279},{},[1280],{"type":46,"tag":61,"props":1281,"children":1283},{"className":1282},[],[1284],{"type":52,"value":1285},"plan_and_search",{"type":46,"tag":146,"props":1287,"children":1288},{},[1289],{"type":52,"value":1290},"\"What did they agree on in the end?\"",{"type":46,"tag":55,"props":1292,"children":1293},{},[1294,1296,1301],{"type":52,"value":1295},"Targeted questions go straight to their tool — do not route everything through ",{"type":46,"tag":61,"props":1297,"children":1299},{"className":1298},[],[1300],{"type":52,"value":1285},{"type":52,"value":96},{"type":46,"tag":872,"props":1303,"children":1305},{"id":1304},"step-2-orient-plan-search-answer",[1306],{"type":52,"value":1307},"Step 2: orient, plan, search, answer",{"type":46,"tag":55,"props":1309,"children":1310},{},[1311,1313,1318,1320,1325],{"type":52,"value":1312},"For the open-ended case, ",{"type":46,"tag":84,"props":1314,"children":1315},{},[1316],{"type":52,"value":1317},"you",{"type":52,"value":1319}," are the planner. ",{"type":46,"tag":61,"props":1321,"children":1323},{"className":1322},[],[1324],{"type":52,"value":1285},{"type":52,"value":1326}," executes the plan you give it and\nnever answers. One search per question:",{"type":46,"tag":409,"props":1328,"children":1331},{"className":1329,"code":1330,"language":52},[412],"① orient — get_memory_overview\n   → people (person_id, name, appearance, also_heard_as)\n   → semantic_key_directory   ← the complete list of fact keys; you pick from it, never guess\n   → scene_env_available      ← a marker only; ask for the items via include_scene below\n\n② plan it yourself, then ONE search\n   plan_and_search(question=\"What did they agree on in the end?\",\n                   people=[\"P001\",\"P002\"],                    # from step ①\n                   fact_keys=[\"event:campaign\u002Fdecision\"],      # from the key directory\n                   queries=[\"two people settle on a plan\",     # descriptive statements\n                            \"someone agrees to a proposal\"],\n                   time_ranges=[[1500, 1800]],                 # only if time-bounded\n                   include_scene=False)                        # on only for \"where is X\"\n\n③ read the evidence and answer.\n   ↑ for most questions the flow ends here\n\n   ⤷ exception, only if you can name the specific unrecorded detail you need:\n     replay_and_answer(idxs=suggested_replay_idxs, question=...)\n",[1332],{"type":46,"tag":61,"props":1333,"children":1334},{"__ignoreMap":417},[1335],{"type":52,"value":1330},{"type":46,"tag":55,"props":1337,"children":1338},{},[1339,1341,1347],{"type":52,"value":1340},"Step ① is not optional and not a probe: ",{"type":46,"tag":61,"props":1342,"children":1344},{"className":1343},[],[1345],{"type":52,"value":1346},"fact_keys",{"type":52,"value":1348}," is an exact lookup, so a plan that names no keys\ngets no facts at all. The directory is what makes the plan possible — get it first, then plan once.\nIt stays in your context for the rest of the conversation, so one call covers every later question\nabout the same video.",{"type":46,"tag":55,"props":1350,"children":1351},{},[1352,1354,1359],{"type":52,"value":1353},"If a search comes back thin, re-plan and search again — but change the ",{"type":46,"tag":182,"props":1355,"children":1356},{},[1357],{"type":52,"value":1358},"axis",{"type":52,"value":1360}," (name people, name keys,\nadd a time range) rather than rewording the same queries.",{"type":46,"tag":872,"props":1362,"children":1364},{"id":1363},"decision-flow",[1365],{"type":52,"value":1366},"Decision flow",{"type":46,"tag":409,"props":1368,"children":1371},{"className":1369,"code":1370,"language":52},[412],"Question arrives\n  ├─ Short video (\u003C10 min), or user wants no memory (and it is \u003C30 min)?\n  │                                          → watch_and_answer — ends here, no memory involved\n  ├─ get_memory_status                       ← never skip; truncated libraries look fine\n  ├─ Names one person, asks what they said?  → get_person_dialogue\n  ├─ Asks who said something?                → search_dialogue\n  ├─ Asks about a fact \u002F role \u002F relation?    → search_facts\n  ├─ Names a time?                           → get_timeline → get_moment\n  └─ Open-ended?                             → get_memory_overview → plan → plan_and_search → answer\n                                                                                              ↑ ends here\n\nreplay_and_answer is not on this flow — see Usage Rules\n",[1372],{"type":46,"tag":61,"props":1373,"children":1374},{"__ignoreMap":417},[1375],{"type":52,"value":1370},{"type":46,"tag":69,"props":1377,"children":1379},{"id":1378},"tools-reference",[1380],{"type":52,"value":1381},"Tools Reference",{"type":46,"tag":872,"props":1383,"children":1385},{"id":1384},"status-and-orientation",[1386],{"type":52,"value":1387},"Status and orientation",{"type":46,"tag":55,"props":1389,"children":1390},{},[1391,1396],{"type":46,"tag":84,"props":1392,"children":1393},{},[1394],{"type":52,"value":1395},"get_memory_status",{"type":52,"value":1397}," — Does the memory exist, is it complete, and does this video need one?",{"type":46,"tag":222,"props":1399,"children":1400},{},[1401,1418,1502,1542],{"type":46,"tag":226,"props":1402,"children":1403},{},[1404,1406,1411,1413],{"type":52,"value":1405},"Params: ",{"type":46,"tag":61,"props":1407,"children":1409},{"className":1408},[],[1410],{"type":52,"value":1019},{"type":52,"value":1412}," or ",{"type":46,"tag":61,"props":1414,"children":1416},{"className":1415},[],[1417],{"type":52,"value":1027},{"type":46,"tag":226,"props":1419,"children":1420},{},[1421,1423,1429,1430,1436,1437,1443,1444,1450,1451,1457,1458,1464,1465,1471,1473,1479,1480,1486,1488,1494,1495,1500],{"type":52,"value":1422},"Returns: ",{"type":46,"tag":61,"props":1424,"children":1426},{"className":1425},[],[1427],{"type":52,"value":1428},"exists",{"type":52,"value":449},{"type":46,"tag":61,"props":1431,"children":1433},{"className":1432},[],[1434],{"type":52,"value":1435},"complete",{"type":52,"value":449},{"type":46,"tag":61,"props":1438,"children":1440},{"className":1439},[],[1441],{"type":52,"value":1442},"clips",{"type":52,"value":611},{"type":46,"tag":61,"props":1445,"children":1447},{"className":1446},[],[1448],{"type":52,"value":1449},"episodic",{"type":52,"value":611},{"type":46,"tag":61,"props":1452,"children":1454},{"className":1453},[],[1455],{"type":52,"value":1456},"planned_clips",{"type":52,"value":449},{"type":46,"tag":61,"props":1459,"children":1461},{"className":1460},[],[1462],{"type":52,"value":1463},"people",{"type":52,"value":449},{"type":46,"tag":61,"props":1466,"children":1468},{"className":1467},[],[1469],{"type":52,"value":1470},"named_people",{"type":52,"value":1472},",\n",{"type":46,"tag":61,"props":1474,"children":1476},{"className":1475},[],[1477],{"type":52,"value":1478},"semantic_facts",{"type":52,"value":449},{"type":46,"tag":61,"props":1481,"children":1483},{"className":1482},[],[1484],{"type":52,"value":1485},"duration_sec",{"type":52,"value":1487},"; ",{"type":46,"tag":61,"props":1489,"children":1491},{"className":1490},[],[1492],{"type":52,"value":1493},"truncated",{"type":52,"value":1076},{"type":46,"tag":61,"props":1496,"children":1498},{"className":1497},[],[1499],{"type":52,"value":112},{"type":52,"value":1501}," when incomplete",{"type":46,"tag":226,"props":1503,"children":1504},{},[1505,1507,1512,1514,1519,1521,1526,1528,1533,1535,1540],{"type":52,"value":1506},"When ",{"type":46,"tag":61,"props":1508,"children":1510},{"className":1509},[],[1511],{"type":52,"value":324},{"type":52,"value":1513}," it also reports the SOURCE video's ",{"type":46,"tag":61,"props":1515,"children":1517},{"className":1516},[],[1518],{"type":52,"value":1485},{"type":52,"value":1520}," \u002F ",{"type":46,"tag":61,"props":1522,"children":1524},{"className":1523},[],[1525],{"type":52,"value":104},{"type":52,"value":1527}," and a\n",{"type":46,"tag":61,"props":1529,"children":1531},{"className":1530},[],[1532],{"type":52,"value":112},{"type":52,"value":1534}," that applies the routing table at the top — this is where you learn whether the video is\nshort enough to answer with ",{"type":46,"tag":61,"props":1536,"children":1538},{"className":1537},[],[1539],{"type":52,"value":194},{"type":52,"value":1541}," instead of building anything",{"type":46,"tag":226,"props":1543,"children":1544},{},[1545,1547,1553],{"type":52,"value":1546},"Use when: always, first. ",{"type":46,"tag":61,"props":1548,"children":1550},{"className":1549},[],[1551],{"type":52,"value":1552},"complete: false",{"type":52,"value":1554}," means the answers are not trustworthy.",{"type":46,"tag":55,"props":1556,"children":1557},{},[1558,1562,1564],{"type":46,"tag":84,"props":1559,"children":1560},{},[1561],{"type":52,"value":481},{"type":52,"value":1563}," — The vocabulary you plan with. ",{"type":46,"tag":84,"props":1565,"children":1566},{},[1567,1569,1574],{"type":52,"value":1568},"Read this before ",{"type":46,"tag":61,"props":1570,"children":1572},{"className":1571},[],[1573],{"type":52,"value":1285},{"type":52,"value":96},{"type":46,"tag":222,"props":1576,"children":1577},{},[1578,1593,1643,1648],{"type":46,"tag":226,"props":1579,"children":1580},{},[1581,1582,1587,1588],{"type":52,"value":1405},{"type":46,"tag":61,"props":1583,"children":1585},{"className":1584},[],[1586],{"type":52,"value":1019},{"type":52,"value":1412},{"type":46,"tag":61,"props":1589,"children":1591},{"className":1590},[],[1592],{"type":52,"value":1027},{"type":46,"tag":226,"props":1594,"children":1595},{},[1596,1597,1602,1603,1608,1609,1614,1615,1621,1622,1627,1629,1635,1637],{"type":52,"value":1422},{"type":46,"tag":61,"props":1598,"children":1600},{"className":1599},[],[1601],{"type":52,"value":1463},{"type":52,"value":441},{"type":46,"tag":61,"props":1604,"children":1606},{"className":1605},[],[1607],{"type":52,"value":439},{"type":52,"value":449},{"type":46,"tag":61,"props":1610,"children":1612},{"className":1611},[],[1613],{"type":52,"value":514},{"type":52,"value":449},{"type":46,"tag":61,"props":1616,"children":1618},{"className":1617},[],[1619],{"type":52,"value":1620},"appearance",{"type":52,"value":619},{"type":46,"tag":61,"props":1623,"children":1625},{"className":1624},[],[1626],{"type":52,"value":489},{"type":52,"value":1628}," for anyone still unnamed),\n",{"type":46,"tag":61,"props":1630,"children":1632},{"className":1631},[],[1633],{"type":52,"value":1634},"semantic_key_directory",{"type":52,"value":1636}," (complete), ",{"type":46,"tag":61,"props":1638,"children":1640},{"className":1639},[],[1641],{"type":52,"value":1642},"scene_env_available",{"type":46,"tag":226,"props":1644,"children":1645},{},[1646],{"type":52,"value":1647},"Use when: before planning any open-ended retrieval. It costs one call and stays in your context for\nevery later question about the same video.",{"type":46,"tag":226,"props":1649,"children":1650},{},[1651,1656,1658,1664,1666,1671],{"type":46,"tag":61,"props":1652,"children":1654},{"className":1653},[],[1655],{"type":52,"value":1642},{"type":52,"value":1657}," is a marker, not the items: pass ",{"type":46,"tag":61,"props":1659,"children":1661},{"className":1660},[],[1662],{"type":52,"value":1663},"include_scene=True",{"type":52,"value":1665}," to ",{"type":46,"tag":61,"props":1667,"children":1669},{"className":1668},[],[1670],{"type":52,"value":1285},{"type":52,"value":1672},"\nwhen the question needs them",{"type":46,"tag":872,"props":1674,"children":1676},{"id":1675},"answering-an-open-ended-question",[1677],{"type":52,"value":1678},"Answering an open-ended question",{"type":46,"tag":55,"props":1680,"children":1681},{},[1682,1686,1688],{"type":46,"tag":84,"props":1683,"children":1684},{},[1685],{"type":52,"value":1285},{"type":52,"value":1687}," — ONE retrieval from a plan you decide, fusing the containers. ",{"type":46,"tag":84,"props":1689,"children":1690},{},[1691],{"type":52,"value":1692},"Does not answer.",{"type":46,"tag":222,"props":1694,"children":1695},{},[1696,1748,1800,1824],{"type":46,"tag":226,"props":1697,"children":1698},{},[1699,1700,1706,1707,1712,1713,1718,1719,1725,1726,1732,1733,1738,1740,1746],{"type":52,"value":1405},{"type":46,"tag":61,"props":1701,"children":1703},{"className":1702},[],[1704],{"type":52,"value":1705},"question",{"type":52,"value":449},{"type":46,"tag":61,"props":1708,"children":1710},{"className":1709},[],[1711],{"type":52,"value":1463},{"type":52,"value":449},{"type":46,"tag":61,"props":1714,"children":1716},{"className":1715},[],[1717],{"type":52,"value":1346},{"type":52,"value":449},{"type":46,"tag":61,"props":1720,"children":1722},{"className":1721},[],[1723],{"type":52,"value":1724},"queries",{"type":52,"value":449},{"type":46,"tag":61,"props":1727,"children":1729},{"className":1728},[],[1730],{"type":52,"value":1731},"time_ranges",{"type":52,"value":449},{"type":46,"tag":61,"props":1734,"children":1736},{"className":1735},[],[1737],{"type":52,"value":569},{"type":52,"value":1739}," (off by\ndefault — turn it on for \"where is X\"), ",{"type":46,"tag":61,"props":1741,"children":1743},{"className":1742},[],[1744],{"type":52,"value":1745},"top_k",{"type":52,"value":1747}," (default 5)",{"type":46,"tag":226,"props":1749,"children":1750},{},[1751,1752,1757,1758,1764,1765,1771,1773,1779,1780,1786,1787,1793,1794],{"type":52,"value":1422},{"type":46,"tag":61,"props":1753,"children":1755},{"className":1754},[],[1756],{"type":52,"value":1463},{"type":52,"value":449},{"type":46,"tag":61,"props":1759,"children":1761},{"className":1760},[],[1762],{"type":52,"value":1763},"facts",{"type":52,"value":449},{"type":46,"tag":61,"props":1766,"children":1768},{"className":1767},[],[1769],{"type":52,"value":1770},"moments",{"type":52,"value":1772}," (briefs), ",{"type":46,"tag":61,"props":1774,"children":1776},{"className":1775},[],[1777],{"type":52,"value":1778},"scene_env",{"type":52,"value":449},{"type":46,"tag":61,"props":1781,"children":1783},{"className":1782},[],[1784],{"type":52,"value":1785},"evidence_text",{"type":52,"value":1472},{"type":46,"tag":61,"props":1788,"children":1790},{"className":1789},[],[1791],{"type":52,"value":1792},"suggested_replay_idxs",{"type":52,"value":449},{"type":46,"tag":61,"props":1795,"children":1797},{"className":1796},[],[1798],{"type":52,"value":1799},"plan_used",{"type":46,"tag":226,"props":1801,"children":1802},{},[1803,1808,1810,1815,1817,1822],{"type":46,"tag":61,"props":1804,"children":1806},{"className":1805},[],[1807],{"type":52,"value":1346},{"type":52,"value":1809}," is an EXACT lookup — pick from ",{"type":46,"tag":61,"props":1811,"children":1813},{"className":1812},[],[1814],{"type":52,"value":481},{"type":52,"value":1816},"'s ",{"type":46,"tag":61,"props":1818,"children":1820},{"className":1819},[],[1821],{"type":52,"value":1634},{"type":52,"value":1823},". Naming\nno keys returns no facts; that is why the overview comes first",{"type":46,"tag":226,"props":1825,"children":1826},{},[1827,1829,1834,1836],{"type":52,"value":1828},"Query guide: ",{"type":46,"tag":61,"props":1830,"children":1832},{"className":1831},[],[1833],{"type":52,"value":1724},{"type":52,"value":1835}," take DESCRIPTIVE STATEMENTS, not questions\n",{"type":46,"tag":222,"props":1837,"children":1838},{},[1839,1844,1849,1861],{"type":46,"tag":226,"props":1840,"children":1841},{},[1842],{"type":52,"value":1843},"Good: \"someone offers to bring an umbrella\"",{"type":46,"tag":226,"props":1845,"children":1846},{},[1847],{"type":52,"value":1848},"Bad: \"who brought an umbrella?\"",{"type":46,"tag":226,"props":1850,"children":1851},{},[1852,1854,1859],{"type":52,"value":1853},"Several short angles beat one long query — each contributes its own ",{"type":46,"tag":61,"props":1855,"children":1857},{"className":1856},[],[1858],{"type":52,"value":1745},{"type":52,"value":1860}," recall",{"type":46,"tag":226,"props":1862,"children":1863},{},[1864,1866,1871],{"type":52,"value":1865},"These also decide ",{"type":46,"tag":61,"props":1867,"children":1869},{"className":1868},[],[1870],{"type":52,"value":1792},{"type":52,"value":1872},", so describe what to look for",{"type":46,"tag":55,"props":1874,"children":1875},{},[1876,1880,1882,1887],{"type":46,"tag":84,"props":1877,"children":1878},{},[1879],{"type":52,"value":394},{"type":52,"value":1881}," — Re-watch clips ",{"type":46,"tag":84,"props":1883,"children":1884},{},[1885],{"type":52,"value":1886},"with their audio",{"type":52,"value":1888}," and have the omni model report what it sees.",{"type":46,"tag":222,"props":1890,"children":1891},{},[1892,1932,1978,1983,1993,2005],{"type":46,"tag":226,"props":1893,"children":1894},{},[1895,1896,1901,1902,1908,1909,1915,1917,1923,1925,1930],{"type":52,"value":1405},{"type":46,"tag":61,"props":1897,"children":1899},{"className":1898},[],[1900],{"type":52,"value":1705},{"type":52,"value":449},{"type":46,"tag":61,"props":1903,"children":1905},{"className":1904},[],[1906],{"type":52,"value":1907},"idxs",{"type":52,"value":449},{"type":46,"tag":61,"props":1910,"children":1912},{"className":1911},[],[1913],{"type":52,"value":1914},"evidence",{"type":52,"value":1916}," (optional text context), ",{"type":46,"tag":61,"props":1918,"children":1920},{"className":1919},[],[1921],{"type":52,"value":1922},"model",{"type":52,"value":1924}," (optional omni model;\ndefaults to ",{"type":46,"tag":61,"props":1926,"children":1928},{"className":1927},[],[1929],{"type":52,"value":818},{"type":52,"value":1931},", and need not match the model the memory was built with)",{"type":46,"tag":226,"props":1933,"children":1934},{},[1935,1936,1942,1943,1949,1950,1955,1956,1962,1963,1969,1970,1976],{"type":52,"value":1422},{"type":46,"tag":61,"props":1937,"children":1939},{"className":1938},[],[1940],{"type":52,"value":1941},"answer",{"type":52,"value":449},{"type":46,"tag":61,"props":1944,"children":1946},{"className":1945},[],[1947],{"type":52,"value":1948},"watched_idxs",{"type":52,"value":449},{"type":46,"tag":61,"props":1951,"children":1953},{"className":1952},[],[1954],{"type":52,"value":1922},{"type":52,"value":449},{"type":46,"tag":61,"props":1957,"children":1959},{"className":1958},[],[1960],{"type":52,"value":1961},"sent_mb",{"type":52,"value":1487},{"type":46,"tag":61,"props":1964,"children":1966},{"className":1965},[],[1967],{"type":52,"value":1968},"dropped_idxs",{"type":52,"value":1520},{"type":46,"tag":61,"props":1971,"children":1973},{"className":1972},[],[1974],{"type":52,"value":1975},"missing_idxs",{"type":52,"value":1977}," when applicable",{"type":46,"tag":226,"props":1979,"children":1980},{},[1981],{"type":52,"value":1982},"It answers instead of returning evidence, because what it reads is in the video itself",{"type":46,"tag":226,"props":1984,"children":1985},{},[1986,1988],{"type":52,"value":1987},"Watches at most 3 clips per call (~3.5 MB each, inline) — every other clip stays invisible to it.\nExtras come back in ",{"type":46,"tag":61,"props":1989,"children":1991},{"className":1990},[],[1992],{"type":52,"value":1968},{"type":46,"tag":226,"props":1994,"children":1995},{},[1996,1998,2003],{"type":52,"value":1997},"Use when: one ",{"type":46,"tag":84,"props":1999,"children":2000},{},[2001],{"type":52,"value":2002},"specific",{"type":52,"value":2004}," detail the 30s record demonstrably lost — a fleeting object, a facial\nexpression, a count",{"type":46,"tag":226,"props":2006,"children":2007},{},[2008,2013,2015,2021,2022,2028,2029,2034],{"type":46,"tag":84,"props":2009,"children":2010},{},[2011],{"type":52,"value":2012},"Not for what was said.",{"type":52,"value":2014}," Every utterance is stored verbatim with its speaker and paralinguistics,\nso ",{"type":46,"tag":61,"props":2016,"children":2018},{"className":2017},[],[2019],{"type":52,"value":2020},"get_person_dialogue",{"type":52,"value":1520},{"type":46,"tag":61,"props":2023,"children":2025},{"className":2024},[],[2026],{"type":52,"value":2027},"search_dialogue",{"type":52,"value":1520},{"type":46,"tag":61,"props":2030,"children":2032},{"className":2031},[],[2033],{"type":52,"value":1235},{"type":52,"value":2035}," answer wording questions better, and for\nfree",{"type":46,"tag":872,"props":2037,"children":2039},{"id":2038},"answering-without-a-memory",[2040],{"type":52,"value":2041},"Answering without a memory",{"type":46,"tag":55,"props":2043,"children":2044},{},[2045,2049,2051,2056],{"type":46,"tag":84,"props":2046,"children":2047},{},[2048],{"type":52,"value":194},{"type":52,"value":2050}," — Watch a SHORT video whole, in one call, with ",{"type":46,"tag":84,"props":2052,"children":2053},{},[2054],{"type":52,"value":2055},"no memory involved",{"type":52,"value":96},{"type":46,"tag":222,"props":2058,"children":2059},{},[2060,2084,2118,2213,2218,2231],{"type":46,"tag":226,"props":2061,"children":2062},{},[2063,2064,2069,2071,2076,2077,2082],{"type":52,"value":1405},{"type":46,"tag":61,"props":2065,"children":2067},{"className":2066},[],[2068],{"type":52,"value":1019},{"type":52,"value":2070}," (required — a source video, NOT a namespace), ",{"type":46,"tag":61,"props":2072,"children":2074},{"className":2073},[],[2075],{"type":52,"value":1705},{"type":52,"value":449},{"type":46,"tag":61,"props":2078,"children":2080},{"className":2079},[],[2081],{"type":52,"value":1922},{"type":52,"value":2083}," (optional)",{"type":46,"tag":226,"props":2085,"children":2086},{},[2087,2088,2093,2094,2099,2100,2105,2106,2112,2113],{"type":52,"value":1422},{"type":46,"tag":61,"props":2089,"children":2091},{"className":2090},[],[2092],{"type":52,"value":1941},{"type":52,"value":449},{"type":46,"tag":61,"props":2095,"children":2097},{"className":2096},[],[2098],{"type":52,"value":1961},{"type":52,"value":449},{"type":46,"tag":61,"props":2101,"children":2103},{"className":2102},[],[2104],{"type":52,"value":1485},{"type":52,"value":449},{"type":46,"tag":61,"props":2107,"children":2109},{"className":2108},[],[2110],{"type":52,"value":2111},"transcode_cached",{"type":52,"value":449},{"type":46,"tag":61,"props":2114,"children":2116},{"className":2115},[],[2117],{"type":52,"value":1922},{"type":46,"tag":226,"props":2119,"children":2120},{},[2121,2123,2129,2131,2137,2138,2144,2145,2151,2152,2158,2159,2165,2166,2172,2174,2179,2180,2185,2187,2192,2194,2199,2201,2206,2211],{"type":52,"value":2122},"On failure: ",{"type":46,"tag":61,"props":2124,"children":2126},{"className":2125},[],[2127],{"type":52,"value":2128},"error",{"type":52,"value":2130}," + ",{"type":46,"tag":61,"props":2132,"children":2134},{"className":2133},[],[2135],{"type":52,"value":2136},"failure",{"type":52,"value":441},{"type":46,"tag":61,"props":2139,"children":2141},{"className":2140},[],[2142],{"type":52,"value":2143},"reject",{"type":52,"value":1520},{"type":46,"tag":61,"props":2146,"children":2148},{"className":2147},[],[2149],{"type":52,"value":2150},"timeout",{"type":52,"value":1520},{"type":46,"tag":61,"props":2153,"children":2155},{"className":2154},[],[2156],{"type":52,"value":2157},"empty",{"type":52,"value":1520},{"type":46,"tag":61,"props":2160,"children":2162},{"className":2161},[],[2163],{"type":52,"value":2164},"rate",{"type":52,"value":1520},{"type":46,"tag":61,"props":2167,"children":2169},{"className":2168},[],[2170],{"type":52,"value":2171},"config",{"type":52,"value":2173},"). For the first\nthree it also carries ",{"type":46,"tag":61,"props":2175,"children":2177},{"className":2176},[],[2178],{"type":52,"value":263},{"type":52,"value":1076},{"type":46,"tag":61,"props":2181,"children":2183},{"className":2182},[],[2184],{"type":52,"value":112},{"type":52,"value":2186}," — run that command, then use the\nmemory path. For ",{"type":46,"tag":61,"props":2188,"children":2190},{"className":2189},[],[2191],{"type":52,"value":2164},{"type":52,"value":2193}," (throttling) and ",{"type":46,"tag":61,"props":2195,"children":2197},{"className":2196},[],[2198],{"type":52,"value":2171},{"type":52,"value":2200}," (wrong endpoint or key) there is deliberately ",{"type":46,"tag":84,"props":2202,"children":2203},{},[2204],{"type":52,"value":2205},"no",{"type":46,"tag":61,"props":2207,"children":2209},{"className":2208},[],[2210],{"type":52,"value":271},{"type":52,"value":2212},": a build runs against the same endpoint and would fail identically",{"type":46,"tag":226,"props":2214,"children":2215},{},[2216],{"type":52,"value":2217},"Use when: the video is under ~10 min, or the user has said they do not want a memory built. See the\nrouting table at the top — over ~30 min this is not an option",{"type":46,"tag":226,"props":2219,"children":2220},{},[2221,2223,2229],{"type":52,"value":2222},"The video is re-encoded once and that copy kept, so follow-ups skip the re-encode\n(",{"type":46,"tag":61,"props":2224,"children":2226},{"className":2225},[],[2227],{"type":52,"value":2228},"transcode_cached: true",{"type":52,"value":2230},"). The omni call is still paid every time, which is why several questions\nare cheaper as a memory",{"type":46,"tag":226,"props":2232,"children":2233},{},[2234,2236,2241,2243,2248],{"type":52,"value":2235},"It answers rather than returning evidence for the same reason ",{"type":46,"tag":61,"props":2237,"children":2239},{"className":2238},[],[2240],{"type":52,"value":394},{"type":52,"value":2242}," does — what it\nreads is in the audio, which you cannot hear — but it sits ",{"type":46,"tag":84,"props":2244,"children":2245},{},[2246],{"type":52,"value":2247},"off",{"type":52,"value":2249}," the retrieval flow, before there\nis anything to retrieve",{"type":46,"tag":872,"props":2251,"children":2253},{"id":2252},"direct-access",[2254],{"type":52,"value":2255},"Direct access",{"type":46,"tag":55,"props":2257,"children":2258},{},[2259,2263,2265,2270],{"type":46,"tag":84,"props":2260,"children":2261},{},[2262],{"type":52,"value":1184},{"type":52,"value":2264}," — Full dossier for everyone, or one ",{"type":46,"tag":61,"props":2266,"children":2268},{"className":2267},[],[2269],{"type":52,"value":439},{"type":52,"value":96},{"type":46,"tag":222,"props":2272,"children":2273},{},[2274,2284,2307],{"type":46,"tag":226,"props":2275,"children":2276},{},[2277,2278,2283],{"type":52,"value":1405},{"type":46,"tag":61,"props":2279,"children":2281},{"className":2280},[],[2282],{"type":52,"value":439},{"type":52,"value":2083},{"type":46,"tag":226,"props":2285,"children":2286},{},[2287,2288,2293,2294,2299,2300,2305],{"type":52,"value":1422},{"type":46,"tag":61,"props":2289,"children":2291},{"className":2290},[],[2292],{"type":52,"value":439},{"type":52,"value":449},{"type":46,"tag":61,"props":2295,"children":2297},{"className":2296},[],[2298],{"type":52,"value":514},{"type":52,"value":449},{"type":46,"tag":61,"props":2301,"children":2303},{"className":2302},[],[2304],{"type":52,"value":1620},{"type":52,"value":2306},", attributes, first\u002Flast appearance, clip indices",{"type":46,"tag":226,"props":2308,"children":2309},{},[2310],{"type":52,"value":2311},"Use when: \"who are these people\", or you need one person's full record",{"type":46,"tag":55,"props":2313,"children":2314},{},[2315,2319,2320,2325],{"type":46,"tag":84,"props":2316,"children":2317},{},[2318],{"type":52,"value":2020},{"type":52,"value":305},{"type":46,"tag":84,"props":2321,"children":2322},{},[2323],{"type":52,"value":2324},"Every",{"type":52,"value":2326}," line one person spoke, in order.",{"type":46,"tag":222,"props":2328,"children":2329},{},[2330,2361,2373],{"type":46,"tag":226,"props":2331,"children":2332},{},[2333,2334,2339,2341,2347,2348,2354,2355],{"type":52,"value":1405},{"type":46,"tag":61,"props":2335,"children":2337},{"className":2336},[],[2338],{"type":52,"value":439},{"type":52,"value":2340}," (optional — omit it for every speaker in time order), ",{"type":46,"tag":61,"props":2342,"children":2344},{"className":2343},[],[2345],{"type":52,"value":2346},"start_sec",{"type":52,"value":449},{"type":46,"tag":61,"props":2349,"children":2351},{"className":2350},[],[2352],{"type":52,"value":2353},"end_sec",{"type":52,"value":449},{"type":46,"tag":61,"props":2356,"children":2358},{"className":2357},[],[2359],{"type":52,"value":2360},"limit",{"type":46,"tag":226,"props":2362,"children":2363},{},[2364,2365,2371],{"type":52,"value":1422},{"type":46,"tag":61,"props":2366,"children":2368},{"className":2367},[],[2369],{"type":52,"value":2370},"total",{"type":52,"value":2372}," and the utterances with timestamps and paralinguistics",{"type":46,"tag":226,"props":2374,"children":2375},{},[2376,2378,2383],{"type":52,"value":2377},"Use when: \"what did X say\" — this is exhaustive, where ",{"type":46,"tag":61,"props":2379,"children":2381},{"className":2380},[],[2382],{"type":52,"value":1285},{"type":52,"value":2384}," is top-k",{"type":46,"tag":55,"props":2386,"children":2387},{},[2388,2393],{"type":46,"tag":84,"props":2389,"children":2390},{},[2391],{"type":52,"value":2392},"get_timeline",{"type":52,"value":2394}," — Moments in a time range, chronologically.",{"type":46,"tag":222,"props":2396,"children":2397},{},[2398,2422,2434],{"type":46,"tag":226,"props":2399,"children":2400},{},[2401,2402,2407,2408,2413,2414,2420],{"type":52,"value":1405},{"type":46,"tag":61,"props":2403,"children":2405},{"className":2404},[],[2406],{"type":52,"value":2346},{"type":52,"value":449},{"type":46,"tag":61,"props":2409,"children":2411},{"className":2410},[],[2412],{"type":52,"value":2353},{"type":52,"value":441},{"type":46,"tag":61,"props":2415,"children":2417},{"className":2416},[],[2418],{"type":52,"value":2419},"end_sec=0",{"type":52,"value":2421}," means \"to the end\")",{"type":46,"tag":226,"props":2423,"children":2424},{},[2425,2427,2432],{"type":52,"value":2426},"Returns: brief per moment — follow up with ",{"type":46,"tag":61,"props":2428,"children":2430},{"className":2429},[],[2431],{"type":52,"value":1235},{"type":52,"value":2433}," for detail",{"type":46,"tag":226,"props":2435,"children":2436},{},[2437],{"type":52,"value":2438},"Use when: the question names a time and there is nothing to search for",{"type":46,"tag":55,"props":2440,"children":2441},{},[2442,2446,2448],{"type":46,"tag":84,"props":2443,"children":2444},{},[2445],{"type":52,"value":1235},{"type":52,"value":2447}," — Full detail for specific clips. ",{"type":46,"tag":84,"props":2449,"children":2450},{},[2451],{"type":52,"value":2452},"Most information-dense tool.",{"type":46,"tag":222,"props":2454,"children":2455},{},[2456,2467,2517],{"type":46,"tag":226,"props":2457,"children":2458},{},[2459,2460,2465],{"type":52,"value":1405},{"type":46,"tag":61,"props":2461,"children":2463},{"className":2462},[],[2464],{"type":52,"value":1907},{"type":52,"value":2466}," (required)",{"type":46,"tag":226,"props":2468,"children":2469},{},[2470,2472,2478,2479,2485,2486,2492,2494,2500,2501,2507,2508],{"type":52,"value":2471},"Returns: full ",{"type":46,"tag":61,"props":2473,"children":2475},{"className":2474},[],[2476],{"type":52,"value":2477},"visual_caption",{"type":52,"value":449},{"type":46,"tag":61,"props":2480,"children":2482},{"className":2481},[],[2483],{"type":52,"value":2484},"scene_continuity",{"type":52,"value":449},{"type":46,"tag":61,"props":2487,"children":2489},{"className":2488},[],[2490],{"type":52,"value":2491},"scene_env_update",{"type":52,"value":2493},", per-person actions, every\n",{"type":46,"tag":61,"props":2495,"children":2497},{"className":2496},[],[2498],{"type":52,"value":2499},"utterance",{"type":52,"value":449},{"type":46,"tag":61,"props":2502,"children":2504},{"className":2503},[],[2505],{"type":52,"value":2506},"acoustic_events",{"type":52,"value":619},{"type":46,"tag":84,"props":2509,"children":2510},{},[2511],{"type":46,"tag":61,"props":2512,"children":2514},{"className":2513},[],[2515],{"type":52,"value":2516},"clip_path",{"type":46,"tag":226,"props":2518,"children":2519},{},[2520,2522,2527],{"type":52,"value":2521},"Use when: a brief is not enough. ",{"type":46,"tag":61,"props":2523,"children":2525},{"className":2524},[],[2526],{"type":52,"value":2516},{"type":52,"value":2528}," is the 30s file on disk, should you have another tool\nthat can open it",{"type":46,"tag":55,"props":2530,"children":2531},{},[2532,2536],{"type":46,"tag":84,"props":2533,"children":2534},{},[2535],{"type":52,"value":2027},{"type":52,"value":2537}," — Semantic search at the UTTERANCE level; every line comes back with its speaker.",{"type":46,"tag":222,"props":2539,"children":2540},{},[2541,2558],{"type":46,"tag":226,"props":2542,"children":2543},{},[2544,2545,2551,2553],{"type":52,"value":1405},{"type":46,"tag":61,"props":2546,"children":2548},{"className":2547},[],[2549],{"type":52,"value":2550},"query",{"type":52,"value":2552}," (required), ",{"type":46,"tag":61,"props":2554,"children":2556},{"className":2555},[],[2557],{"type":52,"value":1745},{"type":46,"tag":226,"props":2559,"children":2560},{},[2561],{"type":52,"value":2562},"Use when: \"who said …\" — you know the content but not the person",{"type":46,"tag":55,"props":2564,"children":2565},{},[2566,2571],{"type":46,"tag":84,"props":2567,"children":2568},{},[2569],{"type":52,"value":2570},"search_facts",{"type":52,"value":2572}," — Three ways into the semantic container.",{"type":46,"tag":222,"props":2574,"children":2575},{},[2576,2623],{"type":46,"tag":226,"props":2577,"children":2578},{},[2579,2581,2586,2588,2594,2595,2601,2603,2608,2610,2616,2618],{"type":52,"value":2580},"Params: one of ",{"type":46,"tag":61,"props":2582,"children":2584},{"className":2583},[],[2585],{"type":52,"value":2550},{"type":52,"value":2587}," (search statements by content), ",{"type":46,"tag":61,"props":2589,"children":2591},{"className":2590},[],[2592],{"type":52,"value":2593},"key_prefix",{"type":52,"value":441},{"type":46,"tag":61,"props":2596,"children":2598},{"className":2597},[],[2599],{"type":52,"value":2600},"\"David\u002F\"",{"type":52,"value":2602},", or a\n",{"type":46,"tag":61,"props":2604,"children":2606},{"className":2605},[],[2607],{"type":52,"value":439},{"type":52,"value":2609}," prefix, which is mapped for you), ",{"type":46,"tag":61,"props":2611,"children":2613},{"className":2612},[],[2614],{"type":52,"value":2615},"subject_id",{"type":52,"value":2617},"; plus ",{"type":46,"tag":61,"props":2619,"children":2621},{"className":2620},[],[2622],{"type":52,"value":1745},{"type":46,"tag":226,"props":2624,"children":2625},{},[2626,2628,2633],{"type":52,"value":2627},"Use when: you want facts by CONTENT rather than by exact key — ",{"type":46,"tag":61,"props":2629,"children":2631},{"className":2630},[],[2632],{"type":52,"value":1285},{"type":52,"value":2634}," cannot do this",{"type":46,"tag":55,"props":2636,"children":2637},{},[2638,2643],{"type":46,"tag":84,"props":2639,"children":2640},{},[2641],{"type":52,"value":2642},"search_memory",{"type":52,"value":2644}," — Broad hybrid search across containers, with entity-anchored multi-hop.",{"type":46,"tag":222,"props":2646,"children":2647},{},[2648,2663],{"type":46,"tag":226,"props":2649,"children":2650},{},[2651,2652,2657,2658],{"type":52,"value":1405},{"type":46,"tag":61,"props":2653,"children":2655},{"className":2654},[],[2656],{"type":52,"value":2550},{"type":52,"value":2552},{"type":46,"tag":61,"props":2659,"children":2661},{"className":2660},[],[2662],{"type":52,"value":1745},{"type":46,"tag":226,"props":2664,"children":2665},{},[2666,2668,2673],{"type":52,"value":2667},"Use when: you know nothing about the library and want one wide net. ",{"type":46,"tag":61,"props":2669,"children":2671},{"className":2670},[],[2672],{"type":52,"value":1285},{"type":52,"value":2674}," is usually\nthe better entry point.",{"type":46,"tag":69,"props":2676,"children":2678},{"id":2677},"usage-rules",[2679],{"type":52,"value":2680},"Usage Rules",{"type":46,"tag":293,"props":2682,"children":2683},{},[2684,2701,2711],{"type":46,"tag":226,"props":2685,"children":2686},{},[2687,2692,2694,2699],{"type":46,"tag":84,"props":2688,"children":2689},{},[2690],{"type":52,"value":2691},"On the memory path, never answer without checking status first",{"type":52,"value":2693}," — a truncated library answers\nconfidently from half a video, and looks entirely normal while doing it. (",{"type":46,"tag":61,"props":2695,"children":2697},{"className":2696},[],[2698],{"type":52,"value":194},{"type":52,"value":2700}," is not\non that path and needs no status check; it reads the video, not a library.)",{"type":46,"tag":226,"props":2702,"children":2703},{},[2704,2709],{"type":46,"tag":84,"props":2705,"children":2706},{},[2707],{"type":52,"value":2708},"The text memory is the answer path; replay is the exception.",{"type":52,"value":2710}," Before reaching for it, you must be\nable to name the specific thing you need that the record does not have. \"The record is only a\nsummary\" is not such a reason — a replay sees only the clips you name and nothing else, so a vague\nreplay returns a vaguer answer than the memory you already hold.",{"type":46,"tag":226,"props":2712,"children":2713},{},[2714,2719,2720,2725,2727,2732,2733,2738],{"type":46,"tag":84,"props":2715,"children":2716},{},[2717],{"type":52,"value":2718},"Stop when the open-ended path and a replay have both failed.",{"type":52,"value":245},{"type":46,"tag":61,"props":2721,"children":2723},{"className":2722},[],[2724],{"type":52,"value":481},{"type":52,"value":2726}," →\n",{"type":46,"tag":61,"props":2728,"children":2730},{"className":2729},[],[2731],{"type":52,"value":1285},{"type":52,"value":362},{"type":46,"tag":61,"props":2734,"children":2736},{"className":2735},[],[2737],{"type":52,"value":394},{"type":52,"value":2739}," is the deepest this memory goes; there is no further tool\nthat knows more. Do not go fishing through the others — say what the evidence did establish and\nwhat it could not, and leave it there. More calls at that point produce a guess, not an answer.",{"type":46,"tag":2741,"props":2742,"children":2743},"style",{},[2744],{"type":52,"value":2745},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2747,"total":2928},[2748,2763,2782,2801,2817,2831,2845,2859,2875,2889,2902,2916],{"slug":2749,"name":2749,"fn":2750,"description":2751,"org":2752,"tags":2753,"stars":2760,"repoUrl":2761,"updatedAt":2762},"batch","execute parallel batch operations on files","Execute batch operations on multiple files in parallel. Automatically discovers files, splits into chunks, and processes with parallel worker agents. Use `\u002Fbatch` followed by operation and file pattern.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2754,2757],{"name":2755,"slug":2756,"type":16},"Automation","automation",{"name":2758,"slug":2759,"type":16},"Concurrency","concurrency",26008,"https:\u002F\u002Fgithub.com\u002FQwenLM\u002Fqwen-code","2026-07-20T05:58:45.650067",{"slug":2764,"name":2764,"fn":2765,"description":2766,"org":2767,"tags":2768,"stars":2760,"repoUrl":2761,"updatedAt":2781},"coordinate","coordinate Qwen Code teammates","Coordinate a small team of Qwen Code teammates with enforced read-only workers, an optional worktree-pinned writer, shared tasks, peer messages, and existing Agent View tabs. Invoke explicitly with \u002Fcoordinate.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2769,2772,2775,2778],{"name":2770,"slug":2771,"type":16},"Agents","agents",{"name":2773,"slug":2774,"type":16},"Coding","coding",{"name":2776,"slug":2777,"type":16},"Multi-Agent","multi-agent",{"name":2779,"slug":2780,"type":16},"Orchestration","orchestration","2026-08-28T14:39:06.826285",{"slug":2783,"name":2783,"fn":2784,"description":2785,"org":2786,"tags":2787,"stars":2760,"repoUrl":2761,"updatedAt":2800},"cua-driver","drive native GUI applications via MCP","Drive a native GUI app (macOS, Windows, Linux) via the Qwen Cua Driver CLI (default) or MCP server; snapshot its accessibility tree, act through snapshot-bound element tokens, native menu paths, exact window geometry, or pixel coordinates, and verify from fresh state. Use when the user asks you to operate, drive, automate, or perform a GUI task in a real application on the host.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2788,2791,2794,2797],{"name":2789,"slug":2790,"type":16},"Accessibility","accessibility",{"name":2792,"slug":2793,"type":16},"Browser Automation","browser-automation",{"name":2795,"slug":2796,"type":16},"Desktop","desktop",{"name":2798,"slug":2799,"type":16},"MCP","mcp","2026-09-04T07:24:36.155485",{"slug":2802,"name":2802,"fn":2803,"description":2804,"org":2805,"tags":2806,"stars":2760,"repoUrl":2761,"updatedAt":2816},"dataviz","design and validate data visualizations","Design guidance for charts, graphs, dashboards, maps, and data visualizations, including a local palette validator.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2807,2810,2813],{"name":2808,"slug":2809,"type":16},"Charts","charts",{"name":2811,"slug":2812,"type":16},"Dashboards","dashboards",{"name":2814,"slug":2815,"type":16},"Data Visualization","data-visualization","2026-07-16T05:59:28.31755",{"slug":2818,"name":2818,"fn":2819,"description":2820,"org":2821,"tags":2822,"stars":2760,"repoUrl":2761,"updatedAt":2830},"extension-creator","create Qwen Code extensions","Create, scaffold, customize, validate, and locally test Qwen Code extensions. Use when the user wants a new Qwen Code extension, needs help choosing an extension template, wants to add QWEN.md context, commands, skills, agents, MCP servers, settings, hooks, channels, or LSP servers, or asks how to link and test an extension locally. Invoke with `\u002Fextension-creator` followed by an extension path and optional template name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2823,2824,2827],{"name":2773,"slug":2774,"type":16},{"name":2825,"slug":2826,"type":16},"Documentation","documentation",{"name":2828,"slug":2829,"type":16},"Plugin Development","plugin-development","2026-07-16T05:59:24.818967",{"slug":2832,"name":2832,"fn":2833,"description":2834,"org":2835,"tags":2836,"stars":2760,"repoUrl":2761,"updatedAt":2844},"goal-draft","draft verifiable goal objectives","Turn a fuzzy intention into a \u002Fgoal objective the Goal verifier can actually judge - one outcome, numbered binary \"Done when\" checks that leave evidence in the transcript, guardrails, a budget, and a block protocol. Use when the user wants to set or define a goal, asks whether a goal is good enough, or says \"keep going until X\". Usage - \u002Fgoal-draft \u003Cwhat you want done>, or \u002Fgoal-draft \u003Cexisting goal> to tighten it. This skill only writes the objective; it never starts the work.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2837,2838,2841],{"name":2770,"slug":2771,"type":16},{"name":2839,"slug":2840,"type":16},"Product Management","product-management",{"name":2842,"slug":2843,"type":16},"Strategy","strategy","2026-09-04T07:24:35.093567",{"slug":2846,"name":2846,"fn":2847,"description":2848,"org":2849,"tags":2850,"stars":2760,"repoUrl":2761,"updatedAt":2858},"loop","run scheduled or self-paced prompt loops","Create a loop that runs a prompt now and follows up either on a fixed schedule or through self-paced wakeups. Usage - \u002Floop check the build, \u002Floop 5m check the build, \u002Floop check the PR every 30m. \u002Floop list to show jobs, \u002Floop clear to cancel all.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2851,2852,2855],{"name":2755,"slug":2756,"type":16},{"name":2853,"slug":2854,"type":16},"Productivity","productivity",{"name":2856,"slug":2857,"type":16},"Scheduling","scheduling","2026-07-16T05:59:25.50027",{"slug":2860,"name":2860,"fn":2861,"description":2862,"org":2863,"tags":2864,"stars":2760,"repoUrl":2761,"updatedAt":2874},"new-app","build new applications from scratch","Workflow for creating new applications from scratch. Covers requirements gathering, tech stack selection, scaffolding, implementation, and delivery of a functional prototype.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2865,2868,2871],{"name":2866,"slug":2867,"type":16},"Engineering","engineering",{"name":2869,"slug":2870,"type":16},"Prototyping","prototyping",{"name":2872,"slug":2873,"type":16},"Web Development","web-development","2026-07-16T05:59:25.157573",{"slug":2876,"name":2876,"fn":2877,"description":2878,"org":2879,"tags":2880,"stars":2760,"repoUrl":2761,"updatedAt":2888},"qc-helper","provide Qwen Code usage and configuration support","Answer any question about Qwen Code usage, features, configuration, and troubleshooting by referencing the official user documentation. Also helps users view or modify their settings.json. Invoke with `\u002Fqc-helper` followed by a question, e.g. `\u002Fqc-helper how do I configure MCP servers?` or `\u002Fqc-helper change approval mode to yolo`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2881,2884,2885],{"name":2882,"slug":2883,"type":16},"Configuration","configuration",{"name":2825,"slug":2826,"type":16},{"name":2886,"slug":2887,"type":16},"Reference","reference","2026-07-16T05:59:29.118413",{"slug":2890,"name":2890,"fn":2891,"description":2892,"org":2893,"tags":2894,"stars":2760,"repoUrl":2761,"updatedAt":2901},"review","review code for quality and security","Review changed code for correctness, security, code quality, and performance. Use when the user asks to review code changes, a PR, or specific files. Invoke with `\u002Freview`, `\u002Freview \u003Cpr-number>`, `\u002Freview \u003Cfile-path>`, `\u002Freview \u003Cpr-number> --comment` to post inline comments on the PR, `\u002Freview --fix` to apply the findings to your working tree, or `\u002Freview \u003Cpr-number> --resume` to continue an interrupted review of that PR instead of starting over. Add `--effort low|medium|high` to trade depth for speed (defaults to high for PRs, medium for local changes). Add `--topology minimal` to run the single-pass A\u002FB comparison arm instead of the pipeline.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2895,2898],{"name":2896,"slug":2897,"type":16},"Code Review","code-review",{"name":2899,"slug":2900,"type":16},"Security","security","2026-09-04T07:24:37.460737",{"slug":2903,"name":2903,"fn":2904,"description":2905,"org":2906,"tags":2907,"stars":2760,"repoUrl":2761,"updatedAt":2915},"simplify","clean up and simplify code changes","Review recent code changes for reuse, code quality, and efficiency, then directly apply straightforward cleanup improvements. Use when the user wants a post-implementation cleanup pass, pre-PR polish, or asks to simplify\u002Frefine recent changes. Invoke with `\u002Fsimplify` or `\u002Fsimplify \u003Cfocus>`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2908,2911,2912],{"name":2909,"slug":2910,"type":16},"Code Analysis","code-analysis",{"name":2866,"slug":2867,"type":16},{"name":2913,"slug":2914,"type":16},"Performance","performance","2026-07-20T05:58:46.653811",{"slug":2917,"name":2917,"fn":2918,"description":2919,"org":2920,"tags":2921,"stars":2760,"repoUrl":2761,"updatedAt":2927},"stuck","diagnose and debug stuck Qwen Code sessions","Diagnose frozen, stuck, or slow Qwen Code sessions on this machine. Scans for problematic processes, high CPU\u002Fmemory usage, hung subprocesses, and debug logs. Use \u002Fstuck or \u002Fstuck \u003CPID> to focus on a specific process.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2922,2925,2926],{"name":2923,"slug":2924,"type":16},"Debugging","debugging",{"name":2866,"slug":2867,"type":16},{"name":2913,"slug":2914,"type":16},"2026-07-16T05:59:25.838629",33,{"items":2930,"total":3033},[2931,2944,2963,2978,2995,3008,3016],{"slug":2932,"name":2932,"fn":2933,"description":2934,"org":2935,"tags":2936,"stars":29,"repoUrl":30,"updatedAt":2943},"qwen-mm-plugins-api","analyze media with Qwen vision models","Cloud MCP tools for understanding media, by model family. VL model: vision_chat (caption\u002FVQA), ocr, grounding (detect\u002Flocate objects). Omni model (reads frames + audio together): timestamped captioning, ASR (plain \u002F controllable \u002F multi-speaker diarized), temporal grounding, event counting, music captioning. Plus transcribe_audio (ASR) and segmentation (SAM3). Use when a question about an image\u002Fvideo\u002Faudio needs an external model, not just local reading.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2937,2938,2941,2942],{"name":14,"slug":15,"type":16},{"name":2939,"slug":2940,"type":16},"Computer Vision","computer-vision",{"name":2798,"slug":2799,"type":16},{"name":21,"slug":22,"type":16},"2026-08-15T03:20:16.767662",{"slug":2945,"name":2945,"fn":2946,"description":2947,"org":2948,"tags":2949,"stars":29,"repoUrl":30,"updatedAt":2962},"qwen-mm-plugins-blender","build and edit 3D scenes in Blender","Use whenever a task involves building or editing a 3D scene or asset in Blender — modeling, characters\u002Fpeople, architecture\u002Finteriors, terrain\u002Flandscapes, props, materials, lighting, or rendering. Covers discovering installed add-ons, using generators, importing and REFINING ready-made assets, and matching the result to the spec. Requires a running Blender instance with the blender-mcp addon (see Prerequisite).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2950,2953,2956,2959],{"name":2951,"slug":2952,"type":16},"3D","3d",{"name":2954,"slug":2955,"type":16},"Animation","animation",{"name":2957,"slug":2958,"type":16},"Creative","creative",{"name":2960,"slug":2961,"type":16},"Design","design","2026-08-05T05:58:30.425245",{"slug":2964,"name":2964,"fn":2965,"description":2966,"org":2967,"tags":2968,"stars":29,"repoUrl":30,"updatedAt":2977},"qwen-mm-plugins-core","analyze and visualize multimodal files","Local MCP tools to read and visualize any file — images, video, documents, code, data, 3D, NIfTI, notebooks, and more — plus image tools for cropping, annotating, and extracting frames.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2969,2972,2975,2976],{"name":2970,"slug":2971,"type":16},"Data Analysis","data-analysis",{"name":2973,"slug":2974,"type":16},"LLM","llm",{"name":2798,"slug":2799,"type":16},{"name":21,"slug":22,"type":16},"2026-08-25T03:28:28.11097",{"slug":2979,"name":2979,"fn":2980,"description":2981,"org":2982,"tags":2983,"stars":29,"repoUrl":30,"updatedAt":2994},"qwen-mm-plugins-edu-agent","generate math problem solving tutorial videos","Generate step-by-step math problem-solving tutorial videos in Chinese (Mandarin).\nUse when: (1) a user provides a math problem and wants an explanation video,\n(2) someone says \"make a math tutorial\", \"explain this equation\", \"create a\nteaching video for this problem\", \"讲解这道题\", \"生成解题视频\",\n(3) the user wants a Chinese-language math lesson covering formulas, equations,\nor geometric figures, (4) the user shares a math problem in text or LaTeX and\nasks for a video walkthrough, (5) the input is an image_assets\u002F folder\ncontaining problem images — the skill will extract the problem via visual\nrecognition, solve it, and generate a tutorial video. Teaching components are\nrendered as realistic objects (solid opaque panels, 3D cards, SVG figures) with a\nmodern aurora mesh aesthetic.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2984,2987,2990,2993],{"name":2985,"slug":2986,"type":16},"Content Creation","content-creation",{"name":2988,"slug":2989,"type":16},"Education","education",{"name":2991,"slug":2992,"type":16},"Mathematics","mathematics",{"name":27,"slug":28,"type":16},"2026-08-05T05:58:40.128581",{"slug":2996,"name":2996,"fn":2997,"description":2998,"org":2999,"tags":3000,"stars":29,"repoUrl":30,"updatedAt":3007},"qwen-mm-plugins-freecad","model parts and assemblies in FreeCAD","Use whenever a task involves parametric CAD in FreeCAD — modeling parts and assemblies, editing object properties, technical drawings, importing\u002Fexporting STEP\u002FSTL\u002FOBJ\u002FDXF, PDF\u002FExcel reports from a model, or finite-element (FEM\u002FCalculiX) analysis. Requires a running FreeCAD instance with the FreeCADMCP addon (see Prerequisite).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3001,3002,3005,3006],{"name":2951,"slug":2952,"type":16},{"name":3003,"slug":3004,"type":16},"CAD","cad",{"name":2960,"slug":2961,"type":16},{"name":2866,"slug":2867,"type":16},"2026-08-05T05:58:40.567406",{"slug":4,"name":4,"fn":5,"description":6,"org":3009,"tags":3010,"stars":29,"repoUrl":30,"updatedAt":31},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3011,3012,3013,3014,3015],{"name":14,"slug":15,"type":16},{"name":24,"slug":25,"type":16},{"name":18,"slug":19,"type":16},{"name":21,"slug":22,"type":16},{"name":27,"slug":28,"type":16},{"slug":3017,"name":3017,"fn":3018,"description":3019,"org":3020,"tags":3021,"stars":29,"repoUrl":30,"updatedAt":3032},"qwen-mm-plugins-search","search and extract web and image data","Web search and page extraction MCP tools (Serper, Exa, or Tavily) plus Serper Lens reverse-image search for confirming facts — web_search (find facts), web_extractor (read a page in depth), image_search (reverse-search a frame to identify an entity). Use to verify anything you cannot confirm from the media alone.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3022,3025,3026,3029],{"name":3023,"slug":3024,"type":16},"Data Extraction","data-extraction",{"name":2798,"slug":2799,"type":16},{"name":3027,"slug":3028,"type":16},"Search","search",{"name":3030,"slug":3031,"type":16},"Web Scraping","web-scraping","2026-08-15T03:20:15.96401",9]