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,98 @@
1
+ """Register flux2'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 flux2
9
+ from .._settings import settings_manager
10
+
11
+
12
+ def register() -> None:
13
+ capability_spec_registry.register(
14
+ CapabilitySpec(
15
+ name="flux2",
16
+ domain="image",
17
+ title="kiapi FLUX.2 API",
18
+ summary="Generate, edit, and train LoRA adapters for FLUX.2 image models.",
19
+ description=DESCRIPTION,
20
+ openapi_path="/v1/image/flux2/openapi.json",
21
+ docs_path="/v1/image/flux2/docs",
22
+ redoc_path="/v1/image/flux2/redoc",
23
+ path_prefixes=("/v1/image/flux2",),
24
+ )
25
+ )
26
+
27
+ _s = settings_manager.get_settings()
28
+ setup_repos = {
29
+ "flux2-klein-9b": "black-forest-labs/FLUX.2-klein-9B",
30
+ "flux2-klein-base-4b": "black-forest-labs/FLUX.2-klein-base-4B",
31
+ "flux2-klein-base-9b": "black-forest-labs/FLUX.2-klein-base-9B",
32
+ }
33
+
34
+ model_registry.register(
35
+ ModelSpec(
36
+ name="klein-9b",
37
+ family="flux2",
38
+ domain="image",
39
+ repo=_s.klein_9b_model,
40
+ module=flux2,
41
+ weight_gb=29.0, # measured peak RSS ~28.99 GiB for 512 text/img2img
42
+ peak_headroom_gb=4.0, # edit measured ~31.6 GiB; keep margin for larger inputs
43
+ framework="mlx",
44
+ priority=0,
45
+ aliases=("flux2-klein-9b", "black-forest-labs/FLUX.2-klein-9B"),
46
+ default=True,
47
+ setup_resources=(
48
+ HfSnapshotResource(
49
+ repo=setup_repos.get(_s.klein_9b_model, _s.klein_9b_model),
50
+ disk_gb=52.9,
51
+ ),
52
+ ),
53
+ )
54
+ )
55
+ model_registry.register(
56
+ ModelSpec(
57
+ name="klein-base-4b",
58
+ family="flux2",
59
+ domain="image",
60
+ repo=_s.klein_base_4b_model,
61
+ module=flux2,
62
+ weight_gb=9.5, # measured peak RSS ~9.1 GiB, q8, 512 text, 40 steps
63
+ peak_headroom_gb=3.0,
64
+ framework="mlx",
65
+ priority=0,
66
+ aliases=("flux2-klein-base-4b", "black-forest-labs/FLUX.2-klein-base-4B"),
67
+ setup_resources=(
68
+ HfSnapshotResource(
69
+ repo=setup_repos.get(
70
+ _s.klein_base_4b_model, _s.klein_base_4b_model
71
+ ),
72
+ disk_gb=23.7,
73
+ ),
74
+ ),
75
+ )
76
+ )
77
+ model_registry.register(
78
+ ModelSpec(
79
+ name="klein-base-9b",
80
+ family="flux2",
81
+ domain="image",
82
+ repo=_s.klein_base_9b_model,
83
+ module=flux2,
84
+ weight_gb=18.0, # measured peak RSS ~16.8 GiB, q8, 512 text, 40 steps
85
+ peak_headroom_gb=4.0,
86
+ framework="mlx",
87
+ priority=0,
88
+ aliases=("flux2-klein-base-9b", "black-forest-labs/FLUX.2-klein-base-9B"),
89
+ setup_resources=(
90
+ HfSnapshotResource(
91
+ repo=setup_repos.get(
92
+ _s.klein_base_9b_model, _s.klein_base_9b_model
93
+ ),
94
+ disk_gb=52.9,
95
+ ),
96
+ ),
97
+ )
98
+ )
@@ -0,0 +1,12 @@
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 req.images:
12
+ raise ValidationError("edit requires at least one image")
@@ -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)
@@ -0,0 +1,396 @@
1
+ """Handler for FLUX.2 Klein (generate/edit/train) via mflux."""
2
+
3
+ import gc
4
+ import json
5
+ import time
6
+ from pathlib import Path
7
+ from types import SimpleNamespace
8
+ from typing import Any
9
+
10
+ from kiapi.capabilities import attach_mflux_progress
11
+ from kiapi.core.file import FileStore
12
+ from kiapi.core.model import ModelSpec
13
+ from kiapi.core.workdir import create_work_dir
14
+
15
+ from .._operations.split_repo import split_repo
16
+ from .._views.edit_params import EditParams
17
+ from .._views.generate_params import GenerateParams
18
+ from .._views.train_params import TrainParams
19
+
20
+ FEATURES = {"text", "image"}
21
+
22
+
23
+ def _model_config(model_name: str) -> Any:
24
+ from mflux.models.common.config import ModelConfig # type: ignore
25
+
26
+ return ModelConfig.from_name(model_name=model_name)
27
+
28
+
29
+ def _build_generate_model(
30
+ spec: ModelSpec,
31
+ *,
32
+ quantize: int | None,
33
+ lora_paths: list[str] | None = None,
34
+ lora_scales: list[float] | None = None,
35
+ ) -> Any:
36
+ from mflux.models.flux2.variants import Flux2Klein # type: ignore
37
+
38
+ model_name, _role = split_repo(spec.repo)
39
+ return Flux2Klein(
40
+ model_config=_model_config(model_name),
41
+ quantize=quantize,
42
+ lora_paths=lora_paths or None,
43
+ lora_scales=lora_scales or None,
44
+ )
45
+
46
+
47
+ def _build_edit_model(
48
+ spec: ModelSpec,
49
+ *,
50
+ quantize: int | None,
51
+ lora_paths: list[str] | None = None,
52
+ lora_scales: list[float] | None = None,
53
+ ) -> Any:
54
+ from mflux.models.flux2.variants import Flux2KleinEdit
55
+
56
+ model_name, _role = split_repo(spec.repo)
57
+ return Flux2KleinEdit(
58
+ model_config=_model_config(model_name),
59
+ quantize=quantize,
60
+ lora_paths=lora_paths or None,
61
+ lora_scales=lora_scales or None,
62
+ )
63
+
64
+
65
+ def load(spec: ModelSpec) -> SimpleNamespace:
66
+ from .._settings import settings_manager
67
+
68
+ settings = settings_manager.get_settings()
69
+ model_name, role = split_repo(spec.repo)
70
+ quantize = settings.default_quantize.get(spec.name)
71
+ model = (
72
+ _build_edit_model(spec, quantize=quantize)
73
+ if role == "edit"
74
+ else _build_generate_model(spec, quantize=quantize)
75
+ )
76
+ return SimpleNamespace(
77
+ model=model, spec=spec, model_name=model_name, role=role, quantize=quantize
78
+ )
79
+
80
+
81
+ def warmup(payload: SimpleNamespace) -> None:
82
+ if payload.role == "edit":
83
+ return
84
+ payload.model.generate_image(
85
+ seed=0, prompt="warmup", num_inference_steps=1, width=256, height=256
86
+ )
87
+
88
+
89
+ def _store_image(
90
+ image: Any,
91
+ *,
92
+ fmt: str,
93
+ quality: int,
94
+ files: FileStore,
95
+ meta: dict[str, Any],
96
+ ) -> dict[str, Any]:
97
+ pil = getattr(image, "image", image)
98
+ ext = "jpg" if fmt == "jpeg" else fmt
99
+ tmp_dir = create_work_dir("image/flux2")
100
+ out_path = tmp_dir / f"image.{ext}"
101
+ save_kwargs: dict[str, Any] = {}
102
+ if fmt in ("jpeg", "webp"):
103
+ save_kwargs["quality"] = quality
104
+ if fmt == "jpeg":
105
+ pil = pil.convert("RGB")
106
+ pil.save(out_path, format=fmt.upper(), **save_kwargs)
107
+ if not out_path.exists():
108
+ raise RuntimeError("generation finished but no image file was produced")
109
+ rec = files.put_path(
110
+ out_path,
111
+ filename=f"flux2_{int(time.time())}.{ext}",
112
+ content_type=f"image/{fmt}",
113
+ meta=meta,
114
+ move=True,
115
+ )
116
+ return {"file_id": rec.file_id, "image_bytes": rec.size, **meta}
117
+
118
+
119
+ def _generate(model: Any, params: GenerateParams, files: FileStore) -> dict[str, Any]:
120
+ t0 = time.time()
121
+ attach_mflux_progress(model)
122
+ image = model.generate_image(
123
+ seed=params.seed,
124
+ prompt=params.prompt,
125
+ image_path=params.init_image_path,
126
+ image_strength=params.image_strength,
127
+ num_inference_steps=params.steps,
128
+ width=params.width,
129
+ height=params.height,
130
+ guidance=params.guidance,
131
+ scheduler=params.scheduler,
132
+ )
133
+ total_s = round(time.time() - t0, 2)
134
+ meta = {
135
+ "model": params.model,
136
+ "prompt": params.prompt,
137
+ "params": params.model_dump(exclude={"init_image_path"}),
138
+ "width": params.width,
139
+ "height": params.height,
140
+ "timings": {"total_s": total_s},
141
+ }
142
+ return _store_image(
143
+ image, fmt=params.format, quality=params.quality, files=files, meta=meta
144
+ )
145
+
146
+
147
+ def _edit(model: Any, params: EditParams, files: FileStore) -> dict[str, Any]:
148
+ t0 = time.time()
149
+ attach_mflux_progress(model)
150
+ image = model.generate_image(
151
+ seed=params.seed,
152
+ prompt=params.prompt,
153
+ image_paths=params.image_paths,
154
+ image_strength=params.image_strength,
155
+ num_inference_steps=params.steps,
156
+ width=params.width,
157
+ height=params.height,
158
+ guidance=params.guidance,
159
+ scheduler=params.scheduler,
160
+ )
161
+ total_s = round(time.time() - t0, 2)
162
+ meta = {
163
+ "model": params.model,
164
+ "prompt": params.prompt,
165
+ "params": params.model_dump(exclude={"image_paths"}),
166
+ "width": params.width,
167
+ "height": params.height,
168
+ "timings": {"total_s": total_s},
169
+ }
170
+ return _store_image(
171
+ image, fmt=params.format, quality=params.quality, files=files, meta=meta
172
+ )
173
+
174
+
175
+ def run_generate(
176
+ payload: SimpleNamespace, params: GenerateParams, files: FileStore
177
+ ) -> dict[str, Any]:
178
+ return _generate(payload.model, params, files)
179
+
180
+
181
+ def run_edit(
182
+ payload: SimpleNamespace, params: EditParams, files: FileStore
183
+ ) -> dict[str, Any]:
184
+ return _edit(payload.model, params, files)
185
+
186
+
187
+ def run_generate_transient(
188
+ spec: ModelSpec,
189
+ params: GenerateParams,
190
+ files: FileStore,
191
+ *,
192
+ lora_paths: list[str],
193
+ lora_scales: list[float],
194
+ ) -> dict[str, Any]:
195
+ model = _build_generate_model(
196
+ spec, quantize=params.quantize, lora_paths=lora_paths, lora_scales=lora_scales
197
+ )
198
+ try:
199
+ return _generate(model, params, files)
200
+ finally:
201
+ _free(model)
202
+
203
+
204
+ def run_edit_transient(
205
+ spec: ModelSpec,
206
+ params: EditParams,
207
+ files: FileStore,
208
+ *,
209
+ lora_paths: list[str],
210
+ lora_scales: list[float],
211
+ ) -> dict[str, Any]:
212
+ model = _build_edit_model(
213
+ spec, quantize=params.quantize, lora_paths=lora_paths, lora_scales=lora_scales
214
+ )
215
+ try:
216
+ return _edit(model, params, files)
217
+ finally:
218
+ _free(model)
219
+
220
+
221
+ def _free(model: Any) -> None:
222
+ del model
223
+ gc.collect()
224
+ import mlx.core as mx
225
+
226
+ mx.clear_cache()
227
+
228
+
229
+ _BLOCK_RANGE = {"start": 0, "end": 2}
230
+ _SINGLE_BLOCK_RANGE = {"start": 0, "end": 6}
231
+
232
+
233
+ def _default_lora_targets(rank: int, include_ff: bool) -> list[dict[str, Any]]:
234
+ targets = [
235
+ {
236
+ "module_path": f"transformer_blocks.{{block}}.attn.{name}",
237
+ "blocks": dict(_BLOCK_RANGE),
238
+ "rank": rank,
239
+ }
240
+ for name in (
241
+ "to_q",
242
+ "to_k",
243
+ "to_v",
244
+ "to_out",
245
+ "add_q_proj",
246
+ "add_k_proj",
247
+ "add_v_proj",
248
+ "to_add_out",
249
+ )
250
+ ]
251
+ if include_ff:
252
+ targets += [
253
+ {
254
+ "module_path": f"transformer_blocks.{{block}}.{name}",
255
+ "blocks": dict(_BLOCK_RANGE),
256
+ "rank": rank,
257
+ }
258
+ for name in (
259
+ "ff.linear_in",
260
+ "ff.linear_out",
261
+ "ff_context.linear_in",
262
+ "ff_context.linear_out",
263
+ )
264
+ ]
265
+ targets += [
266
+ {
267
+ "module_path": "single_transformer_blocks.{block}.attn.to_qkv_mlp_proj",
268
+ "blocks": dict(_SINGLE_BLOCK_RANGE),
269
+ "rank": rank,
270
+ },
271
+ {
272
+ "module_path": "single_transformer_blocks.{block}.attn.to_out",
273
+ "blocks": dict(_SINGLE_BLOCK_RANGE),
274
+ "rank": rank,
275
+ },
276
+ ]
277
+ return targets
278
+
279
+
280
+ def _train_model_name(spec: ModelSpec, params: TrainParams) -> str:
281
+ base, _role = split_repo(spec.repo)
282
+ return f"{base}-edit" if params.training_mode == "edit" else base
283
+
284
+
285
+ def _build_train_config(
286
+ spec: ModelSpec,
287
+ params: TrainParams,
288
+ data_dirname: str,
289
+ out_dir: Path,
290
+ ) -> dict[str, Any]:
291
+ lora_layers = params.lora_layers or {
292
+ "targets": _default_lora_targets(params.lora_rank, params.lora_include_ff)
293
+ }
294
+
295
+ return {
296
+ "model": _train_model_name(spec, params),
297
+ "data": data_dirname,
298
+ "seed": params.seed,
299
+ "steps": params.steps,
300
+ "guidance": params.guidance,
301
+ "quantize": params.quantize,
302
+ "max_resolution": params.max_resolution,
303
+ "low_ram": params.low_ram,
304
+ "training_loop": {
305
+ "num_epochs": params.num_epochs,
306
+ "batch_size": params.batch_size,
307
+ "timestep_low": params.timestep_low,
308
+ "timestep_high": params.timestep_high,
309
+ },
310
+ "optimizer": {"name": "AdamW", "learning_rate": params.learning_rate},
311
+ "checkpoint": {
312
+ "save_frequency": params.save_frequency,
313
+ "output_path": str(out_dir),
314
+ },
315
+ "lora_layers": lora_layers,
316
+ }
317
+
318
+
319
+ def train(
320
+ spec: ModelSpec,
321
+ params: TrainParams,
322
+ files: FileStore,
323
+ dataset_dir: str,
324
+ ) -> dict[str, Any]:
325
+ import zipfile
326
+
327
+ from mflux.models.common.training.runner import TrainingRunner # type: ignore
328
+ from mflux.utils.exceptions import StopTrainingException # type: ignore
329
+
330
+ workdir = Path(dataset_dir).parent
331
+ out_dir = workdir / "out"
332
+ config = _build_train_config(spec, params, Path(dataset_dir).name, out_dir)
333
+ config_path = workdir / "train.json"
334
+ config_path.write_text(json.dumps(config, indent=2))
335
+
336
+ t0 = time.time()
337
+ try:
338
+ _adapter, training_spec = TrainingRunner.train(
339
+ config_path=str(config_path), resume_path=None
340
+ )
341
+ except StopTrainingException:
342
+ from mflux.models.common.training.state.training_spec import ( # type: ignore[import-untyped]
343
+ TrainingSpec,
344
+ )
345
+
346
+ training_spec = TrainingSpec.resolve(
347
+ config_path=str(config_path), resume_path=None
348
+ )
349
+ total_s = round(time.time() - t0, 2)
350
+
351
+ ckpt_dir = Path(training_spec.checkpoint.output_path) / "checkpoints"
352
+ zips = sorted(ckpt_dir.glob("*_checkpoint.zip"))
353
+ if not zips:
354
+ raise RuntimeError(
355
+ f"training finished but no checkpoint was produced in {ckpt_dir}"
356
+ )
357
+ latest = zips[-1]
358
+
359
+ adapter_bytes = None
360
+ with zipfile.ZipFile(latest) as zf:
361
+ for name in zf.namelist():
362
+ if name.endswith("_adapter.safetensors"):
363
+ adapter_bytes = zf.read(name)
364
+ break
365
+ if adapter_bytes is None:
366
+ raise RuntimeError(f"no *_adapter.safetensors inside {latest.name}")
367
+
368
+ meta = {
369
+ "model": spec.name,
370
+ "kind": "lora_adapter",
371
+ "training_mode": params.training_mode,
372
+ "config": {
373
+ k: config[k]
374
+ for k in (
375
+ "model",
376
+ "seed",
377
+ "steps",
378
+ "guidance",
379
+ "quantize",
380
+ "max_resolution",
381
+ "low_ram",
382
+ "training_loop",
383
+ "optimizer",
384
+ )
385
+ },
386
+ "lora_targets": len(config["lora_layers"]["targets"]),
387
+ "checkpoint": latest.name,
388
+ "timings": {"total_s": total_s},
389
+ }
390
+ rec = files.put_bytes(
391
+ adapter_bytes,
392
+ filename=f"flux2_lora_{spec.name}_{int(time.time())}.safetensors",
393
+ content_type="application/octet-stream",
394
+ meta=meta,
395
+ )
396
+ return {"adapter_file_id": rec.file_id, "adapter_bytes": rec.size, **meta}
@@ -0,0 +1,44 @@
1
+ """FLUX.2 multi-reference edit service entry (worker-thread thunk body)."""
2
+
3
+ from kiapi.capabilities import get_file_path
4
+ from kiapi.core.app import AppContext
5
+ from kiapi.core.file import FileID
6
+ from kiapi.core.job import JobResult
7
+ from kiapi.core.model import model_registry
8
+
9
+ from .._settings import settings_manager
10
+ from .._views.edit_request import EditRequest
11
+ from .is_quantize_override import is_quantize_override
12
+ from .resolve_edit_params import resolve_edit_params
13
+ from .resolve_lora_params import resolve_lora_params
14
+ from .role_spec import role_spec
15
+
16
+
17
+ def handle_edit(ctx: AppContext, req: EditRequest) -> tuple[JobResult, list[FileID]]:
18
+ settings = settings_manager.get_settings()
19
+ base_spec = model_registry.resolve("flux2", req.model)
20
+ ctx.ensure_model_ready(base_spec)
21
+ spec = role_spec(base_spec, "edit")
22
+ image_paths = [
23
+ get_file_path(ctx.file_store, image, kind="image") for image in req.images
24
+ ]
25
+ lora_params = resolve_lora_params(ctx, req.loras)
26
+ override = is_quantize_override(settings, req, variant=base_spec.name)
27
+ params = resolve_edit_params(
28
+ settings, req, variant=base_spec.name, image_paths=image_paths
29
+ )
30
+
31
+ if lora_params.paths or override:
32
+ ctx.memory_manager.reserve(base_spec.weight_gb + base_spec.peak_headroom_gb)
33
+ result = base_spec.module.run_edit_transient(
34
+ base_spec,
35
+ params,
36
+ ctx.file_store,
37
+ lora_paths=lora_params.paths,
38
+ lora_scales=lora_params.scales,
39
+ )
40
+ else:
41
+ payload = ctx.memory_manager.acquire(spec)
42
+ result = spec.module.run_edit(payload, params, ctx.file_store)
43
+
44
+ return result, [result["file_id"]]
@@ -0,0 +1,46 @@
1
+ """FLUX.2 generate (txt2img / img2img) service entry (worker-thread thunk body)."""
2
+
3
+ from kiapi.capabilities import get_file_path
4
+ from kiapi.core.app import AppContext
5
+ from kiapi.core.file import FileID
6
+ from kiapi.core.job import JobResult
7
+ from kiapi.core.model import model_registry
8
+
9
+ from .._settings import settings_manager
10
+ from .._views.generate_request import GenerateRequest
11
+ from .is_quantize_override import is_quantize_override
12
+ from .resolve_generate_params import resolve_generate_params
13
+ from .resolve_lora_params import resolve_lora_params
14
+
15
+
16
+ def handle_generate(
17
+ ctx: AppContext, req: GenerateRequest
18
+ ) -> tuple[JobResult, list[FileID]]:
19
+ settings = settings_manager.get_settings()
20
+ spec = model_registry.resolve("flux2", req.model)
21
+ ctx.ensure_model_ready(spec)
22
+ init_image_path = (
23
+ get_file_path(ctx.file_store, req.init_image, kind="init_image")
24
+ if req.init_image is not None
25
+ else None
26
+ )
27
+ lora_params = resolve_lora_params(ctx, req.loras)
28
+ override = is_quantize_override(settings, req, variant=spec.name)
29
+ params = resolve_generate_params(
30
+ settings, req, variant=spec.name, init_image_path=init_image_path
31
+ )
32
+
33
+ if lora_params.paths or override:
34
+ ctx.memory_manager.reserve(spec.weight_gb + spec.peak_headroom_gb)
35
+ result = spec.module.run_generate_transient(
36
+ spec,
37
+ params,
38
+ ctx.file_store,
39
+ lora_paths=lora_params.paths,
40
+ lora_scales=lora_params.scales,
41
+ )
42
+ else:
43
+ payload = ctx.memory_manager.acquire(spec)
44
+ result = spec.module.run_generate(payload, params, ctx.file_store)
45
+
46
+ return result, [result["file_id"]]