naas-abi-core 1.1.3.dev1__tar.gz → 1.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.
Files changed (132) hide show
  1. naas_abi_core-1.2.0/=0.9.13 +6 -0
  2. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/CHANGELOG.md +22 -3
  3. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/PKG-INFO +1 -1
  4. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration.py +32 -2
  5. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/models/OpenRouter.py +5 -2
  6. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/module/ModuleAgentLoader.py +1 -0
  7. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/agent/IntentAgent.py +9 -1
  8. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/agent/beta/Embeddings.py +3 -2
  9. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/agent/beta/IntentMapper.py +4 -3
  10. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/secret/adaptors/secondary/dotenv_secret_secondaryadaptor.py +4 -1
  11. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/Logger.py +1 -1
  12. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/pyproject.toml +1 -2
  13. naas_abi_core-1.1.3.dev1/=0.9.13 +0 -6
  14. naas_abi_core-1.1.3.dev1/naas_abi_core/cli/__init__.py +0 -54
  15. naas_abi_core-1.1.3.dev1/naas_abi_core/cli/agent.py +0 -30
  16. naas_abi_core-1.1.3.dev1/naas_abi_core/cli/chat.py +0 -26
  17. naas_abi_core-1.1.3.dev1/naas_abi_core/cli/config.py +0 -49
  18. naas_abi_core-1.1.3.dev1/naas_abi_core/cli/deploy.py +0 -209
  19. naas_abi_core-1.1.3.dev1/naas_abi_core/cli/init.py +0 -13
  20. naas_abi_core-1.1.3.dev1/naas_abi_core/cli/module.py +0 -28
  21. naas_abi_core-1.1.3.dev1/naas_abi_core/cli/new.py +0 -13
  22. naas_abi_core-1.1.3.dev1/naas_abi_core/cli/secret.py +0 -79
  23. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/.gitignore +0 -0
  24. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/README.md +0 -0
  25. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/assets/favicon.ico +0 -0
  26. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/__init__.py +0 -0
  27. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/apps/api/api.py +0 -0
  28. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/apps/api/api_test.py +0 -0
  29. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/apps/api/openapi_doc.py +0 -0
  30. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/apps/mcp/Dockerfile.mcp +0 -0
  31. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/apps/mcp/mcp_server.py +0 -0
  32. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/apps/mcp/mcp_server_test.py +0 -0
  33. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/apps/terminal_agent/main.py +0 -0
  34. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/apps/terminal_agent/terminal_style.py +0 -0
  35. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/Engine.py +0 -0
  36. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/EngineProxy.py +0 -0
  37. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/Engine_test.py +0 -0
  38. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/IEngine.py +0 -0
  39. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/conftest.py +0 -0
  40. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_Deploy.py +0 -0
  41. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_GenericLoader.py +0 -0
  42. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_ObjectStorageService.py +0 -0
  43. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_ObjectStorageService_test.py +0 -0
  44. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_SecretService.py +0 -0
  45. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_TripleStoreService.py +0 -0
  46. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_VectorStoreService.py +0 -0
  47. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/engine_configuration/EngineConfiguration_test.py +0 -0
  48. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/engine_configuration/utils/PydanticModelValidator.py +0 -0
  49. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/engine_loaders/EngineModuleLoader.py +0 -0
  50. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/engine_loaders/EngineOntologyLoader.py +0 -0
  51. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/engine/engine_loaders/EngineServiceLoader.py +0 -0
  52. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/integration/__init__.py +0 -0
  53. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/integration/integration.py +0 -0
  54. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/models/Model.py +0 -0
  55. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/models/OpenRouter_test.py +0 -0
  56. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/module/Module.py +0 -0
  57. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/module/ModuleUtils.py +0 -0
  58. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/modules/templatablesparqlquery/README.md +0 -0
  59. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/modules/templatablesparqlquery/__init__.py +0 -0
  60. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/modules/templatablesparqlquery/ontologies/TemplatableSparqlQueryOntology.ttl +0 -0
  61. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/modules/templatablesparqlquery/workflows/GenericWorkflow.py +0 -0
  62. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/modules/templatablesparqlquery/workflows/TemplatableSparqlQueryLoader.py +0 -0
  63. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/pipeline/__init__.py +0 -0
  64. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/pipeline/pipeline.py +0 -0
  65. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/__init__.py +0 -0
  66. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/agent/Agent.py +0 -0
  67. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/agent/AgentMemory_test.py +0 -0
  68. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/agent/Agent_test.py +0 -0
  69. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/agent/IntentAgent_test.py +0 -0
  70. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/agent/beta/LocalModel.py +0 -0
  71. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/agent/beta/VectorStore.py +0 -0
  72. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/agent/test_agent_memory.py +0 -0
  73. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/agent/test_postgres_integration.py +0 -0
  74. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/cache/CacheFactory.py +0 -0
  75. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/cache/CachePort.py +0 -0
  76. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/cache/CacheService.py +0 -0
  77. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/cache/CacheService_test.py +0 -0
  78. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/cache/adapters/secondary/CacheFSAdapter.py +0 -0
  79. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/object_storage/ObjectStorageFactory.py +0 -0
  80. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/object_storage/ObjectStoragePort.py +0 -0
  81. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/object_storage/ObjectStorageService.py +0 -0
  82. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/object_storage/adapters/secondary/ObjectStorageSecondaryAdapterFS.py +0 -0
  83. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/object_storage/adapters/secondary/ObjectStorageSecondaryAdapterNaas.py +0 -0
  84. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/object_storage/adapters/secondary/ObjectStorageSecondaryAdapterS3.py +0 -0
  85. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/ontology/OntologyPorts.py +0 -0
  86. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/ontology/OntologyService.py +0 -0
  87. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/ontology/adaptors/secondary/OntologyService_SecondaryAdaptor_NERPort.py +0 -0
  88. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/secret/Secret.py +0 -0
  89. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/secret/SecretPorts.py +0 -0
  90. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/secret/Secret_test.py +0 -0
  91. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/secret/adaptors/secondary/Base64Secret.py +0 -0
  92. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/secret/adaptors/secondary/Base64Secret_test.py +0 -0
  93. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/secret/adaptors/secondary/NaasSecret.py +0 -0
  94. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/secret/adaptors/secondary/NaasSecret_test.py +0 -0
  95. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/triple_store/TripleStoreFactory.py +0 -0
  96. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/triple_store/TripleStorePorts.py +0 -0
  97. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/triple_store/TripleStoreService.py +0 -0
  98. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/triple_store/adaptors/secondary/AWSNeptune.py +0 -0
  99. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/triple_store/adaptors/secondary/AWSNeptune_test.py +0 -0
  100. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/triple_store/adaptors/secondary/Oxigraph.py +0 -0
  101. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/triple_store/adaptors/secondary/Oxigraph_test.py +0 -0
  102. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/triple_store/adaptors/secondary/TripleStoreService__SecondaryAdaptor__Filesystem.py +0 -0
  103. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/triple_store/adaptors/secondary/TripleStoreService__SecondaryAdaptor__ObjectStorage.py +0 -0
  104. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/triple_store/adaptors/secondary/base/TripleStoreService__SecondaryAdaptor__FileBase.py +0 -0
  105. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/vector_store/IVectorStorePort.py +0 -0
  106. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/vector_store/IVectorStorePort_test.py +0 -0
  107. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/vector_store/VectorStoreFactory.py +0 -0
  108. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/vector_store/VectorStoreService.py +0 -0
  109. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/vector_store/VectorStoreService_test.py +0 -0
  110. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/vector_store/__init__.py +0 -0
  111. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/vector_store/adapters/QdrantAdapter.py +0 -0
  112. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/services/vector_store/adapters/QdrantAdapter_test.py +0 -0
  113. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/tests/test_services_imports.py +0 -0
  114. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/Expose.py +0 -0
  115. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/Graph.py +0 -0
  116. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/JSON.py +0 -0
  117. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/LazyLoader.py +0 -0
  118. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/OntologyReasoner.py +0 -0
  119. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/OntologyYaml.disabled.py +0 -0
  120. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/SPARQL.py +0 -0
  121. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/Storage.py +0 -0
  122. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/StorageUtils.py +0 -0
  123. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/String.py +0 -0
  124. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/Workers.py +0 -0
  125. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/__init__.py +0 -0
  126. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/onto2py/README.md +0 -0
  127. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/onto2py/__init__.py +0 -0
  128. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/onto2py/__main__.py +0 -0
  129. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/onto2py/onto2py.py +0 -0
  130. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/utils/onto2py/tests/ttl2py_test.py +0 -0
  131. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/workflow/__init__.py +0 -0
  132. {naas_abi_core-1.1.3.dev1 → naas_abi_core-1.2.0}/naas_abi_core/workflow/workflow.py +0 -0
