ob-metaflow-extensions 1.1.156__tar.gz → 1.1.158__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ob-metaflow-extensions might be problematic. Click here for more details.

Files changed (82) hide show
  1. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/PKG-INFO +1 -1
  2. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nim/nim_manager.py +77 -16
  3. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/ollama/__init__.py +32 -13
  4. ob-metaflow-extensions-1.1.158/metaflow_extensions/outerbounds/plugins/ollama/constants.py +1 -0
  5. ob-metaflow-extensions-1.1.158/metaflow_extensions/outerbounds/plugins/ollama/exceptions.py +22 -0
  6. ob-metaflow-extensions-1.1.158/metaflow_extensions/outerbounds/plugins/ollama/ollama.py +813 -0
  7. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/ob_metaflow_extensions.egg-info/PKG-INFO +1 -1
  8. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/ob_metaflow_extensions.egg-info/SOURCES.txt +2 -0
  9. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/setup.py +1 -1
  10. ob-metaflow-extensions-1.1.156/metaflow_extensions/outerbounds/plugins/ollama/ollama.py +0 -328
  11. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/README.md +0 -0
  12. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/__init__.py +0 -0
  13. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/config/__init__.py +0 -0
  14. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/__init__.py +0 -0
  15. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/apps/__init__.py +0 -0
  16. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/apps/app_utils.py +0 -0
  17. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/apps/consts.py +0 -0
  18. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/apps/deploy_decorator.py +0 -0
  19. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/apps/supervisord_utils.py +0 -0
  20. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/auth_server.py +0 -0
  21. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/card_utilities/__init__.py +0 -0
  22. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/card_utilities/async_cards.py +0 -0
  23. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/card_utilities/extra_components.py +0 -0
  24. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/card_utilities/injector.py +0 -0
  25. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/checkpoint_datastores/__init__.py +0 -0
  26. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/checkpoint_datastores/coreweave.py +0 -0
  27. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/checkpoint_datastores/nebius.py +0 -0
  28. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/fast_bakery/__init__.py +0 -0
  29. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/fast_bakery/docker_environment.py +0 -0
  30. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/fast_bakery/fast_bakery.py +0 -0
  31. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/fast_bakery/fast_bakery_cli.py +0 -0
  32. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/fast_bakery/fast_bakery_decorator.py +0 -0
  33. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/kubernetes/__init__.py +0 -0
  34. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/kubernetes/kubernetes_client.py +0 -0
  35. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nim/card.py +0 -0
  36. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nim/nim_decorator.py +0 -0
  37. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nim/utils.py +0 -0
  38. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvcf/__init__.py +0 -0
  39. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvcf/constants.py +0 -0
  40. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvcf/exceptions.py +0 -0
  41. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvcf/heartbeat_store.py +0 -0
  42. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvcf/nvcf.py +0 -0
  43. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvcf/nvcf_cli.py +0 -0
  44. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvcf/nvcf_decorator.py +0 -0
  45. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvcf/utils.py +0 -0
  46. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvct/__init__.py +0 -0
  47. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvct/exceptions.py +0 -0
  48. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvct/nvct.py +0 -0
  49. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvct/nvct_cli.py +0 -0
  50. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvct/nvct_decorator.py +0 -0
  51. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvct/nvct_runner.py +0 -0
  52. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/nvct/utils.py +0 -0
  53. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/perimeters.py +0 -0
  54. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/profilers/deco_injector.py +0 -0
  55. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/profilers/gpu_profile_decorator.py +0 -0
  56. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/secrets/__init__.py +0 -0
  57. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/secrets/secrets.py +0 -0
  58. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/snowflake/__init__.py +0 -0
  59. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/snowflake/snowflake.py +0 -0
  60. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/snowpark/__init__.py +0 -0
  61. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/snowpark/snowpark.py +0 -0
  62. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/snowpark/snowpark_cli.py +0 -0
  63. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/snowpark/snowpark_client.py +0 -0
  64. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/snowpark/snowpark_decorator.py +0 -0
  65. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/snowpark/snowpark_exceptions.py +0 -0
  66. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/snowpark/snowpark_job.py +0 -0
  67. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/snowpark/snowpark_service_spec.py +0 -0
  68. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/plugins/tensorboard/__init__.py +0 -0
  69. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/profilers/__init__.py +0 -0
  70. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/profilers/gpu.py +0 -0
  71. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/remote_config.py +0 -0
  72. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/toplevel/__init__.py +0 -0
  73. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/toplevel/global_aliases_for_metaflow_package.py +0 -0
  74. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/toplevel/plugins/azure/__init__.py +0 -0
  75. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/toplevel/plugins/gcp/__init__.py +0 -0
  76. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/toplevel/plugins/kubernetes/__init__.py +0 -0
  77. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/toplevel/plugins/ollama/__init__.py +0 -0
  78. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/metaflow_extensions/outerbounds/toplevel/plugins/snowflake/__init__.py +0 -0
  79. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/ob_metaflow_extensions.egg-info/dependency_links.txt +0 -0
  80. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/ob_metaflow_extensions.egg-info/requires.txt +0 -0
  81. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/ob_metaflow_extensions.egg-info/top_level.txt +0 -0
  82. {ob-metaflow-extensions-1.1.156 → ob-metaflow-extensions-1.1.158}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ob-metaflow-extensions
