layer 1.0.76__tar.gz → 1.0.84__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. {layer-1.0.76 → layer-1.0.84}/PKG-INFO +1 -1
  2. {layer-1.0.76 → layer-1.0.84}/pyproject.toml +1 -1
  3. {layer-1.0.76 → layer-1.0.84}/pyproject.toml.orig +1 -1
  4. {layer-1.0.76 → layer-1.0.84}/src/layer/_api/models.py +458 -2
  5. {layer-1.0.76 → layer-1.0.84}/README.md +0 -0
  6. {layer-1.0.76 → layer-1.0.84}/src/layer/__init__.py +0 -0
  7. {layer-1.0.76 → layer-1.0.84}/src/layer/__main__.py +0 -0
  8. {layer-1.0.76 → layer-1.0.84}/src/layer/_api/__init__.py +0 -0
  9. {layer-1.0.76 → layer-1.0.84}/src/layer/_api/client.py +0 -0
  10. {layer-1.0.76 → layer-1.0.84}/src/layer/_cli/__init__.py +0 -0
  11. {layer-1.0.76 → layer-1.0.84}/src/layer/_cli/auth_commands.py +0 -0
  12. {layer-1.0.76 → layer-1.0.84}/src/layer/_cli/base_model_commands.py +0 -0
  13. {layer-1.0.76 → layer-1.0.84}/src/layer/_cli/context.py +0 -0
  14. {layer-1.0.76 → layer-1.0.84}/src/layer/_cli/context_commands.py +0 -0
  15. {layer-1.0.76 → layer-1.0.84}/src/layer/_cli/generate_commands.py +0 -0
  16. {layer-1.0.76 → layer-1.0.84}/src/layer/_cli/main.py +0 -0
  17. {layer-1.0.76 → layer-1.0.84}/src/layer/_cli/output.py +0 -0
  18. {layer-1.0.76 → layer-1.0.84}/src/layer/auth.py +0 -0
  19. {layer-1.0.76 → layer-1.0.84}/src/layer/catalog.py +0 -0
  20. {layer-1.0.76 → layer-1.0.84}/src/layer/config.py +0 -0
  21. {layer-1.0.76 → layer-1.0.84}/src/layer/credentials.py +0 -0
  22. {layer-1.0.76 → layer-1.0.84}/src/layer/download.py +0 -0
  23. {layer-1.0.76 → layer-1.0.84}/src/layer/exit_codes.py +0 -0
  24. {layer-1.0.76 → layer-1.0.84}/src/layer/generate.py +0 -0
  25. {layer-1.0.76 → layer-1.0.84}/src/layer/oauth.py +0 -0
  26. {layer-1.0.76 → layer-1.0.84}/src/layer/params.py +0 -0
  27. {layer-1.0.76 → layer-1.0.84}/src/layer/sessions.py +0 -0
  28. {layer-1.0.76 → layer-1.0.84}/src/layer/sse.py +0 -0
  29. {layer-1.0.76 → layer-1.0.84}/src/layer/uploads.py +0 -0
  30. {layer-1.0.76 → layer-1.0.84}/src/layer/workspaces.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: layer
3
- Version: 1.0.76
3
+ Version: 1.0.84
4
4
  Summary: Command-line interface for Layer — AI asset generation for game studios.
5
5
  Keywords: layer,ai,generative,game-development,cli
6
6
  Author: Layer
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "layer"
3
- version = "1.0.76"
3
+ version = "1.0.84"
4
4
  description = "Command-line interface for Layer — AI asset generation for game studios."
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "layer"
3
- version = "1.0.76"
3
+ version = "1.0.84"
4
4
  description = "Command-line interface for Layer — AI asset generation for game studios."
5
5
  readme = "README.md"
6
6
  authors = [{ name = "Layer", email = "info@layer.ai" }]
@@ -83,6 +83,17 @@ class AudioOutputFormat(Enum):
83
83
  flac = "flac"
84
84
 
85
85
 
86
+ class AutoDeleteRunStatus(Enum):
87
+ running = "running"
88
+ finished = "finished"
89
+ failed = "failed"
90
+
91
+
92
+ class AutoDeleteTrigger(Enum):
93
+ schedule = "schedule"
94
+ manual = "manual"
95
+
96
+
86
97
  class BlueprintRunStatus(Enum):
