talon-core 0.4.2

Core retrieval engine for Talon: hybrid search (BM25 + semantic + reranker), indexing, and graph-aware ranking over markdown corpora.
Documentation
use super::*;
use serde_json::json;
use wiremock::matchers::{method, path};
use wiremock::{Mock, MockServer, ResponseTemplate};

fn runtime() -> tokio::runtime::Runtime {
    tokio::runtime::Builder::new_current_thread()
        .enable_all()
        .build()
        .unwrap_or_else(|err| panic!("build runtime: {err}"))
}

#[test]
fn strip_code_fences_removes_markdown_wrapper() {
    let wrapped = "```json\n{\"answer\":\"ok\"}\n```";
    let cleaned = strip_code_fences(wrapped);
    assert_eq!(cleaned, "{\"answer\":\"ok\"}");
}

#[test]
fn reasoning_effort_accepts_off_alias_as_none() {
    let effort: ReasoningEffort = serde_json::from_str("\"off\"")
        .unwrap_or_else(|err| panic!("reasoning effort should parse: {err}"));
    assert_eq!(effort, ReasoningEffort::None);
    let serialized = serde_json::to_string(&effort)
        .unwrap_or_else(|err| panic!("reasoning effort should serialize: {err}"));
    assert_eq!(serialized, "\"none\"");
}

#[test]
fn request_sends_reasoning_effort_kwargs_and_token_cap() {
    let runtime = runtime();
    let server = runtime.block_on(MockServer::start());
    runtime.block_on(
        Mock::given(method("POST"))
            .and(path("/chat/completions"))
            .respond_with(ResponseTemplate::new(200).set_body_json(json!({
                "choices": [{
                    "message": {
                        "content": "ok"
                    }
                }]
            })))
            .mount(&server),
    );
    let client = ChatClient::with_timeout_and_max_tokens(
        server.uri(),
        "test-model",
        DEFAULT_CHAT_TIMEOUT,
        Some(2048),
    )
    .unwrap_or_else(|err| panic!("build chat client: {err}"))
    .with_reasoning_effort(ReasoningEffort::None)
    .with_chat_template_kwargs(json!({ "enable_thinking": false }));
    let _ = client
        .complete_raw(vec![ChatMessage::new("user", "hello")], 0.0)
        .unwrap_or_else(|err| panic!("chat completion: {err}"));

    let requests = runtime
        .block_on(server.received_requests())
        .unwrap_or_else(|| panic!("received requests"));
    let body: serde_json::Value = serde_json::from_slice(&requests[0].body)
        .unwrap_or_else(|err| panic!("parse request body: {err}"));
    assert_eq!(body["max_tokens"].as_u64(), Some(2048));
    assert_eq!(body["reasoning_effort"].as_str(), Some("none"));
    assert_eq!(
        body["chat_template_kwargs"]["enable_thinking"].as_bool(),
        Some(false)
    );
}