cortexdb-client 0.2.0__tar.gz → 0.4.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 (38) hide show
  1. cortexdb_client-0.4.0/PKG-INFO +155 -0
  2. cortexdb_client-0.4.0/README.md +131 -0
  3. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/__init__.py +5 -1
  4. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/v1/admin_pb2.py +9 -5
  5. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/v1/admin_pb2_grpc.py +45 -0
  6. cortexdb_client-0.4.0/cortexdb_client/_pb/cortexdb/v1/contract_pb2.py +53 -0
  7. cortexdb_client-0.4.0/cortexdb_client/_pb/cortexdb/v1/contract_pb2_grpc.py +157 -0
  8. cortexdb_client-0.4.0/cortexdb_client/_pb/cortexdb/v1/decision_pb2.py +53 -0
  9. cortexdb_client-0.4.0/cortexdb_client/_pb/cortexdb/v1/decision_pb2_grpc.py +207 -0
  10. cortexdb_client-0.4.0/cortexdb_client/_pb/cortexdb/v1/graph_pb2.py +166 -0
  11. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/v1/knowledge_pb2.py +4 -4
  12. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/v1/memory_pb2.py +4 -4
  13. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/client.py +27 -0
  14. cortexdb_client-0.4.0/cortexdb_client/tabular.py +284 -0
  15. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/pyproject.toml +3 -1
  16. cortexdb_client-0.4.0/tests/test_tabular.py +296 -0
  17. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/uv.lock +642 -22
  18. cortexdb_client-0.2.0/PKG-INFO +0 -86
  19. cortexdb_client-0.2.0/README.md +0 -64
  20. cortexdb_client-0.2.0/cortexdb_client/_pb/cortexdb/v1/graph_pb2.py +0 -162
  21. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/.gitignore +0 -0
  22. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/MANIFEST.in +0 -0
  23. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/__init__.py +0 -0
  24. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/__init__.py +0 -0
  25. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/v1/__init__.py +0 -0
  26. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/v1/common_pb2.py +0 -0
  27. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/v1/common_pb2_grpc.py +0 -0
  28. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/v1/graph_pb2_grpc.py +0 -0
  29. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/v1/graphrag_pb2.py +0 -0
  30. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/v1/graphrag_pb2_grpc.py +0 -0
  31. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/v1/knowledge_pb2_grpc.py +0 -0
  32. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/v1/memory_pb2_grpc.py +0 -0
  33. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/v1/tools_pb2.py +0 -0
  34. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/_pb/cortexdb/v1/tools_pb2_grpc.py +0 -0
  35. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/cortexdb_client/proto.py +0 -0
  36. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/examples/agent_memory.py +0 -0
  37. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/gen.sh +0 -0
  38. {cortexdb_client-0.2.0 → cortexdb_client-0.4.0}/tests/test_integration.py +0 -0
