indexify 0.4.22__py3-none-any.whl → 0.4.24__py3-none-any.whl

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 (35) hide show
  1. indexify/cli/executor.py +2 -9
  2. indexify/executor/blob_store/blob_store.py +110 -26
  3. indexify/executor/blob_store/local_fs_blob_store.py +41 -1
  4. indexify/executor/blob_store/metrics/blob_store.py +87 -15
  5. indexify/executor/blob_store/s3_blob_store.py +112 -1
  6. indexify/executor/function_executor/function_executor.py +32 -56
  7. indexify/executor/function_executor/invocation_state_client.py +10 -3
  8. indexify/executor/function_executor/server/function_executor_server_factory.py +0 -1
  9. indexify/executor/function_executor_controller/create_function_executor.py +129 -116
  10. indexify/executor/function_executor_controller/downloads.py +34 -86
  11. indexify/executor/function_executor_controller/events.py +13 -7
  12. indexify/executor/function_executor_controller/finalize_task.py +184 -0
  13. indexify/executor/function_executor_controller/function_executor_controller.py +121 -78
  14. indexify/executor/function_executor_controller/message_validators.py +10 -3
  15. indexify/executor/function_executor_controller/metrics/downloads.py +8 -52
  16. indexify/executor/function_executor_controller/metrics/finalize_task.py +20 -0
  17. indexify/executor/function_executor_controller/metrics/prepare_task.py +18 -0
  18. indexify/executor/function_executor_controller/prepare_task.py +232 -14
  19. indexify/executor/function_executor_controller/run_task.py +77 -61
  20. indexify/executor/function_executor_controller/task_info.py +4 -7
  21. indexify/executor/function_executor_controller/task_input.py +21 -0
  22. indexify/executor/function_executor_controller/task_output.py +26 -35
  23. indexify/executor/function_executor_controller/terminate_function_executor.py +6 -1
  24. indexify/executor/logging.py +69 -0
  25. indexify/executor/monitoring/metrics.py +22 -0
  26. indexify/proto/executor_api.proto +11 -3
  27. indexify/proto/executor_api_pb2.py +54 -54
  28. indexify/proto/executor_api_pb2.pyi +8 -1
  29. {indexify-0.4.22.dist-info → indexify-0.4.24.dist-info}/METADATA +6 -6
  30. {indexify-0.4.22.dist-info → indexify-0.4.24.dist-info}/RECORD +32 -30
  31. indexify/executor/function_executor_controller/function_executor_startup_output.py +0 -21
  32. indexify/executor/function_executor_controller/metrics/upload_task_output.py +0 -39
  33. indexify/executor/function_executor_controller/upload_task_output.py +0 -274
  34. {indexify-0.4.22.dist-info → indexify-0.4.24.dist-info}/WHEEL +0 -0
  35. {indexify-0.4.22.dist-info → indexify-0.4.24.dist-info}/entry_points.txt +0 -0
@@ -1,19 +1,17 @@
1
1
  from typing import Any, Dict, List, Optional
2
2
 
3
3
  from tensorlake.function_executor.proto.function_executor_pb2 import (
4
- SerializedObject,
4
+ BLOB,
5
+ SerializedObjectInsideBLOB,
5
6
  )
6
7
 
7
8
  from indexify.proto.executor_api_pb2 import (
8
- DataPayload,
9
9
  FunctionExecutorTerminationReason,
10
10
  TaskAllocation,
11
11
  TaskFailureReason,
12
12
  TaskOutcomeCode,
13
13
  )
14
14
 
15
- from .function_executor_startup_output import FunctionExecutorStartupOutput
16
-
17
15
 
18
16
  class TaskMetrics:
19
17
  """Metrics for a task."""
@@ -30,33 +28,27 @@ class TaskOutput:
30
28
  self,
31
29
  allocation: TaskAllocation,
32
30
  outcome_code: TaskOutcomeCode,
33
- # Optional[TaskFailureReason] is not supported in python 3.9
34
- failure_reason: TaskFailureReason = None,
35
- invocation_error_output: Optional[SerializedObject] = None,
36
- function_outputs: List[SerializedObject] = [],
31
+ failure_reason: Optional[TaskFailureReason] = None,
32
+ function_outputs: List[SerializedObjectInsideBLOB] = [],
33
+ uploaded_function_outputs_blob: Optional[BLOB] = None,
34
+ invocation_error_output: Optional[SerializedObjectInsideBLOB] = None,
35
+ uploaded_invocation_error_blob: Optional[BLOB] = None,
37
36
  next_functions: List[str] = [],
38
- stdout: Optional[str] = None,
39
- stderr: Optional[str] = None,
40
37
  metrics: Optional[TaskMetrics] = None,
41
38
  execution_start_time: Optional[float] = None,
42
39
  execution_end_time: Optional[float] = None,
43
40
  ):
44
- self.task = allocation.task
45
41
  self.allocation = allocation
46
- self.function_outputs = function_outputs
47
- self.next_functions = next_functions
48
- self.stdout = stdout
49
- self.stderr = stderr
50
42
  self.outcome_code = outcome_code
51
43
  self.failure_reason = failure_reason
44
+ self.function_outputs = function_outputs
45
+ self.uploaded_function_outputs_blob = uploaded_function_outputs_blob
52
46
  self.invocation_error_output = invocation_error_output
47
+ self.uploaded_invocation_error_blob = uploaded_invocation_error_blob
48
+ self.next_functions = next_functions
53
49
  self.metrics = metrics
54
50
  self.execution_start_time = execution_start_time
55
51
  self.execution_end_time = execution_end_time
56
- self.uploaded_data_payloads: List[DataPayload] = []
57
- self.uploaded_stdout: Optional[DataPayload] = None
58
- self.uploaded_stderr: Optional[DataPayload] = None
59
- self.uploaded_invocation_error_output: Optional[DataPayload] = None
60
52
 
61
53
  @classmethod
62
54
  def internal_error(
@@ -66,12 +58,10 @@ class TaskOutput:
66
58
  execution_end_time: Optional[float],
67
59
  ) -> "TaskOutput":
68
60
  """Creates a TaskOutput for an internal error."""
69
- # We are not sharing internal error messages with the customer.
70
61
  return TaskOutput(
71
62
  allocation=allocation,
72
63
  outcome_code=TaskOutcomeCode.TASK_OUTCOME_CODE_FAILURE,
73
64
  failure_reason=TaskFailureReason.TASK_FAILURE_REASON_INTERNAL_ERROR,
74
- stderr="Platform failed to execute the function.",
75
65
  execution_start_time=execution_start_time,
76
66
  execution_end_time=execution_end_time,
77
67
  )
@@ -80,17 +70,14 @@ class TaskOutput:
80
70
  def function_timeout(
81
71
  cls,
82
72
  allocation: TaskAllocation,
83
- timeout_sec: float,
84
73
  execution_start_time: Optional[float],
85
74
  execution_end_time: Optional[float],
86
75
  ) -> "TaskOutput":
87
- """Creates a TaskOutput for an function timeout error."""
88
- # Task stdout, stderr is not available.
76
+ """Creates a TaskOutput for a function timeout error."""
89
77
  return TaskOutput(
90
78
  allocation=allocation,
91
79
  outcome_code=TaskOutcomeCode.TASK_OUTCOME_CODE_FAILURE,
92
80
  failure_reason=TaskFailureReason.TASK_FAILURE_REASON_FUNCTION_TIMEOUT,
93
- stderr=f"Function exceeded its configured timeout of {timeout_sec:.3f} sec.",
94
81
  execution_start_time=execution_start_time,
95
82
  execution_end_time=execution_end_time,
96
83
  )
@@ -102,11 +89,13 @@ class TaskOutput:
102
89
  execution_start_time: Optional[float],
103
90
  execution_end_time: Optional[float],
104
91
  ) -> "TaskOutput":
