naas-abi-core 1.0.7__tar.gz → 1.1.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.
Files changed (131) hide show
  1. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/=0.9.13 +1 -1
  2. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/CHANGELOG.md +11 -0
  3. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/PKG-INFO +2 -1
  4. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/cli/__init__.py +2 -1
  5. naas_abi_core-1.1.0/naas_abi_core/cli/deploy.py +199 -0
  6. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration.py +3 -1
  7. naas_abi_core-1.1.0/naas_abi_core/engine/engine_configuration/EngineConfiguration_Deploy.py +6 -0
  8. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/pyproject.toml +2 -1
  9. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/.gitignore +0 -0
  10. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/README.md +0 -0
  11. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/assets/favicon.ico +0 -0
  12. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/__init__.py +0 -0
  13. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/apps/api/api.py +0 -0
  14. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/apps/api/api_test.py +0 -0
  15. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/apps/api/openapi_doc.py +0 -0
  16. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/apps/mcp/Dockerfile.mcp +0 -0
  17. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/apps/mcp/mcp_server.py +0 -0
  18. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/apps/mcp/mcp_server_test.py +0 -0
  19. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/apps/terminal_agent/main.py +0 -0
  20. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/apps/terminal_agent/terminal_style.py +0 -0
  21. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/cli/agent.py +0 -0
  22. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/cli/chat.py +0 -0
  23. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/cli/config.py +0 -0
  24. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/cli/init.py +0 -0
  25. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/cli/module.py +0 -0
  26. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/cli/new.py +0 -0
  27. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/cli/secret.py +0 -0
  28. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/Engine.py +0 -0
  29. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/EngineProxy.py +0 -0
  30. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/Engine_test.py +0 -0
  31. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/IEngine.py +0 -0
  32. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/conftest.py +0 -0
  33. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_GenericLoader.py +0 -0
  34. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_ObjectStorageService.py +0 -0
  35. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_ObjectStorageService_test.py +0 -0
  36. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_SecretService.py +0 -0
  37. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_TripleStoreService.py +0 -0
  38. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_VectorStoreService.py +0 -0
  39. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_test.py +0 -0
  40. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/engine_configuration/utils/PydanticModelValidator.py +0 -0
  41. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/engine_loaders/EngineModuleLoader.py +0 -0
  42. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/engine_loaders/EngineOntologyLoader.py +0 -0
  43. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/engine/engine_loaders/EngineServiceLoader.py +0 -0
  44. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/integration/__init__.py +0 -0
  45. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/integration/integration.py +0 -0
  46. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/models/Model.py +0 -0
  47. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/models/OpenRouter.py +0 -0
  48. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/models/OpenRouter_test.py +0 -0
  49. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/module/Module.py +0 -0
  50. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/module/ModuleAgentLoader.py +0 -0
  51. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/module/ModuleUtils.py +0 -0
  52. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/modules/templatablesparqlquery/README.md +0 -0
  53. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/modules/templatablesparqlquery/__init__.py +0 -0
  54. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/modules/templatablesparqlquery/ontologies/TemplatableSparqlQueryOntology.ttl +0 -0
  55. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/modules/templatablesparqlquery/workflows/GenericWorkflow.py +0 -0
  56. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/modules/templatablesparqlquery/workflows/TemplatableSparqlQueryLoader.py +0 -0
  57. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/pipeline/__init__.py +0 -0
  58. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/pipeline/pipeline.py +0 -0
  59. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/__init__.py +0 -0
  60. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/agent/Agent.py +0 -0
  61. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/agent/AgentMemory_test.py +0 -0
  62. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/agent/Agent_test.py +0 -0
  63. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/agent/IntentAgent.py +0 -0
  64. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/agent/IntentAgent_test.py +0 -0
  65. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/agent/beta/Embeddings.py +0 -0
  66. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/agent/beta/IntentMapper.py +0 -0
  67. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/agent/beta/LocalModel.py +0 -0
  68. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/agent/beta/VectorStore.py +0 -0
  69. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/agent/test_agent_memory.py +0 -0
  70. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/agent/test_postgres_integration.py +0 -0
  71. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/cache/CacheFactory.py +0 -0
  72. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/cache/CachePort.py +0 -0
  73. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/cache/CacheService.py +0 -0
  74. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/cache/CacheService_test.py +0 -0
  75. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/cache/adapters/secondary/CacheFSAdapter.py +0 -0
  76. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/object_storage/ObjectStorageFactory.py +0 -0
  77. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/object_storage/ObjectStoragePort.py +0 -0
  78. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/object_storage/ObjectStorageService.py +0 -0
  79. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/object_storage/adapters/secondary/ObjectStorageSecondaryAdapterFS.py +0 -0
  80. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/object_storage/adapters/secondary/ObjectStorageSecondaryAdapterNaas.py +0 -0
  81. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/object_storage/adapters/secondary/ObjectStorageSecondaryAdapterS3.py +0 -0
  82. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/ontology/OntologyPorts.py +0 -0
  83. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/ontology/OntologyService.py +0 -0
  84. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/ontology/adaptors/secondary/OntologyService_SecondaryAdaptor_NERPort.py +0 -0
  85. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/secret/Secret.py +0 -0
  86. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/secret/SecretPorts.py +0 -0
  87. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/secret/Secret_test.py +0 -0
  88. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/secret/adaptors/secondary/Base64Secret.py +0 -0
  89. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/secret/adaptors/secondary/Base64Secret_test.py +0 -0
  90. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/secret/adaptors/secondary/NaasSecret.py +0 -0
  91. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/secret/adaptors/secondary/NaasSecret_test.py +0 -0
  92. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/secret/adaptors/secondary/dotenv_secret_secondaryadaptor.py +0 -0
  93. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/triple_store/TripleStoreFactory.py +0 -0
  94. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/triple_store/TripleStorePorts.py +0 -0
  95. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/triple_store/TripleStoreService.py +0 -0
  96. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/triple_store/adaptors/secondary/AWSNeptune.py +0 -0
  97. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/triple_store/adaptors/secondary/AWSNeptune_test.py +0 -0
  98. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/triple_store/adaptors/secondary/Oxigraph.py +0 -0
  99. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/triple_store/adaptors/secondary/Oxigraph_test.py +0 -0
  100. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/triple_store/adaptors/secondary/TripleStoreService__SecondaryAdaptor__Filesystem.py +0 -0
  101. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/triple_store/adaptors/secondary/TripleStoreService__SecondaryAdaptor__ObjectStorage.py +0 -0
  102. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/triple_store/adaptors/secondary/base/TripleStoreService__SecondaryAdaptor__FileBase.py +0 -0
  103. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/vector_store/IVectorStorePort.py +0 -0
  104. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/vector_store/IVectorStorePort_test.py +0 -0
  105. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/vector_store/VectorStoreFactory.py +0 -0
  106. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/vector_store/VectorStoreService.py +0 -0
  107. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/vector_store/VectorStoreService_test.py +0 -0
  108. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/vector_store/__init__.py +0 -0
  109. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/vector_store/adapters/QdrantAdapter.py +0 -0
  110. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/services/vector_store/adapters/QdrantAdapter_test.py +0 -0
  111. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/tests/test_services_imports.py +0 -0
  112. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/Expose.py +0 -0
  113. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/Graph.py +0 -0
  114. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/JSON.py +0 -0
  115. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/LazyLoader.py +0 -0
  116. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/Logger.py +0 -0
  117. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/OntologyReasoner.py +0 -0
  118. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/OntologyYaml.disabled.py +0 -0
  119. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/SPARQL.py +0 -0
  120. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/Storage.py +0 -0
  121. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/StorageUtils.py +0 -0
  122. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/String.py +0 -0
  123. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/Workers.py +0 -0
  124. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/__init__.py +0 -0
  125. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/onto2py/README.md +0 -0
  126. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/onto2py/__init__.py +0 -0
  127. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/onto2py/__main__.py +0 -0
  128. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/onto2py/onto2py.py +0 -0
  129. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/utils/onto2py/tests/ttl2py_test.py +0 -0
  130. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/workflow/__init__.py +0 -0
  131. {naas_abi_core-1.0.7 → naas_abi_core-1.1.0}/naas_abi_core/workflow/workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Collecting uv