@@ -0,0 +1,155 @@
1
+ Metadata-Version: 2.5
2
+ Name: cortexdb-client
3
+ Version: 0.4.0
4
+ Summary: Typed gRPC client for CortexDB (AI memory + knowledge graph sidecar)
5
+ Project-URL: Homepage, https://github.com/liliang-cn/cortexdb
6
+ Project-URL: Repository, https://github.com/liliang-cn/cortexdb
7
+ Author: Liang Li
8
+ License: MIT
9
+ Keywords: agent-memory,ai,cortexdb,grpc,knowledge-graph,rag
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Topic :: Database
13
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
14
+ Requires-Python: >=3.9
15
+ Requires-Dist: grpcio>=1.60
16
+ Requires-Dist: protobuf>=4.25
17
+ Provides-Extra: dev
18
+ Requires-Dist: build; extra == 'dev'
19
+ Requires-Dist: grpcio-tools>=1.60; extra == 'dev'
20
+ Requires-Dist: twine; extra == 'dev'
21
+ Provides-Extra: pandas
22
+ Requires-Dist: pandas>=1.5; extra == 'pandas'
23
+ Description-Content-Type: text/markdown
24
+
25
+ # cortexdb-client (Python)
26
+
27
+ Typed gRPC client for [CortexDB](https://github.com/liliang-cn/cortexdb) — a
28
+ pure-Go, single-file AI memory and knowledge graph database, served as a
29
+ sidecar (`cortexdb-grpc`). Give your Python agent (e.g. **Hermes**) durable
30
+ memory **and** a queryable knowledge graph.
31
+
32
+ ## Install
33
+
34
+ ```bash
35
+ pip install cortexdb-client # or: uv add cortexdb-client
36
+ ```
37
+
38
+ Start the sidecar (one binary, one SQLite file):
39
+
40
+ ```bash
41
+ go install github.com/liliang-cn/cortexdb/v2/cmd/cortexdb-grpc@latest
42
+ CORTEXDB_PATH=agent.db CORTEXDB_GRPC_TOKEN=s3cret cortexdb-grpc
43
+ # listening on 127.0.0.1:47821
44
+ ```
45
+
46
+ ## Quick start
47
+
48
+ ```python
49
+ from cortexdb_client import CortexClient, proto
50
+
51
+ with CortexClient.connect("127.0.0.1:47821", token="s3cret") as client:
52
+ client.knowledge.SaveKnowledge(proto.SaveKnowledgeRequest(
53
+ knowledge_id="note-1",
54
+ content="The user is building an autonomous research agent in Python.",
55
+ ))
56
+ hits = client.knowledge.SearchKnowledge(proto.SearchKnowledgeRequest(
57
+ query="what is the user building?", top_k=3,
58
+ ))
59
+ for h in hits.results:
60
+ print(h.knowledge_id, h.score, h.snippet)
61
+ ```
62
+
63
+ Sub-clients mirror the Rust crate: `client.knowledge`, `client.memory`,
64
+ `client.graph` (SPARQL/RDF/SHACL/inference/ontology), `client.graphrag`,
65
+ `client.tools` (generic tool dispatch, same surface as MCP), `client.admin`.
66
+
67
+ ## Results as DataFrames or CSV
68
+
69
+ `client.tools.CallTool` answers with JSON. `cortexdb_client.tabular` turns the
70
+ row-shaped part of it into flat records, a pandas DataFrame or a CSV file:
71
+
72
+ ```python
73
+ import json
74
+ from cortexdb_client import CortexClient, proto, tabular
75
+
76
+ with CortexClient.connect("127.0.0.1:47821", token="s3cret") as client:
77
+ res = client.tools.CallTool(proto.CallToolRequest(
78
+ name="graph_cypher_query",
79
+ args_json=json.dumps({"query": "MATCH (a)-[r]->(b) RETURN a, r, b LIMIT 100"}),
80
+ ))
81
+
82
+ rows = tabular.records(res) # list of flat dicts: {"a.id": ..., "r.type": ..., "b.id": ...}
83
+ df = tabular.to_pandas(res) # needs the extra: pip install "cortexdb-client[pandas]"
84
+ tabular.to_csv(res, "edges.csv") # standard library only; to_csv(res) returns the text
85
+ ```
86
+
87
+ pandas is optional and imported only inside `to_pandas()`; the base install
88
+ stays `grpcio` + `protobuf`.
89
+
90
+ | Tool | Table(s) |
91
+ | --- | --- |
92
+ | `graph_cypher_query` | `rows` (default) — `columns` zipped with each row |
93
+ | `aggregate_metadata` | `results` (default) — one row per group |
94
+ | `memory_search`, `knowledge_search` | `results` (default); `knowledge_search` may also carry `chunks` |
95
+ | `knowledge_memory_recall` | `memories`, `knowledge`, `chunks`, `graph_facts` — pass `table=` |
96
+ | `memory_list_all` | `memories` (default) |
97
+ | `graph_list_all` | `nodes`, `edges` — pass `table=` |
98
+ | `search_text`, `recall_log_list`, `graph_property_values`, … | the one top-level list of objects (`chunks`, `recalls`, `values`) |
99
+
100
+ `tabular.tables(res)` names the tables a result has. A result with more than one
101
+ and no `rows` / `results` raises `ValueError` until you pick:
102
+ `tabular.records(res, "edges")`.
103
+
104
+ How a row becomes columns:
105
+
106
+ - a scalar is a column under its key;
107
+ - a nested object becomes one column per leaf, keys joined with `.`
108
+ (`metadata.project`, `n.properties.city`); `sep="__"` changes the separator;
109
+ - a list becomes its JSON text, or stays a list with `lists="keep"`
110
+ (for `DataFrame.explode`);
111
+ - the `keys` of an aggregate group and the `memory` of a memory hit are lifted,
112
+ so their fields lead the row unprefixed (`team`, `year`, `value`, `count`;
113
+ `id`, `content`, …, `score`). A lifted name that collides keeps its prefix
114
+ (`keys.count`). Every other key of a group is a column whatever it is called,
115
+ so new measures need no client change;
116
+ - rows need not share columns: CSV leaves the cell empty, pandas gives `NaN`.
117
+
118
+ Listings page with a cursor; collect the pages, then tabulate:
119
+
120
+ ```python
121
+ memories, cursor = [], ""
122
+ while True:
123
+ page = json.loads(client.tools.CallTool(proto.CallToolRequest(
124
+ name="memory_list_all", args_json=json.dumps({"cursor": cursor}))).result_json)
125
+ memories += tabular.records(page)
126
+ cursor = page.get("next_cursor", "")
127
+ if not cursor:
128
+ break
129
+ ```
130
+
131
+ To analyse the SQLite file itself with DuckDB, pandas or `sqlite3`, see
132
+ "Data analysis" in the [guide](https://github.com/liliang-cn/cortexdb/blob/main/docs/GUIDE.md).
133
+
134
+ ## Why a knowledge graph, not just vectors
135
+
136
+ Beyond semantic recall, the `graph` service lets an agent store and traverse
137
+ **entities and relations** — multi-hop questions like "who, among the people
138
+ Alice knows, works on X" — with SPARQL, RDFS-lite inference, and SHACL-lite
139
+ validation. That is the capability most agent-memory layers lack.
140
+
141
+ ## Embeddings
142
+
143
+ Lexical mode needs no keys. Point the sidecar at any OpenAI-compatible
144
+ embeddings endpoint (e.g. Ollama) to enable vector retrieval:
145
+
146
+ ```bash
147
+ OPENAI_BASE_URL=http://localhost:11434/v1 \
148
+ CORTEXDB_EMBED_MODEL=embeddinggemma CORTEXDB_EMBED_DIM=768 \
149
+ cortexdb-grpc
150
+ ```
151
+
152
+ ## Regenerating the protobuf code
153
+
154
+ Generated code is committed under `cortexdb_client/_pb`. To regenerate after a
155
+ proto change: `uv run --extra dev ./gen.sh`.
@@ -0,0 +1,131 @@
1
+ # cortexdb-client (Python)
2
+
3
+ Typed gRPC client for [CortexDB](https://github.com/liliang-cn/cortexdb) — a
4
+ pure-Go, single-file AI memory and knowledge graph database, served as a
5
+ sidecar (`cortexdb-grpc`). Give your Python agent (e.g. **Hermes**) durable
6
+ memory **and** a queryable knowledge graph.
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ pip install cortexdb-client # or: uv add cortexdb-client
12
+ ```
13
+
14
+ Start the sidecar (one binary, one SQLite file):
15
+
16
+ ```bash
17
+ go install github.com/liliang-cn/cortexdb/v2/cmd/cortexdb-grpc@latest
18
+ CORTEXDB_PATH=agent.db CORTEXDB_GRPC_TOKEN=s3cret cortexdb-grpc
19
+ # listening on 127.0.0.1:47821
20
+ ```
21
+
22
+ ## Quick start
23
+
24
+ ```python
25
+ from cortexdb_client import CortexClient, proto
26
+
27
+ with CortexClient.connect("127.0.0.1:47821", token="s3cret") as client:
28
+ client.knowledge.SaveKnowledge(proto.SaveKnowledgeRequest(
29
+ knowledge_id="note-1",
30
+ content="The user is building an autonomous research agent in Python.",
31
+ ))
32
+ hits = client.knowledge.SearchKnowledge(proto.SearchKnowledgeRequest(
33
+ query="what is the user building?", top_k=3,
34
+ ))
35
+ for h in hits.results:
36
+ print(h.knowledge_id, h.score, h.snippet)
37
+ ```
38
+
39
+ Sub-clients mirror the Rust crate: `client.knowledge`, `client.memory`,
40
+ `client.graph` (SPARQL/RDF/SHACL/inference/ontology), `client.graphrag`,
41
+ `client.tools` (generic tool dispatch, same surface as MCP), `client.admin`.
42
+
43
+ ## Results as DataFrames or CSV
44
+
45
+ `client.tools.CallTool` answers with JSON. `cortexdb_client.tabular` turns the
46
+ row-shaped part of it into flat records, a pandas DataFrame or a CSV file:
47
+
48
+ ```python
49
+ import json
50
+ from cortexdb_client import CortexClient, proto, tabular
51
+
52
+ with CortexClient.connect("127.0.0.1:47821", token="s3cret") as client:
53
+ res = client.tools.CallTool(proto.CallToolRequest(
54
+ name="graph_cypher_query",
55
+ args_json=json.dumps({"query": "MATCH (a)-[r]->(b) RETURN a, r, b LIMIT 100"}),
56
+ ))
57
+
58
+ rows = tabular.records(res) # list of flat dicts: {"a.id": ..., "r.type": ..., "b.id": ...}
59
+ df = tabular.to_pandas(res) # needs the extra: pip install "cortexdb-client[pandas]"
60
+ tabular.to_csv(res, "edges.csv") # standard library only; to_csv(res) returns the text
61
+ ```
62
+
63
+ pandas is optional and imported only inside `to_pandas()`; the base install
64
+ stays `grpcio` + `protobuf`.
65
+
66
+ | Tool | Table(s) |
67
+ | --- | --- |
68
+ | `graph_cypher_query` | `rows` (default) — `columns` zipped with each row |
69
+ | `aggregate_metadata` | `results` (default) — one row per group |
70
+ | `memory_search`, `knowledge_search` | `results` (default); `knowledge_search` may also carry `chunks` |
71
+ | `knowledge_memory_recall` | `memories`, `knowledge`, `chunks`, `graph_facts` — pass `table=` |
72
+ | `memory_list_all` | `memories` (default) |
73
+ | `graph_list_all` | `nodes`, `edges` — pass `table=` |
74
+ | `search_text`, `recall_log_list`, `graph_property_values`, … | the one top-level list of objects (`chunks`, `recalls`, `values`) |
75
+
76
+ `tabular.tables(res)` names the tables a result has. A result with more than one
77
+ and no `rows` / `results` raises `ValueError` until you pick:
78
+ `tabular.records(res, "edges")`.
79
+
80
+ How a row becomes columns:
81
+
82
+ - a scalar is a column under its key;
83
+ - a nested object becomes one column per leaf, keys joined with `.`
84
+ (`metadata.project`, `n.properties.city`); `sep="__"` changes the separator;
85
+ - a list becomes its JSON text, or stays a list with `lists="keep"`
86
+ (for `DataFrame.explode`);
87
+ - the `keys` of an aggregate group and the `memory` of a memory hit are lifted,
88
+ so their fields lead the row unprefixed (`team`, `year`, `value`, `count`;
89
+ `id`, `content`, …, `score`). A lifted name that collides keeps its prefix
90
+ (`keys.count`). Every other key of a group is a column whatever it is called,
91
+ so new measures need no client change;
92
+ - rows need not share columns: CSV leaves the cell empty, pandas gives `NaN`.
93
+
94
+ Listings page with a cursor; collect the pages, then tabulate:
95
+
96
+ ```python
97
+ memories, cursor = [], ""
98
+ while True:
99
+ page = json.loads(client.tools.CallTool(proto.CallToolRequest(
100
+ name="memory_list_all", args_json=json.dumps({"cursor": cursor}))).result_json)
101
+ memories += tabular.records(page)
102
+ cursor = page.get("next_cursor", "")
103
+ if not cursor:
104
+ break
105
+ ```
106
+
107
+ To analyse the SQLite file itself with DuckDB, pandas or `sqlite3`, see
108
+ "Data analysis" in the [guide](https://github.com/liliang-cn/cortexdb/blob/main/docs/GUIDE.md).
109
+
110
+ ## Why a knowledge graph, not just vectors
111
+
112
+ Beyond semantic recall, the `graph` service lets an agent store and traverse
113
+ **entities and relations** — multi-hop questions like "who, among the people
114
+ Alice knows, works on X" — with SPARQL, RDFS-lite inference, and SHACL-lite
115
+ validation. That is the capability most agent-memory layers lack.
116
+
117
+ ## Embeddings
118
+
119
+ Lexical mode needs no keys. Point the sidecar at any OpenAI-compatible
120
+ embeddings endpoint (e.g. Ollama) to enable vector retrieval:
121
+
122
+ ```bash
123
+ OPENAI_BASE_URL=http://localhost:11434/v1 \
124
+ CORTEXDB_EMBED_MODEL=embeddinggemma CORTEXDB_EMBED_DIM=768 \
125
+ cortexdb-grpc
126
+ ```
127
+
128
+ ## Regenerating the protobuf code
129
+
130
+ Generated code is committed under `cortexdb_client/_pb`. To regenerate after a
131
+ proto change: `uv run --extra dev ./gen.sh`.
@@ -16,10 +16,14 @@ Example::
16
16
  The sub-client accessors mirror the Rust crate: ``client.knowledge``,
17
17
  ``client.memory``, ``client.graph``, ``client.graphrag``, ``client.tools``,
18
18
  ``client.admin``.
19
+
20
+ ``cortexdb_client.tabular`` turns a tool result into flat records, a pandas
21
+ DataFrame or CSV.
19
22
  """
20
23
 
21
24
  from .client import CortexClient
22
25
  from . import proto
26
+ from . import tabular
23
27
 
24
- __all__ = ["CortexClient", "proto"]
28
+ __all__ = ["CortexClient", "proto", "tabular"]
25
29
  __version__ = "0.1.0"
@@ -24,7 +24,7 @@ _sym_db = _symbol_database.Default()
24
24
 
25
25
 
26
26
 
27
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17\x63ortexdb/v1/admin.proto\x12\x0b\x63ortexdb.v1\"\x0f\n\rHealthRequest\"\x1c\n\x0eHealthResponse\x12\n\n\x02ok\x18\x01 \x01(\x08\"\r\n\x0bInfoRequest\"F\n\x0cInfoResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x0f\n\x07\x64\x62_path\x18\x02 \x01(\t\x12\x14\n\x0chas_embedder\x18\x03 \x01(\x08\x32\x8e\x01\n\x0c\x41\x64minService\x12\x41\n\x06Health\x12\x1a.cortexdb.v1.HealthRequest\x1a\x1b.cortexdb.v1.HealthResponse\x12;\n\x04Info\x12\x18.cortexdb.v1.InfoRequest\x1a\x19.cortexdb.v1.InfoResponseB4Z2github.com/liliang-cn/cortexdb/v2/pkg/rpc/v1;rpcv1b\x06proto3')
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17\x63ortexdb/v1/admin.proto\x12\x0b\x63ortexdb.v1\"\x0f\n\rHealthRequest\"\x1c\n\x0eHealthResponse\x12\n\n\x02ok\x18\x01 \x01(\x08\"\r\n\x0bInfoRequest\"\x99\x01\n\x0cInfoResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x0f\n\x07\x64\x62_path\x18\x02 \x01(\t\x12\x14\n\x0chas_embedder\x18\x03 \x01(\x08\x12\x18\n\x10\x65mbedder_healthy\x18\x04 \x01(\x08\x12\x16\n\x0e\x65mbedder_error\x18\x05 \x01(\t\x12\x1f\n\x17memories_without_vector\x18\x06 \x01(\x03\"\x1d\n\rBackupRequest\x12\x0c\n\x04path\x18\x01 \x01(\t\"2\n\x0e\x42\x61\x63kupResponse\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\x03\x32\xd1\x01\n\x0c\x41\x64minService\x12\x41\n\x06Health\x12\x1a.cortexdb.v1.HealthRequest\x1a\x1b.cortexdb.v1.HealthResponse\x12;\n\x04Info\x12\x18.cortexdb.v1.InfoRequest\x1a\x19.cortexdb.v1.InfoResponse\x12\x41\n\x06\x42\x61\x63kup\x12\x1a.cortexdb.v1.BackupRequest\x1a\x1b.cortexdb.v1.BackupResponseB4Z2github.com/liliang-cn/cortexdb/v2/pkg/rpc/v1;rpcv1b\x06proto3')
28
28
 
29
29
  _globals = globals()
30
30
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -38,8 +38,12 @@ if not _descriptor._USE_C_DESCRIPTORS:
38
38
  _globals['_HEALTHRESPONSE']._serialized_end=85
39
39
  _globals['_INFOREQUEST']._serialized_start=87
40
40
  _globals['_INFOREQUEST']._serialized_end=100
41
- _globals['_INFORESPONSE']._serialized_start=102
42
- _globals['_INFORESPONSE']._serialized_end=172
43
- _globals['_ADMINSERVICE']._serialized_start=175
44
- _globals['_ADMINSERVICE']._serialized_end=317
41
+ _globals['_INFORESPONSE']._serialized_start=103
42
+ _globals['_INFORESPONSE']._serialized_end=256
43
+ _globals['_BACKUPREQUEST']._serialized_start=258
44
+ _globals['_BACKUPREQUEST']._serialized_end=287
45
+ _globals['_BACKUPRESPONSE']._serialized_start=289
46
+ _globals['_BACKUPRESPONSE']._serialized_end=339
47
+ _globals['_ADMINSERVICE']._serialized_start=342
48
+ _globals['_ADMINSERVICE']._serialized_end=551
45
49
  # @@protoc_insertion_point(module_scope)
@@ -44,6 +44,11 @@ class AdminServiceStub:
44
44
  request_serializer=cortexdb_dot_v1_dot_admin__pb2.InfoRequest.SerializeToString,
45
45
  response_deserializer=cortexdb_dot_v1_dot_admin__pb2.InfoResponse.FromString,
46
46
  _registered_method=True)
47
+ self.Backup = channel.unary_unary(
48
+ '/cortexdb.v1.AdminService/Backup',
49
+ request_serializer=cortexdb_dot_v1_dot_admin__pb2.BackupRequest.SerializeToString,
50
+ response_deserializer=cortexdb_dot_v1_dot_admin__pb2.BackupResponse.FromString,
51
+ _registered_method=True)
47
52
 
48
53
 
49
54
  class AdminServiceServicer:
@@ -61,6 +66,14 @@ class AdminServiceServicer:
61
66
  context.set_details('Method not implemented!')
62
67
  raise NotImplementedError('Method not implemented!')
63
68
 
69
+ def Backup(self, request, context):
70
+ """Backup snapshots the whole brain without stopping the server. Backends that
71
+ are backed up by their own tooling (PostgreSQL) fail it with UNIMPLEMENTED.
72
+ """
73
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
74
+ context.set_details('Method not implemented!')
75
+ raise NotImplementedError('Method not implemented!')
76
+
64
77
 
65
78
  def add_AdminServiceServicer_to_server(servicer, server):
66
79
  rpc_method_handlers = {
@@ -74,6 +87,11 @@ def add_AdminServiceServicer_to_server(servicer, server):
74
87
  request_deserializer=cortexdb_dot_v1_dot_admin__pb2.InfoRequest.FromString,
75
88
  response_serializer=cortexdb_dot_v1_dot_admin__pb2.InfoResponse.SerializeToString,
76
89
  ),
90
+ 'Backup': grpc.unary_unary_rpc_method_handler(
91
+ servicer.Backup,
92
+ request_deserializer=cortexdb_dot_v1_dot_admin__pb2.BackupRequest.FromString,
93
+ response_serializer=cortexdb_dot_v1_dot_admin__pb2.BackupResponse.SerializeToString,
94
+ ),
77
95
  }
78
96
  generic_handler = grpc.method_handlers_generic_handler(
79
97
  'cortexdb.v1.AdminService', rpc_method_handlers)
@@ -138,3 +156,30 @@ class AdminService:
138
156
  timeout,
139
157
  metadata,
140
158
  _registered_method=True)
159
+
160
+ @staticmethod
161
+ def Backup(request,
162
+ target,
163
+ options=(),
164
+ channel_credentials=None,
165
+ call_credentials=None,
166
+ insecure=False,
167
+ compression=None,
168
+ wait_for_ready=None,
169
+ timeout=None,
170
+ metadata=None):
171
+ return grpc.experimental.unary_unary(
172
+ request,
173
+ target,
174
+ '/cortexdb.v1.AdminService/Backup',
175
+ cortexdb_dot_v1_dot_admin__pb2.BackupRequest.SerializeToString,
176
+ cortexdb_dot_v1_dot_admin__pb2.BackupResponse.FromString,
177
+ options,
178
+ channel_credentials,
179
+ insecure,
180
+ call_credentials,
181
+ compression,
182
+ wait_for_ready,
183
+ timeout,
184
+ metadata,
185
+ _registered_method=True)
@@ -0,0 +1,53 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
4
+ # source: cortexdb/v1/contract.proto
5
+ # Protobuf Python Version: 6.33.5
6
+ """Generated protocol buffer code."""
7
+ from google.protobuf import descriptor as _descriptor
8
+ from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
10
+ from google.protobuf import symbol_database as _symbol_database
11
+ from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 6,
15
+ 33,
16
+ 5,
17
+ '',
18
+ 'cortexdb/v1/contract.proto'
19
+ )
20
+ # @@protoc_insertion_point(imports)
21
+
22
+ _sym_db = _symbol_database.Default()
23
+
24
+
25
+
26
+
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1a\x63ortexdb/v1/contract.proto\x12\x0b\x63ortexdb.v1\"*\n\nGradeCount\x12\r\n\x05nodes\x18\x01 \x01(\x03\x12\r\n\x05\x65\x64ges\x18\x02 \x01(\x03\"\x16\n\x14\x43ontractTallyRequest\"\xa6\x03\n\x15\x43ontractTallyResponse\x12)\n\x08verified\x18\x01 \x01(\x0b\x32\x17.cortexdb.v1.GradeCount\x12\x30\n\x0fself_consistent\x18\x02 \x01(\x0b\x32\x17.cortexdb.v1.GradeCount\x12)\n\x08\x61sserted\x18\x03 \x01(\x0b\x32\x17.cortexdb.v1.GradeCount\x12%\n\x04held\x18\x04 \x01(\x0b\x32\x17.cortexdb.v1.GradeCount\x12(\n\x07refused\x18\x05 \x01(\x0b\x32\x17.cortexdb.v1.GradeCount\x12)\n\x08untagged\x18\x06 \x01(\x0b\x32\x17.cortexdb.v1.GradeCount\x12@\n\x07unknown\x18\x07 \x03(\x0b\x32/.cortexdb.v1.ContractTallyResponse.UnknownEntry\x1aG\n\x0cUnknownEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.cortexdb.v1.GradeCount:\x02\x38\x01\"\xc6\x01\n\x0cGradedRecord\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04\x65\x64ge\x18\x02 \x01(\x08\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x04 \x01(\t\x12\x0c\n\x04\x66rom\x18\x05 \x01(\t\x12\n\n\x02to\x18\x06 \x01(\t\x12\r\n\x05grade\x18\x07 \x01(\t\x12\r\n\x05state\x18\x08 \x01(\t\x12\x0b\n\x03why\x18\t \x01(\t\x12\x0e\n\x06source\x18\n \x01(\t\x12\x10\n\x08producer\x18\x0b \x01(\t\x12\n\n\x02\x61t\x18\x0c \x01(\t\x12\n\n\x02\x62y\x18\r \x01(\t\"&\n\x15NeedsAttentionRequest\x12\r\n\x05limit\x18\x01 \x01(\x05\"f\n\x16NeedsAttentionResponse\x12*\n\x07records\x18\x01 \x03(\x0b\x32\x19.cortexdb.v1.GradedRecord\x12\x11\n\ttruncated\x18\x02 \x01(\x08\x12\r\n\x05total\x18\x03 \x01(\x03\x32\xc4\x01\n\x0f\x43ontractService\x12V\n\rContractTally\x12!.cortexdb.v1.ContractTallyRequest\x1a\".cortexdb.v1.ContractTallyResponse\x12Y\n\x0eNeedsAttention\x12\".cortexdb.v1.NeedsAttentionRequest\x1a#.cortexdb.v1.NeedsAttentionResponseB4Z2github.com/liliang-cn/cortexdb/v2/pkg/rpc/v1;rpcv1b\x06proto3')
28
+
29
+ _globals = globals()
30
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
31
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cortexdb.v1.contract_pb2', _globals)
32
+ if not _descriptor._USE_C_DESCRIPTORS:
33
+ _globals['DESCRIPTOR']._loaded_options = None
34
+ _globals['DESCRIPTOR']._serialized_options = b'Z2github.com/liliang-cn/cortexdb/v2/pkg/rpc/v1;rpcv1'
35
+ _globals['_CONTRACTTALLYRESPONSE_UNKNOWNENTRY']._loaded_options = None
36
+ _globals['_CONTRACTTALLYRESPONSE_UNKNOWNENTRY']._serialized_options = b'8\001'
37
+ _globals['_GRADECOUNT']._serialized_start=43
38
+ _globals['_GRADECOUNT']._serialized_end=85
39
+ _globals['_CONTRACTTALLYREQUEST']._serialized_start=87
40
+ _globals['_CONTRACTTALLYREQUEST']._serialized_end=109
41
+ _globals['_CONTRACTTALLYRESPONSE']._serialized_start=112
42
+ _globals['_CONTRACTTALLYRESPONSE']._serialized_end=534
43
+ _globals['_CONTRACTTALLYRESPONSE_UNKNOWNENTRY']._serialized_start=463
44
+ _globals['_CONTRACTTALLYRESPONSE_UNKNOWNENTRY']._serialized_end=534
45
+ _globals['_GRADEDRECORD']._serialized_start=537
46
+ _globals['_GRADEDRECORD']._serialized_end=735
47
+ _globals['_NEEDSATTENTIONREQUEST']._serialized_start=737
48
+ _globals['_NEEDSATTENTIONREQUEST']._serialized_end=775
49
+ _globals['_NEEDSATTENTIONRESPONSE']._serialized_start=777
50
+ _globals['_NEEDSATTENTIONRESPONSE']._serialized_end=879
51
+ _globals['_CONTRACTSERVICE']._serialized_start=882
52
+ _globals['_CONTRACTSERVICE']._serialized_end=1078
53
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,157 @@
1
+ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
+ """Client and server classes corresponding to protobuf-defined services."""
3
+ import grpc
4
+ import warnings
5
+
6
+ from cortexdb_client._pb.cortexdb.v1 import contract_pb2 as cortexdb_dot_v1_dot_contract__pb2
7
+
8
+ GRPC_GENERATED_VERSION = '1.81.0'
9
+ GRPC_VERSION = grpc.__version__
10
+ _version_not_supported = False
11
+
12
+ try:
13
+ from grpc._utilities import first_version_is_lower
14
+ _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
15
+ except ImportError:
16
+ _version_not_supported = True
17
+
18
+ if _version_not_supported:
19
+ raise RuntimeError(
20
+ f'The grpc package installed is at version {GRPC_VERSION},'
21
+ + ' but the generated code in cortexdb/v1/contract_pb2_grpc.py depends on'
22
+ + f' grpcio>={GRPC_GENERATED_VERSION}.'
23
+ + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
24
+ + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
25
+ )
26
+
27
+
28
+ class ContractServiceStub:
29
+ """ContractService reads the knowledge contract. Read-only by construction:
30
+ what goes on the shelf is written through the stores' own RPCs, and a
31
+ producer that could stamp a grade without writing the record would be a way
32
+ to make the tally disagree with the shelf.
33
+ """
34
+
35
+ def __init__(self, channel):
36
+ """Constructor.
37
+
38
+ Args:
39
+ channel: A grpc.Channel.
40
+ """
41
+ self.ContractTally = channel.unary_unary(
42
+ '/cortexdb.v1.ContractService/ContractTally',
43
+ request_serializer=cortexdb_dot_v1_dot_contract__pb2.ContractTallyRequest.SerializeToString,
44
+ response_deserializer=cortexdb_dot_v1_dot_contract__pb2.ContractTallyResponse.FromString,
45
+ _registered_method=True)
46
+ self.NeedsAttention = channel.unary_unary(
47
+ '/cortexdb.v1.ContractService/NeedsAttention',
48
+ request_serializer=cortexdb_dot_v1_dot_contract__pb2.NeedsAttentionRequest.SerializeToString,
49
+ response_deserializer=cortexdb_dot_v1_dot_contract__pb2.NeedsAttentionResponse.FromString,
50
+ _registered_method=True)
51
+
52
+
53
+ class ContractServiceServicer:
54
+ """ContractService reads the knowledge contract. Read-only by construction:
55
+ what goes on the shelf is written through the stores' own RPCs, and a
56
+ producer that could stamp a grade without writing the record would be a way
57
+ to make the tally disagree with the shelf.
58
+ """
59
+
60
+ def ContractTally(self, request, context):
61
+ """ContractTally counts every node and edge by its grade.
62
+ """
63
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
64
+ context.set_details('Method not implemented!')
65
+ raise NotImplementedError('Method not implemented!')
66
+
67
+ def NeedsAttention(self, request, context):
68
+ """NeedsAttention lists what a person has to deal with. It is a named call
69
+ rather than a filter language because it is the one question the contract
70
+ exists to make answerable, and because held and refused belong in one list
71
+ — split into two calls, it is likely only one gets rendered.
72
+ """
73
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
74
+ context.set_details('Method not implemented!')
75
+ raise NotImplementedError('Method not implemented!')
76
+
77
+
78
+ def add_ContractServiceServicer_to_server(servicer, server):
79
+ rpc_method_handlers = {
80
+ 'ContractTally': grpc.unary_unary_rpc_method_handler(
81
+ servicer.ContractTally,
82
+ request_deserializer=cortexdb_dot_v1_dot_contract__pb2.ContractTallyRequest.FromString,
83
+ response_serializer=cortexdb_dot_v1_dot_contract__pb2.ContractTallyResponse.SerializeToString,
84
+ ),
85
+ 'NeedsAttention': grpc.unary_unary_rpc_method_handler(
86
+ servicer.NeedsAttention,
87
+ request_deserializer=cortexdb_dot_v1_dot_contract__pb2.NeedsAttentionRequest.FromString,
88
+ response_serializer=cortexdb_dot_v1_dot_contract__pb2.NeedsAttentionResponse.SerializeToString,
89
+ ),
90
+ }
91
+ generic_handler = grpc.method_handlers_generic_handler(
92
+ 'cortexdb.v1.ContractService', rpc_method_handlers)
93
+ server.add_generic_rpc_handlers((generic_handler,))
94
+ server.add_registered_method_handlers('cortexdb.v1.ContractService', rpc_method_handlers)
95
+
96
+
97
+ # This class is part of an EXPERIMENTAL API.
98
+ class ContractService:
99
+ """ContractService reads the knowledge contract. Read-only by construction:
100
+ what goes on the shelf is written through the stores' own RPCs, and a
101
+ producer that could stamp a grade without writing the record would be a way
102
+ to make the tally disagree with the shelf.
103
+ """
104
+
105
+ @staticmethod
106
+ def ContractTally(request,
107
+ target,
108
+ options=(),
109
+ channel_credentials=None,
110
+ call_credentials=None,
111
+ insecure=False,
112
+ compression=None,
113
+ wait_for_ready=None,
114
+ timeout=None,
115
+ metadata=None):
116
+ return grpc.experimental.unary_unary(
117
+ request,
118
+ target,
119
+ '/cortexdb.v1.ContractService/ContractTally',
120
+ cortexdb_dot_v1_dot_contract__pb2.ContractTallyRequest.SerializeToString,
121
+ cortexdb_dot_v1_dot_contract__pb2.ContractTallyResponse.FromString,
122
+ options,
123
+ channel_credentials,
124
+ insecure,
125
+ call_credentials,
126
+ compression,
127
+ wait_for_ready,
128
+ timeout,
129
+ metadata,
130
+ _registered_method=True)
131
+
132
+ @staticmethod
133
+ def NeedsAttention(request,
134
+ target,
135
+ options=(),
136
+ channel_credentials=None,
137
+ call_credentials=None,
138
+ insecure=False,
139
+ compression=None,
140
+ wait_for_ready=None,
141
+ timeout=None,
142
+ metadata=None):
143
+ return grpc.experimental.unary_unary(
144
+ request,
145
+ target,
146
+ '/cortexdb.v1.ContractService/NeedsAttention',
147
+ cortexdb_dot_v1_dot_contract__pb2.NeedsAttentionRequest.SerializeToString,
148
+ cortexdb_dot_v1_dot_contract__pb2.NeedsAttentionResponse.FromString,
149
+ options,
150
+ channel_credentials,
151
+ insecure,
152
+ call_credentials,
153
+ compression,
154
+ wait_for_ready,
155
+ timeout,
156
+ metadata,
157
+ _registered_method=True)
@@ -0,0 +1,53 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
4
+ # source: cortexdb/v1/decision.proto
5
+ # Protobuf Python Version: 6.33.5
6
+ """Generated protocol buffer code."""
7
+ from google.protobuf import descriptor as _descriptor
8
+ from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
10
+ from google.protobuf import symbol_database as _symbol_database
11
+ from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 6,
15
+ 33,
16
+ 5,
17
+ '',
18
+ 'cortexdb/v1/decision.proto'
19
+ )
20
+ # @@protoc_insertion_point(imports)
21
+
22
+ _sym_db = _symbol_database.Default()
23
+
24
+
25
+
26
+
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1a\x63ortexdb/v1/decision.proto\x12\x0b\x63ortexdb.v1\"\xa6\x01\n\x0f\x44\x65\x63isionPremise\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04\x65\x64ge\x18\x02 \x01(\x08\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x04 \x01(\t\x12\x0c\n\x04\x66rom\x18\x05 \x01(\t\x12\n\n\x02to\x18\x06 \x01(\t\x12\x10\n\x08\x64\x65\x63ision\x18\x07 \x01(\x08\x12\r\n\x05grade\x18\x08 \x01(\t\x12\x0e\n\x06source\x18\t \x01(\t\x12\x0f\n\x07missing\x18\n \x01(\x08\"\x80\x02\n\x08\x44\x65\x63ision\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\r\n\x05\x61\x63tor\x18\x03 \x01(\t\x12\n\n\x02\x61t\x18\x04 \x01(\t\x12\x0f\n\x07verdict\x18\x05 \x01(\t\x12\x0f\n\x07subject\x18\x06 \x01(\t\x12\x0c\n\x04note\x18\x07 \x01(\t\x12\r\n\x05grade\x18\x08 \x01(\t\x12\x0e\n\x06source\x18\t \x01(\t\x12\x10\n\x08producer\x18\n \x01(\t\x12\r\n\x05state\x18\x0b \x01(\t\x12\x0b\n\x03why\x18\x0c \x01(\t\x12.\n\x08premises\x18\r \x03(\x0b\x32\x1c.cortexdb.v1.DecisionPremise\x12\x12\n\nsupersedes\x18\x0e \x03(\t\"\xef\x01\n\x15RecordDecisionRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\r\n\x05\x61\x63tor\x18\x03 \x01(\t\x12\x0c\n\x04note\x18\x04 \x01(\t\x12\x0f\n\x07verdict\x18\x05 \x01(\t\x12\x0f\n\x07subject\x18\x06 \x01(\t\x12\x10\n\x08premises\x18\x07 \x03(\t\x12\x12\n\nsupersedes\x18\x08 \x01(\t\x12\n\n\x02\x61t\x18\t \x01(\t\x12\x0e\n\x06source\x18\n \x01(\t\x12\x10\n\x08producer\x18\x0b \x01(\t\x12\r\n\x05grade\x18\x0c \x01(\t\x12\r\n\x05state\x18\r \x01(\t\x12\x0b\n\x03why\x18\x0e \x01(\t\"A\n\x16RecordDecisionResponse\x12\'\n\x08\x64\x65\x63ision\x18\x01 \x01(\x0b\x32\x15.cortexdb.v1.Decision\"5\n\x14\x44\x65\x63isionChainRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tmax_depth\x18\x02 \x01(\x05\"q\n\x15\x44\x65\x63isionChainResponse\x12\x0c\n\x04root\x18\x01 \x01(\t\x12(\n\tdecisions\x18\x02 \x03(\x0b\x32\x15.cortexdb.v1.Decision\x12\r\n\x05\x64\x65pth\x18\x03 \x01(\x05\x12\x11\n\ttruncated\x18\x04 \x01(\x08\"R\n\x11PrecedentsRequest\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x0f\n\x07subject\x18\x02 \x01(\t\x12\x0f\n\x07\x65xclude\x18\x03 \x01(\t\x12\r\n\x05limit\x18\x04 \x01(\x05\"`\n\x12PrecedentsResponse\x12(\n\tdecisions\x18\x01 \x03(\x0b\x32\x15.cortexdb.v1.Decision\x12\r\n\x05\x63ount\x18\x02 \x01(\x05\x12\x11\n\ttruncated\x18\x03 \x01(\x08\x32\x93\x02\n\x0f\x44\x65\x63isionService\x12Y\n\x0eRecordDecision\x12\".cortexdb.v1.RecordDecisionRequest\x1a#.cortexdb.v1.RecordDecisionResponse\x12V\n\rDecisionChain\x12!.cortexdb.v1.DecisionChainRequest\x1a\".cortexdb.v1.DecisionChainResponse\x12M\n\nPrecedents\x12\x1e.cortexdb.v1.PrecedentsRequest\x1a\x1f.cortexdb.v1.PrecedentsResponseB4Z2github.com/liliang-cn/cortexdb/v2/pkg/rpc/v1;rpcv1b\x06proto3')
28
+
29
+ _globals = globals()
30
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
31
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cortexdb.v1.decision_pb2', _globals)
32
+ if not _descriptor._USE_C_DESCRIPTORS:
33
+ _globals['DESCRIPTOR']._loaded_options = None
34
+ _globals['DESCRIPTOR']._serialized_options = b'Z2github.com/liliang-cn/cortexdb/v2/pkg/rpc/v1;rpcv1'
35
+ _globals['_DECISIONPREMISE']._serialized_start=44
36
+ _globals['_DECISIONPREMISE']._serialized_end=210
37
+ _globals['_DECISION']._serialized_start=213
38
+ _globals['_DECISION']._serialized_end=469
39
+ _globals['_RECORDDECISIONREQUEST']._serialized_start=472
40
+ _globals['_RECORDDECISIONREQUEST']._serialized_end=711
41
+ _globals['_RECORDDECISIONRESPONSE']._serialized_start=713
42
+ _globals['_RECORDDECISIONRESPONSE']._serialized_end=778
43
+ _globals['_DECISIONCHAINREQUEST']._serialized_start=780
44
+ _globals['_DECISIONCHAINREQUEST']._serialized_end=833
45
+ _globals['_DECISIONCHAINRESPONSE']._serialized_start=835
46
+ _globals['_DECISIONCHAINRESPONSE']._serialized_end=948
47
+ _globals['_PRECEDENTSREQUEST']._serialized_start=950
48
+ _globals['_PRECEDENTSREQUEST']._serialized_end=1032
49
+ _globals['_PRECEDENTSRESPONSE']._serialized_start=1034
50
+ _globals['_PRECEDENTSRESPONSE']._serialized_end=1130
51
+ _globals['_DECISIONSERVICE']._serialized_start=1133
52
+ _globals['_DECISIONSERVICE']._serialized_end=1408
53
+ # @@protoc_insertion_point(module_scope)