reasoninglayer 1.0.3

Rust client SDK for the Reasoning Layer API
Documentation
//! Rust client SDK for the [Reasoning Layer](https://github.com/kortexya/reasoninglayer) API.
//!
//! Fully typed DTOs for the resource surface, with HTTP, WebSocket (auto-reconnect), and SSE
//! transports built in. [`ReasoningLayerClient`] is the single entry point.
//!
//! # Quick start
//!
//! ```no_run
//! # async fn run() -> Result<(), reasoninglayer::Error> {
//! use reasoninglayer::{
//!     constrained, guard, psi, var, AddRuleRequest, AuthConfig, BackwardChainRequest,
//!     ClientConfig, CreateSortRequest, GuardOp, ReasoningLayerClient,
//! };
//!
//! let client = ReasoningLayerClient::new(
//!     ClientConfig::new(
//!         "https://platform.ovh.reasoninglayer.ai",
//!         "00000000-0000-0000-0000-000000000001",
//!         AuthConfig::Bearer(std::env::var("RL_API_TOKEN").unwrap()),
//!     ),
//! )?;
//!
//! let person = client.sorts().create_sort(CreateSortRequest::with_name("person"), None).await?;
//! client.inference().add_rule(
//!     AddRuleRequest {
//!         term: psi("well_paid", [("person", var("?X"))]),
//!         antecedents: vec![psi("employee", [
//!             ("name", var("?X")),
//!             ("salary", constrained("?S", guard(GuardOp::Gt, 80_000_i64))),
//!         ])],
//!         certainty: None,
//!     },
//!     None,
//! ).await?;
//!
//! let result = client.inference().backward_chain(
//!     BackwardChainRequest {
//!         goal: Some(psi("well_paid", [("person", var("?Who"))])),
//!         max_solutions: Some(10),
//!         ..Default::default()
//!     },
//!     None,
//! ).await?;
//! # let _ = (person, result); Ok(()) }
//! ```
//!
//! # Resources
//!
//! Every resource client is accessible via an accessor on [`ReasoningLayerClient`]:
//!
//! - **Core knowledge base:** [`sorts()`](ReasoningLayerClient::sorts) / [`types()`](ReasoningLayerClient::types),
//!   [`terms()`](ReasoningLayerClient::terms) / [`records()`](ReasoningLayerClient::records),
//!   [`inference()`](ReasoningLayerClient::inference) / [`rules()`](ReasoningLayerClient::rules),
//!   [`query()`](ReasoningLayerClient::query)
//! - **AI / ML:** [`cognitive()`](ReasoningLayerClient::cognitive) / [`agents()`](ReasoningLayerClient::agents),
//!   [`oversight()`](ReasoningLayerClient::oversight), [`neuro_symbolic()`](ReasoningLayerClient::neuro_symbolic),
//!   [`rag()`](ReasoningLayerClient::rag), [`generation()`](ReasoningLayerClient::generation),
//!   [`synthetic()`](ReasoningLayerClient::synthetic), [`proof_engine()`](ReasoningLayerClient::proof_engine),
//!   [`context()`](ReasoningLayerClient::context), [`rl_training()`](ReasoningLayerClient::rl_training)
//! - **Reasoning:** [`optimize()`](ReasoningLayerClient::optimize), [`ilp()`](ReasoningLayerClient::ilp),
//!   [`cdl()`](ReasoningLayerClient::cdl), [`execution()`](ReasoningLayerClient::execution),
//!   [`reasoning()`](ReasoningLayerClient::reasoning), [`preferences()`](ReasoningLayerClient::preferences),
//!   [`discovery()`](ReasoningLayerClient::discovery)
//! - **Analysis:** [`causal()`](ReasoningLayerClient::causal), [`statistical()`](ReasoningLayerClient::statistical),
//!   [`fuzzy()`](ReasoningLayerClient::fuzzy), [`scenarios()`](ReasoningLayerClient::scenarios),
//!   [`communities()`](ReasoningLayerClient::communities), [`visualization()`](ReasoningLayerClient::visualization),
//!   [`analysis()`](ReasoningLayerClient::analysis)
//! - **Data:** [`ingestion()`](ReasoningLayerClient::ingestion), [`extract()`](ReasoningLayerClient::extract),
//!   [`sources()`](ReasoningLayerClient::sources), [`collections()`](ReasoningLayerClient::collections),
//!   [`image_extraction()`](ReasoningLayerClient::image_extraction), [`row()`](ReasoningLayerClient::row)
//! - **Workflow:** [`control()`](ReasoningLayerClient::control), [`reviews()`](ReasoningLayerClient::reviews),
//!   [`action_reviews()`](ReasoningLayerClient::action_reviews), [`webhook_actions()`](ReasoningLayerClient::webhook_actions)
//! - **System:** [`health()`](ReasoningLayerClient::health), [`admin()`](ReasoningLayerClient::admin),
//!   [`spaces()`](ReasoningLayerClient::spaces), [`namespaces()`](ReasoningLayerClient::namespaces),
//!   [`utilities()`](ReasoningLayerClient::utilities), [`ontology()`](ReasoningLayerClient::ontology),
//!   [`osfql()`](ReasoningLayerClient::osfql), [`ui()`](ReasoningLayerClient::ui),
//!   [`conversation()`](ReasoningLayerClient::conversation), [`functions()`](ReasoningLayerClient::functions)
//!
//! # Streaming
//!
//! WebSocket (auto-reconnect) is exposed via [`ws::WebSocketConnection`]; SSE is exposed via
//! [`sse::stream`].