87
98
  """
88
99
  Enum representing the status of a blueprint run.
@@ -489,6 +500,24 @@ class SegmentPartNames(RootModel[list[str]]):
489
500
  )
490
501
 
491
502
 
503
+ class SegmentParts(RootModel[int]):
504
+ root: int = Field(
505
+ ...,
506
+ description="How many parts a CHARACTER split makes. Support varies by model.",
507
+ ge=1,
508
+ title="Segment Parts",
509
+ )
510
+
511
+
512
+ class SegmentStrength(RootModel[int]):
513
+ root: int = Field(
514
+ ...,
515
+ description="How aggressively a mesh split cuts: higher makes more parts. Support varies by model.",
516
+ ge=1,
517
+ title="Segment Strength",
518
+ )
519
+
520
+
492
521
  class FaceLimit(RootModel[int]):
493
522
  root: int = Field(..., description="Face/polygon limit for 3D mesh.", gt=0, title="Face Limit")
494
523
 
@@ -716,6 +745,41 @@ class SessionName1(RootModel[str]):
716
745
  )
717
746
 
718
747
 
748
+ class FileContentCategory(Enum):
749
+ image = "image"
750
+ video = "video"
751
+ mesh = "mesh"
752
+ audio = "audio"
753
+ pose = "pose"
754
+ safetensors = "safetensors"
755
+ playable = "playable"
756
+ spine = "spine"
757
+ font = "font"
758
+ world = "world"
759
+ pbr_materials = "pbr_materials"
760
+ other = "other"
761
+
762
+
763
+ class FileDependencyOutput(BaseModel):
764
+ kind: str = Field(
765
+ ...,
766
+ description="What depends on the file: `style`, `reference_set`, `workflow`, `skill`, `template`, `content_policy_rule`, `base_model`, `workspace_share`, `trend`, `ua_creative`, `export` or `scoring_run`.",
767
+ title="Kind",
768
+ )
769
+ owner_id: str = Field(..., description="Id of the thing that depends on the file.", title="Owner Id")
770
+ owner_name: str | None = Field(..., description="Its name, when it has one.", title="Owner Name")
771
+
772
+
773
+ class FileIdsInput(BaseModel):
774
+ file_ids: list[UUID] = Field(
775
+ ...,
776
+ description="At most 500 file ids.",
777
+ max_length=500,
778
+ min_length=1,
779
+ title="File Ids",
780
+ )
781
+
782
+
719
783
  class FileScore(BaseModel):
720
784
  rule_id: UUID = Field(..., description="The rule that produced this verdict.", title="Rule Id")
721
785
  rule_name: str = Field(
@@ -762,6 +826,8 @@ class FileSourceType(Enum):
762
826
  composite = "composite"
763
827
  google_drive = "google_drive"
764
828
  miro = "miro"
829
+ linear = "linear"
830
+ jira = "jira"
765
831
  transformed_reference = "transformed_reference"
766
832
  skill_resource = "skill_resource"
767
833
  skill_bundle = "skill_bundle"
@@ -1033,6 +1099,7 @@ class InferenceUseCase(Enum):
1033
1099
  rig = "rig"
1034
1100
  segment = "segment"
1035
1101
  image_segment = "image_segment"
1102
+ image_mask = "image_mask"
1036
1103
  text_to_speech = "text_to_speech"
1037
1104
  sound_effects = "sound_effects"
1038
1105
  music = "music"
@@ -1563,6 +1630,15 @@ class RequestUploadUrlResponse(BaseModel):
1563
1630
  )
1564
1631
 
1565
1632
 
1633
+ class RestoreDeletedFilesOutput(BaseModel):
1634
+ restored_files: int = Field(
1635
+ ...,
1636
+ description="Files restored. Ids not in the trash are left silently.",
1637
+ title="Restored Files",
1638
+ )
1639
+ restored_bytes: int = Field(..., description="Bytes those files hold.", title="Restored Bytes")
1640
+
1641
+
1566
1642
  class Role(Enum):
1567
1643
  admin = "admin"
1568
1644
  editor = "editor"
@@ -1641,6 +1717,28 @@ class SegmentBy(Enum):
1641
1717
  PARTS = "PARTS"
1642
1718
 
1643
1719
 
1720
+ class SegmentLevel(Enum):
1721
+ """
1722
+ Split granularity for a general-target segmentation (more parts as it
1723
+ rises). Only meaningful when the target is ``GENERAL``.
1724
+ """
1725
+
1726
+ LOW = "LOW"
1727
+ MEDIUM = "MEDIUM"
1728
+ HIGH = "HIGH"
1729
+
1730
+
1731
+ class SegmentTarget(Enum):
1732
+ """
1733
+ What a mesh-segmentation model treats the input as, selecting its split
1734
+ strategy. ``CHARACTER`` splits a humanoid mesh with a body-part template;
1735
+ ``GENERAL`` splits any mesh by granularity level (e.g. Hi3D Parts).
1736
+ """
1737
+
1738
+ CHARACTER = "CHARACTER"
1739
+ GENERAL = "GENERAL"
1740
+
1741
+
1644
1742
  class Kind(Enum):
1645
1743
  """
