kiapi 0.1.0__tar.gz → 0.2.0__tar.gz
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-0.1.0 → kiapi-0.2.0}/.gitignore +1 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/ARCHITECTURE.ja.md +48 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/ARCHITECTURE.md +49 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/CHANGELOG.md +18 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/PKG-INFO +71 -2
- {kiapi-0.1.0 → kiapi-0.2.0}/README.ja.md +62 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/README.md +65 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/app.py +12 -1
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/config/template/cli.py +4 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/run/cli.py +14 -1
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/config/_helpers/load_user_settings.py +1 -1
- kiapi-0.2.0/kiapi/core/relay/__init__.py +34 -0
- kiapi-0.2.0/kiapi/core/relay/_instances/relay_registry.py +12 -0
- kiapi-0.2.0/kiapi/core/relay/_schemas/relay_file_body.py +11 -0
- kiapi-0.2.0/kiapi/core/relay/_schemas/relay_json_body.py +8 -0
- kiapi-0.2.0/kiapi/core/relay/_schemas/relay_multipart_body.py +8 -0
- kiapi-0.2.0/kiapi/core/relay/_schemas/relay_multipart_file.py +19 -0
- kiapi-0.2.0/kiapi/core/relay/_services/relay_runner.py +189 -0
- kiapi-0.2.0/kiapi/core/relay/_settings.py +39 -0
- kiapi-0.2.0/kiapi/core/relay/_types/relay.py +11 -0
- kiapi-0.2.0/kiapi/core/relay/_types/relay_delivery.py +17 -0
- kiapi-0.2.0/kiapi/core/relay/_types/relay_method.py +3 -0
- kiapi-0.2.0/kiapi/core/relay/_types/relay_name.py +1 -0
- kiapi-0.2.0/kiapi/core/relay/_types/relay_specifier.py +1 -0
- kiapi-0.2.0/kiapi/core/relay/_views/relay_error.py +7 -0
- kiapi-0.2.0/kiapi/core/relay/_views/relay_request.py +29 -0
- kiapi-0.2.0/kiapi/core/relay/_views/relay_response.py +13 -0
- kiapi-0.2.0/kiapi/relay/__init__.py +1 -0
- kiapi-0.2.0/kiapi/relay/gcp/README.ja.md +549 -0
- kiapi-0.2.0/kiapi/relay/gcp/README.md +562 -0
- kiapi-0.2.0/kiapi/relay/gcp/__init__.py +32 -0
- kiapi-0.2.0/kiapi/relay/gcp/_helpers/create_gcp_relay.py +13 -0
- kiapi-0.2.0/kiapi/relay/gcp/_schemas/gcp_relay_notification.py +13 -0
- kiapi-0.2.0/kiapi/relay/gcp/_services/gcp_relay.py +415 -0
- kiapi-0.2.0/kiapi/relay/gcp/_services/gcp_relay_delivery.py +40 -0
- kiapi-0.2.0/kiapi/relay/gcp/_settings.py +81 -0
- kiapi-0.2.0/kiapi/relay/local/__init__.py +35 -0
- kiapi-0.2.0/kiapi/relay/local/_helpers/create_local_relay.py +13 -0
- kiapi-0.2.0/kiapi/relay/local/_schemas/local_relay_notification.py +13 -0
- kiapi-0.2.0/kiapi/relay/local/_services/local_relay.py +312 -0
- kiapi-0.2.0/kiapi/relay/local/_services/local_relay_delivery.py +40 -0
- kiapi-0.2.0/kiapi/relay/local/_settings.py +52 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/pyproject.toml +9 -2
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/config/_helpers/test_load_user_settings.py +8 -0
- kiapi-0.2.0/tests/core/relay/_services/test_relay_runner.py +123 -0
- kiapi-0.2.0/tests/core/relay/_views/test_relay_request.py +63 -0
- kiapi-0.2.0/tests/core/setup/_services/__init__.py +1 -0
- kiapi-0.2.0/tests/core/workdir/__init__.py +1 -0
- kiapi-0.2.0/tests/core/workdir/_helpers/__init__.py +1 -0
- kiapi-0.2.0/tests/relay/__init__.py +1 -0
- kiapi-0.2.0/tests/relay/gcp/__init__.py +1 -0
- kiapi-0.2.0/tests/relay/gcp/_services/__init__.py +1 -0
- kiapi-0.2.0/tests/relay/gcp/_services/test_gcp_relay.py +133 -0
- kiapi-0.2.0/tests/relay/gcp/test_settings.py +25 -0
- kiapi-0.2.0/tests/relay/local/__init__.py +1 -0
- kiapi-0.2.0/tests/relay/local/_services/__init__.py +1 -0
- kiapi-0.2.0/tests/relay/local/_services/test_local_relay.py +166 -0
- kiapi-0.2.0/tests/relay/local/test_settings.py +18 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/CONTRIBUTING.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/LICENSE +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/SECURITY.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/__main__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/_constants/require_auth.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/_helpers/build_job_responses.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/_helpers/build_openapi.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/_helpers/build_train_responses.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/_helpers/get_accept.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/_helpers/get_ctx.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/_helpers/get_worker.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/_helpers/register_capability_endpoints.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/_helpers/submit_and_maybe_wait.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/_views/async_job_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/_views/capability_model_spec.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/audio/acestep/_views/extract_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/audio/acestep/_views/track_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/audio/acestep/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/audio/audiogen/_views/audio_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/audio/audiogen/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/chat/_views/chat_completion_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/chat/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/embedding/_views/embedding_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/embedding/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/files/_operations/get_file.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/files/_operations/get_file_id.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/files/_views/file_delete_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/files/_views/file_list_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/files/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/health/_views/health_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/health/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/image/depthpro/_views/estimate_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/image/depthpro/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/image/ernie/_views/image_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/image/ernie/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/image/flux2/_views/image_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/image/flux2/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/image/ideogram4/_views/image_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/image/ideogram4/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/image/qwen/_views/image_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/image/qwen/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/image/seedvr2/_views/image_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/image/seedvr2/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/image/zimage/_views/image_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/image/zimage/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/jobs/_operations/get_job_id.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/jobs/_views/job_delete_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/jobs/_views/job_list_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/jobs/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/models/_schemas/openai_model_spec.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/models/_views/model_list_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/models/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/video/ltx2/_views/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/video/ltx2/_views/video_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/video/ltx2/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/web/_views/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/web/_views/fetch_api_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/web/_views/fetch_error_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/api/web/router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/_exceptions/CapabilityError.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/_exceptions/ValidationError.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/_helpers/attach_mflux_progress.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/_helpers/get_file_path.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/_helpers/resolve_file_ref.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/README.ja.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/README.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_constants/description.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_exceptions/ace_step_engine_error.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_helpers/register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_models/acestep.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_operations/handle_cover.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_operations/handle_extract.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_operations/handle_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_operations/handle_repaint.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_operations/resolve_ace_step_paths.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_operations/resolve_cover_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_operations/resolve_engine.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_operations/resolve_extract_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_operations/resolve_generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_operations/resolve_repaint_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_schemas/ace_step_paths.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_services/ace_step_engine.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_views/ace_step_base.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_views/cover_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_views/cover_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_views/extract_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_views/extract_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_views/generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_views/generate_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_views/repaint_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_views/repaint_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/_views/track_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/acestep/worker_subprocess.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/audiogen/README.ja.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/audiogen/README.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/audiogen/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/audiogen/_constants/description.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/audiogen/_helpers/attach_audiogen_progress.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/audiogen/_helpers/register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/audiogen/_helpers/validate_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/audiogen/_models/audiogen.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/audiogen/_operations/handle_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/audiogen/_operations/resolve_generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/audiogen/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/audiogen/_views/generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/audiogen/_views/generate_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/README.ja.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/README.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_constants/description.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_helpers/register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_models/qwen3_5.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_models/qwen3_omni.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_operations/apply_template.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_operations/completed_hermes_tool_call_text.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_operations/emit_streaming_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_operations/ensure_streaming_detokenizer_compat.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_operations/format_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_operations/handle_chat.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_operations/parse_hermes_tool_calls.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_operations/parse_json_tool_calls.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_operations/parse_messages.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_operations/resolve_chat_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_operations/stream_text_from_tokens.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_operations/strip_tool_calls.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_utils/apply_parallel_tool_call_policy.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_utils/apply_seed.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_utils/load_audio_mono.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_utils/load_mlx_vlm.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_utils/warmup_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_views/chat_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/chat/_views/chat_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/depthpro/README.ja.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/depthpro/README.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/depthpro/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/depthpro/_constants/description.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/depthpro/_helpers/register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/depthpro/_helpers/validate_estimate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/depthpro/_models/depthpro.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/depthpro/_operations/handle_estimate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/depthpro/_operations/is_quantize_override.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/depthpro/_operations/resolve_estimate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/depthpro/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/depthpro/_views/estimate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/depthpro/_views/estimate_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/README.ja.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/README.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/_constants/description.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/_helpers/register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/_models/qwen3_text.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/_models/qwen3_vl.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/_operations/format_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/_operations/handle_embed.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/_operations/parse_inputs.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/_operations/resolve_embed_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/_utils/to_vector.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/_views/embed_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/embedding/_views/embed_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/README.ja.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/README.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_constants/description.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_helpers/register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_helpers/validate_edit.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_helpers/validate_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_models/ernie.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_operations/handle_edit.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_operations/handle_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_operations/handle_train.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_operations/is_quantize_override.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_operations/resolve_edit_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_operations/resolve_generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_operations/resolve_lora_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_operations/resolve_train_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_operations/validate_common.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_schemas/lora_ref.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_views/edit_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_views/edit_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_views/generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_views/generate_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_views/train_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ernie/_views/train_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/README.ja.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/README.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_constants/description.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_helpers/register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_helpers/validate_edit.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_helpers/validate_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_models/flux2.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_operations/handle_edit.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_operations/handle_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_operations/handle_train.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_operations/is_quantize_override.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_operations/resolve_edit_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_operations/resolve_generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_operations/resolve_lora_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_operations/resolve_train_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_operations/role_spec.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_operations/split_repo.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_operations/validate_common.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_schemas/lora_ref.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_views/edit_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_views/edit_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_views/generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_views/generate_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_views/train_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/flux2/_views/train_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ideogram4/README.ja.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ideogram4/README.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ideogram4/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ideogram4/_constants/description.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ideogram4/_helpers/register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ideogram4/_helpers/validate_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ideogram4/_models/ideogram4.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ideogram4/_operations/handle_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ideogram4/_operations/is_quantize_override.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ideogram4/_operations/resolve_generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ideogram4/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ideogram4/_views/generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ideogram4/_views/generate_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ltx2/README.ja.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ltx2/README.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ltx2/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ltx2/_constants/description.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ltx2/_helpers/register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ltx2/_helpers/validate_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ltx2/_models/ltx2.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ltx2/_operations/detect_mode.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ltx2/_operations/handle_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ltx2/_operations/resolve_generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ltx2/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ltx2/_views/generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/ltx2/_views/generate_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/README.ja.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/README.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_constants/description.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_helpers/register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_helpers/validate_edit.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_helpers/validate_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_models/qwen.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_operations/handle_edit.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_operations/handle_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_operations/is_quantize_override.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_operations/resolve_edit_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_operations/resolve_generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_operations/resolve_lora_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_operations/validate_common.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_schemas/lora_ref.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_views/edit_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_views/edit_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_views/generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/qwen/_views/generate_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/seedvr2/README.ja.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/seedvr2/README.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/seedvr2/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/seedvr2/_constants/description.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/seedvr2/_helpers/register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/seedvr2/_helpers/validate_upscale.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/seedvr2/_models/seedvr2.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/seedvr2/_operations/handle_upscale.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/seedvr2/_operations/is_quantize_override.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/seedvr2/_operations/resolve_upscale_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/seedvr2/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/seedvr2/_views/upscale_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/seedvr2/_views/upscale_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/README.ja.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/README.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_constants/description.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_exceptions/FetchError.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_exceptions/SearchBackendError.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_helpers/register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_models/crawl4ai.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_models/searxng.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_operations/handle_fetch.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_operations/handle_search.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_operations/resolve_fetch_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_operations/resolve_search_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_operations/resolve_searxng_config_dir.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_services/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_services/web_backend_process.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_views/fetch_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_views/fetch_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_views/fetch_result.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_views/search_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_views/search_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/_views/search_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/resources/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/resources/searxng/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/web/resources/searxng/settings.yml +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/README.ja.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/README.md +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_constants/description.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_helpers/register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_helpers/validate_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_models/zimage.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_operations/handle_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_operations/handle_train.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_operations/is_quantize_override.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_operations/resolve_generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_operations/resolve_lora_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_operations/resolve_train_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_schemas/lora_ref.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_views/generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_views/generate_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_views/train_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/capabilities/zimage/_views/train_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/_helpers/dedupe_resources.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/_helpers/register_all_capabilities.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/_helpers/run_resources.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/_helpers/select_specs.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/activate/_operations/preflight_hf_access.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/activate/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_audio_acestep_turbo.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_audio_acestep_xl_base.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_audio_audiogen_medium.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_chat_chat_qwen3_6_27b.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_chat_chat_qwen3_omni.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_embedding_embedding_qwen3_embedding_8b.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_embedding_embedding_qwen3_vl_embedding_2b.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_image_depthpro_base.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_image_ernie_base.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_image_ernie_turbo.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_image_flux2_klein_9b.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_image_flux2_klein_base_4b.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_image_flux2_klein_base_9b.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_image_ideogram4_fp8.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_image_qwen_edit_2509.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_image_qwen_image.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_image_seedvr2_3b.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_image_seedvr2_7b.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_image_zimage_base.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_image_zimage_turbo.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_video_ltx2_distilled.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_web_web_fetch.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_helpers/check_web_web_search.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_operations/build_check_result.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_operations/check_context.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_operations/create_sample_image.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/_schemas/check_result.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/check/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/config/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/config/edit/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/config/init/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/config/show/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/deactivate/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/run/asgi.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/service/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/service/_services/service_manager.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/service/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/service/install/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/service/start/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/service/status/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/service/stop/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/service/uninstall/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/cli/status/cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/app/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/app/_schemas/app_context.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/app/_services/user_directory.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/app/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/capability/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/capability/_schemas/capability_spec.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/capability/_services/capability_spec_registry.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/config/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/config/_exceptions/user_config_error.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/config/_helpers/get_user_settings_path.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/file/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/file/_helpers/create_file_store.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/file/_helpers/resolve_file_ref.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/file/_schemas/file_data_url_ref.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/file/_schemas/file_id_ref.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/file/_schemas/file_record.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/file/_schemas/file_url_ref.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/file/_services/file_store.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/file/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/file/_types/file_id.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/file/_types/file_ref.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/file/_views/resolved_file_ref.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/job/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/job/_enums/job_status.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/job/_helpers/creep_progress.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/job/_models/job.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/job/_services/job_store.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/job/_services/progress_reporter.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/job/_types/job_id.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/job/_types/job_result.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/job/_types/job_type.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/logging/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/logging/_helpers/get_log_level.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/logging/_helpers/setup_logger.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/logging/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/logging/_types/log_level.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/memory/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/memory/_exceptions/memory_budget_error.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/memory/_helpers/create_memory_manager.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/memory/_operations/log_memory_limit.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/memory/_operations/resolve_effective_memory_limit_gb.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/memory/_operations/resolve_framework_strategy.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/memory/_schemas/framework_strategy.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/memory/_schemas/memory_stats.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/memory/_schemas/resident_model.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/memory/_schemas/resident_model_stats.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/memory/_services/memory_manager.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/memory/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/memory/_types/framework_name.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/memory/_types/resident_key.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/model/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/model/_exceptions/unknown_model_error.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/model/_schemas/model_spec.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/model/_services/model_registry.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/model/_types/model_alias.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/model/_types/model_domain.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/model/_types/model_family.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/model/_types/model_key.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/model/_types/model_name.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/model/_types/model_repo.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/net/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/net/_exceptions/unsafe_url_error.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/net/_helpers/verify_public_url.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/net/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/setup/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/setup/_exceptions/setup_required_error.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/setup/_schemas/docker_image_resource.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/setup/_schemas/hf_snapshot_resource.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/setup/_schemas/local_path_resource.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/setup/_schemas/python_package_resource.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/setup/_schemas/python_venv_resource.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/setup/_schemas/setup_status.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/setup/_schemas/url_file_resource.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/setup/_services/setup_manager.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/setup/_types/setup_resource.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/setup/_types/setup_target.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/workdir/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/workdir/_helpers/create_work_dir.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/workdir/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/worker/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/worker/_helpers/create_worker.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/worker/_services/worker.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/worker/_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/kiapi/core/worker/_types/job_thunk.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/mise.toml +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/api/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/api/chat/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/api/chat/test_router.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/api/test_openapi.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/api/web/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/api/web/test_negotiate_format.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/_helpers/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/_helpers/test_attach_mflux_progress.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/acestep/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/acestep/_helpers/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/acestep/_helpers/test_register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/acestep/_operations/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/acestep/_operations/test_handle_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/acestep/_operations/test_resolve_ace_step_paths.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/acestep/_operations/test_resolve_extract_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/acestep/_operations/test_resolve_generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/acestep/_services/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/acestep/_services/test_ace_step_engine.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/acestep/_views/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/acestep/_views/test_generate_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/audiogen/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/audiogen/_helpers/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/audiogen/_helpers/test_validate_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/audiogen/_operations/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/audiogen/_operations/test_resolve_generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/chat/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/chat/_operations/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/chat/_operations/test_emit_streaming_response.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/chat/_operations/test_ensure_streaming_detokenizer_compat.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/chat/_operations/test_parse_messages.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/chat/_operations/test_stream_text_from_tokens.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/chat/_utils/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/chat/_utils/test_apply_parallel_tool_call_policy.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/ltx2/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/ltx2/_helpers/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/ltx2/_helpers/test_register.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/ltx2/_helpers/test_validate_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/ltx2/_operations/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/ltx2/_operations/test_detect_mode.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/ltx2/_operations/test_resolve_generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/web/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/web/_operations/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/web/_operations/test_resolve_fetch_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/web/_operations/test_resolve_search_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/web/_operations/test_resolve_searxng_config_dir.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/web/_services/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/web/_services/test_web_backend_process.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/web/_views/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/web/_views/test_fetch_request.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/web/test_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/zimage/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/zimage/_helpers/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/zimage/_helpers/test_validate_generate.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/zimage/_operations/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/zimage/_operations/test_is_quantize_override.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/zimage/_operations/test_resolve_generate_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/capabilities/zimage/_operations/test_resolve_train_params.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/activate/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/activate/_operations/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/activate/_operations/test_preflight_hf_access.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/check/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/check/_operations/test_resolve_check_operation.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/config/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/config/conftest.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/config/edit/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/config/edit/test_cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/config/init/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/config/init/test_cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/config/show/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/config/show/test_cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/config/template/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/config/template/test_cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/service/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/service/conftest.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/service/install/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/service/install/test_cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/service/start/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/service/start/test_cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/service/status/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/service/status/test_cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/service/stop/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/service/stop/test_cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/service/uninstall/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/service/uninstall/test_cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/status/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/cli/status/test_cli.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/conftest.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/app/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/app/_schemas/test_app_context.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/app/_services/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/app/_services/test_user_directory.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/app/test_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/config/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/config/_helpers/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/config/_helpers/test_get_user_settings_path.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/config/conftest.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/file/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/file/_helpers/test_create_file_store.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/file/_helpers/test_resolve_file_ref.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/file/_services/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/file/_services/test_file_store.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/file/test_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/job/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/job/_helpers/test_creep_progress.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/job/_models/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/job/_models/test_job.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/job/_services/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/job/_services/test_job_store.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/job/_services/test_progress_reporter.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/memory/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/memory/_operations/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/memory/_operations/test_resolve_effective_memory_limit_gb.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/memory/_services/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/memory/_services/test_memory_manager.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/model/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/model/_schemas/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/model/_schemas/test_model_spec.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/model/_services/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/model/_services/test_model_registry.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/net/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/net/_helpers/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/net/_helpers/test_verify_public_url.py +0 -0
- {kiapi-0.1.0/tests/core/setup → kiapi-0.2.0/tests/core/relay}/__init__.py +0 -0
- {kiapi-0.1.0/tests/core/setup → kiapi-0.2.0/tests/core/relay}/_services/__init__.py +0 -0
- {kiapi-0.1.0/tests/core/workdir → kiapi-0.2.0/tests/core/relay/_views}/__init__.py +0 -0
- {kiapi-0.1.0/tests/core/workdir/_helpers → kiapi-0.2.0/tests/core/setup}/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/setup/_services/test_setup_manager.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/workdir/_helpers/test_create_work_dir.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/workdir/test_settings.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/worker/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/worker/_services/__init__.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/worker/_services/test_worker.py +0 -0
- {kiapi-0.1.0 → kiapi-0.2.0}/tests/core/worker/test_settings.py +0 -0
|
@@ -22,6 +22,10 @@ kiapi/
|
|
|
22
22
|
workdir/ # 実行中の一時作業ディレクトリ管理
|
|
23
23
|
net/ # ネットワークガード(ユーザー指定 URL の SSRF 検証)
|
|
24
24
|
logging/ # ロギング設定
|
|
25
|
+
relay/ # relay 抽象、plugin registry、process 内 dispatcher
|
|
26
|
+
|
|
27
|
+
relay/
|
|
28
|
+
gcp/ # Firebase RTDB 通知 + GCS payload transport
|
|
25
29
|
|
|
26
30
|
capabilities/ # ファミリーごとに 1 パッケージ(dir == family)
|
|
27
31
|
chat/ # OpenAI 互換 chat completions(マルチモーダル / tool / stream)
|
|
@@ -186,6 +190,50 @@ SearXNG / Crawl4AI は Docker container そのものとしてではなく、kiap
|
|
|
186
190
|
resident subprocess の payload として扱う。起動コマンドが `docker run --rm` なので、
|
|
187
191
|
kiapi 停止や eviction で subprocess を止めれば container も掃除される。
|
|
188
192
|
|
|
193
|
+
## Remote Job Relay
|
|
194
|
+
|
|
195
|
+
relay は `KIAPI_RELAY_DEFAULT` または `kiapi run --relay ...` で有効化する optional
|
|
196
|
+
background subsystem である。`core/relay` は安定した `Relay` / `RelayDelivery` protocol
|
|
197
|
+
と plugin registry を定義する。`relay/gcp` は GCP transport、`relay/local` は local
|
|
198
|
+
verification 用の filesystem-backed transport を実装する。
|
|
199
|
+
|
|
200
|
+
```text
|
|
201
|
+
requester
|
|
202
|
+
→ GCS request.json
|
|
203
|
+
→ RTDB request notification
|
|
204
|
+
┊
|
|
205
|
+
GCP relay SSE listener
|
|
206
|
+
→ RTDB queued
|
|
207
|
+
→ local relay queue
|
|
208
|
+
→ RTDB running
|
|
209
|
+
→ process 内 FastAPI app へ ASGI dispatch
|
|
210
|
+
→ GCS response.body(binary のみ)
|
|
211
|
+
→ GCS response.json(create-only generation precondition)
|
|
212
|
+
→ atomic RTDB terminal response + request deletion
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
listener は delivery processing と独立して動作するため、現在の request を実行中でも次の
|
|
216
|
+
request を local queue に積める。relay runner は delivery を直列に消費する。GPU job の
|
|
217
|
+
直列化は API worker が引き続き管理し、relay progress は内部 job state ではなく bridge
|
|
218
|
+
の進捗を表す。
|
|
219
|
+
|
|
220
|
+
RTDB には Google OAuth credential を使う REST streaming API でアクセスする。terminal
|
|
221
|
+
delivery は root-level multi-location `PATCH` を使い、response 公開と request 削除を
|
|
222
|
+
atomic に行う。GCS は body、metadata の順で公開する。`response.json` が commit marker
|
|
223
|
+
であり、`if_generation_match=0` を使用する。
|
|
224
|
+
|
|
225
|
+
queued delivery の消費時に `response.json` が存在する場合、content type と size を復旧し、
|
|
226
|
+
terminal RTDB notification を再送して API dispatch を skip する。これにより、完了済み
|
|
227
|
+
処理を意図的に繰り返さず at-least-once notification handling を実現する。同じ node ID の
|
|
228
|
+
kiapi process が複数あれば実行は重複し得るが、GCS commit marker を作成できるのは 1
|
|
229
|
+
process だけである。
|
|
230
|
+
|
|
231
|
+
LocalRelay は GCP の layout を local root directory 配下に写す。
|
|
232
|
+
`{root}/{prefix}/nodes/{node_id}/requests/*.json` を poll し、
|
|
233
|
+
`sessions/{session_id}/request.json` から request を読み、`response.body` を
|
|
234
|
+
`response.json` より先に書き、terminal status を書いたタイミングで request notification
|
|
235
|
+
を削除する。
|
|
236
|
+
|
|
189
237
|
---
|
|
190
238
|
|
|
191
239
|
> [!NOTE] 以降は、上記の各ステップを実現する仕組み。
|
|
@@ -22,6 +22,10 @@ kiapi/
|
|
|
22
22
|
workdir/ # temporary working directory management
|
|
23
23
|
net/ # network guard for user-provided URLs
|
|
24
24
|
logging/ # logging setup
|
|
25
|
+
relay/ # relay abstraction, plugin registry, and local dispatcher
|
|
26
|
+
|
|
27
|
+
relay/
|
|
28
|
+
gcp/ # Firebase RTDB notifications + GCS payload transport
|
|
25
29
|
|
|
26
30
|
capabilities/ # one package per family (dir == family)
|
|
27
31
|
chat/ # OpenAI-compatible chat completions (multimodal / tool / stream)
|
|
@@ -144,6 +148,51 @@ Web search/fetch also runs through the worker. `memory.acquire` starts the
|
|
|
144
148
|
resident SearXNG or Crawl4AI Docker subprocess on first use, waits for its
|
|
145
149
|
healthcheck, and passes the local backend URL to the capability handler.
|
|
146
150
|
|
|
151
|
+
## Remote Job Relay
|
|
152
|
+
|
|
153
|
+
The relay is an optional background subsystem enabled by
|
|
154
|
+
`KIAPI_RELAY_DEFAULT` or `kiapi run --relay ...`. `core/relay` defines the
|
|
155
|
+
stable `Relay` / `RelayDelivery` protocols and plugin registry. `relay/gcp`
|
|
156
|
+
implements the GCP transport, and `relay/local` implements a filesystem-backed
|
|
157
|
+
transport for local verification.
|
|
158
|
+
|
|
159
|
+
```text
|
|
160
|
+
requester
|
|
161
|
+
→ GCS request.json
|
|
162
|
+
→ RTDB request notification
|
|
163
|
+
┊
|
|
164
|
+
GCP relay SSE listener
|
|
165
|
+
→ RTDB queued
|
|
166
|
+
→ local relay queue
|
|
167
|
+
→ RTDB running
|
|
168
|
+
→ ASGI dispatch to the in-process FastAPI app
|
|
169
|
+
→ GCS response.body (binary only)
|
|
170
|
+
→ GCS response.json (create-only generation precondition)
|
|
171
|
+
→ atomic RTDB terminal response + request deletion
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
The listener runs independently from delivery processing, so it can queue new
|
|
175
|
+
requests while the current request is running. The relay runner consumes
|
|
176
|
+
deliveries serially. The API worker still controls GPU job serialization;
|
|
177
|
+
relay progress represents bridge progress rather than internal job state.
|
|
178
|
+
|
|
179
|
+
RTDB uses its REST streaming API with Google OAuth credentials. Terminal
|
|
180
|
+
delivery uses a root-level multi-location `PATCH`, making response publication
|
|
181
|
+
and request deletion atomic. GCS publishes body first and metadata last.
|
|
182
|
+
`response.json` is the commit marker and uses `if_generation_match=0`.
|
|
183
|
+
|
|
184
|
+
If `response.json` already exists when a queued delivery is consumed, the relay
|
|
185
|
+
recovers its content type and size, republishes the terminal RTDB notification,
|
|
186
|
+
and skips API dispatch. This provides at-least-once notification handling
|
|
187
|
+
without intentionally repeating completed work. Duplicate kiapi processes can
|
|
188
|
+
still execute concurrently, but only one can create the GCS commit marker.
|
|
189
|
+
|
|
190
|
+
LocalRelay mirrors the GCP layout below a local root directory. It polls
|
|
191
|
+
`{root}/{prefix}/nodes/{node_id}/requests/*.json`, reads requests from
|
|
192
|
+
`sessions/{session_id}/request.json`, writes `response.body` before
|
|
193
|
+
`response.json`, and removes the request notification when the terminal status
|
|
194
|
+
is written.
|
|
195
|
+
|
|
147
196
|
## Models
|
|
148
197
|
|
|
149
198
|
All servable models are registered as `ModelSpec` entries in one global model
|
|
@@ -6,6 +6,24 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.2.0] - 2026-06-26
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Added an optional plugin-based remote job relay with Firebase Realtime Database notifications, GCS request/response payloads, in-process ASGI dispatch, committed-response recovery, and atomic terminal delivery.
|
|
14
|
+
- Added a filesystem-backed LocalRelay for local relay verification without GCP services.
|
|
15
|
+
- Added relay verification scripts for LocalRelay, GCPRelay, and end-to-end LocalRelay capability checks.
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- Moved GCP relay dependencies into the optional `relay-gcp` extra.
|
|
20
|
+
- Updated the minimum `pydantic-settings-manager` dependency to 3.7.0.
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
|
|
24
|
+
- Added the OAuth scopes required by the Firebase Realtime Database REST API to GCP relay credentials.
|
|
25
|
+
- Added relay support for multipart file uploads such as `POST /v1/files`.
|
|
26
|
+
|
|
9
27
|
## [0.1.0] - 2026-06-23
|
|
10
28
|
|
|
11
29
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kiapi
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Unified local inference API server for LLM agents on Apple Silicon (MLX): chat, embedding, image, music, sound-effect, and video — one process, one global memory budget, one single-flight queue, unified jobs and files.
|
|
5
5
|
Project-URL: Homepage, https://github.com/kiarina/kiapi
|
|
6
6
|
Project-URL: Repository, https://github.com/kiarina/kiapi
|
|
@@ -25,6 +25,7 @@ Requires-Python: <3.13,>=3.12
|
|
|
25
25
|
Requires-Dist: click
|
|
26
26
|
Requires-Dist: fastapi<0.137
|
|
27
27
|
Requires-Dist: httpx
|
|
28
|
+
Requires-Dist: kiarina-utils-common>=2.2.0
|
|
28
29
|
Requires-Dist: mflux>=0.18.0
|
|
29
30
|
Requires-Dist: mlx-audiocraft>=0.1.0
|
|
30
31
|
Requires-Dist: mlx-embeddings>=0.1.0
|
|
@@ -33,7 +34,7 @@ Requires-Dist: numpy<2.5
|
|
|
33
34
|
Requires-Dist: pillow
|
|
34
35
|
Requires-Dist: platformdirs
|
|
35
36
|
Requires-Dist: psutil
|
|
36
|
-
Requires-Dist: pydantic-settings-manager>=3.
|
|
37
|
+
Requires-Dist: pydantic-settings-manager>=3.7.0
|
|
37
38
|
Requires-Dist: pydantic>=2
|
|
38
39
|
Requires-Dist: python-multipart
|
|
39
40
|
Requires-Dist: pyyaml
|
|
@@ -43,6 +44,9 @@ Requires-Dist: torch
|
|
|
43
44
|
Requires-Dist: torchaudio
|
|
44
45
|
Requires-Dist: torchvision
|
|
45
46
|
Requires-Dist: uvicorn[standard]
|
|
47
|
+
Provides-Extra: relay-gcp
|
|
48
|
+
Requires-Dist: google-cloud-storage>=3.7.0; extra == 'relay-gcp'
|
|
49
|
+
Requires-Dist: kiarina-lib-google>=2.2.1; extra == 'relay-gcp'
|
|
46
50
|
Description-Content-Type: text/markdown
|
|
47
51
|
|
|
48
52
|
# kiapi
|
|
@@ -243,6 +247,71 @@ kiapi service stop
|
|
|
243
247
|
kiapi service uninstall
|
|
244
248
|
```
|
|
245
249
|
|
|
250
|
+
## Remote Job Relay
|
|
251
|
+
|
|
252
|
+
The optional GCP relay lets a kiapi node inside a closed network receive API
|
|
253
|
+
work without exposing an inbound socket. Firebase Realtime Database carries
|
|
254
|
+
small notifications, while Cloud Storage carries request and response bodies.
|
|
255
|
+
Install kiapi with the `relay-gcp` extra to enable it:
|
|
256
|
+
|
|
257
|
+
```sh
|
|
258
|
+
python3.12 -m pip install --upgrade "kiapi[relay-gcp]"
|
|
259
|
+
uv tool install --python 3.12 "kiapi[relay-gcp]"
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
```sh
|
|
263
|
+
export KIAPI_RELAY_GCP_NODE_ID="studio-1"
|
|
264
|
+
export KIAPI_RELAY_GCP_DATABASE_URL="https://PROJECT.firebaseio.com"
|
|
265
|
+
export KIAPI_RELAY_GCP_BUCKET="PRIVATE_RELAY_BUCKET"
|
|
266
|
+
export KIAPI_RELAY_GCP_PREFIX="private/kiapi"
|
|
267
|
+
|
|
268
|
+
# Uses Application Default Credentials by default.
|
|
269
|
+
kiapi run --relay gcp
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
The requester writes
|
|
273
|
+
`{prefix}/sessions/{session_id}/request.json` in GCS, then writes a notification
|
|
274
|
+
to `{prefix}/nodes/{node_id}/requests/{session_id}` in RTDB. The relay reports
|
|
275
|
+
`queued`, `running`, and the terminal result below the requester node's
|
|
276
|
+
`responses` path.
|
|
277
|
+
|
|
278
|
+
- Requests are dispatched directly to the in-process FastAPI app and handled
|
|
279
|
+
one at a time by the relay.
|
|
280
|
+
- JSON responses use `response.json`. Binary responses write `response.body`
|
|
281
|
+
before `response.json`.
|
|
282
|
+
- `response.json` uses a GCS create-only generation precondition. A completed
|
|
283
|
+
response found after restart is reported without executing the API again.
|
|
284
|
+
- The terminal RTDB response and request deletion use one atomic multi-location
|
|
285
|
+
update.
|
|
286
|
+
- Startup installs a prefix-scoped lifecycle rule that deletes session objects
|
|
287
|
+
after one day. Set `KIAPI_RELAY_GCP_MANAGE_BUCKET_LIFECYCLE=false` when
|
|
288
|
+
infrastructure manages this rule.
|
|
289
|
+
|
|
290
|
+
Use a dedicated bucket and narrowly scoped RTDB/GCS permissions. Google
|
|
291
|
+
credentials are configured through
|
|
292
|
+
[`kiarina-lib-google`](https://github.com/kiarina/kiarina-python/tree/main/packages/kiarina-lib-google).
|
|
293
|
+
|
|
294
|
+
See [GCP Relay setup](kiapi/relay/gcp/README.md) for resource creation, IAM,
|
|
295
|
+
authentication, configuration, and verification steps.
|
|
296
|
+
|
|
297
|
+
For local relay verification without GCP, use `local`. It uses the same
|
|
298
|
+
in-process dispatch path but stores notifications and payloads under a local
|
|
299
|
+
directory:
|
|
300
|
+
|
|
301
|
+
```sh
|
|
302
|
+
export KIAPI_RELAY_LOCAL_NODE_ID="studio-1"
|
|
303
|
+
export KIAPI_RELAY_LOCAL_ROOT="/tmp/kiapi/relay"
|
|
304
|
+
export KIAPI_RELAY_LOCAL_PREFIX="private/kiapi"
|
|
305
|
+
|
|
306
|
+
kiapi run --relay local
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
The requester writes `{root}/{prefix}/sessions/{session_id}/request.json`, then
|
|
310
|
+
writes `{root}/{prefix}/nodes/{node_id}/requests/{session_id}.json` with
|
|
311
|
+
`{"session_id":"...","source_node_id":"..."}`. The relay writes bridge status
|
|
312
|
+
to `{root}/{prefix}/nodes/{source_node_id}/responses/{session_id}.json` and
|
|
313
|
+
stores the committed response in the session directory.
|
|
314
|
+
|
|
246
315
|
## Architecture
|
|
247
316
|
|
|
248
317
|
> [!NOTE]
|
|
@@ -197,6 +197,68 @@ kiapi service stop
|
|
|
197
197
|
kiapi service uninstall
|
|
198
198
|
```
|
|
199
199
|
|
|
200
|
+
## Remote Job Relay
|
|
201
|
+
|
|
202
|
+
オプションの GCP relay を使うと、閉鎖ネットワーク内の kiapi node に inbound socket を
|
|
203
|
+
公開せず API 処理を依頼できます。小さな通知は Firebase Realtime Database、request /
|
|
204
|
+
response body は Cloud Storage で受け渡します。
|
|
205
|
+
有効にするには、`relay-gcp` extra 付きで kiapi をインストールしてください。
|
|
206
|
+
|
|
207
|
+
```sh
|
|
208
|
+
python3.12 -m pip install --upgrade "kiapi[relay-gcp]"
|
|
209
|
+
uv tool install --python 3.12 "kiapi[relay-gcp]"
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
```sh
|
|
213
|
+
export KIAPI_RELAY_GCP_NODE_ID="studio-1"
|
|
214
|
+
export KIAPI_RELAY_GCP_DATABASE_URL="https://PROJECT.firebaseio.com"
|
|
215
|
+
export KIAPI_RELAY_GCP_BUCKET="PRIVATE_RELAY_BUCKET"
|
|
216
|
+
export KIAPI_RELAY_GCP_PREFIX="private/kiapi"
|
|
217
|
+
|
|
218
|
+
# 既定では Application Default Credentials を使用
|
|
219
|
+
kiapi run --relay gcp
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
requester は GCS の
|
|
223
|
+
`{prefix}/sessions/{session_id}/request.json` を書き込んだ後、RTDB の
|
|
224
|
+
`{prefix}/nodes/{node_id}/requests/{session_id}` へ通知を書き込みます。relay は
|
|
225
|
+
requester node の `responses` path へ `queued`、`running`、terminal result を通知します。
|
|
226
|
+
|
|
227
|
+
- request は process 内の FastAPI app へ直接 dispatch され、relay が 1 件ずつ処理します。
|
|
228
|
+
- JSON response は `response.json`、binary response は `response.body` の後に
|
|
229
|
+
`response.json` を書き込みます。
|
|
230
|
+
- `response.json` は GCS の create-only generation precondition で排他します。再起動後に
|
|
231
|
+
完了済み response が見つかった場合、API を再実行せず結果を再通知します。
|
|
232
|
+
- terminal RTDB response の通知と request 削除は 1 回の atomic multi-location update
|
|
233
|
+
で行います。
|
|
234
|
+
- 起動時に session object を 1 日後に削除する prefix 限定 lifecycle rule を設定します。
|
|
235
|
+
infrastructure 側で管理する場合は
|
|
236
|
+
`KIAPI_RELAY_GCP_MANAGE_BUCKET_LIFECYCLE=false` を指定してください。
|
|
237
|
+
|
|
238
|
+
専用 bucket と必要最小限の RTDB / GCS 権限を使用してください。Google credential は
|
|
239
|
+
[`kiarina-lib-google`](https://github.com/kiarina/kiarina-python/tree/main/packages/kiarina-lib-google)
|
|
240
|
+
で設定します。
|
|
241
|
+
|
|
242
|
+
resource 作成、IAM、認証、設定、検証手順は
|
|
243
|
+
[GCP Relay setup](kiapi/relay/gcp/README.ja.md) を参照してください。
|
|
244
|
+
|
|
245
|
+
GCP を使わずに relay を検証したい場合は `local` を使えます。同じ process 内 dispatch
|
|
246
|
+
経路を使い、通知と payload をローカルディレクトリ配下に保存します。
|
|
247
|
+
|
|
248
|
+
```sh
|
|
249
|
+
export KIAPI_RELAY_LOCAL_NODE_ID="studio-1"
|
|
250
|
+
export KIAPI_RELAY_LOCAL_ROOT="/tmp/kiapi/relay"
|
|
251
|
+
export KIAPI_RELAY_LOCAL_PREFIX="private/kiapi"
|
|
252
|
+
|
|
253
|
+
kiapi run --relay local
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
requester は `{root}/{prefix}/sessions/{session_id}/request.json` を書き込んだ後、
|
|
257
|
+
`{root}/{prefix}/nodes/{node_id}/requests/{session_id}.json` に
|
|
258
|
+
`{"session_id":"...","source_node_id":"..."}` を書き込みます。relay は bridge status を
|
|
259
|
+
`{root}/{prefix}/nodes/{source_node_id}/responses/{session_id}.json` に書き込み、
|
|
260
|
+
committed response を session directory に保存します。
|
|
261
|
+
|
|
200
262
|
## Architecture
|
|
201
263
|
|
|
202
264
|
> [!NOTE]
|
|
@@ -196,6 +196,71 @@ kiapi service stop
|
|
|
196
196
|
kiapi service uninstall
|
|
197
197
|
```
|
|
198
198
|
|
|
199
|
+
## Remote Job Relay
|
|
200
|
+
|
|
201
|
+
The optional GCP relay lets a kiapi node inside a closed network receive API
|
|
202
|
+
work without exposing an inbound socket. Firebase Realtime Database carries
|
|
203
|
+
small notifications, while Cloud Storage carries request and response bodies.
|
|
204
|
+
Install kiapi with the `relay-gcp` extra to enable it:
|
|
205
|
+
|
|
206
|
+
```sh
|
|
207
|
+
python3.12 -m pip install --upgrade "kiapi[relay-gcp]"
|
|
208
|
+
uv tool install --python 3.12 "kiapi[relay-gcp]"
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
```sh
|
|
212
|
+
export KIAPI_RELAY_GCP_NODE_ID="studio-1"
|
|
213
|
+
export KIAPI_RELAY_GCP_DATABASE_URL="https://PROJECT.firebaseio.com"
|
|
214
|
+
export KIAPI_RELAY_GCP_BUCKET="PRIVATE_RELAY_BUCKET"
|
|
215
|
+
export KIAPI_RELAY_GCP_PREFIX="private/kiapi"
|
|
216
|
+
|
|
217
|
+
# Uses Application Default Credentials by default.
|
|
218
|
+
kiapi run --relay gcp
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
The requester writes
|
|
222
|
+
`{prefix}/sessions/{session_id}/request.json` in GCS, then writes a notification
|
|
223
|
+
to `{prefix}/nodes/{node_id}/requests/{session_id}` in RTDB. The relay reports
|
|
224
|
+
`queued`, `running`, and the terminal result below the requester node's
|
|
225
|
+
`responses` path.
|
|
226
|
+
|
|
227
|
+
- Requests are dispatched directly to the in-process FastAPI app and handled
|
|
228
|
+
one at a time by the relay.
|
|
229
|
+
- JSON responses use `response.json`. Binary responses write `response.body`
|
|
230
|
+
before `response.json`.
|
|
231
|
+
- `response.json` uses a GCS create-only generation precondition. A completed
|
|
232
|
+
response found after restart is reported without executing the API again.
|
|
233
|
+
- The terminal RTDB response and request deletion use one atomic multi-location
|
|
234
|
+
update.
|
|
235
|
+
- Startup installs a prefix-scoped lifecycle rule that deletes session objects
|
|
236
|
+
after one day. Set `KIAPI_RELAY_GCP_MANAGE_BUCKET_LIFECYCLE=false` when
|
|
237
|
+
infrastructure manages this rule.
|
|
238
|
+
|
|
239
|
+
Use a dedicated bucket and narrowly scoped RTDB/GCS permissions. Google
|
|
240
|
+
credentials are configured through
|
|
241
|
+
[`kiarina-lib-google`](https://github.com/kiarina/kiarina-python/tree/main/packages/kiarina-lib-google).
|
|
242
|
+
|
|
243
|
+
See [GCP Relay setup](kiapi/relay/gcp/README.md) for resource creation, IAM,
|
|
244
|
+
authentication, configuration, and verification steps.
|
|
245
|
+
|
|
246
|
+
For local relay verification without GCP, use `local`. It uses the same
|
|
247
|
+
in-process dispatch path but stores notifications and payloads under a local
|
|
248
|
+
directory:
|
|
249
|
+
|
|
250
|
+
```sh
|
|
251
|
+
export KIAPI_RELAY_LOCAL_NODE_ID="studio-1"
|
|
252
|
+
export KIAPI_RELAY_LOCAL_ROOT="/tmp/kiapi/relay"
|
|
253
|
+
export KIAPI_RELAY_LOCAL_PREFIX="private/kiapi"
|
|
254
|
+
|
|
255
|
+
kiapi run --relay local
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
The requester writes `{root}/{prefix}/sessions/{session_id}/request.json`, then
|
|
259
|
+
writes `{root}/{prefix}/nodes/{node_id}/requests/{session_id}.json` with
|
|
260
|
+
`{"session_id":"...","source_node_id":"..."}`. The relay writes bridge status
|
|
261
|
+
to `{root}/{prefix}/nodes/{source_node_id}/responses/{session_id}.json` and
|
|
262
|
+
stores the committed response in the session directory.
|
|
263
|
+
|
|
199
264
|
## Architecture
|
|
200
265
|
|
|
201
266
|
> [!NOTE]
|
|
@@ -11,6 +11,8 @@ from kiapi.core.app import AppContext
|
|
|
11
11
|
from kiapi.core.capability import capability_spec_registry
|
|
12
12
|
from kiapi.core.logging import setup_logger
|
|
13
13
|
from kiapi.core.model import model_registry
|
|
14
|
+
from kiapi.core.relay import RelayRunner, relay_registry
|
|
15
|
+
from kiapi.core.relay import settings_manager as relay_settings_manager
|
|
14
16
|
from kiapi.core.worker import create_worker
|
|
15
17
|
|
|
16
18
|
from .audio.acestep.router import router as acestep_router
|
|
@@ -65,11 +67,20 @@ async def lifespan(app: FastAPI): # type: ignore
|
|
|
65
67
|
app.state.worker = worker
|
|
66
68
|
|
|
67
69
|
worker.start()
|
|
68
|
-
|
|
69
70
|
asyncio.create_task(worker.warmup()) # noqa: RUF006
|
|
70
71
|
|
|
72
|
+
relay_runner: RelayRunner | None = None
|
|
73
|
+
|
|
74
|
+
if relay_settings_manager.get_settings().default is not None:
|
|
75
|
+
relay_runner = RelayRunner(relay_registry.resolve(), app)
|
|
76
|
+
relay_runner.start()
|
|
77
|
+
app.state.relay_runner = relay_runner
|
|
78
|
+
|
|
71
79
|
yield
|
|
72
80
|
|
|
81
|
+
if relay_runner is not None:
|
|
82
|
+
await relay_runner.stop()
|
|
83
|
+
|
|
73
84
|
await worker.stop()
|
|
74
85
|
|
|
75
86
|
|
|
@@ -10,6 +10,10 @@ _SETTINGS_IMPORT_PATHS = [
|
|
|
10
10
|
"kiapi.core.memory",
|
|
11
11
|
"kiapi.core.worker",
|
|
12
12
|
"kiapi.core.net",
|
|
13
|
+
"kiapi.core.relay",
|
|
14
|
+
"kiapi.relay.gcp",
|
|
15
|
+
"kiapi.relay.local",
|
|
16
|
+
"kiarina.lib.google",
|
|
13
17
|
"kiapi.capabilities.chat",
|
|
14
18
|
"kiapi.capabilities.embedding",
|
|
15
19
|
"kiapi.capabilities.depthpro",
|
|
@@ -7,13 +7,20 @@ from kiapi.api import settings_manager as api_settings_manager
|
|
|
7
7
|
from kiapi.cli import register_all_capabilities
|
|
8
8
|
from kiapi.core.logging import get_log_level
|
|
9
9
|
from kiapi.core.logging import settings_manager as logging_settings_manager
|
|
10
|
+
from kiapi.core.relay import settings_manager as relay_settings_manager
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
@click.command()
|
|
13
14
|
@click.option("--host", type=str, help="Bind socket to this host")
|
|
14
15
|
@click.option("--port", type=int, help="Bind socket to this port")
|
|
16
|
+
@click.option("--relay", type=str, help="Start a relay, for example: gcp")
|
|
15
17
|
@click.option("--debug", is_flag=True, help="Enable debug logging and hot reload")
|
|
16
|
-
def run(
|
|
18
|
+
def run(
|
|
19
|
+
host: str | None,
|
|
20
|
+
port: int | None,
|
|
21
|
+
relay: str | None,
|
|
22
|
+
debug: bool,
|
|
23
|
+
) -> None:
|
|
17
24
|
"""Run the kiapi API server."""
|
|
18
25
|
api_cli_args: dict[str, str | int] = {}
|
|
19
26
|
|
|
@@ -25,6 +32,9 @@ def run(host: str | None, port: int | None, debug: bool) -> None:
|
|
|
25
32
|
if api_cli_args:
|
|
26
33
|
api_settings_manager.cli_args = api_cli_args
|
|
27
34
|
|
|
35
|
+
if relay is not None:
|
|
36
|
+
relay_settings_manager.cli_args = {"default": relay}
|
|
37
|
+
|
|
28
38
|
settings = api_settings_manager.get_settings()
|
|
29
39
|
|
|
30
40
|
if debug:
|
|
@@ -33,6 +43,9 @@ def run(host: str | None, port: int | None, debug: bool) -> None:
|
|
|
33
43
|
# in-process cli_args, so propagate the log level via the environment.
|
|
34
44
|
os.environ["KIAPI_LOG_LEVEL"] = "DEBUG"
|
|
35
45
|
|
|
46
|
+
if relay is not None:
|
|
47
|
+
os.environ["KIAPI_RELAY_DEFAULT"] = relay
|
|
48
|
+
|
|
36
49
|
# Hot reload requires an import string (the worker subprocess
|
|
37
50
|
# re-imports the app), so use the ASGI factory that registers
|
|
38
51
|
# capabilities on import.
|
|
@@ -31,7 +31,7 @@ def load_user_settings(path: Path | None = None) -> None:
|
|
|
31
31
|
user_configs = _normalize_user_configs(data, settings_path)
|
|
32
32
|
|
|
33
33
|
try:
|
|
34
|
-
load_user_configs(user_configs)
|
|
34
|
+
load_user_configs(user_configs, missing_module_policy="warn")
|
|
35
35
|
except (ImportError, AttributeError, TypeError, ValueError) as exc:
|
|
36
36
|
raise UserConfigError(f"Failed to load {settings_path}: {exc}") from exc
|
|
37
37
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from ._instances.relay_registry import relay_registry
|
|
2
|
+
from ._schemas.relay_file_body import RelayFileBody
|
|
3
|
+
from ._schemas.relay_json_body import RelayJsonBody
|
|
4
|
+
from ._schemas.relay_multipart_body import RelayMultipartBody
|
|
5
|
+
from ._schemas.relay_multipart_file import RelayMultipartFile
|
|
6
|
+
from ._services.relay_runner import RelayRunner
|
|
7
|
+
from ._settings import RelaySettings, settings_manager
|
|
8
|
+
from ._types.relay import Relay
|
|
9
|
+
from ._types.relay_delivery import RelayDelivery
|
|
10
|
+
from ._types.relay_method import RelayMethod
|
|
11
|
+
from ._types.relay_name import RelayName
|
|
12
|
+
from ._types.relay_specifier import RelaySpecifier
|
|
13
|
+
from ._views.relay_error import RelayError
|
|
14
|
+
from ._views.relay_request import RelayRequest
|
|
15
|
+
from ._views.relay_response import RelayResponse
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"Relay",
|
|
19
|
+
"RelayDelivery",
|
|
20
|
+
"RelayError",
|
|
21
|
+
"RelayFileBody",
|
|
22
|
+
"RelayJsonBody",
|
|
23
|
+
"RelayMethod",
|
|
24
|
+
"RelayMultipartBody",
|
|
25
|
+
"RelayMultipartFile",
|
|
26
|
+
"RelayName",
|
|
27
|
+
"RelayRequest",
|
|
28
|
+
"RelayResponse",
|
|
29
|
+
"RelayRunner",
|
|
30
|
+
"RelaySettings",
|
|
31
|
+
"RelaySpecifier",
|
|
32
|
+
"relay_registry",
|
|
33
|
+
"settings_manager",
|
|
34
|
+
]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from kiarina.utils.component_registry import ComponentRegistry
|
|
2
|
+
|
|
3
|
+
from .._settings import settings_manager
|
|
4
|
+
from .._types.relay import Relay
|
|
5
|
+
|
|
6
|
+
relay_registry = ComponentRegistry[Relay](
|
|
7
|
+
expected_type=Relay, # type: ignore[type-abstract]
|
|
8
|
+
component_label="Relay",
|
|
9
|
+
get_default=lambda: settings_manager.get_settings().default,
|
|
10
|
+
get_presets=lambda: settings_manager.get_settings().presets,
|
|
11
|
+
get_customs=lambda: settings_manager.get_settings().customs,
|
|
12
|
+
)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import base64
|
|
2
|
+
import binascii
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class RelayMultipartFile(BaseModel):
|
|
8
|
+
field: str = "file"
|
|
9
|
+
filename: str
|
|
10
|
+
content_type: str | None = None
|
|
11
|
+
content_base64: str = Field(
|
|
12
|
+
description="Base64-encoded file bytes for a multipart/form-data part.",
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
def content(self) -> bytes:
|
|
16
|
+
try:
|
|
17
|
+
return base64.b64decode(self.content_base64, validate=True)
|
|
18
|
+
except binascii.Error as exc:
|
|
19
|
+
raise ValueError("content_base64 must be valid base64") from exc
|