#![cfg_attr(docsrs, feature(doc_cfg))]

mod client;
mod config;
mod error;
mod http;
mod resources;
mod resources_phase2;

pub mod builders;
pub mod sse;
pub mod types;
pub mod ws;

pub mod api_spec;

// ─── Main entry points ────────────────────────────────────────────────────────
pub use client::ReasoningLayerClient;
pub use config::{AuthConfig, ClientConfig, SDK_LANGUAGE, SDK_VERSION};
pub use error::{ApiError, ApiErrorKind, ConstraintViolationDetails, Error, RateLimitDetails};

// ─── Resource clients ─────────────────────────────────────────────────────────
pub use resources::{
    AdminClient, AnalysisClient, ContextClient, DiscoveryClient, ExtractClient, FunctionsClient,
    GenerationClient, HealthClient, ImageExtractionClient, InferenceClient, OntologyClient,
    OptimizeClient, OsfqlClient, PreferencesClient, QueryClient, RagClient, RlTrainingClient,
    RowClient, ScenariosClient, SortsClient, SourcesClient, SpacesClient, TermsClient, UiClient,
};
pub use resources_phase2::{
    ActionReviewsClient, CausalClient, CdlClient, CognitiveClient, CollectionsClient,
    CommunitiesClient, ConstraintsClient, ControlClient, ConversationClient, ExecutionClient,
    FuzzyClient, IlpClient, IngestionClient, NamespacesClient, NeuroSymbolicClient,
    OversightClient, ProofEngineClient, ReasoningClient, ResearchClient, ReviewsClient,
    StatisticalClient, SyntheticClient, UtilitiesClient, VisualizationClient, WebhookActionsClient,
};

// ─── Common types ─────────────────────────────────────────────────────────────
pub use types::common::{ApiResponse, RateLimitInfo, RequestOptions};

// ─── Builders ────────────────────────────────────────────────────────────────
pub use builders::{
    constrained, guard, psi, psi_by_id, term_ref, var, FuzzyShape, GuardRhs, Value,
};

// ─── Commonly-used DTOs ──────────────────────────────────────────────────────
pub use types::homoiconic::{FeatureInputValueDto, FeatureValueDto, PsiTermDto, TermInputDto};
pub use types::inference::{
    AddFactRequest, AddFactResponse, AddRuleRequest, AddRuleResponse, BackwardChainRequest,
    BackwardChainResponse, BayesianEffectDto, BayesianPredictRequest, BayesianPredictResponse,
    BulkAddFactsRequest, BulkAddFactsResponse, BulkAddRulesRequest, BulkAddRulesResponse,
    ClearFactsResponse, CreateGoalRequest, CreateGoalResponse, DeleteGoalResponse,
    ForwardChainRequest, ForwardChainResponse, FuzzyProveRequest, FuzzyProveResponse,
    GetFactsResponse, GuardOp, ListGoalsResponse, MetaSortsResponse, NafProveRequest,
    NafProveResponse, SolutionDto,
};
pub use types::query::{
    FindBySortRequest, NlQueryMode, NlQueryRequest, NlQueryResponse, OsfSearchRequest,
    OsfSearchResponse, TermListResponse, TermPatternDto, UnifiableQueryRequest,
    ValidateTermRequest, ValidatedUnifyRequest,
};
// Sort DTOs are sourced from the auto-generated `api_spec` module (pilot
// migration). Hand-written conveniences live in `crate::api_spec::ext`.
pub use api_spec::{
    BulkCreateSortsRequest, BulkCreateSortsResponse, ComputeGlbRequest, ComputeGlbResponse,
    ComputeLubRequest, ComputeLubResponse, CreateSortRequest, DecodeGlbResponse,
    FeatureDescriptorDto, SortDto, SortInfoDto, SortListResponse, UpdateSortReviewRequest,
};
pub use types::terms::{
    BulkAddTermsRequest, BulkAddTermsResponse, ClearTermsResponse, CreateTermRequest, TermDto,
    TermResponse, TermState, UpdateTermRequest, ValidatedTermResponse, ValidatedUnifyResponse,
};
pub use types::values::{FuzzyShapeDto, ValueDto};