C# Integration
Integrate the Kanva API with your .NET application.
Setup
Create a new console application or add to an existing project:
dotnet new console -n KanvaExample
cd KanvaExample
No additional packages required - we use the built-in HttpClient.
Basic Client
using System.Net.Http.Json;
using System.Text.Json;
public class KanvaClient
{
private readonly HttpClient _client;
private readonly string _baseUrl;
private readonly string _projectId;
public KanvaClient(string apiKey, string projectId, string baseUrl = "https://kanva.human-driven.ai/api/v1")
{
_baseUrl = baseUrl;
_projectId = projectId;
_client = new HttpClient();
_client.DefaultRequestHeaders.Add("X-API-Key", apiKey);
}
public async Task<PredictionResult> PredictSyncAsync(
Dictionary<string, object[]> input,
int timeout = 60)
{
var url = $"{_baseUrl}/projects/{_projectId}/predict?sync=true&timeout={timeout}";
var response = await _client.PostAsJsonAsync(url, new { input });
response.EnsureSuccessStatusCode();
return await response.Content.ReadFromJsonAsync<PredictionResult>();
}
public async Task<string> PredictAsyncAsync(Dictionary<string, object[]> input)
{
var url = $"{_baseUrl}/projects/{_projectId}/predict";
var response = await _client.PostAsJsonAsync(url, new { input });
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync<JobResponse>();
return result.Data.JobId;
}
public async Task<JobStatus> GetJobStatusAsync(string jobId)
{
var url = $"{_baseUrl}/projects/{_projectId}/jobs/{jobId}";
var response = await _client.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadFromJsonAsync<JobStatus>();
}
}
// Response models
public record PredictionResult(bool Success, PredictionData Data);
public record PredictionData(string[] Predictions, float[]? Probabilities);
public record JobResponse(bool Success, JobData Data);
public record JobData(string JobId);
public record JobStatus(bool Success, JobStatusData Data);
public record JobStatusData(string Status, PredictionData? Result, string? Error);
Usage Examples
Synchronous Prediction
var client = new KanvaClient("your_api_key", "your_project_id");
var input = new Dictionary<string, object[]>
{
["date"] = new object[] { "2024-01-15" },
["category"] = new object[] { "A" },
["value"] = new object[] { 123.45 }
};
var result = await client.PredictSyncAsync(input);
Console.WriteLine($"Prediction: {string.Join(", ", result.Data.Predictions)}");
Async with Polling
var jobId = await client.PredictAsyncAsync(input);
while (true)
{
var status = await client.GetJobStatusAsync(jobId);
if (status.Data.Status == "completed")
{
Console.WriteLine($"Results: {string.Join(", ", status.Data.Result.Predictions)}");
break;
}
else if (status.Data.Status == "failed")
{
Console.WriteLine($"Error: {status.Data.Error}");
break;
}
await Task.Delay(2000);
}
ASP.NET Core Integration
Register the client as a service:
// Program.cs
builder.Services.AddSingleton(sp =>
{
var config = sp.GetRequiredService<IConfiguration>();
return new KanvaClient(
config["Kanva:ApiKey"],
config["Kanva:ProjectId"]
);
});
// appsettings.json
{
"Kanva": {
"ApiKey": "your_api_key",
"ProjectId": "your_project_id"
}
}
Use in a controller:
[ApiController]
[Route("[controller]")]
public class PredictionController : ControllerBase
{
private readonly KanvaClient _kanva;
public PredictionController(KanvaClient kanva)
{
_kanva = kanva;
}
[HttpPost]
public async Task<IActionResult> Predict([FromBody] PredictRequest request)
{
var result = await _kanva.PredictSyncAsync(request.Input);
return Ok(result);
}
}