Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.sf-voice.sh/llms.txt

Use this file to discover all available pages before exploring further.

Single-header C++17 SDK built on CPR and nlohmann/json. All methods return std::future<Result<T>>. Use this SDK when you want to keep the HTTP client in C++ and handle failures through the Result<T> type instead of exceptions.

Setup

CMake (FetchContent)

include(FetchContent)
FetchContent_Declare(
  sf_voice
  GIT_REPOSITORY https://github.com/sf-voice/sf-voice-core
  GIT_TAG        v0.1.1
  SOURCE_SUBDIR  cpp
)
FetchContent_MakeAvailable(sf_voice)

target_link_libraries(your_target PRIVATE sf_voice)

Manual

Copy cpp/include/sf_voice/client.hpp into your project. Ensure CPR and nlohmann/json are on your include path.

Create a client

#include <sf_voice/client.hpp>

sfvoice::SfVoiceMedia client(
    "https://api.sf-voice.com",
    std::getenv("SF_VOICE_API_KEY")
);

Ingest

sfvoice::IngestRequest req;
req.source    = "url";
req.asset_id  = "call_001";
req.asset_class = "customer_acme";
req.url       = "https://storage.example.com/calls/001.mp3";
req.media_type = "audio";
req.types     = {"audio", "transcript"};

auto future = client.ingest(req);
auto result = future.get();

if (!result) {
    std::cerr << "ingest failed: " << result.error().message << "\n";
    return;
}

auto task_id = result.value().task_id;

Poll until ready

auto task_future = client.poll_task(task_id);
auto task_result = task_future.get();

if (!task_result) {
    std::cerr << "polling failed: " << task_result.error().message << "\n";
    return;
}

auto task = task_result.value();
if (task.status == "failed") {
    std::cerr << "indexing failed: " << task.error.value_or("unknown") << "\n";
}
sfvoice::SearchRequest req;
req.query       = "customer asks about pricing";
req.asset_class = "customer_acme";
req.types       = {"transcript"};
req.threshold   = 0.7f;
req.limit       = 10;

auto future = client.search(req);
auto result = future.get();

if (result) {
    for (const auto& r : result.value().results) {
        std::cout << r.asset_id << " "
                  << r.start_ms << "–" << r.end_ms << "ms "
                  << "(" << r.score << ")\n";
    }
}

Assets

// list
auto list = client.list_assets().get();

// get one
auto asset = client.get_asset("call_001").get();

// delete
auto del = client.delete_asset("call_001").get();

Result type

Result<T> is a tagged union:
auto result = client.ingest(req).get();

if (result) {
    // success: result.value() is the response
} else {
    // failure: result.error() is a SfVoiceError { code, message, status }
    std::cerr << result.error().code << ": " << result.error().message << "\n";
}