pub struct CognifyConfig {Show 21 fields
pub max_chunk_size: usize,
pub chunk_overlap: usize,
pub chunk_strategy: ChunkStrategy,
pub chunks_per_batch: usize,
pub max_parallel_extractions: usize,
pub custom_extraction_prompt: Option<String>,
pub enable_summarization: bool,
pub summarization_batch_size: usize,
pub embed_triplets: bool,
pub embedding_batch_size: usize,
pub vector_collection_prefix: String,
pub incremental_loading: bool,
pub use_pipeline_cache: bool,
pub temporal_cognify: bool,
pub create_web_page_nodes: bool,
pub data_per_batch: usize,
pub token_counter_kind: TokenCounterKind,
pub graph_schema: Option<Value>,
pub summary_schema: Option<Value>,
pub custom_chunker: Option<CustomChunker>,
pub transcriber: Option<TranscriberHandle>,
}Expand description
Configuration for the cognify pipeline.
Design Principles:
- NO hardcoded values in pipeline code - everything flows through config
- NO environment variable reading in components (only in config construction if needed)
- Sensible defaults matching
cogneebehavior - Builder pattern for easy customization
What is NOT in this config:
- Storage/Database/LLM/Embedding instances (passed as Arc
to pipeline constructor) - Runtime data (data_items, dataset_id, etc. - passed to cognify() method)
- Provider-specific API keys (handled by provider implementations, not pipeline config)
Fields§
§max_chunk_size: usizeMaximum chunk size in tokens.
The sentinel value 1500 means “auto-calculate at pipeline time” via
CognifyConfig::auto_chunk_size. The pipeline in tasks.rs replaces the
sentinel with the computed value before executing — matching Python’s
get_max_chunk_tokens() behaviour where chunk_size=None at the cognify
entry point always triggers auto-calculation. The computed value depends on
the active embedding engine: ≈512 for the local ONNX/BGE default (512-token
sequence limit) and 8191 for an OpenAI-compatible engine at its default
max_completion_tokens (8191), both clamped by the LLM term (8192).
Pass an explicit value via CognifyConfig::with_chunk_size to override
the auto-calculation; any value other than the sentinel is used as-is.
chunk_overlap: usizeOverlap between chunks (in tokens). Python default: 10 (from ChunkConfig.chunk_overlap) Used when chunk_strategy is RECURSIVE or LANGCHAIN
chunk_strategy: ChunkStrategyChunking strategy. Python default: ChunkStrategy.PARAGRAPH Options: Paragraph (sentence-aware), Recursive (character-based with overlap)
chunks_per_batch: usizeNumber of chunks to process in a single batch during graph extraction. Python default: 100 (cognify parameter) Controls memory usage vs parallelism tradeoff
max_parallel_extractions: usizeMaximum number of parallel tasks for graph extraction within a batch. Python default: No explicit limit (uses asyncio.gather) Rust: Prevents spawning too many tokio tasks
custom_extraction_prompt: Option<String>Custom prompt for entity/relationship extraction. Python parameter: custom_prompt (optional) If None, uses default prompts from cognee_llm
enable_summarization: boolEnable text summarization stage. Python behavior: Always runs if summarization_model is set Default: true (matches Python)
summarization_batch_size: usizeBatch size for summarization (parallel summary generation). Python default: No explicit batching (processes all chunks in parallel) Rust: Prevents spawning too many tasks
embed_triplets: boolWhether to generate and index triplet embeddings. Triplets are formatted as “source › relationship › target” Python config: CognifyConfig.triplet_embedding (default: False)
embedding_batch_size: usizeBatch size for embedding generation (all types: chunks, entities, summaries, triplets). Python default: varies by provider (36 for OpenAI, 100 for others) Controls how many texts are embedded in a single API call
vector_collection_prefix: StringVector collection name prefix. Python default: Uses type names directly (“Entity”, “DocumentChunk”, etc.) Allows customization for multi-tenant or versioned deployments
incremental_loading: boolEnable incremental loading - only process new/changed data. When true, tracks processed data IDs to avoid reprocessing. Python parameter: incremental_loading (default: True)
use_pipeline_cache: boolEnable pipeline-level caching.
When true, skips datasets whose latest pipeline run status is Completed.
Requires a database connection to be provided.
Python parameter: use_pipeline_cache (default: False)
temporal_cognify: boolEnable temporal graph construction. Python parameter: temporal_cognify (default: False) Extracts events and timestamps for temporal reasoning
create_web_page_nodes: boolCreate WebPage/WebSite provenance nodes for URL-sourced documents.
When true, documents whose external metadata was produced by URL
ingestion create deterministic WebPage and WebSite nodes plus
DocumentChunk -> SOURCED_FROM -> WebPage and
WebPage -> PART_OF -> WebSite edges.
data_per_batch: usizeBatch size for data processing in temporal cognify. Python parameter: data_per_batch (default: 20)
token_counter_kind: TokenCounterKindHow to count tokens when chunking text.
Default is determined at construction time via TokenCounterKind::from_env.
graph_schema: Option<Value>Optional JSON Schema for custom graph extraction model.
When Some, the LLM uses this schema instead of the default
KnowledgeGraph schema for entity/relationship extraction.
Extracted data is stored as-is in chunk metadata.
Mirrors Python’s graph_model parameter.
summary_schema: Option<Value>Optional JSON schema for the summarization output.
Mirrors Python’s CognifyConfig.summarization_model (a Pydantic class,
default SummarizedContent). When Some, the summarization stage
requests this schema from the LLM instead of the built-in
SummarizedContent shape. The schema must contain a string
summary field — the pipeline reads summary to build each
TextSummary (Python parity).
Validated at setter/builder time via validate_summary_schema.
custom_chunker: Option<CustomChunker>Pluggable chunker callback.
When Some, this function is called instead of the built-in
paragraph/recursive chunking. The callback receives the text and
max token count, and returns a list of chunk strings.
Mirrors Python’s chunker parameter.
transcriber: Option<TranscriberHandle>Optional transcriber for audio/video document processing.
When Some, this transcriber is used to convert audio content into
text before chunking and graph extraction. Only takes effect when
processing documents classified as audio type.
Implementations§
Source§impl CognifyConfig
impl CognifyConfig
Sourcepub fn with_chunk_size(self, size: usize) -> CognifyConfig
pub fn with_chunk_size(self, size: usize) -> CognifyConfig
Set maximum chunk size in tokens.
Sourcepub fn with_chunk_overlap(self, overlap: usize) -> CognifyConfig
pub fn with_chunk_overlap(self, overlap: usize) -> CognifyConfig
Set chunk overlap (for recursive chunking).
Sourcepub fn with_chunk_strategy(self, strategy: ChunkStrategy) -> CognifyConfig
pub fn with_chunk_strategy(self, strategy: ChunkStrategy) -> CognifyConfig
Set chunking strategy.
Sourcepub fn with_chunks_per_batch(self, batch_size: usize) -> CognifyConfig
pub fn with_chunks_per_batch(self, batch_size: usize) -> CognifyConfig
Set number of chunks per batch during graph extraction.
Sourcepub fn with_max_parallel_extractions(self, limit: usize) -> CognifyConfig
pub fn with_max_parallel_extractions(self, limit: usize) -> CognifyConfig
Set maximum parallel extractions.
Sourcepub fn with_custom_prompt(self, prompt: String) -> CognifyConfig
pub fn with_custom_prompt(self, prompt: String) -> CognifyConfig
Set custom extraction prompt.
Sourcepub fn with_summarization(self, enable: bool) -> CognifyConfig
pub fn with_summarization(self, enable: bool) -> CognifyConfig
Enable or disable summarization.
Sourcepub fn with_summarization_batch_size(self, batch_size: usize) -> CognifyConfig
pub fn with_summarization_batch_size(self, batch_size: usize) -> CognifyConfig
Set summarization batch size.
Sourcepub fn with_triplet_embeddings(self, enable: bool) -> CognifyConfig
pub fn with_triplet_embeddings(self, enable: bool) -> CognifyConfig
Enable or disable triplet embeddings.
Sourcepub fn with_embedding_batch_size(self, batch_size: usize) -> CognifyConfig
pub fn with_embedding_batch_size(self, batch_size: usize) -> CognifyConfig
Set embedding batch size.
Sourcepub fn with_collection_prefix(self, prefix: String) -> CognifyConfig
pub fn with_collection_prefix(self, prefix: String) -> CognifyConfig
Set vector collection prefix.
Sourcepub fn with_incremental_loading(self, enable: bool) -> CognifyConfig
pub fn with_incremental_loading(self, enable: bool) -> CognifyConfig
Enable or disable incremental loading.
Sourcepub fn with_pipeline_cache(self, enable: bool) -> CognifyConfig
pub fn with_pipeline_cache(self, enable: bool) -> CognifyConfig
Enable or disable pipeline-level caching.
Sourcepub fn with_temporal_cognify(self, enable: bool) -> CognifyConfig
pub fn with_temporal_cognify(self, enable: bool) -> CognifyConfig
Enable or disable temporal cognify.
Sourcepub fn with_web_page_nodes(self, enable: bool) -> CognifyConfig
pub fn with_web_page_nodes(self, enable: bool) -> CognifyConfig
Enable or disable WebPage/WebSite provenance graph construction.
Sourcepub fn with_data_per_batch(self, batch_size: usize) -> CognifyConfig
pub fn with_data_per_batch(self, batch_size: usize) -> CognifyConfig
Set data per batch for temporal processing.
Sourcepub fn with_token_counter(self, kind: TokenCounterKind) -> CognifyConfig
pub fn with_token_counter(self, kind: TokenCounterKind) -> CognifyConfig
Set the token counter implementation to use during chunking.
Sourcepub fn with_graph_schema(self, schema: Value) -> CognifyConfig
pub fn with_graph_schema(self, schema: Value) -> CognifyConfig
Set a custom JSON Schema for graph extraction.
Sourcepub fn with_summary_schema(
self,
schema: Value,
) -> Result<CognifyConfig, ConfigError>
pub fn with_summary_schema( self, schema: Value, ) -> Result<CognifyConfig, ConfigError>
Set a custom JSON schema for summarization output (Python summarization_model parity).
The schema must contain a string summary field — the pipeline reads
summary to build each TextSummary. Returns an error if the schema
lacks that field so callers catch the misconfiguration early rather than
mid-pipeline.
Sourcepub fn with_custom_chunker(
self,
chunker: Arc<dyn Fn(&str, usize) -> Vec<String> + Sync + Send>,
) -> CognifyConfig
pub fn with_custom_chunker( self, chunker: Arc<dyn Fn(&str, usize) -> Vec<String> + Sync + Send>, ) -> CognifyConfig
Set a custom chunker callback.
Sourcepub fn with_transcriber(
self,
transcriber: Arc<dyn Transcriber>,
) -> CognifyConfig
pub fn with_transcriber( self, transcriber: Arc<dyn Transcriber>, ) -> CognifyConfig
Set a transcriber for audio document processing.
Sourcepub fn auto_chunk_size(
embedding_engine: &dyn EmbeddingEngine,
_llm: &dyn Llm,
) -> usize
pub fn auto_chunk_size( embedding_engine: &dyn EmbeddingEngine, _llm: &dyn Llm, ) -> usize
Auto-calculate max_chunk_size, mirroring Python’s get_max_chunk_tokens()
from cognee/infrastructure/llm/utils.py:
llm_cutoff_point = llm_max_completion_tokens // 2 # Python default: 16384 → 8192
max_chunk_tokens = min(embedding_engine.max_completion_tokens, llm_cutoff_point)Python uses completion-token budgets (not context windows):
embedding_engine.max_completion_tokens— the engine’s configured token limit. Python’sEmbeddingConfigdefault is 8191 (embeddings/config.py:81), passed to the engine by the factory; the engine class’s own__init__default of 512 is overridden in that path. Rust mirrors this:EmbeddingConfig.max_completion_tokensdefaults to 8191.llm_max_completion_tokens= 16384 (infrastructure/llm/config.py:51).- So for an OpenAI-compatible engine:
min(8191, 8192) = 8191. For the local ONNX/BGE engine,max_sequence_length()is the model’s 512-token limit, somin(512, 8192) = 512. The embedding term is the binding one in both cases.
The Rust Llm trait exposes only max_context_length() (a context window),
not a completion-token limit. Rather than divide an unrelated quantity, we use
Python’s LLM completion-token constant (16384) directly. The embedding term
(max_sequence_length() — 512 for BGE, the configured max_completion_tokens
for OpenAI-compatible) is binding in all practical configurations, so the LLM
argument is currently unused (_llm).
Result is at least 1.
Sourcepub fn with_auto_chunk_size(
self,
embedding_engine: &dyn EmbeddingEngine,
llm: &dyn Llm,
) -> CognifyConfig
pub fn with_auto_chunk_size( self, embedding_engine: &dyn EmbeddingEngine, llm: &dyn Llm, ) -> CognifyConfig
Set max_chunk_size by auto-calculating from embedding and LLM capabilities.
See auto_chunk_size for the formula used.
Sourcepub fn validate(&self) -> Result<(), ConfigError>
pub fn validate(&self) -> Result<(), ConfigError>
Validate configuration parameters.
Returns an error if any parameters are invalid.
Trait Implementations§
Source§impl Clone for CognifyConfig
impl Clone for CognifyConfig
Source§fn clone(&self) -> CognifyConfig
fn clone(&self) -> CognifyConfig
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for CognifyConfig
impl Debug for CognifyConfig
Source§impl Default for CognifyConfig
impl Default for CognifyConfig
Source§fn default() -> CognifyConfig
fn default() -> CognifyConfig
Source§impl<'de> Deserialize<'de> for CognifyConfig
impl<'de> Deserialize<'de> for CognifyConfig
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<CognifyConfig, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<CognifyConfig, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl Serialize for CognifyConfig
impl Serialize for CognifyConfig
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
Auto Trait Implementations§
impl !RefUnwindSafe for CognifyConfig
impl !UnwindSafe for CognifyConfig
impl Freeze for CognifyConfig
impl Send for CognifyConfig
impl Sync for CognifyConfig
impl Unpin for CognifyConfig
impl UnsafeUnpin for CognifyConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::RequestSource§impl<T, U, C> IntoWithContext<U, C> for Twhere
U: FromWithContext<T, C>,
impl<T, U, C> IntoWithContext<U, C> for Twhere
U: FromWithContext<T, C>,
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.