Jesús Pérez 44648e3206
chore: complete nickel migration and consolidate legacy configs
- Remove KCL ecosystem (~220 files deleted)
- Migrate all infrastructure to Nickel schema system
- Consolidate documentation: legacy docs → provisioning/docs/src/
- Add CI/CD workflows (.github/) and Rust build config (.cargo/)
- Update core system for Nickel schema parsing
- Update README.md and CHANGES.md for v5.0.0 release
- Fix pre-commit hooks: end-of-file, trailing-whitespace
- Breaking changes: KCL workspaces require migration
- Migration bridge available in docs/src/development/
2026-01-08 09:55:37 +00:00

103 lines
5.7 KiB
XML

# RAG System Validator
let rag_schema = import "../schemas/rag.ncl" in
let constraints = import "../constraints/constraints.toml" in
{
validate_rag_config | rag_schema.RagConfig -> Array String = fun config =>
let errors = [] in
# If RAG is disabled, skip subsystem validation
let errors = if config.rag.enabled != true
then [] # No validation needed for disabled RAG
else
let errors = [] in
# Embeddings validation
let errors = if config.embeddings != null
then
let e = [] in
let e = if std.array.length config.embeddings.model == 0
then e @ ["Embeddings model cannot be empty"]
else e in
let e = if config.embeddings.dimension < 1
then e @ ["Embeddings dimension must be positive"]
else e in
let e = if config.embeddings.provider == "openai" || config.embeddings.provider == "anthropic"
then if std.is_null config.embeddings.api_key
then e @ ["API key required for #{config.embeddings.provider} embeddings"]
else e
else e in
errors @ e
else errors in
# Vector DB validation
let errors = if config.vector_db != null
then
let e = [] in
let e = if config.vector_db.db_type == "surrealdb" || config.vector_db.db_type == "qdrant" || config.vector_db.db_type == "milvus"
then if std.is_null config.vector_db.url || config.vector_db.url == ""
then e @ ["Database URL required for #{config.vector_db.db_type}"]
else e
else e in
let e = if std.array.length config.vector_db.namespace == 0
then e @ ["Namespace cannot be empty"]
else e in
errors @ e
else errors in
# LLM validation
let errors = if config.llm != null
then
let e = [] in
let e = if std.array.length config.llm.model == 0
then e @ ["LLM model cannot be empty"]
else e in
let e = if config.llm.provider == "anthropic" || config.llm.provider == "openai"
then if std.is_null config.llm.api_key
then e @ ["API key required for #{config.llm.provider} LLM"]
else e
else e in
let e = if config.llm.temperature < 0.0 || config.llm.temperature > 1.0
then e @ ["Temperature must be between 0.0 and 1.0"]
else e in
let e = if config.llm.max_tokens < 1
then e @ ["Max tokens must be positive"]
else e in
errors @ e
else errors in
# Retrieval validation
let errors = if config.retrieval != null
then
let e = [] in
let e = if config.retrieval.top_k < 1
then e @ ["Top K must be at least 1"]
else e in
let e = if config.retrieval.similarity_threshold < 0.0 || config.retrieval.similarity_threshold > 1.0
then e @ ["Similarity threshold must be between 0.0 and 1.0"]
else e in
errors @ e
else errors in
# Ingestion validation
let errors = if config.ingestion != null
then
let e = [] in
let e = if config.ingestion.chunk_size < 1
then e @ ["Chunk size must be positive"]
else e in
let e = if config.ingestion.overlap >= config.ingestion.chunk_size
then e @ ["Overlap must be less than chunk size"]
else e in
let e = if std.array.length config.ingestion.doc_types == 0
then e @ ["At least one document type must be specified"]
else e in
errors @ e
else errors in
errors in
errors,
}