kiapi 0.1.0__py3-none-any.whl

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 (465) hide show
  1. kiapi/__init__.py +3 -0
  2. kiapi/__main__.py +4 -0
  3. kiapi/api/__init__.py +26 -0
  4. kiapi/api/_constants/require_auth.py +14 -0
  5. kiapi/api/_helpers/build_job_responses.py +73 -0
  6. kiapi/api/_helpers/build_openapi.py +55 -0
  7. kiapi/api/_helpers/build_train_responses.py +21 -0
  8. kiapi/api/_helpers/get_accept.py +20 -0
  9. kiapi/api/_helpers/get_ctx.py +7 -0
  10. kiapi/api/_helpers/get_worker.py +7 -0
  11. kiapi/api/_helpers/register_capability_endpoints.py +70 -0
  12. kiapi/api/_helpers/submit_and_maybe_wait.py +113 -0
  13. kiapi/api/_settings.py +50 -0
  14. kiapi/api/_views/async_job_response.py +21 -0
  15. kiapi/api/_views/capability_model_spec.py +49 -0
  16. kiapi/api/app.py +150 -0
  17. kiapi/api/audio/acestep/_views/extract_response.py +57 -0
  18. kiapi/api/audio/acestep/_views/track_response.py +57 -0
  19. kiapi/api/audio/acestep/router.py +190 -0
  20. kiapi/api/audio/audiogen/_views/audio_response.py +46 -0
  21. kiapi/api/audio/audiogen/router.py +77 -0
  22. kiapi/api/chat/_views/chat_completion_response.py +71 -0
  23. kiapi/api/chat/router.py +253 -0
  24. kiapi/api/embedding/_views/embedding_response.py +35 -0
  25. kiapi/api/embedding/router.py +82 -0
  26. kiapi/api/files/_operations/get_file.py +14 -0
  27. kiapi/api/files/_operations/get_file_id.py +18 -0
  28. kiapi/api/files/_views/file_delete_response.py +14 -0
  29. kiapi/api/files/_views/file_list_response.py +15 -0
  30. kiapi/api/files/router.py +105 -0
  31. kiapi/api/health/_views/health_response.py +26 -0
  32. kiapi/api/health/router.py +28 -0
  33. kiapi/api/image/depthpro/_views/estimate_response.py +70 -0
  34. kiapi/api/image/depthpro/router.py +81 -0
  35. kiapi/api/image/ernie/_views/image_response.py +50 -0
  36. kiapi/api/image/ernie/router.py +181 -0
  37. kiapi/api/image/flux2/_views/image_response.py +53 -0
  38. kiapi/api/image/flux2/router.py +197 -0
  39. kiapi/api/image/ideogram4/_views/image_response.py +55 -0
  40. kiapi/api/image/ideogram4/router.py +87 -0
  41. kiapi/api/image/qwen/_views/image_response.py +47 -0
  42. kiapi/api/image/qwen/router.py +141 -0
  43. kiapi/api/image/seedvr2/_views/image_response.py +50 -0
  44. kiapi/api/image/seedvr2/router.py +83 -0
  45. kiapi/api/image/zimage/_views/image_response.py +49 -0
  46. kiapi/api/image/zimage/router.py +131 -0
  47. kiapi/api/jobs/_operations/get_job_id.py +18 -0
  48. kiapi/api/jobs/_views/job_delete_response.py +19 -0
  49. kiapi/api/jobs/_views/job_list_response.py +15 -0
  50. kiapi/api/jobs/router.py +62 -0
  51. kiapi/api/models/_schemas/openai_model_spec.py +26 -0
  52. kiapi/api/models/_views/model_list_response.py +15 -0
  53. kiapi/api/models/router.py +29 -0
  54. kiapi/api/video/ltx2/_views/__init__.py +1 -0
  55. kiapi/api/video/ltx2/_views/video_response.py +59 -0
  56. kiapi/api/video/ltx2/router.py +89 -0
  57. kiapi/api/web/_views/__init__.py +7 -0
  58. kiapi/api/web/_views/fetch_api_request.py +26 -0
  59. kiapi/api/web/_views/fetch_error_response.py +25 -0
  60. kiapi/api/web/router.py +302 -0
  61. kiapi/capabilities/__init__.py +24 -0
  62. kiapi/capabilities/_exceptions/CapabilityError.py +2 -0
  63. kiapi/capabilities/_exceptions/ValidationError.py +2 -0
  64. kiapi/capabilities/_helpers/attach_mflux_progress.py +50 -0
  65. kiapi/capabilities/_helpers/get_file_path.py +20 -0
  66. kiapi/capabilities/_helpers/resolve_file_ref.py +16 -0
  67. kiapi/capabilities/acestep/README.ja.md +174 -0
  68. kiapi/capabilities/acestep/README.md +167 -0
  69. kiapi/capabilities/acestep/__init__.py +37 -0
  70. kiapi/capabilities/acestep/_constants/description.py +122 -0
  71. kiapi/capabilities/acestep/_exceptions/ace_step_engine_error.py +2 -0
  72. kiapi/capabilities/acestep/_helpers/register.py +96 -0
  73. kiapi/capabilities/acestep/_models/acestep.py +105 -0
  74. kiapi/capabilities/acestep/_operations/handle_cover.py +23 -0
  75. kiapi/capabilities/acestep/_operations/handle_extract.py +38 -0
  76. kiapi/capabilities/acestep/_operations/handle_generate.py +18 -0
  77. kiapi/capabilities/acestep/_operations/handle_repaint.py +25 -0
  78. kiapi/capabilities/acestep/_operations/resolve_ace_step_paths.py +30 -0
  79. kiapi/capabilities/acestep/_operations/resolve_cover_params.py +21 -0
  80. kiapi/capabilities/acestep/_operations/resolve_engine.py +10 -0
  81. kiapi/capabilities/acestep/_operations/resolve_extract_params.py +24 -0
  82. kiapi/capabilities/acestep/_operations/resolve_generate_params.py +18 -0
  83. kiapi/capabilities/acestep/_operations/resolve_repaint_params.py +22 -0
  84. kiapi/capabilities/acestep/_schemas/ace_step_paths.py +29 -0
  85. kiapi/capabilities/acestep/_services/ace_step_engine.py +143 -0
  86. kiapi/capabilities/acestep/_settings.py +82 -0
  87. kiapi/capabilities/acestep/_views/ace_step_base.py +61 -0
  88. kiapi/capabilities/acestep/_views/cover_params.py +26 -0
  89. kiapi/capabilities/acestep/_views/cover_request.py +49 -0
  90. kiapi/capabilities/acestep/_views/extract_params.py +24 -0
  91. kiapi/capabilities/acestep/_views/extract_request.py +33 -0
  92. kiapi/capabilities/acestep/_views/generate_params.py +25 -0
  93. kiapi/capabilities/acestep/_views/generate_request.py +54 -0
  94. kiapi/capabilities/acestep/_views/repaint_params.py +27 -0
  95. kiapi/capabilities/acestep/_views/repaint_request.py +51 -0
  96. kiapi/capabilities/acestep/_views/track_params.py +7 -0
  97. kiapi/capabilities/acestep/worker_subprocess.py +247 -0
  98. kiapi/capabilities/audiogen/README.ja.md +49 -0
  99. kiapi/capabilities/audiogen/README.md +48 -0
  100. kiapi/capabilities/audiogen/__init__.py +25 -0
  101. kiapi/capabilities/audiogen/_constants/description.py +60 -0
  102. kiapi/capabilities/audiogen/_helpers/attach_audiogen_progress.py +27 -0
  103. kiapi/capabilities/audiogen/_helpers/register.py +42 -0
  104. kiapi/capabilities/audiogen/_helpers/validate_generate.py +14 -0
  105. kiapi/capabilities/audiogen/_models/audiogen.py +98 -0
  106. kiapi/capabilities/audiogen/_operations/handle_generate.py +27 -0
  107. kiapi/capabilities/audiogen/_operations/resolve_generate_params.py +25 -0
  108. kiapi/capabilities/audiogen/_settings.py +34 -0
  109. kiapi/capabilities/audiogen/_views/generate_params.py +14 -0
  110. kiapi/capabilities/audiogen/_views/generate_request.py +96 -0
  111. kiapi/capabilities/chat/README.ja.md +822 -0
  112. kiapi/capabilities/chat/README.md +806 -0
  113. kiapi/capabilities/chat/__init__.py +25 -0
  114. kiapi/capabilities/chat/_constants/description.py +163 -0
  115. kiapi/capabilities/chat/_helpers/register.py +67 -0
  116. kiapi/capabilities/chat/_models/qwen3_5.py +183 -0
  117. kiapi/capabilities/chat/_models/qwen3_omni.py +242 -0
  118. kiapi/capabilities/chat/_operations/apply_template.py +74 -0
  119. kiapi/capabilities/chat/_operations/completed_hermes_tool_call_text.py +9 -0
  120. kiapi/capabilities/chat/_operations/emit_streaming_response.py +297 -0
  121. kiapi/capabilities/chat/_operations/ensure_streaming_detokenizer_compat.py +49 -0
  122. kiapi/capabilities/chat/_operations/format_response.py +72 -0
  123. kiapi/capabilities/chat/_operations/handle_chat.py +25 -0
  124. kiapi/capabilities/chat/_operations/parse_hermes_tool_calls.py +63 -0
  125. kiapi/capabilities/chat/_operations/parse_json_tool_calls.py +66 -0
  126. kiapi/capabilities/chat/_operations/parse_messages.py +326 -0
  127. kiapi/capabilities/chat/_operations/resolve_chat_params.py +50 -0
  128. kiapi/capabilities/chat/_operations/stream_text_from_tokens.py +32 -0
  129. kiapi/capabilities/chat/_operations/strip_tool_calls.py +15 -0
  130. kiapi/capabilities/chat/_settings.py +74 -0
  131. kiapi/capabilities/chat/_utils/apply_parallel_tool_call_policy.py +17 -0
  132. kiapi/capabilities/chat/_utils/apply_seed.py +8 -0
  133. kiapi/capabilities/chat/_utils/load_audio_mono.py +31 -0
  134. kiapi/capabilities/chat/_utils/load_mlx_vlm.py +12 -0
  135. kiapi/capabilities/chat/_utils/warmup_params.py +26 -0
  136. kiapi/capabilities/chat/_views/chat_params.py +34 -0
  137. kiapi/capabilities/chat/_views/chat_request.py +153 -0
  138. kiapi/capabilities/depthpro/README.ja.md +131 -0
  139. kiapi/capabilities/depthpro/README.md +124 -0
  140. kiapi/capabilities/depthpro/__init__.py +23 -0
  141. kiapi/capabilities/depthpro/_constants/description.py +39 -0
  142. kiapi/capabilities/depthpro/_helpers/register.py +46 -0
  143. kiapi/capabilities/depthpro/_helpers/validate_estimate.py +32 -0
  144. kiapi/capabilities/depthpro/_models/depthpro.py +144 -0
  145. kiapi/capabilities/depthpro/_operations/handle_estimate.py +50 -0
  146. kiapi/capabilities/depthpro/_operations/is_quantize_override.py +12 -0
  147. kiapi/capabilities/depthpro/_operations/resolve_estimate_params.py +24 -0
  148. kiapi/capabilities/depthpro/_settings.py +46 -0
  149. kiapi/capabilities/depthpro/_views/estimate_params.py +21 -0
  150. kiapi/capabilities/depthpro/_views/estimate_request.py +63 -0
  151. kiapi/capabilities/embedding/README.ja.md +137 -0
  152. kiapi/capabilities/embedding/README.md +128 -0
  153. kiapi/capabilities/embedding/__init__.py +24 -0
  154. kiapi/capabilities/embedding/_constants/description.py +47 -0
  155. kiapi/capabilities/embedding/_helpers/register.py +66 -0
  156. kiapi/capabilities/embedding/_models/qwen3_text.py +53 -0
  157. kiapi/capabilities/embedding/_models/qwen3_vl.py +97 -0
  158. kiapi/capabilities/embedding/_operations/format_response.py +24 -0
  159. kiapi/capabilities/embedding/_operations/handle_embed.py +24 -0
  160. kiapi/capabilities/embedding/_operations/parse_inputs.py +108 -0
  161. kiapi/capabilities/embedding/_operations/resolve_embed_params.py +18 -0
  162. kiapi/capabilities/embedding/_settings.py +27 -0
  163. kiapi/capabilities/embedding/_utils/to_vector.py +20 -0
  164. kiapi/capabilities/embedding/_views/embed_params.py +17 -0
  165. kiapi/capabilities/embedding/_views/embed_request.py +39 -0
  166. kiapi/capabilities/ernie/README.ja.md +242 -0
  167. kiapi/capabilities/ernie/README.md +223 -0
  168. kiapi/capabilities/ernie/__init__.py +34 -0
  169. kiapi/capabilities/ernie/_constants/description.py +71 -0
  170. kiapi/capabilities/ernie/_helpers/register.py +60 -0
  171. kiapi/capabilities/ernie/_helpers/validate_edit.py +19 -0
  172. kiapi/capabilities/ernie/_helpers/validate_generate.py +8 -0
  173. kiapi/capabilities/ernie/_models/ernie.py +356 -0
  174. kiapi/capabilities/ernie/_operations/handle_edit.py +39 -0
  175. kiapi/capabilities/ernie/_operations/handle_generate.py +38 -0
  176. kiapi/capabilities/ernie/_operations/handle_train.py +77 -0
  177. kiapi/capabilities/ernie/_operations/is_quantize_override.py +16 -0
  178. kiapi/capabilities/ernie/_operations/resolve_edit_params.py +44 -0
  179. kiapi/capabilities/ernie/_operations/resolve_generate_params.py +40 -0
  180. kiapi/capabilities/ernie/_operations/resolve_lora_params.py +23 -0
  181. kiapi/capabilities/ernie/_operations/resolve_train_params.py +43 -0
  182. kiapi/capabilities/ernie/_operations/validate_common.py +33 -0
  183. kiapi/capabilities/ernie/_schemas/lora_ref.py +27 -0
  184. kiapi/capabilities/ernie/_settings.py +151 -0
  185. kiapi/capabilities/ernie/_views/edit_params.py +36 -0
  186. kiapi/capabilities/ernie/_views/edit_request.py +142 -0
  187. kiapi/capabilities/ernie/_views/generate_params.py +32 -0
  188. kiapi/capabilities/ernie/_views/generate_request.py +127 -0
  189. kiapi/capabilities/ernie/_views/train_params.py +28 -0
  190. kiapi/capabilities/ernie/_views/train_request.py +96 -0
  191. kiapi/capabilities/flux2/README.ja.md +260 -0
  192. kiapi/capabilities/flux2/README.md +241 -0
  193. kiapi/capabilities/flux2/__init__.py +36 -0
  194. kiapi/capabilities/flux2/_constants/description.py +81 -0
  195. kiapi/capabilities/flux2/_helpers/register.py +98 -0
  196. kiapi/capabilities/flux2/_helpers/validate_edit.py +12 -0
  197. kiapi/capabilities/flux2/_helpers/validate_generate.py +8 -0
  198. kiapi/capabilities/flux2/_models/flux2.py +396 -0
  199. kiapi/capabilities/flux2/_operations/handle_edit.py +44 -0
  200. kiapi/capabilities/flux2/_operations/handle_generate.py +46 -0
  201. kiapi/capabilities/flux2/_operations/handle_train.py +105 -0
  202. kiapi/capabilities/flux2/_operations/is_quantize_override.py +16 -0
  203. kiapi/capabilities/flux2/_operations/resolve_edit_params.py +43 -0
  204. kiapi/capabilities/flux2/_operations/resolve_generate_params.py +44 -0
  205. kiapi/capabilities/flux2/_operations/resolve_lora_params.py +23 -0
  206. kiapi/capabilities/flux2/_operations/resolve_train_params.py +42 -0
  207. kiapi/capabilities/flux2/_operations/role_spec.py +13 -0
  208. kiapi/capabilities/flux2/_operations/split_repo.py +11 -0
  209. kiapi/capabilities/flux2/_operations/validate_common.py +35 -0
  210. kiapi/capabilities/flux2/_schemas/lora_ref.py +27 -0
  211. kiapi/capabilities/flux2/_settings.py +181 -0
  212. kiapi/capabilities/flux2/_views/edit_params.py +36 -0
  213. kiapi/capabilities/flux2/_views/edit_request.py +145 -0
  214. kiapi/capabilities/flux2/_views/generate_params.py +36 -0
  215. kiapi/capabilities/flux2/_views/generate_request.py +150 -0
  216. kiapi/capabilities/flux2/_views/train_params.py +32 -0
  217. kiapi/capabilities/flux2/_views/train_request.py +102 -0
  218. kiapi/capabilities/ideogram4/README.ja.md +230 -0
  219. kiapi/capabilities/ideogram4/README.md +219 -0
  220. kiapi/capabilities/ideogram4/__init__.py +24 -0
  221. kiapi/capabilities/ideogram4/_constants/description.py +65 -0
  222. kiapi/capabilities/ideogram4/_helpers/register.py +44 -0
  223. kiapi/capabilities/ideogram4/_helpers/validate_generate.py +31 -0
  224. kiapi/capabilities/ideogram4/_models/ideogram4.py +120 -0
  225. kiapi/capabilities/ideogram4/_operations/handle_generate.py +30 -0
  226. kiapi/capabilities/ideogram4/_operations/is_quantize_override.py +12 -0
  227. kiapi/capabilities/ideogram4/_operations/resolve_generate_params.py +30 -0
  228. kiapi/capabilities/ideogram4/_settings.py +89 -0
  229. kiapi/capabilities/ideogram4/_views/generate_params.py +27 -0
  230. kiapi/capabilities/ideogram4/_views/generate_request.py +118 -0
  231. kiapi/capabilities/ltx2/README.ja.md +287 -0
  232. kiapi/capabilities/ltx2/README.md +274 -0
  233. kiapi/capabilities/ltx2/__init__.py +26 -0
  234. kiapi/capabilities/ltx2/_constants/description.py +81 -0
  235. kiapi/capabilities/ltx2/_helpers/register.py +58 -0
  236. kiapi/capabilities/ltx2/_helpers/validate_generate.py +42 -0
  237. kiapi/capabilities/ltx2/_models/ltx2.py +106 -0
  238. kiapi/capabilities/ltx2/_operations/detect_mode.py +19 -0
  239. kiapi/capabilities/ltx2/_operations/handle_generate.py +52 -0
  240. kiapi/capabilities/ltx2/_operations/resolve_generate_params.py +31 -0
  241. kiapi/capabilities/ltx2/_settings.py +93 -0
  242. kiapi/capabilities/ltx2/_views/generate_params.py +34 -0
  243. kiapi/capabilities/ltx2/_views/generate_request.py +151 -0
  244. kiapi/capabilities/qwen/README.ja.md +251 -0
  245. kiapi/capabilities/qwen/README.md +235 -0
  246. kiapi/capabilities/qwen/__init__.py +30 -0
  247. kiapi/capabilities/qwen/_constants/description.py +53 -0
  248. kiapi/capabilities/qwen/_helpers/register.py +60 -0
  249. kiapi/capabilities/qwen/_helpers/validate_edit.py +12 -0
  250. kiapi/capabilities/qwen/_helpers/validate_generate.py +12 -0
  251. kiapi/capabilities/qwen/_models/qwen.py +224 -0
  252. kiapi/capabilities/qwen/_operations/handle_edit.py +44 -0
  253. kiapi/capabilities/qwen/_operations/handle_generate.py +46 -0
  254. kiapi/capabilities/qwen/_operations/is_quantize_override.py +15 -0
  255. kiapi/capabilities/qwen/_operations/resolve_edit_params.py +35 -0
  256. kiapi/capabilities/qwen/_operations/resolve_generate_params.py +39 -0
  257. kiapi/capabilities/qwen/_operations/resolve_lora_params.py +23 -0
  258. kiapi/capabilities/qwen/_operations/validate_common.py +32 -0
  259. kiapi/capabilities/qwen/_schemas/lora_ref.py +27 -0
  260. kiapi/capabilities/qwen/_settings.py +107 -0
  261. kiapi/capabilities/qwen/_views/edit_params.py +36 -0
  262. kiapi/capabilities/qwen/_views/edit_request.py +138 -0
  263. kiapi/capabilities/qwen/_views/generate_params.py +37 -0
  264. kiapi/capabilities/qwen/_views/generate_request.py +149 -0
  265. kiapi/capabilities/seedvr2/README.ja.md +234 -0
  266. kiapi/capabilities/seedvr2/README.md +219 -0
  267. kiapi/capabilities/seedvr2/__init__.py +24 -0
  268. kiapi/capabilities/seedvr2/_constants/description.py +46 -0
  269. kiapi/capabilities/seedvr2/_helpers/register.py +60 -0
  270. kiapi/capabilities/seedvr2/_helpers/validate_upscale.py +52 -0
  271. kiapi/capabilities/seedvr2/_models/seedvr2.py +140 -0
  272. kiapi/capabilities/seedvr2/_operations/handle_upscale.py +42 -0
  273. kiapi/capabilities/seedvr2/_operations/is_quantize_override.py +12 -0
  274. kiapi/capabilities/seedvr2/_operations/resolve_upscale_params.py +30 -0
  275. kiapi/capabilities/seedvr2/_settings.py +74 -0
  276. kiapi/capabilities/seedvr2/_views/upscale_params.py +27 -0
  277. kiapi/capabilities/seedvr2/_views/upscale_request.py +94 -0
  278. kiapi/capabilities/web/README.ja.md +187 -0
  279. kiapi/capabilities/web/README.md +171 -0
  280. kiapi/capabilities/web/__init__.py +30 -0
  281. kiapi/capabilities/web/_constants/description.py +38 -0
  282. kiapi/capabilities/web/_exceptions/FetchError.py +24 -0
  283. kiapi/capabilities/web/_exceptions/SearchBackendError.py +11 -0
  284. kiapi/capabilities/web/_helpers/register.py +59 -0
  285. kiapi/capabilities/web/_models/crawl4ai.py +32 -0
  286. kiapi/capabilities/web/_models/searxng.py +44 -0
  287. kiapi/capabilities/web/_operations/handle_fetch.py +145 -0
  288. kiapi/capabilities/web/_operations/handle_search.py +56 -0
  289. kiapi/capabilities/web/_operations/resolve_fetch_params.py +19 -0
  290. kiapi/capabilities/web/_operations/resolve_search_params.py +34 -0
  291. kiapi/capabilities/web/_operations/resolve_searxng_config_dir.py +21 -0
  292. kiapi/capabilities/web/_services/__init__.py +1 -0
  293. kiapi/capabilities/web/_services/web_backend_process.py +144 -0
  294. kiapi/capabilities/web/_settings.py +138 -0
  295. kiapi/capabilities/web/_views/fetch_params.py +27 -0
  296. kiapi/capabilities/web/_views/fetch_request.py +29 -0
  297. kiapi/capabilities/web/_views/fetch_result.py +20 -0
  298. kiapi/capabilities/web/_views/search_params.py +43 -0
  299. kiapi/capabilities/web/_views/search_request.py +93 -0
  300. kiapi/capabilities/web/_views/search_response.py +49 -0
  301. kiapi/capabilities/web/resources/__init__.py +0 -0
  302. kiapi/capabilities/web/resources/searxng/__init__.py +0 -0
  303. kiapi/capabilities/web/resources/searxng/settings.yml +11 -0
  304. kiapi/capabilities/zimage/README.ja.md +249 -0
  305. kiapi/capabilities/zimage/README.md +231 -0
  306. kiapi/capabilities/zimage/__init__.py +34 -0
  307. kiapi/capabilities/zimage/_constants/description.py +73 -0
  308. kiapi/capabilities/zimage/_helpers/register.py +62 -0
  309. kiapi/capabilities/zimage/_helpers/validate_generate.py +37 -0
  310. kiapi/capabilities/zimage/_models/zimage.py +278 -0
  311. kiapi/capabilities/zimage/_operations/handle_generate.py +38 -0
  312. kiapi/capabilities/zimage/_operations/handle_train.py +78 -0
  313. kiapi/capabilities/zimage/_operations/is_quantize_override.py +11 -0
  314. kiapi/capabilities/zimage/_operations/resolve_generate_params.py +39 -0
  315. kiapi/capabilities/zimage/_operations/resolve_lora_params.py +23 -0
  316. kiapi/capabilities/zimage/_operations/resolve_train_params.py +38 -0
  317. kiapi/capabilities/zimage/_schemas/lora_ref.py +27 -0
  318. kiapi/capabilities/zimage/_settings.py +166 -0
  319. kiapi/capabilities/zimage/_views/generate_params.py +23 -0
  320. kiapi/capabilities/zimage/_views/generate_request.py +127 -0
  321. kiapi/capabilities/zimage/_views/train_params.py +22 -0
  322. kiapi/capabilities/zimage/_views/train_request.py +101 -0
  323. kiapi/cli/__init__.py +11 -0
  324. kiapi/cli/_helpers/dedupe_resources.py +12 -0
  325. kiapi/cli/_helpers/register_all_capabilities.py +36 -0
  326. kiapi/cli/_helpers/run_resources.py +24 -0
  327. kiapi/cli/_helpers/select_specs.py +67 -0
  328. kiapi/cli/activate/_operations/preflight_hf_access.py +129 -0
  329. kiapi/cli/activate/cli.py +37 -0
  330. kiapi/cli/check/_helpers/check_audio_acestep_turbo.py +22 -0
  331. kiapi/cli/check/_helpers/check_audio_acestep_xl_base.py +22 -0
  332. kiapi/cli/check/_helpers/check_audio_audiogen_medium.py +24 -0
  333. kiapi/cli/check/_helpers/check_chat_chat_qwen3_6_27b.py +19 -0
  334. kiapi/cli/check/_helpers/check_chat_chat_qwen3_omni.py +19 -0
  335. kiapi/cli/check/_helpers/check_embedding_embedding_qwen3_embedding_8b.py +14 -0
  336. kiapi/cli/check/_helpers/check_embedding_embedding_qwen3_vl_embedding_2b.py +19 -0
  337. kiapi/cli/check/_helpers/check_image_depthpro_base.py +21 -0
  338. kiapi/cli/check/_helpers/check_image_ernie_base.py +23 -0
  339. kiapi/cli/check/_helpers/check_image_ernie_turbo.py +23 -0
  340. kiapi/cli/check/_helpers/check_image_flux2_klein_9b.py +23 -0
  341. kiapi/cli/check/_helpers/check_image_flux2_klein_base_4b.py +23 -0
  342. kiapi/cli/check/_helpers/check_image_flux2_klein_base_9b.py +23 -0
  343. kiapi/cli/check/_helpers/check_image_ideogram4_fp8.py +23 -0
  344. kiapi/cli/check/_helpers/check_image_qwen_edit_2509.py +27 -0
  345. kiapi/cli/check/_helpers/check_image_qwen_image.py +23 -0
  346. kiapi/cli/check/_helpers/check_image_seedvr2_3b.py +23 -0
  347. kiapi/cli/check/_helpers/check_image_seedvr2_7b.py +23 -0
  348. kiapi/cli/check/_helpers/check_image_zimage_base.py +23 -0
  349. kiapi/cli/check/_helpers/check_image_zimage_turbo.py +23 -0
  350. kiapi/cli/check/_helpers/check_video_ltx2_distilled.py +26 -0
  351. kiapi/cli/check/_helpers/check_web_web_fetch.py +14 -0
  352. kiapi/cli/check/_helpers/check_web_web_search.py +14 -0
  353. kiapi/cli/check/_operations/build_check_result.py +20 -0
  354. kiapi/cli/check/_operations/check_context.py +10 -0
  355. kiapi/cli/check/_operations/create_sample_image.py +46 -0
  356. kiapi/cli/check/_schemas/check_result.py +12 -0
  357. kiapi/cli/check/cli.py +89 -0
  358. kiapi/cli/cli.py +29 -0
  359. kiapi/cli/config/cli.py +17 -0
  360. kiapi/cli/config/edit/cli.py +32 -0
  361. kiapi/cli/config/init/cli.py +33 -0
  362. kiapi/cli/config/show/cli.py +13 -0
  363. kiapi/cli/config/template/cli.py +36 -0
  364. kiapi/cli/deactivate/cli.py +49 -0
  365. kiapi/cli/run/asgi.py +16 -0
  366. kiapi/cli/run/cli.py +59 -0
  367. kiapi/cli/service/__init__.py +5 -0
  368. kiapi/cli/service/_services/service_manager.py +107 -0
  369. kiapi/cli/service/cli.py +19 -0
  370. kiapi/cli/service/install/cli.py +17 -0
  371. kiapi/cli/service/start/cli.py +22 -0
  372. kiapi/cli/service/status/cli.py +81 -0
  373. kiapi/cli/service/stop/cli.py +19 -0
  374. kiapi/cli/service/uninstall/cli.py +16 -0
  375. kiapi/cli/status/cli.py +226 -0
  376. kiapi/core/app/__init__.py +16 -0
  377. kiapi/core/app/_schemas/app_context.py +28 -0
  378. kiapi/core/app/_services/user_directory.py +59 -0
  379. kiapi/core/app/_settings.py +46 -0
  380. kiapi/core/capability/__init__.py +11 -0
  381. kiapi/core/capability/_schemas/capability_spec.py +17 -0
  382. kiapi/core/capability/_services/capability_spec_registry.py +21 -0
  383. kiapi/core/config/__init__.py +11 -0
  384. kiapi/core/config/_exceptions/user_config_error.py +2 -0
  385. kiapi/core/config/_helpers/get_user_settings_path.py +7 -0
  386. kiapi/core/config/_helpers/load_user_settings.py +54 -0
  387. kiapi/core/file/__init__.py +37 -0
  388. kiapi/core/file/_helpers/create_file_store.py +7 -0
  389. kiapi/core/file/_helpers/resolve_file_ref.py +90 -0
  390. kiapi/core/file/_schemas/file_data_url_ref.py +19 -0
  391. kiapi/core/file/_schemas/file_id_ref.py +16 -0
  392. kiapi/core/file/_schemas/file_record.py +46 -0
  393. kiapi/core/file/_schemas/file_url_ref.py +16 -0
  394. kiapi/core/file/_services/file_store.py +138 -0
  395. kiapi/core/file/_settings.py +22 -0
  396. kiapi/core/file/_types/file_id.py +2 -0
  397. kiapi/core/file/_types/file_ref.py +12 -0
  398. kiapi/core/file/_views/resolved_file_ref.py +16 -0
  399. kiapi/core/job/__init__.py +24 -0
  400. kiapi/core/job/_enums/job_status.py +9 -0
  401. kiapi/core/job/_helpers/creep_progress.py +123 -0
  402. kiapi/core/job/_models/job.py +121 -0
  403. kiapi/core/job/_services/job_store.py +33 -0
  404. kiapi/core/job/_services/progress_reporter.py +79 -0
  405. kiapi/core/job/_types/job_id.py +3 -0
  406. kiapi/core/job/_types/job_result.py +5 -0
  407. kiapi/core/job/_types/job_type.py +4 -0
  408. kiapi/core/logging/__init__.py +14 -0
  409. kiapi/core/logging/_helpers/get_log_level.py +8 -0
  410. kiapi/core/logging/_helpers/setup_logger.py +14 -0
  411. kiapi/core/logging/_settings.py +34 -0
  412. kiapi/core/logging/_types/log_level.py +3 -0
  413. kiapi/core/memory/__init__.py +21 -0
  414. kiapi/core/memory/_exceptions/memory_budget_error.py +2 -0
  415. kiapi/core/memory/_helpers/create_memory_manager.py +17 -0
  416. kiapi/core/memory/_operations/log_memory_limit.py +29 -0
  417. kiapi/core/memory/_operations/resolve_effective_memory_limit_gb.py +13 -0
  418. kiapi/core/memory/_operations/resolve_framework_strategy.py +42 -0
  419. kiapi/core/memory/_schemas/framework_strategy.py +14 -0
  420. kiapi/core/memory/_schemas/memory_stats.py +24 -0
  421. kiapi/core/memory/_schemas/resident_model.py +14 -0
  422. kiapi/core/memory/_schemas/resident_model_stats.py +49 -0
  423. kiapi/core/memory/_services/memory_manager.py +257 -0
  424. kiapi/core/memory/_settings.py +36 -0
  425. kiapi/core/memory/_types/framework_name.py +4 -0
  426. kiapi/core/memory/_types/resident_key.py +4 -0
  427. kiapi/core/model/__init__.py +36 -0
  428. kiapi/core/model/_exceptions/unknown_model_error.py +2 -0
  429. kiapi/core/model/_schemas/model_spec.py +145 -0
  430. kiapi/core/model/_services/model_registry.py +85 -0
  431. kiapi/core/model/_types/model_alias.py +2 -0
  432. kiapi/core/model/_types/model_domain.py +6 -0
  433. kiapi/core/model/_types/model_family.py +5 -0
  434. kiapi/core/model/_types/model_key.py +8 -0
  435. kiapi/core/model/_types/model_name.py +4 -0
  436. kiapi/core/model/_types/model_repo.py +3 -0
  437. kiapi/core/net/__init__.py +16 -0
  438. kiapi/core/net/_exceptions/unsafe_url_error.py +7 -0
  439. kiapi/core/net/_helpers/verify_public_url.py +68 -0
  440. kiapi/core/net/_settings.py +28 -0
  441. kiapi/core/setup/__init__.py +25 -0
  442. kiapi/core/setup/_exceptions/setup_required_error.py +2 -0
  443. kiapi/core/setup/_schemas/docker_image_resource.py +37 -0
  444. kiapi/core/setup/_schemas/hf_snapshot_resource.py +50 -0
  445. kiapi/core/setup/_schemas/local_path_resource.py +43 -0
  446. kiapi/core/setup/_schemas/python_package_resource.py +58 -0
  447. kiapi/core/setup/_schemas/python_venv_resource.py +63 -0
  448. kiapi/core/setup/_schemas/setup_status.py +7 -0
  449. kiapi/core/setup/_schemas/url_file_resource.py +43 -0
  450. kiapi/core/setup/_services/setup_manager.py +331 -0
  451. kiapi/core/setup/_types/setup_resource.py +21 -0
  452. kiapi/core/setup/_types/setup_target.py +11 -0
  453. kiapi/core/workdir/__init__.py +8 -0
  454. kiapi/core/workdir/_helpers/create_work_dir.py +11 -0
  455. kiapi/core/workdir/_settings.py +21 -0
  456. kiapi/core/worker/__init__.py +23 -0
  457. kiapi/core/worker/_helpers/create_worker.py +9 -0
  458. kiapi/core/worker/_services/worker.py +165 -0
  459. kiapi/core/worker/_settings.py +36 -0
  460. kiapi/core/worker/_types/job_thunk.py +6 -0
  461. kiapi-0.1.0.dist-info/METADATA +337 -0
  462. kiapi-0.1.0.dist-info/RECORD +465 -0
  463. kiapi-0.1.0.dist-info/WHEEL +4 -0
  464. kiapi-0.1.0.dist-info/entry_points.txt +2 -0
  465. kiapi-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,33 @@