2
2
  Downloading uv-0.9.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB)
3
3
  Downloading uv-0.9.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (21.7 MB)
4
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 21.7/21.7 MB 200.6 MB/s 0:00:00
4
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 21.7/21.7 MB 210.2 MB/s 0:00:00
5
5
  Installing collected packages: uv
6
6
  Successfully installed uv-0.9.15
@@ -2,6 +2,17 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v1.1.0 (2025-12-05)
6
+
7
+ ### Features
8
+
9
+ - Make it possible to add env var using cli deploy
10
+ ([`eb32c8d`](https://github.com/jupyter-naas/abi/commit/eb32c8d9613ecbddb3a891f25db0a5bc3498b258))
11
+
12
+
13
+ ## v1.0.8 (2025-12-05)
14
+
15
+
5
16
  ## v1.0.7 (2025-12-03)
6
17
 
7
18
  ### Bug Fixes
@@ -1,10 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: naas-abi-core
3
- Version: 1.0.7
3
+ Version: 1.1.0
4
4
  Summary: Abi framework allowing you to build your AI system.
5
5
  Author-email: Maxime Jublou <maxime@naas.ai>, Florent Ravenel <florent@naas.ai>, Jeremy Ravenel <jeremy@naas.ai>
6
6
  Requires-Python: <4,>=3.10
7
7
  Requires-Dist: click<8.2,>=8.1.1
8
+ Requires-Dist: docker>=7.1.0
8
9
  Requires-Dist: dotenv>=0.9.9
9
10
  Requires-Dist: fastapi<0.116,>=0.115.5
10
11
  Requires-Dist: fastmcp>=2.13.2
@@ -7,7 +7,7 @@ from .init import init
7
7
  from .module import module
8
8
  from .new import new
9
9
  from .secret import secrets
10
-
10
+ from .deploy import deploy
11
11
  # from dotenv import load_dotenv
12
12
 
13
13
  # load_dotenv()
@@ -48,6 +48,7 @@ main.add_command(agent)
48
48
  main.add_command(chat)
49
49
  main.add_command(new)
50
50
  main.add_command(init)
51
+ main.add_command(deploy)
51
52
 
52
53
  # if __name__ == "__main__":
53
54
  main()
@@ -0,0 +1,199 @@
1
+ import json
2
+ import subprocess
3
+ from uuid import uuid4
4
+
5
+ import click
6
+ import requests
7
+ from pydantic import BaseModel
8
+ from rich.console import Console
9
+ from rich.markdown import Markdown
10
+
11
+ from naas_abi_core import logger
12
+ from naas_abi_core.engine.engine_configuration.EngineConfiguration import (
13
+ EngineConfiguration,
14
+ )
15
+
16
+
17
+ @click.group("deploy")
18
+ def deploy():
19
+ pass
20
+
21
+
22
+ class Container(BaseModel):
23
+ name: str
24
+ image: str
25
+ port: int
26
+ cpu: str
27
+ memory: str
28
+ env: dict
29
+
30
+
31
+ class Space(BaseModel):
32
+ name: str
33
+ containers: list[Container]
34
+
35
+
36
+ class NaasAPIClient:
37
+ naas_api_key: str
38
+ base_url: str
39
+
40
+ def __init__(self, naas_api_key: str):
41
+ self.naas_api_key = naas_api_key
42
+ self.base_url = "https://api.naas.ai"
43
+
44
+ def create_registry(self, name: str):
45
+ response = requests.post(
46
+ f"{self.base_url}/registry/",
47
+ headers={"Authorization": f"Bearer {self.naas_api_key}"},
48
+ json={"name": name},
49
+ )
50
+ if response.status_code == 409:
51
+ return self.get_registry(name)
52
+ response.raise_for_status()
53
+ return response.json()
54
+
55
+ def get_registry(self, name: str):
56
+ response = requests.get(
57
+ f"{self.base_url}/registry/{name}",
58
+ headers={"Authorization": f"Bearer {self.naas_api_key}"},
59
+ )
60
+ response.raise_for_status()
61
+ return response.json()
62
+
63
+ def get_registry_credentials(self, name: str):
64
+ response = requests.get(
65
+ f"{self.base_url}/registry/{name}/credentials",
66
+ headers={"Authorization": f"Bearer {self.naas_api_key}"},
67
+ )
68
+ response.raise_for_status()
69
+ return response.json()
70
+
71
+ def update_space(self, space: Space) -> dict:
72
+ response = requests.put(
73
+ f"{self.base_url}/space/{space.name}",
74
+ headers={"Authorization": f"Bearer {self.naas_api_key}"},
75
+ json=space.model_dump(),
76
+ )
77
+ response.raise_for_status()
78
+ return response.json()
79
+
80
+ def create_space(self, space: Space) -> dict:
81
+ response = requests.post(
82
+ f"{self.base_url}/space/",
83
+ headers={"Authorization": f"Bearer {self.naas_api_key}"},
84
+ json=space.model_dump(),
85
+ )
86
+
87
+ if response.status_code == 409:
88
+ return self.update_space(space)
89
+
90
+ response.raise_for_status()
91
+ return response.json()
92
+
93
+ def get_space(self, name: str) -> dict:
94
+ response = requests.get(
95
+ f"{self.base_url}/space/{name}",
96
+ headers={"Authorization": f"Bearer {self.naas_api_key}"},
97
+ )
98
+ response.raise_for_status()
99
+ return response.json()
100
+
101
+
102
+ class NaasDeployer:
103
+ image_name: str
104
+
105
+ naas_api_client: NaasAPIClient
106
+
107
+ def __init__(self, configuration: EngineConfiguration):
108
+ self.configuration = configuration
109
+ self.image_name = str(uuid4())
110
+ assert configuration.deploy is not None
111
+ self.naas_api_client = NaasAPIClient(configuration.deploy.naas_api_key)
112
+
113
+ def docker_build(self, image_name: str):
114
+ subprocess.run(
115
+ f"docker build -t {image_name} . --platform linux/amd64", shell=True
116
+ )
117
+
118
+ def env_list_to_dict(self, env: list[str]) -> dict:
119
+ return {env_var.split("=", 1)[0]: env_var.split("=", 1)[1] for env_var in env}
120
+
121
+ def deploy(self, env: list[str]):
122
+ registry = self.naas_api_client.create_registry(
123
+ self.configuration.deploy.space_name
124
+ )
125
+
126
+ uid = str(uuid4())
127
+
128
+ image_name = f"{registry['registry']['uri']}:{uid}"
129
+ self.docker_build(image_name)
130
+ credentials = self.naas_api_client.get_registry_credentials(
131
+ self.configuration.deploy.space_name
132
+ )
133
+ docker_login_command = f"docker login -u {credentials['credentials']['username']} -p {credentials['credentials']['password']} {registry['registry']['uri']}"
134
+ subprocess.run(docker_login_command, shell=True)
135
+ subprocess.run(f"docker push {image_name}", shell=True)
136
+
137
+ image_sha = (
138
+ subprocess.run(
139
+ "docker inspect --format='{{index .RepoDigests 0}}' "
140
+ + image_name
141
+ + " | cut -d'@' -f2",
142
+ shell=True,
143
+ capture_output=True,
144
+ )
145
+ .stdout.strip()
146
+ .decode("utf-8")
147
+ )
148
+
149
+ image_name_with_sha = f"{image_name.replace(':' + uid, '')}@{image_sha}"
150
+
151
+
152
+ self.naas_api_client.create_space(
153
+ Space(
154
+ name=self.configuration.deploy.space_name,
155
+ containers=[
156
+ Container(
157
+ name="api",
158
+ image=image_name_with_sha,
159
+ port=9879,
160
+ cpu="1",
161
+ memory="1Gi",
162
+ env=self.env_list_to_dict(env) | {
163
+ "NAAS_API_KEY": self.configuration.deploy.naas_api_key,
164
+ "ENV": "prod",
165
+ },
166
+ )
167
+ ],
168
+ )
169
+ )
170
+
171
+ space = self.naas_api_client.get_space(self.configuration.deploy.space_name)
172
+
173
+ Console().print(
174
+ Markdown(f"""
175
+ # Deployment successful
176
+
177
+ - Space: {self.configuration.deploy.space_name}
178
+ - Image: {image_name_with_sha}
179
+ - URL: https://{self.configuration.deploy.space_name}.default.space.naas.ai
180
+
181
+ ```json
182
+ {json.dumps(space, indent=4)}
183
+ ```
184
+ """)
185
+ )
186
+
187
+
188
+ @deploy.command("naas")
189
+ @click.option("-e", "--env", multiple=True, help="Environment variables to set (e.g. -e FOO=BAR -e BAZ=QUX)")
190
+ def naas(env: list[str]):
191
+ configuration: EngineConfiguration = EngineConfiguration.load_configuration()
192
+
193
+ if configuration.deploy is None:
194
+ logger.error(
195
+ "Deploy configuration not found in the yaml configuration file. Please add a deploy section to the configuration file."
196
+ )
197
+
198
+ deployer = NaasDeployer(configuration)
199
+ deployer.deploy(env)
@@ -20,7 +20,7 @@ from naas_abi_core.engine.engine_configuration.EngineConfiguration_VectorStoreSe
20
20
  from naas_abi_core.services.secret.Secret import Secret
21
21
  from pydantic import BaseModel, model_validator
22
22
  from typing_extensions import Literal
23
-
23
+ from naas_abi_core.engine.engine_configuration.EngineConfiguration_Deploy import DeployConfiguration
24
24
 
25
25
  class ServicesConfiguration(BaseModel):
26
26
  object_storage: ObjectStorageServiceConfiguration
@@ -80,6 +80,8 @@ class GlobalConfig(BaseModel):
80
80
 
81
81
  class EngineConfiguration(BaseModel):
82
82
  api: ApiConfiguration
83
+
84
+ deploy: DeployConfiguration | None = None
83
85
 
84
86
  services: ServicesConfiguration
85
87
 
@@ -0,0 +1,6 @@
1
+ from pydantic import BaseModel
2
+
3
+ class DeployConfiguration(BaseModel):
4
+ workspace_id: str
5
+ space_name: str
6
+ naas_api_key: str
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "naas-abi-core"
3
- version = "1.0.7"
3
+ version = "1.1.0"
4
4
  description = "Abi framework allowing you to build your AI system."
5
5
  authors = [{ name = "Maxime Jublou", email = "maxime@naas.ai" },{ name = "Florent Ravenel", email = "florent@naas.ai" }, { name = "Jeremy Ravenel", email = "jeremy@naas.ai" }]
6
6
  requires-python = ">=3.10,<4"
@@ -31,6 +31,7 @@ dependencies = [
31
31
  "fastmcp>=2.13.2",
32
32
  "pandas>=2.3.3",
33
33
  "pillow>=12.0.0",
34
+ "docker>=7.1.0",
34
35
  ]
35
36
 
36
37
  [project.optional-dependencies]
File without changes
File without changes