replicate-python icon indicating copy to clipboard operation
replicate-python copied to clipboard

replicate.run returning FileOutput objects

Open jacksondc opened this issue 1 year ago • 16 comments

When I run the code examples in the README, I get back replicate.helpers.FileOutput objects. I expected to get URLs.

Steps to reproduce:

pip install replicate== 1.0.2 export REPLICATE_API_TOKEN=... python3

>>> import replicate
>>> replicate.run(
...         "stability-ai/stable-diffusion:27b93a2413e7f36cd83da926f3656280b2931564ff050bf9575f1fdf9bcd7478",
...         input={"prompt": "a 19th century portrait of a wombat gentleman"}
...     )
[<replicate.helpers.FileOutput object at 0x1062f3e60>]

Looks like the new types were introduced in version 1.0.1.

jacksondc avatar Oct 17 '24 19:10 jacksondc

Use:

obj = replicate.run([...])
print(obj.url)

# or str(obj)

paulocoutinhox avatar Oct 18 '24 05:10 paulocoutinhox

I am having the same issue. I am getting a file output and am unsure how to parse. The example code does not work for presenting an image.


import replicate
output = replicate.run(
  "black-forest-labs/flux-schnell",
  input={"prompt": "an african grey parrot sitting in the jungle on a branch, pointillism"}
)

I get these outputs:

output ---> [<replicate.helpers.FileOutput at 0x21c3cd91f50>]
str(output) ---> [<replicate.helpers.FileOutput object at 0x0000021C3CD91F50>]

output[0].url ---> data:application/octet-stream;base64,UklGRowqAwBXRUJQV.....
str(output[0]) ---> data:application/octet-stream;base64,UklGRowqAwBXRUJQV.....

I did get it to display an image with:

from IPython.display import Image
img = Image(url=output[0].url)

user-will avatar Oct 19 '24 12:10 user-will

It appears that the FileOutput class was only added last month and is a completely new addition. Likely the cause of the problems here.

Here is a link to the commit: https://github.com/replicate/replicate-python/commit/e7f699f2110822f9c164872e8d72e57102f89855

Link to file: https://github.com/replicate/replicate-python/blob/main/replicate/helpers.py

user-will avatar Oct 19 '24 12:10 user-will

I got it to output the correct delivery url when I downgraded my replicate version to 0.32.1 (before the FileOutput commit).

Just install the older version then restart your kernel.

https://pypi.org/project/replicate/0.32.1/

user-will avatar Oct 19 '24 13:10 user-will

this testing code does not work:

import requests

output = replicate.run(
    "stability-ai/stable-diffusion:db21e45d3f7023abc2a46ee38a23973f6dce16bb082a930b0c49861f96d1e5bf",
    input={"text": "an astronaut riding a horse"}
)

response = requests.get(output[0].url)

with open("local_image.jpg", "wb") as file:
    file.write(response.content)

xuyannus avatar Oct 19 '24 18:10 xuyannus

@xuyannus Try removing .url from output[0] and just doing:

import requests

output = replicate.run(
    "stability-ai/stable-diffusion:db21e45d3f7023abc2a46ee38a23973f6dce16bb082a930b0c49861f96d1e5bf",
    input={"text": "an astronaut riding a horse"}
)

response = requests.get(output[0])

with open("local_image.jpg", "wb") as file:
    file.write(response.content)

I also downgraded to v0.32.1 to get mine to work. https://pypi.org/project/replicate/0.32.1/

user-will avatar Oct 19 '24 18:10 user-will

Thanks for the feedback all, we'll get the examples in the README fixed.

As mentioned in the issue the URL can be accessed via the url attribute on the FileOutput object.

import replicate
output = replicate.run(
  "black-forest-labs/flux-schnell",
  input={"prompt": "an african grey parrot sitting in the jungle on a branch, pointillism"}
)
print(output[0].url)

@xuyannus

this testing code does not work:

import requests
...

The requests library is not needed to fetch the output.

import replicate

output = replicate.run(
    "stability-ai/stable-diffusion:db21e45d3f7023abc2a46ee38a23973f6dce16bb082a930b0c49861f96d1e5bf",
    input={"text": "an astronaut riding a horse"}
)

with open("local_image.jpg", "wb") as file:
    file.write(output[0])

aron avatar Oct 21 '24 16:10 aron

FYI: This breaking change caused all our API integrations with replicate to stop working…

@aron the documentation on the model pages also have no mention of the FileOutput: https://replicate.com/black-forest-labs/flux-1.1-pro/api

melvinmt avatar Oct 22 '24 20:10 melvinmt

The technical team is very bad. There is no consistency, everything stops working out of nowhere. Now, I'm getting another problem. The "url" field returns in base64 and not the URL itself.

paulocoutinhox avatar Oct 23 '24 17:10 paulocoutinhox

@paulocoutinhox I am getting the same issue. Our inference API has stopped working. @aron Can you guys please check this asap?

eloelo-techadmin avatar Oct 24 '24 05:10 eloelo-techadmin

I was not able to fix the problem with the latest package version. Same problems with the base64. Clearly more needs to be worked out on the backend side.

For now I have been able to get it to work as intended in the code examples by downgrading to version 0.23.1 https://pypi.org/project/replicate/0.32.1/

Hope this helps and gets resolved in the latest versions. For now just downgrade to v0.23.1 unless it causes other issues.

@eloelo-techadmin @melvinmt @paulocoutinhox

user-will avatar Oct 26 '24 14:10 user-will

Hi @user-will,

Im using this:

output = replicate.run(model_path, input=replicate_input)

# get the output format for file extension
output_format = flux_model_task.output_format.lower()

# download and save the generated image
for output_item in output:
    unique_file_name = f"{uuid.uuid4()}.{output_format}"
    file_content = ContentFile(output_item.read())

    flux_model_task.output_image.save(unique_file_name, file_content, save=True)

    # mark the task as processed
    flux_model_task.status = GenerationStatus.PROCESSED
    flux_model_task.save()

    logger.info(f"Generated image saved: {unique_file_name}")

paulocoutinhox avatar Oct 26 '24 20:10 paulocoutinhox

@aron Neither output.url nor use_file_output=False works. I still get the output in base64 format

[output] = replicate.run(
"black-forest-labs/flux-schnell",
 input={"prompt": "astronaut riding a rocket like a horse"},
use_file_output=False)

print(output)
# BASE64 data
output = replicate.run(
"black-forest-labs/flux-schnell",
input={"prompt": "an african grey parrot sitting in the jungle on a branch, pointillism"}
)

print(output[0].url)

#BASE64 data

Downgrading to version 0.34.1 works for now. The documentation does not reference the new API, which is very confusing: https://replicate.com/black-forest-labs/flux-1.1-pro/api

ikergarcia1996 avatar Oct 28 '24 08:10 ikergarcia1996

I'd update the release notes on 1.0.0 to note its FileOutput as seen above or FileObject. If it is FileObject, setup type hints in the future rather than returning Any | list[Any] from your library plz :)

Here's a quick example of how to do it for sync API https://github.com/replicate/replicate-python/pull/389

ntindle avatar Oct 28 '24 21:10 ntindle

My solution is working on new versions too. Thanks.

paulocoutinhox avatar Oct 29 '24 14:10 paulocoutinhox

So now it looks like the output is no longer a list, and if you try to use output[0].url or iterate on it, lets you know FileOutput is not Subscribable. Easy enough to do output.url now that we know, I'm still doing it with output = [output.url] to keep it as a str list in case the pipelines add a num_images batch option, but it's fine. I now have most of the main Replicate APIs integrated into my app at AEIONic.com with all the bells & whistles..

Skquark avatar Dec 08 '24 07:12 Skquark