trustgraph-base 1.0.16__tar.gz → 1.0.17__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 (110) hide show
  1. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/PKG-INFO +2 -2
  2. trustgraph-base-1.0.17/trustgraph/base_version.py +1 -0
  3. trustgraph-base-1.0.17/trustgraph/messaging/__init__.py +105 -0
  4. trustgraph-base-1.0.17/trustgraph/messaging/registry.py +51 -0
  5. trustgraph-base-1.0.17/trustgraph/messaging/translators/__init__.py +19 -0
  6. trustgraph-base-1.0.17/trustgraph/messaging/translators/agent.py +44 -0
  7. trustgraph-base-1.0.17/trustgraph/messaging/translators/base.py +43 -0
  8. trustgraph-base-1.0.17/trustgraph/messaging/translators/config.py +100 -0
  9. trustgraph-base-1.0.17/trustgraph/messaging/translators/document_loading.py +191 -0
  10. trustgraph-base-1.0.17/trustgraph/messaging/translators/embeddings.py +33 -0
  11. trustgraph-base-1.0.17/trustgraph/messaging/translators/embeddings_query.py +94 -0
  12. trustgraph-base-1.0.17/trustgraph/messaging/translators/flow.py +59 -0
  13. trustgraph-base-1.0.17/trustgraph/messaging/translators/knowledge.py +183 -0
  14. trustgraph-base-1.0.17/trustgraph/messaging/translators/library.py +124 -0
  15. trustgraph-base-1.0.17/trustgraph/messaging/translators/metadata.py +81 -0
  16. trustgraph-base-1.0.17/trustgraph/messaging/translators/primitives.py +47 -0
  17. trustgraph-base-1.0.17/trustgraph/messaging/translators/prompt.py +54 -0
  18. trustgraph-base-1.0.17/trustgraph/messaging/translators/retrieval.py +81 -0
  19. trustgraph-base-1.0.17/trustgraph/messaging/translators/text_completion.py +42 -0
  20. trustgraph-base-1.0.17/trustgraph/messaging/translators/triples.py +60 -0
  21. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph_base.egg-info/PKG-INFO +2 -2
  22. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph_base.egg-info/SOURCES.txt +18 -0
  23. trustgraph-base-1.0.16/trustgraph/base_version.py +0 -1
  24. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/README.md +0 -0
  25. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/setup.cfg +0 -0
  26. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/setup.py +0 -0
  27. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/api/__init__.py +0 -0
  28. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/api/api.py +0 -0
  29. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/api/config.py +0 -0
  30. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/api/exceptions.py +0 -0
  31. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/api/flow.py +0 -0
  32. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/api/knowledge.py +0 -0
  33. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/api/library.py +0 -0
  34. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/api/types.py +0 -0
  35. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/__init__.py +0 -0
  36. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/agent_client.py +0 -0
  37. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/agent_service.py +0 -0
  38. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/async_processor.py +0 -0
  39. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/consumer.py +0 -0
  40. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/consumer_spec.py +0 -0
  41. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/document_embeddings_client.py +0 -0
  42. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/document_embeddings_query_service.py +0 -0
  43. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/document_embeddings_store_service.py +0 -0
  44. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/embeddings_client.py +0 -0
  45. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/embeddings_service.py +0 -0
  46. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/flow.py +0 -0
  47. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/flow_processor.py +0 -0
  48. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/graph_embeddings_client.py +0 -0
  49. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/graph_embeddings_query_service.py +0 -0
  50. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/graph_embeddings_store_service.py +0 -0
  51. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/graph_rag_client.py +0 -0
  52. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/llm_service.py +0 -0
  53. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/metrics.py +0 -0
  54. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/producer.py +0 -0
  55. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/producer_spec.py +0 -0
  56. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/prompt_client.py +0 -0
  57. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/publisher.py +0 -0
  58. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/pubsub.py +0 -0
  59. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/request_response_spec.py +0 -0
  60. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/setting_spec.py +0 -0
  61. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/spec.py +0 -0
  62. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/subscriber.py +0 -0
  63. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/subscriber_spec.py +0 -0
  64. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/text_completion_client.py +0 -0
  65. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/triples_client.py +0 -0
  66. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/triples_query_service.py +0 -0
  67. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/base/triples_store_service.py +0 -0
  68. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/clients/__init__.py +0 -0
  69. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/clients/agent_client.py +0 -0
  70. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/clients/base.py +0 -0
  71. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/clients/config_client.py +0 -0
  72. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/clients/document_embeddings_client.py +0 -0
  73. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/clients/document_rag_client.py +0 -0
  74. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/clients/embeddings_client.py +0 -0
  75. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/clients/graph_embeddings_client.py +0 -0
  76. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/clients/graph_rag_client.py +0 -0
  77. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/clients/llm_client.py +0 -0
  78. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/clients/prompt_client.py +0 -0
  79. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/clients/triples_query_client.py +0 -0
  80. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/exceptions.py +0 -0
  81. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/knowledge/__init__.py +0 -0
  82. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/knowledge/defs.py +0 -0
  83. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/knowledge/document.py +0 -0
  84. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/knowledge/identifier.py +0 -0
  85. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/knowledge/organization.py +0 -0
  86. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/knowledge/publication.py +0 -0
  87. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/log_level.py +0 -0
  88. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/objects/__init__.py +0 -0
  89. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/objects/field.py +0 -0
  90. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/objects/object.py +0 -0
  91. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/rdf.py +0 -0
  92. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/__init__.py +0 -0
  93. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/agent.py +0 -0
  94. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/config.py +0 -0
  95. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/documents.py +0 -0
  96. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/flows.py +0 -0
  97. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/graph.py +0 -0
  98. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/knowledge.py +0 -0
  99. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/library.py +0 -0
  100. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/lookup.py +0 -0
  101. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/metadata.py +0 -0
  102. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/models.py +0 -0
  103. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/object.py +0 -0
  104. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/prompt.py +0 -0
  105. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/retrieval.py +0 -0
  106. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/topic.py +0 -0
  107. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph/schema/types.py +0 -0
  108. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph_base.egg-info/dependency_links.txt +0 -0
  109. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph_base.egg-info/requires.txt +0 -0
  110. {trustgraph-base-1.0.16 → trustgraph-base-1.0.17}/trustgraph_base.egg-info/top_level.txt +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: trustgraph-base
