layer 1.0.77__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.77 → layer-1.0.84}/PKG-INFO +1 -1
  2. {layer-1.0.77 → layer-1.0.84}/pyproject.toml +1 -1
  3. {layer-1.0.77 → layer-1.0.84}/pyproject.toml.orig +1 -1
  4. {layer-1.0.77 → layer-1.0.84}/src/layer/_api/models.py +345 -2
  5. {layer-1.0.77 → layer-1.0.84}/README.md +0 -0
  6. {layer-1.0.77 → layer-1.0.84}/src/layer/__init__.py +0 -0
  7. {layer-1.0.77 → layer-1.0.84}/src/layer/__main__.py +0 -0
  8. {layer-1.0.77 → layer-1.0.84}/src/layer/_api/__init__.py +0 -0
  9. {layer-1.0.77 → layer-1.0.84}/src/layer/_api/client.py +0 -0
  10. {layer-1.0.77 → layer-1.0.84}/src/layer/_cli/__init__.py +0 -0
  11. {layer-1.0.77 → layer-1.0.84}/src/layer/_cli/auth_commands.py +0 -0
  12. {layer-1.0.77 → layer-1.0.84}/src/layer/_cli/base_model_commands.py +0 -0
  13. {layer-1.0.77 → layer-1.0.84}/src/layer/_cli/context.py +0 -0
  14. {layer-1.0.77 → layer-1.0.84}/src/layer/_cli/context_commands.py +0 -0
  15. {layer-1.0.77 → layer-1.0.84}/src/layer/_cli/generate_commands.py +0 -0
  16. {layer-1.0.77 → layer-1.0.84}/src/layer/_cli/main.py +0 -0
  17. {layer-1.0.77 → layer-1.0.84}/src/layer/_cli/output.py +0 -0
  18. {layer-1.0.77 → layer-1.0.84}/src/layer/auth.py +0 -0
  19. {layer-1.0.77 → layer-1.0.84}/src/layer/catalog.py +0 -0
  20. {layer-1.0.77 → layer-1.0.84}/src/layer/config.py +0 -0
  21. {layer-1.0.77 → layer-1.0.84}/src/layer/credentials.py +0 -0
  22. {layer-1.0.77 → layer-1.0.84}/src/layer/download.py +0 -0
  23. {layer-1.0.77 → layer-1.0.84}/src/layer/exit_codes.py +0 -0
  24. {layer-1.0.77 → layer-1.0.84}/src/layer/generate.py +0 -0
  25. {layer-1.0.77 → layer-1.0.84}/src/layer/oauth.py +0 -0
  26. {layer-1.0.77 → layer-1.0.84}/src/layer/params.py +0 -0
  27. {layer-1.0.77 → layer-1.0.84}/src/layer/sessions.py +0 -0
  28. {layer-1.0.77 → layer-1.0.84}/src/layer/sse.py +0 -0
  29. {layer-1.0.77 → layer-1.0.84}/src/layer/uploads.py +0 -0
  30. {layer-1.0.77 → 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.77
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.77"
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.77"
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.
@@ -734,6 +745,41 @@ class SessionName1(RootModel[str]):
734
745
  )
735
746
 
736
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
+
737
783
  class FileScore(BaseModel):
738
784
  rule_id: UUID = Field(..., description="The rule that produced this verdict.", title="Rule Id")
739
785
  rule_name: str = Field(
@@ -780,6 +826,8 @@ class FileSourceType(Enum):
780
826
  composite = "composite"
781
827
  google_drive = "google_drive"
782
828
  miro = "miro"
829
+ linear = "linear"
830
+ jira = "jira"
783
831
  transformed_reference = "transformed_reference"
784
832
  skill_resource = "skill_resource"
785
833
  skill_bundle = "skill_bundle"
@@ -1582,6 +1630,15 @@ class RequestUploadUrlResponse(BaseModel):
1582
1630
  )
1583
1631
 
1584
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
+
1585
1642
  class Role(Enum):
1586
1643
  admin = "admin"
1587
1644
  editor = "editor"
@@ -1727,6 +1784,18 @@ class SkippedFile(BaseModel):
1727
1784
  )
1728
1785
 
1729
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
+
1730
1799
  class SpriteSheetAnimationView(BaseModel):
1731
1800
  name: str = Field(..., description="The animation's name.", title="Name")
