Add replicate.run() · DrewKulakov/replicate-python@36ac90e · GitHub
Skip to content

Commit 36ac90e

Browse files
committed
Add replicate.run()
To be consistent with the JavaScript library. Signed-off-by: Ben Firshman <ben@firshman.com>
1 parent 8f19be4 commit 36ac90e

6 files changed

Lines changed: 560 additions & 191 deletions

File tree

README.md

Lines changed: 79 additions & 63 deletions

replicate/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
from .client import Client
33

44
default_client = Client()
5+
run = default_client.run
56
models = default_client.models
67
predictions = default_client.predictions

replicate/client.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import os
2+
import re
23
from json import JSONDecodeError
4+
from typing import Any, Iterator, Union
35

46
import requests
57
from requests.adapters import HTTPAdapter, Retry
68

79
from replicate.__about__ import __version__
8-
from replicate.exceptions import ReplicateError
10+
from replicate.exceptions import ModelError, ReplicateError
911
from replicate.model import ModelCollection
1012
from replicate.prediction import PredictionCollection
1113

@@ -104,3 +106,30 @@ def models(self) -> ModelCollection:
104106
@property
105107
def predictions(self) -> PredictionCollection:
106108
return PredictionCollection(client=self)
109+
110+
def run(self, model_version, **kwargs) -> Union[Any, Iterator[Any]]:
111+
"""
112+
Run a model in the format owner/name:version.
113+
"""
114+
# Split model_version into owner, name, version in format owner/name:version
115+
m = re.match(r"^(?P<model>[^/]+/[^:]+):(?P<version>.+)$", model_version)
116+
if not m:
117+
raise ReplicateError(
118+
f"Invalid model_version: {model_version}. Expected format: owner/name:version"
119+
)
120+
model = self.models.get(m.group("model"))
121+
version = model.versions.get(m.group("version"))
122+
prediction = self.predictions.create(version=version, **kwargs)
123+
# Return an iterator of the output
124+
schema = version.get_transformed_schema()
125+
output = schema["components"]["schemas"]["Output"]
126+
if (
127+
output.get("type") == "array"
128+
and output.get("x-cog-array-type") == "iterator"
129+
):
130+
return prediction.output_iterator()
131+
132+
prediction.wait()
133+
if prediction.status == "failed":
134+
raise ModelError(prediction.error)
135+
return prediction.output

replicate/version.py

Lines changed: 6 additions & 2 deletions

0 commit comments

Comments
 (0)