3
- Version: 1.0.16
3
+ Version: 1.0.17
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
  Home-page: https://github.com/trustgraph-ai/trustgraph
6
- Download-URL: https://github.com/trustgraph-ai/trustgraph/archive/refs/tags/v1.0.16.tar.gz
6
+ Download-URL: https://github.com/trustgraph-ai/trustgraph/archive/refs/tags/v1.0.17.tar.gz
7
7
  Author: trustgraph.ai
8
8
  Author-email: security@trustgraph.ai
9
9
  Classifier: Programming Language :: Python :: 3
@@ -0,0 +1 @@
1
+ __version__ = "1.0.17"
@@ -0,0 +1,105 @@
1
+ from .registry import TranslatorRegistry
2
+ from .translators import *
3
+
4
+ # Auto-register all translators
5
+ from .translators.agent import AgentRequestTranslator, AgentResponseTranslator
6
+ from .translators.embeddings import EmbeddingsRequestTranslator, EmbeddingsResponseTranslator
7
+ from .translators.text_completion import TextCompletionRequestTranslator, TextCompletionResponseTranslator
8
+ from .translators.retrieval import (
9
+ DocumentRagRequestTranslator, DocumentRagResponseTranslator,
10
+ GraphRagRequestTranslator, GraphRagResponseTranslator
11
+ )
12
+ from .translators.triples import TriplesQueryRequestTranslator, TriplesQueryResponseTranslator
13
+ from .translators.knowledge import KnowledgeRequestTranslator, KnowledgeResponseTranslator
14
+ from .translators.library import LibraryDocumentTranslator, LibraryProcessingTranslator
15
+ from .translators.document_loading import DocumentTranslator, TextDocumentTranslator
16
+ from .translators.config import ConfigRequestTranslator, ConfigResponseTranslator
17
+ from .translators.flow import FlowRequestTranslator, FlowResponseTranslator
18
+ from .translators.prompt import PromptRequestTranslator, PromptResponseTranslator
19
+ from .translators.embeddings_query import (
20
+ DocumentEmbeddingsRequestTranslator, DocumentEmbeddingsResponseTranslator,
21
+ GraphEmbeddingsRequestTranslator, GraphEmbeddingsResponseTranslator
22
+ )
23
+
24
+ # Register all service translators
25
+ TranslatorRegistry.register_service(
26
+ "agent",
27
+ AgentRequestTranslator(),
28
+ AgentResponseTranslator()
29
+ )
30
+
31
+ TranslatorRegistry.register_service(
32
+ "embeddings",
33
+ EmbeddingsRequestTranslator(),
34
+ EmbeddingsResponseTranslator()
35
+ )
36
+
37
+ TranslatorRegistry.register_service(
38
+ "text-completion",
39
+ TextCompletionRequestTranslator(),
40
+ TextCompletionResponseTranslator()
41
+ )
42
+
43
+ TranslatorRegistry.register_service(
44
+ "document-rag",
45
+ DocumentRagRequestTranslator(),
46
+ DocumentRagResponseTranslator()
47
+ )
48
+
49
+ TranslatorRegistry.register_service(
50
+ "graph-rag",
51
+ GraphRagRequestTranslator(),
52
+ GraphRagResponseTranslator()
53
+ )
54
+
55
+ TranslatorRegistry.register_service(
56
+ "triples-query",
57
+ TriplesQueryRequestTranslator(),
58
+ TriplesQueryResponseTranslator()
59
+ )
60
+
61
+ TranslatorRegistry.register_service(
62
+ "knowledge",
63
+ KnowledgeRequestTranslator(),
64
+ KnowledgeResponseTranslator()
65
+ )
66
+
67
+ TranslatorRegistry.register_service(
68
+ "librarian",
69
+ LibraryDocumentTranslator(),
70
+ LibraryProcessingTranslator()
71
+ )
72
+
73
+ TranslatorRegistry.register_service(
74
+ "config",
75
+ ConfigRequestTranslator(),
76
+ ConfigResponseTranslator()
77
+ )
78
+
79
+ TranslatorRegistry.register_service(
80
+ "flow",
81
+ FlowRequestTranslator(),
82
+ FlowResponseTranslator()
83
+ )
84
+
85
+ TranslatorRegistry.register_service(
86
+ "prompt",
87
+ PromptRequestTranslator(),
88
+ PromptResponseTranslator()
89
+ )
90
+
91
+ TranslatorRegistry.register_service(
92
+ "document-embeddings-query",
93
+ DocumentEmbeddingsRequestTranslator(),
94
+ DocumentEmbeddingsResponseTranslator()
95
+ )
96
+
97
+ TranslatorRegistry.register_service(
98
+ "graph-embeddings-query",
99
+ GraphEmbeddingsRequestTranslator(),
100
+ GraphEmbeddingsResponseTranslator()
101
+ )
102
+
103
+ # Register single-direction translators for document loading
104
+ TranslatorRegistry.register_request("document", DocumentTranslator())
105
+ TranslatorRegistry.register_request("text-document", TextDocumentTranslator())
@@ -0,0 +1,51 @@
1
+ from typing import Dict, List, Union
2
+ from .translators.base import MessageTranslator
3
+
4
+
5
+ class TranslatorRegistry:
6
+ """Registry for service translators"""
7
+
8
+ _request_translators: Dict[str, MessageTranslator] = {}
9
+ _response_translators: Dict[str, MessageTranslator] = {}
10
+
11
+ @classmethod
12
+ def register_request(cls, service_name: str, translator: MessageTranslator):
13
+ """Register a request translator for a service"""
14
+ cls._request_translators[service_name] = translator
15
+
16
+ @classmethod
17
+ def register_response(cls, service_name: str, translator: MessageTranslator):
18
+ """Register a response translator for a service"""
19
+ cls._response_translators[service_name] = translator
20
+
21
+ @classmethod
22
+ def register_service(cls, service_name: str, request_translator: MessageTranslator,
23
+ response_translator: MessageTranslator):
24
+ """Register both request and response translators for a service"""
25
+ cls.register_request(service_name, request_translator)
26
+ cls.register_response(service_name, response_translator)
27
+
28
+ @classmethod
29
+ def get_request_translator(cls, service_name: str) -> MessageTranslator:
30
+ """Get request translator for a service"""
31
+ if service_name not in cls._request_translators:
32
+ raise KeyError(f"No request translator registered for service: {service_name}")
33
+ return cls._request_translators[service_name]
34
+
35
+ @classmethod
36
+ def get_response_translator(cls, service_name: str) -> MessageTranslator:
37
+ """Get response translator for a service"""
38
+ if service_name not in cls._response_translators:
39
+ raise KeyError(f"No response translator registered for service: {service_name}")
40
+ return cls._response_translators[service_name]
41
+
42
+ @classmethod
43
+ def list_services(cls) -> List[str]:
44
+ """List all registered services"""
45
+ return sorted(set(cls._request_translators.keys()) | set(cls._response_translators.keys()))
46
+
47
+ @classmethod
48
+ def has_service(cls, service_name: str) -> bool:
49
+ """Check if a service is registered"""
50
+ return (service_name in cls._request_translators or
51
+ service_name in cls._response_translators)
@@ -0,0 +1,19 @@
1
+ from .base import Translator, MessageTranslator
2
+ from .primitives import ValueTranslator, TripleTranslator, SubgraphTranslator
3
+ from .metadata import DocumentMetadataTranslator, ProcessingMetadataTranslator
4
+ from .agent import AgentRequestTranslator, AgentResponseTranslator
5
+ from .embeddings import EmbeddingsRequestTranslator, EmbeddingsResponseTranslator
6
+ from .text_completion import TextCompletionRequestTranslator, TextCompletionResponseTranslator
7
+ from .retrieval import DocumentRagRequestTranslator, DocumentRagResponseTranslator
8
+ from .retrieval import GraphRagRequestTranslator, GraphRagResponseTranslator
9
+ from .triples import TriplesQueryRequestTranslator, TriplesQueryResponseTranslator
10
+ from .knowledge import KnowledgeRequestTranslator, KnowledgeResponseTranslator
11
+ from .library import LibraryDocumentTranslator, LibraryProcessingTranslator
12
+ from .document_loading import DocumentTranslator, TextDocumentTranslator, ChunkTranslator, DocumentEmbeddingsTranslator
13
+ from .config import ConfigRequestTranslator, ConfigResponseTranslator
14
+ from .flow import FlowRequestTranslator, FlowResponseTranslator
15
+ from .prompt import PromptRequestTranslator, PromptResponseTranslator
16
+ from .embeddings_query import (
17
+ DocumentEmbeddingsRequestTranslator, DocumentEmbeddingsResponseTranslator,
18
+ GraphEmbeddingsRequestTranslator, GraphEmbeddingsResponseTranslator
19
+ )
@@ -0,0 +1,44 @@
1
+ from typing import Dict, Any, Tuple
2
+ from ...schema import AgentRequest, AgentResponse
3
+ from .base import MessageTranslator
4
+
5
+
6
+ class AgentRequestTranslator(MessageTranslator):
7
+ """Translator for AgentRequest schema objects"""
8
+
9
+ def to_pulsar(self, data: Dict[str, Any]) -> AgentRequest:
10
+ return AgentRequest(
11
+ question=data["question"],
12
+ plan=data.get("plan", ""),
13
+ state=data.get("state", ""),
14
+ history=data.get("history", [])
15
+ )
16
+
17
+ def from_pulsar(self, obj: AgentRequest) -> Dict[str, Any]:
18
+ return {
19
+ "question": obj.question,
20
+ "plan": obj.plan,
21
+ "state": obj.state,
22
+ "history": obj.history
23
+ }
24
+
25
+
26
+ class AgentResponseTranslator(MessageTranslator):
27
+ """Translator for AgentResponse schema objects"""
28
+
29
+ def to_pulsar(self, data: Dict[str, Any]) -> AgentResponse:
30
+ raise NotImplementedError("Response translation to Pulsar not typically needed")
31
+
32
+ def from_pulsar(self, obj: AgentResponse) -> Dict[str, Any]:
33
+ result = {}
34
+ if obj.answer:
35
+ result["answer"] = obj.answer
36
+ if obj.thought:
37
+ result["thought"] = obj.thought
38
+ if obj.observation:
39
+ result["observation"] = obj.observation
40
+ return result
41
+
42
+ def from_response_with_completion(self, obj: AgentResponse) -> Tuple[Dict[str, Any], bool]:
43
+ """Returns (response_dict, is_final)"""
44
+ return self.from_pulsar(obj), (obj.answer is not None)
@@ -0,0 +1,43 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Dict, Any, Tuple
3
+ from pulsar.schema import Record
4
+
5
+
6
+ class Translator(ABC):
7
+ """Base class for bidirectional Pulsar ↔ dict translation"""
8
+
9
+ @abstractmethod
10
+ def to_pulsar(self, data: Dict[str, Any]) -> Record:
11
+ """Convert dict to Pulsar schema object"""
12
+ pass
13
+
14
+ @abstractmethod
15
+ def from_pulsar(self, obj: Record) -> Dict[str, Any]:
16
+ """Convert Pulsar schema object to dict"""
17
+ pass
18
+
19
+
20
+ class MessageTranslator(Translator):
21
+ """For complete request/response message translation"""
22
+
23
+ def from_response_with_completion(self, obj: Record) -> Tuple[Dict[str, Any], bool]:
24
+ """Returns (response_dict, is_final) - for streaming responses"""
25
+ return self.from_pulsar(obj), True
26
+
27
+
28
+ class SendTranslator(Translator):
29
+ """For fire-and-forget send operations (like ServiceSender)"""
30
+
31
+ def from_pulsar(self, obj: Record) -> Dict[str, Any]:
32
+ """Usually not needed for send-only operations"""
33
+ raise NotImplementedError("Send translators typically don't need from_pulsar")
34
+
35
+
36
+ def handle_optional_fields(obj: Record, fields: list) -> Dict[str, Any]:
37
+ """Helper to extract optional fields from Pulsar object"""
38
+ result = {}
39
+ for field in fields:
40
+ value = getattr(obj, field, None)
41
+ if value is not None:
42
+ result[field] = value
43
+ return result
@@ -0,0 +1,100 @@
1
+ from typing import Dict, Any, Tuple
2
+ from ...schema import ConfigRequest, ConfigResponse, ConfigKey, ConfigValue
3
+ from .base import MessageTranslator
4
+
5
+
6
+ class ConfigRequestTranslator(MessageTranslator):
7
+ """Translator for ConfigRequest schema objects"""
8
+
9
+ def to_pulsar(self, data: Dict[str, Any]) -> ConfigRequest:
10
+ keys = None
11
+ if "keys" in data:
12
+ keys = [
13
+ ConfigKey(
14
+ type=k["type"],
15
+ key=k["key"]
16
+ )
17
+ for k in data["keys"]
18
+ ]
19
+
20
+ values = None
21
+ if "values" in data:
22
+ values = [
23
+ ConfigValue(
24
+ type=v["type"],
25
+ key=v["key"],
26
+ value=v["value"]
27
+ )
28
+ for v in data["values"]
29
+ ]
30
+
31
+ return ConfigRequest(
32
+ operation=data.get("operation"),
33
+ keys=keys,
34
+ type=data.get("type"),
35
+ values=values
36
+ )
37
+
38
+ def from_pulsar(self, obj: ConfigRequest) -> Dict[str, Any]:
39
+ result = {}
40
+
41
+ if obj.operation:
42
+ result["operation"] = obj.operation
43
+ if obj.type:
44
+ result["type"] = obj.type
45
+
46
+ if obj.keys:
47
+ result["keys"] = [
48
+ {
49
+ "type": k.type,
50
+ "key": k.key
51
+ }
52
+ for k in obj.keys
53
+ ]
54
+
55
+ if obj.values:
56
+ result["values"] = [
57
+ {
58
+ "type": v.type,
59
+ "key": v.key,
60
+ "value": v.value
61
+ }
62
+ for v in obj.values
63
+ ]
64
+
65
+ return result
66
+
67
+
68
+ class ConfigResponseTranslator(MessageTranslator):
69
+ """Translator for ConfigResponse schema objects"""
70
+
71
+ def to_pulsar(self, data: Dict[str, Any]) -> ConfigResponse:
72
+ raise NotImplementedError("Response translation to Pulsar not typically needed")
73
+
74
+ def from_pulsar(self, obj: ConfigResponse) -> Dict[str, Any]:
75
+ result = {}
76
+
77
+ if obj.version is not None:
78
+ result["version"] = obj.version
79
+
80
+ if obj.values:
81
+ result["values"] = [
82
+ {
83
+ "type": v.type,
84
+ "key": v.key,
85
+ "value": v.value
86
+ }
87
+ for v in obj.values
88
+ ]
89
+
90
+ if obj.directory:
91
+ result["directory"] = obj.directory
92
+
93
+ if obj.config:
94
+ result["config"] = obj.config
95
+
96
+ return result
97
+
98
+ def from_response_with_completion(self, obj: ConfigResponse) -> Tuple[Dict[str, Any], bool]:
99
+ """Returns (response_dict, is_final)"""
100
+ return self.from_pulsar(obj), True
@@ -0,0 +1,191 @@
1
+ import base64
2
+ from typing import Dict, Any
3
+ from ...schema import Document, TextDocument, Chunk, DocumentEmbeddings, ChunkEmbeddings
4
+ from .base import SendTranslator
5
+ from .metadata import DocumentMetadataTranslator
6
+ from .primitives import SubgraphTranslator
7
+
8
+
9
+ class DocumentTranslator(SendTranslator):
10
+ """Translator for Document schema objects (PDF docs etc.)"""
11
+
12
+ def __init__(self):
13
+ self.subgraph_translator = SubgraphTranslator()
14
+
15
+ def to_pulsar(self, data: Dict[str, Any]) -> Document:
16
+ metadata = data.get("metadata", [])
17
+
18
+ # Handle base64 content validation
19
+ doc = base64.b64decode(data["data"])
20
+
21
+ from ...schema import Metadata
22
+ return Document(
23
+ metadata=Metadata(
24
+ id=data.get("id"),
25
+ metadata=self.subgraph_translator.to_pulsar(metadata) if metadata else [],
26
+ user=data.get("user", "trustgraph"),
27
+ collection=data.get("collection", "default"),
28
+ ),
29
+ data=base64.b64encode(doc).decode("utf-8")
30
+ )
31
+
32
+ def from_pulsar(self, obj: Document) -> Dict[str, Any]:
33
+ result = {
34
+ "data": obj.data
35
+ }
36
+
37
+ if obj.metadata:
38
+ metadata_dict = {}
39
+ if obj.metadata.id:
40
+ metadata_dict["id"] = obj.metadata.id
41
+ if obj.metadata.user:
42
+ metadata_dict["user"] = obj.metadata.user
43
+ if obj.metadata.collection:
44
+ metadata_dict["collection"] = obj.metadata.collection
45
+ if obj.metadata.metadata:
46
+ metadata_dict["metadata"] = self.subgraph_translator.from_pulsar(obj.metadata.metadata)
47
+
48
+ result["metadata"] = metadata_dict
49
+
50
+ return result
51
+
52
+
53
+ class TextDocumentTranslator(SendTranslator):
54
+ """Translator for TextDocument schema objects"""
55
+
56
+ def __init__(self):
57
+ self.subgraph_translator = SubgraphTranslator()
58
+
59
+ def to_pulsar(self, data: Dict[str, Any]) -> TextDocument:
60
+ metadata = data.get("metadata", [])
61
+ charset = data.get("charset", "utf-8")
62
+
63
+ # Text is base64 encoded in input
64
+ text = base64.b64decode(data["text"]).decode(charset)
65
+
66
+ from ...schema import Metadata
67
+ return TextDocument(
68
+ metadata=Metadata(
69
+ id=data.get("id"),
70
+ metadata=self.subgraph_translator.to_pulsar(metadata) if metadata else [],
71
+ user=data.get("user", "trustgraph"),
72
+ collection=data.get("collection", "default"),
73
+ ),
74
+ text=text.encode("utf-8")
75
+ )
76
+
77
+ def from_pulsar(self, obj: TextDocument) -> Dict[str, Any]:
78
+ result = {
79
+ "text": obj.text.decode("utf-8") if isinstance(obj.text, bytes) else obj.text
80
+ }
81
+
82
+ if obj.metadata:
83
+ metadata_dict = {}
84
+ if obj.metadata.id:
85
+ metadata_dict["id"] = obj.metadata.id
86
+ if obj.metadata.user:
87
+ metadata_dict["user"] = obj.metadata.user
88
+ if obj.metadata.collection:
89
+ metadata_dict["collection"] = obj.metadata.collection
90
+ if obj.metadata.metadata:
91
+ metadata_dict["metadata"] = self.subgraph_translator.from_pulsar(obj.metadata.metadata)
92
+
93
+ result["metadata"] = metadata_dict
94
+
95
+ return result
96
+
97
+
98
+ class ChunkTranslator(SendTranslator):
99
+ """Translator for Chunk schema objects"""
100
+
101
+ def __init__(self):
102
+ self.subgraph_translator = SubgraphTranslator()
103
+
104
+ def to_pulsar(self, data: Dict[str, Any]) -> Chunk:
105
+ metadata = data.get("metadata", [])
106
+
107
+ from ...schema import Metadata
108
+ return Chunk(
109
+ metadata=Metadata(
110
+ id=data.get("id"),
111
+ metadata=self.subgraph_translator.to_pulsar(metadata) if metadata else [],
112
+ user=data.get("user", "trustgraph"),
113
+ collection=data.get("collection", "default"),
114
+ ),
115
+ chunk=data["chunk"].encode("utf-8") if isinstance(data["chunk"], str) else data["chunk"]
116
+ )
117
+
118
+ def from_pulsar(self, obj: Chunk) -> Dict[str, Any]:
119
+ result = {
120
+ "chunk": obj.chunk.decode("utf-8") if isinstance(obj.chunk, bytes) else obj.chunk
121
+ }
122
+
123
+ if obj.metadata:
124
+ metadata_dict = {}
125
+ if obj.metadata.id:
126
+ metadata_dict["id"] = obj.metadata.id
127
+ if obj.metadata.user:
128
+ metadata_dict["user"] = obj.metadata.user
129
+ if obj.metadata.collection:
130
+ metadata_dict["collection"] = obj.metadata.collection
131
+ if obj.metadata.metadata:
132
+ metadata_dict["metadata"] = self.subgraph_translator.from_pulsar(obj.metadata.metadata)
133
+
134
+ result["metadata"] = metadata_dict
135
+
136
+ return result
137
+
138
+
139
+ class DocumentEmbeddingsTranslator(SendTranslator):
140
+ """Translator for DocumentEmbeddings schema objects"""
141
+
142
+ def __init__(self):
143
+ self.subgraph_translator = SubgraphTranslator()
144
+
145
+ def to_pulsar(self, data: Dict[str, Any]) -> DocumentEmbeddings:
146
+ metadata = data.get("metadata", {})
147
+
148
+ chunks = [
149
+ ChunkEmbeddings(
150
+ chunk=chunk["chunk"].encode("utf-8") if isinstance(chunk["chunk"], str) else chunk["chunk"],
151
+ vectors=chunk["vectors"]
152
+ )
153
+ for chunk in data.get("chunks", [])
154
+ ]
155
+
156
+ from ...schema import Metadata
157
+ return DocumentEmbeddings(
158
+ metadata=Metadata(
159
+ id=metadata.get("id"),
160
+ metadata=self.subgraph_translator.to_pulsar(metadata.get("metadata", [])),
161
+ user=metadata.get("user", "trustgraph"),
162
+ collection=metadata.get("collection", "default"),
163
+ ),
164
+ chunks=chunks
165
+ )
166
+
167
+ def from_pulsar(self, obj: DocumentEmbeddings) -> Dict[str, Any]:
168
+ result = {
169
+ "chunks": [
170
+ {
171
+ "chunk": chunk.chunk.decode("utf-8") if isinstance(chunk.chunk, bytes) else chunk.chunk,
172
+ "vectors": chunk.vectors
173
+ }
174
+ for chunk in obj.chunks
175
+ ]
176
+ }
177
+
178
+ if obj.metadata:
179
+ metadata_dict = {}
180
+ if obj.metadata.id:
181
+ metadata_dict["id"] = obj.metadata.id
182
+ if obj.metadata.user:
183
+ metadata_dict["user"] = obj.metadata.user
184
+ if obj.metadata.collection:
185
+ metadata_dict["collection"] = obj.metadata.collection
186
+ if obj.metadata.metadata:
187
+ metadata_dict["metadata"] = self.subgraph_translator.from_pulsar(obj.metadata.metadata)
188
+
189
+ result["metadata"] = metadata_dict
190
+
191
+ return result
@@ -0,0 +1,33 @@
1
+ from typing import Dict, Any, Tuple
2
+ from ...schema import EmbeddingsRequest, EmbeddingsResponse
3
+ from .base import MessageTranslator
4
+
5
+
6
+ class EmbeddingsRequestTranslator(MessageTranslator):
7
+ """Translator for EmbeddingsRequest schema objects"""
8
+
9
+ def to_pulsar(self, data: Dict[str, Any]) -> EmbeddingsRequest:
10
+ return EmbeddingsRequest(
11
+ text=data["text"]
12
+ )
13
+
14
+ def from_pulsar(self, obj: EmbeddingsRequest) -> Dict[str, Any]:
15
+ return {
16
+ "text": obj.text
17
+ }
18
+
19
+
20
+ class EmbeddingsResponseTranslator(MessageTranslator):
21
+ """Translator for EmbeddingsResponse schema objects"""
22
+
23
+ def to_pulsar(self, data: Dict[str, Any]) -> EmbeddingsResponse:
24
+ raise NotImplementedError("Response translation to Pulsar not typically needed")
25
+
26
+ def from_pulsar(self, obj: EmbeddingsResponse) -> Dict[str, Any]:
27
+ return {
28
+ "vectors": obj.vectors
29
+ }
30
+
31
+ def from_response_with_completion(self, obj: EmbeddingsResponse) -> Tuple[Dict[str, Any], bool]:
32
+ """Returns (response_dict, is_final)"""
33
+ return self.from_pulsar(obj), True