Skip to content
lumalabs.ai

Upload a file

client.Files.New(ctx, body) (*CreateFileResponse, error)
POST/files

Upload a file to your namespace, then reference it from a generation via ImageRef.file_id (as source, image_ref[], video.start_frame, keyframes, and so on). Two upload modes share this endpoint, selected by Content-Type:

  • multipart/form-data — send the bytes inline in the file part. Best for small files (subject to an inline size cap; larger files must use the presigned flow). The returned file is already pending ingest.

  • application/json — request a presigned upload. The response upload envelope tells you where to PUT the bytes; afterward call POST /files/{file_id}/complete to start ingest. Use this for larger files.

ParametersExpand Collapse
body FileNewParams
MimeType param.Field[string]

MIME type of the bytes you will upload.

minLength1
maxLength256
SizeBytes param.Field[int64]

Exact size in bytes of the object you will PUT. Up to 5 GiB (the S3 single-PUT ceiling).

minimum1
ExpiresAt param.Field[Time]optional

Optional TTL. After this time Luma may automatically delete the file and reclaim its bytes.

formatdate-time
Filename param.Field[string]optional

Optional original filename to record.

maxLength512
Purpose param.Field[FilePurpose]optional

How the file is intended to be used in a generation. input is the primary subject (e.g. the source image for an edit); reference is style/content guidance.

UserID param.Field[string]optional

Optional opaque end-user tag for abuse attribution. Mirrors the user_id field on POST /generations.

maxLength256
ReturnsExpand Collapse
type CreateFileResponse struct{…}

Result of POST /files. In the multipart (inline) flow upload is null and the file is already pending ingest. In the presigned (JSON) flow upload carries the PUT envelope and the file stays pending until you call POST /files/{file_id}/complete. Top-level id and state are conveniences that mirror file.id and file.state; the full record is always under file.

ID string

File identifier.

formatuuid
File File

A file in the caller's namespace.

ID string

File identifier, referenced as ImageRef.file_id.

formatuuid
CreatedAt Time

Creation timestamp.

formatdate-time
MimeType string

MIME type of the stored bytes (for example, image/jpeg).

Purpose FilePurpose

How the file is intended to be used in a generation. input is the primary subject (e.g. the source image for an edit); reference is style/content guidance.

One of the following:
const FilePurposeInput FilePurpose = "input"
const FilePurposeReference FilePurpose = "reference"
SizeBytes int64

Size of the stored object in bytes.

State FileState

Lifecycle state of an uploaded file. pending until bytes are received and the ingest pipeline runs; ready once it can be referenced from a generation; failed if ingest/moderation rejected it; deleted after a soft-delete.

One of the following:
const FileStatePending FileState = "pending"
const FileStateReady FileState = "ready"
const FileStateFailed FileState = "failed"
const FileStateDeleted FileState = "deleted"
DeletedAt Timeoptional

Soft-delete timestamp, if the file was deleted.

formatdate-time
ExpiresAt Timeoptional

TTL set at upload, if any. After this time Luma may automatically delete the file and reclaim its bytes — you don't need to call DELETE yourself.

formatdate-time
FailureReason stringoptional

Human-readable reason when state is failed.

Filename stringoptional

Original filename supplied at upload, if any.

UserID stringoptional

The opaque end-user tag supplied at upload, echoed back unchanged. Abuse-attribution only; not an access-control primitive.

State FileState

Lifecycle state of an uploaded file. pending until bytes are received and the ingest pipeline runs; ready once it can be referenced from a generation; failed if ingest/moderation rejected it; deleted after a soft-delete.

One of the following:
const FileStatePending FileState = "pending"
const FileStateReady FileState = "ready"
const FileStateFailed FileState = "failed"
const FileStateDeleted FileState = "deleted"
Upload PresignedUploadoptional

Where to PUT the file bytes for a presigned (JSON) upload. Issue an HTTP PUT of the raw bytes to url with the given headers, then call POST /files/{file_id}/complete.

ExpiresAt Time

When the presigned URL expires.

formatdate-time
Method string

HTTP method to use for the upload — always PUT.

URL string

Presigned S3 URL to PUT the bytes to.

formaturi
Headers map[string, string]optional

Headers that must be sent with the PUT request.

Upload a file

package main

import (
  "context"
  "fmt"

  "github.com/lumalabs/luma-agents-go"
  "github.com/lumalabs/luma-agents-go/option"
)

func main() {
  client := lumaagents.NewClient(
    option.WithAuthToken("My Auth Token"),
  )
  createFileResponse, err := client.Files.New(context.TODO(), lumaagents.FileNewParams{
    MimeType: lumaagents.F("x"),
    SizeBytes: lumaagents.F(int64(1)),
  })
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", createFileResponse.ID)
}
{
  "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
  "file": {
    "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
    "created_at": "2019-12-27T18:11:19.117Z",
    "mime_type": "mime_type",
    "purpose": "input",
    "size_bytes": 0,
    "state": "pending",
    "deleted_at": "2019-12-27T18:11:19.117Z",
    "expires_at": "2019-12-27T18:11:19.117Z",
    "failure_reason": "failure_reason",
    "filename": "filename",
    "user_id": "user_id"
  },
  "state": "pending",
  "upload": {
    "expires_at": "2019-12-27T18:11:19.117Z",
    "method": "method",
    "url": "https://example.com",
    "headers": {
      "foo": "string"
    }
  }
}
Returns Examples
{
  "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
  "file": {
    "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
    "created_at": "2019-12-27T18:11:19.117Z",
    "mime_type": "mime_type",
    "purpose": "input",
    "size_bytes": 0,
    "state": "pending",
    "deleted_at": "2019-12-27T18:11:19.117Z",
    "expires_at": "2019-12-27T18:11:19.117Z",
    "failure_reason": "failure_reason",
    "filename": "filename",
    "user_id": "user_id"
  },
  "state": "pending",
  "upload": {
    "expires_at": "2019-12-27T18:11:19.117Z",
    "method": "method",
    "url": "https://example.com",
    "headers": {
      "foo": "string"
    }
  }
}