cognee.recall(), while the lower-level cognee.search() API remains available when you need direct retriever control.
Before you start:
- Complete Quickstart to understand basic operations
- Ensure you have LLM Providers configured for LLM-backed retrieval types
- Run
cognee.remember(...)or otherwise build the graph before querying it - Keep at least one dataset with
readpermission for the user running the search
Code in Action
When you call
recall() without an explicit query_type, Cognee uses its default auto-routing behavior to choose the best retrieval strategy for the query. To learn more about that routing behavior and the available lower-level search types, see Recall and Search Types.Parameters Reference
All examples below assume you are inside an async function. Import helpers when needed:Core and Prompt Parameters
Core and Prompt Parameters
-
query_text(str, required): The question or phrase to search for. -
query_type(SearchType, optional): Sets the retrieval mode. Withrecall(), omitting it enables auto-routing by default; if you pass it explicitly, that strategy is used directly. See Search Types for the full list and Retrievers for how each type maps to a retriever. To pick a type by latency and accuracy, see the speed vs. accuracy comparison. -
top_k(int, optional, default: 15): Maximum number of results to return. -
system_prompt_path(str, optional, default:"answer_simple_question.txt"): Path to a prompt file packaged with your project. -
system_prompt(Optional[str]): Inline prompt string. Overridessystem_prompt_pathwhen set. -
only_context(bool, optional, default: False): Skip the LLM completion step and return the retrieved context directly. This avoids the final LLM call and is useful when you want to inspect or reuse the context yourself.only_context=Trueworks with any search type. For LLM-completion types (GRAPH_COMPLETION,RAG_COMPLETION, etc.) it returns the text that would have been sent to the LLM. For retrieval-only types (CHUNKS,SUMMARIES) the behavior is effectively unchanged because no final LLM call is made.
Advanced Parameters
Advanced Parameters
wide_search_top_k(int, optional, default: 100): Caps initial candidate retrieval for graph-completion retrievers before ranking. Increase for broader recall on large graphs.triplet_distance_penalty(float, optional, default: 6.5): Penalty applied in graph retrieval ranking. Controls how triplet distance influences final result ordering.retriever_specific_config(dict, optional): Per-retriever options. Examples:response_modelfor typed LLM output;max_iterfor GRAPH_COMPLETION_COT;context_extension_roundsfor GRAPH_COMPLETION_CONTEXT_EXTENSION. See the API reference for full keys.Useinclude_global_context_indexafter building the index withcognee.improve(..., build_global_context_index=True). See Global Context Index.verbose(bool, optional, default: False): Whentrue, results includetext_result,context_result, andobjects_resultfields alongside the answer.include_references(bool, optional, default: True): Whentrue, completion-style answers (GRAPH_COMPLETION,RAG_COMPLETION, etc.) get a deterministicEvidence:block appended to the answer text, citing the source chunks or graph context. Set toFalseto restore the exact prior answer text. See Citation and Source Tracking for details.
Node Sets & Filtering Parameters
Node Sets & Filtering Parameters
These options scope retrieval to specific node sets. Set both
node_type and node_name to filter — use the same names you passed to cognee.add(..., node_set=[...]). See NodeSets for background.node_type(Optional[Type], optional, default:NodeSet): The graph model to search. Leave asNodeSetunless you have a custom node model.node_name(Optional[List[str]]): Names of the node sets to include.`node_name` example
node_name_filter_operator(str, optional, default:"OR"): Controls how multiple node-set names are combined."OR"returns results connected to any of the listed node sets;"AND"returns results connected to all of them.`node_name_filter_operator` example
Node-set filtering applies to graph-completion search types (
GRAPH_COMPLETION, GRAPH_COMPLETION_COT, GRAPH_COMPLETION_CONTEXT_EXTENSION, GRAPH_SUMMARY_COMPLETION, TEMPORAL) and to CHUNKS. For CHUNKS, the filter is applied to the underlying vector search by matching the chunk’s belongs_to_set payload against node_name using node_name_filter_operator; node_type is not used. It has no effect on SUMMARIES, RAG_COMPLETION, CYPHER, or NATURAL_LANGUAGE.Interaction & History Parameters
Interaction & History Parameters
session_id(Optional[str]): Links this recall to a conversation session. Withrecall(), passingsession_idby itself makes Cognee search session cache entries first; if nothing matches, it falls through to graph retrieval. Whensession_idis reused across completion-style recalls, previous Q&A turns can also be included in the prompt context. If omitted while caching is enabled, Cognee writes todefault_session.See Sessions Guide for complete examples. To record feedback on answers, see the Feedback System.
Datasets & Users
Datasets & Users
-
datasets(Optional[Union[list[str], str]]): Limit search to specific dataset names. -
dataset_ids(Optional[Union[list[UUID], UUID]]): Same asdatasets, using UUIDs instead of names. -
user(Optional[User]): The user to run the search as. Required for multi-tenant flows or background jobs.WhenENABLE_BACKEND_ACCESS_CONTROL=true:-
Result shape: Searches run only on datasets the user can access. Results are returned as a list of per-dataset objects (
dataset_name,dataset_id,search_result). Useverbose=Trueto includetext_result,context_result, andobjects_resultin each item. -
Parallel execution: Multiple datasets are searched concurrently using
asyncio.gather()— total time is roughly that of the slowest single-dataset search. -
If no
useris given,get_default_user()is used (created if missing); an error is raised only if this user lacks dataset permissions. -
If
datasetsis not set, all datasets readable by the user are searched. An error is raised if none are accessible or if a requested dataset is forbidden.
ENABLE_BACKEND_ACCESS_CONTROL=false:- Dataset filters (
datasets,dataset_ids) are ignored — all data is searched. - Results are returned as a plain list (e.g.
["answer1", "answer2"]). If only one dataset is searched and the retriever returns a list, Cognee may unwrap one level for backwards compatibility.
-
Result shape: Searches run only on datasets the user can access. Results are returned as a list of per-dataset objects (
Citation and Source Tracking
Provenance is available at two levels:- Dataset level — when
ENABLE_BACKEND_ACCESS_CONTROL=true, results are wrapped withdataset_nameanddataset_id. - Chunk/summary level —
CHUNKSandSUMMARIESresults include anidyou can use to look up the item in the graph.
Evidence block (include_references)
For completion-style answers (GRAPH_COMPLETION, RAG_COMPLETION, and similar), Cognee appends a short Evidence: block to the answer text by default (include_references=True). It lists the chunks or graph context the answer was grounded in — for example, - chunk 2 of document policy.pdf: "…".
- Deterministic and in-process: the block is assembled locally from the retrieved payloads or graph context. There is no extra LLM call and no prompt injection — it is appended after completion generation.
- Response schema unchanged: Evidence is added to the answer text only. Return types and result shapes are the same as before, and non-string
response_modelpaths are unaffected. - Graceful degradation: chunk-level evidence is used when the vector payload carries
document_name/document_id. Older indexes that predate these fields fall back to entity → chunk → document graph traversal where the backend supports it, or omit the Evidence block silently (no errors) when neither is available. - Opting out: set
include_references=Falseto restore the exact previous answer text. This is useful when you compare against stored snapshots or evaluation baselines, which will otherwise diff against the new Evidence block.
Search results do not include raw source file paths. Evidence can show document names when reference metadata is available, but
raw_data_location stays on the Document node. To trace a result back to the original stored file path, use dataset provenance or query the graph by id.Chunk-level fields (`CHUNKS`)
Chunk-level fields (`CHUNKS`)
SearchType.CHUNKS returns a list of dicts with these fields:| Field | Type | Description |
|---|---|---|
id | str | Chunk UUID |
text | str | Raw chunk text |
chunk_index | int | Position of this chunk within the source document |
chunk_size | int | Token count of this chunk |
cut_type | str | How the boundary was chosen (sentence_end, paragraph_end, etc.) |
Summary-level fields (`SUMMARIES`)
Summary-level fields (`SUMMARIES`)
SearchType.SUMMARIES returns a list of dicts with these fields:| Field | Type | Description |
|---|---|---|
id | str | Summary UUID |
text | str | Summary text |
Look up a chunk or node directly by ID
Look up a chunk or node directly by ID
For Use
CHUNKS and SUMMARIES, recall() (and the lower-level cognee.search()) use query_text as a retrieval query, not as an identifier lookup. Passing a chunk or summary id as the query searches for semantically similar content and can return unrelated results (or nothing) — not that specific item.For most workflows, keep the id as provenance metadata and use normal recall() queries to retrieve related content. If you need to inspect a specific chunk, summary, or graph node during debugging, query the databases directly:get_node(node_id) / get_nodes(node_ids) for graph lookups and retrieve(collection_name, data_point_ids) for vector-store lookups. Use DocumentChunk_text for CHUNKS IDs and TextSummary_text for SUMMARIES IDs.get_graph_engine() is async (use await); get_vector_engine() is synchronous, but its retrieve method is async. With ENABLE_BACKEND_ACCESS_CONTROL=true, these getters return the default databases — direct lookups bypass the per-dataset isolation applied by recall().Dataset-level provenance (access control enabled)
Dataset-level provenance (access control enabled)
When When
ENABLE_BACKEND_ACCESS_CONTROL=true, every result is wrapped with dataset information:ENABLE_BACKEND_ACCESS_CONTROL=false, results are a plain list with no dataset_name or dataset_id wrapper.Raw source objects (LLM-completion modes)
Raw source objects (LLM-completion modes)
For modes that return a generated answer (
GRAPH_COMPLETION, RAG_COMPLETION, etc.), use verbose=True to receive the raw retrieved objects alongside the answer:Full Example
Latest guide
Latest guide
Legacy guide
Legacy guide
recall() is the current high-level retrieval entry point. It routes the query to the best available retrieval strategy and can still use graph-backed search under the hood.Additional Examples
Additional examples are available on our GitHub.Custom Prompts
Learn about custom prompts for tailored answers
Permission Snippets
Multi-tenant deployment patterns
API Reference
Explore all search types and parameters
Sessions
Enable conversational memory with sessions
Agent Memory Decorator
Attach retrieval to an agent function boundary