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,242 @@
1
+ # ernie
2
+
3
+ [English](README.md) | **日本語**
4
+
5
+ [mflux ERNIE-Image](https://github.com/filipstrand/mflux/blob/main/src/mflux/models/ernie_image/README.md) で、画像生成・画像編集・LoRA ファインチューニング機能を提供します。
6
+
7
+ - **generate**: テキストから画像を生成
8
+ - **edit**: Files API の単一画像をプロンプトで編集
9
+ - **train**: キャプション付き画像 ZIP から LoRA アダプタを学習
10
+
11
+ ## API
12
+
13
+ | Endpoint | Name | Description |
14
+ |---|---|---|
15
+ | `POST /v1/image/ernie/generate` | 画像生成 | プロンプトから画像を生成。 |
16
+ | `POST /v1/image/ernie/edit` | 画像編集 | Files API の単一画像をプロンプトで img2img 編集。 |
17
+ | `POST /v1/image/ernie/train` | LoRA 学習 | キャプション付き画像 ZIP から LoRA アダプタを学習。常に async。 |
18
+ | `GET /v1/image/ernie/models` | モデル一覧 | 利用可能なモデルの一覧を返す。 |
19
+ | `GET /v1/image/ernie/openapi.json` | OpenAPI | 詳細な入出力仕様、使い方、TIPS を返す。 |
20
+
21
+ ## API Docs
22
+
23
+ - [OpenAPI JSON](https://kiarina.github.io/kiapi/v1/image/ernie/openapi.json)
24
+ - [Swagger UI](https://kiarina.github.io/kiapi/v1/image/ernie/docs.html)
25
+ - [ReDoc](https://kiarina.github.io/kiapi/v1/image/ernie/redoc.html)
26
+
27
+ ## Dependencies
28
+
29
+ | Package | License | Description |
30
+ |---|---|---|
31
+ | [mflux](https://github.com/filipstrand/mflux) | MIT | ERNIE-Image の MLX 実装と LoRA 学習機能を利用。 |
32
+
33
+ ## Models
34
+
35
+ | Model | License | Terms | Size | Description |
36
+ |---|---|---|---:|---|
37
+ | [baidu/ERNIE-Image-Turbo](https://huggingface.co/baidu/ERNIE-Image-Turbo) | Apache-2.0 | 不要 | 31.6 GB | `turbo`(デフォルト)。蒸留 8 ステップモデル。既定は `steps: 8`、`guidance: 1.0`、`quantize: 8`。 |
38
+ | [baidu/ERNIE-Image](https://huggingface.co/baidu/ERNIE-Image) | Apache-2.0 | 不要 | 31.6 GB | `base`。非 distilled のモデル。既定は `steps: 50`、`guidance: 4.0`、`quantize: 8`。 |
39
+
40
+ ## Notes
41
+
42
+ - **画像サイズ**:
43
+ `width` / `height` は 16 の倍数で、既定は `1024x1024`、上限は `2048x2048` です。
44
+ - **edit の正方形ガード**:
45
+ `mflux==0.18.0` では ERNIE img2img の一部の非正方形サイズが latent packing で
46
+ 失敗することがあります。kiapi はデフォルトで `edit` の `width == height` を要求します。
47
+ 無効にするには `KIAPI_ERNIE_EDIT_REQUIRE_SQUARE=0` を設定します。
48
+ - **steps / quantize**:
49
+ `steps` は `1..100`。`quantize` は `3` / `4` / `5` / `6` / `8` / `null` を使います。
50
+ `quantize` を省略するとモデルごとの既定値を使います。
51
+ - **LoRA 適用**:
52
+ `generate` / `edit` の `loras` には `[{ "file_id": "...", "scale": 1.0 }]` を渡します。
53
+ 既定では最大 4 個まで適用できます。
54
+ - **LoRA 学習データセット**:
55
+ ZIP のトップレベル、または ZIP 内の単一サブフォルダに画像を置きます。画像ごとに
56
+ 同じ語幹の `.txt` キャプションが必要です。`preview*` で始まる画像はキャプション
57
+ 必須チェックから除外されます。
58
+
59
+ ## Quickstart
60
+
61
+ ### generate - テキストから画像生成
62
+
63
+ Job JSON を返す:
64
+
65
+ ```bash
66
+ PARAMS=$(
67
+ jq -n \
68
+ --arg prompt "A quiet Japanese garden after rain, soft morning light, detailed watercolor" \
69
+ '{
70
+ model: "turbo",
71
+ mode: "sync",
72
+ prompt: $prompt,
73
+ width: 1024,
74
+ height: 1024,
75
+ steps: 8,
76
+ seed: 404
77
+ }'
78
+ )
79
+
80
+ curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
81
+ -H 'Accept: application/json' \
82
+ -H 'Content-Type: application/json' \
83
+ --data-binary "$PARAMS" | jq .
84
+ ```
85
+
86
+ 画像だけを保存する:
87
+
88
+ ```bash
89
+ PARAMS=$(
90
+ jq -n \
91
+ --arg prompt "A barn owl portrait on a mossy branch, natural wildlife photography" \
92
+ '{
93
+ model: "turbo",
94
+ mode: "sync",
95
+ prompt: $prompt,
96
+ width: 512,
97
+ height: 512,
98
+ steps: 8,
99
+ seed: 404
100
+ }'
101
+ )
102
+
103
+ curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
104
+ -H 'Content-Type: application/json' \
105
+ --data-binary "$PARAMS" \
106
+ -o ernie.png
107
+ ```
108
+
109
+ ### edit - 単一画像を編集
110
+
111
+ 先に入力画像をアップロードする:
112
+
113
+ ```bash
114
+ IMG=$(curl -sS -X POST http://localhost:${PORT:-8000}/v1/files \
115
+ -F "file=@tests/assets/miineko.png;type=image/png" | jq -r .file_id)
116
+ ```
117
+
118
+ アップロードした画像を編集する:
119
+
120
+ ```bash
121
+ PARAMS=$(
122
+ jq -n \
123
+ --arg image "$IMG" \
124
+ --arg prompt "Turn this image into a soft watercolor illustration" \
125
+ '{
126
+ model: "turbo",
127
+ mode: "sync",
128
+ prompt: $prompt,
129
+ image: {type: "file_id", file_id: $image},
130
+ image_strength: 0.55,
131
+ width: 512,
132
+ height: 512,
133
+ steps: 8,
134
+ seed: 42
135
+ }'
136
+ )
137
+
138
+ curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/edit \
139
+ -H 'Content-Type: application/json' \
140
+ --data-binary "$PARAMS" \
141
+ -o ernie_edit.png
142
+ ```
143
+
144
+ `image_strength` は `0..1`。小さいほど元画像を強く残し、大きいほどプロンプト側の
145
+ 変化が強くなります。
146
+
147
+ ### async
148
+
149
+ ```bash
150
+ PARAMS=$(
151
+ jq -n \
152
+ --arg prompt "A small robot reading a book in a cozy library" \
153
+ '{
154
+ model: "turbo",
155
+ mode: "async",
156
+ prompt: $prompt,
157
+ width: 512,
158
+ height: 512,
159
+ seed: 7
160
+ }'
161
+ )
162
+
163
+ JOB=$(curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
164
+ -H 'Accept: application/json' \
165
+ -H 'Content-Type: application/json' \
166
+ --data-binary "$PARAMS" | jq -r .job_id)
167
+
168
+ curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq .
169
+ ```
170
+
171
+ 完了後、Job の `artifacts[0]` または `result.file_id` を使って画像を取得します。
172
+
173
+ ```bash
174
+ FID=$(curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq -r .result.file_id)
175
+ curl -sS http://localhost:${PORT:-8000}/v1/files/$FID/download -o ernie_async.png
176
+ ```
177
+
178
+ ### train - LoRA ファインチューニング
179
+
180
+ 画像と同じ語幹の `.txt` キャプションを含む ZIP データセットを用意します。
181
+
182
+ ```text
183
+ dataset/
184
+ sample_00.png
185
+ sample_00.txt
186
+ sample_01.png
187
+ sample_01.txt
188
+ ```
189
+
190
+ データセットをアップロードして学習を開始します。
191
+
192
+ ```bash
193
+ DATASET_ID=$(curl -sS -X POST http://localhost:${PORT:-8000}/v1/files \
194
+ -F "file=@dataset.zip;type=application/zip" | jq -r .file_id)
195
+
196
+ JOB=$(
197
+ jq -n \
198
+ --arg dataset "$DATASET_ID" \
199
+ '{
200
+ model: "turbo",
201
+ dataset: {type: "file_id", file_id: $dataset},
202
+ num_epochs: 1,
203
+ lora_rank: 16,
204
+ max_resolution: 512
205
+ }' |
206
+ curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/train \
207
+ -H 'Content-Type: application/json' \
208
+ --data-binary @- |
209
+ jq -r .job_id
210
+ )
211
+
212
+ curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq .
213
+ ```
214
+
215
+ 完了後、`result.adapter_file_id` が学習済みアダプタです。
216
+
217
+ ```bash
218
+ ADAPTER=$(curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq -r .result.adapter_file_id)
219
+ ```
220
+
221
+ 生成や編集で LoRA を適用します。
222
+
223
+ ```bash
224
+ PARAMS=$(
225
+ jq -n \
226
+ --arg adapter "$ADAPTER" \
227
+ --arg prompt "portrait in the trained character style" \
228
+ '{
229
+ model: "turbo",
230
+ mode: "sync",
231
+ prompt: $prompt,
232
+ width: 512,
233
+ height: 512,
234
+ loras: [{file: {type: "file_id", file_id: $adapter}, scale: 1.0}]
235
+ }'
236
+ )
237
+
238
+ curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
239
+ -H 'Content-Type: application/json' \
240
+ --data-binary "$PARAMS" \
241
+ -o ernie_lora.png
242
+ ```
@@ -0,0 +1,223 @@
1
+ # ernie
2
+
3
+ **English** | [日本語](README.ja.md)
4
+
5
+ [mflux ERNIE-Image](https://github.com/filipstrand/mflux/blob/main/src/mflux/models/ernie_image/README.md) provides image generation, image editing, and LoRA fine tuning functions.
6
+
7
+ - **generate**: Generate image from text
8
+ - **edit**: Prompt editing of single image in Files API
9
+ - **train**: Train LoRA adapter from captioned image ZIP
10
+
11
+ ## API
12
+
13
+ | Endpoint | Name | Description |
14
+ |---|---|---|
15
+ | `POST /v1/image/ernie/generate` | Image generation | Generate image from prompt. |
16
+ | `POST /v1/image/ernie/edit` | Image editing | Files API single image prompt img2img editing. |
17
+ | `POST /v1/image/ernie/train` | LoRA learning | Learning LoRA adapter from captioned image ZIP. Always async. |
18
+ | `GET /v1/image/ernie/models` | Model list | Returns a list of available models. |
19
+ | `GET /v1/image/ernie/openapi.json` | OpenAPI | Returns detailed input/output specifications, usage, and TIPS. |
20
+
21
+ ## API Docs
22
+
23
+ - [OpenAPI JSON](https://kiarina.github.io/kiapi/v1/image/ernie/openapi.json)
24
+ - [Swagger UI](https://kiarina.github.io/kiapi/v1/image/ernie/docs.html)
25
+ - [ReDoc](https://kiarina.github.io/kiapi/v1/image/ernie/redoc.html)
26
+
27
+ ## Dependencies
28
+
29
+ | Package | License | Description |
30
+ |---|---|---|
31
+ | [mflux](https://github.com/filipstrand/mflux) | MIT | Uses ERNIE-Image's MLX implementation and LoRA learning function. |
32
+
33
+ ## Models
34
+
35
+ | Model | License | Terms | Size | Description |
36
+ |---|---|---|---:|---|
37
+ | [baidu/ERNIE-Image-Turbo](https://huggingface.co/baidu/ERNIE-Image-Turbo) | Apache-2.0 | Not required | 31.6 GB | `turbo` (default). Distillation 8 step model. Defaults are `steps: 8`, `guidance: 1.0`, `quantize: 8`. |
38
+ | [baidu/ERNIE-Image](https://huggingface.co/baidu/ERNIE-Image) | Apache-2.0 | Not required | 31.6 GB | `base`. Non-distilled model. Defaults are `steps: 50`, `guidance: 4.0`, `quantize: 8`. |
39
+
40
+ ## Notes
41
+
42
+ - **Image size**:
43
+ `width` / `height` are multiples of 16, default is `1024x1024`, upper limit is `2048x2048`.
44
+ - **edit square guard**:
45
+ With `mflux==0.18.0`, some non-square sizes of ERNIE img2img are latent packing.
46
+ It may fail. kiapi requires `width == height` for `edit` by default.
47
+ To disable it, set `KIAPI_ERNIE_EDIT_REQUIRE_SQUARE=0`.
48
+ - **steps/quantize**:
49
+ `steps` is `1..100`. `quantize` uses `3` / `4` / `5` / `6` / `8` / `null`.
50
+ If `quantize` is omitted, the default value for each model will be used.
51
+ - **LoRA applied**:
52
+ Pass `[{ "file_id": "...", "scale": 1.0 }]` to `loras` of `generate` / `edit`.
53
+ By default, up to 4 can be applied.
54
+ - **LoRA training dataset**:
55
+ Place images at the top level of the ZIP or in a single subfolder within the ZIP. per image
56
+ Requires a `.txt` caption with the same stem. Images starting with `preview*` are captions.
57
+ Excluded from mandatory checks.
58
+
59
+ ## Quickstart
60
+
61
+ ### generate - generate image from text
62
+
63
+ Returns Job JSON:
64
+ ```bash
65
+ PARAMS=$(
66
+ jq -n \
67
+ --arg prompt "A quiet Japanese garden after rain, soft morning light, detailed watercolor" \
68
+ '{
69
+ model: "turbo",
70
+ mode: "sync",
71
+ prompt: $prompt,
72
+ width: 1024,
73
+ height: 1024,
74
+ steps: 8,
75
+ seed: 404
76
+ }'
77
+ )
78
+
79
+ curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
80
+ -H 'Accept: application/json' \
81
+ -H 'Content-Type: application/json' \
82
+ --data-binary "$PARAMS" | jq .
83
+ ```
84
+ Save only the image:
85
+ ```bash
86
+ PARAMS=$(
87
+ jq -n \
88
+ --arg prompt "A barn owl portrait on a mossy branch, natural wildlife photography" \
89
+ '{
90
+ model: "turbo",
91
+ mode: "sync",
92
+ prompt: $prompt,
93
+ width: 512,
94
+ height: 512,
95
+ steps: 8,
96
+ seed: 404
97
+ }'
98
+ )
99
+
100
+ curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
101
+ -H 'Content-Type: application/json' \
102
+ --data-binary "$PARAMS" \
103
+ -o ernie.png
104
+ ```
105
+ ### edit - edit a single image
106
+
107
+ Upload the input image first:
108
+ ```bash
109
+ IMG=$(curl -sS -X POST http://localhost:${PORT:-8000}/v1/files \
110
+ -F "file=@tests/assets/miineko.png;type=image/png" | jq -r .file_id)
111
+ ```
112
+ Edit the uploaded image:
113
+ ```bash
114
+ PARAMS=$(
115
+ jq -n \
116
+ --arg image "$IMG" \
117
+ --arg prompt "Turn this image into a soft watercolor illustration" \
118
+ '{
119
+ model: "turbo",
120
+ mode: "sync",
121
+ prompt: $prompt,
122
+ image: {type: "file_id", file_id: $image},
123
+ image_strength: 0.55,
124
+ width: 512,
125
+ height: 512,
126
+ steps: 8,
127
+ seed: 42
128
+ }'
129
+ )
130
+
131
+ curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/edit \
132
+ -H 'Content-Type: application/json' \
133
+ --data-binary "$PARAMS" \
134
+ -o ernie_edit.png
135
+ ```
136
+ `image_strength` is `0..1`. The smaller the value, the stronger the original image will remain; the larger the value, the more the prompt side will remain.
137
+ The changes will become stronger.
138
+
139
+ ###async
140
+ ```bash
141
+ PARAMS=$(
142
+ jq -n \
143
+ --arg prompt "A small robot reading a book in a cozy library" \
144
+ '{
145
+ model: "turbo",
146
+ mode: "async",
147
+ prompt: $prompt,
148
+ width: 512,
149
+ height: 512,
150
+ seed: 7
151
+ }'
152
+ )
153
+
154
+ JOB=$(curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
155
+ -H 'Accept: application/json' \
156
+ -H 'Content-Type: application/json' \
157
+ --data-binary "$PARAMS" | jq -r .job_id)
158
+
159
+ curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq .
160
+ ```
161
+ After completion, use the Job's `artifacts[0]` or `result.file_id` to get the image.
162
+ ```bash
163
+ FID=$(curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq -r .result.file_id)
164
+ curl -sS http://localhost:${PORT:-8000}/v1/files/$FID/download -o ernie_async.png
165
+ ```
166
+ ### train - LoRA Fine Tuning
167
+
168
+ Prepare a ZIP dataset containing a `.txt` caption with the same stem as the image.
169
+ ```text
170
+ dataset/
171
+ sample_00.png
172
+ sample_00.txt
173
+ sample_01.png
174
+ sample_01.txt
175
+ ```
176
+ Upload your dataset and start training.
177
+ ```bash
178
+ DATASET_ID=$(curl -sS -X POST http://localhost:${PORT:-8000}/v1/files \
179
+ -F "file=@dataset.zip;type=application/zip" | jq -r .file_id)
180
+
181
+ JOB=$(
182
+ jq -n \
183
+ --arg dataset "$DATASET_ID" \
184
+ '{
185
+ model: "turbo",
186
+ dataset: {type: "file_id", file_id: $dataset},
187
+ num_epochs: 1,
188
+ lora_rank: 16,
189
+ max_resolution: 512
190
+ }' |
191
+ curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/train \
192
+ -H 'Content-Type: application/json' \
193
+ --data-binary @- |
194
+ jq -r .job_id
195
+ )
196
+
197
+ curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq .
198
+ ```
199
+ After completion, `result.adapter_file_id` is the learned adapter.
200
+ ```bash
201
+ ADAPTER=$(curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq -r .result.adapter_file_id)
202
+ ```
203
+ Apply LoRA during generation and editing.
204
+ ```bash
205
+ PARAMS=$(
206
+ jq -n \
207
+ --arg adapter "$ADAPTER" \
208
+ --arg prompt "portrait in the trained character style" \
209
+ '{
210
+ model: "turbo",
211
+ mode: "sync",
212
+ prompt: $prompt,
213
+ width: 512,
214
+ height: 512,
215
+ loras: [{file: {type: "file_id", file_id: $adapter}, scale: 1.0}]
216
+ }'
217
+ )
218
+
219
+ curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
220
+ -H 'Content-Type: application/json' \
221
+ --data-binary "$PARAMS" \
222
+ -o ernie_lora.png
223
+ ```
@@ -0,0 +1,34 @@
1
+ """ernie family — ERNIE-Image generation/edit/LoRA-training via mflux.
2
+
3
+ Endpoints: ``POST /v1/image/ernie/{generate,edit,train}``. ``generate`` is
4
+ text-to-image, ``edit`` is single-image img2img, and ``train`` LoRA-finetunes on
5
+ captioned images (always async). LoRA adapters and a ``quantize`` override run on
6
+ a one-off transient model; otherwise the resident model is used.
7
+ """
8
+
9
+ from kiapi.capabilities import ValidationError
10
+
11
+ from ._helpers.register import register
12
+ from ._helpers.validate_edit import validate_edit
13
+ from ._helpers.validate_generate import validate_generate
14
+ from ._operations.handle_edit import handle_edit
15
+ from ._operations.handle_generate import handle_generate
16
+ from ._operations.handle_train import handle_train
17
+ from ._settings import settings_manager
18
+ from ._views.edit_request import EditRequest
19
+ from ._views.generate_request import GenerateRequest
20
+ from ._views.train_request import TrainRequest
21
+
22
+ __all__ = [
23
+ "EditRequest", # ._views
24
+ "GenerateRequest", # ._views
25
+ "TrainRequest", # ._views
26
+ "ValidationError", # kiapi.capabilities
27
+ "handle_edit", # ._operations
28
+ "handle_generate", # ._operations
29
+ "handle_train", # ._operations
30
+ "register", # ._helpers
31
+ "settings_manager", # ._settings
32
+ "validate_edit", # ._helpers
33
+ "validate_generate", # ._helpers
34
+ ]
@@ -0,0 +1,71 @@
1
+ DESCRIPTION = """Image generation, editing, and LoRA training (ERNIE-Image via mflux).
2
+
3
+ Three operations on Baidu's ERNIE-Image models: `/generate` (text-to-image),
4
+ `/edit` (single-image image-to-image), and `/train` (LoRA finetune).
5
+
6
+ ## Upstream docs
7
+ - [mflux — ERNIE-Image](https://github.com/filipstrand/mflux/blob/main/src/mflux/models/ernie_image/README.md) — the MLX engine kiapi runs
8
+ - [baidu/ERNIE-Image-Turbo](https://huggingface.co/baidu/ERNIE-Image-Turbo) — `turbo` weights
9
+ - [baidu/ERNIE-Image](https://huggingface.co/baidu/ERNIE-Image) — `base` weights
10
+
11
+ ## Models
12
+ - **turbo** (default) — `baidu/ERNIE-Image-Turbo`. Fast, few steps (default 8),
13
+ guidance 1.0. The everyday choice.
14
+ - **base** — `baidu/ERNIE-Image`. Higher quality but slower: more steps
15
+ (default 50) and stronger guidance (default 4.0).
16
+
17
+ Pick the variant with `model` (aliases like `ernie-image-turbo` are accepted);
18
+ discover variants at `GET /v1/image/ernie/models`. Variant-dependent defaults
19
+ (`steps` / `guidance` / `quantize`) are filled in server-side when omitted, and
20
+ the resolved values are recorded in the result `params`.
21
+
22
+ ## Resident vs transient runs
23
+ The warmed, resident model uses the server-default quantization. A request that
24
+ either supplies `loras` or sets a `quantize` differing from the resident model
25
+ builds a **one-off transient model** for that call — weights load fresh, so it is
26
+ slower and not reused. For the fast path, omit `loras` and leave `quantize` unset.
27
+
28
+ ## LoRA workflow
29
+ Train an adapter from a captioned image set via `/train` (always async), then
30
+ apply it on `/generate` or `/edit` by passing its `adapter_file_id` in `loras`
31
+ (up to 4, each `{file, scale}`). Dataset = a ZIP uploaded to the Files API with a
32
+ same-stem `.txt` caption next to each image (`cat.png` + `cat.txt`); images may
33
+ sit at the top level or in a single subfolder, and `preview*` images are exempt
34
+ from the caption requirement.
35
+
36
+ ```
37
+ dataset.zip
38
+ ├── cat_01.png # image
39
+ ├── cat_01.txt # same-stem caption: "a photo of a tabby cat"
40
+ ├── cat_02.jpg
41
+ ├── cat_02.txt
42
+ └── preview.png # optional preview, no caption needed
43
+ ```
44
+
45
+ A single wrapping subfolder is also accepted (the images just need to live
46
+ together under one directory):
47
+
48
+ ```
49
+ dataset.zip
50
+ └── cats/
51
+ ├── cat_01.png
52
+ ├── cat_01.txt
53
+ └── ...
54
+ ```
55
+
56
+ ## TIPS
57
+ - For a quick image, call `sync` without `Accept: application/json` to get the
58
+ raw bytes straight back (`curl -o out.png`).
59
+ - `width`/`height` must be multiples of 16 and at most 2048x2048. `edit`
60
+ additionally requires square sizes by default — set
61
+ `KIAPI_ERNIE_EDIT_REQUIRE_SQUARE=0` to lift the guard (mflux 0.18.0 can fail on
62
+ some non-square ERNIE img2img sizes).
63
+ - First use downloads the ERNIE-Image weights; run `kiapi activate` ahead of time
64
+ to avoid a cold-start download on the first request.
65
+
66
+ ## Performance
67
+ - **turbo**: q8 512x512 generation around 15s after cache load, peak RSS ~5-6 GiB.
68
+ - **base**: slower and uses more steps; prefer turbo unless you need its quality.
69
+ - Transient runs (any `loras` or a `quantize` override) rebuild the model each
70
+ call and are slower than the resident path.
71
+ """
@@ -0,0 +1,60 @@
1
+ """Register ernie's models + OpenAPI description in the global registries."""
2
+
3
+ from kiapi.core.capability import CapabilitySpec, capability_spec_registry
4
+ from kiapi.core.model import ModelSpec, model_registry
5
+ from kiapi.core.setup import HfSnapshotResource
6
+
7
+ from .._constants.description import DESCRIPTION
8
+ from .._models import ernie
9
+ from .._settings import settings_manager
10
+
11
+
12
+ def register() -> None:
13
+ capability_spec_registry.register(
14
+ CapabilitySpec(
15
+ name="ernie",
16
+ domain="image",
17
+ title="kiapi ERNIE-Image API",
18
+ summary="Generate, edit, and train LoRA adapters for ERNIE-Image models.",
19
+ description=DESCRIPTION,
20
+ openapi_path="/v1/image/ernie/openapi.json",
21
+ docs_path="/v1/image/ernie/docs",
22
+ redoc_path="/v1/image/ernie/redoc",
23
+ path_prefixes=("/v1/image/ernie",),
24
+ )
25
+ )
26
+
27
+ _s = settings_manager.get_settings()
28
+
29
+ model_registry.register(
30
+ ModelSpec(
31
+ name="turbo",
32
+ family="ernie",
33
+ domain="image",
34
+ repo=_s.turbo_model,
35
+ module=ernie,
36
+ weight_gb=6.0,
37
+ peak_headroom_gb=4.0,
38
+ framework="mlx",
39
+ priority=0,
40
+ aliases=("ernie-image-turbo", "baidu/ERNIE-Image-Turbo"),
41
+ default=True,
42
+ setup_resources=(HfSnapshotResource(repo=_s.turbo_model, disk_gb=31.6),),
43
+ )
44
+ )
45
+
46
+ model_registry.register(
47
+ ModelSpec(
48
+ name="base",
49
+ family="ernie",
50
+ domain="image",
51
+ repo=_s.base_model,
52
+ module=ernie,
53
+ weight_gb=12.0,
54
+ peak_headroom_gb=8.0,
55
+ framework="mlx",
56
+ priority=0,
57
+ aliases=("ernie-image", "baidu/ERNIE-Image"),
58
+ setup_resources=(HfSnapshotResource(repo=_s.base_model, disk_gb=31.6),),
59
+ )
60
+ )
@@ -0,0 +1,19 @@
1
+ from kiapi.capabilities import ValidationError
2
+
3
+ from .._operations.validate_common import validate_common
4
+ from .._settings import settings_manager
5
+ from .._views.edit_request import EditRequest
6
+
7
+
8
+ def validate_edit(req: EditRequest, *, variant: str) -> None:
9
+ settings = settings_manager.get_settings()
10
+ validate_common(req, settings, variant=variant)
11
+ if not 0 <= req.image_strength <= 1:
12
+ raise ValidationError("image_strength must be in 0..1")
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
+ if settings.edit_require_square and width != height:
16
+ raise ValidationError(
17
+ "ERNIE edit currently requires square width/height; set "
18
+ "KIAPI_ERNIE_EDIT_REQUIRE_SQUARE=0 to disable this guard"
19
+ )
@@ -0,0 +1,8 @@
1
+ from .._operations.validate_common import validate_common
2
+ from .._settings import settings_manager
3
+ from .._views.generate_request import GenerateRequest
4
+
5
+
6
+ def validate_generate(req: GenerateRequest, *, variant: str) -> None:
7
+ settings = settings_manager.get_settings()
8
+ validate_common(req, settings, variant=variant)