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";
}
Search
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";
}