@transloadit/node 4.11.0 → 4.11.1

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 (235) hide show
  1. package/README.md +1 -1
  2. package/dist/alphalib/imagemagickDensity.d.ts +4 -0
  3. package/dist/alphalib/imagemagickDensity.d.ts.map +1 -0
  4. package/dist/alphalib/imagemagickDensity.js +10 -0
  5. package/dist/alphalib/imagemagickDensity.js.map +1 -0
  6. package/dist/alphalib/types/assemblyReplay.d.ts +308 -4
  7. package/dist/alphalib/types/assemblyReplay.d.ts.map +1 -1
  8. package/dist/alphalib/types/assemblyReplay.js +22 -2
  9. package/dist/alphalib/types/assemblyReplay.js.map +1 -1
  10. package/dist/alphalib/types/assemblyStatus.d.ts +11 -10
  11. package/dist/alphalib/types/assemblyStatus.d.ts.map +1 -1
  12. package/dist/alphalib/types/assemblyStatus.js +25 -0
  13. package/dist/alphalib/types/assemblyStatus.js.map +1 -1
  14. package/dist/alphalib/types/robots/_index.d.ts +93 -0
  15. package/dist/alphalib/types/robots/_index.d.ts.map +1 -1
  16. package/dist/alphalib/types/robots/_instructions-primitives.d.ts +14 -2
  17. package/dist/alphalib/types/robots/_instructions-primitives.d.ts.map +1 -1
  18. package/dist/alphalib/types/robots/_instructions-primitives.js +36 -6
  19. package/dist/alphalib/types/robots/_instructions-primitives.js.map +1 -1
  20. package/dist/alphalib/types/robots/ai-chat.d.ts +13474 -1034
  21. package/dist/alphalib/types/robots/ai-chat.d.ts.map +1 -1
  22. package/dist/alphalib/types/robots/ai-chat.js +303 -57
  23. package/dist/alphalib/types/robots/ai-chat.js.map +1 -1
  24. package/dist/alphalib/types/robots/audio-artwork.d.ts.map +1 -1
  25. package/dist/alphalib/types/robots/audio-artwork.js +1 -0
  26. package/dist/alphalib/types/robots/audio-artwork.js.map +1 -1
  27. package/dist/alphalib/types/robots/audio-concat.d.ts +12 -0
  28. package/dist/alphalib/types/robots/audio-concat.d.ts.map +1 -1
  29. package/dist/alphalib/types/robots/audio-concat.js +3 -1
  30. package/dist/alphalib/types/robots/audio-concat.js.map +1 -1
  31. package/dist/alphalib/types/robots/audio-encode.d.ts.map +1 -1
  32. package/dist/alphalib/types/robots/audio-encode.js +1 -0
  33. package/dist/alphalib/types/robots/audio-encode.js.map +1 -1
  34. package/dist/alphalib/types/robots/audio-loop.d.ts.map +1 -1
  35. package/dist/alphalib/types/robots/audio-loop.js +1 -0
  36. package/dist/alphalib/types/robots/audio-loop.js.map +1 -1
  37. package/dist/alphalib/types/robots/audio-merge.d.ts.map +1 -1
  38. package/dist/alphalib/types/robots/audio-merge.js +1 -0
  39. package/dist/alphalib/types/robots/audio-merge.js.map +1 -1
  40. package/dist/alphalib/types/robots/audio-split.d.ts.map +1 -1
  41. package/dist/alphalib/types/robots/audio-split.js +1 -0
  42. package/dist/alphalib/types/robots/audio-split.js.map +1 -1
  43. package/dist/alphalib/types/robots/audio-waveform.d.ts.map +1 -1
  44. package/dist/alphalib/types/robots/audio-waveform.js +1 -0
  45. package/dist/alphalib/types/robots/audio-waveform.js.map +1 -1
  46. package/dist/alphalib/types/robots/azure-import.d.ts +12 -0
  47. package/dist/alphalib/types/robots/azure-import.d.ts.map +1 -1
  48. package/dist/alphalib/types/robots/backblaze-import.d.ts +12 -0
  49. package/dist/alphalib/types/robots/backblaze-import.d.ts.map +1 -1
  50. package/dist/alphalib/types/robots/box-import.d.ts +12 -0
  51. package/dist/alphalib/types/robots/box-import.d.ts.map +1 -1
  52. package/dist/alphalib/types/robots/cloudfiles-import.d.ts +12 -0
  53. package/dist/alphalib/types/robots/cloudfiles-import.d.ts.map +1 -1
  54. package/dist/alphalib/types/robots/cloudflare-import.d.ts +12 -0
  55. package/dist/alphalib/types/robots/cloudflare-import.d.ts.map +1 -1
  56. package/dist/alphalib/types/robots/digitalocean-import.d.ts +12 -0
  57. package/dist/alphalib/types/robots/digitalocean-import.d.ts.map +1 -1
  58. package/dist/alphalib/types/robots/document-merge.d.ts +12 -0
  59. package/dist/alphalib/types/robots/document-merge.d.ts.map +1 -1
  60. package/dist/alphalib/types/robots/document-merge.js +2 -1
  61. package/dist/alphalib/types/robots/document-merge.js.map +1 -1
  62. package/dist/alphalib/types/robots/document-ocr.d.ts +10 -10
  63. package/dist/alphalib/types/robots/document-ocr.d.ts.map +1 -1
  64. package/dist/alphalib/types/robots/document-ocr.js +4 -4
  65. package/dist/alphalib/types/robots/document-ocr.js.map +1 -1
  66. package/dist/alphalib/types/robots/dropbox-import.d.ts +12 -0
  67. package/dist/alphalib/types/robots/dropbox-import.d.ts.map +1 -1
  68. package/dist/alphalib/types/robots/file-preview.d.ts +12 -12
  69. package/dist/alphalib/types/robots/file-preview.js +2 -2
  70. package/dist/alphalib/types/robots/file-preview.js.map +1 -1
  71. package/dist/alphalib/types/robots/file-serve.d.ts.map +1 -1
  72. package/dist/alphalib/types/robots/file-serve.js +1 -0
  73. package/dist/alphalib/types/robots/file-serve.js.map +1 -1
  74. package/dist/alphalib/types/robots/file-verify.d.ts +12 -0
  75. package/dist/alphalib/types/robots/file-verify.d.ts.map +1 -1
  76. package/dist/alphalib/types/robots/file-verify.js +6 -0
  77. package/dist/alphalib/types/robots/file-verify.js.map +1 -1
  78. package/dist/alphalib/types/robots/ftp-import.d.ts +12 -0
  79. package/dist/alphalib/types/robots/ftp-import.d.ts.map +1 -1
  80. package/dist/alphalib/types/robots/google-import.d.ts +12 -0
  81. package/dist/alphalib/types/robots/google-import.d.ts.map +1 -1
  82. package/dist/alphalib/types/robots/http-import.d.ts +12 -12
  83. package/dist/alphalib/types/robots/http-import.d.ts.map +1 -1
  84. package/dist/alphalib/types/robots/http-import.js +0 -6
  85. package/dist/alphalib/types/robots/http-import.js.map +1 -1
  86. package/dist/alphalib/types/robots/image-bgremove.d.ts +10 -10
  87. package/dist/alphalib/types/robots/image-bgremove.d.ts.map +1 -1
  88. package/dist/alphalib/types/robots/image-bgremove.js +4 -4
  89. package/dist/alphalib/types/robots/image-bgremove.js.map +1 -1
  90. package/dist/alphalib/types/robots/image-describe.d.ts +10 -10
  91. package/dist/alphalib/types/robots/image-describe.d.ts.map +1 -1
  92. package/dist/alphalib/types/robots/image-describe.js +4 -4
  93. package/dist/alphalib/types/robots/image-describe.js.map +1 -1
  94. package/dist/alphalib/types/robots/image-facedetect.d.ts +10 -10
  95. package/dist/alphalib/types/robots/image-facedetect.d.ts.map +1 -1
  96. package/dist/alphalib/types/robots/image-facedetect.js +4 -4
  97. package/dist/alphalib/types/robots/image-facedetect.js.map +1 -1
  98. package/dist/alphalib/types/robots/image-generate.d.ts +6 -6
  99. package/dist/alphalib/types/robots/image-generate.d.ts.map +1 -1
  100. package/dist/alphalib/types/robots/image-generate.js +2 -2
  101. package/dist/alphalib/types/robots/image-generate.js.map +1 -1
  102. package/dist/alphalib/types/robots/image-merge.d.ts +68 -8
  103. package/dist/alphalib/types/robots/image-merge.d.ts.map +1 -1
  104. package/dist/alphalib/types/robots/image-merge.js +46 -3
  105. package/dist/alphalib/types/robots/image-merge.js.map +1 -1
  106. package/dist/alphalib/types/robots/image-ocr.d.ts +10 -10
  107. package/dist/alphalib/types/robots/image-ocr.d.ts.map +1 -1
  108. package/dist/alphalib/types/robots/image-ocr.js +4 -4
  109. package/dist/alphalib/types/robots/image-ocr.js.map +1 -1
  110. package/dist/alphalib/types/robots/image-resize.d.ts +9 -8
  111. package/dist/alphalib/types/robots/image-resize.d.ts.map +1 -1
  112. package/dist/alphalib/types/robots/image-resize.js +9 -8
  113. package/dist/alphalib/types/robots/image-resize.js.map +1 -1
  114. package/dist/alphalib/types/robots/image-upscale.d.ts +4 -4
  115. package/dist/alphalib/types/robots/image-upscale.d.ts.map +1 -1
  116. package/dist/alphalib/types/robots/image-upscale.js +2 -2
  117. package/dist/alphalib/types/robots/image-upscale.js.map +1 -1
  118. package/dist/alphalib/types/robots/mega-import.d.ts +12 -0
  119. package/dist/alphalib/types/robots/mega-import.d.ts.map +1 -1
  120. package/dist/alphalib/types/robots/minio-import.d.ts +12 -0
  121. package/dist/alphalib/types/robots/minio-import.d.ts.map +1 -1
  122. package/dist/alphalib/types/robots/s3-import.d.ts +12 -0
  123. package/dist/alphalib/types/robots/s3-import.d.ts.map +1 -1
  124. package/dist/alphalib/types/robots/sftp-import.d.ts +24 -0
  125. package/dist/alphalib/types/robots/sftp-import.d.ts.map +1 -1
  126. package/dist/alphalib/types/robots/sftp-import.js +6 -2
  127. package/dist/alphalib/types/robots/sftp-import.js.map +1 -1
  128. package/dist/alphalib/types/robots/speech-transcribe.d.ts +10 -10
  129. package/dist/alphalib/types/robots/speech-transcribe.d.ts.map +1 -1
  130. package/dist/alphalib/types/robots/speech-transcribe.js +9 -9
  131. package/dist/alphalib/types/robots/speech-transcribe.js.map +1 -1
  132. package/dist/alphalib/types/robots/supabase-import.d.ts +12 -0
  133. package/dist/alphalib/types/robots/supabase-import.d.ts.map +1 -1
  134. package/dist/alphalib/types/robots/swift-import.d.ts +12 -0
  135. package/dist/alphalib/types/robots/swift-import.d.ts.map +1 -1
  136. package/dist/alphalib/types/robots/text-speak.d.ts +10 -10
  137. package/dist/alphalib/types/robots/text-speak.d.ts.map +1 -1
  138. package/dist/alphalib/types/robots/text-speak.js +4 -4
  139. package/dist/alphalib/types/robots/text-speak.js.map +1 -1
  140. package/dist/alphalib/types/robots/text-translate.d.ts +10 -10
  141. package/dist/alphalib/types/robots/text-translate.d.ts.map +1 -1
  142. package/dist/alphalib/types/robots/text-translate.js +4 -4
  143. package/dist/alphalib/types/robots/text-translate.js.map +1 -1
  144. package/dist/alphalib/types/robots/tigris-import.d.ts +12 -0
  145. package/dist/alphalib/types/robots/tigris-import.d.ts.map +1 -1
  146. package/dist/alphalib/types/robots/tlcdn-deliver.d.ts.map +1 -1
  147. package/dist/alphalib/types/robots/tlcdn-deliver.js +1 -0
  148. package/dist/alphalib/types/robots/tlcdn-deliver.js.map +1 -1
  149. package/dist/alphalib/types/robots/video-adaptive.d.ts.map +1 -1
  150. package/dist/alphalib/types/robots/video-adaptive.js +1 -0
  151. package/dist/alphalib/types/robots/video-adaptive.js.map +1 -1
  152. package/dist/alphalib/types/robots/video-artwork.d.ts.map +1 -1
  153. package/dist/alphalib/types/robots/video-artwork.js +1 -0
  154. package/dist/alphalib/types/robots/video-artwork.js.map +1 -1
  155. package/dist/alphalib/types/robots/video-concat.d.ts +12 -0
  156. package/dist/alphalib/types/robots/video-concat.d.ts.map +1 -1
  157. package/dist/alphalib/types/robots/video-concat.js +3 -1
  158. package/dist/alphalib/types/robots/video-concat.js.map +1 -1
  159. package/dist/alphalib/types/robots/video-encode.d.ts +4 -4
  160. package/dist/alphalib/types/robots/video-encode.d.ts.map +1 -1
  161. package/dist/alphalib/types/robots/video-encode.js +1 -0
  162. package/dist/alphalib/types/robots/video-encode.js.map +1 -1
  163. package/dist/alphalib/types/robots/video-generate.d.ts +6 -6
  164. package/dist/alphalib/types/robots/video-generate.d.ts.map +1 -1
  165. package/dist/alphalib/types/robots/video-generate.js +3 -2
  166. package/dist/alphalib/types/robots/video-generate.js.map +1 -1
  167. package/dist/alphalib/types/robots/video-merge.d.ts +12 -0
  168. package/dist/alphalib/types/robots/video-merge.d.ts.map +1 -1
  169. package/dist/alphalib/types/robots/video-merge.js +4 -6
  170. package/dist/alphalib/types/robots/video-merge.js.map +1 -1
  171. package/dist/alphalib/types/robots/video-ondemand.d.ts +4 -4
  172. package/dist/alphalib/types/robots/video-ondemand.d.ts.map +1 -1
  173. package/dist/alphalib/types/robots/video-ondemand.js +1 -0
  174. package/dist/alphalib/types/robots/video-ondemand.js.map +1 -1
  175. package/dist/alphalib/types/robots/video-split.d.ts.map +1 -1
  176. package/dist/alphalib/types/robots/video-split.js +1 -0
  177. package/dist/alphalib/types/robots/video-split.js.map +1 -1
  178. package/dist/alphalib/types/robots/video-subtitle.d.ts.map +1 -1
  179. package/dist/alphalib/types/robots/video-subtitle.js +1 -0
  180. package/dist/alphalib/types/robots/video-subtitle.js.map +1 -1
  181. package/dist/alphalib/types/robots/video-thumbs.d.ts +24 -0
  182. package/dist/alphalib/types/robots/video-thumbs.d.ts.map +1 -1
  183. package/dist/alphalib/types/robots/video-thumbs.js +29 -0
  184. package/dist/alphalib/types/robots/video-thumbs.js.map +1 -1
  185. package/dist/alphalib/types/robots/vimeo-import.d.ts +12 -0
  186. package/dist/alphalib/types/robots/vimeo-import.d.ts.map +1 -1
  187. package/dist/alphalib/types/robots/wasabi-import.d.ts +12 -0
  188. package/dist/alphalib/types/robots/wasabi-import.d.ts.map +1 -1
  189. package/dist/cli/semanticIntents/imageDescribe.d.ts +1 -1
  190. package/dist/cli/semanticIntents/imageDescribe.d.ts.map +1 -1
  191. package/dist/cli/semanticIntents/imageDescribe.js +2 -2
  192. package/dist/cli/semanticIntents/imageDescribe.js.map +1 -1
  193. package/package.json +2 -2
  194. package/src/alphalib/imagemagickDensity.ts +15 -0
  195. package/src/alphalib/types/assemblyReplay.ts +31 -2
  196. package/src/alphalib/types/assemblyStatus.ts +29 -0
  197. package/src/alphalib/types/robots/_instructions-primitives.ts +39 -6
  198. package/src/alphalib/types/robots/ai-chat.ts +447 -57
  199. package/src/alphalib/types/robots/audio-artwork.ts +1 -0
  200. package/src/alphalib/types/robots/audio-concat.ts +3 -0
  201. package/src/alphalib/types/robots/audio-encode.ts +1 -0
  202. package/src/alphalib/types/robots/audio-loop.ts +1 -0
  203. package/src/alphalib/types/robots/audio-merge.ts +1 -0
  204. package/src/alphalib/types/robots/audio-split.ts +1 -0
  205. package/src/alphalib/types/robots/audio-waveform.ts +1 -0
  206. package/src/alphalib/types/robots/document-merge.ts +7 -1
  207. package/src/alphalib/types/robots/document-ocr.ts +5 -4
  208. package/src/alphalib/types/robots/file-preview.ts +2 -2
  209. package/src/alphalib/types/robots/file-serve.ts +1 -0
  210. package/src/alphalib/types/robots/file-verify.ts +6 -0
  211. package/src/alphalib/types/robots/http-import.ts +0 -6
  212. package/src/alphalib/types/robots/image-bgremove.ts +11 -4
  213. package/src/alphalib/types/robots/image-describe.ts +5 -4
  214. package/src/alphalib/types/robots/image-facedetect.ts +5 -4
  215. package/src/alphalib/types/robots/image-generate.ts +7 -2
  216. package/src/alphalib/types/robots/image-merge.ts +46 -2
  217. package/src/alphalib/types/robots/image-ocr.ts +5 -4
  218. package/src/alphalib/types/robots/image-resize.ts +11 -7
  219. package/src/alphalib/types/robots/image-upscale.ts +7 -2
  220. package/src/alphalib/types/robots/sftp-import.ts +12 -2
  221. package/src/alphalib/types/robots/speech-transcribe.ts +9 -8
  222. package/src/alphalib/types/robots/text-speak.ts +5 -4
  223. package/src/alphalib/types/robots/text-translate.ts +5 -4
  224. package/src/alphalib/types/robots/tlcdn-deliver.ts +1 -0
  225. package/src/alphalib/types/robots/video-adaptive.ts +1 -0
  226. package/src/alphalib/types/robots/video-artwork.ts +1 -0
  227. package/src/alphalib/types/robots/video-concat.ts +3 -0
  228. package/src/alphalib/types/robots/video-encode.ts +1 -0
  229. package/src/alphalib/types/robots/video-generate.ts +8 -2
  230. package/src/alphalib/types/robots/video-merge.ts +5 -5
  231. package/src/alphalib/types/robots/video-ondemand.ts +1 -0
  232. package/src/alphalib/types/robots/video-split.ts +1 -0
  233. package/src/alphalib/types/robots/video-subtitle.ts +1 -0
  234. package/src/alphalib/types/robots/video-thumbs.ts +29 -0
  235. package/src/cli/semanticIntents/imageDescribe.ts +2 -3
