trustgraph-base 2.2.21__tar.gz → 2.2.23__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 (164) hide show
  1. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/PKG-INFO +1 -1
  2. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/async_processor.py +0 -1
  3. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/consumer.py +47 -23
  4. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/graph_rag_client.py +2 -2
  5. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/subscriber.py +30 -16
  6. trustgraph_base-2.2.23/trustgraph/base_version.py +1 -0
  7. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/clients/document_rag_client.py +2 -2
  8. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/clients/graph_rag_client.py +2 -2
  9. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/provenance/triples.py +10 -3
  10. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph_base.egg-info/PKG-INFO +1 -1
  11. trustgraph_base-2.2.21/trustgraph/base_version.py +0 -1
  12. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/README.md +0 -0
  13. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/pyproject.toml +0 -0
  14. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/setup.cfg +0 -0
  15. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/__init__.py +0 -0
  16. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/api.py +0 -0
  17. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/async_bulk_client.py +0 -0
  18. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/async_flow.py +0 -0
  19. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/async_metrics.py +0 -0
  20. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/async_socket_client.py +0 -0
  21. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/bulk_client.py +0 -0
  22. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/collection.py +0 -0
  23. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/config.py +0 -0
  24. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/exceptions.py +0 -0
  25. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/explainability.py +0 -0
  26. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/flow.py +0 -0
  27. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/knowledge.py +0 -0
  28. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/library.py +0 -0
  29. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/metrics.py +0 -0
  30. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/socket_client.py +0 -0
  31. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/api/types.py +0 -0
  32. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/__init__.py +0 -0
  33. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/agent_client.py +0 -0
  34. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/agent_service.py +0 -0
  35. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/backend.py +0 -0
  36. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/cassandra_config.py +0 -0
  37. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/chunking_service.py +0 -0
  38. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/collection_config_handler.py +0 -0
  39. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/consumer_spec.py +0 -0
  40. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/document_embeddings_client.py +0 -0
  41. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/document_embeddings_query_service.py +0 -0
  42. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/document_embeddings_store_service.py +0 -0
  43. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/dynamic_tool_service.py +0 -0
  44. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/embeddings_client.py +0 -0
  45. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/embeddings_service.py +0 -0
  46. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/flow.py +0 -0
  47. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/flow_processor.py +0 -0
  48. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/graph_embeddings_client.py +0 -0
  49. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/graph_embeddings_query_service.py +0 -0
  50. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/graph_embeddings_store_service.py +0 -0
  51. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/librarian_client.py +0 -0
  52. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/llm_service.py +0 -0
  53. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/logging.py +0 -0
  54. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/metrics.py +0 -0
  55. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/parameter_spec.py +0 -0
  56. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/producer.py +0 -0
  57. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/producer_spec.py +0 -0
  58. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/prompt_client.py +0 -0
  59. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/publisher.py +0 -0
  60. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/pubsub.py +0 -0
  61. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/pulsar_backend.py +0 -0
  62. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/rabbitmq_backend.py +0 -0
  63. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/request_response_spec.py +0 -0
  64. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/row_embeddings_query_client.py +0 -0
  65. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/serialization.py +0 -0
  66. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/spec.py +0 -0
  67. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/structured_query_client.py +0 -0
  68. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/subscriber_spec.py +0 -0
  69. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/text_completion_client.py +0 -0
  70. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/tool_client.py +0 -0
  71. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/tool_service.py +0 -0
  72. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/tool_service_client.py +0 -0
  73. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/triples_client.py +0 -0
  74. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/triples_query_service.py +0 -0
  75. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/base/triples_store_service.py +0 -0
  76. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/clients/__init__.py +0 -0
  77. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/clients/agent_client.py +0 -0
  78. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/clients/base.py +0 -0
  79. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/clients/config_client.py +0 -0
  80. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/clients/document_embeddings_client.py +0 -0
  81. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/clients/embeddings_client.py +0 -0
  82. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/clients/graph_embeddings_client.py +0 -0
  83. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/clients/llm_client.py +0 -0
  84. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/clients/prompt_client.py +0 -0
  85. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/clients/row_embeddings_client.py +0 -0
  86. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/clients/triples_query_client.py +0 -0
  87. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/exceptions.py +0 -0
  88. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/knowledge/__init__.py +0 -0
  89. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/knowledge/defs.py +0 -0
  90. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/knowledge/document.py +0 -0
  91. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/knowledge/identifier.py +0 -0
  92. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/knowledge/organization.py +0 -0
  93. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/knowledge/publication.py +0 -0
  94. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/log_level.py +0 -0
  95. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/__init__.py +0 -0
  96. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/registry.py +0 -0
  97. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/__init__.py +0 -0
  98. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/agent.py +0 -0
  99. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/base.py +0 -0
  100. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/collection.py +0 -0
  101. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/config.py +0 -0
  102. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/diagnosis.py +0 -0
  103. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/document_loading.py +0 -0
  104. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/embeddings.py +0 -0
  105. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/embeddings_query.py +0 -0
  106. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/flow.py +0 -0
  107. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/knowledge.py +0 -0
  108. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/library.py +0 -0
  109. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/metadata.py +0 -0
  110. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/nlp_query.py +0 -0
  111. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/primitives.py +0 -0
  112. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/prompt.py +0 -0
  113. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/retrieval.py +0 -0
  114. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/rows_query.py +0 -0
  115. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/sparql_query.py +0 -0
  116. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/structured_query.py +0 -0
  117. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/text_completion.py +0 -0
  118. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/tool.py +0 -0
  119. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/messaging/translators/triples.py +0 -0
  120. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/objects/__init__.py +0 -0
  121. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/objects/field.py +0 -0
  122. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/objects/object.py +0 -0
  123. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/provenance/__init__.py +0 -0
  124. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/provenance/agent.py +0 -0
  125. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/provenance/namespaces.py +0 -0
  126. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/provenance/uris.py +0 -0
  127. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/provenance/vocabulary.py +0 -0
  128. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/rdf.py +0 -0
  129. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/__init__.py +0 -0
  130. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/core/__init__.py +0 -0
  131. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/core/metadata.py +0 -0
  132. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/core/primitives.py +0 -0
  133. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/core/topic.py +0 -0
  134. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/knowledge/__init__.py +0 -0
  135. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/knowledge/document.py +0 -0
  136. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/knowledge/embeddings.py +0 -0
  137. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/knowledge/graph.py +0 -0
  138. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/knowledge/knowledge.py +0 -0
  139. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/knowledge/nlp.py +0 -0
  140. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/knowledge/object.py +0 -0
  141. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/knowledge/rows.py +0 -0
  142. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/knowledge/structured.py +0 -0
  143. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/__init__.py +0 -0
  144. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/agent.py +0 -0
  145. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/collection.py +0 -0
  146. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/config.py +0 -0
  147. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/diagnosis.py +0 -0
  148. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/flow.py +0 -0
  149. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/library.py +0 -0
  150. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/llm.py +0 -0
  151. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/lookup.py +0 -0
  152. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/nlp_query.py +0 -0
  153. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/prompt.py +0 -0
  154. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/query.py +0 -0
  155. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/retrieval.py +0 -0
  156. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/rows_query.py +0 -0
  157. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/sparql_query.py +0 -0
  158. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/storage.py +0 -0
  159. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/structured_query.py +0 -0
  160. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph/schema/services/tool_service.py +0 -0
  161. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph_base.egg-info/SOURCES.txt +0 -0
  162. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph_base.egg-info/dependency_links.txt +0 -0
  163. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph_base.egg-info/requires.txt +0 -0
  164. {trustgraph_base-2.2.21 → trustgraph_base-2.2.23}/trustgraph_base.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trustgraph-base
