Repository navigation
feat(find): find assets by face, voice, entity, topic, type, content type and date - #398
Merged
Merged
Conversation
…nt type and date One filter for the API (POST /find), the MCP server (find) and the assistant (find_resources): who is seen in a resource (faces) and heard (speakers), the entities it mentions, the topics it is about (narrower topics included), its kind and content type, when it was made (a day, a month or a year), tags, language, objects seen, emotions heard, length, status, collection, origin and words said in it. Faces, speakers, entities and topics take ids or names; `resolved` says what each name matched, and a name that matches nothing is an error naming the closest. Each result says why it matched, with up to three moments per reason to cite. The Library list (GET /resources) takes face, entity, topic, content_type and emotion ids as filters too. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GKv2oVRvFRdiSf4USLsM1N
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GKv2oVRvFRdiSf4USLsM1N
…-26l27n # Conflicts: # CHANGELOG.md
…-26l27n # Conflicts: # CHANGELOG.md
Merged
16 of 22 tasks
adeelahmad
added a commit
that referenced
this pull request
Oct 15, 2026
…pages and notes as built (#424) Move usage analytics (#274) and assets and people (#273) out of the README's In progress list, and add what merged since #383: a namespace's own MCP server, chat completions and one-namespace API keys; editing and merging entities and topics with undo, from agents too; entity pages at wiki addresses; Connect with Google and rclone sign-in on the server; the notes tree, today's note, pins, search and Recently deleted; backups that keep Lens's files; and grouped, searchable settings. In progress now lists the open feature PRs (#398, #400, #402, #408, #419), and the docs index links usage analytics. Claude-Session: https://claude.ai/code/session_01HDx7PPUauyjMn1LZs8JAsS Co-authored-by: Adeel Ahmad <noreply@anthropic.com>
…-26l27n # Conflicts: # CHANGELOG.md # docs/api.md # docs/assistant.md # docs/mcp.md # fastapi_backend/app/api/v1/routes/recordings.py # fastapi_backend/app/domain/ai_tools.py # nextjs-frontend/app/openapi-client/index.ts
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GKv2oVRvFRdiSf4USLsM1N
This was referenced Oct 17, 2026
adeelahmad
pushed a commit
that referenced
this pull request
Oct 17, 2026
… checks The README's Connect your agents and Automate it items now name find, classify and the workflow Classify node, docs/requirements.md backs each with its tests, and the merged #398 leaves In progress. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GKv2oVRvFRdiSf4USLsM1N
21 of 23 tasks
adeelahmad
added a commit
that referenced
this pull request
Oct 17, 2026
* feat(workflows): a classify node on the canvas A Classify node picks one of your labels, a content type or a topic for the recording (or for what came in) and passes on the choice, how sure and every label ranked; set to act, a sure answer sets the content type, suggests the topic or adds the tag, so the node keeps something by itself. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GKv2oVRvFRdiSf4USLsM1N * docs(requirements): list finding and classifying as built, with their checks The README's Connect your agents and Automate it items now name find, classify and the workflow Classify node, docs/requirements.md backs each with its tests, and the merged #398 leaves In progress. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GKv2oVRvFRdiSf4USLsM1N --------- Co-authored-by: Adeel Ahmad <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Adeel · project thread
Description
Before: an agent could search words (
search), list recordings by a few attributes (list_recordings: namespace, title, dates, speaker, tag, kind), or ask for similar content. It couldn't ask "videos with Adeel's face from 2025", "podcasts that mention Dyno Therapeutics", or "what is about Health", and it had to look up ids first.After: one core find service, used by the API (
POST /api/v1/find), the MCP server (find) and the assistant (find_resources). It finds resources by:2025is the whole year); and length;Faces, speakers, entities and topics take ids or names (ignoring case; an entity's other names and any topic label count).
resolvedsays what each name matched. A name that matches nothing returns an error naming the closest ones, so an agent can correct itself.Each result says why it matched (
why), with up to three moments per reason to cite: where the words are, when the face is on screen (or which pages), the speaker's first lines, the lines that mention the entity, and the topic, content type, object or emotion that matched. MCP moments carry links that open at that moment. Assistant moments are numbered[n], so answers cite them.The Library list (
GET /resources) also takesface,entity,topic,content_typeandemotionids, ready for the web app's filter bar.Motivation and Context
Adeel asked for core services that agents and workflows can use: classify, plus search by face, voice, entity, type, content type, date and other attributes. This PR is the search half. Classify (decision model) follows in its own PR.
How:
domain/find.pyresolves names inside the asker's namespaces, then builds on the existinglibrary.wherefilters, which gained faces, entities, topics, content types, emotions, a recording-id set and a list of kinds. It reusessearch.searchfortext, ranks by the best matching moment, and buildswhyfromface_track,segment,mentionsandtopic_about. Content types are worked out the waycontent_types.of_recordingdoes it (keys_of), so nothing new is stored.Types of changes
!in the title)Checklist:
make hookschecks it on commit).docs/accordingly.## UnreleasedinCHANGELOG.md.Done questions (AGENTS.md)
POST /find, MCPfind, assistantfind_resources. Assistant tool graphs reach it throughcall_tool.acl.scope); name hints come only from their namespaces. No new attack surface, so the threat model is unchanged.textby meaning when it's set up (one embedding, already in the activity ledger).tests/api/test_find.py,docs/processing.md,docs/api.md,docs/mcp.md,docs/assistant.md,make openapi.Local checks:
ruff check,ruff format --check,mypy, full backend suite (1089 passed, 20 skipped),mkdocs build --strict.🤖 Generated with Claude Code
https://claude.ai/code/session_01GKv2oVRvFRdiSf4USLsM1N
Generated by Claude Code