@bendyline/gezel-inference 1.0.2 → 1.0.4
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.
- package/dist/catalog/chat-models/de/deepseek-v4.1-flash-552b-q2/manifest.json +120 -0
- package/dist/catalog/chat-models/de/deepseek-v4.1-flash-552b-q2/versions/1.0.0/manifest.json +21 -0
- package/dist/catalog/chat-models/gl/glm-5.3-flash-320b-q2/manifest.json +6 -5
- package/dist/catalog/chat-models/gl/glm-5.3-flash-320b-q2/versions/1.0.2/manifest.json +27 -0
- package/dist/catalog/chat-models/gl/glm-5.3-flash-320b-q2/versions/1.0.3/manifest.json +27 -0
- package/dist/catalog/chat-models/index.json +1 -1
- package/dist/catalog/chat-models/na/nanbeige4.2-3b-q4/manifest.json +1 -1
- package/dist/catalog/chat-models/ne/nemotron3.5-bolt-74b-iq2/manifest.json +157 -0
- package/dist/catalog/chat-models/ne/nemotron3.5-bolt-74b-iq2/versions/1.0.0/manifest.json +30 -0
- package/dist/catalog/chat-models/ne/nemotron3.5-bolt-e4b-q4/manifest.json +142 -0
- package/dist/catalog/chat-models/ne/nemotron3.5-bolt-e4b-q4/versions/1.0.0/manifest.json +14 -0
- package/dist/catalog/chat-models/ne/nemotron3.5-bolt-e4b-q4/versions/1.0.1/manifest.json +14 -0
- package/dist/catalog/chat-models/ne/nemotron3.5-super-vl-120b-nvfp4/manifest.json +156 -0
- package/dist/catalog/chat-models/ne/nemotron3.5-super-vl-120b-nvfp4/versions/1.0.0/manifest.json +28 -0
- package/dist/catalog/chat-models/raw-index.json +1 -1
- package/dist/catalog/image-models/an/animagine-xl-4/manifest.json +40 -0
- package/dist/catalog/image-models/an/animagine-xl-4/versions/4.0.0/manifest.json +10 -0
- package/dist/catalog/image-models/an/animagine-xl-4/versions/4.0.1/manifest.json +16 -0
- package/dist/catalog/image-models/fl/flux-2-klein-4b-q4/manifest.json +44 -0
- package/dist/catalog/image-models/fl/flux-2-klein-4b-q4/versions/1.0.0/manifest.json +23 -0
- package/dist/catalog/image-models/fl/flux-2-klein-4b-q4/versions/1.0.1/manifest.json +29 -0
- package/dist/catalog/image-models/index.json +1 -0
- package/dist/catalog/image-models/ir/iris-3b-f32/manifest.json +41 -0
- package/dist/catalog/image-models/ir/iris-3b-f32/versions/1.0.0/manifest.json +19 -0
- package/dist/catalog/image-models/ir/iris-3b-f32/versions/1.0.1/manifest.json +25 -0
- package/dist/catalog/image-models/ir/iris-3b-f32/versions/1.0.2/manifest.json +25 -0
- package/dist/catalog/image-models/kr/krea-2-turbo-q4/manifest.json +42 -0
- package/dist/catalog/image-models/kr/krea-2-turbo-q4/versions/1.0.0/manifest.json +23 -0
- package/dist/catalog/image-models/kr/krea-2-turbo-q4/versions/1.0.1/manifest.json +29 -0
- package/dist/catalog/image-models/kr/krea-2-turbo-q6/manifest.json +42 -0
- package/dist/catalog/image-models/kr/krea-2-turbo-q6/versions/1.0.0/manifest.json +23 -0
- package/dist/catalog/image-models/kr/krea-2-turbo-q6/versions/1.0.1/manifest.json +29 -0
- package/dist/catalog/image-models/kr/krea-2-turbo-q8/manifest.json +42 -0
- package/dist/catalog/image-models/kr/krea-2-turbo-q8/versions/1.0.0/manifest.json +23 -0
- package/dist/catalog/image-models/kr/krea-2-turbo-q8/versions/1.0.1/manifest.json +29 -0
- package/dist/catalog/image-models/mi/ming-image-0.1-design-bf16/manifest.json +41 -0
- package/dist/catalog/image-models/mi/ming-image-0.1-design-bf16/versions/1.0.0/manifest.json +31 -0
- package/dist/catalog/image-models/mi/ming-image-0.1-design-bf16/versions/1.0.1/manifest.json +50 -0
- package/dist/catalog/image-models/mi/ming-image-0.1-design-bf16/versions/1.0.2/manifest.json +50 -0
- package/dist/catalog/image-models/mo/moss-image-sft-q4/manifest.json +40 -0
- package/dist/catalog/image-models/mo/moss-image-sft-q4/versions/1.0.0/manifest.json +37 -0
- package/dist/catalog/image-models/mo/moss-image-sft-q4/versions/1.0.1/manifest.json +37 -0
- package/dist/catalog/image-models/raw-index.json +1 -0
- package/dist/catalog/image-models/sd/sd-1.5/manifest.json +40 -0
- package/dist/catalog/image-models/sd/sd-1.5/versions/1.0.0/manifest.json +10 -0
- package/dist/catalog/image-models/sd/sd-1.5/versions/1.0.1/manifest.json +16 -0
- package/dist/catalog/image-models/sd/sd-turbo/manifest.json +40 -0
- package/dist/catalog/image-models/sd/sd-turbo/versions/1.0.0/manifest.json +10 -0
- package/dist/catalog/image-models/sd/sd-turbo/versions/1.0.1/manifest.json +16 -0
- package/dist/catalog/image-models/sd/sdxl-base-1.0/manifest.json +39 -0
- package/dist/catalog/image-models/sd/sdxl-base-1.0/versions/1.0.0/manifest.json +10 -0
- package/dist/catalog/image-models/sd/sdxl-base-1.0/versions/1.0.1/manifest.json +16 -0
- package/dist/catalog/image-models/sd/sdxl-lightning-4step/manifest.json +40 -0
- package/dist/catalog/image-models/sd/sdxl-lightning-4step/versions/1.0.0/manifest.json +10 -0
- package/dist/catalog/image-models/sd/sdxl-lightning-4step/versions/1.0.1/manifest.json +16 -0
- package/dist/catalog/image-models/sd/sdxl-turbo/manifest.json +41 -0
- package/dist/catalog/image-models/sd/sdxl-turbo/versions/1.0.0/manifest.json +10 -0
- package/dist/catalog/image-models/sd/sdxl-turbo/versions/1.0.1/manifest.json +16 -0
- package/dist/catalog/knowledge-catalogs/be/bendyline-how-to-books/keywords.json +56 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-alaska-part-0001/keywords.json +12 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-nevada-part-0001/keywords.json +13 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-us-300-399-part-0001/keywords.json +14 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-us-347-349/keywords.json +17 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-utah-part-0001/keywords.json +12 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-utah-part-0002/keywords.json +12 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0001/keywords.json +12 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0002/keywords.json +12 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0003/keywords.json +12 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0004/keywords.json +12 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0005/keywords.json +12 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-wyoming-part-0001/keywords.json +12 -0
- package/dist/catalog/knowledge-catalogs/index.json +1 -1
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-aspnet-core-en/keywords.json +21 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-ai-platform-en/keywords.json +27 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-apps-compute-en/keywords.json +23 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-data-aiot-en/keywords.json +26 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-management-hybrid-en/keywords.json +28 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-network-security-en/keywords.json +29 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-dotnet-en/keywords.json +21 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-entity-framework-en/keywords.json +14 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-microsoft-365-en/keywords.json +20 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-powershell-en/keywords.json +24 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-sql-server-en/keywords.json +27 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-windows-apps-en/keywords.json +18 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-windows-server-en/keywords.json +28 -0
- package/dist/catalog/knowledge-catalogs/raw-index.json +1 -1
- package/dist/catalog/knowledge-catalogs/re/regional-american-south/keywords.json +1700 -0
- package/dist/catalog/knowledge-catalogs/re/regional-american-south/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-andes-amazon/keywords.json +750 -0
- package/dist/catalog/knowledge-catalogs/re/regional-andes-amazon/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-australia-nz/keywords.json +1281 -0
- package/dist/catalog/knowledge-catalogs/re/regional-australia-nz/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-brazil/keywords.json +1125 -0
- package/dist/catalog/knowledge-catalogs/re/regional-brazil/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-britain-ireland/keywords.json +3287 -0
- package/dist/catalog/knowledge-catalogs/re/regional-britain-ireland/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-california-southwest/keywords.json +1835 -0
- package/dist/catalog/knowledge-catalogs/re/regional-california-southwest/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-canada-alaska/keywords.json +1184 -0
- package/dist/catalog/knowledge-catalogs/re/regional-canada-alaska/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-central-eastern-europe/keywords.json +1503 -0
- package/dist/catalog/knowledge-catalogs/re/regional-central-eastern-europe/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-east-asia/keywords.json +2836 -0
- package/dist/catalog/knowledge-catalogs/re/regional-east-asia/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-east-southern-africa/keywords.json +813 -0
- package/dist/catalog/knowledge-catalogs/re/regional-east-southern-africa/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-mediterranean/keywords.json +2082 -0
- package/dist/catalog/knowledge-catalogs/re/regional-mediterranean/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-mexico-central-america/keywords.json +1481 -0
- package/dist/catalog/knowledge-catalogs/re/regional-mexico-central-america/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-middle-east/keywords.json +1272 -0
- package/dist/catalog/knowledge-catalogs/re/regional-middle-east/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-midwest/keywords.json +758 -0
- package/dist/catalog/knowledge-catalogs/re/regional-midwest/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-north-africa/keywords.json +896 -0
- package/dist/catalog/knowledge-catalogs/re/regional-north-africa/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northeast/keywords.json +1281 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northeast/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northern-eurasia/keywords.json +346 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northern-eurasia/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northern-europe/keywords.json +2688 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northern-europe/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-pacific-islands/keywords.json +973 -0
- package/dist/catalog/knowledge-catalogs/re/regional-pacific-islands/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-pacific-northwest/keywords.json +937 -0
- package/dist/catalog/knowledge-catalogs/re/regional-pacific-northwest/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-rockies-plains/keywords.json +608 -0
- package/dist/catalog/knowledge-catalogs/re/regional-rockies-plains/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-south-asia/keywords.json +633 -0
- package/dist/catalog/knowledge-catalogs/re/regional-south-asia/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-southeast-asia/keywords.json +2697 -0
- package/dist/catalog/knowledge-catalogs/re/regional-southeast-asia/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-southern-cone/keywords.json +606 -0
- package/dist/catalog/knowledge-catalogs/re/regional-southern-cone/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-west-central-africa/keywords.json +564 -0
- package/dist/catalog/knowledge-catalogs/re/regional-west-central-africa/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-western-europe/keywords.json +3247 -0
- package/dist/catalog/knowledge-catalogs/re/regional-western-europe-east/manifest.json +47 -0
- package/dist/catalog/knowledge-catalogs/re/regional-western-europe-east/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-western-europe-west/manifest.json +47 -0
- package/dist/catalog/knowledge-catalogs/re/regional-western-europe-west/versions/2026.10.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-arts/keywords.json +5437 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-arts/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-arts/versions/2026.10.1/manifest.json +181 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-astronomy/keywords.json +4009 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-astronomy/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-astronomy/versions/2026.10.1/manifest.json +181 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-biology/keywords.json +4009 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-biology/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-biology/versions/2026.10.1/manifest.json +217 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-business/keywords.json +5583 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-business/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-business/versions/2026.10.1/manifest.json +197 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-film-tv/keywords.json +6386 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-film-tv/manifest.json +2 -2
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-film-tv/versions/2026.10.1/manifest.json +197 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-food-drink/keywords.json +4009 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-food-drink/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-food-drink/versions/2026.10.1/manifest.json +185 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-games/keywords.json +5672 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-games/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-games/versions/2026.10.1/manifest.json +137 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-geography/manifest.json +68 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-geography/versions/2026.10.1/manifest.json +217 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-history/manifest.json +68 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-history/versions/2026.10.1/manifest.json +217 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-language/keywords.json +4009 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-language/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-language/versions/2026.10.1/manifest.json +141 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-law/keywords.json +4009 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-law/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-law/versions/2026.10.1/manifest.json +185 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-literature/keywords.json +5719 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-literature/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-literature/versions/2026.10.1/manifest.json +193 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-mathematics/keywords.json +4009 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-mathematics/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-mathematics/versions/2026.10.1/manifest.json +189 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-medicine/keywords.json +16009 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-medicine/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-medicine/versions/2026.10.1/manifest.json +185 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-military/keywords.json +5843 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-military/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-military/versions/2026.10.1/manifest.json +189 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-music/keywords.json +6264 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-music/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-music/versions/2026.10.1/manifest.json +197 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-arts/manifest.json +66 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-arts/versions/2026.10.1/manifest.json +209 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-business/manifest.json +61 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-business/versions/2026.10.1/manifest.json +189 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-entertainment/manifest.json +64 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-entertainment/versions/2026.10.1/manifest.json +201 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-military/manifest.json +60 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-military/versions/2026.10.1/manifest.json +185 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-other/manifest.json +55 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-other/versions/2026.10.1/manifest.json +165 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-politics/manifest.json +63 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-politics/versions/2026.10.1/manifest.json +197 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-religion/manifest.json +64 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-religion/versions/2026.10.1/manifest.json +201 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-science/manifest.json +65 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-science/versions/2026.10.1/manifest.json +205 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-sports/manifest.json +73 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-sports/versions/2026.10.1/manifest.json +237 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-politics/keywords.json +5447 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-politics/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-politics/versions/2026.10.1/manifest.json +197 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-religion-philosophy/keywords.json +4009 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-religion-philosophy/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-religion-philosophy/versions/2026.10.1/manifest.json +189 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-science/keywords.json +4009 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-science/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-science/versions/2026.10.1/manifest.json +185 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-sports/keywords.json +5209 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-sports/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-sports/versions/2026.10.1/manifest.json +193 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-technology/keywords.json +6537 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-technology/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-technology/versions/2026.10.1/manifest.json +185 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-transportation/keywords.json +5989 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-transportation/manifest.json +1 -1
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-transportation/versions/2026.10.1/manifest.json +189 -0
- package/dist/catalog/provenance.json +2 -1
- package/dist/engines/native-file-manifest.json +198 -118
- package/dist/engines/native-manifest.d.ts +4 -4
- package/dist/engines/native-manifest.js +36 -34
- package/dist/engines/resolver.js +12 -1
- package/dist/fs/atomic.d.ts +4 -1
- package/dist/fs/atomic.js +7 -1
- package/dist/http/openai-compat/chat-target.d.ts +1 -1
- package/dist/http/openai-compat/chat-target.js +1 -1
- package/dist/http/openai-compat/engine-failure.js +7 -2
- package/dist/http/routes/v1-chat.js +1 -1
- package/dist/http/routes/v1-images.d.ts +44 -0
- package/dist/http/routes/v1-images.js +370 -0
- package/dist/http/routes/v1-knowledge.js +4 -0
- package/dist/http/routes/v1-responses.d.ts +1 -1
- package/dist/inference-service.d.ts +9 -1
- package/dist/inference-service.js +44 -11
- package/dist/knowledge/manager.d.ts +7 -0
- package/dist/knowledge/manager.js +32 -1
- package/dist/kokoro-lexicon/manifest.json +6 -3
- package/dist/models/image-fit.d.ts +83 -0
- package/dist/models/image-fit.js +163 -0
- package/dist/models/weight-facts.d.ts +36 -0
- package/dist/models/weight-facts.js +171 -0
- package/dist/perf/responsiveness.js +4 -3
- package/dist/providers/audio/kokoro-frontend.js +1 -1
- package/dist/providers/ds4/build-provider.js +34 -21
- package/dist/providers/ds4/dspark.d.ts +23 -5
- package/dist/providers/ds4/dspark.js +36 -8
- package/dist/providers/image/img2img-support.d.ts +40 -0
- package/dist/providers/image/img2img-support.js +74 -0
- package/dist/providers/image/local-engine.d.ts +31 -0
- package/dist/providers/image/local-engine.js +47 -0
- package/dist/providers/image/local-factory.d.ts +95 -0
- package/dist/providers/image/local-factory.js +270 -0
- package/dist/providers/image/mock.d.ts +23 -0
- package/dist/providers/image/mock.js +151 -0
- package/dist/providers/image/pull-registry.d.ts +106 -0
- package/dist/providers/image/pull-registry.js +227 -0
- package/dist/providers/image/sd-cpp.d.ts +200 -0
- package/dist/providers/image/sd-cpp.js +845 -0
- package/dist/providers/image/types.d.ts +235 -0
- package/dist/providers/image/types.js +20 -0
- package/dist/providers/llama-cpp/backend-health.d.ts +7 -0
- package/dist/providers/llama-cpp/backend-health.js +41 -1
- package/dist/providers/llama-cpp/build-provider.js +107 -56
- package/dist/providers/llama-cpp/cache-adapter.d.ts +7 -1
- package/dist/providers/llama-cpp/cache-adapter.js +9 -0
- package/dist/providers/llama-cpp/devices.d.ts +13 -2
- package/dist/providers/llama-cpp/devices.js +43 -6
- package/dist/providers/llama-cpp/models.js +4 -1
- package/dist/providers/llama-cpp/offload-planner.d.ts +23 -0
- package/dist/providers/llama-cpp/offload-planner.js +27 -0
- package/dist/providers/llama-cpp/provider.d.ts +14 -3
- package/dist/providers/llama-cpp/provider.js +35 -2
- package/dist/providers/mlx/provider.js +15 -5
- package/dist/providers/mlx/reasoning-stream.d.ts +15 -0
- package/dist/providers/mlx/reasoning-stream.js +35 -0
- package/dist/providers/native/capacity-broker.js +9 -3
- package/dist/providers/native/local-engine-runtime.js +15 -12
- package/dist/providers/native/supervisor.d.ts +8 -0
- package/dist/providers/native/supervisor.js +55 -5
- package/dist/providers/project-macro-loop-bail.js +5 -3
- package/dist/providers/provider-lifecycle.d.ts +21 -0
- package/dist/providers/provider-lifecycle.js +83 -0
- package/dist/providers/queue.d.ts +9 -2
- package/dist/providers/queue.js +17 -2
- package/dist/providers/retirement-gate.d.ts +20 -0
- package/dist/providers/retirement-gate.js +55 -0
- package/dist/providers/session-hooks.d.ts +4 -1
- package/dist/system/memory.js +6 -0
- package/dist/utils/image-meta.d.ts +12 -0
- package/dist/utils/image-meta.js +77 -0
- package/package.json +6 -6
|
@@ -40,12 +40,12 @@
|
|
|
40
40
|
* but logs that it could not anchor to a baked-in digest.
|
|
41
41
|
*/
|
|
42
42
|
/** Native release version this build pins. Placeholder until first public release. */
|
|
43
|
-
export declare const NATIVE_ENGINE_RELEASE = "0.1.
|
|
43
|
+
export declare const NATIVE_ENGINE_RELEASE = "0.1.54";
|
|
44
44
|
/** sha256 of the pinned release's `SHA256SUMS` asset. All-zeros = unpinned. */
|
|
45
|
-
export declare const SHA256SUMS_DIGEST = "
|
|
46
|
-
/** Exact SHA256 values for every engine archive published by native-v0.1.
|
|
45
|
+
export declare const SHA256SUMS_DIGEST = "087215a12096127a779b20e0dcb7d2ed9ce5dda1c81f33fdeb6b6eb730485b20";
|
|
46
|
+
/** Exact SHA256 values for every engine archive published by native-v0.1.54. */
|
|
47
47
|
export declare const NATIVE_ENGINE_ARCHIVE_SHA256: Readonly<Record<string, string>>;
|
|
48
|
-
/** Download size in bytes of every engine archive published by native-v0.1.
|
|
48
|
+
/** Download size in bytes of every engine archive published by native-v0.1.54. */
|
|
49
49
|
export declare const NATIVE_ENGINE_ARCHIVE_BYTES: Readonly<Record<string, number>>;
|
|
50
50
|
/**
|
|
51
51
|
* True only when the pinned release's standalone macOS archives were
|
|
@@ -40,45 +40,47 @@
|
|
|
40
40
|
* but logs that it could not anchor to a baked-in digest.
|
|
41
41
|
*/
|
|
42
42
|
/** Native release version this build pins. Placeholder until first public release. */
|
|
43
|
-
export const NATIVE_ENGINE_RELEASE = '0.1.
|
|
43
|
+
export const NATIVE_ENGINE_RELEASE = '0.1.54';
|
|
44
44
|
/** sha256 of the pinned release's `SHA256SUMS` asset. All-zeros = unpinned. */
|
|
45
|
-
export const SHA256SUMS_DIGEST = '
|
|
45
|
+
export const SHA256SUMS_DIGEST = '087215a12096127a779b20e0dcb7d2ed9ce5dda1c81f33fdeb6b6eb730485b20';
|
|
46
46
|
// BEGIN PINNED NATIVE ARCHIVE HASHES
|
|
47
|
-
/** Exact SHA256 values for every engine archive published by native-v0.1.
|
|
47
|
+
/** Exact SHA256 values for every engine archive published by native-v0.1.54. */
|
|
48
48
|
export const NATIVE_ENGINE_ARCHIVE_SHA256 = Object.freeze({
|
|
49
|
-
'gezel-native-0.1.
|
|
50
|
-
'gezel-native-0.1.
|
|
51
|
-
'gezel-native-0.1.
|
|
52
|
-
'gezel-native-0.1.
|
|
53
|
-
'gezel-native-0.1.
|
|
54
|
-
'gezel-native-0.1.
|
|
55
|
-
'gezel-native-0.1.
|
|
56
|
-
'gezel-native-0.1.
|
|
57
|
-
'gezel-native-0.1.
|
|
58
|
-
'gezel-native-0.1.
|
|
59
|
-
'gezel-native-0.1.
|
|
60
|
-
'gezel-native-0.1.
|
|
61
|
-
'gezel-native-0.1.
|
|
62
|
-
'gezel-native-0.1.
|
|
63
|
-
'gezel-native-0.1.
|
|
49
|
+
'gezel-native-0.1.54-darwin-arm64-metal.tar.gz': 'f2990970303b954af2fd2e2bd31efef7d1c231bea16e026e0cdc0a7f9cc17842',
|
|
50
|
+
'gezel-native-0.1.54-darwin-arm64.tar.gz': '850f28338c52f945996c55edd77cf14d451c9bc4a09f719f6608885ddab99687',
|
|
51
|
+
'gezel-native-0.1.54-linux-arm64-cpu.tar.gz': '7dac7fed45c46b591cd6d597d639c385f54a3a367ac15d6097d3ad04d9c3c6e6',
|
|
52
|
+
'gezel-native-0.1.54-linux-arm64-cuda.tar.gz': 'f73c4569c356c4584199513c6c1f1f0bd3f0151fb1845696e2fa43f2b3626803',
|
|
53
|
+
'gezel-native-0.1.54-linux-arm64.tar.gz': 'f034ad2d3d12165c979d2fff2d34752c8d4f8ff836d3c416c9c64535f3bb652b',
|
|
54
|
+
'gezel-native-0.1.54-linux-x64-cpu.tar.gz': '57de7d52b0e95e3886bf4ffad7e015b98ba8bbea96b95d8cb3e26bc1ff309e99',
|
|
55
|
+
'gezel-native-0.1.54-linux-x64-cuda.tar.gz': 'c2d8616410f72b8bb217194f7c71d5175ed1c94ac6d9d94f660e0f535a3cff22',
|
|
56
|
+
'gezel-native-0.1.54-linux-x64-vulkan.tar.gz': '89f3233f41861404db082219962eb25d1b2c3f6e42bbc2696fda122ce845371d',
|
|
57
|
+
'gezel-native-0.1.54-linux-x64.tar.gz': 'f42e42d71187c6ef5af9685ebb65511bb7ac638815105f09f3df22cfdb9e6bce',
|
|
58
|
+
'gezel-native-0.1.54-win32-arm64-cpu.zip': 'e482e2af92f28135aea2e21ae97290e231b0dc77eadc8cc532d2506304d27575',
|
|
59
|
+
'gezel-native-0.1.54-win32-arm64-cuda.zip': 'ff6eaf7f070e9aba7fc087a155896f73b12664d867e0374af5546e941c153b82',
|
|
60
|
+
'gezel-native-0.1.54-win32-arm64.zip': '9b854d824117fe56d7d532ab83c01693a97cf6b45752e69cb895aa183c8cff35',
|
|
61
|
+
'gezel-native-0.1.54-win32-x64-cpu.zip': '93c8f22b47831ba8e0808033e87ce91cdb0d481890602857b6b8b5295cc7d50b',
|
|
62
|
+
'gezel-native-0.1.54-win32-x64-cuda.zip': '84da0b362e502d0bb6e3509528e7a4ccff50c2b9fcaa2fa1a62b3d9b0ad9f5d2',
|
|
63
|
+
'gezel-native-0.1.54-win32-x64-vulkan.zip': '1a3c99ce8343552fb17af80c36ba8ebb7c13ac8d6b4966f3aa3054018d41fa11',
|
|
64
|
+
'gezel-native-0.1.54-win32-x64.zip': 'f224fcdea6945ce574d32bee6ace345f82847f317c40cfa9059feba9b87ac0ca',
|
|
64
65
|
});
|
|
65
|
-
/** Download size in bytes of every engine archive published by native-v0.1.
|
|
66
|
+
/** Download size in bytes of every engine archive published by native-v0.1.54. */
|
|
66
67
|
export const NATIVE_ENGINE_ARCHIVE_BYTES = Object.freeze({
|
|
67
|
-
'gezel-native-0.1.
|
|
68
|
-
'gezel-native-0.1.
|
|
69
|
-
'gezel-native-0.1.
|
|
70
|
-
'gezel-native-0.1.
|
|
71
|
-
'gezel-native-0.1.
|
|
72
|
-
'gezel-native-0.1.
|
|
73
|
-
'gezel-native-0.1.
|
|
74
|
-
'gezel-native-0.1.
|
|
75
|
-
'gezel-native-0.1.
|
|
76
|
-
'gezel-native-0.1.
|
|
77
|
-
'gezel-native-0.1.
|
|
78
|
-
'gezel-native-0.1.
|
|
79
|
-
'gezel-native-0.1.
|
|
80
|
-
'gezel-native-0.1.
|
|
81
|
-
'gezel-native-0.1.
|
|
68
|
+
'gezel-native-0.1.54-darwin-arm64-metal.tar.gz': 7056387,
|
|
69
|
+
'gezel-native-0.1.54-darwin-arm64.tar.gz': 42224129,
|
|
70
|
+
'gezel-native-0.1.54-linux-arm64-cpu.tar.gz': 8838944,
|
|
71
|
+
'gezel-native-0.1.54-linux-arm64-cuda.tar.gz': 620429935,
|
|
72
|
+
'gezel-native-0.1.54-linux-arm64.tar.gz': 42037092,
|
|
73
|
+
'gezel-native-0.1.54-linux-x64-cpu.tar.gz': 12914025,
|
|
74
|
+
'gezel-native-0.1.54-linux-x64-cuda.tar.gz': 993587032,
|
|
75
|
+
'gezel-native-0.1.54-linux-x64-vulkan.tar.gz': 25672135,
|
|
76
|
+
'gezel-native-0.1.54-linux-x64.tar.gz': 57185943,
|
|
77
|
+
'gezel-native-0.1.54-win32-arm64-cpu.zip': 5623741,
|
|
78
|
+
'gezel-native-0.1.54-win32-arm64-cuda.zip': 242341587,
|
|
79
|
+
'gezel-native-0.1.54-win32-arm64.zip': 42236457,
|
|
80
|
+
'gezel-native-0.1.54-win32-x64-cpu.zip': 8719660,
|
|
81
|
+
'gezel-native-0.1.54-win32-x64-cuda.zip': 749849595,
|
|
82
|
+
'gezel-native-0.1.54-win32-x64-vulkan.zip': 21128362,
|
|
83
|
+
'gezel-native-0.1.54-win32-x64.zip': 55668353,
|
|
82
84
|
});
|
|
83
85
|
// END PINNED NATIVE ARCHIVE HASHES
|
|
84
86
|
/**
|
package/dist/engines/resolver.js
CHANGED
|
@@ -755,6 +755,15 @@ function stampEnv(engine, binPath, variant, versionDir) {
|
|
|
755
755
|
process.env.GEZEL_NATIVE_BIN_DIR = versionDir;
|
|
756
756
|
if (engine === 'llama-server' && variant)
|
|
757
757
|
process.env.GEZEL_LLAMA_SERVER_BACKEND = variant;
|
|
758
|
+
// Windows on ARM's bare archive also carries sqlite-vec, which npm has no
|
|
759
|
+
// build of there. The sqlite driver reads this on every database open, so
|
|
760
|
+
// vector search starts with the next query rather than the next boot.
|
|
761
|
+
const platformKey = resolvePlatformKey();
|
|
762
|
+
const ext = process.platform === 'win32' ? 'dll' : process.platform === 'darwin' ? 'dylib' : 'so';
|
|
763
|
+
const sqliteVec = platformKey ? join(versionDir, platformKey, `vec0.${ext}`) : null;
|
|
764
|
+
if (sqliteVec && !process.env.GEZEL_SQLITE_VEC_PATH && existsSync(sqliteVec)) {
|
|
765
|
+
process.env.GEZEL_SQLITE_VEC_PATH = sqliteVec;
|
|
766
|
+
}
|
|
758
767
|
}
|
|
759
768
|
async function resolveGitHubToken() {
|
|
760
769
|
if (process.env.GEZEL_GITHUB_TOKEN)
|
|
@@ -763,7 +772,9 @@ async function resolveGitHubToken() {
|
|
|
763
772
|
return process.env.GITHUB_TOKEN;
|
|
764
773
|
try {
|
|
765
774
|
const { execFileSync } = await import('node:child_process');
|
|
766
|
-
|
|
775
|
+
// Named host: a bare `gh auth token` answers for gh's default host, which
|
|
776
|
+
// can be a GitHub Enterprise server whose token must not go to github.com.
|
|
777
|
+
const out = execFileSync('gh', ['auth', 'token', '--hostname', 'github.com'], {
|
|
767
778
|
encoding: 'utf8',
|
|
768
779
|
stdio: ['ignore', 'pipe', 'ignore'],
|
|
769
780
|
...windowsHeadlessSpawnOptions(),
|
package/dist/fs/atomic.d.ts
CHANGED
|
@@ -50,4 +50,7 @@ export declare function writeFileAtomic(absPath: string, content: string | Uint8
|
|
|
50
50
|
* private staging file by their adapter, then copied to a sibling temporary
|
|
51
51
|
* path and renamed into place.
|
|
52
52
|
*/
|
|
53
|
-
export declare function copyFileAtomic(sourcePath: string, absPath: string
|
|
53
|
+
export declare function copyFileAtomic(sourcePath: string, absPath: string, opts?: {
|
|
54
|
+
noReplace?: boolean;
|
|
55
|
+
signal?: AbortSignal;
|
|
56
|
+
}): Promise<void>;
|
package/dist/fs/atomic.js
CHANGED
|
@@ -108,10 +108,16 @@ export async function writeFileAtomic(absPath, content, opts) {
|
|
|
108
108
|
* private staging file by their adapter, then copied to a sibling temporary
|
|
109
109
|
* path and renamed into place.
|
|
110
110
|
*/
|
|
111
|
-
export async function copyFileAtomic(sourcePath, absPath) {
|
|
111
|
+
export async function copyFileAtomic(sourcePath, absPath, opts) {
|
|
112
112
|
const tmp = `${absPath}.tmp-${process.pid}-${randomUUID()}`;
|
|
113
113
|
try {
|
|
114
114
|
await copyFile(sourcePath, tmp);
|
|
115
|
+
opts?.signal?.throwIfAborted();
|
|
116
|
+
if (opts?.noReplace) {
|
|
117
|
+
await link(tmp, absPath);
|
|
118
|
+
await rm(tmp, { force: true }).catch(() => undefined);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
115
121
|
await renameWithWindowsRetry(tmp, absPath);
|
|
116
122
|
}
|
|
117
123
|
catch (err) {
|
|
@@ -59,7 +59,7 @@ export declare function resolvePinnedModelTarget(ctx: ServiceContext, model: str
|
|
|
59
59
|
* Pick the gezel that guarantees a persona-backed fallback for public
|
|
60
60
|
* inference requests.
|
|
61
61
|
*
|
|
62
|
-
* The explicit
|
|
62
|
+
* The explicit Integrations choice wins. When it is unset or stale,
|
|
63
63
|
* the install's Meester is the natural front door; the first available
|
|
64
64
|
* gezel is the final recovery path for older or partially migrated
|
|
65
65
|
* homes. A healthy store always has at least a Meester, but returning
|
|
@@ -29,7 +29,7 @@ export async function resolvePinnedModelTarget(ctx, model) {
|
|
|
29
29
|
* Pick the gezel that guarantees a persona-backed fallback for public
|
|
30
30
|
* inference requests.
|
|
31
31
|
*
|
|
32
|
-
* The explicit
|
|
32
|
+
* The explicit Integrations choice wins. When it is unset or stale,
|
|
33
33
|
* the install's Meester is the natural front door; the first available
|
|
34
34
|
* gezel is the final recovery path for older or partially migrated
|
|
35
35
|
* homes. A healthy store always has at least a Meester, but returning
|
|
@@ -53,10 +53,15 @@ function internalCode(err) {
|
|
|
53
53
|
const code = current.code;
|
|
54
54
|
const wire = typeof code === 'string' ? WIRE_CODES.get(code) : undefined;
|
|
55
55
|
// A crash the out-of-memory killer caused is a capacity fact, not a fault.
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
const panicKind = current.panicKind;
|
|
57
|
+
if (wire === 'engine_crashed' && panicKind === 'host-out-of-memory') {
|
|
58
58
|
return 'engine_out_of_memory';
|
|
59
59
|
}
|
|
60
|
+
// A runtime the machine lacks: the engine never started, and retrying
|
|
61
|
+
// cannot help until it is installed.
|
|
62
|
+
if (wire === 'engine_crashed' && panicKind === 'missing-runtime') {
|
|
63
|
+
return 'engine_launch_failed';
|
|
64
|
+
}
|
|
60
65
|
if (wire)
|
|
61
66
|
return wire;
|
|
62
67
|
current = current.cause;
|
|
@@ -289,7 +289,7 @@ export function v1ChatRoutes(ctx, opts = {}) {
|
|
|
289
289
|
// instruct folds, per-gezel overrides for gezel: targets) applies
|
|
290
290
|
// unconditionally — it's "what the model is" — with the caller's
|
|
291
291
|
// per-request knobs overlaid on top. The behavior `profile` is the
|
|
292
|
-
// supporting layer the
|
|
292
|
+
// supporting layer the Integrations switch gates. Caller-owned
|
|
293
293
|
// inference keeps parsing, grammar, and transcript compatibility but
|
|
294
294
|
// omits interventions which assume Gezel owns the action loop.
|
|
295
295
|
// Best-effort: a resolver failure serves engine defaults rather than
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type GezelConfig } from '@bendyline/gezel';
|
|
2
|
+
import type { CatalogService } from '@bendyline/gezel-catalog';
|
|
3
|
+
import { Hono } from 'hono';
|
|
4
|
+
import type { ImageModelPullRegistry } from '../../providers/image/pull-registry.js';
|
|
5
|
+
import { type ImageProvider } from '../../providers/image/types.js';
|
|
6
|
+
export interface ImagesRouteContext {
|
|
7
|
+
home: string;
|
|
8
|
+
catalog: CatalogService;
|
|
9
|
+
store: {
|
|
10
|
+
readConfig(): Promise<GezelConfig>;
|
|
11
|
+
};
|
|
12
|
+
images: {
|
|
13
|
+
/** Whether an engine can render here at all. */
|
|
14
|
+
available(): boolean;
|
|
15
|
+
current(): Promise<ImageProvider>;
|
|
16
|
+
/** Stop the engine, draining renders, before its model files change. */
|
|
17
|
+
reset(): Promise<void>;
|
|
18
|
+
pulls: ImageModelPullRegistry;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* `/v1/images/*` — local image generation for apps.
|
|
23
|
+
*
|
|
24
|
+
* GET /models Installed and downloadable image models,
|
|
25
|
+
* with this machine's fit. Never part of
|
|
26
|
+
* `/v1/models`, so chat pickers never
|
|
27
|
+
* offer them.
|
|
28
|
+
* POST /models/ensure `{model: "sd-cpp:<id>"}` → ready, or a
|
|
29
|
+
* background download (`job_id`).
|
|
30
|
+
* GET /models/ensure/:jobId Snapshot of a download.
|
|
31
|
+
* GET /models/ensure/:jobId/events
|
|
32
|
+
* SSE of `AppEnsureEvent`s, closing after
|
|
33
|
+
* `done` or `error`. Disconnecting does
|
|
34
|
+
* not cancel the download.
|
|
35
|
+
* DELETE /models/ensure/:jobId Cancel the download; a later ensure
|
|
36
|
+
* resumes it.
|
|
37
|
+
* DELETE /models/:id Remove an installed model. A shared
|
|
38
|
+
* model belongs to another store: 409.
|
|
39
|
+
* POST /generations SSE of `AppImageGenerationEvent`s:
|
|
40
|
+
* progress, then one `done` (the PNG) or
|
|
41
|
+
* `error`. Closing the stream cancels the
|
|
42
|
+
* render, which stops the engine.
|
|
43
|
+
*/
|
|
44
|
+
export declare function v1ImagesRoutes(ctx: ImagesRouteContext): Hono;
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
import { AppImageGenerationRequestSchema, createLogger, imageModelDefaultSide, resolveImageSize, } from '@bendyline/gezel';
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import { streamSSE } from 'hono/streaming';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { imageCatalogFits, imageModelFit, wontRunRefusal } from '../../models/image-fit.js';
|
|
6
|
+
import { ReadOnlyModelError, modelExistsOnlyReadOnly, modelStorageRoots, } from '../../models/storage-roots.js';
|
|
7
|
+
import { NoLocalImageModelError } from '../../providers/image/local-factory.js';
|
|
8
|
+
import { ImageCapacityError, ImageGenerationCancelledError, } from '../../providers/image/types.js';
|
|
9
|
+
const log = createLogger('v1-images');
|
|
10
|
+
/** The one local image engine this host serves. */
|
|
11
|
+
const ENGINE = 'sd-cpp';
|
|
12
|
+
const EnsureRequestSchema = z.object({ model: z.string().min(1, 'model is required') });
|
|
13
|
+
function apiError(code, message) {
|
|
14
|
+
return { error: { message, type: 'invalid_request_error', code } };
|
|
15
|
+
}
|
|
16
|
+
/** `sd-cpp:<id>` or a bare `<id>`; null for another engine's id. */
|
|
17
|
+
function catalogIdOf(model) {
|
|
18
|
+
const trimmed = model.trim();
|
|
19
|
+
const colon = trimmed.indexOf(':');
|
|
20
|
+
if (colon < 0)
|
|
21
|
+
return trimmed || null;
|
|
22
|
+
if (trimmed.slice(0, colon) !== ENGINE)
|
|
23
|
+
return null;
|
|
24
|
+
return trimmed.slice(colon + 1).trim() || null;
|
|
25
|
+
}
|
|
26
|
+
function qualified(catalogId) {
|
|
27
|
+
return `${ENGINE}:${catalogId}`;
|
|
28
|
+
}
|
|
29
|
+
function downloadBytes(manifest) {
|
|
30
|
+
return (manifest.approxSizeBytes + manifest.auxiliaryFiles.reduce((n, f) => n + f.approxSizeBytes, 0));
|
|
31
|
+
}
|
|
32
|
+
function describeManifest(manifest) {
|
|
33
|
+
const license = manifest.licenseShortName ?? manifest.license;
|
|
34
|
+
return {
|
|
35
|
+
name: manifest.name,
|
|
36
|
+
description: manifest.description,
|
|
37
|
+
download_bytes: downloadBytes(manifest),
|
|
38
|
+
...(license ? { license } : {}),
|
|
39
|
+
commercial_use: manifest.commercialUse,
|
|
40
|
+
...(manifest.rendersText !== undefined ? { renders_text: manifest.rendersText } : {}),
|
|
41
|
+
...(manifest.promptStyle ? { prompt_style: manifest.promptStyle } : {}),
|
|
42
|
+
...(manifest.hardwareTier ? { hardware_tier: manifest.hardwareTier } : {}),
|
|
43
|
+
...(manifest.minRamGB !== undefined ? { min_ram_gb: manifest.minRamGB } : {}),
|
|
44
|
+
...(manifest.widthRange ? { width_range: manifest.widthRange } : {}),
|
|
45
|
+
...(manifest.heightRange ? { height_range: manifest.heightRange } : {}),
|
|
46
|
+
default_side_px: imageModelDefaultSide(manifest.id),
|
|
47
|
+
...(manifest.supportsImg2Img !== undefined
|
|
48
|
+
? { supports_img2img: manifest.supportsImg2Img }
|
|
49
|
+
: {}),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function ensureEvent(jobId, event, totalBytes) {
|
|
53
|
+
const job = { jobId, modelId: qualified(jobId) };
|
|
54
|
+
switch (event.type) {
|
|
55
|
+
case 'progress':
|
|
56
|
+
return {
|
|
57
|
+
...job,
|
|
58
|
+
type: 'progress',
|
|
59
|
+
bytesWritten: event.bytesWritten,
|
|
60
|
+
totalBytes: event.totalBytes ?? totalBytes,
|
|
61
|
+
};
|
|
62
|
+
case 'retrying':
|
|
63
|
+
return {
|
|
64
|
+
...job,
|
|
65
|
+
type: 'retrying',
|
|
66
|
+
attempt: event.attempt,
|
|
67
|
+
maxAttempts: event.maxAttempts,
|
|
68
|
+
delayMs: event.delayMs,
|
|
69
|
+
reason: event.reason,
|
|
70
|
+
};
|
|
71
|
+
case 'error':
|
|
72
|
+
return { ...job, type: 'error', error: event.error };
|
|
73
|
+
case 'done':
|
|
74
|
+
return { ...job, type: 'done' };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function pullStatus(pull) {
|
|
78
|
+
if (!pull.finished)
|
|
79
|
+
return 'running';
|
|
80
|
+
return pull.error ? 'error' : 'done';
|
|
81
|
+
}
|
|
82
|
+
function generationError(err) {
|
|
83
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
84
|
+
if (err instanceof ImageGenerationCancelledError)
|
|
85
|
+
return { code: 'cancelled', message };
|
|
86
|
+
if (err instanceof ImageCapacityError)
|
|
87
|
+
return { code: err.code, message };
|
|
88
|
+
if (err instanceof NoLocalImageModelError)
|
|
89
|
+
return { code: err.code, message };
|
|
90
|
+
const code = err?.code;
|
|
91
|
+
if (code === 'capacity-denied')
|
|
92
|
+
return { code: 'capacity_denied', message };
|
|
93
|
+
return { code: 'image_generation_failed', message };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* `/v1/images/*` — local image generation for apps.
|
|
97
|
+
*
|
|
98
|
+
* GET /models Installed and downloadable image models,
|
|
99
|
+
* with this machine's fit. Never part of
|
|
100
|
+
* `/v1/models`, so chat pickers never
|
|
101
|
+
* offer them.
|
|
102
|
+
* POST /models/ensure `{model: "sd-cpp:<id>"}` → ready, or a
|
|
103
|
+
* background download (`job_id`).
|
|
104
|
+
* GET /models/ensure/:jobId Snapshot of a download.
|
|
105
|
+
* GET /models/ensure/:jobId/events
|
|
106
|
+
* SSE of `AppEnsureEvent`s, closing after
|
|
107
|
+
* `done` or `error`. Disconnecting does
|
|
108
|
+
* not cancel the download.
|
|
109
|
+
* DELETE /models/ensure/:jobId Cancel the download; a later ensure
|
|
110
|
+
* resumes it.
|
|
111
|
+
* DELETE /models/:id Remove an installed model. A shared
|
|
112
|
+
* model belongs to another store: 409.
|
|
113
|
+
* POST /generations SSE of `AppImageGenerationEvent`s:
|
|
114
|
+
* progress, then one `done` (the PNG) or
|
|
115
|
+
* `error`. Closing the stream cancels the
|
|
116
|
+
* render, which stops the engine.
|
|
117
|
+
*/
|
|
118
|
+
export function v1ImagesRoutes(ctx) {
|
|
119
|
+
const app = new Hono();
|
|
120
|
+
const fitContext = { catalog: ctx.catalog, readConfig: () => ctx.store.readConfig() };
|
|
121
|
+
app.get('/models', async (c) => {
|
|
122
|
+
const provider = await ctx.images.current();
|
|
123
|
+
const [installed, items, fits] = await Promise.all([
|
|
124
|
+
provider.listInstalledModels(),
|
|
125
|
+
ctx.catalog.list('image-model'),
|
|
126
|
+
imageCatalogFits(fitContext).catch((error) => {
|
|
127
|
+
log.warn(`[v1-images] fit assessment failed: ${String(error)}`);
|
|
128
|
+
return null;
|
|
129
|
+
}),
|
|
130
|
+
]);
|
|
131
|
+
const storageRoots = modelStorageRoots({ home: ctx.home, engine: ENGINE });
|
|
132
|
+
const installedIds = new Set(installed.map((m) => m.id));
|
|
133
|
+
const fitById = new Map(fits?.models.map((m) => [m.id, m]) ?? []);
|
|
134
|
+
const downloading = new Set(ctx.images.pulls
|
|
135
|
+
.list()
|
|
136
|
+
.filter((p) => !p.finished)
|
|
137
|
+
.map((p) => p.id));
|
|
138
|
+
const data = [];
|
|
139
|
+
const seen = new Set();
|
|
140
|
+
for (const item of items) {
|
|
141
|
+
const manifest = item.manifest;
|
|
142
|
+
if (manifest.kind !== 'image-model')
|
|
143
|
+
continue;
|
|
144
|
+
seen.add(manifest.id);
|
|
145
|
+
const fit = fitById.get(manifest.id);
|
|
146
|
+
const isInstalled = installedIds.has(manifest.id);
|
|
147
|
+
data.push({
|
|
148
|
+
id: qualified(manifest.id),
|
|
149
|
+
object: 'image_model',
|
|
150
|
+
...describeManifest(manifest),
|
|
151
|
+
name: manifest.name,
|
|
152
|
+
availability: isInstalled
|
|
153
|
+
? 'available'
|
|
154
|
+
: downloading.has(manifest.id)
|
|
155
|
+
? 'downloading'
|
|
156
|
+
: 'download-required',
|
|
157
|
+
...(isInstalled && (await modelExistsOnlyReadOnly(storageRoots, manifest.id))
|
|
158
|
+
? { shared: true }
|
|
159
|
+
: {}),
|
|
160
|
+
...(fit ? { fit: { verdict: fit.verdict, reason: fit.reason } } : {}),
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
// Installed models the catalog no longer lists still render.
|
|
164
|
+
for (const model of installed) {
|
|
165
|
+
if (seen.has(model.id))
|
|
166
|
+
continue;
|
|
167
|
+
data.push({
|
|
168
|
+
id: qualified(model.id),
|
|
169
|
+
object: 'image_model',
|
|
170
|
+
name: model.name,
|
|
171
|
+
availability: 'available',
|
|
172
|
+
...((await modelExistsOnlyReadOnly(storageRoots, model.id)) ? { shared: true } : {}),
|
|
173
|
+
...(model.supportsImg2Img !== undefined ? { supports_img2img: model.supportsImg2Img } : {}),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return c.json({ object: 'list', data });
|
|
177
|
+
});
|
|
178
|
+
app.post('/models/ensure', async (c) => {
|
|
179
|
+
const { model } = EnsureRequestSchema.parse(await c.req.json());
|
|
180
|
+
const id = catalogIdOf(model);
|
|
181
|
+
if (!id) {
|
|
182
|
+
return c.json(apiError('unsupported_backend', `Image models are ${ENGINE}:<id>`), 400);
|
|
183
|
+
}
|
|
184
|
+
const provider = await ctx.images.current();
|
|
185
|
+
const installed = await provider.listInstalledModels();
|
|
186
|
+
if (installed.some((m) => m.id === id)) {
|
|
187
|
+
return c.json({ status: 'ready', model_id: qualified(id) });
|
|
188
|
+
}
|
|
189
|
+
const refusal = await wontRunRefusal(() => imageModelFit(fitContext, id));
|
|
190
|
+
if (refusal)
|
|
191
|
+
return c.json(apiError(refusal.code, refusal.error), 409);
|
|
192
|
+
try {
|
|
193
|
+
await ctx.images.pulls.start(id);
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
if (error.name === 'UnknownImageModelError') {
|
|
197
|
+
return c.json(apiError('unknown_model', `No image model ${model} in the catalog`), 404);
|
|
198
|
+
}
|
|
199
|
+
throw error;
|
|
200
|
+
}
|
|
201
|
+
return c.json({ status: 'downloading', model_id: qualified(id), job_id: id }, 202);
|
|
202
|
+
});
|
|
203
|
+
app.get('/models/ensure/:jobId', (c) => {
|
|
204
|
+
const pull = ctx.images.pulls.get(c.req.param('jobId'));
|
|
205
|
+
if (!pull)
|
|
206
|
+
return c.json(apiError('job_not_found', 'job not found'), 404);
|
|
207
|
+
return c.json({
|
|
208
|
+
job_id: pull.id,
|
|
209
|
+
model_id: qualified(pull.id),
|
|
210
|
+
status: pullStatus(pull),
|
|
211
|
+
started_at: Date.parse(pull.startedAt),
|
|
212
|
+
bytes_written: pull.bytesWritten,
|
|
213
|
+
total_bytes: pull.totalBytes,
|
|
214
|
+
...(pull.error ? { error: pull.error } : {}),
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
app.get('/models/ensure/:jobId/events', (c) => {
|
|
218
|
+
const jobId = c.req.param('jobId');
|
|
219
|
+
const snapshot = ctx.images.pulls.get(jobId);
|
|
220
|
+
if (!snapshot)
|
|
221
|
+
return c.json(apiError('job_not_found', 'job not found'), 404);
|
|
222
|
+
return streamSSE(c, async (stream) => {
|
|
223
|
+
let closed = false;
|
|
224
|
+
let sawError = false;
|
|
225
|
+
const unsubscribe = ctx.images.pulls.subscribe(jobId, (event) => {
|
|
226
|
+
// A failed pull ends with an error and then its done; the error is terminal.
|
|
227
|
+
if (sawError)
|
|
228
|
+
return;
|
|
229
|
+
if (event.type === 'error')
|
|
230
|
+
sawError = true;
|
|
231
|
+
const terminal = event.type === 'done' || event.type === 'error';
|
|
232
|
+
void stream
|
|
233
|
+
.writeSSE({ data: JSON.stringify(ensureEvent(jobId, event, snapshot.totalBytes)) })
|
|
234
|
+
.then(() => {
|
|
235
|
+
if (terminal)
|
|
236
|
+
closed = true;
|
|
237
|
+
})
|
|
238
|
+
.catch(() => {
|
|
239
|
+
closed = true;
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
if (!unsubscribe)
|
|
243
|
+
return;
|
|
244
|
+
stream.onAbort(() => {
|
|
245
|
+
closed = true;
|
|
246
|
+
unsubscribe();
|
|
247
|
+
});
|
|
248
|
+
while (!closed) {
|
|
249
|
+
await stream.sleep(1000);
|
|
250
|
+
try {
|
|
251
|
+
await stream.writeSSE({ event: 'ping', data: '' });
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
closed = true;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
unsubscribe();
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
app.delete('/models/ensure/:jobId', (c) => {
|
|
261
|
+
if (!ctx.images.pulls.cancel(c.req.param('jobId'))) {
|
|
262
|
+
return c.json(apiError('job_not_found', 'No download in progress for that job'), 404);
|
|
263
|
+
}
|
|
264
|
+
return c.json({ cancelled: true });
|
|
265
|
+
});
|
|
266
|
+
app.delete('/models/:id', async (c) => {
|
|
267
|
+
const id = catalogIdOf(decodeURIComponent(c.req.param('id')));
|
|
268
|
+
if (!id)
|
|
269
|
+
return c.json(apiError('unsupported_backend', `Image models are ${ENGINE}:<id>`), 400);
|
|
270
|
+
const storageRoots = modelStorageRoots({ home: ctx.home, engine: ENGINE });
|
|
271
|
+
if (await modelExistsOnlyReadOnly(storageRoots, id)) {
|
|
272
|
+
return c.json(apiError('shared_model', 'This model is shared from another store and is not removed here'), 409);
|
|
273
|
+
}
|
|
274
|
+
// The engine may hold the model's files open.
|
|
275
|
+
await ctx.images.reset();
|
|
276
|
+
try {
|
|
277
|
+
await (await ctx.images.current()).deleteModel(id);
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
if (error instanceof ReadOnlyModelError) {
|
|
281
|
+
return c.json(apiError('shared_model', error.message), 409);
|
|
282
|
+
}
|
|
283
|
+
throw error;
|
|
284
|
+
}
|
|
285
|
+
return c.body(null, 204);
|
|
286
|
+
});
|
|
287
|
+
app.post('/generations', async (c) => {
|
|
288
|
+
const request = AppImageGenerationRequestSchema.parse(await c.req.json());
|
|
289
|
+
if (!ctx.images.available()) {
|
|
290
|
+
return c.json(apiError('images_unavailable', 'Image generation is not available on this computer'), 503);
|
|
291
|
+
}
|
|
292
|
+
const provider = await ctx.images.current();
|
|
293
|
+
const installed = await provider.listInstalledModels();
|
|
294
|
+
const requested = request.model ? catalogIdOf(request.model) : undefined;
|
|
295
|
+
if (request.model && !requested) {
|
|
296
|
+
return c.json(apiError('unsupported_backend', `Image models are ${ENGINE}:<id>`), 400);
|
|
297
|
+
}
|
|
298
|
+
const modelId = requested ?? (await provider.resolveDefaultModelId?.());
|
|
299
|
+
if (!modelId || !installed.some((m) => m.id === modelId)) {
|
|
300
|
+
const error = requested
|
|
301
|
+
? apiError('model_not_installed', `${request.model} is not installed; ensure it first`)
|
|
302
|
+
: apiError('no_local_image_model', new NoLocalImageModelError().message);
|
|
303
|
+
return c.json(error, 409);
|
|
304
|
+
}
|
|
305
|
+
const item = await ctx.catalog.get('image-model', modelId).catch(() => null);
|
|
306
|
+
const manifest = item?.manifest.kind === 'image-model' ? item.manifest : undefined;
|
|
307
|
+
const { width, height } = resolveImageSize({
|
|
308
|
+
...(request.aspect_ratio ? { aspectRatio: request.aspect_ratio } : {}),
|
|
309
|
+
...(request.quality ? { quality: request.quality } : {}),
|
|
310
|
+
}, {
|
|
311
|
+
defaultSidePx: imageModelDefaultSide(modelId),
|
|
312
|
+
...(manifest?.widthRange ? { widthRange: manifest.widthRange } : {}),
|
|
313
|
+
...(manifest?.heightRange ? { heightRange: manifest.heightRange } : {}),
|
|
314
|
+
});
|
|
315
|
+
return streamSSE(c, async (stream) => {
|
|
316
|
+
const controller = new AbortController();
|
|
317
|
+
const cancel = () => controller.abort();
|
|
318
|
+
stream.onAbort(cancel);
|
|
319
|
+
c.req.raw.signal.addEventListener('abort', cancel, { once: true });
|
|
320
|
+
const send = (event) => stream.writeSSE({ data: JSON.stringify(event) }).catch(cancel);
|
|
321
|
+
let last = '';
|
|
322
|
+
const onProgress = (progress) => {
|
|
323
|
+
const event = {
|
|
324
|
+
type: 'progress',
|
|
325
|
+
phase: progress.phase ?? 'sampling',
|
|
326
|
+
step: progress.step,
|
|
327
|
+
total_steps: progress.totalSteps,
|
|
328
|
+
...(progress.secondsPerStep ? { seconds_per_step: progress.secondsPerStep } : {}),
|
|
329
|
+
};
|
|
330
|
+
const key = JSON.stringify(event);
|
|
331
|
+
if (key === last)
|
|
332
|
+
return;
|
|
333
|
+
last = key;
|
|
334
|
+
void send(event);
|
|
335
|
+
};
|
|
336
|
+
try {
|
|
337
|
+
const out = await provider.generate({
|
|
338
|
+
prompt: request.prompt,
|
|
339
|
+
...(request.negative_prompt ? { negativePrompt: request.negative_prompt } : {}),
|
|
340
|
+
model: modelId,
|
|
341
|
+
width,
|
|
342
|
+
height,
|
|
343
|
+
...(request.seed !== undefined ? { seed: request.seed } : {}),
|
|
344
|
+
signal: controller.signal,
|
|
345
|
+
onProgress,
|
|
346
|
+
});
|
|
347
|
+
await send({
|
|
348
|
+
type: 'done',
|
|
349
|
+
b64_png: out.png.toString('base64'),
|
|
350
|
+
width: out.meta.widthPx,
|
|
351
|
+
height: out.meta.heightPx,
|
|
352
|
+
seed: out.meta.seed,
|
|
353
|
+
model: qualified(out.meta.model),
|
|
354
|
+
steps: out.meta.steps,
|
|
355
|
+
duration_ms: out.meta.durationMs,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
if (!controller.signal.aborted) {
|
|
360
|
+
log.warn(`[v1-images] generation failed: ${String(error)}`);
|
|
361
|
+
}
|
|
362
|
+
await send({ type: 'error', error: generationError(error) });
|
|
363
|
+
}
|
|
364
|
+
finally {
|
|
365
|
+
c.req.raw.signal.removeEventListener('abort', cancel);
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
});
|
|
369
|
+
return app;
|
|
370
|
+
}
|
|
@@ -222,6 +222,10 @@ export function v1KnowledgeRoutes(ctx) {
|
|
|
222
222
|
maxResults: 24,
|
|
223
223
|
queryEmbedBudgetMs: 5000,
|
|
224
224
|
catalogs: enabled.map((entry) => entry.ref.catalogId),
|
|
225
|
+
// Let the reranker choose among an article's sections: one passage per
|
|
226
|
+
// article, picked by embedding similarity, sent an infobox in place of
|
|
227
|
+
// the history the person asked about.
|
|
228
|
+
chunksPerDocument: 3,
|
|
225
229
|
});
|
|
226
230
|
c.req.raw.signal.throwIfAborted();
|
|
227
231
|
const candidates = [];
|
|
@@ -9,7 +9,7 @@ import type { InferenceContext } from '../inference-context.js';
|
|
|
9
9
|
* and returns assistant text/tool calls in Responses wire shapes. The route
|
|
10
10
|
* intentionally does not create a Gezel chat session or attach Gezel MCP.
|
|
11
11
|
*
|
|
12
|
-
* In the full service, auth is mounted in `server.ts`: the
|
|
12
|
+
* In the full service, auth is mounted in `server.ts`: the Integrations
|
|
13
13
|
* master switch, bearer authentication, and the `openai` scope all apply. Codex can therefore use
|
|
14
14
|
* an app-scoped token without ever learning the daemon's root credential.
|
|
15
15
|
*/
|