3
- Version: 2.2.21
3
+ Version: 2.2.23
4
4
  Summary: TrustGraph provides a means to run a pipeline of flexible AI processing components in a flexible means to achieve a processing pipeline.
5
5
  Author-email: "trustgraph.ai" <security@trustgraph.ai>
6
6
  Project-URL: Homepage, https://github.com/trustgraph-ai/trustgraph
@@ -94,7 +94,6 @@ class AsyncProcessor:
94
94
  metrics = config_consumer_metrics,
95
95
 
96
96
  start_of_messages = False,
97
- consumer_type = 'exclusive',
98
97
  )
99
98
 
100
99
  self.running = True
@@ -12,6 +12,7 @@
12
12
  import asyncio
13
13
  import time
14
14
  import logging
15
+ from concurrent.futures import ThreadPoolExecutor
15
16
 
16
17
  from .. exceptions import TooManyRequests
17
18
 
@@ -110,29 +111,37 @@ class Consumer:
110
111
  logger.info(f"Starting {self.concurrency} receiver threads")
111
112
 
112
113
  # Create one backend consumer per concurrent task.
113
- # Each gets its own connection required for backends
114
- # like RabbitMQ where connections are not thread-safe.
114
+ # Each gets its own connection and dedicated thread
115
+ # required for backends like RabbitMQ where connections
116
+ # are not thread-safe (pika BlockingConnection must be
117
+ # used from a single thread).
115
118
  consumers = []
