nidus-sync/label-studio/tasks_annotation.go

76 lines
2.7 KiB
Go
Raw Normal View History

package labelstudio
import (
"encoding/json"
"fmt"
"time"
)
// AnnotationRequest represents the request body for creating a draft
type AnnotationRequest struct {
DraftID int `json:"draft_id"`
LeadTime float64 `json:"lead_time"`
ParentAnnotation *int `json:"parent_annotation,omitempty"`
ParentPrediction *int `json:"parent_prediction,omitempty"`
Project int `json:"project"`
Result []TaskResult `json:"result"`
StartedAt string `json:"started_at"`
}
// Annotation represents a draft annotation returned by the API
type Annotation struct {
BulkCreated bool `json:"bulk_created"`
CompletedBy int `json:"completed_by"`
CreatedAgo string `json:"created_ago"`
CreatedAt string `json:"created_at"`
CreatedUsername string `json:"created_username"`
DraftCreatedAt string `json:"draft_created_at"`
GroundTruth bool `json:"ground_truth"`
ID int `json:"id"`
ImportID *string `json:"import_id"`
LastAction *string `json:"last_action"`
LastCreatedBy *string `json:"last_created_by"`
LeadTime float64 `json:"lead_time"`
ParentAnnotation *int `json:"parent_annotation,omitempty"`
ParentPrediction *int `json:"parent_prediction,omitempty"`
Project int `json:"project"`
Result []TaskResult `json:"result"`
Task int `json:"task"`
WasCancelled bool `json:"was_cancelled"`
UpdatedAt string `json:"updated_at"`
UpdatedBy int `json:"updated_by"`
}
// NewAnnotation creates a new draft request builder
func NewAnnotationRequest(projectID int) *AnnotationRequest {
return &AnnotationRequest{
Project: projectID,
StartedAt: time.Now().UTC().Format(time.RFC3339Nano),
}
}
// CreateAnnotation creates a new annotation on a task
func (c *Client) CreateAnnotation(taskID int, annotation *AnnotationRequest) (*Annotation, error) {
// Marshal the annotation request to JSON
annotationJSON, err := json.Marshal(annotation)
if err != nil {
return nil, fmt.Errorf("failed to marshal annotation request: %w", err)
}
// Create request URL with query parameter
path := fmt.Sprintf("/api/tasks/%d/annotations", taskID)
resp, err := c.makeRequest("POST", path, annotationJSON)
if err != nil {
return nil, fmt.Errorf("failed to create request: %w", err)
}
defer resp.Body.Close()
// Parse response
var createdAnnotation Annotation
if err := json.NewDecoder(resp.Body).Decode(&createdAnnotation); err != nil {
return nil, fmt.Errorf("failed to parse response: %w", err)
}
return &createdAnnotation, nil
}