@@ -0,0 +1,6 @@
1
+ Collecting uv
2
+ Downloading uv-0.9.18-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB)
3
+ Downloading uv-0.9.18-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (22.2 MB)
4
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 22.2/22.2 MB 185.4 MB/s 0:00:00
5
+ Installing collected packages: uv
6
+ Successfully installed uv-0.9.18
@@ -2,12 +2,31 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
- ## v1.1.3-dev.1 (2025-12-08)
5
+ ## v1.2.0 (2025-12-19)
6
6
 
7
7
  ### Bug Fixes
8
8
 
9
- - Linting errors
10
- ([`fe8c0a4`](https://github.com/jupyter-naas/abi/commit/fe8c0a4b8969bf70eb5aebe83e060a4771298638))
9
+ - Inject naas_abi_core.modules.templatablesparqlquery by default
10
+ ([`b6dc785`](https://github.com/jupyter-naas/abi/commit/b6dc78519e71afb46dd2ffc401539fab19fb865f))
11
+
12
+ - Review
13
+ ([`6301a5f`](https://github.com/jupyter-naas/abi/commit/6301a5fcda63875b2748a625727903f236772966))
14
+
15
+ - Review
16
+ ([`1ad319b`](https://github.com/jupyter-naas/abi/commit/1ad319ba2e47463ab84cabf7edbd2b721b053e3b))
17
+
18
+ ### Chores
19
+
20
+ - Remove comments
21
+ ([`05868ff`](https://github.com/jupyter-naas/abi/commit/05868ff0c60ccb3e7da46cdd8903d207622d5e8c))
22
+
23
+ - Remove duplicate logger
24
+ ([`8438450`](https://github.com/jupyter-naas/abi/commit/84384505a88b9645e56628b39bfda8da054792cc))
25
+
26
+ ### Features
27
+
28
+ - Workin on naas-abi-cli
29
+ ([`16cd62d`](https://github.com/jupyter-naas/abi/commit/16cd62d77879d94c83fae9218bd451c1909554e4))
11
30
 
12
31
 
13
32
  ## v1.1.2 (2025-12-05)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: naas-abi-core
3
- Version: 1.1.3.dev1
3
+ Version: 1.2.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
@@ -1,4 +1,5 @@
1
1
  import os
2
+ import sys
2
3
  from io import StringIO
3
4
  from typing import List
4
5
 
@@ -22,7 +23,8 @@ from naas_abi_core.engine.engine_configuration.EngineConfiguration_VectorStoreSe
22
23
  )
23
24
  from naas_abi_core.services.secret.Secret import Secret
24
25
  from pydantic import BaseModel, model_validator
25
- from typing_extensions import Literal
26
+ from rich.prompt import Prompt
27
+ from typing_extensions import Literal, Self
26
28
 
27
29
 
28
30
  class ServicesConfiguration(BaseModel):
@@ -92,6 +94,25 @@ class EngineConfiguration(BaseModel):
92
94
 
93
95
  modules: List[ModuleConfig]
94
96
 
97
+ def ensure_default_modules(self) -> None:
98
+ if not any(
99
+ m.path == "naas_abi_core.modules.templatablesparqlquery"
100
+ or m.module == "naas_abi_core.modules.templatablesparqlquery"
101
+ for m in self.modules
102
+ ):
103
+ self.modules.append(
104
+ ModuleConfig(
105
+ module="naas_abi_core.modules.templatablesparqlquery",
106
+ enabled=True,
107
+ config={},
108
+ )
109
+ )
110
+
111
+ @model_validator(mode="after")
112
+ def validate_modules(self) -> Self:
113
+ self.ensure_default_modules()
114
+ return self
115
+
95
116
  @classmethod
96
117
  def from_yaml(cls, yaml_path: str) -> "EngineConfiguration":
97
118
  with open(yaml_path, "r") as file:
@@ -111,7 +132,16 @@ class EngineConfiguration(BaseModel):
111
132
  return 0
112
133
  secret = self.secret_service.get(name)
113
134
  if secret is None:
114
- raise ValueError(f"Secret {name} not found")
135
+ if not sys.stdin.isatty():
136
+ raise ValueError(
137
+ f"Secret '{name}' not found and no TTY available to prompt. Please provide it via the configured secret service or environment."
138
+ )
139
+ value = Prompt.ask(
140
+ f"[bold yellow]Secret '{name}' not found.[/bold yellow] Please enter the value for [cyan]{name}[/cyan]",
141
+ password=False,
142
+ )
143
+ self.secret_service.set(name, value)
144
+ return value
115
145
  return secret
116
146
 
117
147
  def get(self, key, default=None):
@@ -1,8 +1,11 @@
1
1
  import os
2
+
3
+ # from dotenv import load_dotenv
2
4
  from langchain_openai import ChatOpenAI # using the OpenAI LLM class as wrapper
3
5
  from pydantic import SecretStr
4
- from dotenv import load_dotenv
5
- load_dotenv()
6
+
7
+ # load_dotenv()
8
+
6
9
 
7
10
  class ChatOpenRouter(ChatOpenAI):
8
11
  def __init__(self, model_name: str, **kwargs):
@@ -23,6 +23,7 @@ class ModuleAgentLoader:
23
23
  agent_module_path = (
24
24
  f"{class_.__module__}.agents.{file.replace('.py', '')}"
25
25
  )
26
+ logger.debug(f"Importing agent module from {agent_module_path}")
26
27
  agent_module = importlib.import_module(agent_module_path)
27
28
  for key, value in agent_module.__dict__.items():
28
29
  if (
@@ -13,6 +13,7 @@ from langgraph.graph.message import MessagesState
13
13
  from langgraph.types import Command
14
14
  from naas_abi_core import logger
15
15
  from naas_abi_core.models.Model import ChatModel
16
+ from spacy.cli import download as spacy_download
16
17
 
17
18
  from .Agent import Agent, AgentConfiguration, AgentSharedState, create_checkpointer
18
19
  from .beta.IntentMapper import Intent, IntentMapper, IntentScope, IntentType
@@ -23,7 +24,14 @@ _nlp = None
23
24
  def get_nlp():
24
25
  global _nlp
25
26
  if _nlp is None:
26
- _nlp = spacy.load("en_core_web_sm")
27
+ try:
28
+ _nlp = spacy.load("en_core_web_sm")
29
+ except OSError:
30
+ logger.warning(
31
+ "Downloading spacy model en_core_web_sm as it is not installed. This is a one time operation and can take a few seconds to complete based on your internet connection speed."
32
+ )
33
+ spacy_download("en_core_web_sm")
34
+ _nlp = spacy.load("en_core_web_sm")
27
35
  return _nlp
28
36
 
29
37
 
@@ -2,13 +2,14 @@ import hashlib
2
2
  import os
3
3
 
4
4
  import requests
5
- from dotenv import load_dotenv
5
+
6
+ # from dotenv import load_dotenv
6
7
  from naas_abi_core.services.cache.CacheFactory import CacheFactory
7
8
  from naas_abi_core.services.cache.CachePort import DataType
8
9
  from pydantic import SecretStr
9
10
  from tqdm import tqdm
10
11
 
11
- load_dotenv()
12
+ # load_dotenv()
12
13
 
13
14
 
14
15
  cache = CacheFactory.CacheFS_find_storage(subpath="intent_mapping")
@@ -3,16 +3,17 @@ from dataclasses import dataclass
3
3
  from enum import Enum
4
4
  from typing import Any, Optional, Tuple
5
5
 
6
- from dotenv import load_dotenv
6
+ # from dotenv import load_dotenv
7
7
  from langchain_openai import ChatOpenAI
8
8
  from pydantic import SecretStr
9
9
 
10
- from .Embeddings import EMBEDDINGS_MODELS_DIMENSIONS_MAP, embeddings_batch
10
+ from .Embeddings import EMBEDDINGS_MODELS_DIMENSIONS_MAP
11
11
  from .Embeddings import _model_name as embeddings_model_name
12
12
  from .Embeddings import embeddings as embeddings
13
+ from .Embeddings import embeddings_batch
13
14
  from .VectorStore import VectorStore
14
15
 
15
- load_dotenv()
16
+ # load_dotenv()
16
17
 
17
18
 
18
19
  class IntentScope(Enum):
@@ -1,12 +1,15 @@
1
1
  import os
2
2
  from typing import Any, Dict
3
3
 
4
- from dotenv import dotenv_values, set_key
4
+ from dotenv import dotenv_values, find_dotenv, set_key
5
5
  from naas_abi_core.services.secret.SecretPorts import ISecretAdapter
6
+ from naas_abi_core.utils.Logger import logger
6
7
 
7
8
 
8
9
  class DotenvSecretSecondaryAdaptor(ISecretAdapter):
9
10
  def __init__(self):
11
+ logger.debug(f"dotenv is using the file: {find_dotenv()}")
12
+
10
13
  self.secrets = dotenv_values()
11
14
 
12
15
  def get(self, key: str, default: Any = None) -> str:
@@ -9,4 +9,4 @@ def reconfigure(level: str = "DEBUG"):
9
9
  logger.add(sys.stderr, level=level)
10
10
 
11
11
 
12
- reconfigure(os.environ.get("LOG_LEVEL", "ERROR"))
12
+ reconfigure(os.environ.get("LOG_LEVEL", "WARNING"))
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "naas-abi-core"
3
- version = "1.1.3-dev.1"
3
+ version = "1.2.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"
@@ -56,7 +56,6 @@ openrouter = [
56
56
  "langchain-openai>=0.3.35",
57
57
  ]
58
58
  [project.scripts]
59
- abi = "naas_abi_core.cli:main"
60
59
  onto2py = "naas_abi_core.utils.onto2py.__main__:main"
61
60
 
62
61
  [build-system]
@@ -1,6 +0,0 @@
1
- Collecting uv
2
- Downloading uv-0.9.16-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB)
3
- Downloading uv-0.9.16-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (22.0 MB)
4
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 22.0/22.0 MB 73.1 MB/s 0:00:00
5
- Installing collected packages: uv
6
- Successfully installed uv-0.9.16
@@ -1,54 +0,0 @@
1
- import click
2
-
3
- from .agent import agent
4
- from .chat import chat
5
- from .config import config
6
- from .init import init
7
- from .module import module
8
- from .new import new
9
- from .secret import secrets
10
- from .deploy import deploy
11
- # from dotenv import load_dotenv
12
-
13
- # load_dotenv()
14
-
15
-
16
- @click.group("abi")
17
- def main():
18
- pass
19
-
20
-
21
- # @main.command("chat")
22
- # @click.option("--module-name", type=str, required=True, default="chatgpt")
23
- # @click.option("--agent-name", type=str, required=True, default="ChatGPTAgent")
24
- # def chat(module_name: str, agent_name: str):
25
- # from naas_abi_core.engine.Engine import Engine
26
-
27
- # engine = Engine()
28
- # engine.load(module_names=[module_name])
29
-
30
- # from naas_abi_core.apps.terminal_agent.main import run_agent
31
-
32
- # logger.debug(f"Module agents: {engine.modules[module_name].agents}")
33
-
34
- # for agent_class in engine.modules[module_name].agents:
35
- # logger.debug(f"Agent class: {agent_class.__name__}")
36
- # if agent_class.__name__ == agent_name:
37
- # run_agent(agent_class.New())
38
- # break
39
-
40
-
41
- # Add the secrets group to the main abi group
42
-
43
-
44
- main.add_command(secrets)
45
- main.add_command(config)
46
- main.add_command(module)
47
- main.add_command(agent)
48
- main.add_command(chat)
49
- main.add_command(new)
50
- main.add_command(init)
51
- main.add_command(deploy)
52
-
53
- # if __name__ == "__main__":
54
- main()
@@ -1,30 +0,0 @@
1
- import click
2
- from rich.console import Console
3
- from rich.table import Table
4
-
5
- from naas_abi_core.engine.Engine import Engine
6
-
7
-
8
- @click.group("agent")
9
- def agent():
10
- pass
11
-
12
-
13
- @agent.command("list")
14
- def list():
15
- engine = Engine()
16
- engine.load()
17
-
18
- console = Console()
19
- table = Table(
20
- title="Available Agents", show_header=True, header_style="bold magenta"
21
- )
22
- table.add_column("Module", style="cyan", no_wrap=True)
23
- table.add_column("Agent", style="green")
24
-
25
- modules = engine.modules
26
- for module in modules:
27
- for agent in modules[module].agents:
28
- table.add_row(module, agent.__name__)
29
-
30
- console.print(table)
@@ -1,26 +0,0 @@
1
- import click
2
-
3
- from naas_abi_core import logger
4
-
5
-
6
- @click.command("chat")
7
- @click.argument("module-name", type=str, required=True, default="naas_abi")
8
- @click.argument("agent-name", type=str, required=True, default="AbiAgent")
9
- def chat(module_name: str, agent_name: str):
10
- from naas_abi_core.engine.Engine import Engine
11
-
12
- engine = Engine()
13
- engine.load(module_names=[module_name])
14
-
15
- from naas_abi_core.apps.terminal_agent.main import run_agent
16
-
17
- if module_name not in engine.modules:
18
- raise ValueError(f"Module {module_name} not found")
19
-
20
- logger.debug(f"Module agents: {engine.modules[module_name].agents}")
21
-
22
- for agent_class in engine.modules[module_name].agents:
23
- logger.debug(f"Agent class: {agent_class.__name__}")
24
- if agent_class.__name__ == agent_name:
25
- run_agent(agent_class.New())
26
- break
@@ -1,49 +0,0 @@
1
- import os
2
-
3
- import click
4
- import yaml
5
-
6
- from naas_abi_core.engine.engine_configuration.EngineConfiguration import (
7
- EngineConfiguration,
8
- )
9
-
10
-
11
- @click.group("config")
12
- def config():
13
- pass
14
-
15
-
16
- @config.command("validate")
17
- @click.option("--configuration-file", type=str, required=False, default=None)
18
- def validate(configuration_file: str | None):
19
- configuration_content: str | None = None
20
-
21
- if configuration_file is not None:
22
- if not os.path.exists(configuration_file):
23
- raise FileNotFoundError(
24
- f"Configuration file {configuration_file} not found"
25
- )
26
- with open(configuration_file, "r") as file:
27
- configuration_content = file.read()
28
-
29
- EngineConfiguration.load_configuration(configuration_content)
30
- print("Configuration is valid")
31
-
32
-
33
- @config.command("render")
34
- @click.option("--configuration-file", type=str, required=False, default=None)
35
- def render(configuration_file: str | None):
36
- configuration_content: str | None = None
37
-
38
- if configuration_file is not None:
39
- if not os.path.exists(configuration_file):
40
- raise FileNotFoundError(
41
- f"Configuration file {configuration_file} not found"
42
- )
43
- with open(configuration_file, "r") as file:
44
- configuration_content = file.read()
45
-
46
- configuration: EngineConfiguration = EngineConfiguration.load_configuration(
47
- configuration_content
48
- )
49
- print(yaml.dump(configuration.model_dump(), indent=2))
@@ -1,209 +0,0 @@
1
- import subprocess
2
- from uuid import uuid4
3
-
4
- import click
5
- import requests
6
- from pydantic import BaseModel
7
- from rich.console import Console
8
- from rich.markdown import Markdown
9
-
10
- from naas_abi_core import logger
11
- from naas_abi_core.engine.engine_configuration.EngineConfiguration import (
12
- EngineConfiguration,
13
- )
14
-
15
-
16
- @click.group("deploy")
17
- def deploy():
18
- pass
19
-
20
-
21
- class Container(BaseModel):
22
- name: str
23
- image: str
24
- port: int
25
- cpu: str
26
- memory: str
27
- env: dict
28
-
29
-
30
- class Space(BaseModel):
31
- name: str
32
- containers: list[Container]
33
-
34
-
35
- class NaasAPIClient:
36
- naas_api_key: str
37
- base_url: str
38
-
39
- def __init__(self, naas_api_key: str):
40
- self.naas_api_key = naas_api_key
41
- self.base_url = "https://api.naas.ai"
42
-
43
- def create_registry(self, name: str):
44
- response = requests.post(
45
- f"{self.base_url}/registry/",
46
- headers={"Authorization": f"Bearer {self.naas_api_key}"},
47
- json={"name": name},
48
- )
49
- if response.status_code == 409:
50
- return self.get_registry(name)
51
- response.raise_for_status()
52
- return response.json()
53
-
54
- def get_registry(self, name: str):
55
- response = requests.get(
56
- f"{self.base_url}/registry/{name}",
57
- headers={"Authorization": f"Bearer {self.naas_api_key}"},
58
- )
59
- response.raise_for_status()
60
- return response.json()
61
-
62
- def get_registry_credentials(self, name: str):
63
- response = requests.get(
64
- f"{self.base_url}/registry/{name}/credentials",
65
- headers={"Authorization": f"Bearer {self.naas_api_key}"},
66
- )
67
- response.raise_for_status()
68
- return response.json()
69
-
70
- def update_space(self, space: Space) -> dict:
71
- response = requests.put(
72
- f"{self.base_url}/space/{space.name}",
73
- headers={"Authorization": f"Bearer {self.naas_api_key}"},
74
- json=space.model_dump(),
75
- )
76
- response.raise_for_status()
77
- return response.json()
78
-
79
- def create_space(self, space: Space) -> dict:
80
- response = requests.post(
81
- f"{self.base_url}/space/",
82
- headers={"Authorization": f"Bearer {self.naas_api_key}"},
83
- json=space.model_dump(),
84
- )
85
-
86
- if response.status_code == 409:
87
- return self.update_space(space)
88
-
89
- response.raise_for_status()
90
- return response.json()
91
-
92
- def get_space(self, name: str) -> dict:
93
- response = requests.get(
94
- f"{self.base_url}/space/{name}",
95
- headers={"Authorization": f"Bearer {self.naas_api_key}"},
96
- )
97
- response.raise_for_status()
98
- return response.json()
99
-
100
-
101
- class NaasDeployer:
102
- image_name: str
103
-
104
- naas_api_client: NaasAPIClient
105
- configuration: EngineConfiguration
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
- if self.configuration.deploy is None:
123
- logger.error(
124
- "Deploy configuration not found in the yaml configuration file. Please add a deploy section to the configuration file."
125
- )
126
- raise ValueError(
127
- "Deploy configuration not found in the yaml configuration file. Please add a deploy section to the configuration file."
128
- )
129
-
130
- registry = self.naas_api_client.create_registry(
131
- self.configuration.deploy.space_name
132
- )
133
-
134
- uid = str(uuid4())
135
-
136
- image_name = f"{registry['registry']['uri']}:{uid}"
137
- self.docker_build(image_name)
138
- credentials = self.naas_api_client.get_registry_credentials(
139
- self.configuration.deploy.space_name
140
- )
141
- docker_login_command = f"docker login -u {credentials['credentials']['username']} -p {credentials['credentials']['password']} {registry['registry']['uri']}"
142
- subprocess.run(docker_login_command, shell=True)
143
- subprocess.run(f"docker push {image_name}", shell=True)
144
-
145
- image_sha = (
146
- subprocess.run(
147
- "docker inspect --format='{{index .RepoDigests 0}}' "
148
- + image_name
149
- + " | cut -d'@' -f2",
150
- shell=True,
151
- capture_output=True,
152
- )
153
- .stdout.strip()
154
- .decode("utf-8")
155
- )
156
-
157
- image_name_with_sha = f"{image_name.replace(':' + uid, '')}@{image_sha}"
158
-
159
- self.naas_api_client.create_space(
160
- Space(
161
- name=self.configuration.deploy.space_name,
162
- containers=[
163
- Container(
164
- name="api",
165
- image=image_name_with_sha,
166
- port=9879,
167
- cpu="1",
168
- memory="1Gi",
169
- # env=self.env_list_to_dict(env) | {
170
- # "NAAS_API_KEY": self.configuration.deploy.naas_api_key,
171
- # "ENV": "prod",
172
- # },
173
- env=self.configuration.deploy.env | self.env_list_to_dict(env),
174
- )
175
- ],
176
- )
177
- )
178
-
179
- self.naas_api_client.get_space(self.configuration.deploy.space_name)
180
-
181
- Console().print(
182
- Markdown(f"""
183
- # Deployment successful
184
-
185
- - Space: {self.configuration.deploy.space_name}
186
- - Image: {image_name_with_sha}
187
- - URL: https://{self.configuration.deploy.space_name}.default.space.naas.ai
188
-
189
- """)
190
- )
191
-
192
-
193
- @deploy.command("naas")
194
- @click.option(
195
- "-e",
196
- "--env",
197
- multiple=True,
198
- help="Environment variables to set (e.g. -e FOO=BAR -e BAZ=QUX)",
199
- )
200
- def naas(env: list[str]):
201
- configuration: EngineConfiguration = EngineConfiguration.load_configuration()
202
-
203
- if configuration.deploy is None:
204
- logger.error(
205
- "Deploy configuration not found in the yaml configuration file. Please add a deploy section to the configuration file."
206
- )
207
-
208
- deployer = NaasDeployer(configuration)
209
- deployer.deploy(env)
@@ -1,13 +0,0 @@
1
- import os
2
-
3
- import click
4
-
5
-
6
- @click.command("init")
7
- @click.argument("path")
8
- def init(path: str):
9
- if path == ".":
10
- path = os.getcwd()
11
-
12
- os.makedirs(path, exist_ok=True)
13
- # os.exec(f"cd {path} && uv init .")
@@ -1,28 +0,0 @@
1
- import click
2
- from naas_abi_core.engine.engine_configuration.EngineConfiguration import (
3
- EngineConfiguration,
4
- )
5
- from rich.console import Console
6
- from rich.table import Table
7
-
8
-
9
- @click.group("module")
10
- def module():
11
- pass
12
-
13
-
14
- @module.command("list")
15
- def list() -> None:
16
- configuration: EngineConfiguration = EngineConfiguration.load_configuration()
17
-
18
- console = Console()
19
- table = Table(
20
- title="Available Modules", show_header=True, header_style="bold magenta"
21
- )
22
- table.add_column("Module", style="cyan", no_wrap=True)
23
- table.add_column("Enabled", style="green")
24
-
25
- for module in configuration.modules:
26
- table.add_row(module.module, str(module.enabled))
27
-
28
- console.print(table)
@@ -1,13 +0,0 @@
1
- import click
2
-
3
-
4
- @click.group("new")
5
- def new():
6
- pass
7
-
8
-
9
- @new.command("module")
10
- @click.argument("module-name")
11
- @click.argument("module-path")
12
- def new_module(module_name: str, module_path: str):
13
- print(f"Creating a new module: {module_name} at {module_path}")
@@ -1,79 +0,0 @@
1
- import os
2
-
3
- import click
4
-
5
-
6
- @click.group("secrets")
7
- def secrets():
8
- pass
9
-
10
-
11
- @secrets.group("naas")
12
- def naas():
13
- pass
14
-
15
-
16
- @naas.command("push-env-as-base64")
17
- @click.option(
18
- "--naas-api-key", type=str, required=True, default=os.getenv("NAAS_API_KEY")
19
- )
20
- @click.option("--naas-api-url", type=str, required=True, default="https://api.naas.ai")
21
- @click.option("--naas-secret-name", type=str, required=True, default="abi_secrets")
22
- @click.option("--env-file", type=str, required=True, default=".env.prod")
23
- def push_env_to_naas(naas_api_key, naas_api_url, naas_secret_name, env_file):
24
- import base64
25
-
26
- from naas_abi_core.services.secret.adaptors.secondary.NaasSecret import NaasSecret
27
-
28
- naas_secret = NaasSecret(naas_api_key, naas_api_url)
29
-
30
- envfile_content = ""
31
-
32
- with open(env_file, "r") as envfile:
33
- envfile_content = envfile.read()
34
-
35
- print(envfile_content)
36
-
37
- base64_content = base64.b64encode(envfile_content.encode("utf-8")).decode("utf-8")
38
- naas_secret.set(naas_secret_name, base64_content)
39
-
40
- print(f"Pushed {env_file} to Naas as base64 secret {naas_secret_name}")
41
-
42
-
43
- @naas.command("list")
44
- @click.option(
45
- "--naas-api-key", type=str, required=True, default=os.getenv("NAAS_API_KEY")
46
- )
47
- @click.option("--naas-api-url", type=str, required=True, default="https://api.naas.ai")
48
- def list_secrets(naas_api_key, naas_api_url):
49
- from naas_abi_core.services.secret.adaptors.secondary.NaasSecret import NaasSecret
50
-
51
- naas_secret = NaasSecret(naas_api_key, naas_api_url)
52
-
53
- naas_secret.list()
54
-
55
- for key, value in naas_secret.list().items():
56
- print(f"{key}: {value}")
57
-
58
-
59
- @naas.command("get-base64-env")
60
- @click.option(
61
- "--naas-api-key", type=str, required=True, default=os.getenv("NAAS_API_KEY")
62
- )
63
- @click.option("--naas-api-url", type=str, required=True, default="https://api.naas.ai")
64
- @click.option("--naas-secret-name", type=str, required=True, default="abi_secrets")
65
- def get_secret(naas_api_key, naas_api_url, naas_secret_name):
66
- from naas_abi_core.services.secret.adaptors.secondary.Base64Secret import (
67
- Base64Secret,
68
- )
69
- from naas_abi_core.services.secret.adaptors.secondary.NaasSecret import NaasSecret
70
-
71
- naas_secret = NaasSecret(naas_api_key, naas_api_url)
72
- base64_secret = Base64Secret(naas_secret, naas_secret_name)
73
-
74
- for key, value in base64_secret.list().items():
75
- # If value is multiline
76
- if "\n" in value:
77
- print(f'{key}="{value}"')
78
- else:
79
- print(f"{key}={value}")