1646
1744
  Whether the object is a single file or a composite asset.
@@ -1686,6 +1784,18 @@ class SkippedFile(BaseModel):
1686
1784
  )
1687
1785
 
1688
1786
 
1787
+ class SkippedFileOutput(BaseModel):
1788
+ file_id: UUID = Field(..., description="Id of the file left.", title="File Id")
1789
+ message: str = Field(
1790
+ ...,
1791
+ description="What holds the file, and what to do about it.",
1792
+ title="Message",
1793
+ )
1794
+ dependencies: list[FileDependencyOutput] = Field(
1795
+ ..., description="Everything that holds the file.", title="Dependencies"
1796
+ )
1797
+
1798
+
1689
1799
  class SpriteSheetAnimationView(BaseModel):
1690
1800
  name: str = Field(..., description="The animation's name.", title="Name")
1691
1801
  frames: list[int] = Field(
@@ -1711,6 +1821,59 @@ class State2(Enum):
1711
1821
  terminal_failure = "terminal_failure"
1712
1822
 
1713
1823
 
1824
+ class StorageSliceOutput(BaseModel):
1825
+ key: str | None = Field(
1826
+ ...,
1827
+ description="What the slice is: an origin (`generated`, `uploaded`), a content category (`image`, `video`, ...), an age (`under_30_days`, `30_to_90_days`, `90_to_365_days`, `over_1_year`), a project id (`none` for files in no project) or a member's principal id. Null for the slice that totals everything not listed.",
1828
+ title="Key",
1829
+ )
1830
+ label: str = Field(..., description="What to call the slice.", title="Label")
1831
+ files: int = Field(..., description="Files in the slice.", title="Files")
1832
+ bytes: int = Field(..., description="Bytes those files hold.", title="Bytes")
1833
+
1834
+
1835
+ class StoredFileOrigin(Enum):
1836
+ """
1837
+ Whether a file is the output of a generation, or something a person put in the workspace.
1838
+ """
1839
+
1840
+ generated = "generated"
1841
+ uploaded = "uploaded"
1842
+
1843
+
1844
+ class StoredFileOutput(BaseModel):
1845
+ file_id: UUID = Field(..., description="Id of the file.", title="File Id")
1846
+ name: str = Field(..., description="The file's name.", title="Name")
1847
+ content_type: str = Field(..., description="The file's MIME type.", title="Content Type")
1848
+ content_category: FileContentCategory = Field(..., description="What kind of asset the file is.")
1849
+ origin: StoredFileOrigin = Field(
1850
+ ...,
1851
+ description="Whether a generation produced the file or a person uploaded it.",
1852
+ )
1853
+ size_bytes: int = Field(..., description="Bytes the file holds.", title="Size Bytes")
1854
+ created_at: AwareDatetime = Field(..., description="When the file was created.", title="Created At")
1855
+ created_by_name: str | None = Field(..., description="Who created the file, when known.", title="Created By Name")
1856
+ deleted_at: AwareDatetime | None = Field(
1857
+ ...,
1858
+ description="When the file was deleted; set in the trash only.",
1859
+ title="Deleted At",
1860
+ )
1861
+ deleted_by_name: str | None = Field(
1862
+ ...,
1863
+ description="Who deleted the file; null for an automatic delete.",
1864
+ title="Deleted By Name",
1865
+ )
1866
+
1867
+
1868
+ class StoredFilePageOutput(BaseModel):
1869
+ files: list[StoredFileOutput] = Field(..., title="Files")
1870
+ next_cursor: str | None = Field(
1871
+ ...,
1872
+ description="Pass as `cursor` for the next page; null on the last page.",
1873
+ title="Next Cursor",
1874
+ )
1875
+
1876
+
1714
1877
  class StyleCategory(Enum):
1715
1878
  """
1716
1879
  What a reference set *is*.
@@ -1978,6 +2141,10 @@ class UsageLimitMode(Enum):
1978
2141
 
1979
2142
 
1980
2143
  class UsageLimitPeriod(Enum):
2144
+ """
2145
+ How often a usage cap resets: at midnight UTC, on Monday, or on the 1st of the month.
2146
+ """
2147
+
1981
2148
  daily = "daily"
1982
2149
  weekly = "weekly"
1983
2150
  monthly = "monthly"
@@ -2338,6 +2505,70 @@ class WorkspaceUsageOutput(BaseModel):
2338
2505
  )
2339
2506
 
2340
2507
 
2508
+ class AutoDeletePreviewOutput(BaseModel):
2509
+ files: int = Field(..., description="Files the rules would delete now.", title="Files")
2510
+ bytes: int = Field(..., description="Bytes those files hold.", title="Bytes")
2511
+ is_at_least: bool = Field(
2512
+ ...,
2513
+ description="Whether counting stopped at 20,000 files, so the run would delete at least this many.",
2514
+ title="Is At Least",
2515
+ )
2516
+ sample: list[StoredFileOutput] = Field(..., description="The largest of those files.", title="Sample")
2517
+
2518
+
2519
+ class AutoDeleteRuleIO(BaseModel):
2520
+ older_than_days: int = Field(
2521
+ ...,
2522
+ description="Delete files created at least this many days ago (7 or more).",
2523
+ ge=7,
2524
+ le=3650,
2525
+ title="Older Than Days",
2526
+ )
2527
+ origin: StoredFileOrigin | None = Field(None, description="Generated or uploaded files only; both when null.")
2528
+ content_categories: list[FileContentCategory] | None = Field(
2529
+ None,
2530
+ description="Only these content categories; every category when empty.",
2531
+ title="Content Categories",
2532
+ )
2533
+ keep_labeled: bool | None = Field(True, description="Keep files with a label.", title="Keep Labeled")
2534
+ keep_in_folder: bool | None = Field(True, description="Keep files filed in a folder.", title="Keep In Folder")
2535
+ keep_liked: bool | None = Field(True, description="Keep files someone liked.", title="Keep Liked")
2536
+ keep_pinned: bool | None = Field(True, description="Keep files someone pinned.", title="Keep Pinned")
2537
+
2538
+
2539
+ class AutoDeleteRunOutput(BaseModel):
2540
+ run_id: UUID = Field(..., description="Id of the run.", title="Run Id")
2541
+ trigger: AutoDeleteTrigger = Field(..., description="Whether the nightly schedule or a person started it.")
2542
+ status: AutoDeleteRunStatus = Field(..., description="`running`, `finished` or `failed`.")
2543
+ policy_workspace_id: UUID = Field(
2544
+ ...,
2545
+ description="The workspace whose policy the run applied.",
2546
+ title="Policy Workspace Id",
2547
+ )
2548
+ started_at: AwareDatetime = Field(..., title="Started At")
2549
+ finished_at: AwareDatetime | None = Field(..., title="Finished At")
2550
+ deleted_files: int = Field(
2551
+ ...,
2552
+ description="Files deleted. They stay in the trash for 29 days.",
2553
+ title="Deleted Files",
2554
+ )
2555
+ deleted_bytes: int = Field(..., description="Bytes those files held.", title="Deleted Bytes")
2556
+ kept_in_use: int = Field(
2557
+ ...,
2558
+ description="Files a rule reached that were kept because something depends on them.",
2559
+ title="Kept In Use",
2560
+ )
2561
+ is_capped: bool = Field(
2562
+ ...,
2563
+ description="Whether the run stopped at 50,000 files, leaving the rest for the next one.",
2564
+ title="Is Capped",
2565
+ )
2566
+
2567
+
2568
+ class AutoDeleteRunsOutput(BaseModel):
2569
+ runs: list[AutoDeleteRunOutput] = Field(..., description="Most recent first.", title="Runs")
2570
+
2571
+
2341
2572
  class BaseModelCapabilitiesREST(BaseModel):
2342
2573
  """
2343
2574
  ToolModelCapabilities without the MCP token-saving serializer — returns all fields for REST.
@@ -2465,6 +2696,11 @@ class BaseModelCapabilitiesREST(BaseModel):
2465
2696
  description="ISO 639-1 codes a `dub_video` model can speak, passed to forge as `target_language`.",
2466
2697
  title="Dub Languages",
2467
2698
  )