1732
1801
  frames: list[int] = Field(
@@ -1752,6 +1821,59 @@ class State2(Enum):
1752
1821
  terminal_failure = "terminal_failure"
1753
1822
 
1754
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
+
1755
1877
  class StyleCategory(Enum):
1756
1878
  """
1757
1879
  What a reference set *is*.
@@ -2019,6 +2141,10 @@ class UsageLimitMode(Enum):
2019
2141
 
2020
2142
 
2021
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
+
2022
2148
  daily = "daily"
2023
2149
  weekly = "weekly"
2024
2150
  monthly = "monthly"
@@ -2379,6 +2505,70 @@ class WorkspaceUsageOutput(BaseModel):
2379
2505
  )
2380
2506
 
2381
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
+
2382
2572
  class BaseModelCapabilitiesREST(BaseModel):
2383
2573
  """
2384
2574
  ToolModelCapabilities without the MCP token-saving serializer — returns all fields for REST.
@@ -2506,6 +2696,11 @@ class BaseModelCapabilitiesREST(BaseModel):
2506
2696
  description="ISO 639-1 codes a `dub_video` model can speak, passed to forge as `target_language`.",
2507
2697
  title="Dub Languages",
2508
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
+ )
2509
2704
  voice_reference_set_required: bool | None = Field(
2510
2705
  False,
2511
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.",
@@ -2693,6 +2888,20 @@ class CreateReferenceSetResponse(BaseModel):
2693
2888
  )
2694
2889
 
2695
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
+
2696
2905
  class EstimateInferencePriceV2Output(BaseModel):
2697
2906
  estimated_price_creative_units: float = Field(
2698
2907
  ...,
@@ -3206,6 +3415,7 @@ class OutputFit(BaseModel):
3206
3415
  scale: OutputFitScale | None = "PLACE"
3207
3416
  anchor: OutputFitAnchor | None = "CENTER"
3208
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")
3209
3419
 
3210
3420
 
3211
3421
  class ProjectDetail(BaseModel):
@@ -3486,6 +3696,37 @@ class StartTrainingResponse(BaseModel):
3486
3696
  )
3487
3697
 
3488
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
+
3489
3730
  class TileGrid(BaseModel):
3490
3731
  """
3491
3732
  One tile's place on the grid. Every tile of a set shares all but the footprint and height.
@@ -3598,6 +3839,62 @@ class UpdateMemberBody(BaseModel):
3598
3839
  )
3599
3840
 
3600
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
+
3601
3898
  class BaseModelDefaultsOutput(BaseModel):
3602
3899
  """
3603
3900
  Layer's curated recommendations, filtered to what this workspace may run.
@@ -3625,6 +3922,21 @@ class BaseModelDefaultsOutput(BaseModel):
3625
3922
  )
3626
3923
 
3627
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
+
3628
3940
  class FileMetadataView(BaseModel):
3629
3941
  """
3630
3942
  What an engine needs beyond the image to build a resource from a file. Each kind is null when absent.
@@ -3901,6 +4213,22 @@ class WorkflowRunAsset(BaseModel):
3901
4213
  )
3902
4214
 
3903
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
+
3904
4232
  class EstimateInferencePriceRequest(BaseModel):
3905
4233
  """
3906
4234
  REST request body for estimating inference price. workspace_id comes from path.
@@ -4313,6 +4641,11 @@ class EstimateInferencePriceV2Request(BaseModel):
4313
4641
  None, description="Style exaggeration (0-1).", title="Style Exaggeration"
4314
4642
  )
4315
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
+ )
4316
4649
  upscale_ratio: float | None = Field(None, description="Upscale factor (e.g. 2.0, 4.0).", title="Upscale Ratio")
4317
4650
  creativity: float | None = Field(
4318
4651
  None,
@@ -4477,7 +4810,7 @@ class EstimateInferencePriceV2Request(BaseModel):
4477
4810
  )
4478
4811
  output_fit: OutputFit | None = Field(
4479
4812
  None,
4480
- 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.",
4481
4814
  )
4482
4815
  nine_slice: bool | None = Field(
4483
4816
  None,
@@ -4940,6 +5273,11 @@ class ExecuteInferenceV2Request(BaseModel):
4940
5273
  None, description="Style exaggeration (0-1).", title="Style Exaggeration"
4941
5274
  )
4942
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
+ )
4943
5281
  upscale_ratio: float | None = Field(None, description="Upscale factor (e.g. 2.0, 4.0).", title="Upscale Ratio")
4944
5282
  creativity: float | None = Field(
4945
5283
  None,
@@ -5104,7 +5442,7 @@ class ExecuteInferenceV2Request(BaseModel):
5104
5442
  )
5105
5443
  output_fit: OutputFit | None = Field(
5106
5444
  None,
5107
- 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.",
5108
5446
  )
5109
5447
  nine_slice: bool | None = Field(
5110
5448
  None,
@@ -5166,6 +5504,11 @@ class ExecuteInferenceV2Request(BaseModel):
5166
5504
  None,
5167
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.",
5168
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
+ )
5169
5512
 
5170
5513
 
5171
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