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
kiapi/__init__.py ADDED
@@ -0,0 +1,3 @@
1
+ from importlib.metadata import version
2
+
3
+ __version__ = version("kiapi")
kiapi/__main__.py ADDED
@@ -0,0 +1,4 @@
1
+ from .cli.cli import main
2
+
3
+ if __name__ == "__main__":
4
+ main()
kiapi/api/__init__.py ADDED
@@ -0,0 +1,26 @@
1
+ from ._constants.require_auth import REQUIRE_AUTH
2
+ from ._helpers.build_job_responses import build_job_responses
3
+ from ._helpers.build_openapi import build_openapi
4
+ from ._helpers.build_train_responses import build_train_responses
5
+ from ._helpers.get_accept import get_accept
6
+ from ._helpers.get_ctx import get_ctx
7
+ from ._helpers.get_worker import get_worker
8
+ from ._helpers.register_capability_endpoints import register_capability_endpoints
9
+ from ._helpers.submit_and_maybe_wait import submit_and_maybe_wait
10
+ from ._settings import settings_manager
11
+
12
+ __all__ = [
13
+ # ._constants
14
+ "REQUIRE_AUTH",
15
+ # ._helpers
16
+ "build_job_responses",
17
+ "build_openapi",
18
+ "build_train_responses",
19
+ "get_accept",
20
+ "get_ctx",
21
+ "get_worker",
22
+ "register_capability_endpoints",
23
+ # ._settings
24
+ "settings_manager",
25
+ "submit_and_maybe_wait",
26
+ ]
@@ -0,0 +1,14 @@
1
+ from fastapi import Depends, HTTPException, Request
2
+
3
+ from .._settings import settings_manager
4
+
5
+
6
+ async def _require_auth(request: Request) -> None:
7
+ settings = settings_manager.get_settings()
8
+ token = settings.auth_token
9
+
10
+ if token and request.headers.get("authorization") != f"Bearer {token}":
11
+ raise HTTPException(status_code=401, detail="unauthorized")
12
+
13
+
14
+ REQUIRE_AUTH = [Depends(_require_auth)]
@@ -0,0 +1,73 @@
1
+ from typing import Any
2
+
3
+ from pydantic import BaseModel, create_model
4
+
5
+ from kiapi.core.job import Job
6
+
7
+ from .._views.async_job_response import AsyncJobResponse
8
+
9
+
10
+ def build_job_responses(
11
+ *media_types: str,
12
+ result_model: type[BaseModel] | None = None,
13
+ ) -> dict[int | str, dict[str, Any]]:
14
+ """OpenAPI response docs for sync/async generation endpoints.
15
+
16
+ ``mode=async`` returns 202 with a lightweight job handle. ``mode=sync``
17
+ returns a full Job JSON when the client asks for JSON, and may return a raw
18
+ artifact when the endpoint produces exactly one artifact and the client did
19
+ not request JSON.
20
+
21
+ ``result_model`` lets a family document the capability-specific shape of
22
+ ``Job.result`` (otherwise a free-form object): pass the family's result view
23
+ and the 200 JSON schema becomes a Job whose ``result`` is that typed model.
24
+ """
25
+
26
+ job_model: type[BaseModel] = Job
27
+ if result_model is not None:
28
+ job_model = create_model(
29
+ f"Job{result_model.__name__}",
30
+ __base__=Job,
31
+ result=(result_model | None, None),
32
+ )
33
+
34
+ # Pass the models via FastAPI's ``model`` key (not inline ``schema``) so
35
+ # FastAPI hoists their definitions into ``#/components/schemas`` and rewrites
36
+ # refs accordingly. Inlining ``model_json_schema()`` here would leave local
37
+ # ``#/$defs`` refs that don't resolve at the OpenAPI document root (ReDoc
38
+ # raises "Invalid reference token: $defs").
39
+ binary_content: dict[str, Any] = {
40
+ media_type: {"schema": {"type": "string", "format": "binary"}}
41
+ for media_type in media_types
42
+ }
43
+
44
+ return {
45
+ 200: {
46
+ "model": job_model,
47
+ "description": (
48
+ "Sync result. Returns Job JSON with Accept: application/json; "
49
+ "single-artifact jobs may return raw bytes otherwise."
50
+ ),
51
+ "content": binary_content,
52
+ "headers": {
53
+ "X-Kiapi-File-Id": {
54
+ "description": "Produced artifact file_id when raw bytes are returned.",
55
+ "schema": {"type": "string"},
56
+ },
57
+ "X-Kiapi-Job-Id": {
58
+ "description": "Job id when raw bytes are returned.",
59
+ "schema": {"type": "string"},
60
+ },
61
+ },
62
+ },
63
+ 202: {
64
+ "model": AsyncJobResponse,
65
+ "description": "Async job accepted. Poll GET /v1/jobs/{job_id}.",
66
+ },
67
+ 400: {
68
+ "description": "Invalid request for the selected model or file reference."
69
+ },
70
+ 422: {"description": "Request schema or validation error."},
71
+ 503: {"description": "Model setup or memory budget error."},
72
+ 504: {"description": "Sync request exceeded the configured timeout."},
73
+ }
@@ -0,0 +1,55 @@
1
+ from fastapi import FastAPI
2
+ from fastapi.openapi.utils import get_openapi
3
+ from fastapi.routing import APIRoute
4
+
5
+ from kiapi import __version__
6
+ from kiapi.core.capability import CapabilitySpec
7
+
8
+
9
+ def build_openapi(
10
+ app: FastAPI,
11
+ *,
12
+ title: str,
13
+ path_prefixes: tuple[str, ...],
14
+ include_paths: tuple[str, ...] = (),
15
+ description: str | None = None,
16
+ capability: CapabilitySpec | None = None,
17
+ ) -> dict:
18
+ routes = [
19
+ route
20
+ for route in app.routes
21
+ if isinstance(route, APIRoute)
22
+ and _path_matches(
23
+ route.path,
24
+ path_prefixes=path_prefixes,
25
+ include_paths=include_paths,
26
+ )
27
+ ]
28
+ schema = get_openapi(
29
+ title=title,
30
+ version=__version__,
31
+ description=description,
32
+ routes=routes,
33
+ )
34
+
35
+ if capability is not None:
36
+ schema["x-kiapi-capability"] = capability.name
37
+ schema["x-kiapi-domain"] = capability.domain
38
+ schema["x-kiapi-root-openapi"] = "/openapi.json"
39
+
40
+ return schema
41
+
42
+
43
+ def _path_matches(
44
+ path: str,
45
+ *,
46
+ path_prefixes: tuple[str, ...],
47
+ include_paths: tuple[str, ...],
48
+ ) -> bool:
49
+ return any(_matches_prefix(path, prefix) for prefix in path_prefixes) or path in (
50
+ include_paths
51
+ )
52
+
53
+
54
+ def _matches_prefix(path: str, prefix: str) -> bool:
55
+ return path == prefix or path.startswith(f"{prefix}/")
@@ -0,0 +1,21 @@
1
+ from typing import Any
2
+
3
+ from .._views.async_job_response import AsyncJobResponse
4
+
5
+
6
+ def build_train_responses() -> dict[int | str, dict[str, Any]]:
7
+ return {
8
+ # Pass the model via FastAPI's ``model`` key (not inline ``schema``) so
9
+ # FastAPI hoists nested ``$defs`` (e.g. JobStatus) into
10
+ # ``#/components/schemas`` and rewrites refs. Inlining
11
+ # ``model_json_schema()`` leaves dangling ``#/$defs/...`` refs that don't
12
+ # resolve at the document root (ReDoc raises "Invalid reference token:
13
+ # $defs").
14
+ 202: {
15
+ "model": AsyncJobResponse,
16
+ "description": "Training job accepted. Poll GET /v1/jobs/{job_id}.",
17
+ },
18
+ 400: {"description": "Invalid model or dataset FileRef."},
19
+ 422: {"description": "Request schema or validation error."},
20
+ 503: {"description": "Model setup or memory budget error."},
21
+ }
@@ -0,0 +1,20 @@
1
+ from typing import Annotated
2
+
3
+ from fastapi import Header
4
+
5
+
6
+ def get_accept(
7
+ accept: Annotated[
8
+ str | None,
9
+ Header(
10
+ alias="Accept",
11
+ description=(
12
+ "Response media type preference. application/json returns the Job "
13
+ "JSON; otherwise sync requests with one artifact return raw bytes "
14
+ "when possible."
15
+ ),
16
+ examples=["application/json", "image/png", "audio/wav", "video/mp4"],
17
+ ),
18
+ ] = None,
19
+ ) -> str | None:
20
+ return accept
@@ -0,0 +1,7 @@
1
+ from fastapi import Request
2
+
3
+ from kiapi.core.app import AppContext
4
+
5
+
6
+ def get_ctx(request: Request) -> AppContext:
7
+ return request.app.state.ctx # type: ignore
@@ -0,0 +1,7 @@
1
+ from fastapi import Request
2
+
3
+ from kiapi.core.worker import Worker
4
+
5
+
6
+ def get_worker(request: Request) -> Worker:
7
+ return request.app.state.worker # type: ignore
@@ -0,0 +1,70 @@
1
+ from fastapi import APIRouter, Request
2
+ from fastapi.openapi.docs import get_redoc_html, get_swagger_ui_html
3
+ from fastapi.responses import HTMLResponse
4
+
5
+ from kiapi.api._helpers.build_openapi import build_openapi
6
+ from kiapi.api._views.capability_model_spec import CapabilityModelSpec
7
+ from kiapi.core.capability import CapabilitySpec, capability_spec_registry
8
+ from kiapi.core.model import model_registry
9
+
10
+
11
+ def register_capability_endpoints(
12
+ router: APIRouter,
13
+ *,
14
+ name: str,
15
+ base_path: str,
16
+ ) -> None:
17
+ """Register the shared per-capability tail endpoints on ``router``.
18
+
19
+ Every capability exposes the same four boilerplate endpoints that differ
20
+ only by capability ``name`` (== family == model-registry token) and the
21
+ ``base_path`` under which they live:
22
+
23
+ - ``GET {base_path}/models`` — public model catalog for ``name``
24
+ - ``GET {base_path}/openapi.json`` — capability OpenAPI (operation layer)
25
+ - ``GET {base_path}/docs`` — Swagger UI for that OpenAPI
26
+ - ``GET {base_path}/redoc`` — ReDoc for that OpenAPI
27
+
28
+ The capability spec is resolved per-request (it may not be registered when
29
+ the router module is imported), mirroring the previous hand-written handlers.
30
+ """
31
+
32
+ def _spec() -> CapabilitySpec:
33
+ spec = capability_spec_registry.get(name)
34
+ if spec is None:
35
+ raise RuntimeError(f"kiapi capability {name!r} is not registered")
36
+ return spec
37
+
38
+ @router.get(f"{base_path}/models", response_model=list[CapabilityModelSpec])
39
+ async def list_models() -> list[CapabilityModelSpec]:
40
+ """List the servable models for this capability.
41
+
42
+ Returns the public catalog of every variant selectable via the ``model``
43
+ field on this capability's endpoints.
44
+ """
45
+ return [
46
+ CapabilityModelSpec.from_model_spec(spec)
47
+ for spec in model_registry.list_specs(name)
48
+ ]
49
+
50
+ @router.get(f"{base_path}/openapi.json", include_in_schema=False)
51
+ async def capability_openapi(request: Request) -> dict:
52
+ spec = _spec()
53
+ return build_openapi(
54
+ request.app,
55
+ title=spec.title,
56
+ description=spec.description,
57
+ path_prefixes=spec.path_prefixes,
58
+ include_paths=spec.include_paths,
59
+ capability=spec,
60
+ )
61
+
62
+ @router.get(f"{base_path}/docs", include_in_schema=False)
63
+ async def capability_docs() -> HTMLResponse:
64
+ spec = _spec()
65
+ return get_swagger_ui_html(openapi_url=spec.openapi_path, title=spec.title)
66
+
67
+ @router.get(f"{base_path}/redoc", include_in_schema=False)
68
+ async def capability_redoc() -> HTMLResponse:
69
+ spec = _spec()
70
+ return get_redoc_html(openapi_url=spec.openapi_path, title=spec.title)
@@ -0,0 +1,113 @@
1
+ """Shared sync/async job flow for generation capabilities (se, video, music).
2
+
3
+ Chat and embedding are sync-only and return their provider-native payload
4
+ directly. The generation capabilities instead:
5
+ - accept a ``mode`` ("sync" | "async") on a single endpoint,
6
+ - always create a Job (so it shows up in /v1/jobs and shares the single-flight
7
+ worker), and
8
+ - produce file artifacts referenced by ``file_id`` (see files.py).
9
+
10
+ ``submit_and_maybe_wait`` centralizes that: enqueue the job's thunk, then either
11
+ return the job immediately (async, HTTP 202) or wait for it (sync), mapping the
12
+ usual failures to HTTP status codes. A sync wait that exceeds ``sync_timeout_s``
13
+ is an error (504) — no fallback to async.
14
+
15
+ **Sync content negotiation**: a sync request that produces exactly
16
+ one artifact returns that artifact's *raw bytes* by default — convenient for
17
+ ``curl -o out.png .../generate`` and direct clients (``Accept: */*``). The file_id
18
+ and job_id ride along in response headers (``X-Kiapi-File-Id`` / ``X-Kiapi-Job-Id``)
19
+ so the full metadata (seed, params, timings) stays fetchable via
20
+ ``GET /v1/files/{id}``. A client that sets ``Accept: application/json`` instead
21
+ gets the Job dict — as do jobs with zero or multiple artifacts (e.g. acestep
22
+ extract), and all async (202) responses.
23
+ """
24
+
25
+ import asyncio
26
+
27
+ from fastapi import HTTPException
28
+ from fastapi.responses import FileResponse, JSONResponse, Response
29
+
30
+ from kiapi.core.app import AppContext
31
+ from kiapi.core.memory import MemoryBudgetError
32
+ from kiapi.core.model import UnknownModelError
33
+ from kiapi.core.setup import SetupRequiredError
34
+ from kiapi.core.worker import JobThunk, Worker
35
+
36
+ from .._settings import settings_manager
37
+
38
+
39
+ async def submit_and_maybe_wait(
40
+ ctx: AppContext,
41
+ worker: Worker,
42
+ *,
43
+ type: str,
44
+ params: dict,
45
+ thunk: JobThunk,
46
+ mode: str,
47
+ prefer_raw: bool = True,
48
+ accept: str | None = None,
49
+ ) -> Response:
50
+ """Run a generation job. Returns the artifact bytes (sync, single artifact,
51
+ non-JSON Accept), the job dict (sync otherwise), or {job_id,...} (async)."""
52
+ settings = settings_manager.get_settings()
53
+
54
+ job = ctx.job_store.create(type=type, params=params)
55
+ fut = await worker.submit(job, thunk)
56
+
57
+ if mode == "async":
58
+ return JSONResponse(
59
+ status_code=202,
60
+ content={"job_id": job.id, "type": job.type, "status": job.status},
61
+ )
62
+
63
+ try:
64
+ await asyncio.wait_for(fut, timeout=settings.sync_timeout_s)
65
+ except TimeoutError:
66
+ raise HTTPException( # noqa: B904
67
+ status_code=504,
68
+ detail=f"{type} job {job.id} exceeded sync timeout "
69
+ f"({settings.sync_timeout_s}s); it keeps running — poll /v1/jobs/{job.id}",
70
+ )
71
+ except UnknownModelError as exc:
72
+ raise HTTPException(status_code=400, detail=str(exc)) # noqa: B904
73
+ except SetupRequiredError as exc:
74
+ raise HTTPException(status_code=503, detail=str(exc)) # noqa: B904
75
+ except MemoryBudgetError as exc:
76
+ raise HTTPException(status_code=503, detail=str(exc)) # noqa: B904
77
+ except Exception as exc:
78
+ if exc.__class__.__name__ in (
79
+ "MediaError",
80
+ "CapabilityError",
81
+ "ValidationError",
82
+ ):
83
+ raise HTTPException(status_code=400, detail=str(exc)) # noqa: B904
84
+ raise HTTPException(status_code=500, detail=f"{type} failed: {exc}") # noqa: B904
85
+
86
+ # The worker mutates this same Job instance in place, so it is now updated.
87
+
88
+ # Sync content negotiation: return the single artifact's raw bytes unless the
89
+ # client asked for JSON (or there isn't exactly one artifact).
90
+ if prefer_raw and not _wants_json(accept) and len(job.artifacts) == 1:
91
+ raw = _raw_response(ctx, job, job.artifacts[0])
92
+ if raw is not None:
93
+ return raw
94
+
95
+ return JSONResponse(status_code=200, content=job.to_dict())
96
+
97
+
98
+ def _wants_json(accept: str | None) -> bool:
99
+ return "application/json" in (accept or "").lower()
100
+
101
+
102
+ def _raw_response(ctx: AppContext, job, file_id: str) -> Response | None: # type: ignore
103
+ """Build a raw-bytes FileResponse for a single artifact, or None if the file
104
+ can't be resolved (caller falls back to JSON)."""
105
+ rec = ctx.file_store.get(file_id)
106
+ if rec is None:
107
+ return None
108
+ return FileResponse(
109
+ rec.path,
110
+ media_type=rec.content_type,
111
+ filename=rec.filename,
112
+ headers={"X-Kiapi-File-Id": rec.file_id, "X-Kiapi-Job-Id": job.id},
113
+ )
kiapi/api/_settings.py ADDED
@@ -0,0 +1,50 @@
1
+ from pydantic import Field, SecretStr
2
+ from pydantic_settings import BaseSettings, SettingsConfigDict
3
+ from pydantic_settings_manager import SettingsManager
4
+
5
+
6
+ class APISettings(BaseSettings):
7
+ """Settings for API server binding, authentication, and sync request waits."""
8
+
9
+ model_config = SettingsConfigDict(
10
+ env_prefix="KIAPI_",
11
+ extra="ignore",
12
+ )
13
+
14
+ host: str = Field(
15
+ default="127.0.0.1",
16
+ title="Bind host",
17
+ description=(
18
+ "Hostname or IP address that the kiapi API server binds to.\n"
19
+ "Use 127.0.0.1 for local-only access, or 0.0.0.0 in a trusted "
20
+ "environment when other devices on the same network should connect."
21
+ ),
22
+ )
23
+
24
+ port: int = Field(
25
+ default=8000,
26
+ title="Bind port",
27
+ description="TCP port that the kiapi API server binds to.\nThe usual value is 8000.",
28
+ )
29
+
30
+ auth_token: SecretStr | None = Field(
31
+ default=None,
32
+ title="API auth token",
33
+ description=(
34
+ "When set, API calls must use Bearer token authentication.\n"
35
+ "When unset, requests are accepted without authentication."
36
+ ),
37
+ )
38
+
39
+ sync_timeout_s: float = Field(
40
+ default=600.0,
41
+ title="Sync request wait seconds",
42
+ description=(
43
+ "Maximum number of seconds a sync-mode API call waits for job completion.\n"
44
+ "If this is exceeded, kiapi returns a timeout error instead of "
45
+ "switching the request to async mode."
46
+ ),
47
+ )
48
+
49
+
50
+ settings_manager = SettingsManager(APISettings)
@@ -0,0 +1,21 @@
1
+ from pydantic import BaseModel, Field
2
+
3
+ from kiapi.core.job import JobStatus
4
+
5
+
6
+ class AsyncJobResponse(BaseModel):
7
+ job_id: str = Field(
8
+ ...,
9
+ description="In-memory job id. Poll GET /v1/jobs/{job_id} to inspect status, progress, result, and artifacts.",
10
+ examples=["job_0123456789abcdef"],
11
+ )
12
+ type: str = Field(
13
+ ...,
14
+ description="Job type. Generation APIs use values such as zimage, flux2-edit, or acestep-extract.",
15
+ examples=["zimage"],
16
+ )
17
+ status: JobStatus = Field(
18
+ ...,
19
+ description="Initial job status. Async responses are normally queued unless the worker starts immediately.",
20
+ examples=["queued"],
21
+ )
@@ -0,0 +1,49 @@
1
+ from pydantic import BaseModel, Field
2
+
3
+ from kiapi.core.model import ModelSpec
4
+
5
+
6
+ class CapabilityModelSpec(BaseModel):
7
+ """Public model discovery entry for capability-specific model lists."""
8
+
9
+ name: str = Field(
10
+ ...,
11
+ description="Model variant name to pass in the request model field.",
12
+ examples=["turbo"],
13
+ )
14
+ family: str = Field(
15
+ ...,
16
+ description="Capability family that resolves this model variant.",
17
+ examples=["zimage"],
18
+ )
19
+ domain: str = Field(
20
+ ...,
21
+ description="Capability domain used for grouping model lists.",
22
+ examples=["image"],
23
+ )
24
+ aliases: tuple[str, ...] = Field(
25
+ default_factory=tuple,
26
+ description="Alternative names that also resolve to this model.",
27
+ examples=[["omni", "qwen3-omni-30b"]],
28
+ )
29
+ default: bool = Field(
30
+ default=False,
31
+ description="Whether this is the default model when the request omits model.",
32
+ examples=[True],
33
+ )
34
+ features: tuple[str, ...] = Field(
35
+ default_factory=tuple,
36
+ description="Handler-declared modalities and features supported by this model.",
37
+ examples=[["text", "image"]],
38
+ )
39
+
40
+ @classmethod
41
+ def from_model_spec(cls, spec: ModelSpec) -> "CapabilityModelSpec":
42
+ return cls(
43
+ name=spec.name,
44
+ family=spec.family,
45
+ domain=spec.domain,
46
+ aliases=spec.aliases,
47
+ default=spec.default,
48
+ features=tuple(sorted(spec.features)),
49
+ )