luminarycloud 0.18.1__py3-none-any.whl → 0.19.1__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 (45) hide show
  1. luminarycloud/_client/client.py +21 -5
  2. luminarycloud/_client/http_client.py +168 -0
  3. luminarycloud/_client/rpc_error.py +1 -0
  4. luminarycloud/_client/tracing.py +72 -22
  5. luminarycloud/_helpers/_wait_for_mesh.py +5 -7
  6. luminarycloud/_proto/api/v0/luminarycloud/inference/inference_pb2.py +8 -8
  7. luminarycloud/_proto/api/v0/luminarycloud/inference/inference_pb2.pyi +9 -8
  8. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +83 -25
  9. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +214 -0
  10. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.py +34 -0
  11. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.pyi +12 -0
  12. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.py +60 -60
  13. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.pyi +5 -1
  14. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.py +70 -40
  15. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.pyi +64 -3
  16. luminarycloud/_proto/client/simulation_pb2.py +347 -332
  17. luminarycloud/_proto/client/simulation_pb2.pyi +55 -9
  18. luminarycloud/_proto/inferenceservice/inferenceservice_pb2.py +10 -10
  19. luminarycloud/_proto/inferenceservice/inferenceservice_pb2.pyi +9 -8
  20. luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2.py +29 -0
  21. luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2.pyi +7 -0
  22. luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.py +70 -0
  23. luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.pyi +30 -0
  24. luminarycloud/enum/quantity_type.py +13 -0
  25. luminarycloud/exceptions.py +6 -0
  26. luminarycloud/params/enum/_enum_wrappers.py +28 -2
  27. luminarycloud/params/simulation/material/material_solid_.py +15 -1
  28. luminarycloud/params/simulation/sliding_interfaces_.py +8 -0
  29. luminarycloud/physics_ai/architectures.py +58 -0
  30. luminarycloud/physics_ai/inference.py +30 -25
  31. luminarycloud/physics_ai/training_jobs.py +37 -0
  32. luminarycloud/pipelines/api.py +50 -102
  33. luminarycloud/project.py +15 -43
  34. luminarycloud/simulation.py +2 -0
  35. luminarycloud/simulation_template.py +2 -1
  36. luminarycloud/tables.py +14 -15
  37. luminarycloud/vis/visualization.py +2 -2
  38. {luminarycloud-0.18.1.dist-info → luminarycloud-0.19.1.dist-info}/METADATA +1 -1
  39. {luminarycloud-0.18.1.dist-info → luminarycloud-0.19.1.dist-info}/RECORD +40 -39
  40. luminarycloud/_proto/api/v0/luminarycloud/pipelines/pipelines_pb2.py +0 -246
  41. luminarycloud/_proto/api/v0/luminarycloud/pipelines/pipelines_pb2.pyi +0 -420
  42. luminarycloud/_proto/api/v0/luminarycloud/pipelines/pipelines_pb2_grpc.py +0 -240
  43. luminarycloud/_proto/api/v0/luminarycloud/pipelines/pipelines_pb2_grpc.pyi +0 -90
  44. luminarycloud/enum/pipeline_job_status.py +0 -23
  45. {luminarycloud-0.18.1.dist-info → luminarycloud-0.19.1.dist-info}/WHEEL +0 -0
@@ -7,8 +7,11 @@ from collections.abc import Iterable
7
7
  from typing import Any, Optional, Union
8
8
 
9
9
  import grpc
10
+ import requests
11
+ from .http_client import HttpClient
10
12
 
11
13
  from .._auth import Auth0Client
14
+ from .. import __version__
12
15
  from .._proto.api.v0.luminarycloud.geometry.geometry_pb2_grpc import GeometryServiceStub
13
16
  from .._proto.api.v0.luminarycloud.mesh.mesh_pb2_grpc import MeshServiceStub
14
17
  from .._proto.api.v0.luminarycloud.output_node.output_node_pb2_grpc import OutputNodeServiceStub
@@ -28,7 +31,6 @@ from .._proto.api.v0.luminarycloud.simulation_template.simulation_template_pb2_g
28
31
  from .._proto.api.v0.luminarycloud.named_variable_set.named_variable_set_pb2_grpc import (
29
32
  NamedVariableSetServiceStub,
30
33
  )
31
- from .._proto.api.v0.luminarycloud.pipelines.pipelines_pb2_grpc import PipelineServiceStub
32
34
  from .._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2_grpc import (
33
35
  PhysicsAiServiceStub,
34
36
  )
@@ -47,7 +49,7 @@ from .config import LC_DOMAIN, LC_API_KEY
47
49
  from .logging_interceptor import LoggingInterceptor
48
50
  from .retry_interceptor import RetryInterceptor
49
51
  from .rpc_error import rpc_error
50
- from .tracing import add_instrumentation
52
+ from .tracing import add_http_instrumentation, add_instrumentation
51
53
 
52
54
  logger = logging.getLogger(__name__)
53
55
 