2699
+ speech_languages: list[str] | None = Field(
2700
+ None,
2701
+ description="Language codes a text-to-speech model can be told to read the script in, passed to forge as `speech_language`. Empty: the model takes no language and detects it from the text.",
2702
+ title="Speech Languages",
2703
+ )
2468
2704
  voice_reference_set_required: bool | None = Field(
2469
2705
  False,
2470
2706
  description="Speaks only in a trained voice, so a generation needs a reference set holding one. Without it the provider falls back to its own default voice.",
@@ -2652,6 +2888,20 @@ class CreateReferenceSetResponse(BaseModel):
2652
2888
  )
2653
2889
 
2654
2890
 
2891
+ class DeleteStoredFilesOutput(BaseModel):
2892
+ deleted_files: int = Field(
2893
+ ...,
2894
+ description="Files deleted. They stay in the trash for 29 days.",
2895
+ title="Deleted Files",
2896
+ )
2897
+ deleted_bytes: int = Field(..., description="Bytes those files held.", title="Deleted Bytes")
2898
+ skipped: list[SkippedFileOutput] = Field(
2899
+ ...,
2900
+ description="Files left because something depends on them. Ids that are not a stored file are left silently.",
2901
+ title="Skipped",
2902
+ )
2903
+
2904
+
2655
2905
  class EstimateInferencePriceV2Output(BaseModel):