3
- Version: 1.1.156
3
+ Version: 1.1.158
4
4
  Summary: Outerbounds Platform Extensions for Metaflow
5
5
  Author: Outerbounds, Inc.
6
6
  License: Commercial
@@ -186,18 +186,61 @@ class NimManager(object):
186
186
  ]
187
187
  self.models = {}
188
188
 
189
- for each_model in models:
190
- if each_model in nvcf_models:
191
- self.models[each_model] = NimChatCompletion(
192
- model=each_model,
189
+ # Convert models to a standard format
190
+ standardized_models = []
191
+ # If models is a single string, convert it to a list with a dict
192
+ if isinstance(models, str):
193
+ standardized_models = [{"name": models}]
194
+ # If models is a list, process each item
195
+ elif isinstance(models, list):
196
+ for model_item in models:
197
+ # If the item is a string, convert it to a dict
198
+ if isinstance(model_item, str):
199
+ standardized_models.append({"name": model_item})
200
+ # If it's already a dict, use it as is
201
+ elif isinstance(model_item, dict):
202
+ standardized_models.append(model_item)
203
+ else:
204
+ raise ValueError(
205
+ f"Model specification must be a string or dictionary, got {type(model_item)}"
206
+ )
207
+ else:
208
+ raise ValueError(
209
+ f"Models must be a string or a list of strings/dictionaries, got {type(models)}"
210
+ )
211
+
212
+ # Process each standardized model
213
+ for each_model_dict in standardized_models:
214
+ model_name = each_model_dict.get("name", "")
215
+ nvcf_id = each_model_dict.get("nvcf_id", "")
216
+ nvcf_version = each_model_dict.get("nvcf_version", "")
217
+
218
+ if model_name and not (nvcf_id and nvcf_version):
219
+ if model_name in nvcf_models:
220
+ self.models[model_name] = NimChatCompletion(
221
+ model=model_name,
222
+ nvcf_id=nvcf_id,
223
+ nvcf_version=nvcf_version,
224
+ nim_metadata=nim_metadata,
225
+ monitor=monitor,
226
+ )
227
+ else:
228
+ raise ValueError(
229
+ f"Model {model_name} not supported by the Outerbounds @nim offering."
230
+ f"\nYou can choose from these options: {nvcf_models}\n\n"
231
+ "Reach out to Outerbounds if there are other models you'd like supported."
232
+ )
233
+ elif nvcf_id and nvcf_version:
234
+ self.models[model_name] = NimChatCompletion(
235
+ model=model_name,
236
+ nvcf_id=nvcf_id,
237
+ nvcf_version=nvcf_version,
193
238
  nim_metadata=nim_metadata,
194
239
  monitor=monitor,
195
240
  )
196
241
  else:
197
242
  raise ValueError(
198
- f"Model {each_model} not supported by the Outerbounds @nim offering."
199
- f"\nYou can choose from these options: {nvcf_models}\n\n"
200
- "Reach out to Outerbounds if there are other models you'd like supported."
243
+ "You must provide either a valid 'name' or a custom 'name' along with both 'nvcf_id' and 'nvcf_version'."
201
244
  )
202
245
 
203
246
 
@@ -205,6 +248,8 @@ class NimChatCompletion(object):
205
248
  def __init__(
206
249
  self,
207
250
  model: str = "meta/llama3-8b-instruct",
251
+ nvcf_id: str = "",
252
+ nvcf_version: str = "",
208
253
  nim_metadata: NimMetadata = None,
209
254
  monitor: bool = False,
210
255
  **kwargs,
@@ -217,18 +262,34 @@ class NimChatCompletion(object):
217
262
  self.model_name = model
218
263
  self.nim_metadata = nim_metadata
219
264
  self.monitor = monitor
220
-
221
265
  all_nvcf_models = self.nim_metadata.get_nvcf_chat_completion_models()
222
- all_nvcf_model_names = [m["name"] for m in all_nvcf_models]
223
266
 
224
- if self.model_name not in all_nvcf_model_names:
225
- raise ValueError(
226
- f"Model {self.model_name} not found in available NVCF models"
227
- )
267
+ if nvcf_id and nvcf_version:
268
+ matching_models = [
269
+ m
270
+ for m in all_nvcf_models
271
+ if m["function-id"] == nvcf_id and m["version-id"] == nvcf_version
272
+ ]
273
+ if matching_models:
274
+ self.model = matching_models[0]
275
+ self.function_id = self.model["function-id"]
276
+ self.version_id = self.model["version-id"]
277
+ self.model_name = self.model["name"]
278
+ else:
279
+ raise ValueError(
280
+ f"Function {self.function_id} with version {self.version_id} not found on NVCF"
281
+ )
282
+ else:
283
+ all_nvcf_model_names = [m["name"] for m in all_nvcf_models]
284
+
285
+ if self.model_name not in all_nvcf_model_names:
286
+ raise ValueError(
287
+ f"Model {self.model_name} not found in available NVCF models"
288
+ )
228
289
 
229
- self.model = all_nvcf_models[all_nvcf_model_names.index(self.model_name)]
230
- self.function_id = self.model["function-id"]
231
- self.version_id = self.model["version-id"]
290
+ self.model = all_nvcf_models[all_nvcf_model_names.index(self.model_name)]
291
+ self.function_id = self.model["function-id"]
292
+ self.version_id = self.model["version-id"]
232
293
 
233
294
  self.first_request = True
234
295
 
@@ -1,6 +1,7 @@
1
1
  from metaflow.decorators import StepDecorator
2
2
  from metaflow import current
3
3
  import functools
4
+ import os
4
5
 
5
6
  from .ollama import OllamaManager
6
7
  from ..card_utilities.injector import CardDecoratorInjector
@@ -13,10 +14,10 @@ class OllamaDecorator(StepDecorator, CardDecoratorInjector):
13
14
  This decorator is used to run Ollama APIs as Metaflow task sidecars.
14
15
 
15
16
  User code call
16
- -----------
17
+ --------------
17
18
  @ollama(
18
- models=['meta/llama3-8b-instruct', 'meta/llama3-70b-instruct'],
19
- backend='local'
19
+ models=[...],
20
+ ...
20
21
  )
21
22
 
22
23
  Valid backend options
@@ -26,21 +27,39 @@ class OllamaDecorator(StepDecorator, CardDecoratorInjector):
26
27
  - (TODO) 'remote': Spin up separate instance to serve Ollama models.
27
28
 
28
29
  Valid model options
29
- ----------------
30
- - 'llama3.2'
31
- - 'llama3.3'
32
- - any model here https://ollama.com/search
30
+ -------------------
31
+ Any model here https://ollama.com/search, e.g. 'llama3.2', 'llama3.3'
33
32
 
34
33
  Parameters
35
34
  ----------
36
- models: list[Ollama]
35
+ models: list[str]
37
36
  List of Ollama containers running models in sidecars.
38
37
  backend: str
39
38
  Determines where and how to run the Ollama process.
39
+ force_pull: bool
40
+ Whether to run `ollama pull` no matter what, or first check the remote cache in Metaflow datastore for this model key.
41
+ skip_push_check: bool
42
+ Whether to skip the check that populates/overwrites remote cache on terminating an ollama model.
43
+ debug: bool
44
+ Whether to turn on verbose debugging logs.
40
45
  """
41
46
 
42
47
  name = "ollama"
43
- defaults = {"models": [], "backend": "local", "debug": False}
48
+ defaults = {
49
+ "models": [],
50
+ "backend": "local",
51
+ "force_pull": False,
52
+ "skip_push_check": False,
53
+ "debug": False,
54
+ }
55
+
56
+ def step_init(
57
+ self, flow, graph, step_name, decorators, environment, flow_datastore, logger
58
+ ):
59
+ super().step_init(
60
+ flow, graph, step_name, decorators, environment, flow_datastore, logger
61
+ )
62
+ self.flow_datastore_backend = flow_datastore._storage_impl
44
63
 
45
64
  def task_decorate(
46
65
  self, step_func, flow, graph, retry_count, max_user_code_retries, ubf_context
@@ -51,6 +70,9 @@ class OllamaDecorator(StepDecorator, CardDecoratorInjector):
51
70
  self.ollama_manager = OllamaManager(
52
71
  models=self.attributes["models"],
53
72
  backend=self.attributes["backend"],
73
+ flow_datastore_backend=self.flow_datastore_backend,
74
+ force_pull=self.attributes["force_pull"],
75
+ skip_push_check=self.attributes["skip_push_check"],
54
76
  debug=self.attributes["debug"],
55
77
  )
56
78
  except Exception as e:
@@ -59,10 +81,7 @@ class OllamaDecorator(StepDecorator, CardDecoratorInjector):
59
81
  try:
60
82
  step_func()
61
83
  finally:
62
- try:
63
- self.ollama_manager.terminate_models()
64
- except Exception as term_e:
65
- print(f"[@ollama] Error during sidecar termination: {term_e}")
84
+ self.ollama_manager.terminate_models()
66
85
  if self.attributes["debug"]:
67
86
  print(f"[@ollama] process statuses: {self.ollama_manager.processes}")
68
87
  print(f"[@ollama] process runtime stats: {self.ollama_manager.stats}")
@@ -0,0 +1,22 @@
1
+ from metaflow.exception import MetaflowException
2
+
3
+
4
+ class UnspecifiedRemoteStorageRootException(MetaflowException):
5
+ headline = "Storage root not specified."
6
+
7
+ def __init__(self, message):
8
+ super(UnspecifiedRemoteStorageRootException, self).__init__(message)
9
+
10
+
11
+ class EmptyOllamaManifestCacheException(MetaflowException):
12
+ headline = "Model not found."
13
+
14
+ def __init__(self, message):
15
+ super(EmptyOllamaManifestCacheException, self).__init__(message)
16
+
17
+
18
+ class EmptyOllamaBlobCacheException(MetaflowException):
19
+ headline = "Blob not found."
20
+
21
+ def __init__(self, message):
22
+ super(EmptyOllamaBlobCacheException, self).__init__(message)