syntax = "proto3";

package harmonizer.v1;

service Harmonizer {
  rpc Process(ProcessRequest) returns (ProcessResponse);
}

message ProcessRequest {
  optional string request_id = 1;
  repeated InputImage images = 2;
  ProcessParameters parameters = 3;
}

message InputImage {
  reserved 3, 4;
  reserved "mime_type", "metadata";

  optional string id = 1;
  oneof payload {
    bytes data = 2;
    RawTensor tensor = 5;
  }
}

message ProcessParameters {
  reserved 3, 5, 6, 7;
  reserved "context_policy", "target_size", "include_metadata", "include_timings";

  OutputFormat output_format = 1;
  uint32 context_length = 2;
  ReturnPolicy return_policy = 4;
}

enum OutputFormat {
  OUTPUT_FORMAT_UNSPECIFIED = 0;
  OUTPUT_FORMAT_PNG = 1;
  OUTPUT_FORMAT_JPEG = 2;
  OUTPUT_FORMAT_RAW_TENSOR = 3;
}

enum ReturnPolicy {
  RETURN_POLICY_UNSPECIFIED = 0;
  RETURN_POLICY_ALL = 1;
  RETURN_POLICY_EXCLUDE_CONTEXT = 2;
  RETURN_POLICY_LAST = 3;
}

message ProcessResponse {
  reserved 1, 2, 5, 6, 7, 8;
  reserved "id", "object", "model", "timings", "summary", "warnings";

  optional string request_id = 3;
  repeated ProcessOutput outputs = 4;
}

message ProcessOutput {
  reserved 4;
  reserved "metadata";

  optional string id = 1;
  oneof payload {
    EncodedImage image = 2;
    RawTensor tensor = 3;
  }
}

message EncodedImage {
  bytes data = 1;
  string mime_type = 2;
  uint32 width = 3;
  uint32 height = 4;
}

message RawTensor {
  reserved 2, 5, 6;
  reserved "dtype", "color_space", "encoding";

  bytes data = 1;
  repeated int64 shape = 3;
  string layout = 4;
}