105
- """Creates a TaskOutput for an unresponsive FE."""
106
- # Task stdout, stderr is not available.
92
+ """Creates a TaskOutput for an unresponsive FE aka grey failure."""
93
+ # When FE is unresponsive we don't know exact cause of the failure.
107
94
  return TaskOutput(
108
95
  allocation=allocation,
109
96
  outcome_code=TaskOutcomeCode.TASK_OUTCOME_CODE_FAILURE,
97
+ # Treat the grey failure as a function error and thus charge the customer.
98
+ # This is to prevent service abuse by intentionally misbehaving functions.
110
99
  failure_reason=TaskFailureReason.TASK_FAILURE_REASON_FUNCTION_ERROR,
111
100
  execution_start_time=execution_start_time,
112
101
  execution_end_time=execution_end_time,
@@ -144,21 +133,17 @@ class TaskOutput:
144
133
  def function_executor_startup_failed(
145
134
  cls,
146
135
  allocation: TaskAllocation,
147
- fe_startup_output: FunctionExecutorStartupOutput,
136
+ fe_termination_reason: FunctionExecutorTerminationReason,
148
137
  logger: Any,
149
138
  ) -> "TaskOutput":
150
139
  """Creates a TaskOutput for the case when we fail a task that didn't run because its FE startup failed."""
151
- output = TaskOutput(
140
+ return TaskOutput(
152
141
  allocation=allocation,
153
142
  outcome_code=TaskOutcomeCode.TASK_OUTCOME_CODE_FAILURE,
154
143
  failure_reason=_fe_startup_failure_reason_to_task_failure_reason(
155
- fe_startup_output.termination_reason, logger
144
+ fe_termination_reason, logger
156
145
  ),
157
146
  )
158
- # Use FE startup stdout, stderr for allocations that we failed because FE startup failed.
159
- output.uploaded_stdout = fe_startup_output.stdout
160
- output.uploaded_stderr = fe_startup_output.stderr
161
- return output
162
147
 
163
148
 
164
149
  def _fe_startup_failure_reason_to_task_failure_reason(
@@ -180,6 +165,12 @@ def _fe_startup_failure_reason_to_task_failure_reason(
180
165
  == FunctionExecutorTerminationReason.FUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_INTERNAL_ERROR
181
166
  ):
182
167
  return TaskFailureReason.TASK_FAILURE_REASON_INTERNAL_ERROR
168
+ elif (
169
+ fe_termination_reason
170
+ == FunctionExecutorTerminationReason.FUNCTION_EXECUTOR_TERMINATION_REASON_FUNCTION_CANCELLED
171
+ ):
172
+ # This fe termination reason is used when FE gets deleted by Server from desired state while it's starting up.
173
+ return TaskFailureReason.TASK_FAILURE_REASON_FUNCTION_EXECUTOR_TERMINATED
183
174
  else:
184
175
  logger.error(
185
176
  "unexpected function executor startup failure reason",
@@ -187,4 +178,4 @@ def _fe_startup_failure_reason_to_task_failure_reason(
187
178
  fe_termination_reason
188
179
  ),
189
180
  )
190
- return TaskFailureReason.TASK_FAILURE_REASON_UNKNOWN
181
+ return TaskFailureReason.TASK_FAILURE_REASON_INTERNAL_ERROR
@@ -29,7 +29,12 @@ async def terminate_function_executor(
29
29
  logger.info(
30
30
  "destroying function executor",
31
31
  )
32
- await function_executor.destroy()
32
+ try:
33
+ # This await is a cancellation point, need to shield to ensure we destroyed the FE.
34
+ await asyncio.shield(function_executor.destroy())
35
+ except asyncio.CancelledError:
36
+ # We actually destroyed the FE so we can return without error.
37
+ pass
33
38
 
34
39
  return FunctionExecutorTerminated(
35
40
  is_success=True,
@@ -0,0 +1,69 @@
1
+ # Executor logging configuration.
2
+ import logging
3
+ import sys
4
+ import traceback
5
+ from typing import TextIO
6
+
7
+ import structlog
8
+
9
+
10
+ def configure_logging_early():
11
+ """Configures standard Python logging module.
12
+ By default 3rd party modules that are using standard Python logging module
13
+ (logging.getLogger()) have their log lines dropped unless the module gets configured.
14
+ Not dropping log lines from 3rd party modules is useful for debugging. E.g. this helps
15
+ debugging errors in grpc servers if exceptions happen inside grpc module code.
16
+ """
17
+ logging.basicConfig(
18
+ level=logging.WARNING,
19
+ # This log message format is a bit similar to the default structlog format.
20
+ format="%(asctime)s [%(levelname)s] %(message)s logger=%(name)s",
21
+ datefmt="%Y-%m-%d %H:%M:%S",
22
+ handlers=[logging.StreamHandler(sys.stdout)],
23
+ )
24
+
25
+
26
+ def configure_development_mode_logging(compact_tracebacks=True):
27
+ processors = [
28
+ structlog.contextvars.merge_contextvars,
29
+ structlog.processors.add_log_level,
30
+ structlog.dev.set_exc_info,
31
+ structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M:%S", utc=False),
32
+ structlog.dev.ConsoleRenderer(
33
+ exception_formatter=(
34
+ _compact_traceback_formatter
35
+ if compact_tracebacks
36
+ else structlog.dev.rich_traceback
37
+ ),
38
+ ),
39
+ ]
40
+ structlog.configure(
41
+ processors=processors,
42
+ )
43
+
44
+
45
+ def configure_production_mode_logging():
46
+ processors = [
47
+ structlog.contextvars.merge_contextvars,
48
+ structlog.processors.add_log_level,
49
+ structlog.dev.set_exc_info,
50
+ structlog.processors.format_exc_info,
51
+ structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M:%S", utc=False),
52
+ structlog.processors.JSONRenderer(),
53
+ ]
54
+ structlog.configure(processors=processors)
55
+
56
+
57
+ def _compact_traceback_formatter(
58
+ sio: TextIO, exc_info: structlog.typing.ExcInfo
59
+ ) -> None:
60
+ print(
61
+ "\n (only the frame where the exception was raised is printed by default)",
62
+ file=sio,
63
+ )
64
+ traceback.print_exception(
65
+ *exc_info,
66
+ file=sio,
67
+ limit=-1, # Print only 1 frame where the exception was raised
68
+ chain=False,
69
+ )
@@ -243,3 +243,25 @@ def _hours_to_sec(hours: int) -> float:
243
243
 
244
244
  def _days_to_sec(days: int) -> float:
245
245
  return _hours_to_sec(days * 24)
246
+
247
+
248
+ class IdempotentCounterChanger:
249
+ """A wrapper that ensures that inc/dec operations on a counter are done only once.
250
+
251
+ This is useful for tracking the number of in-progress operations or objects that exist.
252
+ """
253
+
254
+ def __init__(self, counter: prometheus_client.Counter) -> None:
255
+ self._counter: prometheus_client.Counter = counter
256
+ self.is_incremented: bool = False
257
+ self.is_decremented: bool = False
258
+
259
+ def inc(self) -> None:
260
+ if not self.is_incremented:
261
+ self._counter.inc()
262
+ self.is_incremented = True
263
+
264
+ def dec(self) -> None:
265
+ if self.is_incremented and not self.is_decremented:
266
+ self._counter.dec()
267
+ self.is_decremented = True
@@ -16,12 +16,15 @@ enum DataPayloadEncoding {
16
16
  message DataPayload {
17
17
  optional uint64 size = 2;
18
18
  optional string sha256_hash = 3;
19
- // URI of the data.
19
+ // URI of the BLOB where the data is stored.
20
20
  // S3 URI if the data is stored in S3.
21
21
  // Starts with "file://"" prefix if the data is stored on a local file system.
22
22
  optional string uri = 4;
23
23
  optional DataPayloadEncoding encoding = 5;
24
+ // Not set and ignored by Server right now.
24
25
  optional uint64 encoding_version = 6;
26
+ // Offset inside the BLOB.
27
+ optional uint64 offset = 7;
25
28
  }
26
29
 
27
30
  // ===== report_executor_state RPC =====
@@ -118,6 +121,7 @@ message FunctionExecutorDescription {
118
121
  // URI prefix for the startup output payloads.
119
122
  // S3 URI if the data is stored in S3.
120
123
  // Starts with "file://"" prefix followed by an absolute directory path if the data is stored on a local file system.
124
+ // Deprecated: most probably going to be removed once external FE logs ingestion pipeline gets implemented.
121
125
  optional string output_payload_uri_prefix = 12;
122
126
  }
123
127
 
@@ -128,6 +132,7 @@ message FunctionExecutorState {
128
132
  repeated string allocation_ids_caused_termination = 4;
129
133
  }
130
134
 
135
+ // Deprecated: most probably going to be removed once external FE logs ingestion pipeline gets implemented.
131
136
  message FunctionExecutorUpdate {
132
137
  optional FunctionExecutorDescription description = 1;
133
138
  optional DataPayload startup_stdout = 2;
@@ -207,6 +212,8 @@ message Task {
207
212
  // Starts with "file://"" prefix followed by an absolute directory path if the data is stored on a local file system.
208
213
  optional string output_payload_uri_prefix = 13;
209
214
  optional TaskRetryPolicy retry_policy = 14;
215
+ // BLOB URI prefix for the invocation error payloads.
216
+ optional string invocation_error_payload_uri_prefix = 15;
210
217
  }
211
218
 
212
219
  message TaskAllocation {
@@ -240,9 +247,10 @@ enum TaskOutcomeCode {
240
247
  enum TaskFailureReason {
241
248
  TASK_FAILURE_REASON_UNKNOWN = 0;
242
249
  // Internal error on Executor aka platform error.
243
- // Includes grey failures when we can't determine the exact cause.
244
250
  TASK_FAILURE_REASON_INTERNAL_ERROR = 1;
245
251
  // Clear function code failure typically by raising an exception from the function code.
252
+ // Also a grey failure where we can't determine the exact cause. We attribute these to
253
+ // functions to prevent service abuse but not billed intenionally failing functions.
246
254
  TASK_FAILURE_REASON_FUNCTION_ERROR = 2;
247
255
  // Function code run time exceeded its configured timeout.
248
256
  TASK_FAILURE_REASON_FUNCTION_TIMEOUT = 3;
@@ -268,11 +276,11 @@ message TaskResult {
268
276
  repeated string next_functions = 11;
269
277
  repeated DataPayload function_outputs = 12;
270
278
  // Standard output and error streams of the function.
279
+ // Deprecated: most probably going to be removed once external FE logs ingestion pipeline gets implemented.
271
280
  optional DataPayload stdout = 13;
272
281
  optional DataPayload stderr = 14;
273
282
  // User payload for invocation error if task failed with invocation error.
274
283
  optional DataPayload invocation_error_output = 15;
275
-
276
284
  optional uint64 execution_duration_ms = 16;
277
285
  }
278
286
 
@@ -19,7 +19,7 @@ _sym_db = _symbol_database.Default()
19
19
 
20
20
 
21
21
  DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(
22
- b'\n!indexify/proto/executor_api.proto\x12\x0f\x65xecutor_api_pb"\xeb\x01\n\x0b\x44\x61taPayload\x12\x11\n\x04size\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x18\n\x0bsha256_hash\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x10\n\x03uri\x18\x04 \x01(\tH\x02\x88\x01\x01\x12;\n\x08\x65ncoding\x18\x05 \x01(\x0e\x32$.executor_api_pb.DataPayloadEncodingH\x03\x88\x01\x01\x12\x1d\n\x10\x65ncoding_version\x18\x06 \x01(\x04H\x04\x88\x01\x01\x42\x07\n\x05_sizeB\x0e\n\x0c_sha256_hashB\x06\n\x04_uriB\x0b\n\t_encodingB\x13\n\x11_encoding_version"e\n\x0cGPUResources\x12\x12\n\x05\x63ount\x18\x01 \x01(\rH\x00\x88\x01\x01\x12-\n\x05model\x18\x02 \x01(\x0e\x32\x19.executor_api_pb.GPUModelH\x01\x88\x01\x01\x42\x08\n\x06_countB\x08\n\x06_model"\xc2\x01\n\rHostResources\x12\x16\n\tcpu_count\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmemory_bytes\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x17\n\ndisk_bytes\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12/\n\x03gpu\x18\x04 \x01(\x0b\x32\x1d.executor_api_pb.GPUResourcesH\x03\x88\x01\x01\x42\x0c\n\n_cpu_countB\x0f\n\r_memory_bytesB\r\n\x0b_disk_bytesB\x06\n\x04_gpu"\xbb\x01\n\x0f\x41llowedFunction\x12\x16\n\tnamespace\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\ngraph_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_function_nameB\x10\n\x0e_graph_version"\xd8\x01\n\x19\x46unctionExecutorResources\x12\x1b\n\x0e\x63pu_ms_per_sec\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmemory_bytes\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x17\n\ndisk_bytes\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12/\n\x03gpu\x18\x04 \x01(\x0b\x32\x1d.executor_api_pb.GPUResourcesH\x03\x88\x01\x01\x42\x11\n\x0f_cpu_ms_per_secB\x0f\n\r_memory_bytesB\r\n\x0b_disk_bytesB\x06\n\x04_gpu"\xb3\x04\n\x1b\x46unctionExecutorDescription\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tnamespace\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\ngraph_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x16\n\timage_uri\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\x14\n\x0csecret_names\x18\x07 \x03(\t\x12%\n\x18\x63ustomer_code_timeout_ms\x18\t \x01(\rH\x06\x88\x01\x01\x12\x30\n\x05graph\x18\n \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x07\x88\x01\x01\x12\x42\n\tresources\x18\x0b \x01(\x0b\x32*.executor_api_pb.FunctionExecutorResourcesH\x08\x88\x01\x01\x12&\n\x19output_payload_uri_prefix\x18\x0c \x01(\tH\t\x88\x01\x01\x42\x05\n\x03_idB\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_graph_versionB\x10\n\x0e_function_nameB\x0c\n\n_image_uriB\x1b\n\x19_customer_code_timeout_msB\x08\n\x06_graphB\x0c\n\n_resourcesB\x1c\n\x1a_output_payload_uri_prefix"\xcf\x02\n\x15\x46unctionExecutorState\x12\x46\n\x0b\x64\x65scription\x18\x01 \x01(\x0b\x32,.executor_api_pb.FunctionExecutorDescriptionH\x00\x88\x01\x01\x12<\n\x06status\x18\x02 \x01(\x0e\x32\'.executor_api_pb.FunctionExecutorStatusH\x01\x88\x01\x01\x12S\n\x12termination_reason\x18\x03 \x01(\x0e\x32\x32.executor_api_pb.FunctionExecutorTerminationReasonH\x02\x88\x01\x01\x12)\n!allocation_ids_caused_termination\x18\x04 \x03(\tB\x0e\n\x0c_descriptionB\t\n\x07_statusB\x15\n\x13_termination_reason"\x8c\x02\n\x16\x46unctionExecutorUpdate\x12\x46\n\x0b\x64\x65scription\x18\x01 \x01(\x0b\x32,.executor_api_pb.FunctionExecutorDescriptionH\x00\x88\x01\x01\x12\x39\n\x0estartup_stdout\x18\x02 \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x01\x88\x01\x01\x12\x39\n\x0estartup_stderr\x18\x03 \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x02\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x11\n\x0f_startup_stdoutB\x11\n\x0f_startup_stderr"\xce\x05\n\rExecutorState\x12\x18\n\x0b\x65xecutor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08hostname\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x07version\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x34\n\x06status\x18\x06 \x01(\x0e\x32\x1f.executor_api_pb.ExecutorStatusH\x03\x88\x01\x01\x12<\n\x0ftotal_resources\x18\r \x01(\x0b\x32\x1e.executor_api_pb.HostResourcesH\x04\x88\x01\x01\x12N\n!total_function_executor_resources\x18\x07 \x01(\x0b\x32\x1e.executor_api_pb.HostResourcesH\x05\x88\x01\x01\x12;\n\x11\x61llowed_functions\x18\x08 \x03(\x0b\x32 .executor_api_pb.AllowedFunction\x12H\n\x18\x66unction_executor_states\x18\t \x03(\x0b\x32&.executor_api_pb.FunctionExecutorState\x12:\n\x06labels\x18\n \x03(\x0b\x32*.executor_api_pb.ExecutorState.LabelsEntry\x12\x17\n\nstate_hash\x18\x0b \x01(\tH\x06\x88\x01\x01\x12\x19\n\x0cserver_clock\x18\x0c \x01(\x04H\x07\x88\x01\x01\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x0e\n\x0c_executor_idB\x0b\n\t_hostnameB\n\n\x08_versionB\t\n\x07_statusB\x12\n\x10_total_resourcesB$\n"_total_function_executor_resourcesB\r\n\x0b_state_hashB\x0f\n\r_server_clock"\xb9\x01\n\x0e\x45xecutorUpdate\x12\x18\n\x0b\x65xecutor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x31\n\x0ctask_results\x18\x02 \x03(\x0b\x32\x1b.executor_api_pb.TaskResult\x12J\n\x19\x66unction_executor_updates\x18\x03 \x03(\x0b\x32\'.executor_api_pb.FunctionExecutorUpdateB\x0e\n\x0c_executor_id"\xbf\x01\n\x1aReportExecutorStateRequest\x12;\n\x0e\x65xecutor_state\x18\x01 \x01(\x0b\x32\x1e.executor_api_pb.ExecutorStateH\x00\x88\x01\x01\x12=\n\x0f\x65xecutor_update\x18\x02 \x01(\x0b\x32\x1f.executor_api_pb.ExecutorUpdateH\x01\x88\x01\x01\x42\x11\n\x0f_executor_stateB\x12\n\x10_executor_update"\x1d\n\x1bReportExecutorStateResponse"\xcf\x01\n\x0fTaskRetryPolicy\x12\x18\n\x0bmax_retries\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1d\n\x10initial_delay_ms\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x19\n\x0cmax_delay_ms\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x1d\n\x10\x64\x65lay_multiplier\x18\x04 \x01(\rH\x03\x88\x01\x01\x42\x0e\n\x0c_max_retriesB\x13\n\x11_initial_delay_msB\x0f\n\r_max_delay_msB\x13\n\x11_delay_multiplier"\xc6\x04\n\x04Task\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tnamespace\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\ngraph_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x05 \x01(\tH\x04\x88\x01\x01\x12 \n\x13graph_invocation_id\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\x17\n\ntimeout_ms\x18\n \x01(\rH\x06\x88\x01\x01\x12\x30\n\x05input\x18\x0b \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x07\x88\x01\x01\x12\x38\n\rreducer_input\x18\x0c \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x08\x88\x01\x01\x12&\n\x19output_payload_uri_prefix\x18\r \x01(\tH\t\x88\x01\x01\x12;\n\x0cretry_policy\x18\x0e \x01(\x0b\x32 .executor_api_pb.TaskRetryPolicyH\n\x88\x01\x01\x42\x05\n\x03_idB\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_graph_versionB\x10\n\x0e_function_nameB\x16\n\x14_graph_invocation_idB\r\n\x0b_timeout_msB\x08\n\x06_inputB\x10\n\x0e_reducer_inputB\x1c\n\x1a_output_payload_uri_prefixB\x0f\n\r_retry_policy"\xad\x01\n\x0eTaskAllocation\x12!\n\x14\x66unction_executor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12(\n\x04task\x18\x02 \x01(\x0b\x32\x15.executor_api_pb.TaskH\x01\x88\x01\x01\x12\x1a\n\rallocation_id\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x17\n\x15_function_executor_idB\x07\n\x05_taskB\x10\n\x0e_allocation_id"K\n\x1fGetDesiredExecutorStatesRequest\x12\x18\n\x0b\x65xecutor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_executor_id"\xb9\x01\n\x14\x44\x65siredExecutorState\x12H\n\x12\x66unction_executors\x18\x01 \x03(\x0b\x32,.executor_api_pb.FunctionExecutorDescription\x12\x39\n\x10task_allocations\x18\x02 \x03(\x0b\x32\x1f.executor_api_pb.TaskAllocation\x12\x12\n\x05\x63lock\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x08\n\x06_clock"\xcc\x06\n\nTaskResult\x12\x14\n\x07task_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rallocation_id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x16\n\tnamespace\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x17\n\ngraph_name\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x06 \x01(\tH\x05\x88\x01\x01\x12 \n\x13graph_invocation_id\x18\x07 \x01(\tH\x06\x88\x01\x01\x12;\n\x0coutcome_code\x18\t \x01(\x0e\x32 .executor_api_pb.TaskOutcomeCodeH\x07\x88\x01\x01\x12?\n\x0e\x66\x61ilure_reason\x18\n \x01(\x0e\x32".executor_api_pb.TaskFailureReasonH\x08\x88\x01\x01\x12\x16\n\x0enext_functions\x18\x0b \x03(\t\x12\x36\n\x10\x66unction_outputs\x18\x0c \x03(\x0b\x32\x1c.executor_api_pb.DataPayload\x12\x31\n\x06stdout\x18\r \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\t\x88\x01\x01\x12\x31\n\x06stderr\x18\x0e \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\n\x88\x01\x01\x12\x42\n\x17invocation_error_output\x18\x0f \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x0b\x88\x01\x01\x12"\n\x15\x65xecution_duration_ms\x18\x10 \x01(\x04H\x0c\x88\x01\x01\x42\n\n\x08_task_idB\x10\n\x0e_allocation_idB\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_graph_versionB\x10\n\x0e_function_nameB\x16\n\x14_graph_invocation_idB\x0f\n\r_outcome_codeB\x11\n\x0f_failure_reasonB\t\n\x07_stdoutB\t\n\x07_stderrB\x1a\n\x18_invocation_error_outputB\x18\n\x16_execution_duration_ms*\xd1\x01\n\x13\x44\x61taPayloadEncoding\x12!\n\x1d\x44\x41TA_PAYLOAD_ENCODING_UNKNOWN\x10\x00\x12#\n\x1f\x44\x41TA_PAYLOAD_ENCODING_UTF8_JSON\x10\x01\x12#\n\x1f\x44\x41TA_PAYLOAD_ENCODING_UTF8_TEXT\x10\x02\x12\'\n#DATA_PAYLOAD_ENCODING_BINARY_PICKLE\x10\x03\x12$\n DATA_PAYLOAD_ENCODING_BINARY_ZIP\x10\x04*\xd6\x01\n\x08GPUModel\x12\x15\n\x11GPU_MODEL_UNKNOWN\x10\x00\x12\x1e\n\x1aGPU_MODEL_NVIDIA_A100_40GB\x10\x01\x12\x1e\n\x1aGPU_MODEL_NVIDIA_A100_80GB\x10\x02\x12\x1e\n\x1aGPU_MODEL_NVIDIA_H100_80GB\x10\x03\x12\x1d\n\x19GPU_MODEL_NVIDIA_TESLA_T4\x10\x04\x12\x1a\n\x16GPU_MODEL_NVIDIA_A6000\x10\x05\x12\x18\n\x14GPU_MODEL_NVIDIA_A10\x10\x06*\xb3\x01\n\x16\x46unctionExecutorStatus\x12$\n FUNCTION_EXECUTOR_STATUS_UNKNOWN\x10\x00\x12$\n FUNCTION_EXECUTOR_STATUS_PENDING\x10\x01\x12$\n FUNCTION_EXECUTOR_STATUS_RUNNING\x10\x02\x12\'\n#FUNCTION_EXECUTOR_STATUS_TERMINATED\x10\x03*\x94\x04\n!FunctionExecutorTerminationReason\x12\x30\n,FUNCTION_EXECUTOR_TERMINATION_REASON_UNKNOWN\x10\x00\x12\x46\nBFUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_INTERNAL_ERROR\x10\x01\x12\x46\nBFUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_FUNCTION_ERROR\x10\x02\x12H\nDFUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_FUNCTION_TIMEOUT\x10\x03\x12\x32\n.FUNCTION_EXECUTOR_TERMINATION_REASON_UNHEALTHY\x10\x0c\x12\x37\n3FUNCTION_EXECUTOR_TERMINATION_REASON_INTERNAL_ERROR\x10\r\x12\x39\n5FUNCTION_EXECUTOR_TERMINATION_REASON_FUNCTION_TIMEOUT\x10\x0e\x12;\n7FUNCTION_EXECUTOR_TERMINATION_REASON_FUNCTION_CANCELLED\x10\x0f*\xa5\x01\n\x0e\x45xecutorStatus\x12\x1b\n\x17\x45XECUTOR_STATUS_UNKNOWN\x10\x00\x12\x1f\n\x1b\x45XECUTOR_STATUS_STARTING_UP\x10\x01\x12\x1b\n\x17\x45XECUTOR_STATUS_RUNNING\x10\x02\x12\x1b\n\x17\x45XECUTOR_STATUS_DRAINED\x10\x03\x12\x1b\n\x17\x45XECUTOR_STATUS_STOPPED\x10\x04*n\n\x0fTaskOutcomeCode\x12\x1d\n\x19TASK_OUTCOME_CODE_UNKNOWN\x10\x00\x12\x1d\n\x19TASK_OUTCOME_CODE_SUCCESS\x10\x01\x12\x1d\n\x19TASK_OUTCOME_CODE_FAILURE\x10\x02*\xb6\x02\n\x11TaskFailureReason\x12\x1f\n\x1bTASK_FAILURE_REASON_UNKNOWN\x10\x00\x12&\n"TASK_FAILURE_REASON_INTERNAL_ERROR\x10\x01\x12&\n"TASK_FAILURE_REASON_FUNCTION_ERROR\x10\x02\x12(\n$TASK_FAILURE_REASON_FUNCTION_TIMEOUT\x10\x03\x12(\n$TASK_FAILURE_REASON_INVOCATION_ERROR\x10\x04\x12&\n"TASK_FAILURE_REASON_TASK_CANCELLED\x10\x05\x12\x34\n0TASK_FAILURE_REASON_FUNCTION_EXECUTOR_TERMINATED\x10\x06\x32\xff\x01\n\x0b\x45xecutorAPI\x12t\n\x15report_executor_state\x12+.executor_api_pb.ReportExecutorStateRequest\x1a,.executor_api_pb.ReportExecutorStateResponse"\x00\x12z\n\x1bget_desired_executor_states\x12\x30.executor_api_pb.GetDesiredExecutorStatesRequest\x1a%.executor_api_pb.DesiredExecutorState"\x00\x30\x01\x62\x06proto3'
22
+ b'\n!indexify/proto/executor_api.proto\x12\x0f\x65xecutor_api_pb"\x8b\x02\n\x0b\x44\x61taPayload\x12\x11\n\x04size\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x18\n\x0bsha256_hash\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x10\n\x03uri\x18\x04 \x01(\tH\x02\x88\x01\x01\x12;\n\x08\x65ncoding\x18\x05 \x01(\x0e\x32$.executor_api_pb.DataPayloadEncodingH\x03\x88\x01\x01\x12\x1d\n\x10\x65ncoding_version\x18\x06 \x01(\x04H\x04\x88\x01\x01\x12\x13\n\x06offset\x18\x07 \x01(\x04H\x05\x88\x01\x01\x42\x07\n\x05_sizeB\x0e\n\x0c_sha256_hashB\x06\n\x04_uriB\x0b\n\t_encodingB\x13\n\x11_encoding_versionB\t\n\x07_offset"e\n\x0cGPUResources\x12\x12\n\x05\x63ount\x18\x01 \x01(\rH\x00\x88\x01\x01\x12-\n\x05model\x18\x02 \x01(\x0e\x32\x19.executor_api_pb.GPUModelH\x01\x88\x01\x01\x42\x08\n\x06_countB\x08\n\x06_model"\xc2\x01\n\rHostResources\x12\x16\n\tcpu_count\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmemory_bytes\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x17\n\ndisk_bytes\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12/\n\x03gpu\x18\x04 \x01(\x0b\x32\x1d.executor_api_pb.GPUResourcesH\x03\x88\x01\x01\x42\x0c\n\n_cpu_countB\x0f\n\r_memory_bytesB\r\n\x0b_disk_bytesB\x06\n\x04_gpu"\xbb\x01\n\x0f\x41llowedFunction\x12\x16\n\tnamespace\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\ngraph_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_function_nameB\x10\n\x0e_graph_version"\xd8\x01\n\x19\x46unctionExecutorResources\x12\x1b\n\x0e\x63pu_ms_per_sec\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmemory_bytes\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x17\n\ndisk_bytes\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12/\n\x03gpu\x18\x04 \x01(\x0b\x32\x1d.executor_api_pb.GPUResourcesH\x03\x88\x01\x01\x42\x11\n\x0f_cpu_ms_per_secB\x0f\n\r_memory_bytesB\r\n\x0b_disk_bytesB\x06\n\x04_gpu"\xb3\x04\n\x1b\x46unctionExecutorDescription\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tnamespace\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\ngraph_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x16\n\timage_uri\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\x14\n\x0csecret_names\x18\x07 \x03(\t\x12%\n\x18\x63ustomer_code_timeout_ms\x18\t \x01(\rH\x06\x88\x01\x01\x12\x30\n\x05graph\x18\n \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x07\x88\x01\x01\x12\x42\n\tresources\x18\x0b \x01(\x0b\x32*.executor_api_pb.FunctionExecutorResourcesH\x08\x88\x01\x01\x12&\n\x19output_payload_uri_prefix\x18\x0c \x01(\tH\t\x88\x01\x01\x42\x05\n\x03_idB\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_graph_versionB\x10\n\x0e_function_nameB\x0c\n\n_image_uriB\x1b\n\x19_customer_code_timeout_msB\x08\n\x06_graphB\x0c\n\n_resourcesB\x1c\n\x1a_output_payload_uri_prefix"\xcf\x02\n\x15\x46unctionExecutorState\x12\x46\n\x0b\x64\x65scription\x18\x01 \x01(\x0b\x32,.executor_api_pb.FunctionExecutorDescriptionH\x00\x88\x01\x01\x12<\n\x06status\x18\x02 \x01(\x0e\x32\'.executor_api_pb.FunctionExecutorStatusH\x01\x88\x01\x01\x12S\n\x12termination_reason\x18\x03 \x01(\x0e\x32\x32.executor_api_pb.FunctionExecutorTerminationReasonH\x02\x88\x01\x01\x12)\n!allocation_ids_caused_termination\x18\x04 \x03(\tB\x0e\n\x0c_descriptionB\t\n\x07_statusB\x15\n\x13_termination_reason"\x8c\x02\n\x16\x46unctionExecutorUpdate\x12\x46\n\x0b\x64\x65scription\x18\x01 \x01(\x0b\x32,.executor_api_pb.FunctionExecutorDescriptionH\x00\x88\x01\x01\x12\x39\n\x0estartup_stdout\x18\x02 \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x01\x88\x01\x01\x12\x39\n\x0estartup_stderr\x18\x03 \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x02\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x11\n\x0f_startup_stdoutB\x11\n\x0f_startup_stderr"\xce\x05\n\rExecutorState\x12\x18\n\x0b\x65xecutor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08hostname\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x07version\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x34\n\x06status\x18\x06 \x01(\x0e\x32\x1f.executor_api_pb.ExecutorStatusH\x03\x88\x01\x01\x12<\n\x0ftotal_resources\x18\r \x01(\x0b\x32\x1e.executor_api_pb.HostResourcesH\x04\x88\x01\x01\x12N\n!total_function_executor_resources\x18\x07 \x01(\x0b\x32\x1e.executor_api_pb.HostResourcesH\x05\x88\x01\x01\x12;\n\x11\x61llowed_functions\x18\x08 \x03(\x0b\x32 .executor_api_pb.AllowedFunction\x12H\n\x18\x66unction_executor_states\x18\t \x03(\x0b\x32&.executor_api_pb.FunctionExecutorState\x12:\n\x06labels\x18\n \x03(\x0b\x32*.executor_api_pb.ExecutorState.LabelsEntry\x12\x17\n\nstate_hash\x18\x0b \x01(\tH\x06\x88\x01\x01\x12\x19\n\x0cserver_clock\x18\x0c \x01(\x04H\x07\x88\x01\x01\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x0e\n\x0c_executor_idB\x0b\n\t_hostnameB\n\n\x08_versionB\t\n\x07_statusB\x12\n\x10_total_resourcesB$\n"_total_function_executor_resourcesB\r\n\x0b_state_hashB\x0f\n\r_server_clock"\xb9\x01\n\x0e\x45xecutorUpdate\x12\x18\n\x0b\x65xecutor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x31\n\x0ctask_results\x18\x02 \x03(\x0b\x32\x1b.executor_api_pb.TaskResult\x12J\n\x19\x66unction_executor_updates\x18\x03 \x03(\x0b\x32\'.executor_api_pb.FunctionExecutorUpdateB\x0e\n\x0c_executor_id"\xbf\x01\n\x1aReportExecutorStateRequest\x12;\n\x0e\x65xecutor_state\x18\x01 \x01(\x0b\x32\x1e.executor_api_pb.ExecutorStateH\x00\x88\x01\x01\x12=\n\x0f\x65xecutor_update\x18\x02 \x01(\x0b\x32\x1f.executor_api_pb.ExecutorUpdateH\x01\x88\x01\x01\x42\x11\n\x0f_executor_stateB\x12\n\x10_executor_update"\x1d\n\x1bReportExecutorStateResponse"\xcf\x01\n\x0fTaskRetryPolicy\x12\x18\n\x0bmax_retries\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1d\n\x10initial_delay_ms\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x19\n\x0cmax_delay_ms\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x1d\n\x10\x64\x65lay_multiplier\x18\x04 \x01(\rH\x03\x88\x01\x01\x42\x0e\n\x0c_max_retriesB\x13\n\x11_initial_delay_msB\x0f\n\r_max_delay_msB\x13\n\x11_delay_multiplier"\xa0\x05\n\x04Task\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tnamespace\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\ngraph_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x05 \x01(\tH\x04\x88\x01\x01\x12 \n\x13graph_invocation_id\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\x17\n\ntimeout_ms\x18\n \x01(\rH\x06\x88\x01\x01\x12\x30\n\x05input\x18\x0b \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x07\x88\x01\x01\x12\x38\n\rreducer_input\x18\x0c \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x08\x88\x01\x01\x12&\n\x19output_payload_uri_prefix\x18\r \x01(\tH\t\x88\x01\x01\x12;\n\x0cretry_policy\x18\x0e \x01(\x0b\x32 .executor_api_pb.TaskRetryPolicyH\n\x88\x01\x01\x12\x30\n#invocation_error_payload_uri_prefix\x18\x0f \x01(\tH\x0b\x88\x01\x01\x42\x05\n\x03_idB\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_graph_versionB\x10\n\x0e_function_nameB\x16\n\x14_graph_invocation_idB\r\n\x0b_timeout_msB\x08\n\x06_inputB\x10\n\x0e_reducer_inputB\x1c\n\x1a_output_payload_uri_prefixB\x0f\n\r_retry_policyB&\n$_invocation_error_payload_uri_prefix"\xad\x01\n\x0eTaskAllocation\x12!\n\x14\x66unction_executor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12(\n\x04task\x18\x02 \x01(\x0b\x32\x15.executor_api_pb.TaskH\x01\x88\x01\x01\x12\x1a\n\rallocation_id\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x17\n\x15_function_executor_idB\x07\n\x05_taskB\x10\n\x0e_allocation_id"K\n\x1fGetDesiredExecutorStatesRequest\x12\x18\n\x0b\x65xecutor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_executor_id"\xb9\x01\n\x14\x44\x65siredExecutorState\x12H\n\x12\x66unction_executors\x18\x01 \x03(\x0b\x32,.executor_api_pb.FunctionExecutorDescription\x12\x39\n\x10task_allocations\x18\x02 \x03(\x0b\x32\x1f.executor_api_pb.TaskAllocation\x12\x12\n\x05\x63lock\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x08\n\x06_clock"\xcc\x06\n\nTaskResult\x12\x14\n\x07task_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rallocation_id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x16\n\tnamespace\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x17\n\ngraph_name\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x06 \x01(\tH\x05\x88\x01\x01\x12 \n\x13graph_invocation_id\x18\x07 \x01(\tH\x06\x88\x01\x01\x12;\n\x0coutcome_code\x18\t \x01(\x0e\x32 .executor_api_pb.TaskOutcomeCodeH\x07\x88\x01\x01\x12?\n\x0e\x66\x61ilure_reason\x18\n \x01(\x0e\x32".executor_api_pb.TaskFailureReasonH\x08\x88\x01\x01\x12\x16\n\x0enext_functions\x18\x0b \x03(\t\x12\x36\n\x10\x66unction_outputs\x18\x0c \x03(\x0b\x32\x1c.executor_api_pb.DataPayload\x12\x31\n\x06stdout\x18\r \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\t\x88\x01\x01\x12\x31\n\x06stderr\x18\x0e \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\n\x88\x01\x01\x12\x42\n\x17invocation_error_output\x18\x0f \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x0b\x88\x01\x01\x12"\n\x15\x65xecution_duration_ms\x18\x10 \x01(\x04H\x0c\x88\x01\x01\x42\n\n\x08_task_idB\x10\n\x0e_allocation_idB\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_graph_versionB\x10\n\x0e_function_nameB\x16\n\x14_graph_invocation_idB\x0f\n\r_outcome_codeB\x11\n\x0f_failure_reasonB\t\n\x07_stdoutB\t\n\x07_stderrB\x1a\n\x18_invocation_error_outputB\x18\n\x16_execution_duration_ms*\xd1\x01\n\x13\x44\x61taPayloadEncoding\x12!\n\x1d\x44\x41TA_PAYLOAD_ENCODING_UNKNOWN\x10\x00\x12#\n\x1f\x44\x41TA_PAYLOAD_ENCODING_UTF8_JSON\x10\x01\x12#\n\x1f\x44\x41TA_PAYLOAD_ENCODING_UTF8_TEXT\x10\x02\x12\'\n#DATA_PAYLOAD_ENCODING_BINARY_PICKLE\x10\x03\x12$\n DATA_PAYLOAD_ENCODING_BINARY_ZIP\x10\x04*\xd6\x01\n\x08GPUModel\x12\x15\n\x11GPU_MODEL_UNKNOWN\x10\x00\x12\x1e\n\x1aGPU_MODEL_NVIDIA_A100_40GB\x10\x01\x12\x1e\n\x1aGPU_MODEL_NVIDIA_A100_80GB\x10\x02\x12\x1e\n\x1aGPU_MODEL_NVIDIA_H100_80GB\x10\x03\x12\x1d\n\x19GPU_MODEL_NVIDIA_TESLA_T4\x10\x04\x12\x1a\n\x16GPU_MODEL_NVIDIA_A6000\x10\x05\x12\x18\n\x14GPU_MODEL_NVIDIA_A10\x10\x06*\xb3\x01\n\x16\x46unctionExecutorStatus\x12$\n FUNCTION_EXECUTOR_STATUS_UNKNOWN\x10\x00\x12$\n FUNCTION_EXECUTOR_STATUS_PENDING\x10\x01\x12$\n FUNCTION_EXECUTOR_STATUS_RUNNING\x10\x02\x12\'\n#FUNCTION_EXECUTOR_STATUS_TERMINATED\x10\x03*\x94\x04\n!FunctionExecutorTerminationReason\x12\x30\n,FUNCTION_EXECUTOR_TERMINATION_REASON_UNKNOWN\x10\x00\x12\x46\nBFUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_INTERNAL_ERROR\x10\x01\x12\x46\nBFUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_FUNCTION_ERROR\x10\x02\x12H\nDFUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_FUNCTION_TIMEOUT\x10\x03\x12\x32\n.FUNCTION_EXECUTOR_TERMINATION_REASON_UNHEALTHY\x10\x0c\x12\x37\n3FUNCTION_EXECUTOR_TERMINATION_REASON_INTERNAL_ERROR\x10\r\x12\x39\n5FUNCTION_EXECUTOR_TERMINATION_REASON_FUNCTION_TIMEOUT\x10\x0e\x12;\n7FUNCTION_EXECUTOR_TERMINATION_REASON_FUNCTION_CANCELLED\x10\x0f*\xa5\x01\n\x0e\x45xecutorStatus\x12\x1b\n\x17\x45XECUTOR_STATUS_UNKNOWN\x10\x00\x12\x1f\n\x1b\x45XECUTOR_STATUS_STARTING_UP\x10\x01\x12\x1b\n\x17\x45XECUTOR_STATUS_RUNNING\x10\x02\x12\x1b\n\x17\x45XECUTOR_STATUS_DRAINED\x10\x03\x12\x1b\n\x17\x45XECUTOR_STATUS_STOPPED\x10\x04*n\n\x0fTaskOutcomeCode\x12\x1d\n\x19TASK_OUTCOME_CODE_UNKNOWN\x10\x00\x12\x1d\n\x19TASK_OUTCOME_CODE_SUCCESS\x10\x01\x12\x1d\n\x19TASK_OUTCOME_CODE_FAILURE\x10\x02*\xb6\x02\n\x11TaskFailureReason\x12\x1f\n\x1bTASK_FAILURE_REASON_UNKNOWN\x10\x00\x12&\n"TASK_FAILURE_REASON_INTERNAL_ERROR\x10\x01\x12&\n"TASK_FAILURE_REASON_FUNCTION_ERROR\x10\x02\x12(\n$TASK_FAILURE_REASON_FUNCTION_TIMEOUT\x10\x03\x12(\n$TASK_FAILURE_REASON_INVOCATION_ERROR\x10\x04\x12&\n"TASK_FAILURE_REASON_TASK_CANCELLED\x10\x05\x12\x34\n0TASK_FAILURE_REASON_FUNCTION_EXECUTOR_TERMINATED\x10\x06\x32\xff\x01\n\x0b\x45xecutorAPI\x12t\n\x15report_executor_state\x12+.executor_api_pb.ReportExecutorStateRequest\x1a,.executor_api_pb.ReportExecutorStateResponse"\x00\x12z\n\x1bget_desired_executor_states\x12\x30.executor_api_pb.GetDesiredExecutorStatesRequest\x1a%.executor_api_pb.DesiredExecutorState"\x00\x30\x01\x62\x06proto3'
23
23
  )
24
24
 
25
25
  _globals = globals()
@@ -31,58 +31,58 @@ if not _descriptor._USE_C_DESCRIPTORS:
31
31
  DESCRIPTOR._loaded_options = None
32
32
  _globals["_EXECUTORSTATE_LABELSENTRY"]._loaded_options = None
33
33
  _globals["_EXECUTORSTATE_LABELSENTRY"]._serialized_options = b"8\001"
34
- _globals["_DATAPAYLOADENCODING"]._serialized_start = 5394
35
- _globals["_DATAPAYLOADENCODING"]._serialized_end = 5603
36
- _globals["_GPUMODEL"]._serialized_start = 5606
37
- _globals["_GPUMODEL"]._serialized_end = 5820
38
- _globals["_FUNCTIONEXECUTORSTATUS"]._serialized_start = 5823
39
- _globals["_FUNCTIONEXECUTORSTATUS"]._serialized_end = 6002
40
- _globals["_FUNCTIONEXECUTORTERMINATIONREASON"]._serialized_start = 6005
41
- _globals["_FUNCTIONEXECUTORTERMINATIONREASON"]._serialized_end = 6537
42
- _globals["_EXECUTORSTATUS"]._serialized_start = 6540
43
- _globals["_EXECUTORSTATUS"]._serialized_end = 6705
44
- _globals["_TASKOUTCOMECODE"]._serialized_start = 6707
45
- _globals["_TASKOUTCOMECODE"]._serialized_end = 6817
46
- _globals["_TASKFAILUREREASON"]._serialized_start = 6820
47
- _globals["_TASKFAILUREREASON"]._serialized_end = 7130
34
+ _globals["_DATAPAYLOADENCODING"]._serialized_start = 5516
35
+ _globals["_DATAPAYLOADENCODING"]._serialized_end = 5725
36
+ _globals["_GPUMODEL"]._serialized_start = 5728
37
+ _globals["_GPUMODEL"]._serialized_end = 5942
38
+ _globals["_FUNCTIONEXECUTORSTATUS"]._serialized_start = 5945
39
+ _globals["_FUNCTIONEXECUTORSTATUS"]._serialized_end = 6124
40
+ _globals["_FUNCTIONEXECUTORTERMINATIONREASON"]._serialized_start = 6127
41
+ _globals["_FUNCTIONEXECUTORTERMINATIONREASON"]._serialized_end = 6659
42
+ _globals["_EXECUTORSTATUS"]._serialized_start = 6662
43
+ _globals["_EXECUTORSTATUS"]._serialized_end = 6827
44
+ _globals["_TASKOUTCOMECODE"]._serialized_start = 6829
45
+ _globals["_TASKOUTCOMECODE"]._serialized_end = 6939
46
+ _globals["_TASKFAILUREREASON"]._serialized_start = 6942
47
+ _globals["_TASKFAILUREREASON"]._serialized_end = 7252
48
48
  _globals["_DATAPAYLOAD"]._serialized_start = 55
49
- _globals["_DATAPAYLOAD"]._serialized_end = 290
50
- _globals["_GPURESOURCES"]._serialized_start = 292
51
- _globals["_GPURESOURCES"]._serialized_end = 393
52
- _globals["_HOSTRESOURCES"]._serialized_start = 396
53
- _globals["_HOSTRESOURCES"]._serialized_end = 590
54
- _globals["_ALLOWEDFUNCTION"]._serialized_start = 593
55
- _globals["_ALLOWEDFUNCTION"]._serialized_end = 780
56
- _globals["_FUNCTIONEXECUTORRESOURCES"]._serialized_start = 783
57
- _globals["_FUNCTIONEXECUTORRESOURCES"]._serialized_end = 999
58
- _globals["_FUNCTIONEXECUTORDESCRIPTION"]._serialized_start = 1002
59
- _globals["_FUNCTIONEXECUTORDESCRIPTION"]._serialized_end = 1565
60
- _globals["_FUNCTIONEXECUTORSTATE"]._serialized_start = 1568
61
- _globals["_FUNCTIONEXECUTORSTATE"]._serialized_end = 1903
62
- _globals["_FUNCTIONEXECUTORUPDATE"]._serialized_start = 1906
63
- _globals["_FUNCTIONEXECUTORUPDATE"]._serialized_end = 2174
64
- _globals["_EXECUTORSTATE"]._serialized_start = 2177
65
- _globals["_EXECUTORSTATE"]._serialized_end = 2895
66
- _globals["_EXECUTORSTATE_LABELSENTRY"]._serialized_start = 2708
67
- _globals["_EXECUTORSTATE_LABELSENTRY"]._serialized_end = 2753
68
- _globals["_EXECUTORUPDATE"]._serialized_start = 2898
69
- _globals["_EXECUTORUPDATE"]._serialized_end = 3083
70
- _globals["_REPORTEXECUTORSTATEREQUEST"]._serialized_start = 3086
71
- _globals["_REPORTEXECUTORSTATEREQUEST"]._serialized_end = 3277
72
- _globals["_REPORTEXECUTORSTATERESPONSE"]._serialized_start = 3279
73
- _globals["_REPORTEXECUTORSTATERESPONSE"]._serialized_end = 3308
74
- _globals["_TASKRETRYPOLICY"]._serialized_start = 3311
75
- _globals["_TASKRETRYPOLICY"]._serialized_end = 3518
76
- _globals["_TASK"]._serialized_start = 3521
77
- _globals["_TASK"]._serialized_end = 4103
78
- _globals["_TASKALLOCATION"]._serialized_start = 4106
79
- _globals["_TASKALLOCATION"]._serialized_end = 4279
80
- _globals["_GETDESIREDEXECUTORSTATESREQUEST"]._serialized_start = 4281
81
- _globals["_GETDESIREDEXECUTORSTATESREQUEST"]._serialized_end = 4356
82
- _globals["_DESIREDEXECUTORSTATE"]._serialized_start = 4359
83
- _globals["_DESIREDEXECUTORSTATE"]._serialized_end = 4544
84
- _globals["_TASKRESULT"]._serialized_start = 4547
85
- _globals["_TASKRESULT"]._serialized_end = 5391
86
- _globals["_EXECUTORAPI"]._serialized_start = 7133
87
- _globals["_EXECUTORAPI"]._serialized_end = 7388
49
+ _globals["_DATAPAYLOAD"]._serialized_end = 322
50
+ _globals["_GPURESOURCES"]._serialized_start = 324
51
+ _globals["_GPURESOURCES"]._serialized_end = 425
52
+ _globals["_HOSTRESOURCES"]._serialized_start = 428
53
+ _globals["_HOSTRESOURCES"]._serialized_end = 622
54
+ _globals["_ALLOWEDFUNCTION"]._serialized_start = 625
55
+ _globals["_ALLOWEDFUNCTION"]._serialized_end = 812
56
+ _globals["_FUNCTIONEXECUTORRESOURCES"]._serialized_start = 815
57
+ _globals["_FUNCTIONEXECUTORRESOURCES"]._serialized_end = 1031
58
+ _globals["_FUNCTIONEXECUTORDESCRIPTION"]._serialized_start = 1034
59
+ _globals["_FUNCTIONEXECUTORDESCRIPTION"]._serialized_end = 1597
60
+ _globals["_FUNCTIONEXECUTORSTATE"]._serialized_start = 1600
61
+ _globals["_FUNCTIONEXECUTORSTATE"]._serialized_end = 1935
62
+ _globals["_FUNCTIONEXECUTORUPDATE"]._serialized_start = 1938
63
+ _globals["_FUNCTIONEXECUTORUPDATE"]._serialized_end = 2206
64
+ _globals["_EXECUTORSTATE"]._serialized_start = 2209
65
+ _globals["_EXECUTORSTATE"]._serialized_end = 2927
66
+ _globals["_EXECUTORSTATE_LABELSENTRY"]._serialized_start = 2740
67
+ _globals["_EXECUTORSTATE_LABELSENTRY"]._serialized_end = 2785
68
+ _globals["_EXECUTORUPDATE"]._serialized_start = 2930
69
+ _globals["_EXECUTORUPDATE"]._serialized_end = 3115
70
+ _globals["_REPORTEXECUTORSTATEREQUEST"]._serialized_start = 3118
71
+ _globals["_REPORTEXECUTORSTATEREQUEST"]._serialized_end = 3309
72
+ _globals["_REPORTEXECUTORSTATERESPONSE"]._serialized_start = 3311
73
+ _globals["_REPORTEXECUTORSTATERESPONSE"]._serialized_end = 3340
74
+ _globals["_TASKRETRYPOLICY"]._serialized_start = 3343
75
+ _globals["_TASKRETRYPOLICY"]._serialized_end = 3550
76
+ _globals["_TASK"]._serialized_start = 3553
77
+ _globals["_TASK"]._serialized_end = 4225
78
+ _globals["_TASKALLOCATION"]._serialized_start = 4228
79
+ _globals["_TASKALLOCATION"]._serialized_end = 4401
80
+ _globals["_GETDESIREDEXECUTORSTATESREQUEST"]._serialized_start = 4403
81
+ _globals["_GETDESIREDEXECUTORSTATESREQUEST"]._serialized_end = 4478
82
+ _globals["_DESIREDEXECUTORSTATE"]._serialized_start = 4481
83
+ _globals["_DESIREDEXECUTORSTATE"]._serialized_end = 4666
84
+ _globals["_TASKRESULT"]._serialized_start = 4669
85
+ _globals["_TASKRESULT"]._serialized_end = 5513
86
+ _globals["_EXECUTORAPI"]._serialized_start = 7255
87
+ _globals["_EXECUTORAPI"]._serialized_end = 7510
88
88
  # @@protoc_insertion_point(module_scope)
@@ -138,17 +138,19 @@ TASK_FAILURE_REASON_TASK_CANCELLED: TaskFailureReason
138
138
  TASK_FAILURE_REASON_FUNCTION_EXECUTOR_TERMINATED: TaskFailureReason
139
139
 
140
140
  class DataPayload(_message.Message):
141
- __slots__ = ("size", "sha256_hash", "uri", "encoding", "encoding_version")
141
+ __slots__ = ("size", "sha256_hash", "uri", "encoding", "encoding_version", "offset")
142
142
  SIZE_FIELD_NUMBER: _ClassVar[int]
143
143
  SHA256_HASH_FIELD_NUMBER: _ClassVar[int]
144
144
  URI_FIELD_NUMBER: _ClassVar[int]
145
145
  ENCODING_FIELD_NUMBER: _ClassVar[int]
146
146
  ENCODING_VERSION_FIELD_NUMBER: _ClassVar[int]
147
+ OFFSET_FIELD_NUMBER: _ClassVar[int]
147
148
  size: int
148
149
  sha256_hash: str
149
150
  uri: str
150
151
  encoding: DataPayloadEncoding
151
152
  encoding_version: int
153
+ offset: int
152
154
  def __init__(
153
155
  self,
154
156
  size: _Optional[int] = ...,
@@ -156,6 +158,7 @@ class DataPayload(_message.Message):
156
158
  uri: _Optional[str] = ...,
157
159
  encoding: _Optional[_Union[DataPayloadEncoding, str]] = ...,
158
160
  encoding_version: _Optional[int] = ...,
161
+ offset: _Optional[int] = ...,
159
162
  ) -> None: ...
160
163
 
161
164
  class GPUResources(_message.Message):
@@ -449,6 +452,7 @@ class Task(_message.Message):
449
452
  "reducer_input",
450
453
  "output_payload_uri_prefix",
451
454
  "retry_policy",
455
+ "invocation_error_payload_uri_prefix",
452
456
  )
453
457
  ID_FIELD_NUMBER: _ClassVar[int]
454
458
  NAMESPACE_FIELD_NUMBER: _ClassVar[int]
@@ -461,6 +465,7 @@ class Task(_message.Message):
461
465
  REDUCER_INPUT_FIELD_NUMBER: _ClassVar[int]
462
466
  OUTPUT_PAYLOAD_URI_PREFIX_FIELD_NUMBER: _ClassVar[int]
463
467
  RETRY_POLICY_FIELD_NUMBER: _ClassVar[int]
468
+ INVOCATION_ERROR_PAYLOAD_URI_PREFIX_FIELD_NUMBER: _ClassVar[int]
464
469
  id: str
465
470
  namespace: str
466
471
  graph_name: str
@@ -472,6 +477,7 @@ class Task(_message.Message):
472
477
  reducer_input: DataPayload
473
478
  output_payload_uri_prefix: str
474
479
  retry_policy: TaskRetryPolicy
480
+ invocation_error_payload_uri_prefix: str
475
481
  def __init__(
476
482
  self,
477
483
  id: _Optional[str] = ...,
@@ -485,6 +491,7 @@ class Task(_message.Message):
485
491
  reducer_input: _Optional[_Union[DataPayload, _Mapping]] = ...,
486
492
  output_payload_uri_prefix: _Optional[str] = ...,
487
493
  retry_policy: _Optional[_Union[TaskRetryPolicy, _Mapping]] = ...,
494
+ invocation_error_payload_uri_prefix: _Optional[str] = ...,
488
495
  ) -> None: ...
489
496
 
490
497
  class TaskAllocation(_message.Message):
@@ -1,20 +1,19 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: indexify
3
- Version: 0.4.22
3
+ Version: 0.4.24
4
4
  Summary: Open Source Indexify components and helper tools
5
5
  Home-page: https://github.com/tensorlakeai/indexify
6
6
  License: Apache 2.0
7
7
  Author: Tensorlake Inc.
8
8
  Author-email: support@tensorlake.ai
9
- Requires-Python: >=3.10,<4.0
9
+ Requires-Python: >=3.11,<4.0
10
10
  Classifier: License :: Other/Proprietary License
11
11
  Classifier: Programming Language :: Python :: 3
12
- Classifier: Programming Language :: Python :: 3.10
13
12
  Classifier: Programming Language :: Python :: 3.11
14
13
  Classifier: Programming Language :: Python :: 3.12
15
14
  Classifier: Programming Language :: Python :: 3.13
16
- Requires-Dist: aiohttp (>=3.12.14,<4.0.0)
17
- Requires-Dist: boto3 (>=1.39.15,<2.0.0)
15
+ Requires-Dist: aiohttp (>=3.12.15,<4.0.0)
16
+ Requires-Dist: boto3 (>=1.40.6,<2.0.0)
18
17
  Requires-Dist: docker (>=7.1.0,<8.0.0)
19
18
  Requires-Dist: httpx[http2] (==0.27.2)
20
19
  Requires-Dist: nanoid (>=2.0.0,<3.0.0)
@@ -22,7 +21,8 @@ Requires-Dist: prometheus-client (>=0.22.1,<0.23.0)
22
21
  Requires-Dist: psutil (>=7.0.0,<8.0.0)
23
22
  Requires-Dist: pydantic (>=2.11,<3.0)
24
23
  Requires-Dist: requests (>=2.32.4,<3.0.0)
25
- Requires-Dist: tensorlake (==0.2.37)
24
+ Requires-Dist: structlog (==25.4.0)
25
+ Requires-Dist: tensorlake (==0.2.39)
26
26
  Requires-Dist: urllib3 (>=2.5.0,<3.0.0)
27
27
  Project-URL: Repository, https://github.com/tensorlakeai/indexify
28
28
  Description-Content-Type: text/markdown