119
+ executors = []
116
120
  for i in range(self.concurrency):
117
121
  try:
118
122
  logger.info(f"Subscribing to topic: {self.topic} (worker {i})")
119
- c = await asyncio.to_thread(
120
- self.backend.create_consumer,
121
- topic = self.topic,
122
- subscription = self.subscriber,
123
- schema = self.schema,
124
- initial_position = initial_pos,
125
- consumer_type = self.consumer_type,
123
+ executor = ThreadPoolExecutor(max_workers=1)
124
+ loop = asyncio.get_event_loop()
125
+ c = await loop.run_in_executor(
126
+ executor,
127
+ lambda: self.backend.create_consumer(
128
+ topic = self.topic,
129
+ subscription = self.subscriber,
130
+ schema = self.schema,
131
+ initial_position = initial_pos,
132
+ consumer_type = self.consumer_type,
133
+ ),
126
134
  )
127
135
  consumers.append(c)
136
+ executors.append(executor)
128
137
  logger.info(f"Successfully subscribed to topic: {self.topic} (worker {i})")
129
138
  except Exception as e:
130
139
  logger.error(f"Consumer subscription exception (worker {i}): {e}", exc_info=True)
131
140
  raise
132
141
 
133
142
  async with asyncio.TaskGroup() as tg:
134
- for c in consumers:
135
- tg.create_task(self.consume_from_queue(c))
143
+ for c, ex in zip(consumers, executors):
144
+ tg.create_task(self.consume_from_queue(c, ex))
136
145
 
137
146
  if self.metrics:
138
147
  self.metrics.state("stopped")
@@ -146,7 +155,10 @@ class Consumer:
146
155
  c.close()
147
156
  except Exception:
148
157
  pass
158
+ for ex in executors:
159
+ ex.shutdown(wait=False)
149
160
  consumers = []
161
+ executors = []
150
162
  await asyncio.sleep(self.reconnect_time)
151
163
  continue
152
164
 
@@ -157,15 +169,18 @@ class Consumer:
157
169
  c.close()
158
170
  except Exception:
159
171
  pass
172
+ for ex in executors:
173
+ ex.shutdown(wait=False)
160
174
 
161
- async def consume_from_queue(self, consumer):
175
+ async def consume_from_queue(self, consumer, executor=None):
162
176
 
177
+ loop = asyncio.get_event_loop()
163
178
  while self.running:
164
179
 
165
180
  try:
166
- msg = await asyncio.to_thread(
167
- consumer.receive,
168
- timeout_millis=100
181
+ msg = await loop.run_in_executor(
182
+ executor,
183
+ lambda: consumer.receive(timeout_millis=100),
169
184
  )
170
185
  except Exception as e:
171
186
  # Handle timeout from any backend
@@ -173,10 +188,11 @@ class Consumer:
173
188
  continue
174
189
  raise e
175
190
 
176
- await self.handle_one_from_queue(msg, consumer)
191
+ await self.handle_one_from_queue(msg, consumer, executor)
177
192
 
178
- async def handle_one_from_queue(self, msg, consumer):
193
+ async def handle_one_from_queue(self, msg, consumer, executor=None):
179
194
 
195
+ loop = asyncio.get_event_loop()
180
196
  expiry = time.time() + self.rate_limit_timeout
181
197
 
182
198
  # This loop is for retry on rate-limit / resource limits
@@ -187,8 +203,11 @@ class Consumer:
187
203
  logger.warning("Gave up waiting for rate-limit retry")
188
204
 
189
205
  # Message failed to be processed, this causes it to
190
- # be retried
191
- consumer.negative_acknowledge(msg)
206
+ # be retried. Ack on the consumer's dedicated thread
207
+ # (pika is not thread-safe).
208
+ await loop.run_in_executor(
209
+ executor, lambda: consumer.negative_acknowledge(msg)
210
+ )
192
211
 
193
212
  if self.metrics:
194
213
  self.metrics.process("error")
@@ -210,8 +229,11 @@ class Consumer:
210
229
 
211
230
  logger.debug("Message processed successfully")
212
231
 
213
- # Acknowledge successful processing of the message
214
- consumer.acknowledge(msg)
232
+ # Acknowledge on the consumer's dedicated thread
233
+ # (pika is not thread-safe)
234
+ await loop.run_in_executor(
235
+ executor, lambda: consumer.acknowledge(msg)
236
+ )
215
237
 
216
238
  if self.metrics:
217
239
  self.metrics.process("success")
@@ -237,8 +259,10 @@ class Consumer:
237
259
  logger.error(f"Message processing exception: {e}", exc_info=True)
238
260
 
239
261
  # Message failed to be processed, this causes it to
240
- # be retried
241
- consumer.negative_acknowledge(msg)
262
+ # be retried. Ack on the consumer's dedicated thread.
263
+ await loop.run_in_executor(
264
+ executor, lambda: consumer.negative_acknowledge(msg)
265
+ )
242
266
 
243
267
  if self.metrics:
244
268
  self.metrics.process("error")
@@ -15,7 +15,7 @@ class GraphRagClient(RequestResponse):
15
15
  user: User identifier
16
16
  collection: Collection identifier
17
17
  chunk_callback: Optional async callback(text, end_of_stream) for text chunks
18
- explain_callback: Optional async callback(explain_id, explain_graph) for explain notifications
18
+ explain_callback: Optional async callback(explain_id, explain_graph, explain_triples) for explain notifications
19
19
  timeout: Request timeout in seconds
20
20
 
21
21
  Returns:
@@ -30,7 +30,7 @@ class GraphRagClient(RequestResponse):
30
30
  # Handle explain notifications
31
31
  if resp.message_type == 'explain':
32
32
  if explain_callback and resp.explain_id:
33
- await explain_callback(resp.explain_id, resp.explain_graph)
33
+ await explain_callback(resp.explain_id, resp.explain_graph, resp.explain_triples)
34
34
  return False # Continue receiving
35
35
 
36
36
  # Handle text chunks
@@ -7,6 +7,7 @@ import asyncio
7
7
  import time
8
8
  import logging
9
9
  import uuid
10
+ from concurrent.futures import ThreadPoolExecutor
10
11
 
11
12
  # Module logger
12
13
  logger = logging.getLogger(__name__)
@@ -38,6 +39,7 @@ class Subscriber:
38
39
  self.pending_acks = {} # Track messages awaiting delivery
39
40
 
40
41
  self.consumer = None
42
+ self.executor = None
41
43
 
42
44
  def __del__(self):
43
45
 
@@ -45,15 +47,6 @@ class Subscriber:
45
47
 
46
48
  async def start(self):
47
49
 
48
- # Create consumer via backend
49
- self.consumer = await asyncio.to_thread(
50
- self.backend.create_consumer,
51
- topic=self.topic,
52
- subscription=self.subscription,
53
- schema=self.schema,
54
- consumer_type='exclusive',
55
- )
56
-
57
50
  self.task = asyncio.create_task(self.run())
58
51
 
59
52
  async def stop(self):
@@ -80,6 +73,21 @@ class Subscriber:
80
73
 
81
74
  try:
82
75
 
76
+ # Create consumer and dedicated thread if needed
77
+ # (first run or after failure)
78
+ if self.consumer is None:
79
+ self.executor = ThreadPoolExecutor(max_workers=1)
80
+ loop = asyncio.get_event_loop()
81
+ self.consumer = await loop.run_in_executor(
82
+ self.executor,
83
+ lambda: self.backend.create_consumer(
84
+ topic=self.topic,
85
+ subscription=self.subscription,
86
+ schema=self.schema,
87
+ consumer_type='exclusive',
88
+ ),
89
+ )
90
+
83
91
  if self.metrics:
84
92
  self.metrics.state("running")
85
93
 
@@ -128,9 +136,12 @@ class Subscriber:
128
136
  # Process messages only if not draining
129
137
  if not self.draining:
130
138
  try:
131
- msg = await asyncio.to_thread(
132
- self.consumer.receive,
133
- timeout_millis=250
139
+ loop = asyncio.get_event_loop()
140
+ msg = await loop.run_in_executor(
141
+ self.executor,
142
+ lambda: self.consumer.receive(
143
+ timeout_millis=250
144
+ ),
134
145
  )
135
146
  except Exception as e:
136
147
  # Handle timeout from any backend
@@ -172,15 +183,18 @@ class Subscriber:
172
183
  except Exception:
173
184
  pass # Already closed or error
174
185
  self.consumer = None
175
-
176
-
186
+
187
+ if self.executor:
188
+ self.executor.shutdown(wait=False)
189
+ self.executor = None
190
+
177
191
  if self.metrics:
178
192
  self.metrics.state("stopped")
179
193
 
180
194
  if not self.running and not self.draining:
181
195
  return
182
-
183
- # If handler drops out, sleep a retry
196
+
197
+ # Sleep before retry
184
198
  await asyncio.sleep(1)
185
199
 
186
200
  async def subscribe(self, id):
@@ -0,0 +1 @@
1
+ __version__ = "2.2.23"
@@ -43,7 +43,7 @@ class DocumentRagClient(BaseClient):
43
43
  user: User identifier
44
44
  collection: Collection identifier
45
45
  chunk_callback: Optional callback(text, end_of_stream) for text chunks
46
- explain_callback: Optional callback(explain_id, explain_graph) for explain notifications
46
+ explain_callback: Optional callback(explain_id, explain_graph, explain_triples) for explain notifications
47
47
  timeout: Request timeout in seconds
48
48
 
49
49
  Returns:
@@ -55,7 +55,7 @@ class DocumentRagClient(BaseClient):
55
55
  # Handle explain notifications (response is None/empty, explain_id present)
56
56
  if x.explain_id and not x.response:
57
57
  if explain_callback:
58
- explain_callback(x.explain_id, x.explain_graph)
58
+ explain_callback(x.explain_id, x.explain_graph, x.explain_triples)
59
59
  return False # Continue receiving
60
60
 
61
61
  # Handle text chunks
@@ -47,7 +47,7 @@ class GraphRagClient(BaseClient):
47
47
  user: User identifier
48
48
  collection: Collection identifier
49
49
  chunk_callback: Optional callback(text, end_of_stream) for text chunks
50
- explain_callback: Optional callback(explain_id, explain_graph) for explain notifications
50
+ explain_callback: Optional callback(explain_id, explain_graph, explain_triples) for explain notifications
51
51
  timeout: Request timeout in seconds
52
52
 
53
53
  Returns:
@@ -59,7 +59,7 @@ class GraphRagClient(BaseClient):
59
59
  # Handle explain notifications
60
60
  if x.message_type == 'explain':
61
61
  if explain_callback and x.explain_id:
62
- explain_callback(x.explain_id, x.explain_graph)
62
+ explain_callback(x.explain_id, x.explain_graph, x.explain_triples)
63
63
  return False # Continue receiving
64
64
 
65
65
  # Handle text chunks
@@ -465,11 +465,18 @@ def exploration_triples(
465
465
  return triples
466
466
 
467
467
 
468
- def _quoted_triple(s: str, p: str, o: str) -> Term:
469
- """Create a quoted triple term (RDF-star) from string values."""
468
+ def _quoted_triple(s, p, o) -> Term:
469
+ """Create a quoted triple term (RDF-star).
470
+
471
+ Accepts either Term objects (preserving original types) or plain
472
+ strings (treated as IRIs for backward compatibility).
473
+ """
474
+ s_term = s if isinstance(s, Term) else _iri(s)
475
+ p_term = p if isinstance(p, Term) else _iri(p)
476
+ o_term = o if isinstance(o, Term) else _iri(o)
470
477
  return Term(
471
478
  type=TRIPLE,
472
- triple=Triple(s=_iri(s), p=_iri(p), o=_iri(o))
479
+ triple=Triple(s=s_term, p=p_term, o=o_term)
473
480
  )
474
481
 
475
482
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trustgraph-base
3
- Version: 2.2.21
3
+ Version: 2.2.23
4
4
  Summary: TrustGraph provides a means to run a pipeline of flexible AI processing components in a flexible means to achieve a processing pipeline.
5
5
  Author-email: "trustgraph.ai" <security@trustgraph.ai>
6
6
  Project-URL: Homepage, https://github.com/trustgraph-ai/trustgraph
@@ -1 +0,0 @@
1
- __version__ = "2.2.21"