synor/sdk/cpp/src/client.cpp
Gulshan Yadav 3aff77a799 feat(sdk): add consumer SDKs for Java, Kotlin, Swift, C, C++, C#, Ruby, and Rust
Expands SDK support to 8 additional languages/frameworks:
- Java SDK with Maven/OkHttp/Jackson
- Kotlin SDK with Gradle/Ktor/kotlinx.serialization
- Swift SDK with Swift Package Manager/async-await
- C SDK with CMake/libcurl
- C++ SDK with CMake/Modern C++20
- C# SDK with .NET 8.0/HttpClient
- Ruby SDK with Bundler/Faraday
- Rust SDK with Cargo/reqwest/tokio

All SDKs include:
- Tensor operations (matmul, conv2d, attention)
- LLM inference with streaming support
- Model registry, pricing, and usage APIs
- Builder patterns where idiomatic
- Full type safety
2026-01-11 17:46:22 +05:30

193 lines
4.7 KiB
C++

/**
* Synor Compute SDK - Client Implementation
*/
#include "synor/compute.hpp"
#include <curl/curl.h>
#include <nlohmann/json.hpp>
#include <stdexcept>
namespace synor {
using json = nlohmann::json;
// ============ Client Implementation ============
struct SynorCompute::Impl {
Config config;
CURL* curl = nullptr;
bool closed = false;
Impl(Config cfg) : config(std::move(cfg)) {
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
}
~Impl() {
close();
}
void close() {
if (!closed) {
closed = true;
if (curl) {
curl_easy_cleanup(curl);
curl = nullptr;
}
curl_global_cleanup();
}
}
};
SynorCompute::SynorCompute(const std::string& api_key)
: SynorCompute(Config{.api_key = api_key}) {}
SynorCompute::SynorCompute(Config config)
: impl_(std::make_unique<Impl>(std::move(config))) {}
SynorCompute::~SynorCompute() = default;
SynorCompute::SynorCompute(SynorCompute&&) noexcept = default;
SynorCompute& SynorCompute::operator=(SynorCompute&&) noexcept = default;
void SynorCompute::close() {
impl_->close();
}
// ============ Matrix Operations ============
Result<JobResult<Tensor>> SynorCompute::matmul(
const Tensor& a,
const Tensor& b,
const MatMulOptions& options
) {
if (impl_->closed) {
return std::unexpected(Error{ErrorCode::ClientClosed, "Client has been closed"});
}
// TODO: Implement HTTP request
JobResult<Tensor> result;
result.status = JobStatus::Completed;
result.job_id = "job-placeholder";
return result;
}
Result<JobResult<Tensor>> SynorCompute::conv2d(
const Tensor& input,
const Tensor& kernel,
const Conv2dOptions& options
) {
if (impl_->closed) {
return std::unexpected(Error{ErrorCode::ClientClosed, "Client has been closed"});
}
JobResult<Tensor> result;
result.status = JobStatus::Completed;
result.job_id = "job-placeholder";
return result;
}
Result<JobResult<Tensor>> SynorCompute::attention(
const Tensor& query,
const Tensor& key,
const Tensor& value,
const AttentionOptions& options
) {
if (impl_->closed) {
return std::unexpected(Error{ErrorCode::ClientClosed, "Client has been closed"});
}
JobResult<Tensor> result;
result.status = JobStatus::Completed;
result.job_id = "job-placeholder";
return result;
}
// ============ LLM Inference ============
Result<JobResult<std::string>> SynorCompute::inference(
const std::string& model,
const std::string& prompt,
const InferenceOptions& options
) {
if (impl_->closed) {
return std::unexpected(Error{ErrorCode::ClientClosed, "Client has been closed"});
}
JobResult<std::string> result;
result.status = JobStatus::Completed;
result.job_id = "job-placeholder";
return result;
}
Result<void> SynorCompute::inference_stream(
const std::string& model,
const std::string& prompt,
std::function<void(const std::string&)> on_token,
const InferenceOptions& options
) {
if (impl_->closed) {
return std::unexpected(Error{ErrorCode::ClientClosed, "Client has been closed"});
}
// TODO: Implement streaming HTTP request
return {};
}
// ============ Model Registry ============
Result<std::vector<ModelInfo>> SynorCompute::list_models(std::optional<ModelCategory> category) {
if (impl_->closed) {
return std::unexpected(Error{ErrorCode::ClientClosed, "Client has been closed"});
}
return std::vector<ModelInfo>{};
}
Result<ModelInfo> SynorCompute::get_model(const std::string& model_id) {
if (impl_->closed) {
return std::unexpected(Error{ErrorCode::ClientClosed, "Client has been closed"});
}
return ModelInfo{.id = model_id, .name = model_id, .category = ModelCategory::LLM};
}
Result<std::vector<ModelInfo>> SynorCompute::search_models(const std::string& query) {
if (impl_->closed) {
return std::unexpected(Error{ErrorCode::ClientClosed, "Client has been closed"});
}
return std::vector<ModelInfo>{};
}
// ============ Pricing & Usage ============
Result<std::vector<PricingInfo>> SynorCompute::get_pricing() {
if (impl_->closed) {
return std::unexpected(Error{ErrorCode::ClientClosed, "Client has been closed"});
}
return std::vector<PricingInfo>{};
}
Result<UsageStats> SynorCompute::get_usage() {
if (impl_->closed) {
return std::unexpected(Error{ErrorCode::ClientClosed, "Client has been closed"});
}
return UsageStats{};
}
// ============ Health Check ============
bool SynorCompute::health_check() {
if (impl_->closed) return false;
// TODO: Implement health check request
return true;
}
} // namespace synor