1
+ from kiapi.capabilities import ValidationError
2
+
3
+ from .._settings import ErnieSettings
4
+ from .._views.edit_request import EditRequest
5
+ from .._views.generate_request import GenerateRequest
6
+
7
+ _MULTIPLE = 16
8
+
9
+
10
+ def validate_common(
11
+ req: GenerateRequest | EditRequest, settings: ErnieSettings, *, variant: str
12
+ ) -> None:
13
+ width = req.width if req.width is not None else settings.default_width
14
+ height = req.height if req.height is not None else settings.default_height
15
+
16
+ if width <= 0 or height <= 0:
17
+ raise ValidationError("width and height must be positive")
18
+ if width % _MULTIPLE or height % _MULTIPLE:
19
+ raise ValidationError(f"width and height must be multiples of {_MULTIPLE}")
20
+ if width > settings.max_width or height > settings.max_height:
21
+ raise ValidationError(
22
+ f"size {width}x{height} exceeds the cap {settings.max_width}x{settings.max_height}"
23
+ )
24
+
25
+ steps = (
26
+ req.steps if req.steps is not None else settings.default_steps.get(variant, 8)
27
+ )
28
+ if steps < 1 or steps > settings.max_steps:
29
+ raise ValidationError(f"steps must be in 1..{settings.max_steps}")
30
+ if req.quantize is not None and req.quantize not in (3, 4, 5, 6, 8):
31
+ raise ValidationError("quantize must be one of 3, 4, 5, 6, 8")
32
+ if len(req.loras) > settings.max_loras:
33
+ raise ValidationError(f"at most {settings.max_loras} loras may be applied")
@@ -0,0 +1,27 @@
1
+ """A single LoRA adapter reference (file + scale) applied to an ernie run."""
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from kiapi.core.file import FileRef
6
+
7
+
8
+ class LoraRef(BaseModel):
9
+ """One LoRA adapter to apply, by Files-API reference and blend scale.
10
+
11
+ Any lora forces a one-off transient model (slower, not reused). Up to 4 may
12
+ be passed in a request's ``loras`` list.
13
+ """
14
+
15
+ file: FileRef = Field(
16
+ description=(
17
+ "The LoRA adapter (`.safetensors`) to apply, as a Files-API file id, "
18
+ "http(s) URL, or data URL."
19
+ ),
20
+ )
21
+ scale: float = Field(
22
+ default=1.0,
23
+ description=(
24
+ "Blend strength for this adapter. 1.0 applies it at full weight; lower "
25
+ "values weaken its effect, higher values exaggerate it."
26
+ ),
27
+ )
@@ -0,0 +1,151 @@
1
+ """ERNIE-Image capability defaults + caps, read from ``KIAPI_ERNIE_`` env vars."""
2
+
3
+ from typing import cast
4
+
5
+ from pydantic import Field
6
+ from pydantic_settings import BaseSettings, SettingsConfigDict
7
+ from pydantic_settings_manager import SettingsManager
8
+
9
+
10
+ class ErnieSettings(BaseSettings):
11
+ """Settings for ERNIE-Image model variants, generation/edit defaults, and LoRA training."""
12
+
13
+ model_config = SettingsConfigDict(
14
+ env_prefix="KIAPI_ERNIE_",
15
+ extra="ignore",
16
+ protected_namespaces=(),
17
+ )
18
+
19
+ turbo_model: str = Field(
20
+ default="baidu/ERNIE-Image-Turbo",
21
+ title="Turbo model repo",
22
+ description="Hugging Face repo ID used as the ERNIE-Image turbo variant.",
23
+ )
24
+
25
+ base_model: str = Field(
26
+ default="baidu/ERNIE-Image",
27
+ title="Base model repo",
28
+ description="Hugging Face repo ID used as the ERNIE-Image base variant.",
29
+ )
30
+
31
+ default_steps: dict[str, int] = Field(
32
+ default_factory=lambda: {"turbo": 8, "base": 50},
33
+ title="Default steps by variant",
34
+ description=(
35
+ "Diffusion step count used when a generation or edit request omits steps.\n"
36
+ "Keys are variant names such as turbo or base; values are step counts."
37
+ ),
38
+ )
39
+
40
+ default_guidance: dict[str, float] = Field(
41
+ default_factory=lambda: {"turbo": 1.0, "base": 4.0},
42
+ title="Default guidance by variant",
43
+ description=(
44
+ "Guidance strength used when a generation or edit request omits guidance.\n"
45
+ "Keys are variant names; values are guidance values."
46
+ ),
47
+ )
48
+
49
+ default_quantize: dict[str, int | None] = Field(
50
+ default_factory=lambda: cast(dict[str, int | None], {"turbo": 8, "base": 8}),
51
+ title="Default quantization bits by variant",
52
+ description=(
53
+ "Default quantization bit count used when loading a model.\n"
54
+ "Keys are variant names; values are bit counts such as 8, or None "
55
+ "for no quantization."
56
+ ),
57
+ )
58
+
59
+ # --------------------------------------------------
60
+ # generate
61
+ # --------------------------------------------------
62
+
63
+ default_width: int = Field(
64
+ default=1024,
65
+ title="Default width",
66
+ description="Output image width in pixels used when a request omits width.",
67
+ )
68
+
69
+ default_height: int = Field(
70
+ default=1024,
71
+ title="Default height",
72
+ description="Output image height in pixels used when a request omits height.",
73
+ )
74
+
75
+ max_width: int = Field(
76
+ default=2048,
77
+ title="Maximum width",
78
+ description="Upper pixel limit for the output image width accepted in a request.",
79
+ )
80
+
81
+ max_height: int = Field(
82
+ default=2048,
83
+ title="Maximum height",
84
+ description="Upper pixel limit for the output image height accepted in a request.",
85
+ )
86
+
87
+ max_steps: int = Field(
88
+ default=100,
89
+ title="Maximum inference steps",
90
+ description="Upper limit for the diffusion step count accepted in a request.",
91
+ )
92
+
93
+ max_loras: int = Field(
94
+ default=4,
95
+ title="Maximum LoRA count",
96
+ description="Maximum number of LoRA adapters that can be applied in one generation or edit request.",
97
+ )
98
+
99
+ # --------------------------------------------------
100
+ # edit
101
+ # --------------------------------------------------
102
+
103
+ edit_require_square: bool = Field(
104
+ default=True,
105
+ title="Require square edit input",
106
+ description=(
107
+ "When true, ERNIE image-to-image/edit avoids non-square sizes.\n"
108
+ "This conservative default works around mflux VAE latent-packing constraints."
109
+ ),
110
+ )
111
+
112
+ # --------------------------------------------------
113
+ # train
114
+ # --------------------------------------------------
115
+
116
+ train_reserve_gb: float = Field(
117
+ default=24.0,
118
+ title="LoRA training reserved memory GB",
119
+ description="Memory in GB reserved for the runtime peak of an ERNIE-Image LoRA training job.",
120
+ )
121
+
122
+ train_steps: dict[str, int] = Field(
123
+ default_factory=lambda: {"turbo": 8, "base": 50},
124
+ title="Training steps by variant",
125
+ description=(
126
+ "Step count used when a LoRA training request omits steps.\n"
127
+ "Keys are variant names; values are training step counts."
128
+ ),
129
+ )
130
+
131
+ train_timestep_low: dict[str, int] = Field(
132
+ default_factory=lambda: {"turbo": 1, "base": 1},
133
+ title="Training timestep lower bound by variant",
134
+ description=(
135
+ "Lower bound of the timestep range used during LoRA training.\n"
136
+ "Keys are variant names; values are lower-bound timestep values."
137
+ ),
138
+ )
139
+
140
+ train_quantize: dict[str, int | None] = Field(
141
+ default_factory=lambda: cast(dict[str, int | None], {"turbo": 8, "base": 8}),
142
+ title="Training quantization bits by variant",
143
+ description=(
144
+ "Quantization bit count applied to the model during LoRA training.\n"
145
+ "Keys are variant names; values are bit counts such as 8, or None "
146
+ "for no quantization."
147
+ ),
148
+ )
149
+
150
+
151
+ settings_manager = SettingsManager(ErnieSettings)
@@ -0,0 +1,36 @@
1
+ """The complete contract for one ERNIE-Image single-image edit (img2img) run.
2
+
3
+ Built from settings + request by ``resolve_edit_params``; the model needs nothing
4
+ else to produce the image and its metadata. ``image_path`` is the locally resolved
5
+ input file, kept out of the recorded metadata in favour of ``image_file_id``.
6
+ """
7
+
8
+ from typing import Literal
9
+
10
+ from pydantic import BaseModel
11
+
12
+ from .._schemas.lora_ref import LoraRef
13
+
14
+
15
+ class EditParams(BaseModel):
16
+ kind: Literal["edit"] = "edit"
17
+ model: str
18
+
19
+ prompt: str
20
+ negative_prompt: str | None
21
+ image_file_id: str
22
+ image_path: str
23
+ image_strength: float
24
+
25
+ seed: int
26
+ width: int
27
+ height: int
28
+ steps: int
29
+ guidance: float
30
+ quantize: int | None
31
+ scheduler: str
32
+
33
+ format: Literal["png", "jpeg", "webp"]
34
+ quality: int
35
+
36
+ loras: list[LoraRef]
@@ -0,0 +1,142 @@
1
+ """ERNIE-Image single-image edit (img2img) request model.
2
+
3
+ Same shape as the generate request plus an input ``image`` (FileRef) and
4
+ ``image_strength``. By default the output must be square (mflux 0.18.0 can fail
5
+ on some non-square ERNIE img2img sizes); the guard is overrideable server-side.
6
+ """
7
+
8
+ from typing import Literal
9
+
10
+ from pydantic import BaseModel, ConfigDict, Field
11
+
12
+ from kiapi.core.file import FileRef
13
+
14
+ from .._schemas.lora_ref import LoraRef
15
+
16
+
17
+ class EditRequest(BaseModel):
18
+ model_config = ConfigDict(extra="allow")
19
+
20
+ model: str | None = Field(
21
+ default=None,
22
+ description=(
23
+ "Model variant (see GET /v1/image/ernie/models). Omit for the default "
24
+ "`turbo`; `base` is higher-quality but slower. Aliases such as "
25
+ "`ernie-image-turbo` / `ernie-image` are accepted."
26
+ ),
27
+ )
28
+ mode: Literal["sync", "async"] = Field(
29
+ default="sync",
30
+ description=(
31
+ "`sync` waits for the image (504 on timeout); `async` returns 202 with "
32
+ "a job_id immediately — poll GET /v1/jobs/{job_id}."
33
+ ),
34
+ )
35
+
36
+ prompt: str = Field(
37
+ ...,
38
+ min_length=1,
39
+ description="Text prompt describing the desired edit (required).",
40
+ )
41
+ negative_prompt: str | None = Field(
42
+ default=None,
43
+ description="Optional text describing what to avoid in the result.",
44
+ )
45
+ image: FileRef = Field(
46
+ description=(
47
+ "Input image to edit, as a Files-API file id, http(s) URL, or data URL."
48
+ ),
49
+ )
50
+ image_strength: float = Field(
51
+ default=0.4,
52
+ description=(
53
+ "How much the input image is preserved, in 0..1. Lower keeps more of "
54
+ "the input; higher follows the prompt more freely."
55
+ ),
56
+ )
57
+
58
+ width: int | None = Field(
59
+ default=None,
60
+ description=(
61
+ "Output width in pixels. Omit for the server default (1024). Must be a "
62
+ "multiple of 16 and at most 2048. By default must equal height (square)."
63
+ ),
64
+ )
65
+ height: int | None = Field(
66
+ default=None,
67
+ description=(
68
+ "Output height in pixels. Omit for the server default (1024). Must be a "
69
+ "multiple of 16 and at most 2048. By default must equal width (square)."
70
+ ),
71
+ )
72
+ steps: int | None = Field(
73
+ default=None,
74
+ ge=1,
75
+ description=(
76
+ "Number of denoising steps (1..100). Omit for the variant default "
77
+ "(turbo 8, base 50)."
78
+ ),
79
+ )
80
+ guidance: float | None = Field(
81
+ default=None,
82
+ description=(
83
+ "Classifier-free guidance scale. Omit for the variant default "
84
+ "(turbo 1.0, base 4.0); higher follows the prompt more strictly."
85
+ ),
86
+ )
87
+ seed: int | None = Field(
88
+ default=None,
89
+ description=(
90
+ "Random seed for reproducibility. Omit for a random seed (the resolved "
91
+ "seed is recorded in the result `params`)."
92
+ ),
93
+ )
94
+ quantize: int | None = Field(
95
+ default=None,
96
+ description=(
97
+ "Quantization bits, one of {3, 4, 5, 6, 8}. Omit to use the resident "
98
+ "model's quantization (default 8). A differing value builds a one-off "
99
+ "transient model (slower, not reused)."
100
+ ),
101
+ )
102
+ scheduler: str = Field(
103
+ default="linear",
104
+ description="Noise scheduler. `linear` is the default and only tested value.",
105
+ )
106
+
107
+ format: Literal["png", "jpeg", "webp"] = Field(
108
+ default="png",
109
+ description="Output image encoding for the produced file.",
110
+ )
111
+ quality: int = Field(
112
+ default=90,
113
+ ge=1,
114
+ le=100,
115
+ description="Encoder quality 1..100 (used for jpeg/webp; ignored for png).",
116
+ )
117
+
118
+ loras: list[LoraRef] = Field(
119
+ default_factory=list,
120
+ description=(
121
+ "Up to 4 LoRA adapters [{file, scale}] referencing Files-API ids. Any "
122
+ "lora forces a one-off transient model (slower, not reused)."
123
+ ),
124
+ )
125
+
126
+ def gen_params(self) -> dict:
127
+ return {
128
+ "prompt": self.prompt,
129
+ "negative_prompt": self.negative_prompt,
130
+ "image": self.image.model_dump(mode="json"),
131
+ "image_strength": self.image_strength,
132
+ "width": self.width,
133
+ "height": self.height,
134
+ "steps": self.steps,
135
+ "guidance": self.guidance,
136
+ "seed": self.seed,
137
+ "quantize": self.quantize,
138
+ "scheduler": self.scheduler,
139
+ "format": self.format,
140
+ "quality": self.quality,
141
+ "loras": [lr.model_dump() for lr in self.loras],
142
+ }
@@ -0,0 +1,32 @@
1
+ """The complete contract for one ERNIE-Image txt2img run.
2
+
3
+ Built from settings + request by ``resolve_generate_params``; the model needs
4
+ nothing else to produce the image and its metadata.
5
+ """
6
+
7
+ from typing import Literal
8
+
9
+ from pydantic import BaseModel
10
+
11
+ from .._schemas.lora_ref import LoraRef
12
+
13
+
14
+ class GenerateParams(BaseModel):
15
+ kind: Literal["txt2img"] = "txt2img"
16
+ model: str
17
+
18
+ prompt: str
19
+ negative_prompt: str | None
20
+
21
+ seed: int
22
+ width: int
23
+ height: int
24
+ steps: int
25
+ guidance: float
26
+ quantize: int | None
27
+ scheduler: str
28
+
29
+ format: Literal["png", "jpeg", "webp"]
30
+ quality: int
31
+
32
+ loras: list[LoraRef]
@@ -0,0 +1,127 @@
1
+ """ERNIE-Image text-to-image request model.
2
+
3
+ One endpoint serves both sync and async via ``mode``. Defaults for ``steps`` /
4
+ ``guidance`` / ``quantize`` are variant-dependent (turbo vs base) and resolved
5
+ server-side when omitted. A ``quantize`` override or any ``loras`` builds a
6
+ one-off transient model (slower, not reused).
7
+ """
8
+
9
+ from typing import Literal
10
+
11
+ from pydantic import BaseModel, ConfigDict, Field
12
+
13
+ from .._schemas.lora_ref import LoraRef
14
+
15
+
16
+ class GenerateRequest(BaseModel):
17
+ model_config = ConfigDict(extra="allow")
18
+
19
+ model: str | None = Field(
20
+ default=None,
21
+ description=(
22
+ "Model variant (see GET /v1/image/ernie/models). Omit for the default "
23
+ "`turbo`; `base` is the higher-quality, slower variant. Aliases such as "
24
+ "`ernie-image-turbo` / `ernie-image` are accepted."
25
+ ),
26
+ )
27
+ mode: Literal["sync", "async"] = Field(
28
+ default="sync",
29
+ description=(
30
+ "`sync` waits for the image (504 on timeout); `async` returns 202 with "
31
+ "a job_id immediately — poll GET /v1/jobs/{job_id}."
32
+ ),
33
+ )
34
+
35
+ prompt: str = Field(
36
+ ...,
37
+ min_length=1,
38
+ description="Text prompt describing the image to generate (required).",
39
+ )
40
+ negative_prompt: str | None = Field(
41
+ default=None,
42
+ description="Optional text describing what to avoid in the image.",
43
+ )
44
+
45
+ width: int | None = Field(
46
+ default=None,
47
+ description=(
48
+ "Output width in pixels. Omit for the server default (1024). Must be a "
49
+ "multiple of 16 and at most 2048."
50
+ ),
51
+ )
52
+ height: int | None = Field(
53
+ default=None,
54
+ description=(
55
+ "Output height in pixels. Omit for the server default (1024). Must be a "
56
+ "multiple of 16 and at most 2048."
57
+ ),
58
+ )
59
+ steps: int | None = Field(
60
+ default=None,
61
+ ge=1,
62
+ description=(
63
+ "Number of denoising steps (1..100). Omit for the variant default "
64
+ "(turbo 8, base 50). More steps = slower, sometimes higher quality."
65
+ ),
66
+ )
67
+ guidance: float | None = Field(
68
+ default=None,
69
+ description=(
70
+ "Classifier-free guidance scale. Omit for the variant default "
71
+ "(turbo 1.0, base 4.0); higher follows the prompt more strictly."
72
+ ),
73
+ )
74
+ seed: int | None = Field(
75
+ default=None,
76
+ description=(
77
+ "Random seed for reproducibility. Omit for a random seed (the resolved "
78
+ "seed is recorded in the result `params`)."
79
+ ),
80
+ )
81
+ quantize: int | None = Field(
82
+ default=None,
83
+ description=(
84
+ "Quantization bits, one of {3, 4, 5, 6, 8}. Omit to use the resident "
85
+ "model's quantization (default 8). A differing value builds a one-off "
86
+ "transient model (slower, not reused)."
87
+ ),
88
+ )
89
+ scheduler: str = Field(
90
+ default="linear",
91
+ description="Noise scheduler. `linear` is the default and only tested value.",
92
+ )
93
+
94
+ format: Literal["png", "jpeg", "webp"] = Field(
95
+ default="png",
96
+ description="Output image encoding for the produced file.",
97
+ )
98
+ quality: int = Field(
99
+ default=90,
100
+ ge=1,
101
+ le=100,
102
+ description="Encoder quality 1..100 (used for jpeg/webp; ignored for png).",
103
+ )
104
+
105
+ loras: list[LoraRef] = Field(
106
+ default_factory=list,
107
+ description=(
108
+ "Up to 4 LoRA adapters [{file, scale}] referencing Files-API ids. Any "
109
+ "lora forces a one-off transient model (slower, not reused)."
110
+ ),
111
+ )
112
+
113
+ def gen_params(self) -> dict:
114
+ return {
115
+ "prompt": self.prompt,
116
+ "negative_prompt": self.negative_prompt,
117
+ "width": self.width,
118
+ "height": self.height,
119
+ "steps": self.steps,
120
+ "guidance": self.guidance,
121
+ "seed": self.seed,
122
+ "quantize": self.quantize,
123
+ "scheduler": self.scheduler,
124
+ "format": self.format,
125
+ "quality": self.quality,
126
+ "loras": [lr.model_dump() for lr in self.loras],
127
+ }
@@ -0,0 +1,28 @@
1
+ """The complete contract for one ERNIE-Image LoRA finetune run.
2
+
3
+ Built from settings + request by ``resolve_train_params``; combined with the
4
+ resolved model spec and the on-disk dataset/output dirs, the model needs neither
5
+ settings nor request to assemble its training config.
6
+ """
7
+
8
+ from pydantic import BaseModel
9
+
10
+
11
+ class TrainParams(BaseModel):
12
+ seed: int
13
+ steps: int
14
+ guidance: float
15
+ quantize: int | None
16
+ max_resolution: int | None
17
+ low_ram: bool
18
+
19
+ num_epochs: int
20
+ batch_size: int
21
+ timestep_low: int
22
+ timestep_high: int
23
+ learning_rate: float
24
+ save_frequency: int
25
+
26
+ lora_rank: int
27
+ lora_include_ff: bool
28
+ lora_layers: dict | None
@@ -0,0 +1,96 @@
1
+ """ERNIE-Image LoRA finetune request model. Always async (long-running).
2
+
3
+ The dataset is a ZIP uploaded to the Files API, with each image accompanied by a
4
+ same-stem ``.txt`` caption. The trained adapter is stored back in the Files API
5
+ and returned as the job's artifact (``adapter_file_id``).
6
+ """
7
+
8
+ from pydantic import BaseModel, ConfigDict, Field
9
+
10
+ from kiapi.core.file import FileRef
11
+
12
+
13
+ class TrainRequest(BaseModel):
14
+ model_config = ConfigDict(extra="allow")
15
+
16
+ model: str | None = Field(
17
+ default=None,
18
+ description=(
19
+ "Model variant to finetune (see GET /v1/image/ernie/models). Omit for "
20
+ "the default `turbo`."
21
+ ),
22
+ )
23
+ dataset: FileRef = Field(
24
+ description=(
25
+ "Training dataset as a Files-API reference to a ZIP. Images may sit at "
26
+ "the top level or in a single subfolder; each image needs a same-stem "
27
+ "`.txt` caption (e.g. `cat.png` + `cat.txt`). `preview*` images are "
28
+ "exempt from the caption requirement."
29
+ ),
30
+ )
31
+
32
+ seed: int = Field(default=42, description="Random seed for the training run.")
33
+ steps: int | None = Field(
34
+ default=None,
35
+ description=(
36
+ "Inference/denoising steps used during training. Omit for the variant "
37
+ "default (turbo 8, base 50)."
38
+ ),
39
+ )
40
+ guidance: float | None = Field(
41
+ default=None,
42
+ description="Guidance scale. Omit for the variant default (turbo 1.0, base 4.0).",
43
+ )
44
+ quantize: int | None = Field(
45
+ default=None,
46
+ description=(
47
+ "Quantization bits during training, one of {3, 4, 5, 6, 8}. Omit for "
48
+ "the variant default (8)."
49
+ ),
50
+ )
51
+ max_resolution: int | None = Field(
52
+ default=512,
53
+ description="Images are resized so their long side is at most this many pixels.",
54
+ )
55
+ low_ram: bool = Field(
56
+ default=True,
57
+ description="Trade speed for lower peak memory during training.",
58
+ )
59
+
60
+ num_epochs: int = Field(
61
+ default=10, ge=1, description="Number of passes over the dataset."
62
+ )
63
+ batch_size: int = Field(default=1, ge=1, description="Training batch size.")
64
+ timestep_low: int | None = Field(
65
+ default=None,
66
+ description="Lower diffusion-timestep bound to sample. Omit for the default (1).",
67
+ )
68
+ timestep_high: int | None = Field(
69
+ default=None,
70
+ description="Upper diffusion-timestep bound to sample. Omit to use `steps`.",
71
+ )
72
+ learning_rate: float = Field(default=1e-4, description="AdamW learning rate.")
73
+ save_frequency: int | None = Field(
74
+ default=None,
75
+ description=(
76
+ "Checkpoint every N steps. Omit to only keep the final checkpoint."
77
+ ),
78
+ )
79
+
80
+ lora_rank: int = Field(
81
+ default=16, ge=1, description="Rank of the trained LoRA adapter."
82
+ )
83
+ lora_include_ff: bool = Field(
84
+ default=False,
85
+ description=(
86
+ "Also train feed-forward / time-embedding layers (larger adapter), not "
87
+ "just attention projections."
88
+ ),
89
+ )
90
+ lora_layers: dict | None = Field(
91
+ default=None,
92
+ description=(
93
+ "Advanced: explicit mflux LoRA target spec. Omit to use the built-in "
94
+ "default targets derived from `lora_rank` / `lora_include_ff`."
95
+ ),
96
+ )