2656
2906
  estimated_price_creative_units: float = Field(
2657
2907
  ...,
@@ -3165,6 +3415,7 @@ class OutputFit(BaseModel):
3165
3415
  scale: OutputFitScale | None = "PLACE"
3166
3416
  anchor: OutputFitAnchor | None = "CENTER"
3167
3417
  padding: int | None = Field(0, ge=0, le=512, title="Padding")
3418
+ corner_radius: int | None = Field(0, ge=0, le=512, title="Corner Radius")
3168
3419
 
3169
3420
 
3170
3421
  class ProjectDetail(BaseModel):
@@ -3445,6 +3696,37 @@ class StartTrainingResponse(BaseModel):
3445
3696
  )
3446
3697
 
3447
3698
 
3699
+ class StorageBreakdownOutput(BaseModel):
3700
+ total_files: int = Field(
3701
+ ...,
3702
+ description="Stored files when the breakdown was computed.",
3703
+ title="Total Files",
3704
+ )
3705
+ total_bytes: int = Field(..., description="Bytes those files hold.", title="Total Bytes")
3706
+ by_origin: list[StorageSliceOutput] = Field(..., description="Generated and uploaded files.", title="By Origin")
3707
+ by_category: list[StorageSliceOutput] = Field(
3708
+ ...,
3709
+ description="Files by content category, most bytes first.",
3710
+ title="By Category",
3711
+ )
3712
+ by_age: list[StorageSliceOutput] = Field(..., description="Files by age, youngest first.", title="By Age")
3713
+ by_project: list[StorageSliceOutput] = Field(
3714
+ ...,
3715
+ description="The projects holding the most, then the rest together, then files in no project. A file in several projects counts in each.",
3716
+ title="By Project",
3717
+ )
3718
+ by_member: list[StorageSliceOutput] = Field(
3719
+ ...,
3720
+ description="The members who created the most, then everyone else together.",
3721
+ title="By Member",
3722
+ )
3723
+ largest_files: list[StoredFileOutput] = Field(
3724
+ ...,
3725
+ description="The largest stored files, largest first.",
3726
+ title="Largest Files",
3727
+ )
3728
+
3729
+
3448
3730
  class TileGrid(BaseModel):
3449
3731
  """
3450
3732
  One tile's place on the grid. Every tile of a set shares all but the footprint and height.
@@ -3557,6 +3839,62 @@ class UpdateMemberBody(BaseModel):
3557
3839
  )
3558
3840
 
3559
3841
 
3842
+ class WorkspaceStorageOutput(BaseModel):
3843
+ used_bytes: int = Field(
3844
+ ...,
3845
+ description="Bytes the workspace stores now: a live count.",
3846
+ title="Used Bytes",
3847
+ )
3848
+ quota_bytes: int | None = Field(
3849
+ ...,
3850
+ description="The most the workspace may store; null when it has no limit.",
3851
+ title="Quota Bytes",
3852
+ )
3853
+ breakdown: StorageBreakdownOutput | None = Field(
3854
+ ...,
3855
+ description="What the stored files are, as of `breakdown_computed_at`; null until first computed.",
3856
+ )
3857
+ breakdown_computed_at: AwareDatetime | None = Field(
3858
+ ...,
3859
+ description="When the breakdown was computed. It trails `used_bytes`, which is live.",
3860
+ title="Breakdown Computed At",
3861
+ )
3862
+ is_breakdown_computing: bool = Field(
3863
+ ...,
3864
+ description="Whether a fresh breakdown is being computed.",
3865
+ title="Is Breakdown Computing",
3866
+ )
3867
+ breakdown_recompute_available_at: AwareDatetime | None = Field(
3868
+ ...,
3869
+ description="When a fresh breakdown can next be asked for: 15 minutes after the last was computed. Null when it can be now.",
3870
+ title="Breakdown Recompute Available At",
3871
+ )
3872
+
3873
+
3874
+ class AutoDeletePolicyIO(BaseModel):
3875
+ is_enabled: bool | None = Field(False, description="Whether the rules run every night.", title="Is Enabled")
3876
+ rules: list[AutoDeleteRuleIO] | None = Field(
3877
+ None,
3878
+ description="A file any rule reaches is deleted. A file something depends on, or that is public or featured, never is.",
3879
+ max_length=10,
3880
+ title="Rules",
3881
+ )
3882
+ is_locked: bool | None = Field(
3883
+ False,
3884
+ description="Whether every workspace under this one must follow these rules, whatever they set.",
3885
+ title="Is Locked",
3886
+ )
3887
+ notify_admins: bool | None = Field(
3888
+ False,
3889
+ description="Whether admins are told what each run deleted.",
3890
+ title="Notify Admins",
3891
+ )
3892
+
3893
+
3894
+ class AutoDeletePreviewInput(BaseModel):
3895
+ rules: list[AutoDeleteRuleIO] = Field(..., description="The rules to preview.", max_length=10, title="Rules")
3896
+
3897
+
3560
3898
  class BaseModelDefaultsOutput(BaseModel):
3561
3899
  """
