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.
- kiapi/__init__.py +3 -0
- kiapi/__main__.py +4 -0
- kiapi/api/__init__.py +26 -0
- kiapi/api/_constants/require_auth.py +14 -0
- kiapi/api/_helpers/build_job_responses.py +73 -0
- kiapi/api/_helpers/build_openapi.py +55 -0
- kiapi/api/_helpers/build_train_responses.py +21 -0
- kiapi/api/_helpers/get_accept.py +20 -0
- kiapi/api/_helpers/get_ctx.py +7 -0
- kiapi/api/_helpers/get_worker.py +7 -0
- kiapi/api/_helpers/register_capability_endpoints.py +70 -0
- kiapi/api/_helpers/submit_and_maybe_wait.py +113 -0
- kiapi/api/_settings.py +50 -0
- kiapi/api/_views/async_job_response.py +21 -0
- kiapi/api/_views/capability_model_spec.py +49 -0
- kiapi/api/app.py +150 -0
- kiapi/api/audio/acestep/_views/extract_response.py +57 -0
- kiapi/api/audio/acestep/_views/track_response.py +57 -0
- kiapi/api/audio/acestep/router.py +190 -0
- kiapi/api/audio/audiogen/_views/audio_response.py +46 -0
- kiapi/api/audio/audiogen/router.py +77 -0
- kiapi/api/chat/_views/chat_completion_response.py +71 -0
- kiapi/api/chat/router.py +253 -0
- kiapi/api/embedding/_views/embedding_response.py +35 -0
- kiapi/api/embedding/router.py +82 -0
- kiapi/api/files/_operations/get_file.py +14 -0
- kiapi/api/files/_operations/get_file_id.py +18 -0
- kiapi/api/files/_views/file_delete_response.py +14 -0
- kiapi/api/files/_views/file_list_response.py +15 -0
- kiapi/api/files/router.py +105 -0
- kiapi/api/health/_views/health_response.py +26 -0
- kiapi/api/health/router.py +28 -0
- kiapi/api/image/depthpro/_views/estimate_response.py +70 -0
- kiapi/api/image/depthpro/router.py +81 -0
- kiapi/api/image/ernie/_views/image_response.py +50 -0
- kiapi/api/image/ernie/router.py +181 -0
- kiapi/api/image/flux2/_views/image_response.py +53 -0
- kiapi/api/image/flux2/router.py +197 -0
- kiapi/api/image/ideogram4/_views/image_response.py +55 -0
- kiapi/api/image/ideogram4/router.py +87 -0
- kiapi/api/image/qwen/_views/image_response.py +47 -0
- kiapi/api/image/qwen/router.py +141 -0
- kiapi/api/image/seedvr2/_views/image_response.py +50 -0
- kiapi/api/image/seedvr2/router.py +83 -0
- kiapi/api/image/zimage/_views/image_response.py +49 -0
- kiapi/api/image/zimage/router.py +131 -0
- kiapi/api/jobs/_operations/get_job_id.py +18 -0
- kiapi/api/jobs/_views/job_delete_response.py +19 -0
- kiapi/api/jobs/_views/job_list_response.py +15 -0
- kiapi/api/jobs/router.py +62 -0
- kiapi/api/models/_schemas/openai_model_spec.py +26 -0
- kiapi/api/models/_views/model_list_response.py +15 -0
- kiapi/api/models/router.py +29 -0
- kiapi/api/video/ltx2/_views/__init__.py +1 -0
- kiapi/api/video/ltx2/_views/video_response.py +59 -0
- kiapi/api/video/ltx2/router.py +89 -0
- kiapi/api/web/_views/__init__.py +7 -0
- kiapi/api/web/_views/fetch_api_request.py +26 -0
- kiapi/api/web/_views/fetch_error_response.py +25 -0
- kiapi/api/web/router.py +302 -0
- kiapi/capabilities/__init__.py +24 -0
- kiapi/capabilities/_exceptions/CapabilityError.py +2 -0
- kiapi/capabilities/_exceptions/ValidationError.py +2 -0
- kiapi/capabilities/_helpers/attach_mflux_progress.py +50 -0
- kiapi/capabilities/_helpers/get_file_path.py +20 -0
- kiapi/capabilities/_helpers/resolve_file_ref.py +16 -0
- kiapi/capabilities/acestep/README.ja.md +174 -0
- kiapi/capabilities/acestep/README.md +167 -0
- kiapi/capabilities/acestep/__init__.py +37 -0
- kiapi/capabilities/acestep/_constants/description.py +122 -0
- kiapi/capabilities/acestep/_exceptions/ace_step_engine_error.py +2 -0
- kiapi/capabilities/acestep/_helpers/register.py +96 -0
- kiapi/capabilities/acestep/_models/acestep.py +105 -0
- kiapi/capabilities/acestep/_operations/handle_cover.py +23 -0
- kiapi/capabilities/acestep/_operations/handle_extract.py +38 -0
- kiapi/capabilities/acestep/_operations/handle_generate.py +18 -0
- kiapi/capabilities/acestep/_operations/handle_repaint.py +25 -0
- kiapi/capabilities/acestep/_operations/resolve_ace_step_paths.py +30 -0
- kiapi/capabilities/acestep/_operations/resolve_cover_params.py +21 -0
- kiapi/capabilities/acestep/_operations/resolve_engine.py +10 -0
- kiapi/capabilities/acestep/_operations/resolve_extract_params.py +24 -0
- kiapi/capabilities/acestep/_operations/resolve_generate_params.py +18 -0
- kiapi/capabilities/acestep/_operations/resolve_repaint_params.py +22 -0
- kiapi/capabilities/acestep/_schemas/ace_step_paths.py +29 -0
- kiapi/capabilities/acestep/_services/ace_step_engine.py +143 -0
- kiapi/capabilities/acestep/_settings.py +82 -0
- kiapi/capabilities/acestep/_views/ace_step_base.py +61 -0
- kiapi/capabilities/acestep/_views/cover_params.py +26 -0
- kiapi/capabilities/acestep/_views/cover_request.py +49 -0
- kiapi/capabilities/acestep/_views/extract_params.py +24 -0
- kiapi/capabilities/acestep/_views/extract_request.py +33 -0
- kiapi/capabilities/acestep/_views/generate_params.py +25 -0
- kiapi/capabilities/acestep/_views/generate_request.py +54 -0
- kiapi/capabilities/acestep/_views/repaint_params.py +27 -0
- kiapi/capabilities/acestep/_views/repaint_request.py +51 -0
- kiapi/capabilities/acestep/_views/track_params.py +7 -0
- kiapi/capabilities/acestep/worker_subprocess.py +247 -0
- kiapi/capabilities/audiogen/README.ja.md +49 -0
- kiapi/capabilities/audiogen/README.md +48 -0
- kiapi/capabilities/audiogen/__init__.py +25 -0
- kiapi/capabilities/audiogen/_constants/description.py +60 -0
- kiapi/capabilities/audiogen/_helpers/attach_audiogen_progress.py +27 -0
- kiapi/capabilities/audiogen/_helpers/register.py +42 -0
- kiapi/capabilities/audiogen/_helpers/validate_generate.py +14 -0
- kiapi/capabilities/audiogen/_models/audiogen.py +98 -0
- kiapi/capabilities/audiogen/_operations/handle_generate.py +27 -0
- kiapi/capabilities/audiogen/_operations/resolve_generate_params.py +25 -0
- kiapi/capabilities/audiogen/_settings.py +34 -0
- kiapi/capabilities/audiogen/_views/generate_params.py +14 -0
- kiapi/capabilities/audiogen/_views/generate_request.py +96 -0
- kiapi/capabilities/chat/README.ja.md +822 -0
- kiapi/capabilities/chat/README.md +806 -0
- kiapi/capabilities/chat/__init__.py +25 -0
- kiapi/capabilities/chat/_constants/description.py +163 -0
- kiapi/capabilities/chat/_helpers/register.py +67 -0
- kiapi/capabilities/chat/_models/qwen3_5.py +183 -0
- kiapi/capabilities/chat/_models/qwen3_omni.py +242 -0
- kiapi/capabilities/chat/_operations/apply_template.py +74 -0
- kiapi/capabilities/chat/_operations/completed_hermes_tool_call_text.py +9 -0
- kiapi/capabilities/chat/_operations/emit_streaming_response.py +297 -0
- kiapi/capabilities/chat/_operations/ensure_streaming_detokenizer_compat.py +49 -0
- kiapi/capabilities/chat/_operations/format_response.py +72 -0
- kiapi/capabilities/chat/_operations/handle_chat.py +25 -0
- kiapi/capabilities/chat/_operations/parse_hermes_tool_calls.py +63 -0
- kiapi/capabilities/chat/_operations/parse_json_tool_calls.py +66 -0
- kiapi/capabilities/chat/_operations/parse_messages.py +326 -0
- kiapi/capabilities/chat/_operations/resolve_chat_params.py +50 -0
- kiapi/capabilities/chat/_operations/stream_text_from_tokens.py +32 -0
- kiapi/capabilities/chat/_operations/strip_tool_calls.py +15 -0
- kiapi/capabilities/chat/_settings.py +74 -0
- kiapi/capabilities/chat/_utils/apply_parallel_tool_call_policy.py +17 -0
- kiapi/capabilities/chat/_utils/apply_seed.py +8 -0
- kiapi/capabilities/chat/_utils/load_audio_mono.py +31 -0
- kiapi/capabilities/chat/_utils/load_mlx_vlm.py +12 -0
- kiapi/capabilities/chat/_utils/warmup_params.py +26 -0
- kiapi/capabilities/chat/_views/chat_params.py +34 -0
- kiapi/capabilities/chat/_views/chat_request.py +153 -0
- kiapi/capabilities/depthpro/README.ja.md +131 -0
- kiapi/capabilities/depthpro/README.md +124 -0
- kiapi/capabilities/depthpro/__init__.py +23 -0
- kiapi/capabilities/depthpro/_constants/description.py +39 -0
- kiapi/capabilities/depthpro/_helpers/register.py +46 -0
- kiapi/capabilities/depthpro/_helpers/validate_estimate.py +32 -0
- kiapi/capabilities/depthpro/_models/depthpro.py +144 -0
- kiapi/capabilities/depthpro/_operations/handle_estimate.py +50 -0
- kiapi/capabilities/depthpro/_operations/is_quantize_override.py +12 -0
- kiapi/capabilities/depthpro/_operations/resolve_estimate_params.py +24 -0
- kiapi/capabilities/depthpro/_settings.py +46 -0
- kiapi/capabilities/depthpro/_views/estimate_params.py +21 -0
- kiapi/capabilities/depthpro/_views/estimate_request.py +63 -0
- kiapi/capabilities/embedding/README.ja.md +137 -0
- kiapi/capabilities/embedding/README.md +128 -0
- kiapi/capabilities/embedding/__init__.py +24 -0
- kiapi/capabilities/embedding/_constants/description.py +47 -0
- kiapi/capabilities/embedding/_helpers/register.py +66 -0
- kiapi/capabilities/embedding/_models/qwen3_text.py +53 -0
- kiapi/capabilities/embedding/_models/qwen3_vl.py +97 -0
- kiapi/capabilities/embedding/_operations/format_response.py +24 -0
- kiapi/capabilities/embedding/_operations/handle_embed.py +24 -0
- kiapi/capabilities/embedding/_operations/parse_inputs.py +108 -0
- kiapi/capabilities/embedding/_operations/resolve_embed_params.py +18 -0
- kiapi/capabilities/embedding/_settings.py +27 -0
- kiapi/capabilities/embedding/_utils/to_vector.py +20 -0
- kiapi/capabilities/embedding/_views/embed_params.py +17 -0
- kiapi/capabilities/embedding/_views/embed_request.py +39 -0
- kiapi/capabilities/ernie/README.ja.md +242 -0
- kiapi/capabilities/ernie/README.md +223 -0
- kiapi/capabilities/ernie/__init__.py +34 -0
- kiapi/capabilities/ernie/_constants/description.py +71 -0
- kiapi/capabilities/ernie/_helpers/register.py +60 -0
- kiapi/capabilities/ernie/_helpers/validate_edit.py +19 -0
- kiapi/capabilities/ernie/_helpers/validate_generate.py +8 -0
- kiapi/capabilities/ernie/_models/ernie.py +356 -0
- kiapi/capabilities/ernie/_operations/handle_edit.py +39 -0
- kiapi/capabilities/ernie/_operations/handle_generate.py +38 -0
- kiapi/capabilities/ernie/_operations/handle_train.py +77 -0
- kiapi/capabilities/ernie/_operations/is_quantize_override.py +16 -0
- kiapi/capabilities/ernie/_operations/resolve_edit_params.py +44 -0
- kiapi/capabilities/ernie/_operations/resolve_generate_params.py +40 -0
- kiapi/capabilities/ernie/_operations/resolve_lora_params.py +23 -0
- kiapi/capabilities/ernie/_operations/resolve_train_params.py +43 -0
- kiapi/capabilities/ernie/_operations/validate_common.py +33 -0
- kiapi/capabilities/ernie/_schemas/lora_ref.py +27 -0
- kiapi/capabilities/ernie/_settings.py +151 -0
- kiapi/capabilities/ernie/_views/edit_params.py +36 -0
- kiapi/capabilities/ernie/_views/edit_request.py +142 -0
- kiapi/capabilities/ernie/_views/generate_params.py +32 -0
- kiapi/capabilities/ernie/_views/generate_request.py +127 -0
- kiapi/capabilities/ernie/_views/train_params.py +28 -0
- kiapi/capabilities/ernie/_views/train_request.py +96 -0
- kiapi/capabilities/flux2/README.ja.md +260 -0
- kiapi/capabilities/flux2/README.md +241 -0
- kiapi/capabilities/flux2/__init__.py +36 -0
- kiapi/capabilities/flux2/_constants/description.py +81 -0
- kiapi/capabilities/flux2/_helpers/register.py +98 -0
- kiapi/capabilities/flux2/_helpers/validate_edit.py +12 -0
- kiapi/capabilities/flux2/_helpers/validate_generate.py +8 -0
- kiapi/capabilities/flux2/_models/flux2.py +396 -0
- kiapi/capabilities/flux2/_operations/handle_edit.py +44 -0
- kiapi/capabilities/flux2/_operations/handle_generate.py +46 -0
- kiapi/capabilities/flux2/_operations/handle_train.py +105 -0
- kiapi/capabilities/flux2/_operations/is_quantize_override.py +16 -0
- kiapi/capabilities/flux2/_operations/resolve_edit_params.py +43 -0
- kiapi/capabilities/flux2/_operations/resolve_generate_params.py +44 -0
- kiapi/capabilities/flux2/_operations/resolve_lora_params.py +23 -0
- kiapi/capabilities/flux2/_operations/resolve_train_params.py +42 -0
- kiapi/capabilities/flux2/_operations/role_spec.py +13 -0
- kiapi/capabilities/flux2/_operations/split_repo.py +11 -0
- kiapi/capabilities/flux2/_operations/validate_common.py +35 -0
- kiapi/capabilities/flux2/_schemas/lora_ref.py +27 -0
- kiapi/capabilities/flux2/_settings.py +181 -0
- kiapi/capabilities/flux2/_views/edit_params.py +36 -0
- kiapi/capabilities/flux2/_views/edit_request.py +145 -0
- kiapi/capabilities/flux2/_views/generate_params.py +36 -0
- kiapi/capabilities/flux2/_views/generate_request.py +150 -0
- kiapi/capabilities/flux2/_views/train_params.py +32 -0
- kiapi/capabilities/flux2/_views/train_request.py +102 -0
- kiapi/capabilities/ideogram4/README.ja.md +230 -0
- kiapi/capabilities/ideogram4/README.md +219 -0
- kiapi/capabilities/ideogram4/__init__.py +24 -0
- kiapi/capabilities/ideogram4/_constants/description.py +65 -0
- kiapi/capabilities/ideogram4/_helpers/register.py +44 -0
- kiapi/capabilities/ideogram4/_helpers/validate_generate.py +31 -0
- kiapi/capabilities/ideogram4/_models/ideogram4.py +120 -0
- kiapi/capabilities/ideogram4/_operations/handle_generate.py +30 -0
- kiapi/capabilities/ideogram4/_operations/is_quantize_override.py +12 -0
- kiapi/capabilities/ideogram4/_operations/resolve_generate_params.py +30 -0
- kiapi/capabilities/ideogram4/_settings.py +89 -0
- kiapi/capabilities/ideogram4/_views/generate_params.py +27 -0
- kiapi/capabilities/ideogram4/_views/generate_request.py +118 -0
- kiapi/capabilities/ltx2/README.ja.md +287 -0
- kiapi/capabilities/ltx2/README.md +274 -0
- kiapi/capabilities/ltx2/__init__.py +26 -0
- kiapi/capabilities/ltx2/_constants/description.py +81 -0
- kiapi/capabilities/ltx2/_helpers/register.py +58 -0
- kiapi/capabilities/ltx2/_helpers/validate_generate.py +42 -0
- kiapi/capabilities/ltx2/_models/ltx2.py +106 -0
- kiapi/capabilities/ltx2/_operations/detect_mode.py +19 -0
- kiapi/capabilities/ltx2/_operations/handle_generate.py +52 -0
- kiapi/capabilities/ltx2/_operations/resolve_generate_params.py +31 -0
- kiapi/capabilities/ltx2/_settings.py +93 -0
- kiapi/capabilities/ltx2/_views/generate_params.py +34 -0
- kiapi/capabilities/ltx2/_views/generate_request.py +151 -0
- kiapi/capabilities/qwen/README.ja.md +251 -0
- kiapi/capabilities/qwen/README.md +235 -0
- kiapi/capabilities/qwen/__init__.py +30 -0
- kiapi/capabilities/qwen/_constants/description.py +53 -0
- kiapi/capabilities/qwen/_helpers/register.py +60 -0
- kiapi/capabilities/qwen/_helpers/validate_edit.py +12 -0
- kiapi/capabilities/qwen/_helpers/validate_generate.py +12 -0
- kiapi/capabilities/qwen/_models/qwen.py +224 -0
- kiapi/capabilities/qwen/_operations/handle_edit.py +44 -0
- kiapi/capabilities/qwen/_operations/handle_generate.py +46 -0
- kiapi/capabilities/qwen/_operations/is_quantize_override.py +15 -0
- kiapi/capabilities/qwen/_operations/resolve_edit_params.py +35 -0
- kiapi/capabilities/qwen/_operations/resolve_generate_params.py +39 -0
- kiapi/capabilities/qwen/_operations/resolve_lora_params.py +23 -0
- kiapi/capabilities/qwen/_operations/validate_common.py +32 -0
- kiapi/capabilities/qwen/_schemas/lora_ref.py +27 -0
- kiapi/capabilities/qwen/_settings.py +107 -0
- kiapi/capabilities/qwen/_views/edit_params.py +36 -0
- kiapi/capabilities/qwen/_views/edit_request.py +138 -0
- kiapi/capabilities/qwen/_views/generate_params.py +37 -0
- kiapi/capabilities/qwen/_views/generate_request.py +149 -0
- kiapi/capabilities/seedvr2/README.ja.md +234 -0
- kiapi/capabilities/seedvr2/README.md +219 -0
- kiapi/capabilities/seedvr2/__init__.py +24 -0
- kiapi/capabilities/seedvr2/_constants/description.py +46 -0
- kiapi/capabilities/seedvr2/_helpers/register.py +60 -0
- kiapi/capabilities/seedvr2/_helpers/validate_upscale.py +52 -0
- kiapi/capabilities/seedvr2/_models/seedvr2.py +140 -0
- kiapi/capabilities/seedvr2/_operations/handle_upscale.py +42 -0
- kiapi/capabilities/seedvr2/_operations/is_quantize_override.py +12 -0
- kiapi/capabilities/seedvr2/_operations/resolve_upscale_params.py +30 -0
- kiapi/capabilities/seedvr2/_settings.py +74 -0
- kiapi/capabilities/seedvr2/_views/upscale_params.py +27 -0
- kiapi/capabilities/seedvr2/_views/upscale_request.py +94 -0
- kiapi/capabilities/web/README.ja.md +187 -0
- kiapi/capabilities/web/README.md +171 -0
- kiapi/capabilities/web/__init__.py +30 -0
- kiapi/capabilities/web/_constants/description.py +38 -0
- kiapi/capabilities/web/_exceptions/FetchError.py +24 -0
- kiapi/capabilities/web/_exceptions/SearchBackendError.py +11 -0
- kiapi/capabilities/web/_helpers/register.py +59 -0
- kiapi/capabilities/web/_models/crawl4ai.py +32 -0
- kiapi/capabilities/web/_models/searxng.py +44 -0
- kiapi/capabilities/web/_operations/handle_fetch.py +145 -0
- kiapi/capabilities/web/_operations/handle_search.py +56 -0
- kiapi/capabilities/web/_operations/resolve_fetch_params.py +19 -0
- kiapi/capabilities/web/_operations/resolve_search_params.py +34 -0
- kiapi/capabilities/web/_operations/resolve_searxng_config_dir.py +21 -0
- kiapi/capabilities/web/_services/__init__.py +1 -0
- kiapi/capabilities/web/_services/web_backend_process.py +144 -0
- kiapi/capabilities/web/_settings.py +138 -0
- kiapi/capabilities/web/_views/fetch_params.py +27 -0
- kiapi/capabilities/web/_views/fetch_request.py +29 -0
- kiapi/capabilities/web/_views/fetch_result.py +20 -0
- kiapi/capabilities/web/_views/search_params.py +43 -0
- kiapi/capabilities/web/_views/search_request.py +93 -0
- kiapi/capabilities/web/_views/search_response.py +49 -0
- kiapi/capabilities/web/resources/__init__.py +0 -0
- kiapi/capabilities/web/resources/searxng/__init__.py +0 -0
- kiapi/capabilities/web/resources/searxng/settings.yml +11 -0
- kiapi/capabilities/zimage/README.ja.md +249 -0
- kiapi/capabilities/zimage/README.md +231 -0
- kiapi/capabilities/zimage/__init__.py +34 -0
- kiapi/capabilities/zimage/_constants/description.py +73 -0
- kiapi/capabilities/zimage/_helpers/register.py +62 -0
- kiapi/capabilities/zimage/_helpers/validate_generate.py +37 -0
- kiapi/capabilities/zimage/_models/zimage.py +278 -0
- kiapi/capabilities/zimage/_operations/handle_generate.py +38 -0
- kiapi/capabilities/zimage/_operations/handle_train.py +78 -0
- kiapi/capabilities/zimage/_operations/is_quantize_override.py +11 -0
- kiapi/capabilities/zimage/_operations/resolve_generate_params.py +39 -0
- kiapi/capabilities/zimage/_operations/resolve_lora_params.py +23 -0
- kiapi/capabilities/zimage/_operations/resolve_train_params.py +38 -0
- kiapi/capabilities/zimage/_schemas/lora_ref.py +27 -0
- kiapi/capabilities/zimage/_settings.py +166 -0
- kiapi/capabilities/zimage/_views/generate_params.py +23 -0
- kiapi/capabilities/zimage/_views/generate_request.py +127 -0
- kiapi/capabilities/zimage/_views/train_params.py +22 -0
- kiapi/capabilities/zimage/_views/train_request.py +101 -0
- kiapi/cli/__init__.py +11 -0
- kiapi/cli/_helpers/dedupe_resources.py +12 -0
- kiapi/cli/_helpers/register_all_capabilities.py +36 -0
- kiapi/cli/_helpers/run_resources.py +24 -0
- kiapi/cli/_helpers/select_specs.py +67 -0
- kiapi/cli/activate/_operations/preflight_hf_access.py +129 -0
- kiapi/cli/activate/cli.py +37 -0
- kiapi/cli/check/_helpers/check_audio_acestep_turbo.py +22 -0
- kiapi/cli/check/_helpers/check_audio_acestep_xl_base.py +22 -0
- kiapi/cli/check/_helpers/check_audio_audiogen_medium.py +24 -0
- kiapi/cli/check/_helpers/check_chat_chat_qwen3_6_27b.py +19 -0
- kiapi/cli/check/_helpers/check_chat_chat_qwen3_omni.py +19 -0
- kiapi/cli/check/_helpers/check_embedding_embedding_qwen3_embedding_8b.py +14 -0
- kiapi/cli/check/_helpers/check_embedding_embedding_qwen3_vl_embedding_2b.py +19 -0
- kiapi/cli/check/_helpers/check_image_depthpro_base.py +21 -0
- kiapi/cli/check/_helpers/check_image_ernie_base.py +23 -0
- kiapi/cli/check/_helpers/check_image_ernie_turbo.py +23 -0
- kiapi/cli/check/_helpers/check_image_flux2_klein_9b.py +23 -0
- kiapi/cli/check/_helpers/check_image_flux2_klein_base_4b.py +23 -0
- kiapi/cli/check/_helpers/check_image_flux2_klein_base_9b.py +23 -0
- kiapi/cli/check/_helpers/check_image_ideogram4_fp8.py +23 -0
- kiapi/cli/check/_helpers/check_image_qwen_edit_2509.py +27 -0
- kiapi/cli/check/_helpers/check_image_qwen_image.py +23 -0
- kiapi/cli/check/_helpers/check_image_seedvr2_3b.py +23 -0
- kiapi/cli/check/_helpers/check_image_seedvr2_7b.py +23 -0
- kiapi/cli/check/_helpers/check_image_zimage_base.py +23 -0
- kiapi/cli/check/_helpers/check_image_zimage_turbo.py +23 -0
- kiapi/cli/check/_helpers/check_video_ltx2_distilled.py +26 -0
- kiapi/cli/check/_helpers/check_web_web_fetch.py +14 -0
- kiapi/cli/check/_helpers/check_web_web_search.py +14 -0
- kiapi/cli/check/_operations/build_check_result.py +20 -0
- kiapi/cli/check/_operations/check_context.py +10 -0
- kiapi/cli/check/_operations/create_sample_image.py +46 -0
- kiapi/cli/check/_schemas/check_result.py +12 -0
- kiapi/cli/check/cli.py +89 -0
- kiapi/cli/cli.py +29 -0
- kiapi/cli/config/cli.py +17 -0
- kiapi/cli/config/edit/cli.py +32 -0
- kiapi/cli/config/init/cli.py +33 -0
- kiapi/cli/config/show/cli.py +13 -0
- kiapi/cli/config/template/cli.py +36 -0
- kiapi/cli/deactivate/cli.py +49 -0
- kiapi/cli/run/asgi.py +16 -0
- kiapi/cli/run/cli.py +59 -0
- kiapi/cli/service/__init__.py +5 -0
- kiapi/cli/service/_services/service_manager.py +107 -0
- kiapi/cli/service/cli.py +19 -0
- kiapi/cli/service/install/cli.py +17 -0
- kiapi/cli/service/start/cli.py +22 -0
- kiapi/cli/service/status/cli.py +81 -0
- kiapi/cli/service/stop/cli.py +19 -0
- kiapi/cli/service/uninstall/cli.py +16 -0
- kiapi/cli/status/cli.py +226 -0
- kiapi/core/app/__init__.py +16 -0
- kiapi/core/app/_schemas/app_context.py +28 -0
- kiapi/core/app/_services/user_directory.py +59 -0
- kiapi/core/app/_settings.py +46 -0
- kiapi/core/capability/__init__.py +11 -0
- kiapi/core/capability/_schemas/capability_spec.py +17 -0
- kiapi/core/capability/_services/capability_spec_registry.py +21 -0
- kiapi/core/config/__init__.py +11 -0
- kiapi/core/config/_exceptions/user_config_error.py +2 -0
- kiapi/core/config/_helpers/get_user_settings_path.py +7 -0
- kiapi/core/config/_helpers/load_user_settings.py +54 -0
- kiapi/core/file/__init__.py +37 -0
- kiapi/core/file/_helpers/create_file_store.py +7 -0
- kiapi/core/file/_helpers/resolve_file_ref.py +90 -0
- kiapi/core/file/_schemas/file_data_url_ref.py +19 -0
- kiapi/core/file/_schemas/file_id_ref.py +16 -0
- kiapi/core/file/_schemas/file_record.py +46 -0
- kiapi/core/file/_schemas/file_url_ref.py +16 -0
- kiapi/core/file/_services/file_store.py +138 -0
- kiapi/core/file/_settings.py +22 -0
- kiapi/core/file/_types/file_id.py +2 -0
- kiapi/core/file/_types/file_ref.py +12 -0
- kiapi/core/file/_views/resolved_file_ref.py +16 -0
- kiapi/core/job/__init__.py +24 -0
- kiapi/core/job/_enums/job_status.py +9 -0
- kiapi/core/job/_helpers/creep_progress.py +123 -0
- kiapi/core/job/_models/job.py +121 -0
- kiapi/core/job/_services/job_store.py +33 -0
- kiapi/core/job/_services/progress_reporter.py +79 -0
- kiapi/core/job/_types/job_id.py +3 -0
- kiapi/core/job/_types/job_result.py +5 -0
- kiapi/core/job/_types/job_type.py +4 -0
- kiapi/core/logging/__init__.py +14 -0
- kiapi/core/logging/_helpers/get_log_level.py +8 -0
- kiapi/core/logging/_helpers/setup_logger.py +14 -0
- kiapi/core/logging/_settings.py +34 -0
- kiapi/core/logging/_types/log_level.py +3 -0
- kiapi/core/memory/__init__.py +21 -0
- kiapi/core/memory/_exceptions/memory_budget_error.py +2 -0
- kiapi/core/memory/_helpers/create_memory_manager.py +17 -0
- kiapi/core/memory/_operations/log_memory_limit.py +29 -0
- kiapi/core/memory/_operations/resolve_effective_memory_limit_gb.py +13 -0
- kiapi/core/memory/_operations/resolve_framework_strategy.py +42 -0
- kiapi/core/memory/_schemas/framework_strategy.py +14 -0
- kiapi/core/memory/_schemas/memory_stats.py +24 -0
- kiapi/core/memory/_schemas/resident_model.py +14 -0
- kiapi/core/memory/_schemas/resident_model_stats.py +49 -0
- kiapi/core/memory/_services/memory_manager.py +257 -0
- kiapi/core/memory/_settings.py +36 -0
- kiapi/core/memory/_types/framework_name.py +4 -0
- kiapi/core/memory/_types/resident_key.py +4 -0
- kiapi/core/model/__init__.py +36 -0
- kiapi/core/model/_exceptions/unknown_model_error.py +2 -0
- kiapi/core/model/_schemas/model_spec.py +145 -0
- kiapi/core/model/_services/model_registry.py +85 -0
- kiapi/core/model/_types/model_alias.py +2 -0
- kiapi/core/model/_types/model_domain.py +6 -0
- kiapi/core/model/_types/model_family.py +5 -0
- kiapi/core/model/_types/model_key.py +8 -0
- kiapi/core/model/_types/model_name.py +4 -0
- kiapi/core/model/_types/model_repo.py +3 -0
- kiapi/core/net/__init__.py +16 -0
- kiapi/core/net/_exceptions/unsafe_url_error.py +7 -0
- kiapi/core/net/_helpers/verify_public_url.py +68 -0
- kiapi/core/net/_settings.py +28 -0
- kiapi/core/setup/__init__.py +25 -0
- kiapi/core/setup/_exceptions/setup_required_error.py +2 -0
- kiapi/core/setup/_schemas/docker_image_resource.py +37 -0
- kiapi/core/setup/_schemas/hf_snapshot_resource.py +50 -0
- kiapi/core/setup/_schemas/local_path_resource.py +43 -0
- kiapi/core/setup/_schemas/python_package_resource.py +58 -0
- kiapi/core/setup/_schemas/python_venv_resource.py +63 -0
- kiapi/core/setup/_schemas/setup_status.py +7 -0
- kiapi/core/setup/_schemas/url_file_resource.py +43 -0
- kiapi/core/setup/_services/setup_manager.py +331 -0
- kiapi/core/setup/_types/setup_resource.py +21 -0
- kiapi/core/setup/_types/setup_target.py +11 -0
- kiapi/core/workdir/__init__.py +8 -0
- kiapi/core/workdir/_helpers/create_work_dir.py +11 -0
- kiapi/core/workdir/_settings.py +21 -0
- kiapi/core/worker/__init__.py +23 -0
- kiapi/core/worker/_helpers/create_worker.py +9 -0
- kiapi/core/worker/_services/worker.py +165 -0
- kiapi/core/worker/_settings.py +36 -0
- kiapi/core/worker/_types/job_thunk.py +6 -0
- kiapi-0.1.0.dist-info/METADATA +337 -0
- kiapi-0.1.0.dist-info/RECORD +465 -0
- kiapi-0.1.0.dist-info/WHEEL +4 -0
- kiapi-0.1.0.dist-info/entry_points.txt +2 -0
- kiapi-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# ernie
|
|
2
|
+
|
|
3
|
+
[English](README.md) | **日本語**
|
|
4
|
+
|
|
5
|
+
[mflux ERNIE-Image](https://github.com/filipstrand/mflux/blob/main/src/mflux/models/ernie_image/README.md) で、画像生成・画像編集・LoRA ファインチューニング機能を提供します。
|
|
6
|
+
|
|
7
|
+
- **generate**: テキストから画像を生成
|
|
8
|
+
- **edit**: Files API の単一画像をプロンプトで編集
|
|
9
|
+
- **train**: キャプション付き画像 ZIP から LoRA アダプタを学習
|
|
10
|
+
|
|
11
|
+
## API
|
|
12
|
+
|
|
13
|
+
| Endpoint | Name | Description |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `POST /v1/image/ernie/generate` | 画像生成 | プロンプトから画像を生成。 |
|
|
16
|
+
| `POST /v1/image/ernie/edit` | 画像編集 | Files API の単一画像をプロンプトで img2img 編集。 |
|
|
17
|
+
| `POST /v1/image/ernie/train` | LoRA 学習 | キャプション付き画像 ZIP から LoRA アダプタを学習。常に async。 |
|
|
18
|
+
| `GET /v1/image/ernie/models` | モデル一覧 | 利用可能なモデルの一覧を返す。 |
|
|
19
|
+
| `GET /v1/image/ernie/openapi.json` | OpenAPI | 詳細な入出力仕様、使い方、TIPS を返す。 |
|
|
20
|
+
|
|
21
|
+
## API Docs
|
|
22
|
+
|
|
23
|
+
- [OpenAPI JSON](https://kiarina.github.io/kiapi/v1/image/ernie/openapi.json)
|
|
24
|
+
- [Swagger UI](https://kiarina.github.io/kiapi/v1/image/ernie/docs.html)
|
|
25
|
+
- [ReDoc](https://kiarina.github.io/kiapi/v1/image/ernie/redoc.html)
|
|
26
|
+
|
|
27
|
+
## Dependencies
|
|
28
|
+
|
|
29
|
+
| Package | License | Description |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| [mflux](https://github.com/filipstrand/mflux) | MIT | ERNIE-Image の MLX 実装と LoRA 学習機能を利用。 |
|
|
32
|
+
|
|
33
|
+
## Models
|
|
34
|
+
|
|
35
|
+
| Model | License | Terms | Size | Description |
|
|
36
|
+
|---|---|---|---:|---|
|
|
37
|
+
| [baidu/ERNIE-Image-Turbo](https://huggingface.co/baidu/ERNIE-Image-Turbo) | Apache-2.0 | 不要 | 31.6 GB | `turbo`(デフォルト)。蒸留 8 ステップモデル。既定は `steps: 8`、`guidance: 1.0`、`quantize: 8`。 |
|
|
38
|
+
| [baidu/ERNIE-Image](https://huggingface.co/baidu/ERNIE-Image) | Apache-2.0 | 不要 | 31.6 GB | `base`。非 distilled のモデル。既定は `steps: 50`、`guidance: 4.0`、`quantize: 8`。 |
|
|
39
|
+
|
|
40
|
+
## Notes
|
|
41
|
+
|
|
42
|
+
- **画像サイズ**:
|
|
43
|
+
`width` / `height` は 16 の倍数で、既定は `1024x1024`、上限は `2048x2048` です。
|
|
44
|
+
- **edit の正方形ガード**:
|
|
45
|
+
`mflux==0.18.0` では ERNIE img2img の一部の非正方形サイズが latent packing で
|
|
46
|
+
失敗することがあります。kiapi はデフォルトで `edit` の `width == height` を要求します。
|
|
47
|
+
無効にするには `KIAPI_ERNIE_EDIT_REQUIRE_SQUARE=0` を設定します。
|
|
48
|
+
- **steps / quantize**:
|
|
49
|
+
`steps` は `1..100`。`quantize` は `3` / `4` / `5` / `6` / `8` / `null` を使います。
|
|
50
|
+
`quantize` を省略するとモデルごとの既定値を使います。
|
|
51
|
+
- **LoRA 適用**:
|
|
52
|
+
`generate` / `edit` の `loras` には `[{ "file_id": "...", "scale": 1.0 }]` を渡します。
|
|
53
|
+
既定では最大 4 個まで適用できます。
|
|
54
|
+
- **LoRA 学習データセット**:
|
|
55
|
+
ZIP のトップレベル、または ZIP 内の単一サブフォルダに画像を置きます。画像ごとに
|
|
56
|
+
同じ語幹の `.txt` キャプションが必要です。`preview*` で始まる画像はキャプション
|
|
57
|
+
必須チェックから除外されます。
|
|
58
|
+
|
|
59
|
+
## Quickstart
|
|
60
|
+
|
|
61
|
+
### generate - テキストから画像生成
|
|
62
|
+
|
|
63
|
+
Job JSON を返す:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
PARAMS=$(
|
|
67
|
+
jq -n \
|
|
68
|
+
--arg prompt "A quiet Japanese garden after rain, soft morning light, detailed watercolor" \
|
|
69
|
+
'{
|
|
70
|
+
model: "turbo",
|
|
71
|
+
mode: "sync",
|
|
72
|
+
prompt: $prompt,
|
|
73
|
+
width: 1024,
|
|
74
|
+
height: 1024,
|
|
75
|
+
steps: 8,
|
|
76
|
+
seed: 404
|
|
77
|
+
}'
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
|
|
81
|
+
-H 'Accept: application/json' \
|
|
82
|
+
-H 'Content-Type: application/json' \
|
|
83
|
+
--data-binary "$PARAMS" | jq .
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
画像だけを保存する:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
PARAMS=$(
|
|
90
|
+
jq -n \
|
|
91
|
+
--arg prompt "A barn owl portrait on a mossy branch, natural wildlife photography" \
|
|
92
|
+
'{
|
|
93
|
+
model: "turbo",
|
|
94
|
+
mode: "sync",
|
|
95
|
+
prompt: $prompt,
|
|
96
|
+
width: 512,
|
|
97
|
+
height: 512,
|
|
98
|
+
steps: 8,
|
|
99
|
+
seed: 404
|
|
100
|
+
}'
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
|
|
104
|
+
-H 'Content-Type: application/json' \
|
|
105
|
+
--data-binary "$PARAMS" \
|
|
106
|
+
-o ernie.png
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### edit - 単一画像を編集
|
|
110
|
+
|
|
111
|
+
先に入力画像をアップロードする:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
IMG=$(curl -sS -X POST http://localhost:${PORT:-8000}/v1/files \
|
|
115
|
+
-F "file=@tests/assets/miineko.png;type=image/png" | jq -r .file_id)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
アップロードした画像を編集する:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
PARAMS=$(
|
|
122
|
+
jq -n \
|
|
123
|
+
--arg image "$IMG" \
|
|
124
|
+
--arg prompt "Turn this image into a soft watercolor illustration" \
|
|
125
|
+
'{
|
|
126
|
+
model: "turbo",
|
|
127
|
+
mode: "sync",
|
|
128
|
+
prompt: $prompt,
|
|
129
|
+
image: {type: "file_id", file_id: $image},
|
|
130
|
+
image_strength: 0.55,
|
|
131
|
+
width: 512,
|
|
132
|
+
height: 512,
|
|
133
|
+
steps: 8,
|
|
134
|
+
seed: 42
|
|
135
|
+
}'
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/edit \
|
|
139
|
+
-H 'Content-Type: application/json' \
|
|
140
|
+
--data-binary "$PARAMS" \
|
|
141
|
+
-o ernie_edit.png
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
`image_strength` は `0..1`。小さいほど元画像を強く残し、大きいほどプロンプト側の
|
|
145
|
+
変化が強くなります。
|
|
146
|
+
|
|
147
|
+
### async
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
PARAMS=$(
|
|
151
|
+
jq -n \
|
|
152
|
+
--arg prompt "A small robot reading a book in a cozy library" \
|
|
153
|
+
'{
|
|
154
|
+
model: "turbo",
|
|
155
|
+
mode: "async",
|
|
156
|
+
prompt: $prompt,
|
|
157
|
+
width: 512,
|
|
158
|
+
height: 512,
|
|
159
|
+
seed: 7
|
|
160
|
+
}'
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
JOB=$(curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
|
|
164
|
+
-H 'Accept: application/json' \
|
|
165
|
+
-H 'Content-Type: application/json' \
|
|
166
|
+
--data-binary "$PARAMS" | jq -r .job_id)
|
|
167
|
+
|
|
168
|
+
curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq .
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
完了後、Job の `artifacts[0]` または `result.file_id` を使って画像を取得します。
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
FID=$(curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq -r .result.file_id)
|
|
175
|
+
curl -sS http://localhost:${PORT:-8000}/v1/files/$FID/download -o ernie_async.png
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### train - LoRA ファインチューニング
|
|
179
|
+
|
|
180
|
+
画像と同じ語幹の `.txt` キャプションを含む ZIP データセットを用意します。
|
|
181
|
+
|
|
182
|
+
```text
|
|
183
|
+
dataset/
|
|
184
|
+
sample_00.png
|
|
185
|
+
sample_00.txt
|
|
186
|
+
sample_01.png
|
|
187
|
+
sample_01.txt
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
データセットをアップロードして学習を開始します。
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
DATASET_ID=$(curl -sS -X POST http://localhost:${PORT:-8000}/v1/files \
|
|
194
|
+
-F "file=@dataset.zip;type=application/zip" | jq -r .file_id)
|
|
195
|
+
|
|
196
|
+
JOB=$(
|
|
197
|
+
jq -n \
|
|
198
|
+
--arg dataset "$DATASET_ID" \
|
|
199
|
+
'{
|
|
200
|
+
model: "turbo",
|
|
201
|
+
dataset: {type: "file_id", file_id: $dataset},
|
|
202
|
+
num_epochs: 1,
|
|
203
|
+
lora_rank: 16,
|
|
204
|
+
max_resolution: 512
|
|
205
|
+
}' |
|
|
206
|
+
curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/train \
|
|
207
|
+
-H 'Content-Type: application/json' \
|
|
208
|
+
--data-binary @- |
|
|
209
|
+
jq -r .job_id
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq .
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
完了後、`result.adapter_file_id` が学習済みアダプタです。
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
ADAPTER=$(curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq -r .result.adapter_file_id)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
生成や編集で LoRA を適用します。
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
PARAMS=$(
|
|
225
|
+
jq -n \
|
|
226
|
+
--arg adapter "$ADAPTER" \
|
|
227
|
+
--arg prompt "portrait in the trained character style" \
|
|
228
|
+
'{
|
|
229
|
+
model: "turbo",
|
|
230
|
+
mode: "sync",
|
|
231
|
+
prompt: $prompt,
|
|
232
|
+
width: 512,
|
|
233
|
+
height: 512,
|
|
234
|
+
loras: [{file: {type: "file_id", file_id: $adapter}, scale: 1.0}]
|
|
235
|
+
}'
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
|
|
239
|
+
-H 'Content-Type: application/json' \
|
|
240
|
+
--data-binary "$PARAMS" \
|
|
241
|
+
-o ernie_lora.png
|
|
242
|
+
```
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# ernie
|
|
2
|
+
|
|
3
|
+
**English** | [日本語](README.ja.md)
|
|
4
|
+
|
|
5
|
+
[mflux ERNIE-Image](https://github.com/filipstrand/mflux/blob/main/src/mflux/models/ernie_image/README.md) provides image generation, image editing, and LoRA fine tuning functions.
|
|
6
|
+
|
|
7
|
+
- **generate**: Generate image from text
|
|
8
|
+
- **edit**: Prompt editing of single image in Files API
|
|
9
|
+
- **train**: Train LoRA adapter from captioned image ZIP
|
|
10
|
+
|
|
11
|
+
## API
|
|
12
|
+
|
|
13
|
+
| Endpoint | Name | Description |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `POST /v1/image/ernie/generate` | Image generation | Generate image from prompt. |
|
|
16
|
+
| `POST /v1/image/ernie/edit` | Image editing | Files API single image prompt img2img editing. |
|
|
17
|
+
| `POST /v1/image/ernie/train` | LoRA learning | Learning LoRA adapter from captioned image ZIP. Always async. |
|
|
18
|
+
| `GET /v1/image/ernie/models` | Model list | Returns a list of available models. |
|
|
19
|
+
| `GET /v1/image/ernie/openapi.json` | OpenAPI | Returns detailed input/output specifications, usage, and TIPS. |
|
|
20
|
+
|
|
21
|
+
## API Docs
|
|
22
|
+
|
|
23
|
+
- [OpenAPI JSON](https://kiarina.github.io/kiapi/v1/image/ernie/openapi.json)
|
|
24
|
+
- [Swagger UI](https://kiarina.github.io/kiapi/v1/image/ernie/docs.html)
|
|
25
|
+
- [ReDoc](https://kiarina.github.io/kiapi/v1/image/ernie/redoc.html)
|
|
26
|
+
|
|
27
|
+
## Dependencies
|
|
28
|
+
|
|
29
|
+
| Package | License | Description |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| [mflux](https://github.com/filipstrand/mflux) | MIT | Uses ERNIE-Image's MLX implementation and LoRA learning function. |
|
|
32
|
+
|
|
33
|
+
## Models
|
|
34
|
+
|
|
35
|
+
| Model | License | Terms | Size | Description |
|
|
36
|
+
|---|---|---|---:|---|
|
|
37
|
+
| [baidu/ERNIE-Image-Turbo](https://huggingface.co/baidu/ERNIE-Image-Turbo) | Apache-2.0 | Not required | 31.6 GB | `turbo` (default). Distillation 8 step model. Defaults are `steps: 8`, `guidance: 1.0`, `quantize: 8`. |
|
|
38
|
+
| [baidu/ERNIE-Image](https://huggingface.co/baidu/ERNIE-Image) | Apache-2.0 | Not required | 31.6 GB | `base`. Non-distilled model. Defaults are `steps: 50`, `guidance: 4.0`, `quantize: 8`. |
|
|
39
|
+
|
|
40
|
+
## Notes
|
|
41
|
+
|
|
42
|
+
- **Image size**:
|
|
43
|
+
`width` / `height` are multiples of 16, default is `1024x1024`, upper limit is `2048x2048`.
|
|
44
|
+
- **edit square guard**:
|
|
45
|
+
With `mflux==0.18.0`, some non-square sizes of ERNIE img2img are latent packing.
|
|
46
|
+
It may fail. kiapi requires `width == height` for `edit` by default.
|
|
47
|
+
To disable it, set `KIAPI_ERNIE_EDIT_REQUIRE_SQUARE=0`.
|
|
48
|
+
- **steps/quantize**:
|
|
49
|
+
`steps` is `1..100`. `quantize` uses `3` / `4` / `5` / `6` / `8` / `null`.
|
|
50
|
+
If `quantize` is omitted, the default value for each model will be used.
|
|
51
|
+
- **LoRA applied**:
|
|
52
|
+
Pass `[{ "file_id": "...", "scale": 1.0 }]` to `loras` of `generate` / `edit`.
|
|
53
|
+
By default, up to 4 can be applied.
|
|
54
|
+
- **LoRA training dataset**:
|
|
55
|
+
Place images at the top level of the ZIP or in a single subfolder within the ZIP. per image
|
|
56
|
+
Requires a `.txt` caption with the same stem. Images starting with `preview*` are captions.
|
|
57
|
+
Excluded from mandatory checks.
|
|
58
|
+
|
|
59
|
+
## Quickstart
|
|
60
|
+
|
|
61
|
+
### generate - generate image from text
|
|
62
|
+
|
|
63
|
+
Returns Job JSON:
|
|
64
|
+
```bash
|
|
65
|
+
PARAMS=$(
|
|
66
|
+
jq -n \
|
|
67
|
+
--arg prompt "A quiet Japanese garden after rain, soft morning light, detailed watercolor" \
|
|
68
|
+
'{
|
|
69
|
+
model: "turbo",
|
|
70
|
+
mode: "sync",
|
|
71
|
+
prompt: $prompt,
|
|
72
|
+
width: 1024,
|
|
73
|
+
height: 1024,
|
|
74
|
+
steps: 8,
|
|
75
|
+
seed: 404
|
|
76
|
+
}'
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
|
|
80
|
+
-H 'Accept: application/json' \
|
|
81
|
+
-H 'Content-Type: application/json' \
|
|
82
|
+
--data-binary "$PARAMS" | jq .
|
|
83
|
+
```
|
|
84
|
+
Save only the image:
|
|
85
|
+
```bash
|
|
86
|
+
PARAMS=$(
|
|
87
|
+
jq -n \
|
|
88
|
+
--arg prompt "A barn owl portrait on a mossy branch, natural wildlife photography" \
|
|
89
|
+
'{
|
|
90
|
+
model: "turbo",
|
|
91
|
+
mode: "sync",
|
|
92
|
+
prompt: $prompt,
|
|
93
|
+
width: 512,
|
|
94
|
+
height: 512,
|
|
95
|
+
steps: 8,
|
|
96
|
+
seed: 404
|
|
97
|
+
}'
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
|
|
101
|
+
-H 'Content-Type: application/json' \
|
|
102
|
+
--data-binary "$PARAMS" \
|
|
103
|
+
-o ernie.png
|
|
104
|
+
```
|
|
105
|
+
### edit - edit a single image
|
|
106
|
+
|
|
107
|
+
Upload the input image first:
|
|
108
|
+
```bash
|
|
109
|
+
IMG=$(curl -sS -X POST http://localhost:${PORT:-8000}/v1/files \
|
|
110
|
+
-F "file=@tests/assets/miineko.png;type=image/png" | jq -r .file_id)
|
|
111
|
+
```
|
|
112
|
+
Edit the uploaded image:
|
|
113
|
+
```bash
|
|
114
|
+
PARAMS=$(
|
|
115
|
+
jq -n \
|
|
116
|
+
--arg image "$IMG" \
|
|
117
|
+
--arg prompt "Turn this image into a soft watercolor illustration" \
|
|
118
|
+
'{
|
|
119
|
+
model: "turbo",
|
|
120
|
+
mode: "sync",
|
|
121
|
+
prompt: $prompt,
|
|
122
|
+
image: {type: "file_id", file_id: $image},
|
|
123
|
+
image_strength: 0.55,
|
|
124
|
+
width: 512,
|
|
125
|
+
height: 512,
|
|
126
|
+
steps: 8,
|
|
127
|
+
seed: 42
|
|
128
|
+
}'
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/edit \
|
|
132
|
+
-H 'Content-Type: application/json' \
|
|
133
|
+
--data-binary "$PARAMS" \
|
|
134
|
+
-o ernie_edit.png
|
|
135
|
+
```
|
|
136
|
+
`image_strength` is `0..1`. The smaller the value, the stronger the original image will remain; the larger the value, the more the prompt side will remain.
|
|
137
|
+
The changes will become stronger.
|
|
138
|
+
|
|
139
|
+
###async
|
|
140
|
+
```bash
|
|
141
|
+
PARAMS=$(
|
|
142
|
+
jq -n \
|
|
143
|
+
--arg prompt "A small robot reading a book in a cozy library" \
|
|
144
|
+
'{
|
|
145
|
+
model: "turbo",
|
|
146
|
+
mode: "async",
|
|
147
|
+
prompt: $prompt,
|
|
148
|
+
width: 512,
|
|
149
|
+
height: 512,
|
|
150
|
+
seed: 7
|
|
151
|
+
}'
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
JOB=$(curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
|
|
155
|
+
-H 'Accept: application/json' \
|
|
156
|
+
-H 'Content-Type: application/json' \
|
|
157
|
+
--data-binary "$PARAMS" | jq -r .job_id)
|
|
158
|
+
|
|
159
|
+
curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq .
|
|
160
|
+
```
|
|
161
|
+
After completion, use the Job's `artifacts[0]` or `result.file_id` to get the image.
|
|
162
|
+
```bash
|
|
163
|
+
FID=$(curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq -r .result.file_id)
|
|
164
|
+
curl -sS http://localhost:${PORT:-8000}/v1/files/$FID/download -o ernie_async.png
|
|
165
|
+
```
|
|
166
|
+
### train - LoRA Fine Tuning
|
|
167
|
+
|
|
168
|
+
Prepare a ZIP dataset containing a `.txt` caption with the same stem as the image.
|
|
169
|
+
```text
|
|
170
|
+
dataset/
|
|
171
|
+
sample_00.png
|
|
172
|
+
sample_00.txt
|
|
173
|
+
sample_01.png
|
|
174
|
+
sample_01.txt
|
|
175
|
+
```
|
|
176
|
+
Upload your dataset and start training.
|
|
177
|
+
```bash
|
|
178
|
+
DATASET_ID=$(curl -sS -X POST http://localhost:${PORT:-8000}/v1/files \
|
|
179
|
+
-F "file=@dataset.zip;type=application/zip" | jq -r .file_id)
|
|
180
|
+
|
|
181
|
+
JOB=$(
|
|
182
|
+
jq -n \
|
|
183
|
+
--arg dataset "$DATASET_ID" \
|
|
184
|
+
'{
|
|
185
|
+
model: "turbo",
|
|
186
|
+
dataset: {type: "file_id", file_id: $dataset},
|
|
187
|
+
num_epochs: 1,
|
|
188
|
+
lora_rank: 16,
|
|
189
|
+
max_resolution: 512
|
|
190
|
+
}' |
|
|
191
|
+
curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/train \
|
|
192
|
+
-H 'Content-Type: application/json' \
|
|
193
|
+
--data-binary @- |
|
|
194
|
+
jq -r .job_id
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq .
|
|
198
|
+
```
|
|
199
|
+
After completion, `result.adapter_file_id` is the learned adapter.
|
|
200
|
+
```bash
|
|
201
|
+
ADAPTER=$(curl -sS http://localhost:${PORT:-8000}/v1/jobs/$JOB | jq -r .result.adapter_file_id)
|
|
202
|
+
```
|
|
203
|
+
Apply LoRA during generation and editing.
|
|
204
|
+
```bash
|
|
205
|
+
PARAMS=$(
|
|
206
|
+
jq -n \
|
|
207
|
+
--arg adapter "$ADAPTER" \
|
|
208
|
+
--arg prompt "portrait in the trained character style" \
|
|
209
|
+
'{
|
|
210
|
+
model: "turbo",
|
|
211
|
+
mode: "sync",
|
|
212
|
+
prompt: $prompt,
|
|
213
|
+
width: 512,
|
|
214
|
+
height: 512,
|
|
215
|
+
loras: [{file: {type: "file_id", file_id: $adapter}, scale: 1.0}]
|
|
216
|
+
}'
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
curl -sS -X POST http://localhost:${PORT:-8000}/v1/image/ernie/generate \
|
|
220
|
+
-H 'Content-Type: application/json' \
|
|
221
|
+
--data-binary "$PARAMS" \
|
|
222
|
+
-o ernie_lora.png
|
|
223
|
+
```
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""ernie family — ERNIE-Image generation/edit/LoRA-training via mflux.
|
|
2
|
+
|
|
3
|
+
Endpoints: ``POST /v1/image/ernie/{generate,edit,train}``. ``generate`` is
|
|
4
|
+
text-to-image, ``edit`` is single-image img2img, and ``train`` LoRA-finetunes on
|
|
5
|
+
captioned images (always async). LoRA adapters and a ``quantize`` override run on
|
|
6
|
+
a one-off transient model; otherwise the resident model is used.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from kiapi.capabilities import ValidationError
|
|
10
|
+
|
|
11
|
+
from ._helpers.register import register
|
|
12
|
+
from ._helpers.validate_edit import validate_edit
|
|
13
|
+
from ._helpers.validate_generate import validate_generate
|
|
14
|
+
from ._operations.handle_edit import handle_edit
|
|
15
|
+
from ._operations.handle_generate import handle_generate
|
|
16
|
+
from ._operations.handle_train import handle_train
|
|
17
|
+
from ._settings import settings_manager
|
|
18
|
+
from ._views.edit_request import EditRequest
|
|
19
|
+
from ._views.generate_request import GenerateRequest
|
|
20
|
+
from ._views.train_request import TrainRequest
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
"EditRequest", # ._views
|
|
24
|
+
"GenerateRequest", # ._views
|
|
25
|
+
"TrainRequest", # ._views
|
|
26
|
+
"ValidationError", # kiapi.capabilities
|
|
27
|
+
"handle_edit", # ._operations
|
|
28
|
+
"handle_generate", # ._operations
|
|
29
|
+
"handle_train", # ._operations
|
|
30
|
+
"register", # ._helpers
|
|
31
|
+
"settings_manager", # ._settings
|
|
32
|
+
"validate_edit", # ._helpers
|
|
33
|
+
"validate_generate", # ._helpers
|
|
34
|
+
]
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
DESCRIPTION = """Image generation, editing, and LoRA training (ERNIE-Image via mflux).
|
|
2
|
+
|
|
3
|
+
Three operations on Baidu's ERNIE-Image models: `/generate` (text-to-image),
|
|
4
|
+
`/edit` (single-image image-to-image), and `/train` (LoRA finetune).
|
|
5
|
+
|
|
6
|
+
## Upstream docs
|
|
7
|
+
- [mflux — ERNIE-Image](https://github.com/filipstrand/mflux/blob/main/src/mflux/models/ernie_image/README.md) — the MLX engine kiapi runs
|
|
8
|
+
- [baidu/ERNIE-Image-Turbo](https://huggingface.co/baidu/ERNIE-Image-Turbo) — `turbo` weights
|
|
9
|
+
- [baidu/ERNIE-Image](https://huggingface.co/baidu/ERNIE-Image) — `base` weights
|
|
10
|
+
|
|
11
|
+
## Models
|
|
12
|
+
- **turbo** (default) — `baidu/ERNIE-Image-Turbo`. Fast, few steps (default 8),
|
|
13
|
+
guidance 1.0. The everyday choice.
|
|
14
|
+
- **base** — `baidu/ERNIE-Image`. Higher quality but slower: more steps
|
|
15
|
+
(default 50) and stronger guidance (default 4.0).
|
|
16
|
+
|
|
17
|
+
Pick the variant with `model` (aliases like `ernie-image-turbo` are accepted);
|
|
18
|
+
discover variants at `GET /v1/image/ernie/models`. Variant-dependent defaults
|
|
19
|
+
(`steps` / `guidance` / `quantize`) are filled in server-side when omitted, and
|
|
20
|
+
the resolved values are recorded in the result `params`.
|
|
21
|
+
|
|
22
|
+
## Resident vs transient runs
|
|
23
|
+
The warmed, resident model uses the server-default quantization. A request that
|
|
24
|
+
either supplies `loras` or sets a `quantize` differing from the resident model
|
|
25
|
+
builds a **one-off transient model** for that call — weights load fresh, so it is
|
|
26
|
+
slower and not reused. For the fast path, omit `loras` and leave `quantize` unset.
|
|
27
|
+
|
|
28
|
+
## LoRA workflow
|
|
29
|
+
Train an adapter from a captioned image set via `/train` (always async), then
|
|
30
|
+
apply it on `/generate` or `/edit` by passing its `adapter_file_id` in `loras`
|
|
31
|
+
(up to 4, each `{file, scale}`). Dataset = a ZIP uploaded to the Files API with a
|
|
32
|
+
same-stem `.txt` caption next to each image (`cat.png` + `cat.txt`); images may
|
|
33
|
+
sit at the top level or in a single subfolder, and `preview*` images are exempt
|
|
34
|
+
from the caption requirement.
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
dataset.zip
|
|
38
|
+
├── cat_01.png # image
|
|
39
|
+
├── cat_01.txt # same-stem caption: "a photo of a tabby cat"
|
|
40
|
+
├── cat_02.jpg
|
|
41
|
+
├── cat_02.txt
|
|
42
|
+
└── preview.png # optional preview, no caption needed
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
A single wrapping subfolder is also accepted (the images just need to live
|
|
46
|
+
together under one directory):
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
dataset.zip
|
|
50
|
+
└── cats/
|
|
51
|
+
├── cat_01.png
|
|
52
|
+
├── cat_01.txt
|
|
53
|
+
└── ...
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## TIPS
|
|
57
|
+
- For a quick image, call `sync` without `Accept: application/json` to get the
|
|
58
|
+
raw bytes straight back (`curl -o out.png`).
|
|
59
|
+
- `width`/`height` must be multiples of 16 and at most 2048x2048. `edit`
|
|
60
|
+
additionally requires square sizes by default — set
|
|
61
|
+
`KIAPI_ERNIE_EDIT_REQUIRE_SQUARE=0` to lift the guard (mflux 0.18.0 can fail on
|
|
62
|
+
some non-square ERNIE img2img sizes).
|
|
63
|
+
- First use downloads the ERNIE-Image weights; run `kiapi activate` ahead of time
|
|
64
|
+
to avoid a cold-start download on the first request.
|
|
65
|
+
|
|
66
|
+
## Performance
|
|
67
|
+
- **turbo**: q8 512x512 generation around 15s after cache load, peak RSS ~5-6 GiB.
|
|
68
|
+
- **base**: slower and uses more steps; prefer turbo unless you need its quality.
|
|
69
|
+
- Transient runs (any `loras` or a `quantize` override) rebuild the model each
|
|
70
|
+
call and are slower than the resident path.
|
|
71
|
+
"""
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""Register ernie's models + OpenAPI description in the global registries."""
|
|
2
|
+
|
|
3
|
+
from kiapi.core.capability import CapabilitySpec, capability_spec_registry
|
|
4
|
+
from kiapi.core.model import ModelSpec, model_registry
|
|
5
|
+
from kiapi.core.setup import HfSnapshotResource
|
|
6
|
+
|
|
7
|
+
from .._constants.description import DESCRIPTION
|
|
8
|
+
from .._models import ernie
|
|
9
|
+
from .._settings import settings_manager
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def register() -> None:
|
|
13
|
+
capability_spec_registry.register(
|
|
14
|
+
CapabilitySpec(
|
|
15
|
+
name="ernie",
|
|
16
|
+
domain="image",
|
|
17
|
+
title="kiapi ERNIE-Image API",
|
|
18
|
+
summary="Generate, edit, and train LoRA adapters for ERNIE-Image models.",
|
|
19
|
+
description=DESCRIPTION,
|
|
20
|
+
openapi_path="/v1/image/ernie/openapi.json",
|
|
21
|
+
docs_path="/v1/image/ernie/docs",
|
|
22
|
+
redoc_path="/v1/image/ernie/redoc",
|
|
23
|
+
path_prefixes=("/v1/image/ernie",),
|
|
24
|
+
)
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
_s = settings_manager.get_settings()
|
|
28
|
+
|
|
29
|
+
model_registry.register(
|
|
30
|
+
ModelSpec(
|
|
31
|
+
name="turbo",
|
|
32
|
+
family="ernie",
|
|
33
|
+
domain="image",
|
|
34
|
+
repo=_s.turbo_model,
|
|
35
|
+
module=ernie,
|
|
36
|
+
weight_gb=6.0,
|
|
37
|
+
peak_headroom_gb=4.0,
|
|
38
|
+
framework="mlx",
|
|
39
|
+
priority=0,
|
|
40
|
+
aliases=("ernie-image-turbo", "baidu/ERNIE-Image-Turbo"),
|
|
41
|
+
default=True,
|
|
42
|
+
setup_resources=(HfSnapshotResource(repo=_s.turbo_model, disk_gb=31.6),),
|
|
43
|
+
)
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
model_registry.register(
|
|
47
|
+
ModelSpec(
|
|
48
|
+
name="base",
|
|
49
|
+
family="ernie",
|
|
50
|
+
domain="image",
|
|
51
|
+
repo=_s.base_model,
|
|
52
|
+
module=ernie,
|
|
53
|
+
weight_gb=12.0,
|
|
54
|
+
peak_headroom_gb=8.0,
|
|
55
|
+
framework="mlx",
|
|
56
|
+
priority=0,
|
|
57
|
+
aliases=("ernie-image", "baidu/ERNIE-Image"),
|
|
58
|
+
setup_resources=(HfSnapshotResource(repo=_s.base_model, disk_gb=31.6),),
|
|
59
|
+
)
|
|
60
|
+
)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from kiapi.capabilities import ValidationError
|
|
2
|
+
|
|
3
|
+
from .._operations.validate_common import validate_common
|
|
4
|
+
from .._settings import settings_manager
|
|
5
|
+
from .._views.edit_request import EditRequest
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def validate_edit(req: EditRequest, *, variant: str) -> None:
|
|
9
|
+
settings = settings_manager.get_settings()
|
|
10
|
+
validate_common(req, settings, variant=variant)
|
|
11
|
+
if not 0 <= req.image_strength <= 1:
|
|
12
|
+
raise ValidationError("image_strength must be in 0..1")
|
|
13
|
+
width = req.width if req.width is not None else settings.default_width
|
|
14
|
+
height = req.height if req.height is not None else settings.default_height
|
|
15
|
+
if settings.edit_require_square and width != height:
|
|
16
|
+
raise ValidationError(
|
|
17
|
+
"ERNIE edit currently requires square width/height; set "
|
|
18
|
+
"KIAPI_ERNIE_EDIT_REQUIRE_SQUARE=0 to disable this guard"
|
|
19
|
+
)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
from .._operations.validate_common import validate_common
|
|
2
|
+
from .._settings import settings_manager
|
|
3
|
+
from .._views.generate_request import GenerateRequest
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def validate_generate(req: GenerateRequest, *, variant: str) -> None:
|
|
7
|
+
settings = settings_manager.get_settings()
|
|
8
|
+
validate_common(req, settings, variant=variant)
|