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
193 lines
4.7 KiB
C++
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
|