3562
3900
  Layer's curated recommendations, filtered to what this workspace may run.
@@ -3584,6 +3922,21 @@ class BaseModelDefaultsOutput(BaseModel):
3584
3922
  )
3585
3923
 
3586
3924
 
3925
+ class EffectiveAutoDeletePolicyOutput(BaseModel):
3926
+ policy: AutoDeletePolicyIO
3927
+ source_workspace_id: UUID = Field(
3928
+ ...,
3929
+ description="The workspace that set the policy: this one or an ancestor.",
3930
+ title="Source Workspace Id",
3931
+ )
3932
+ source_workspace_name: str | None = Field(..., description="That workspace's name.", title="Source Workspace Name")
3933
+ is_locked_by_ancestor: bool = Field(
3934
+ ...,
3935
+ description="Whether an ancestor locked it, so this workspace cannot set its own.",
3936
+ title="Is Locked By Ancestor",
3937
+ )
3938
+
3939
+
3587
3940
  class FileMetadataView(BaseModel):
3588
3941
  """
3589
3942
  What an engine needs beyond the image to build a resource from a file. Each kind is null when absent.
@@ -3860,6 +4213,22 @@ class WorkflowRunAsset(BaseModel):
3860
4213
  )
3861
4214
 
3862
4215
 
4216
+ class AutoDeleteOutput(BaseModel):
4217
+ is_available: bool = Field(
4218
+ ...,
4219
+ description="Whether the workspace can use auto-delete: Enterprise only.",
4220
+ title="Is Available",
4221
+ )
4222
+ policy: AutoDeletePolicyIO | None = Field(
4223
+ ...,
4224
+ description="The policy this workspace set itself; null when it follows another.",
4225
+ )
4226
+ effective_policy: EffectiveAutoDeletePolicyOutput | None = Field(
4227
+ ...,
4228
+ description="The policy that applies to this workspace; null when none does.",
4229
+ )
4230
+
4231
+
3863
4232
  class EstimateInferencePriceRequest(BaseModel):
3864
4233
  """
3865
4234
  REST request body for estimating inference price. workspace_id comes from path.
@@ -4000,6 +4369,24 @@ class EstimateInferencePriceRequest(BaseModel):
4000
4369
  description="Parts to split along when segment_by is PARTS, at most 10.",
4001
4370
  title="Segment Part Names",
4002
4371
  )
4372
+ segment_target: SegmentTarget | None = Field(
4373
+ None,
4374
+ description="What a mesh split treats the mesh as: CHARACTER, split by a body-part template, or GENERAL, split by segment_level. Support varies by model.",
4375
+ )
4376
+ segment_parts: SegmentParts | None = Field(
4377
+ None,
4378
+ description="How many parts a CHARACTER split makes. Support varies by model.",
4379
+ title="Segment Parts",
4380
+ )
4381
+ segment_level: SegmentLevel | None = Field(
4382
+ None,
4383
+ description="How finely a GENERAL split cuts the mesh: LOW, MEDIUM or HIGH. Support varies by model.",
4384
+ )
4385
+ segment_strength: SegmentStrength | None = Field(
4386
+ None,
4387
+ description="How aggressively a mesh split cuts: higher makes more parts. Support varies by model.",
4388
+ title="Segment Strength",
4389
+ )
4003
4390
  quad_mesh: bool | None = Field(None, description="Generate quad mesh.", title="Quad Mesh")
4004
4391
  pbr_materials: bool | None = Field(None, description="Generate PBR materials.", title="Pbr Materials")
4005
4392
  low_poly: bool | None = Field(None, description="Generate low-poly mesh.", title="Low Poly")
@@ -4212,6 +4599,24 @@ class EstimateInferencePriceV2Request(BaseModel):
4212
4599
  description="Parts to split along when segment_by is PARTS, at most 10.",