@@ -65,7 +67,6 @@ class Client(
65
67
  OutputDefinitionServiceStub,
66
68
  StoppingConditionServiceStub,
67
69
  NamedVariableSetServiceStub,
68
- PipelineServiceStub,
69
70
  PhysicsAiServiceStub,
70
71
  InferenceServiceStub,
71
72
  OnshapeServiceStub,
@@ -84,6 +85,8 @@ class Client(
84
85
  ----------
85
86
  target : str
86
87
  The URL of the API server.
88
+ http_target : str
89
+ The URL of the HTTP REST server. If not provided, it will default to the `target`.
87
90
  localhost : bool
88
91
  True if the API server is running locally.
89
92
  grpc_channel_options : Optional[Iterable[tuple[str, str]]]
@@ -107,6 +110,7 @@ class Client(
107
110
  def __init__(
108
111
  self,
109
112
  target: str = LC_DOMAIN,
113
+ http_target: str | None = None,
110
114
  localhost: bool = False,
111
115
  grpc_channel_options: Optional[Iterable[tuple[str, Union[str, int]]]] = None,
112
116
  channel_credentials: Optional[grpc.ChannelCredentials] = None,
@@ -133,6 +137,15 @@ class Client(
133
137
  )
134
138
  self._context_tokens: list[Token] = []
135
139
  self.__register_rpcs()
140
+ http_target = http_target or target
141
+ self.http = HttpClient(http_target, api_key, self._auth0_client)
142
+ add_http_instrumentation(
143
+ self.http.session,
144
+ self._apiserver_domain,
145
+ self.primary_domain,
146
+ self._auth0_client,
147
+ api_key,
148
+ )
136
149
 
137
150
  # This cleanup handler is helpful for clean exiting e.g. if the authentication fails
138
151
  def cleanup(self: "Client", *args: Any) -> None:
@@ -209,7 +222,11 @@ class Client(
209
222
  RetryInterceptor(),
210
223
  )
211
224
  return add_instrumentation(
212
- intercepted_channel, self._target, self.primary_domain, self._auth0_client, api_key
225
+ intercepted_channel,
226
+ self._apiserver_domain,
227
+ self.primary_domain,
228
+ self._auth0_client,
229
+ api_key,
213
230
  )
214
231
 
215
232
  def __register_rpcs(self) -> None:
@@ -224,7 +241,6 @@ class Client(
224
241
  OutputNodeServiceStub.__init__(self, self._channel)
225
242
  OutputDefinitionServiceStub.__init__(self, self._channel)
226
243
  StoppingConditionServiceStub.__init__(self, self._channel)
227
- PipelineServiceStub.__init__(self, self._channel)
228
244
  PhysicsAiServiceStub.__init__(self, self._channel)
229
245
  InferenceServiceStub.__init__(self, self._channel)
230
246
  NamedVariableSetServiceStub.__init__(self, self._channel)
@@ -0,0 +1,168 @@
1
+ import logging
2
+ from typing import MutableMapping
3
+ import requests
4
+ from requests.adapters import HTTPAdapter
5
+ from urllib3.util.retry import Retry
6
+
7
+ from .._auth import Auth0Client
8
+ from .. import __version__
9
+
10
+
11
+ MAX_ERROR_BODY_LENGTH = 1000
12
+ REDACTED_HEADERS = ["Authorization", "x-api-key"]
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class HTTPErrorWithBody(requests.HTTPError):
18
+ """Custom HTTPError that includes response body text."""
19
+
20
+ def __init__(self, response: requests.Response, *args, **kwargs):
21
+ body_preview = response.text[:MAX_ERROR_BODY_LENGTH] + (
22
+ "... [truncated]" if len(response.text) > MAX_ERROR_BODY_LENGTH else ""
23
+ )
24
+ message = f"{response.status_code} Error for {response.url}\nBody: {body_preview}"
25
+ super().__init__(message, response=response, *args, **kwargs)
26
+
27
+
28
+ class HttpClient:
29
+ def __init__(
30
+ self,
31
+ base_url: str,
32
+ api_key: str | None = None,
33
+ auth0_client: Auth0Client | None = None,
34
+ *,
35
+ timeout: int = 10,
36
+ retries: int = 3,
37
+ backoff_factor: float = 0.3,
38
+ retriable_status_codes: tuple = (500, 502, 503, 504, 429),
39
+ log_body: bool = True,
40
+ max_body_log_length: int = 500,
41
+ ):
42
+ if not base_url.startswith("http"):
43
+ base_url = f"https://{base_url}"
44
+ self.base_url = base_url.rstrip("/")
45
+ self.session = requests.Session()
46
+ self.session.headers["x-client-version"] = f"python-sdk-v{__version__}"
47
+ if api_key:
48
+ self.session.headers["x-api-key"] = api_key
49
+ self.auth0_client = None
50
+ elif auth0_client:
51
+ self.auth0_client = auth0_client
52
+ else:
53
+ raise ValueError("Either api_key or auth0_client must be provided")
54
+ self.timeout = timeout
55
+ self.log_body = log_body
56
+ self.max_body_log_length = max_body_log_length
57
+
58
+ # Retry config
59
+ retry = Retry(
60
+ total=retries,
61
+ read=retries,
62
+ connect=retries,
63
+ backoff_factor=backoff_factor,
64
+ status_forcelist=retriable_status_codes,
65
+ allowed_methods=frozenset(["HEAD", "GET", "POST", "PUT", "PATCH", "DELETE"]),
66
+ raise_on_status=False,
67
+ )
68
+
69
+ adapter = HTTPAdapter(max_retries=retry)
70
+ self.session.mount("http://", adapter)
71
+ self.session.mount("https://", adapter)
72
+
73
+ def _url(self, path: str) -> str:
74
+ return f"{self.base_url}/{path.lstrip('/')}"
75
+
76
+ def _sanitize_headers(
77
+ self, headers: MutableMapping[str, str | bytes]
78
+ ) -> MutableMapping[str, str | bytes]:
79
+ clean: MutableMapping[str, str | bytes] = {}
80
+ for k, v in headers.items():
81
+ if k in REDACTED_HEADERS:
82
+ clean[k] = "[REDACTED]"
83
+ else:
84
+ clean[k] = v
85
+ return clean
86
+
87
+ def _log_request(self, method: str, url: str, kwargs: dict):
88
+ if not logger.isEnabledFor(logging.DEBUG):
89
+ return
90
+ line = f"REQUEST {method} {url}\nHeaders: {self._sanitize_headers(self.session.headers)}"
91
+ if self.log_body:
92
+ body = kwargs.get("json") or kwargs.get("data")
93
+ body_str = str(body)
94
+ if body_str and len(body_str) > self.max_body_log_length:
95
+ body_str = body_str[: self.max_body_log_length] + "... [truncated]"
96
+ line += f"\nBody: {body_str}"
97
+ logger.debug(line)
98
+
99
+ def _log_response(self, resp: requests.Response):
100
+ if not logger.isEnabledFor(logging.DEBUG):
101
+ return
102
+ line = f"RESPONSE {resp.status_code} {resp.url}\nHeaders: {resp.headers}"
103
+ if self.log_body:
104
+ body_str = resp.text
105
+ if body_str and len(body_str) > self.max_body_log_length:
106
+ body_str = body_str[: self.max_body_log_length] + "... [truncated]"
107
+ line += f"\nBody: {body_str}"
108
+ logger.debug(line)
109
+
110
+ def _authenticate_session(self) -> None:
111
+ if self.auth0_client:
112
+ self.session.headers["Authorization"] = (
113
+ f"Bearer {self.auth0_client.fetch_access_token()}"
114
+ )
115
+
116
+ def _request(self, method: str, path: str, **kwargs) -> requests.Response:
117
+ self._authenticate_session()
118
+ url = self._url(path)
119
+ self._log_request(method, url, kwargs)
120
+ resp = self.session.request(method, url, timeout=self.timeout, **kwargs)
121
+ self._log_response(resp)
122
+ return resp
123
+
124
+ def _json_or_error(self, resp: requests.Response) -> dict:
125
+ if resp.status_code >= 400:
126
+ raise HTTPErrorWithBody(resp)
127
+ return resp.json() if resp.text else {}
128
+
129
+ # ---- Raw methods ----
130
+ def raw_get(self, path: str, **kwargs) -> requests.Response:
131
+ return self._request("GET", path, **kwargs)
132
+
133
+ def raw_post(self, path: str, body: dict | None = None, **kwargs) -> requests.Response:
134
+ return self._request("POST", path, json=body, **kwargs)
135
+
136
+ def raw_put(self, path: str, body: dict | None = None, **kwargs) -> requests.Response:
137
+ return self._request("PUT", path, json=body, **kwargs)
138
+
139
+ def raw_patch(self, path: str, body: dict | None = None, **kwargs) -> requests.Response:
140
+ return self._request("PATCH", path, json=body, **kwargs)
141
+
142
+ def raw_delete(self, path: str, **kwargs) -> requests.Response:
143
+ return self._request("DELETE", path, **kwargs)
144
+
145
+ def raw_head(self, path: str, **kwargs) -> requests.Response:
146
+ return self._request("HEAD", path, **kwargs)
147
+
148
+ # ---- JSON convenience methods ----
149
+ def get(self, path: str, **kwargs) -> dict:
150
+ return self._json_or_error(self.raw_get(path, **kwargs))
151
+
152
+ def post(self, path: str, body: dict | None = None, **kwargs) -> dict:
153
+ return self._json_or_error(self.raw_post(path, body, **kwargs))
154
+
155
+ def put(self, path: str, body: dict | None = None, **kwargs) -> dict:
156
+ return self._json_or_error(self.raw_put(path, body, **kwargs))
157
+
158
+ def patch(self, path: str, body: dict | None = None, **kwargs) -> dict:
159
+ return self._json_or_error(self.raw_patch(path, body, **kwargs))
160
+
161
+ def delete(self, path: str, **kwargs) -> dict:
162
+ return self._json_or_error(self.raw_delete(path, **kwargs))
163
+
164
+ def head(self, path: str, **kwargs) -> dict:
165
+ resp = self.raw_head(path, **kwargs)
166
+ if resp.status_code >= 400:
167
+ raise HTTPErrorWithBody(resp)
168
+ return dict(resp.headers)
@@ -15,6 +15,7 @@ _CODE_TO_EXCEPTION: dict[grpc.StatusCode, type[exceptions.RpcError]] = {
15
15
  grpc.StatusCode.NOT_FOUND: exceptions.NotFoundError,
16
16
  grpc.StatusCode.ALREADY_EXISTS: exceptions.AlreadyExistsError,
17
17
  grpc.StatusCode.FAILED_PRECONDITION: exceptions.FailedPreconditionError,
18
+ grpc.StatusCode.DEADLINE_EXCEEDED: exceptions.DeadlineExceededError,
18
19
  }
19
20
 
20
21
 
@@ -1,6 +1,5 @@
1
1
  # Copyright 2023-2025 Luminary Cloud, Inc. All Rights Reserved.
2
2
  import logging
3
- import re
4
3
  from typing import Optional, Any
5
4
 
6
5
  import requests
@@ -13,6 +12,13 @@ from opentelemetry.sdk.trace.export import (
13
12
  BatchSpanProcessor,
14
13
  SpanExportResult,
15
14
  )
15
+ from opentelemetry.trace.status import Status, StatusCode
16
+ from opentelemetry.propagate import inject
17
+ from opentelemetry.semconv.attributes.http_attributes import (
18
+ HTTP_REQUEST_METHOD,
19
+ HTTP_RESPONSE_STATUS_CODE,
20
+ )
21
+ from opentelemetry.semconv.attributes.url_attributes import URL_FULL
16
22
 
17
23
  from .logging_interceptor import _get_ai_notebook_id
18
24
  from .. import __version__
@@ -109,13 +115,19 @@ def _get_trace_resource() -> Resource:
109
115
  return resource
110
116
 
111
117
 
112
- def _add_instrumentation(
113
- channel: Channel,
114
- endpoint: str,
118
+ def _create_tracer_provider(
119
+ apiserver_domain: str,
120
+ primary_domain: str,
115
121
  auth0_client: Optional[Auth0Client],
116
122
  api_key: Optional[str],
117
- verify_ssl: bool = True,
118
- ) -> Channel:
123
+ ) -> TracerProvider:
124
+ endpoint = _get_collector_endpoint(primary_domain)
125
+
126
+ # skip SSL verification for internal domains
127
+ verify_ssl = ".int." not in apiserver_domain
128
+ if not verify_ssl:
129
+ logger.debug("SSL verification will be skipped when exporting traces.")
130
+
119
131
  provider = TracerProvider(resource=_get_trace_resource())
120
132
  if api_key:
121
133
  processor = BatchSpanProcessor(
@@ -136,10 +148,7 @@ def _add_instrumentation(
136
148
  )
137
149
  )
138
150
  provider.add_span_processor(processor)
139
- return intercept_channel( # type: ignore[no-untyped-call]
140
- channel,
141
- client_interceptor(tracer_provider=provider), # type: ignore[no-untyped-call]
142
- )
151
+ return provider
143
152
 
144
153
 
145
154
  def add_instrumentation(
@@ -165,18 +174,59 @@ def add_instrumentation(
165
174
  logger.debug("Tracing is disabled for this gRPC client.")
166
175
  return channel
167
176
 
168
- endpoint = _get_collector_endpoint(primary_domain)
169
-
170
- # skip SSL verification for internal domains
171
- verify_ssl = ".int." not in apiserver_domain
172
- if not verify_ssl:
173
- logger.debug("SSL verification will be skipped when exporting traces.")
174
-
175
177
  logger.debug("Adding tracing instrumentation to gRPC client.")
176
- return _add_instrumentation(
178
+ provider = _create_tracer_provider(apiserver_domain, primary_domain, auth0_client, api_key)
179
+ return intercept_channel(
177
180
  channel,
178
- endpoint,
179
- auth0_client,
180
- api_key,
181
- verify_ssl,
181
+ client_interceptor(tracer_provider=provider),
182
182
  )
183
+
184
+
185
+ def add_http_instrumentation(
186
+ session: requests.Session,
187
+ apiserver_domain: str,
188
+ primary_domain: Optional[str],
189
+ auth0_client: Optional[Auth0Client],
190
+ api_key: Optional[str] = None,
191
+ ) -> None:
192
+ """Add tracing instrumentation to a requests.Session.
193
+
194
+ Args:
195
+ session: The requests.Session to instrument.
196
+ apiserver_domain: The domain of the API server.
197
+ primary_domain: The primary domain to use for tracing.
198
+ auth0_client: The Auth0 client to use for authentication.
199
+ api_key: Optional API key to use for authentication instead of Auth0.
200
+
201
+ Returns:
202
+ None. The session is modified in place.
203
+ """
204
+ if primary_domain is None or "itar" in primary_domain:
205
+ logger.debug("Tracing is disabled for this HTTP client.")
206
+ return
207
+
208
+ logger.debug("Adding tracing instrumentation to HTTP client.")
209
+ provider = _create_tracer_provider(apiserver_domain, primary_domain, auth0_client, api_key)
210
+ tracer = provider.get_tracer(__name__)
211
+
212
+ original_send = session.send
213
+
214
+ def traced_send(request, **kwargs):
215
+ with tracer.start_as_current_span(f"HTTP {request.method}") as span:
216
+ span.set_attribute(HTTP_REQUEST_METHOD, request.method)
217
+ span.set_attribute(URL_FULL, request.url)
218
+
219
+ inject(request.headers)
220
+
221
+ try:
222
+ response = original_send(request, **kwargs)
223
+ span.set_attribute(HTTP_RESPONSE_STATUS_CODE, response.status_code)
224
+ if response.status_code >= 400:
225
+ span.set_status(Status(StatusCode.ERROR))
226
+ return response
227
+ except Exception as exc:
228
+ span.set_status(Status(StatusCode.ERROR))
229
+ span.record_exception(exc)
230
+ raise
231
+
232
+ session.send = traced_send
@@ -1,7 +1,7 @@
1
1
  # Copyright 2023-2024 Luminary Cloud, Inc. All Rights Reserved.
2
2
  import logging
3
3
  from time import time, sleep
4
- import grpc
4
+ from luminarycloud.exceptions import DeadlineExceededError
5
5
 
6
6
  from .._proto.api.v0.luminarycloud.mesh.mesh_pb2 import Mesh, GetMeshRequest
7
7
  from .._client import Client
@@ -43,12 +43,10 @@ def wait_for_mesh(
43
43
  # in some cases, so we'll add a deadline and catch deadline exceeded errors to retry.
44
44
  try:
45
45
  response = client.GetMesh(GetMeshRequest(id=mesh.id), timeout=15)
46
- except grpc.RpcError as e:
47
- if e.code() == grpc.StatusCode.DEADLINE_EXCEEDED:
48
- logger.error("Deadline exceeded while waiting for mesh.")
49
- sleep(max(0, min(interval_seconds, deadline - time())))
50
- continue
51
- raise e
46
+ except DeadlineExceededError:
47
+ logger.error("Deadline exceeded while waiting for mesh.")
48
+ sleep(max(0, min(interval_seconds, deadline - time())))
49
+ continue
52
50
  status = response.mesh.status
53
51
  if status in [Mesh.MESH_STATUS_COMPLETED, Mesh.MESH_STATUS_FAILED]:
54
52
  return status
@@ -18,7 +18,7 @@ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
18
18
  from luminarycloud._proto.inferenceservice import inferenceservice_pb2 as proto_dot_inferenceservice_dot_inferenceservice__pb2
19
19
 
20
20
 
21
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n4proto/api/v0/luminarycloud/inference/inference.proto\x12-luminary.proto.api.v0.luminarycloud.inference\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a-proto/inferenceservice/inferenceservice.proto\"\xa9\x01\n CreateInferenceServiceJobRequest\x12\x14\n\x0c\x61rtifact_url\x18\x01 \x01(\t\x12\x0f\n\x07stl_url\x18\x02 \x01(\t\x12\x12\n\nparameters\x18\x03 \x01(\x0c\x12\x14\n\x0cstencil_size\x18\x04 \x01(\x05\x12\x12\n\nproject_id\x18\x05 \x01(\t\x12 \n\x18write_visualization_data\x18\x06 \x01(\x08\"\x8e\x01\n!CreateInferenceServiceJobResponse\x12\x45\n\x06status\x18\x01 \x01(\x0e\x32\x35.luminary.proto.api.v0.luminarycloud.inference.Status\x12\x15\n\x08response\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_response*D\n\x06Status\x12\x12\n\x0eSTATUS_PENDING\x10\x00\x12\x12\n\x0eSTATUS_SUCCESS\x10\x01\x12\x12\n\x0eSTATUS_FAILURE\x10\x02\x32\xea\x01\n\x10InferenceService\x12\xd5\x01\n\x19\x43reateInferenceServiceJob\x12O.luminary.proto.api.v0.luminarycloud.inference.CreateInferenceServiceJobRequest\x1aP.luminary.proto.api.v0.luminarycloud.inference.CreateInferenceServiceJobResponse\"\x15\x82\xd3\xe4\x93\x02\x0f\"\r/v0/inferenceB=Z;luminarycloud.com/core/proto/api/v0/luminarycloud/inferenceb\x06proto3')
21
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n4proto/api/v0/luminarycloud/inference/inference.proto\x12-luminary.proto.api.v0.luminarycloud.inference\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a-proto/inferenceservice/inferenceservice.proto\"\xab\x01\n CreateInferenceServiceJobRequest\x12\x14\n\x0c\x61rtifact_url\x18\x01 \x01(\t\x12\x0f\n\x07stl_url\x18\x02 \x01(\t\x12\x10\n\x08settings\x18\x07 \x01(\x0c\x12\x12\n\nconditions\x18\x03 \x01(\x0c\x12\x12\n\nproject_id\x18\x05 \x01(\t\x12 \n\x18write_visualization_data\x18\x06 \x01(\x08J\x04\x08\x04\x10\x05\"\x8e\x01\n!CreateInferenceServiceJobResponse\x12\x45\n\x06status\x18\x01 \x01(\x0e\x32\x35.luminary.proto.api.v0.luminarycloud.inference.Status\x12\x15\n\x08response\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_response*D\n\x06Status\x12\x12\n\x0eSTATUS_PENDING\x10\x00\x12\x12\n\x0eSTATUS_SUCCESS\x10\x01\x12\x12\n\x0eSTATUS_FAILURE\x10\x02\x32\xea\x01\n\x10InferenceService\x12\xd5\x01\n\x19\x43reateInferenceServiceJob\x12O.luminary.proto.api.v0.luminarycloud.inference.CreateInferenceServiceJobRequest\x1aP.luminary.proto.api.v0.luminarycloud.inference.CreateInferenceServiceJobResponse\"\x15\x82\xd3\xe4\x93\x02\x0f\"\r/v0/inferenceB=Z;luminarycloud.com/core/proto/api/v0/luminarycloud/inferenceb\x06proto3')
22
22
 
23
23
  _STATUS = DESCRIPTOR.enum_types_by_name['Status']
24
24
  Status = enum_type_wrapper.EnumTypeWrapper(_STATUS)
@@ -50,12 +50,12 @@ if _descriptor._USE_C_DESCRIPTORS == False:
50
50
  DESCRIPTOR._serialized_options = b'Z;luminarycloud.com/core/proto/api/v0/luminarycloud/inference'
51
51
  _INFERENCESERVICE.methods_by_name['CreateInferenceServiceJob']._options = None
52
52
  _INFERENCESERVICE.methods_by_name['CreateInferenceServiceJob']._serialized_options = b'\202\323\344\223\002\017\"\r/v0/inference'
53
- _STATUS._serialized_start=526
54
- _STATUS._serialized_end=594
53
+ _STATUS._serialized_start=528
54
+ _STATUS._serialized_end=596
55
55
  _CREATEINFERENCESERVICEJOBREQUEST._serialized_start=210
56
- _CREATEINFERENCESERVICEJOBREQUEST._serialized_end=379
57
- _CREATEINFERENCESERVICEJOBRESPONSE._serialized_start=382
58
- _CREATEINFERENCESERVICEJOBRESPONSE._serialized_end=524
59
- _INFERENCESERVICE._serialized_start=597
60
- _INFERENCESERVICE._serialized_end=831
56
+ _CREATEINFERENCESERVICEJOBREQUEST._serialized_end=381
57
+ _CREATEINFERENCESERVICEJOBRESPONSE._serialized_start=384
58
+ _CREATEINFERENCESERVICEJOBRESPONSE._serialized_end=526
59
+ _INFERENCESERVICE._serialized_start=599
60
+ _INFERENCESERVICE._serialized_end=833
61
61
  # @@protoc_insertion_point(module_scope)
@@ -38,16 +38,17 @@ class CreateInferenceServiceJobRequest(google.protobuf.message.Message):
38
38
 
39
39
  ARTIFACT_URL_FIELD_NUMBER: builtins.int
40
40
  STL_URL_FIELD_NUMBER: builtins.int
41
- PARAMETERS_FIELD_NUMBER: builtins.int
42
- STENCIL_SIZE_FIELD_NUMBER: builtins.int
41
+ SETTINGS_FIELD_NUMBER: builtins.int
42
+ CONDITIONS_FIELD_NUMBER: builtins.int
43
43
  PROJECT_ID_FIELD_NUMBER: builtins.int
44
44
  WRITE_VISUALIZATION_DATA_FIELD_NUMBER: builtins.int
45
45
  artifact_url: builtins.str
46
46
  """Eventually should be a model version id"""
47
47
  stl_url: builtins.str
48
- parameters: builtins.bytes
49
- """JSON encoded parameters, like alpha, beta, etc."""
50
- stencil_size: builtins.int
48
+ settings: builtins.bytes
49
+ """JSON encoded settings, like stencil_size."""
50
+ conditions: builtins.bytes
51
+ """JSON encoded conditions, like alpha, beta, etc."""
51
52
  project_id: builtins.str
52
53
  write_visualization_data: builtins.bool
53
54
  def __init__(
@@ -55,12 +56,12 @@ class CreateInferenceServiceJobRequest(google.protobuf.message.Message):
55
56
  *,
56
57
  artifact_url: builtins.str = ...,
57
58
  stl_url: builtins.str = ...,
58
- parameters: builtins.bytes = ...,
59
- stencil_size: builtins.int = ...,
59
+ settings: builtins.bytes = ...,
60
+ conditions: builtins.bytes = ...,
60
61
  project_id: builtins.str = ...,
61
62
  write_visualization_data: builtins.bool = ...,
62
63
  ) -> None: ...
63
- def ClearField(self, field_name: typing_extensions.Literal["artifact_url", b"artifact_url", "parameters", b"parameters", "project_id", b"project_id", "stencil_size", b"stencil_size", "stl_url", b"stl_url", "write_visualization_data", b"write_visualization_data"]) -> None: ...
64
+ def ClearField(self, field_name: typing_extensions.Literal["artifact_url", b"artifact_url", "conditions", b"conditions", "project_id", b"project_id", "settings", b"settings", "stl_url", b"stl_url", "write_visualization_data", b"write_visualization_data"]) -> None: ...
64
65
 
65
66
  global___CreateInferenceServiceJobRequest = CreateInferenceServiceJobRequest
66
67
 
@@ -16,18 +16,30 @@ _sym_db = _symbol_database.Default()
16
16
  from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
17
17
  from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
18
18
  from luminarycloud._proto.api.v0.luminarycloud.common import common_pb2 as proto_dot_api_dot_v0_dot_luminarycloud_dot_common_dot_common__pb2
19
+ from luminarycloud._proto.base import base_pb2 as proto_dot_base_dot_base__pb2
19
20
  from luminarycloud._proto.quantity import quantity_pb2 as proto_dot_quantity_dot_quantity__pb2
20
21
 
21
22
 
22
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n6proto/api/v0/luminarycloud/physics_ai/physics_ai.proto\x12.luminary.proto.api.v0.luminarycloud.physics_ai\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a.proto/api/v0/luminarycloud/common/common.proto\x1a\x1dproto/quantity/quantity.proto\"\xad\x01\n\x1cPhysicsAiArchitectureVersion\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x11\n\tchangelog\x18\x03 \x01(\t\x12`\n\x0flifecycle_state\x18\x04 \x01(\x0e\x32G.luminary.proto.api.v0.luminarycloud.physics_ai.PhysicsAiLifecycleState\"\xa6\x01\n\x15PhysicsAiArchitecture\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12^\n\x08versions\x18\x04 \x03(\x0b\x32L.luminary.proto.api.v0.luminarycloud.physics_ai.PhysicsAiArchitectureVersion\"\x1a\n\x18ListArchitecturesRequest\"y\n\x19ListArchitecturesResponse\x12\\\n\rarchitectures\x18\x01 \x03(\x0b\x32\x45.luminary.proto.api.v0.luminarycloud.physics_ai.PhysicsAiArchitecture\"\x93\x01\n\x15PhysicsAiModelVersion\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12`\n\x0flifecycle_state\x18\x03 \x01(\x0e\x32G.luminary.proto.api.v0.luminarycloud.physics_ai.PhysicsAiLifecycleState\"\x98\x01\n\x0ePhysicsAiModel\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12W\n\x08versions\x18\x04 \x03(\x0b\x32\x45.luminary.proto.api.v0.luminarycloud.physics_ai.PhysicsAiModelVersion\"\x1d\n\x1bListPretrainedModelsRequest\"n\n\x1cListPretrainedModelsResponse\x12N\n\x06models\x18\x01 \x03(\x0b\x32>.luminary.proto.api.v0.luminarycloud.physics_ai.PhysicsAiModel\"\xa3\x02\n\x1fGetSolutionDataPhysicsAIRequest\x12\x13\n\x0bsolution_id\x18\x01 \x01(\t\x12\x18\n\x10\x65xclude_surfaces\x18\x02 \x03(\t\x12\x12\n\nfill_holes\x18\x03 \x01(\x02\x12\x45\n\x16surface_fields_to_keep\x18\x04 \x03(\x0e\x32%.luminary.proto.quantity.QuantityType\x12\x44\n\x15volume_fields_to_keep\x18\x05 \x03(\x0e\x32%.luminary.proto.quantity.QuantityType\x12\x16\n\x0eprocess_volume\x18\x06 \x01(\x08\x12\x18\n\x10single_precision\x18\x07 \x01(\x08\"b\n GetSolutionDataPhysicsAIResponse\x12>\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.common.File*\xb4\x01\n\x17PhysicsAiLifecycleState\x12\x1f\n\x1bLIFECYCLE_STATE_UNSPECIFIED\x10\x00\x12\x1f\n\x1bLIFECYCLE_STATE_DEVELOPMENT\x10\x01\x12\x1a\n\x16LIFECYCLE_STATE_ACTIVE\x10\x02\x12\x1e\n\x1aLIFECYCLE_STATE_DEPRECATED\x10\x03\x12\x1b\n\x17LIFECYCLE_STATE_RETIRED\x10\x04\x32\xb9\x05\n\x10PhysicsAiService\x12\xce\x01\n\x11ListArchitectures\x12H.luminary.proto.api.v0.luminarycloud.physics_ai.ListArchitecturesRequest\x1aI.luminary.proto.api.v0.luminarycloud.physics_ai.ListArchitecturesResponse\"$\x82\xd3\xe4\x93\x02\x1e\x12\x1c/v0/physics_ai/architectures\x12\xdb\x01\n\x14ListPretrainedModels\x12K.luminary.proto.api.v0.luminarycloud.physics_ai.ListPretrainedModelsRequest\x1aL.luminary.proto.api.v0.luminarycloud.physics_ai.ListPretrainedModelsResponse\"(\x82\xd3\xe4\x93\x02\"\x12 /v0/physics_ai/pretrained_models\x12\xf5\x01\n\x18GetSolutionDataPhysicsAI\x12O.luminary.proto.api.v0.luminarycloud.physics_ai.GetSolutionDataPhysicsAIRequest\x1aP.luminary.proto.api.v0.luminarycloud.physics_ai.GetSolutionDataPhysicsAIResponse\"6\x82\xd3\xe4\x93\x02\x30\"+/v0/physics_ai/solutions/{solution_id}/data:\x01*B>Z<luminarycloud.com/core/proto/api/v0/luminarycloud/physics_aib\x06proto3')
23
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n6proto/api/v0/luminarycloud/physics_ai/physics_ai.proto\x12.luminary.proto.api.v0.luminarycloud.physics_ai\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a.proto/api/v0/luminarycloud/common/common.proto\x1a\x15proto/base/base.proto\x1a\x1dproto/quantity/quantity.proto\"\xad\x01\n\x1cPhysicsAiArchitectureVersion\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x11\n\tchangelog\x18\x03 \x01(\t\x12`\n\x0flifecycle_state\x18\x04 \x01(\x0e\x32G.luminary.proto.api.v0.luminarycloud.physics_ai.PhysicsAiLifecycleState\"\xa6\x01\n\x15PhysicsAiArchitecture\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12^\n\x08versions\x18\x04 \x03(\x0b\x32L.luminary.proto.api.v0.luminarycloud.physics_ai.PhysicsAiArchitectureVersion\"\x1a\n\x18ListArchitecturesRequest\"y\n\x19ListArchitecturesResponse\x12\\\n\rarchitectures\x18\x01 \x03(\x0b\x32\x45.luminary.proto.api.v0.luminarycloud.physics_ai.PhysicsAiArchitecture\"\x93\x01\n\x15PhysicsAiModelVersion\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12`\n\x0flifecycle_state\x18\x03 \x01(\x0e\x32G.luminary.proto.api.v0.luminarycloud.physics_ai.PhysicsAiLifecycleState\"\x98\x01\n\x0ePhysicsAiModel\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12W\n\x08versions\x18\x04 \x03(\x0b\x32\x45.luminary.proto.api.v0.luminarycloud.physics_ai.PhysicsAiModelVersion\"\x1d\n\x1bListPretrainedModelsRequest\"n\n\x1cListPretrainedModelsResponse\x12N\n\x06models\x18\x01 \x03(\x0b\x32>.luminary.proto.api.v0.luminarycloud.physics_ai.PhysicsAiModel\"\xa3\x02\n\x1fGetSolutionDataPhysicsAIRequest\x12\x13\n\x0bsolution_id\x18\x01 \x01(\t\x12\x18\n\x10\x65xclude_surfaces\x18\x02 \x03(\t\x12\x12\n\nfill_holes\x18\x03 \x01(\x02\x12\x45\n\x16surface_fields_to_keep\x18\x04 \x03(\x0e\x32%.luminary.proto.quantity.QuantityType\x12\x44\n\x15volume_fields_to_keep\x18\x05 \x03(\x0e\x32%.luminary.proto.quantity.QuantityType\x12\x16\n\x0eprocess_volume\x18\x06 \x01(\x08\x12\x18\n\x10single_precision\x18\x07 \x01(\x08\"b\n GetSolutionDataPhysicsAIResponse\x12>\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.common.File\";\n\x10TrainingSolution\x12\x13\n\x0bsolution_id\x18\x01 \x01(\t\x12\x12\n\ndata_split\x18\x02 \x01(\t\"\x9a\x05\n\x14PhysicsAiTrainingJob\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1f\n\x17\x61rchitecture_version_id\x18\x02 \x01(\t\x12\x0f\n\x07user_id\x18\x03 \x01(\t\x12\x17\n\x0ftraining_config\x18\x04 \x01(\t\x12i\n\x19training_data_source_type\x18\x05 \x01(\x0e\x32\x46.luminary.proto.api.v0.luminarycloud.physics_ai.TrainingDataSourceType\x12\x1c\n\x14training_description\x18\x06 \x01(\t\x12\x1c\n\x14\x65xternal_dataset_uri\x18\x07 \x01(\t\x12\x64\n\x13initialization_type\x18\x08 \x01(\x0e\x32G.luminary.proto.api.v0.luminarycloud.physics_ai.ModelInitializationType\x12\x1d\n\x15\x62\x61se_model_version_id\x18\t \x01(\t\x12.\n\x06status\x18\n \x01(\x0b\x32\x1e.luminary.proto.base.JobStatus\x12\x15\n\rerror_message\x18\x0b \x01(\t\x12\x1f\n\x17output_model_version_id\x18\x0c \x01(\t\x12\x31\n\rcreation_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0bupdate_time\x18\x0e \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0f\x63ompletion_time\x18\x0f \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xf3\x02\n\x18SubmitTrainingJobRequest\x12\x1f\n\x17\x61rchitecture_version_id\x18\x01 \x01(\t\x12\x1c\n\x14training_description\x18\x02 \x01(\t\x12\x1c\n\x14\x65xternal_dataset_uri\x18\x03 \x01(\t\x12\\\n\x12training_solutions\x18\x04 \x03(\x0b\x32@.luminary.proto.api.v0.luminarycloud.physics_ai.TrainingSolution\x12\x17\n\x0ftraining_config\x18\x05 \x01(\t\x12\x64\n\x13initialization_type\x18\x06 \x01(\x0e\x32G.luminary.proto.api.v0.luminarycloud.physics_ai.ModelInitializationType\x12\x1d\n\x15\x62\x61se_model_version_id\x18\x07 \x01(\t\"w\n\x19SubmitTrainingJobResponse\x12Z\n\x0ctraining_job\x18\x01 \x01(\x0b\x32\x44.luminary.proto.api.v0.luminarycloud.physics_ai.PhysicsAiTrainingJob*\xb4\x01\n\x17PhysicsAiLifecycleState\x12\x1f\n\x1bLIFECYCLE_STATE_UNSPECIFIED\x10\x00\x12\x1f\n\x1bLIFECYCLE_STATE_DEVELOPMENT\x10\x01\x12\x1a\n\x16LIFECYCLE_STATE_ACTIVE\x10\x02\x12\x1e\n\x1aLIFECYCLE_STATE_DEPRECATED\x10\x03\x12\x1b\n\x17LIFECYCLE_STATE_RETIRED\x10\x04*\xa7\x01\n\x16TrainingDataSourceType\x12)\n%TRAINING_DATA_SOURCE_TYPE_UNSPECIFIED\x10\x00\x12\x32\n.TRAINING_DATA_SOURCE_TYPE_SIMULATION_SOLUTIONS\x10\x01\x12.\n*TRAINING_DATA_SOURCE_TYPE_EXTERNAL_DATASET\x10\x02*\xc1\x01\n\x17ModelInitializationType\x12)\n%MODEL_INITIALIZATION_TYPE_UNSPECIFIED\x10\x00\x12$\n MODEL_INITIALIZATION_TYPE_RANDOM\x10\x01\x12+\n\'MODEL_INITIALIZATION_TYPE_MODEL_VERSION\x10\x02\x12(\n$MODEL_INITIALIZATION_TYPE_CHECKPOINT\x10\x03\x32\x8d\x07\n\x10PhysicsAiService\x12\xce\x01\n\x11ListArchitectures\x12H.luminary.proto.api.v0.luminarycloud.physics_ai.ListArchitecturesRequest\x1aI.luminary.proto.api.v0.luminarycloud.physics_ai.ListArchitecturesResponse\"$\x82\xd3\xe4\x93\x02\x1e\x12\x1c/v0/physics_ai/architectures\x12\xdb\x01\n\x14ListPretrainedModels\x12K.luminary.proto.api.v0.luminarycloud.physics_ai.ListPretrainedModelsRequest\x1aL.luminary.proto.api.v0.luminarycloud.physics_ai.ListPretrainedModelsResponse\"(\x82\xd3\xe4\x93\x02\"\x12 /v0/physics_ai/pretrained_models\x12\xf5\x01\n\x18GetSolutionDataPhysicsAI\x12O.luminary.proto.api.v0.luminarycloud.physics_ai.GetSolutionDataPhysicsAIRequest\x1aP.luminary.proto.api.v0.luminarycloud.physics_ai.GetSolutionDataPhysicsAIResponse\"6\x82\xd3\xe4\x93\x02\x30\"+/v0/physics_ai/solutions/{solution_id}/data:\x01*\x12\xd1\x01\n\x11SubmitTrainingJob\x12H.luminary.proto.api.v0.luminarycloud.physics_ai.SubmitTrainingJobRequest\x1aI.luminary.proto.api.v0.luminarycloud.physics_ai.SubmitTrainingJobResponse\"\'\x82\xd3\xe4\x93\x02!\"\x1c/v0/physics_ai/training/jobs:\x01*B>Z<luminarycloud.com/core/proto/api/v0/luminarycloud/physics_aib\x06proto3')
23
24
 
24
25
  _PHYSICSAILIFECYCLESTATE = DESCRIPTOR.enum_types_by_name['PhysicsAiLifecycleState']
25
26
  PhysicsAiLifecycleState = enum_type_wrapper.EnumTypeWrapper(_PHYSICSAILIFECYCLESTATE)
27
+ _TRAININGDATASOURCETYPE = DESCRIPTOR.enum_types_by_name['TrainingDataSourceType']
28
+ TrainingDataSourceType = enum_type_wrapper.EnumTypeWrapper(_TRAININGDATASOURCETYPE)
29
+ _MODELINITIALIZATIONTYPE = DESCRIPTOR.enum_types_by_name['ModelInitializationType']
30
+ ModelInitializationType = enum_type_wrapper.EnumTypeWrapper(_MODELINITIALIZATIONTYPE)
26
31
  LIFECYCLE_STATE_UNSPECIFIED = 0
27
32
  LIFECYCLE_STATE_DEVELOPMENT = 1
28
33
  LIFECYCLE_STATE_ACTIVE = 2
29
34
  LIFECYCLE_STATE_DEPRECATED = 3
30
35
  LIFECYCLE_STATE_RETIRED = 4
36
+ TRAINING_DATA_SOURCE_TYPE_UNSPECIFIED = 0
37
+ TRAINING_DATA_SOURCE_TYPE_SIMULATION_SOLUTIONS = 1
38
+ TRAINING_DATA_SOURCE_TYPE_EXTERNAL_DATASET = 2
39
+ MODEL_INITIALIZATION_TYPE_UNSPECIFIED = 0
40
+ MODEL_INITIALIZATION_TYPE_RANDOM = 1
41
+ MODEL_INITIALIZATION_TYPE_MODEL_VERSION = 2
42
+ MODEL_INITIALIZATION_TYPE_CHECKPOINT = 3
31
43
 
32
44
 
33
45
  _PHYSICSAIARCHITECTUREVERSION = DESCRIPTOR.message_types_by_name['PhysicsAiArchitectureVersion']
@@ -40,6 +52,10 @@ _LISTPRETRAINEDMODELSREQUEST = DESCRIPTOR.message_types_by_name['ListPretrainedM
40
52
  _LISTPRETRAINEDMODELSRESPONSE = DESCRIPTOR.message_types_by_name['ListPretrainedModelsResponse']
41
53
  _GETSOLUTIONDATAPHYSICSAIREQUEST = DESCRIPTOR.message_types_by_name['GetSolutionDataPhysicsAIRequest']
42
54
  _GETSOLUTIONDATAPHYSICSAIRESPONSE = DESCRIPTOR.message_types_by_name['GetSolutionDataPhysicsAIResponse']
55
+ _TRAININGSOLUTION = DESCRIPTOR.message_types_by_name['TrainingSolution']
56
+ _PHYSICSAITRAININGJOB = DESCRIPTOR.message_types_by_name['PhysicsAiTrainingJob']
57
+ _SUBMITTRAININGJOBREQUEST = DESCRIPTOR.message_types_by_name['SubmitTrainingJobRequest']
58
+ _SUBMITTRAININGJOBRESPONSE = DESCRIPTOR.message_types_by_name['SubmitTrainingJobResponse']
43
59
  PhysicsAiArchitectureVersion = _reflection.GeneratedProtocolMessageType('PhysicsAiArchitectureVersion', (_message.Message,), {
44
60
  'DESCRIPTOR' : _PHYSICSAIARCHITECTUREVERSION,
45
61
  '__module__' : 'proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2'
@@ -110,6 +126,34 @@ GetSolutionDataPhysicsAIResponse = _reflection.GeneratedProtocolMessageType('Get
110
126
  })
111
127
  _sym_db.RegisterMessage(GetSolutionDataPhysicsAIResponse)
112
128
 
129
+ TrainingSolution = _reflection.GeneratedProtocolMessageType('TrainingSolution', (_message.Message,), {
130
+ 'DESCRIPTOR' : _TRAININGSOLUTION,
131
+ '__module__' : 'proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2'
132
+ # @@protoc_insertion_point(class_scope:luminary.proto.api.v0.luminarycloud.physics_ai.TrainingSolution)
133
+ })
134
+ _sym_db.RegisterMessage(TrainingSolution)
135
+
136
+ PhysicsAiTrainingJob = _reflection.GeneratedProtocolMessageType('PhysicsAiTrainingJob', (_message.Message,), {
137
+ 'DESCRIPTOR' : _PHYSICSAITRAININGJOB,
138
+ '__module__' : 'proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2'
139
+ # @@protoc_insertion_point(class_scope:luminary.proto.api.v0.luminarycloud.physics_ai.PhysicsAiTrainingJob)
140
+ })
141
+ _sym_db.RegisterMessage(PhysicsAiTrainingJob)
142
+
143
+ SubmitTrainingJobRequest = _reflection.GeneratedProtocolMessageType('SubmitTrainingJobRequest', (_message.Message,), {
144
+ 'DESCRIPTOR' : _SUBMITTRAININGJOBREQUEST,
145
+ '__module__' : 'proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2'
146
+ # @@protoc_insertion_point(class_scope:luminary.proto.api.v0.luminarycloud.physics_ai.SubmitTrainingJobRequest)
147
+ })
148
+ _sym_db.RegisterMessage(SubmitTrainingJobRequest)
149
+
150
+ SubmitTrainingJobResponse = _reflection.GeneratedProtocolMessageType('SubmitTrainingJobResponse', (_message.Message,), {
151
+ 'DESCRIPTOR' : _SUBMITTRAININGJOBRESPONSE,
152
+ '__module__' : 'proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2'
153
+ # @@protoc_insertion_point(class_scope:luminary.proto.api.v0.luminarycloud.physics_ai.SubmitTrainingJobResponse)
154
+ })
155
+ _sym_db.RegisterMessage(SubmitTrainingJobResponse)
156
+
113
157
  _PHYSICSAISERVICE = DESCRIPTOR.services_by_name['PhysicsAiService']
114
158
  if _descriptor._USE_C_DESCRIPTORS == False:
115
159
 
@@ -121,28 +165,42 @@ if _descriptor._USE_C_DESCRIPTORS == False:
121
165
  _PHYSICSAISERVICE.methods_by_name['ListPretrainedModels']._serialized_options = b'\202\323\344\223\002\"\022 /v0/physics_ai/pretrained_models'
122
166
  _PHYSICSAISERVICE.methods_by_name['GetSolutionDataPhysicsAI']._options = None
123
167
  _PHYSICSAISERVICE.methods_by_name['GetSolutionDataPhysicsAI']._serialized_options = b'\202\323\344\223\0020\"+/v0/physics_ai/solutions/{solution_id}/data:\001*'
124
- _PHYSICSAILIFECYCLESTATE._serialized_start=1587
125
- _PHYSICSAILIFECYCLESTATE._serialized_end=1767
126
- _PHYSICSAIARCHITECTUREVERSION._serialized_start=249
127
- _PHYSICSAIARCHITECTUREVERSION._serialized_end=422
128
- _PHYSICSAIARCHITECTURE._serialized_start=425
129
- _PHYSICSAIARCHITECTURE._serialized_end=591
130
- _LISTARCHITECTURESREQUEST._serialized_start=593
131
- _LISTARCHITECTURESREQUEST._serialized_end=619
132
- _LISTARCHITECTURESRESPONSE._serialized_start=621
133
- _LISTARCHITECTURESRESPONSE._serialized_end=742
134
- _PHYSICSAIMODELVERSION._serialized_start=745
135
- _PHYSICSAIMODELVERSION._serialized_end=892
136
- _PHYSICSAIMODEL._serialized_start=895
137
- _PHYSICSAIMODEL._serialized_end=1047
138
- _LISTPRETRAINEDMODELSREQUEST._serialized_start=1049
139
- _LISTPRETRAINEDMODELSREQUEST._serialized_end=1078
140
- _LISTPRETRAINEDMODELSRESPONSE._serialized_start=1080
141
- _LISTPRETRAINEDMODELSRESPONSE._serialized_end=1190
142
- _GETSOLUTIONDATAPHYSICSAIREQUEST._serialized_start=1193
143
- _GETSOLUTIONDATAPHYSICSAIREQUEST._serialized_end=1484
144
- _GETSOLUTIONDATAPHYSICSAIRESPONSE._serialized_start=1486
145
- _GETSOLUTIONDATAPHYSICSAIRESPONSE._serialized_end=1584
146
- _PHYSICSAISERVICE._serialized_start=1770
147
- _PHYSICSAISERVICE._serialized_end=2467
168
+ _PHYSICSAISERVICE.methods_by_name['SubmitTrainingJob']._options = None
169
+ _PHYSICSAISERVICE.methods_by_name['SubmitTrainingJob']._serialized_options = b'\202\323\344\223\002!\"\034/v0/physics_ai/training/jobs:\001*'
170
+ _PHYSICSAILIFECYCLESTATE._serialized_start=2835
171
+ _PHYSICSAILIFECYCLESTATE._serialized_end=3015
172
+ _TRAININGDATASOURCETYPE._serialized_start=3018
173
+ _TRAININGDATASOURCETYPE._serialized_end=3185
174
+ _MODELINITIALIZATIONTYPE._serialized_start=3188
175
+ _MODELINITIALIZATIONTYPE._serialized_end=3381
176
+ _PHYSICSAIARCHITECTUREVERSION._serialized_start=272
177
+ _PHYSICSAIARCHITECTUREVERSION._serialized_end=445
178
+ _PHYSICSAIARCHITECTURE._serialized_start=448
179
+ _PHYSICSAIARCHITECTURE._serialized_end=614
180
+ _LISTARCHITECTURESREQUEST._serialized_start=616
181
+ _LISTARCHITECTURESREQUEST._serialized_end=642
182
+ _LISTARCHITECTURESRESPONSE._serialized_start=644
183
+ _LISTARCHITECTURESRESPONSE._serialized_end=765
184
+ _PHYSICSAIMODELVERSION._serialized_start=768
185
+ _PHYSICSAIMODELVERSION._serialized_end=915
186
+ _PHYSICSAIMODEL._serialized_start=918
187
+ _PHYSICSAIMODEL._serialized_end=1070
188
+ _LISTPRETRAINEDMODELSREQUEST._serialized_start=1072
189
+ _LISTPRETRAINEDMODELSREQUEST._serialized_end=1101
190
+ _LISTPRETRAINEDMODELSRESPONSE._serialized_start=1103
191
+ _LISTPRETRAINEDMODELSRESPONSE._serialized_end=1213
192
+ _GETSOLUTIONDATAPHYSICSAIREQUEST._serialized_start=1216
193
+ _GETSOLUTIONDATAPHYSICSAIREQUEST._serialized_end=1507
194
+ _GETSOLUTIONDATAPHYSICSAIRESPONSE._serialized_start=1509
195
+ _GETSOLUTIONDATAPHYSICSAIRESPONSE._serialized_end=1607
196
+ _TRAININGSOLUTION._serialized_start=1609
197
+ _TRAININGSOLUTION._serialized_end=1668
198
+ _PHYSICSAITRAININGJOB._serialized_start=1671
199
+ _PHYSICSAITRAININGJOB._serialized_end=2337
200
+ _SUBMITTRAININGJOBREQUEST._serialized_start=2340
201
+ _SUBMITTRAININGJOBREQUEST._serialized_end=2711
202
+ _SUBMITTRAININGJOBRESPONSE._serialized_start=2713
203
+ _SUBMITTRAININGJOBRESPONSE._serialized_end=2832
204
+ _PHYSICSAISERVICE._serialized_start=3384
205
+ _PHYSICSAISERVICE._serialized_end=4293
148
206
  # @@protoc_insertion_point(module_scope)