@@ -2,15 +2,28 @@ import type { RobotMetaInput } from './_instructions-primitives.ts'
2
2
 
3
3
  import { z } from 'zod'
4
4
 
5
- import { interpolateRobot, robotBase, robotUse } from './_instructions-primitives.ts'
5
+ import {
6
+ autoProviderDescription,
7
+ interpolateRobot,
8
+ robotBase,
9
+ robotUse,
10
+ } from './_instructions-primitives.ts'
6
11
 
7
12
  // We duplicate coreMessageSchema (and its related types) from structuredAiVercel.ts here
8
13
  // so that we do not need to distribute structuredAiVercel.ts to for instance
9
14
  // the node-sdk, which does rely on this ai-chat file to determine
10
15
  // support Robot parameters.
11
16
 
17
+ export type JsonValue =
18
+ | string
19
+ | number
20
+ | boolean
21
+ | null
22
+ | JsonValue[]
23
+ | { [key: string]: JsonValue }
24
+
12
25
  // Define JSONValue schema for proper type matching with AI SDK
13
- const jsonValueSchema: z.ZodType = z.lazy(() =>
26
+ const jsonValueSchema: z.ZodType<JsonValue> = z.lazy(() =>
14
27
  z.union([
15
28
  z.string(),
16
29
  z.number(),
@@ -21,74 +34,323 @@ const jsonValueSchema: z.ZodType = z.lazy(() =>
21
34
  ]),
22
35
  )
23
36
 
24
- // Define provider metadata schema to match the AI SDK v5
37
+ // Define provider options schema to match the AI SDK.
25
38
  const providerMetadataSchema = z.record(z.record(jsonValueSchema)).optional()
26
39
 
40
+ function isRecord(value: unknown): value is Record<string, unknown> {
41
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
42
+ }
43
+
44
+ function withCurrentProviderOptions(value: Record<string, unknown>): Record<string, unknown> {
45
+ const { experimental_providerMetadata, ...rest } = value
46
+ const providerOptions = value.providerOptions ?? experimental_providerMetadata
47
+ return providerOptions === undefined ? rest : { ...rest, providerOptions }
48
+ }
49
+
50
+ function legacyToolOutput(
51
+ result: unknown,
52
+ isError: boolean,
53
+ experimentalContent: unknown,
54
+ ): unknown {
55
+ if (!isError && Array.isArray(experimentalContent)) {
56
+ const content = experimentalContent.flatMap((part): unknown[] => {
57
+ if (!isRecord(part)) {
58
+ return []
59
+ }
60
+ if (part.type === 'text' && typeof part.text === 'string') {
61
+ return [{ type: 'text', text: part.text }]
62
+ }
63
+ if (part.type === 'image' && typeof part.data === 'string') {
64
+ return [
65
+ {
66
+ type: 'image-data',
67
+ data: part.data,
68
+ mediaType: typeof part.mimeType === 'string' ? part.mimeType : 'image',
69
+ },
70
+ ]
71
+ }
72
+ if (
73
+ part.type === 'media' &&
74
+ typeof part.data === 'string' &&
75
+ typeof part.mediaType === 'string'
76
+ ) {
77
+ return [{ type: 'file-data', data: part.data, mediaType: part.mediaType }]
78
+ }
79
+ return []
80
+ })
81
+ if (content.length === experimentalContent.length) {
82
+ return { type: 'content', value: content }
83
+ }
84
+ }
85
+
86
+ let parsed: ReturnType<typeof jsonValueSchema.safeParse> | undefined
87
+ try {
88
+ // Zod's recursive JSON schema overflows before returning a failed parse for circular values.
89
+ parsed = jsonValueSchema.safeParse(result)
90
+ } catch {
91
+ parsed = undefined
92
+ }
93
+ if (parsed?.success) {
94
+ return { type: isError ? 'error-json' : 'json', value: parsed.data }
95
+ }
96
+ return { type: isError ? 'error-text' : 'text', value: stringifyLegacyToolResult(result) }
97
+ }
98
+
99
+ function stringifyLegacyToolResult(result: unknown): string {
100
+ try {
101
+ const serialized = JSON.stringify(result)
102
+ if (serialized !== undefined) {
103
+ return serialized
104
+ }
105
+ } catch {
106
+ // Fall back to the platform string representation for circular or unsupported values.
107
+ }
108
+ return String(result)
109
+ }
110
+
111
+ function normalizeMessagePart(value: unknown): unknown {
112
+ if (!isRecord(value)) {
113
+ return value
114
+ }
115
+
116
+ const normalized = withCurrentProviderOptions(value)
117
+ if (normalized.type === 'image' && !('mediaType' in normalized) && 'mimeType' in normalized) {
118
+ const { mimeType, ...rest } = normalized
119
+ return { ...rest, mediaType: mimeType }
120
+ }
121
+ if (
122
+ normalized.type === 'media' &&
123
+ typeof normalized.data === 'string' &&
124
+ typeof normalized.mediaType === 'string'
125
+ ) {
126
+ const { data, mediaType, type: _type, ...rest } = normalized
127
+ return { ...rest, type: 'file', data: { type: 'data', data }, mediaType }
128
+ }
129
+ if (normalized.type === 'tool-call' && !('input' in normalized) && 'args' in normalized) {
130
+ const { args, ...rest } = normalized
131
+ return { ...rest, input: args }
132
+ }
133
+ if (normalized.type === 'tool-result' && 'output' in normalized) {
134
+ const output = normalized.output
135
+ if (isRecord(output) && output.type === 'content' && Array.isArray(output.value)) {
136
+ return {
137
+ ...normalized,
138
+ output: {
139
+ ...output,
140
+ value: output.value.map((part) => {
141
+ if (
142
+ isRecord(part) &&
143
+ part.type === 'media' &&
144
+ typeof part.data === 'string' &&
145
+ typeof part.mediaType === 'string'
146
+ ) {
147
+ return { type: 'file-data', data: part.data, mediaType: part.mediaType }
148
+ }
149
+ return part
150
+ }),
151
+ },
152
+ }
153
+ }
154
+ }
155
+ if (normalized.type === 'tool-result' && !('output' in normalized)) {
156
+ const { experimental_content: experimentalContent, isError, result, ...rest } = normalized
157
+ return {
158
+ ...rest,
159
+ output: legacyToolOutput(result, isError === true, experimentalContent),
160
+ }
161
+ }
162
+ return normalized
163
+ }
164
+
165
+ function normalizeMessage(value: unknown): unknown {
166
+ if (!isRecord(value)) {
167
+ return value
168
+ }
169
+ const normalized = withCurrentProviderOptions(value)
170
+ return Array.isArray(normalized.content)
171
+ ? { ...normalized, content: normalized.content.map(normalizeMessagePart) }
172
+ : normalized
173
+ }
174
+
175
+ const inlineDataSchema = z.union([z.string(), z.instanceof(Uint8Array), z.instanceof(ArrayBuffer)])
176
+ const providerReferenceSchema = z.record(z.string(), z.string())
177
+ const taggedFileDataSchema = z.discriminatedUnion('type', [
178
+ z.object({ type: z.literal('data'), data: inlineDataSchema }),
179
+ z.object({ type: z.literal('url'), url: z.instanceof(URL) }),
180
+ z.object({ type: z.literal('reference'), reference: providerReferenceSchema }),
181
+ z.object({ type: z.literal('text'), text: z.string() }),
182
+ ])
183
+ const taggedReasoningFileDataSchema = z.discriminatedUnion('type', [
184
+ z.object({ type: z.literal('data'), data: inlineDataSchema }),
185
+ z.object({ type: z.literal('url'), url: z.instanceof(URL) }),
186
+ ])
187
+
27
188
  const textPartSchema = z.object({
28
189
  type: z.literal('text'),
29
190
  text: z.string(),
30
- experimental_providerMetadata: providerMetadataSchema,
191
+ providerOptions: providerMetadataSchema,
31
192
  })
32
193
  const imagePartSchema = z.object({
33
194
  type: z.literal('image'),
34
- image: z.union([
35
- z.string(),
36
- z.instanceof(Uint8Array),
37
- z.instanceof(ArrayBuffer),
38
- // Note: Buffer is not included here since it's Node.js-only and this code runs in browsers.
39
- // Node.js Buffer extends Uint8Array, so Uint8Array validation handles Buffer values too.
40
- z.instanceof(URL),
41
- ]),
42
- mimeType: z.string().optional(),
43
- experimental_providerMetadata: providerMetadataSchema,
195
+ image: z.union([inlineDataSchema, z.instanceof(URL), providerReferenceSchema]),
196
+ mediaType: z.string().optional(),
197
+ providerOptions: providerMetadataSchema,
44
198
  })
45
199
  const filePartSchema = z.object({
46
200
  type: z.literal('file'),
47
201
  data: z.union([
48
- z.string(),
49
- z.instanceof(Uint8Array),
50
- z.instanceof(ArrayBuffer),
51
- // Note: Buffer is not included here since it's Node.js-only and this code runs in browsers.
52
- // Node.js Buffer extends Uint8Array, so Uint8Array validation handles Buffer values too.
202
+ taggedFileDataSchema,
203
+ inlineDataSchema,
53
204
  z.instanceof(URL),
205
+ providerReferenceSchema,
54
206
  ]),
207
+ filename: z.string().optional(),
55
208
  mediaType: z.string(),
56
- experimental_providerMetadata: providerMetadataSchema,
209
+ providerOptions: providerMetadataSchema,
210
+ })
211
+ const reasoningPartSchema = z.object({
212
+ type: z.literal('reasoning'),
213
+ text: z.string(),
214
+ providerOptions: providerMetadataSchema,
57
215
  })
58
- const toolCallPartSchema = z.object({
216
+ function isCustomKind(value: string): value is `${string}.${string}` {
217
+ return value.includes('.')
218
+ }
219
+ const customPartSchema = z.object({
220
+ type: z.literal('custom'),
221
+ kind: z.string().refine(isCustomKind),
222
+ providerOptions: providerMetadataSchema,
223
+ })
224
+ const reasoningFilePartSchema = z.object({
225
+ type: z.literal('reasoning-file'),
226
+ data: z.union([taggedReasoningFileDataSchema, inlineDataSchema, z.instanceof(URL)]),
227
+ mediaType: z.string(),
228
+ providerOptions: providerMetadataSchema,
229
+ })
230
+ const toolCallPartBaseSchema = z.object({
59
231
  type: z.literal('tool-call'),
60
232
  toolCallId: z.string(),
61
233
  toolName: z.string(),
62
- args: z.record(jsonValueSchema),
63
- experimental_providerMetadata: providerMetadataSchema,
234
+ input: z.unknown(),
235
+ providerOptions: providerMetadataSchema,
236
+ providerExecuted: z.boolean().optional(),
64
237
  })
65
- const toolResultPartSchema = z.object({
66
- type: z.literal('tool-result'),
67
- toolCallId: z.string(),
68
- toolName: z.string(),
69
- result: z.unknown(),
70
- experimental_content: z
71
- .array(
238
+ type ToolCallPart = Omit<z.infer<typeof toolCallPartBaseSchema>, 'input'> & { input: unknown }
239
+ const toolCallPartSchema = toolCallPartBaseSchema.transform(
240
+ (part): ToolCallPart => ({ ...part, input: part.input }),
241
+ )
242
+ const toolOutputSchema = z.discriminatedUnion('type', [
243
+ z.object({ type: z.literal('text'), value: z.string(), providerOptions: providerMetadataSchema }),
244
+ z.object({
245
+ type: z.literal('json'),
246
+ value: jsonValueSchema,
247
+ providerOptions: providerMetadataSchema,
248
+ }),
249
+ z.object({
250
+ type: z.literal('execution-denied'),
251
+ reason: z.string().optional(),
252
+ providerOptions: providerMetadataSchema,
253
+ }),
254
+ z.object({
255
+ type: z.literal('error-text'),
256
+ value: z.string(),
257
+ providerOptions: providerMetadataSchema,
258
+ }),
259
+ z.object({
260
+ type: z.literal('error-json'),
261
+ value: jsonValueSchema,
262
+ providerOptions: providerMetadataSchema,
263
+ }),
264
+ z.object({
265
+ type: z.literal('content'),
266
+ value: z.array(
72
267
  z.union([
73
268
  z.object({
74
269
  type: z.literal('text'),
75
270
  text: z.string(),
271
+ providerOptions: providerMetadataSchema,
272
+ }),
273
+ z.object({
274
+ type: z.literal('file'),
275
+ data: taggedFileDataSchema,
276
+ mediaType: z.string(),
277
+ filename: z.string().optional(),
278
+ providerOptions: providerMetadataSchema,
76
279
  }),
77
280
  z.object({
78
- type: z.literal('image'),
281
+ type: z.literal('file-data'),
79
282
  data: z.string(),
80
- mimeType: z.string().optional(),
283
+ mediaType: z.string(),
284
+ filename: z.string().optional(),
285
+ providerOptions: providerMetadataSchema,
286
+ }),
287
+ z.object({
288
+ type: z.literal('file-url'),
289
+ url: z.string(),
290
+ mediaType: z.string().optional(),
291
+ providerOptions: providerMetadataSchema,
292
+ }),
293
+ z.object({
294
+ type: z.literal('file-id'),
295
+ fileId: z.union([z.string(), providerReferenceSchema]),
296
+ providerOptions: providerMetadataSchema,
297
+ }),
298
+ z.object({
299
+ type: z.literal('file-reference'),
300
+ providerReference: providerReferenceSchema,
301
+ providerOptions: providerMetadataSchema,
81
302
  }),
303
+ z.object({
304
+ type: z.literal('image-data'),
305
+ data: z.string(),
306
+ mediaType: z.string(),
307
+ providerOptions: providerMetadataSchema,
308
+ }),
309
+ z.object({
310
+ type: z.literal('image-url'),
311
+ url: z.string(),
312
+ providerOptions: providerMetadataSchema,
313
+ }),
314
+ z.object({
315
+ type: z.literal('image-file-id'),
316
+ fileId: z.union([z.string(), providerReferenceSchema]),
317
+ providerOptions: providerMetadataSchema,
318
+ }),
319
+ z.object({
320
+ type: z.literal('image-file-reference'),
321
+ providerReference: providerReferenceSchema,
322
+ providerOptions: providerMetadataSchema,
323
+ }),
324
+ z.object({ type: z.literal('custom'), providerOptions: providerMetadataSchema }),
82
325
  ]),
83
- )
84
- .optional(),
85
- isError: z.boolean().optional(),
86
- experimental_providerMetadata: providerMetadataSchema,
326
+ ),
327
+ }),
328
+ ])
329
+ const toolResultPartSchema = z.object({
330
+ type: z.literal('tool-result'),
331
+ toolCallId: z.string(),
332
+ toolName: z.string(),
333
+ output: toolOutputSchema,
334
+ providerOptions: providerMetadataSchema,
335
+ })
336
+ const toolApprovalRequestSchema = z.object({
337
+ type: z.literal('tool-approval-request'),
338
+ approvalId: z.string(),
339
+ toolCallId: z.string(),
340
+ isAutomatic: z.boolean().optional(),
341
+ signature: z.string().optional(),
342
+ })
343
+ const toolApprovalResponseSchema = z.object({
344
+ type: z.literal('tool-approval-response'),
345
+ approvalId: z.string(),
346
+ approved: z.boolean(),
347
+ reason: z.string().optional(),
348
+ providerExecuted: z.boolean().optional(),
87
349
  })
88
350
  const coreSystemMessageSchema = z.object({
89
351
  role: z.literal('system'),
90
352
  content: z.string(),
91
- experimental_providerMetadata: providerMetadataSchema,
353
+ providerOptions: providerMetadataSchema,
92
354
  })
93
355
  const coreUserMessageSchema = z.object({
94
356
  role: z.literal('user'),
@@ -96,24 +358,141 @@ const coreUserMessageSchema = z.object({
96
358
  z.string(),
97
359
  z.array(z.union([textPartSchema, imagePartSchema, filePartSchema])),
98
360
  ]),
99
- experimental_providerMetadata: providerMetadataSchema,
361
+ providerOptions: providerMetadataSchema,
100
362
  })
101
363
  const coreAssistantMessageSchema = z.object({
102
364
  role: z.literal('assistant'),
103
- content: z.union([z.string(), z.array(z.union([textPartSchema, toolCallPartSchema]))]),
104
- experimental_providerMetadata: providerMetadataSchema,
365
+ content: z.union([
366
+ z.string(),
367
+ z.array(
368
+ z.union([
369
+ textPartSchema,
370
+ customPartSchema,
371
+ filePartSchema,
372
+ reasoningPartSchema,
373
+ reasoningFilePartSchema,
374
+ toolCallPartSchema,
375
+ toolResultPartSchema,
376
+ toolApprovalRequestSchema,
377
+ ]),
378
+ ),
379
+ ]),
380
+ providerOptions: providerMetadataSchema,
105
381
  })
106
382
  const coreToolMessageSchema = z.object({
107
383
  role: z.literal('tool'),
108
- content: z.array(toolResultPartSchema),
109
- experimental_providerMetadata: providerMetadataSchema,
384
+ content: z.array(z.union([toolResultPartSchema, toolApprovalResponseSchema])),
385
+ providerOptions: providerMetadataSchema,
110
386
  })
111
- const coreMessageSchema = z.discriminatedUnion('role', [
387
+ const coreMessageOutputSchema = z.discriminatedUnion('role', [
112
388
  coreSystemMessageSchema,
113
389
  coreUserMessageSchema,
114
390
  coreAssistantMessageSchema,
115
391
  coreToolMessageSchema,
116
392
  ])
393
+ const coreMessageSchema = z.preprocess(normalizeMessage, coreMessageOutputSchema)
394
+
395
+ type ProviderMetadata = NonNullable<z.output<typeof providerMetadataSchema>>
396
+ type CompatibleProviderOptions<Part extends { providerOptions?: ProviderMetadata }> = Omit<
397
+ Part,
398
+ 'providerOptions'
399
+ > & {
400
+ providerOptions?: ProviderMetadata
401
+ experimental_providerMetadata?: ProviderMetadata
402
+ }
403
+ type MessageProviderOptions = {
404
+ providerOptions?: ProviderMetadata
405
+ experimental_providerMetadata?: ProviderMetadata
406
+ }
407
+
408
+ type TextPartInput = CompatibleProviderOptions<z.output<typeof textPartSchema>>
409
+ type ImagePartInput = CompatibleProviderOptions<z.output<typeof imagePartSchema>>
410
+ type LegacyImagePartInput = CompatibleProviderOptions<
411
+ Omit<z.output<typeof imagePartSchema>, 'mediaType'> & { mimeType?: string }
412
+ >
413
+ type FilePartInput = CompatibleProviderOptions<z.output<typeof filePartSchema>>
414
+ type CustomPartInput = CompatibleProviderOptions<z.output<typeof customPartSchema>>
415
+ type ReasoningPartInput = CompatibleProviderOptions<z.output<typeof reasoningPartSchema>>
416
+ type ReasoningFilePartInput = CompatibleProviderOptions<z.output<typeof reasoningFilePartSchema>>
417
+ type ToolCallPartInput = CompatibleProviderOptions<z.output<typeof toolCallPartSchema>>
418
+ type LegacyToolCallPartInput = Omit<ToolCallPartInput, 'input'> & { args: unknown }
419
+ type ToolResultPartInput = CompatibleProviderOptions<z.output<typeof toolResultPartSchema>>
420
+
421
+ type LegacyTextToolContentPart = { type: 'text'; text: string }
422
+ type LegacyImageToolContentPart = { type: 'image'; data: string; mimeType?: string }
423
+ type LegacyMediaToolContentPart = { type: 'media'; data: string; mediaType: string }
424
+ type LegacyToolContentPart =
425
+ | LegacyTextToolContentPart
426
+ | LegacyImageToolContentPart
427
+ | LegacyMediaToolContentPart
428
+ type CurrentToolContentPart = Extract<
429
+ z.output<typeof toolOutputSchema>,
430
+ { type: 'content' }
431
+ >['value'][number]
432
+ type LegacyToolResultPartInput = {
433
+ type: 'tool-result'
434
+ toolCallId: string
435
+ toolName: string
436
+ output?:
437
+ | Exclude<z.output<typeof toolOutputSchema>, { type: 'content' }>
438
+ | { type: 'content'; value: Array<CurrentToolContentPart | LegacyToolContentPart> }
439
+ result?: unknown
440
+ isError?: boolean
441
+ experimental_content?: LegacyToolContentPart[]
442
+ } & MessageProviderOptions
443
+ type LegacyMediaMessagePartInput = LegacyMediaToolContentPart & MessageProviderOptions
444
+
445
+ type CoreSystemMessageInput = {
446
+ role: 'system'
447
+ content: string
448
+ } & MessageProviderOptions
449
+ type CoreUserMessageInput = {
450
+ role: 'user'
451
+ content:
452
+ | string
453
+ | Array<
454
+ | TextPartInput
455
+ | ImagePartInput
456
+ | LegacyImagePartInput
457
+ | FilePartInput
458
+ | LegacyMediaMessagePartInput
459
+ >
460
+ } & MessageProviderOptions
461
+ type CoreAssistantMessageInput = {
462
+ role: 'assistant'
463
+ content:
464
+ | string
465
+ | Array<
466
+ | TextPartInput
467
+ | CustomPartInput
468
+ | FilePartInput
469
+ | ReasoningPartInput
470
+ | ReasoningFilePartInput
471
+ | ToolCallPartInput
472
+ | LegacyToolCallPartInput
473
+ | ToolResultPartInput
474
+ | LegacyToolResultPartInput
475
+ | z.output<typeof toolApprovalRequestSchema>
476
+ >
477
+ } & MessageProviderOptions
478
+ type CoreToolMessageInput = {
479
+ role: 'tool'
480
+ content: Array<
481
+ ToolResultPartInput | LegacyToolResultPartInput | z.output<typeof toolApprovalResponseSchema>
482
+ >
483
+ } & MessageProviderOptions
484
+
485
+ export type CoreMessageInput =
486
+ | z.output<typeof coreMessageOutputSchema>
487
+ | CoreSystemMessageInput
488
+ | CoreUserMessageInput
489
+ | CoreAssistantMessageInput
490
+ | CoreToolMessageInput
491
+
492
+ type WithTypedMessages<Instructions extends { messages: unknown }> = Omit<
493
+ Instructions,
494
+ 'messages'
495
+ > & { messages: string | CoreMessageInput[] }
117
496
 
118
497
  export const meta: RobotMetaInput = {
119
498
  name: 'AiChatRobot',
@@ -154,17 +533,24 @@ export const meta: RobotMetaInput = {
154
533
  }
155
534
 
156
535
  /**
157
- * Model capabilities for /ai/chat. This centralizes which models support which input types.
536
+ * Transloadit's supported /ai/chat models and their input capabilities.
537
+ * This is intentionally not a complete vendor catalog: add models only after runtime behavior,
538
+ * pricing, and file handling have been reviewed.
158
539
  * Key format: 'vendor/model'
159
540
  */
160
541
  export const MODEL_CAPABILITIES: Record<string, { pdf: boolean; image: boolean }> = {
542
+ 'anthropic/claude-sonnet-4-6': { pdf: true, image: true },
161
543
  'anthropic/claude-4-sonnet-20250514': { pdf: true, image: true },
544
+ 'anthropic/claude-sonnet-4-20250514': { pdf: true, image: true },
545
+ 'anthropic/claude-opus-4-8': { pdf: true, image: true },
162
546
  'anthropic/claude-4-opus-20250514': { pdf: true, image: true },
547
+ 'anthropic/claude-opus-4-20250514': { pdf: true, image: true },
163
548
  'anthropic/claude-sonnet-4-5': { pdf: true, image: true },
164
549
  'anthropic/claude-opus-4-5': { pdf: true, image: true },
165
550
  'anthropic/claude-opus-4-6': { pdf: true, image: true },
166
551
  'anthropic/claude-opus-4-7': { pdf: true, image: true },
167
- 'anthropic/claude-opus-4-8': { pdf: true, image: true },
552
+ 'anthropic/claude-fable-5': { pdf: true, image: true },
553
+ 'anthropic/claude-sonnet-5': { pdf: true, image: true },
168
554
  'openai/gpt-4.1-2025-04-14': { pdf: false, image: true },
169
555
  'openai/chatgpt-4o-latest': { pdf: false, image: true },
170
556
  'openai/o3-2025-04-16': { pdf: false, image: true },
@@ -176,6 +562,7 @@ export const MODEL_CAPABILITIES: Record<string, { pdf: boolean; image: boolean }
176
562
  'openai/gpt-5.2-chat-latest': { pdf: false, image: true },
177
563
  'openai/gpt-5.2-pro': { pdf: false, image: true },
178
564
  'openai/gpt-5.5': { pdf: false, image: true },
565
+ 'openai/gpt-5.6-sol': { pdf: false, image: true },
179
566
  'openai/gpt-5.4': { pdf: false, image: true },
180
567
  'openai/gpt-5.4-mini': { pdf: false, image: true },
181
568
  'openai/gpt-5.4-nano': { pdf: false, image: true },
@@ -184,9 +571,9 @@ export const MODEL_CAPABILITIES: Record<string, { pdf: boolean; image: boolean }
184
571
  }
185
572
 
186
573
  // Default model for /ai/chat when `model: "auto"` (or unset).
187
- // 2026-04-29: default is GPT-5.5 (intentional; aligns with our current recommended OpenAI
574
+ // 2026-07-09: default is GPT-5.6 Sol (intentional; aligns with our current recommended OpenAI
188
575
  // flagship model). Keep this aligned with MODEL_CAPABILITIES.
189
- export const AI_CHAT_DEFAULT_MODEL = 'openai/gpt-5.5' satisfies keyof typeof MODEL_CAPABILITIES
576
+ export const AI_CHAT_DEFAULT_MODEL = 'openai/gpt-5.6-sol' satisfies keyof typeof MODEL_CAPABILITIES
190
577
 
191
578
  const supportedModelsList = Object.keys(MODEL_CAPABILITIES)
192
579
 
@@ -232,13 +619,13 @@ export const robotAiChatInstructionsSchema = robotBase
232
619
  .union([z.string(), z.array(z.string())])
233
620
  .optional()
234
621
  .describe(
235
- 'Names of template credentials to make available to the robot. When using your own AI provider keys, Transloadit charges a 10% markup (minimum $0.0005 per request).',
622
+ 'Names of template credentials to make available to the robot. When using your own AI provider keys, Transloadit charges a 30% markup (minimum $0.0005 per request).',
236
623
  ),
237
624
  test_credentials: z
238
625
  .boolean()
239
626
  .optional()
240
627
  .describe(
241
- 'Use Transloadit-provided credentials for testing. Usage is billed at provider cost plus a 10% markup (minimum $0.0005 per request).',
628
+ 'Use Transloadit-provided credentials for testing. Usage is billed at provider cost plus a 30% markup (minimum $0.0005 per request).',
242
629
  ),
243
630
  mcp_servers: z
244
631
  .array(
@@ -266,9 +653,9 @@ export const robotAiChatInstructionsWithHiddenFieldsSchema = robotAiChatInstruct
266
653
  result: z.union([z.literal('debug'), robotAiChatInstructionsSchema.shape.result]),
267
654
  provider: z
268
655
  .string()
269
- .optional()
656
+ .default('auto')
270
657
  .describe(
271
- 'Where to run the model. By the default, it is the vendor. For instance, anthropic:claude* runs on the Anthropic API. But, Claude could also be run on AWS Bedrock. This is a hidden placeholder for now, but will be used in the future to allow for more flexibility in where to run models. ',
658
+ `${autoProviderDescription} This is a hidden placeholder for future model routing flexibility.`,
272
659
  ),
273
660
  // These are listed here because we don't have these properties in the public documentation.
274
661
  // They should set these keys using template credentials.
@@ -283,13 +670,16 @@ export const robotAiChatInstructionsWithHiddenFieldsSchema = robotAiChatInstruct
283
670
  })
284
671
 
285
672
  export type RobotAiChatInstructions = z.infer<typeof robotAiChatInstructionsSchema>
673
+ export type RobotAiChatInstructionsInput = WithTypedMessages<
674
+ z.input<typeof robotAiChatInstructionsSchema>
675
+ >
286
676
 
287
677
  export type RobotAiChatInstructionsWithHiddenFields = z.infer<
288
678
  typeof robotAiChatInstructionsWithHiddenFieldsSchema
289
679
  >
290
680
 
291
- export type RobotAiChatInstructionsWithHiddenFieldsInput = z.input<
292
- typeof robotAiChatInstructionsWithHiddenFieldsSchema
681
+ export type RobotAiChatInstructionsWithHiddenFieldsInput = WithTypedMessages<
682
+ z.input<typeof robotAiChatInstructionsWithHiddenFieldsSchema>
293
683
  >
294
684
 
295
685
  export const interpolatableRobotAiChatInstructionsSchema = interpolateRobot(
@@ -298,8 +688,8 @@ export const interpolatableRobotAiChatInstructionsSchema = interpolateRobot(
298
688
  export type InterpolatableRobotAiChatInstructions = z.infer<
299
689
  typeof interpolatableRobotAiChatInstructionsSchema
300
690
  >
301
- export type InterpolatableRobotAiChatInstructionsInput = z.input<
302
- typeof interpolatableRobotAiChatInstructionsSchema
691
+ export type InterpolatableRobotAiChatInstructionsInput = WithTypedMessages<
692
+ z.input<typeof interpolatableRobotAiChatInstructionsSchema>
303
693
  >
304
694
 
305
695
  export const interpolatableRobotAiChatInstructionsWithHiddenFieldsSchema = interpolateRobot(
@@ -308,6 +698,6 @@ export const interpolatableRobotAiChatInstructionsWithHiddenFieldsSchema = inter
308
698
  export type InterpolatableRobotAiChatInstructionsWithHiddenFields = z.infer<
309
699
  typeof interpolatableRobotAiChatInstructionsWithHiddenFieldsSchema
310
700
  >
311
- export type InterpolatableRobotAiChatInstructionsWithHiddenFieldsInput = z.input<
312
- typeof interpolatableRobotAiChatInstructionsWithHiddenFieldsSchema
701
+ export type InterpolatableRobotAiChatInstructionsWithHiddenFieldsInput = WithTypedMessages<
702
+ z.input<typeof interpolatableRobotAiChatInstructionsWithHiddenFieldsSchema>
313
703
  >
@@ -43,6 +43,7 @@ export const meta: RobotMetaInput = {
43
43
  queueSlotCount: 20,
44
44
  isAllowedForUrlTransform: true,
45
45
  trackOutputFileSize: true,
46
+ applyCommunityPlanMediaTrim: true,
46
47
  isInternal: false,
47
48
  removeJobResultFilesFromDiskRightAfterStoringOnS3: false,
48
49
  stage: 'ga',
@@ -5,6 +5,7 @@ import { z } from 'zod'
5
5
  import { stackVersions } from '../stackVersions.ts'
6
6
  import {
7
7
  bitrateSchema,
8
+ inputSortBySchema,
8
9
  interpolateRobot,
9
10
  robotBase,
10
11
  robotFFmpegAudio,
@@ -64,6 +65,7 @@ export const meta: RobotMetaInput = {
64
65
  queueSlotCount: 20,
65
66
  isAllowedForUrlTransform: true,
66
67
  trackOutputFileSize: true,
68
+ applyCommunityPlanMediaTrim: true,
67
69
  isInternal: false,
68
70
  removeJobResultFilesFromDiskRightAfterStoringOnS3: false,
69
71
  stage: 'ga',
@@ -104,6 +106,7 @@ The duration of the crossfade is controlled by the \`audio_fade_seconds\` parame
104
106
 
105
107
  Note: This parameter requires at least 2 audio files to concatenate and only works with audio files, not video files.
106
108
  `),
109
+ sort_by: inputSortBySchema,
107
110
  })
108
111
  .strict()
109
112
 
@@ -47,6 +47,7 @@ export const meta: RobotMetaInput = {
47
47
  queueSlotCount: 20,
48
48
  isAllowedForUrlTransform: true,
49
49
  trackOutputFileSize: true,
50
+ applyCommunityPlanMediaTrim: true,
50
51
  isInternal: false,
51
52
  stage: 'ga',
52
53
  removeJobResultFilesFromDiskRightAfterStoringOnS3: false,