4213
4600
  title="Segment Part Names",
4214
4601
  )
4602
+ segment_target: SegmentTarget | None = Field(
4603
+ None,
4604
+ description="What a mesh split treats the mesh as: CHARACTER, split by a body-part template, or GENERAL, split by segment_level. Support varies by model.",
4605
+ )
4606
+ segment_parts: SegmentParts | None = Field(
4607
+ None,
4608
+ description="How many parts a CHARACTER split makes. Support varies by model.",
4609
+ title="Segment Parts",
4610
+ )
4611
+ segment_level: SegmentLevel | None = Field(
4612
+ None,
4613
+ description="How finely a GENERAL split cuts the mesh: LOW, MEDIUM or HIGH. Support varies by model.",
4614
+ )
4615
+ segment_strength: SegmentStrength | None = Field(
4616
+ None,
4617
+ description="How aggressively a mesh split cuts: higher makes more parts. Support varies by model.",
4618
+ title="Segment Strength",
4619
+ )
4215
4620
  quad_mesh: bool | None = Field(None, description="Generate quad mesh.", title="Quad Mesh")
4216
4621
  pbr_materials: bool | None = Field(None, description="Generate PBR materials.", title="Pbr Materials")
4217
4622
  low_poly: bool | None = Field(None, description="Generate low-poly mesh.", title="Low Poly")
@@ -4236,6 +4641,11 @@ class EstimateInferencePriceV2Request(BaseModel):
4236
4641
  None, description="Style exaggeration (0-1).", title="Style Exaggeration"
4237
4642
  )
4238
4643
  speed: Speed | None = Field(None, description="Speech speed multiplier.", title="Speed")
4644
+ speech_language: str | None = Field(
4645
+ None,
4646
+ description="The language the speech is in, as one of the codes the model's capabilities list under `speech_languages`. Omit to let the model detect it from the text.",
4647
+ title="Speech Language",
4648
+ )
4239
4649
  upscale_ratio: float | None = Field(None, description="Upscale factor (e.g. 2.0, 4.0).", title="Upscale Ratio")
4240
4650
  creativity: float | None = Field(
4241
4651
  None,
@@ -4400,7 +4810,7 @@ class EstimateInferencePriceV2Request(BaseModel):
4400
4810
  )
4401
4811
  output_fit: OutputFit | None = Field(
4402
4812
  None,
4403
- description="Fit the image onto its delivery canvas after everything else the run does: `trim` its transparent margin, keep the drawing's own size (`canvas: CONTENT`) or place it on a `FIXED` `width` x `height` canvas, scaled as `scale` says and aligned on `anchor` (`BASE` stands a game tile's base on the bottom centre), with `padding` px of transparent margin. Image outputs only.",
4813
+ description="Fit the image onto its delivery canvas after everything else the run does: `trim` its transparent margin, keep the drawing's own size (`canvas: CONTENT`) or place it on a `FIXED` `width` x `height` canvas, scaled as `scale` says and aligned on `anchor` (`BASE` stands a game tile's base on the bottom centre), with `padding` px of transparent margin and `corner_radius` px rounded corners cut to transparent. Image outputs only.",
4404
4814
  )
4405
4815
  nine_slice: bool | None = Field(
4406
4816
  None,
@@ -4592,6 +5002,24 @@ class ExecuteInferenceRequest(BaseModel):
4592
5002
  description="Parts to split along when segment_by is PARTS, at most 10.",
4593
5003
  title="Segment Part Names",
4594
5004
  )
5005
+ segment_target: SegmentTarget | None = Field(
5006
+ None,
5007
+ description="What a mesh split treats the mesh as: CHARACTER, split by a body-part template, or GENERAL, split by segment_level. Support varies by model.",
5008
+ )
5009
+ segment_parts: SegmentParts | None = Field(
5010
+ None,
5011
+ description="How many parts a CHARACTER split makes. Support varies by model.",
5012
+ title="Segment Parts",
5013
+ )
5014
+ segment_level: SegmentLevel | None = Field(
5015
+ None,
5016
+ description="How finely a GENERAL split cuts the mesh: LOW, MEDIUM or HIGH. Support varies by model.",
5017
+ )
5018
+ segment_strength: SegmentStrength | None = Field(
5019
+ None,
5020
+ description="How aggressively a mesh split cuts: higher makes more parts. Support varies by model.",
5021
+ title="Segment Strength",
5022
+ )
4595
5023
  quad_mesh: bool | None = Field(None, description="Generate quad mesh.", title="Quad Mesh")
4596
5024
  pbr_materials: bool | None = Field(None, description="Generate PBR materials.", title="Pbr Materials")
