75 lines
2.7 KiB
Go
75 lines
2.7 KiB
Go
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
|
|
}
|