Copy package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"time"
)
type NCNClient struct {
BaseURL string
Client *http.Client
}
type InferenceRequest struct {
ModelUUID string `json:"model_uuid"`
InputData string `json:"input_data"`
}
type InferenceStatus struct {
RequestID string `json:"request_id"`
Status string `json:"status"`
OutputData string `json:"output_data"`
ErrorMessage string `json:"error_message"`
}
func NewNCNClient(baseURL string) *NCNClient {
return &NCNClient{
BaseURL: baseURL,
Client: &http.Client{Timeout: 30 * time.Second},
}
}
func (c *NCNClient) SubmitInference(modelUUID string, inputData interface{}) (*InferenceStatus, error) {
inputJSON, _ := json.Marshal(inputData)
reqBody, _ := json.Marshal(InferenceRequest{
ModelUUID: modelUUID,
InputData: string(inputJSON),
})
resp, err := c.Client.Post(
c.BaseURL+"/api/v1/inference",
"application/json",
bytes.NewBuffer(reqBody),
)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var status InferenceStatus
json.NewDecoder(resp.Body).Decode(&status)
return &status, nil
}
func (c *NCNClient) GetStatus(requestID string) (*InferenceStatus, error) {
resp, err := c.Client.Get(c.BaseURL + "/api/v1/inference/" + requestID)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var status InferenceStatus
json.NewDecoder(resp.Body).Decode(&status)
return &status, nil
}
func (c *NCNClient) Inference(modelUUID string, inputData interface{}, timeout time.Duration) (map[string]interface{}, error) {
result, err := c.SubmitInference(modelUUID, inputData)
if err != nil {
return nil, err
}
deadline := time.Now().Add(timeout)
for time.Now().Before(deadline) {
status, err := c.GetStatus(result.RequestID)
if err != nil {
return nil, err
}
if status.Status == "completed" {
var output map[string]interface{}
json.Unmarshal([]byte(status.OutputData), &output)
return output, nil
} else if status.Status == "failed" {
return nil, fmt.Errorf("task failed: %s", status.ErrorMessage)
}
time.Sleep(1 * time.Second)
}
return nil, fmt.Errorf("timeout")
}
func main() {
client := NewNCNClient("http://localhost:8080")
result, err := client.Inference("bark_semantic", map[string]string{
"text": "Hello, world!",
}, 60*time.Second)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Result: %v\n", result)
}