Documentation
¶
Overview ¶
Package config defines the amoxtli workspace configuration file (.amoxtli/config.yaml): parsing, environment variable interpolation and validation. The mapping of each field to the library API lives in internal/cli/runtime.
Index ¶
- Constants
- Variables
- func ExpandEnv(s string, lookup func(string) (string, bool)) (string, error)
- type ClientConfig
- type CodeIndexingConfig
- type Config
- func (c *Config) CodeEnabled() bool
- func (c *Config) HasChat() bool
- func (c *Config) HasEmbeddings() bool
- func (c *Config) HasLocalState() bool
- func (c *Config) IndexDriver() string
- func (c *Config) LLMCacheEnabled() bool
- func (c *Config) LLMCachePath() string
- func (c *Config) PostgresIndexDSN() string
- func (c *Config) Validate() error
- func (c *Config) VectorEnabled() bool
- type ConverterConfig
- type DecompositionConfig
- type FulltextIndexConfig
- type GenAIConverterConfig
- type IndexConfig
- type IndexingConfig
- type IterativeConfig
- type LLMCacheConfig
- type LLMConfig
- type LibreOfficeConfig
- type PandocConfig
- type PostgresIndexConfig
- type RetrievalConfig
- type StoreConfig
- type Toggle
- type VectorIndexConfig
Constants ¶
const ( // ProfileFast disables every per-search chat call (no HyDE, no Judge): // embeddings + weighted RRF fusion + dedup only. ProfileFast = "fast" // ProfileBalanced keeps HyDE (one cached, seeded chat call) but no Judge. ProfileBalanced = "balanced" // ProfilePrecision adds the fused grounding evaluator on top of HyDE. ProfilePrecision = "precision" )
Retrieval profiles: presets of the LLM retrieval stages, from cheapest to most thorough. The SciFact evaluations showed the embedder dominates quality, so the cheap profile is usually competitive.
const DefaultLLMCachePath = "cache"
DefaultLLMCachePath is the LLM cache root used when llm.cache.path is left empty, relative to the .amoxtli directory.
const Template = `` /* 6211-byte string literal not displayed */
Template is the commented configuration written by "amoxtli init". It must stay loadable as-is (comments are not expanded, see ExpandEnv).
Variables ¶
var Profiles = []string{ProfileFast, ProfileBalanced, ProfilePrecision}
Profiles lists the accepted retrieval.profile values.
var StageNames = []string{"hyde", "judge", "grounding", "rerank", "decompose", "reformulate"}
StageNames lists the retrieval stages accepted under llm.stages, mirroring amoxtli.Stages.
var SupportedProviders = []string{"openai", "openrouter", "mistral"}
SupportedProviders lists the llm.chat / llm.embeddings providers the CLI can wire. All share provider.CommonOptions (model, base_url, api_key).
Functions ¶
func ExpandEnv ¶
ExpandEnv expands $VAR and ${VAR} references in s using lookup, supporting the ${VAR:-default} fallback syntax and $$ as a literal dollar escape. A reference to an undefined variable without a default is an error (fail fast rather than silently injecting an empty secret).
Full-line comments (lines whose first non-blank character is '#') are left untouched, so configuration examples in comments are not expanded.
Types ¶
type ClientConfig ¶
type CodeIndexingConfig ¶ added in v0.0.4
type CodeIndexingConfig struct {
// Enabled accepts true, false or "auto"; auto (the default) enables
// source-code indexing (it is pure Go and needs no external tool). Source
// files are split into declaration-level sections and tagged with
// `type=code` and `language=<name>` metadata, filterable at search time.
Enabled Toggle `yaml:"enabled"`
// Extensions extends or overrides the built-in extension→language mapping,
// e.g. {".phtml": "php"}. Languages: go, javascript, typescript, tsx,
// python, php.
Extensions map[string]string `yaml:"extensions"`
}
type Config ¶
type Config struct {
Version int `yaml:"version"`
Store StoreConfig `yaml:"store"`
Index IndexConfig `yaml:"index"`
LLM LLMConfig `yaml:"llm"`
Retrieval RetrievalConfig `yaml:"retrieval"`
Converter ConverterConfig `yaml:"converter"`
Indexing IndexingConfig `yaml:"indexing"`
}
func Default ¶
func Default() *Config
Default returns the configuration used when a field is absent from the file; zero numeric values defer to the library defaults.
func Load ¶
Load reads, expands and validates the configuration file at path. Variable references are resolved against the process environment, then against an optional .env file sitting next to the configuration file.
func Parse ¶
Parse expands and decodes a raw configuration document, then validates it. Unknown fields are rejected to catch typos early.
func (*Config) CodeEnabled ¶ added in v0.0.4
CodeEnabled resolves the source-code indexing toggle; it defaults to enabled (pure Go, no external dependency).
func (*Config) HasEmbeddings ¶
HasEmbeddings reports whether an embeddings client is configured.
func (*Config) HasLocalState ¶ added in v0.0.10
HasLocalState reports whether the workspace opens any file-based backend that a single process must hold exclusively (bleve, sqlite-vec or the sqlite store). When false, the workspace is fully backed by a client-server database and several processes may run against it concurrently, so the exclusive workspace lock is skipped.
func (*Config) IndexDriver ¶ added in v0.0.10
IndexDriver returns the normalized index backend ("local" when unset).
func (*Config) LLMCacheEnabled ¶ added in v0.2.0
LLMCacheEnabled resolves the LLM cache toggle: enabled by default as soon as an embeddings or chat client is configured.
func (*Config) LLMCachePath ¶ added in v0.2.0
LLMCachePath returns the configured LLM cache root directory, falling back to DefaultLLMCachePath. The path may be relative to the .amoxtli directory (resolve it with workspace.Resolve).
func (*Config) PostgresIndexDSN ¶ added in v0.0.10
PostgresIndexDSN returns the DSN the postgres index should connect to, falling back to the store DSN when the index DSN is left empty and the store is itself postgres.
func (*Config) Validate ¶
Validate checks cross-field constraints and rejects combinations that would fail later with an obscure error.
func (*Config) VectorEnabled ¶
VectorEnabled resolves the vector index toggle against the presence of an embeddings client. It only governs the local sqlite-vec index; the postgres index manages its vector leg internally.
type ConverterConfig ¶
type ConverterConfig struct {
Pandoc PandocConfig `yaml:"pandoc"`
LibreOffice LibreOfficeConfig `yaml:"libreoffice"`
GenAI GenAIConverterConfig `yaml:"genai"`
}
type DecompositionConfig ¶
type FulltextIndexConfig ¶
type GenAIConverterConfig ¶
type GenAIConverterConfig struct {
// Enabled turns on the GenAI (OCR/LLM) converter. It is opt-in: a DSN and
// at least one extension are required.
Enabled bool `yaml:"enabled"`
// DSN selects the extraction backend, e.g. mistral://?apiKey=${MISTRAL_API_KEY}
// or marker://host:port.
DSN string `yaml:"dsn"`
// Extensions are routed to this converter (e.g. .pdf, .png, .jpg).
Extensions []string `yaml:"extensions"`
}
type IndexConfig ¶
type IndexConfig struct {
// Driver selects the index backend. "local" (the default) uses the
// file-based bleve full-text index and the sqlite-vec vector index,
// configured through the fulltext/vector sections below. "postgres" uses a
// single hybrid PostgreSQL index (native full-text + pgvector), suitable
// for a shared deployment where several processes query the same database
// concurrently.
Driver string `yaml:"driver"`
Fulltext FulltextIndexConfig `yaml:"fulltext"`
Vector VectorIndexConfig `yaml:"vector"`
Postgres PostgresIndexConfig `yaml:"postgres"`
}
type IndexingConfig ¶
type IndexingConfig struct {
MaxWordsPerSection int `yaml:"max_words_per_section"`
TaskParallelism int `yaml:"task_parallelism"`
PersistentTasks bool `yaml:"persistent_tasks"`
Code CodeIndexingConfig `yaml:"code"`
}
type IterativeConfig ¶
type LLMCacheConfig ¶ added in v0.2.0
type LLMCacheConfig struct {
// Enabled accepts true, false or "auto"; auto (the default) enables the
// cache whenever an embeddings or chat client is configured.
Enabled Toggle `yaml:"enabled"`
// Path is the cache root directory, relative to the .amoxtli directory
// (default "cache"). Entries are keyed by model, so switching model never
// serves results from the wrong space.
Path string `yaml:"path"`
}
LLMCacheConfig configures the persistent LLM cache. Embedding a text is deterministic for a given model — and the HyDE completion is seeded per query — so both are reused across runs: re-indexing unchanged content and repeating a query become cache hits instead of billable, rate-limited calls.
type LLMConfig ¶
type LLMConfig struct {
Chat *ClientConfig `yaml:"chat"`
Embeddings *ClientConfig `yaml:"embeddings"`
// Stages assigns a dedicated chat client to individual retrieval stages
// (hyde, judge, grounding, rerank, decompose, reformulate), overriding
// llm.chat for that stage. The main cost lever of a search: point the
// high-volume stages (hyde, judge) at a small fast model while keeping a
// stronger model as the default. Requires llm.chat.
Stages map[string]*ClientConfig `yaml:"stages"`
// Cache is the persistent on-disk LLM cache: embedding vectors (below
// <path>/embeddings) and deterministic seeded chat completions such as
// HyDE (below <path>/chat).
Cache LLMCacheConfig `yaml:"cache"`
}
type LibreOfficeConfig ¶
type LibreOfficeConfig struct {
// Enabled accepts true, false or "auto"; auto enables the LibreOffice
// converter when both the libreoffice and pandoc binaries are found. It
// supersedes the standalone pandoc converter, adding .doc support.
Enabled Toggle `yaml:"enabled"`
}
type PandocConfig ¶
type PandocConfig struct {
// Enabled accepts true, false or "auto"; auto enables the pandoc
// converter when the binary is found in the PATH.
Enabled Toggle `yaml:"enabled"`
}
type PostgresIndexConfig ¶ added in v0.0.10
type PostgresIndexConfig struct {
// DSN is the PostgreSQL connection string. When empty it defaults to
// store.dsn (only valid when the store is also postgres), letting the index
// and the document store share a single database.
DSN string `yaml:"dsn"`
Weight float64 `yaml:"weight"`
// VectorSize is the pgvector column dimension; 0 defers to the library
// default.
VectorSize int `yaml:"vector_size"`
// MaxWords bounds the chunk size sent to the embeddings model; 0 defers to
// the library default.
MaxWords int `yaml:"max_words"`
// TextSearchConfig is the regconfig used when language detection is
// inconclusive; empty defers to the library default ("simple").
TextSearchConfig string `yaml:"text_search_config"`
}
PostgresIndexConfig configures the hybrid PostgreSQL index (index.driver: postgres). The vector leg is active only when llm.embeddings is configured; otherwise the index degrades to full-text search only.
type RetrievalConfig ¶
type RetrievalConfig struct {
// Profile selects a preset of retrieval stages: "fast" (no per-search
// chat call), "balanced" (HyDE only) or "precision" (HyDE + grounding
// evaluator). Empty keeps the historical default (HyDE + Judge when
// llm.chat is configured). Explicit keys below still apply on top of the
// profile (they can enable more stages, not disable the profile's).
Profile string `yaml:"profile"`
Reranking bool `yaml:"reranking"`
GroundingCheck bool `yaml:"grounding_check"`
GroundingFailOpen bool `yaml:"grounding_fail_open"`
// MaxTotalWords bounds the prompt size (in words) of the LLM retrieval
// stages (reranker, judge, evidence evaluator). Keep it low enough that the
// resulting prompt fits your chat endpoint's context window: words are only
// a coarse proxy for tokens (~1.8 tokens/word on mixed prose and code), so
// 18000 words already overflow a 32k-token limit. Zero defers to the
// library default (8000).
MaxTotalWords int `yaml:"max_total_words"`
// MaxSectionWords bounds how many words of each retrieved section are
// included in those prompts, on top of MaxTotalWords. Relevance is almost
// always judgeable from the beginning of a section, so a low cap cuts the
// per-search prompt cost. Zero defers to the library default (200).
MaxSectionWords int `yaml:"max_section_words"`
Iterative IterativeConfig `yaml:"iterative"`
Decomposition DecompositionConfig `yaml:"decomposition"`
}
type StoreConfig ¶
type StoreConfig struct {
// Driver selects the document store backend: "sqlite" (file-based) or
// "postgres" (client-server, for a shared/concurrent deployment).
Driver string `yaml:"driver"`
// DSN is the store location. For sqlite it is a path relative to the
// .amoxtli directory; for postgres it is a connection string
// (postgres://user:pass@host:5432/db?sslmode=disable).
DSN string `yaml:"dsn"`
}
type Toggle ¶
type Toggle string
Toggle is a tri-state flag accepting true, false or "auto" in YAML.
type VectorIndexConfig ¶
type VectorIndexConfig struct {
// Enabled accepts true, false or "auto"; auto enables the vector index
// when an embeddings client is configured.
Enabled Toggle `yaml:"enabled"`
Path string `yaml:"path"`
Weight float64 `yaml:"weight"`
VectorSize int `yaml:"vector_size"`
MaxWords int `yaml:"max_words"`
// EmbeddingsConcurrency bounds how many embedding batches are computed in
// parallel for a single document. It is the main lever for large-file
// indexing latency (one big file is a single task, so cross-file parallelism
// does not help it). Raise it if your embeddings endpoint tolerates more
// concurrent requests; lower it to avoid rate limiting (429). 0 defers to the
// library default.
EmbeddingsConcurrency int `yaml:"embeddings_concurrency"`
// ReadPool is the number of dedicated read connections opened for
// concurrent searches (WAL). 0 defers to the library default (4).
ReadPool int `yaml:"read_pool"`
// CoarseQuantization enables the two-stage vector search: a fast KNN on
// binary-quantized vectors preselects candidates, re-scored with the full
// float vectors. Worthwhile on large corpora (100k+ chunks); requires a
// vector size divisible by 8. Off by default.
CoarseQuantization bool `yaml:"coarse_quantization"`
}