4597
5025
  low_poly: bool | None = Field(None, description="Generate low-poly mesh.", title="Low Poly")
@@ -4803,6 +5231,24 @@ class ExecuteInferenceV2Request(BaseModel):
4803
5231
  description="Parts to split along when segment_by is PARTS, at most 10.",
4804
5232
  title="Segment Part Names",
4805
5233
  )
5234
+ segment_target: SegmentTarget | None = Field(
5235
+ None,
5236
+ description="What a mesh split treats the mesh as: CHARACTER, split by a body-part template, or GENERAL, split by segment_level. Support varies by model.",
5237
+ )
5238
+ segment_parts: SegmentParts | None = Field(
5239
+ None,
5240
+ description="How many parts a CHARACTER split makes. Support varies by model.",
5241
+ title="Segment Parts",
5242
+ )
5243
+ segment_level: SegmentLevel | None = Field(
5244
+ None,
5245
+ description="How finely a GENERAL split cuts the mesh: LOW, MEDIUM or HIGH. Support varies by model.",
5246
+ )
5247
+ segment_strength: SegmentStrength | None = Field(
5248
+ None,
5249
+ description="How aggressively a mesh split cuts: higher makes more parts. Support varies by model.",
5250
+ title="Segment Strength",
5251
+ )
4806
5252
  quad_mesh: bool | None = Field(None, description="Generate quad mesh.", title="Quad Mesh")
4807
5253
  pbr_materials: bool | None = Field(None, description="Generate PBR materials.", title="Pbr Materials")
4808
5254
  low_poly: bool | None = Field(None, description="Generate low-poly mesh.", title="Low Poly")
@@ -4827,6 +5273,11 @@ class ExecuteInferenceV2Request(BaseModel):
4827
5273
  None, description="Style exaggeration (0-1).", title="Style Exaggeration"
4828
5274
  )
4829
5275
  speed: Speed | None = Field(None, description="Speech speed multiplier.", title="Speed")
5276
+ speech_language: str | None = Field(
5277
+ None,
5278
+ description="The language the speech is in, as one of the codes the model's capabilities list under `speech_languages`. Omit to let the model detect it from the text.",
5279
+ title="Speech Language",
5280
+ )
4830
5281
  upscale_ratio: float | None = Field(None, description="Upscale factor (e.g. 2.0, 4.0).", title="Upscale Ratio")
4831
5282
  creativity: float | None = Field(
4832
5283
  None,
@@ -4991,7 +5442,7 @@ class ExecuteInferenceV2Request(BaseModel):
4991
5442
  )
4992
5443
  output_fit: OutputFit | None = Field(
4993
5444
  None,
4994
- description="Fit the image onto its delivery canvas after everything else the run does: `trim` its transparent margin, keep the drawing's own size (`canvas: CONTENT`) or place it on a `FIXED` `width` x `height` canvas, scaled as `scale` says and aligned on `anchor` (`BASE` stands a game tile's base on the bottom centre), with `padding` px of transparent margin. Image outputs only.",
5445
+ description="Fit the image onto its delivery canvas after everything else the run does: `trim` its transparent margin, keep the drawing's own size (`canvas: CONTENT`) or place it on a `FIXED` `width` x `height` canvas, scaled as `scale` says and aligned on `anchor` (`BASE` stands a game tile's base on the bottom centre), with `padding` px of transparent margin and `corner_radius` px rounded corners cut to transparent. Image outputs only.",
4995
5446
  )
4996
5447
  nine_slice: bool | None = Field(
4997
5448
  None,
@@ -5053,6 +5504,11 @@ class ExecuteInferenceV2Request(BaseModel):
5053
5504
  None,
5054
5505
  description="Deliver this run's terminal events to a URL instead of polling for them. See the Webhooks section of this document for the payload, headers and retry behaviour.",
5055
5506
  )
5507
+ inference_tool_key: str | None = Field(
5508
+ None,
5509
+ description="The Layer tool this run is, such as `image.upscale`, so the asset it makes reopens in that tool in the Layer app. The run must be one the tool makes: a `base_model_id` from the tool's models, with every value the tool fixes left as the tool sets it. A run that is not is refused with a 422 naming why (`UNKNOWN_INFERENCE_TOOL`, `INFERENCE_TOOL_MODEL_NOT_IN_POOL`, `INFERENCE_TOOL_PIN_MISMATCH`, `INFERENCE_TOOL_NO_REFRAME` or `INFERENCE_TOOL_UPSCALE_COPIES_SOURCE`).",
5510
+ title="Inference Tool Key",
5511
+ )
5056
5512
 
5057
5513
 
5058
5514
  class GetWorkflowRunOutput(BaseModel):
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes