6.5 Agent Best Practices03-Replicate
本小节主要介绍如何使用Replicate 快速生成与图片生成业务的几视频生成业务相关的工作流
Last updated
本小节主要介绍如何使用Replicate 快速生成与图片生成业务的几视频生成业务相关的工作流
Last updated
上一个小节我们学习了使用http 服务调用EXA 进行AI 智能搜索了,我们好像已经走进了AI 智能体的高速公路,这样我们就可以后边使用一些所有具备API 服务的业务的进行,结合python 的脚本语言下的,进行的创建更加丰富的智能体插件,这个时候我们就想是不是可以使用API 创建与生成更多的图形生成的服务,那么我们就有更加丰富的智能体插件。
首先我们可以看下的
我们可以看到有很多服务在里面,通过这些服务可以进行图片生成的推理服务在里面
如果我们想要调用这个服务,首先我们先了解的下的如何使用Replicate,通过学习Replicate的基础上的,将使用的API 服务迁移到Dify 工作流之中,当然我们还可以做后续的一系列的开发的过程。
我们随意挑选一个服务项目,服务的链接的地址在这个地方
https://replicate.com/aleksa-codes/flux-ghibsky-illustration
GHIBSKY style, a cat on a windowsill gazing out at a starry night sky and distant city lights
吉布斯基风格,窗台上的一只猫凝视着繁星点点的夜空和远处的城市灯光
我们修改下提示词,将猫修改为狗狗
GHIBSKY style, a dog on a windowsill gazing out at a starry night sky and distant city lights
直接运行,之后我们可以看到生成一张的照片
接下来我们可以看下,生成这个照片的服务的API的代码
我们可以看到所使用的代码包含提示词,输入参数,以及使用的REPLICATE 的秘钥,这里我们是可以清晰的看到使用的API 的输入结构,输入的是一个json 的数组,那么我们接下来还需要研究下,输出结构是什么,另外根据我们之前在使用模型进行图片生成的经验之中,输入参数之中的,有些的参数是可以固定,而有些是可以进行修改,比如说常见的"output_format": "jpg","guidance_scale": 3.5,"output_quality": 100,"num_inference_steps": 28 关键的提示词等可以进行修改。
这里我们可以从输入的脚本之中可以看到,需要输入的详细的内容
输入的API 脚本playboard
curl -s -X POST \ -H "Authorization: Bearer $REPLICATE_API_TOKEN" \ -H "Content-Type: application/json" \ -H "Prefer: wait" \ -d $'{ "version": "a9f94946fa0377091ac0bcfe61b0d62ad9a85224e4b421b677d4747914b908c0", "input": { "model": "dev", "prompt": "GHIBSKY style, a dog on a windowsill gazing out at a starry night sky and distant city lights", "lora_scale": 1, "num_outputs": 1, "aspect_ratio": "9:16", "output_format": "jpg", "guidance_scale": 3.5, "output_quality": 100, "prompt_strength": 0.8, "extra_lora_scale": 1, "num_inference_steps": 28 } }' \ https://api.replicate.com/v1/predictions
在以上脚本之中,我们看到我们是需要到使用到“ Bearer $REPLICATE_API_TOKEN”,注意在后续的Token的调用之中,我们需要遵循以下的格式,例如:
Bearer r8_P3pi9eA7KIlzjDK2CHhtwGzxmkuAbAM37zkI90
首先我们分析下如下的代码:
这段代码是使用 curl 命令行工具向 Replicate 的 API 发送 POST 请求,以生成图像。下面是对这个命令的详细分析:
命令结构
curl: 网络传输工具,用于从或向服务器传输数据。
s: 安静模式,不显示进度信息。
X POST: 指定 HTTP 请求方法为 POST。
HTTP Headers
H "Authorization: Bearer $REPLICATE_API_TOKEN":
设置授权头,$REPLICATE_API_TOKEN 是一个环境变量,包含了 Replicate API 的访问令牌。
H "Content-Type: application/json":
设置请求内容的类型为 JSON,这意味着请求体将包含 JSON 数据。
H "Prefer: wait":
这是一个自定义的 HTTP 头,指示 API 等待任务完成后再返回响应,而不是立即返回一个任务 ID。
请求体
d:
指定请求的 JSON 数据,这里使用了单引号 ($') 来允许在 JSON 字符串中使用双引号。
JSON 结构
json
version: 可能是一个模型版本的标识符,这次请求使用的是一个特定的版本。
input: 包含了生成图像所需的所有参数:
model: 指定使用哪个模型,这里是 "dev"。
prompt: 描述要生成的图像的文字提示。
其他参数如 lora_scale, num_outputs, aspect_ratio 等,都是控制生成图像的各种选项。
接着我们是可以看到输出的脚本API playboard
{ "completed_at": "2024-10-27T15:50:52.531096Z", "created_at": "2024-10-27T15:50:41.787000Z", "data_removed": false, "error": null, "id": "0et0h8s7fdrm00cjstpahyy684", "input": { "model": "dev", "prompt": "GHIBSKY style, a dog on a windowsill gazing out at a starry night sky and distant city lights", "lora_scale": 1, "num_outputs": 1, "aspect_ratio": "9:16", "output_format": "jpg", "guidance_scale": 3.5, "output_quality": 100, "prompt_strength": 0.8, "extra_lora_scale": 1, "num_inference_steps": 28 }, "logs": "Using seed: 3269\nPrompt: GHIBSKY style, a dog on a windowsill gazing out at a starry night sky and distant city lights\n[!] txt2img mode\nUsing dev model\nLoaded LoRAs in 0.59s\n 0%| | 0/28 [00:00<?, ?it/s]\n 4%|▎ | 1/28 [00:00<00:09, 2.89it/s]\n 7%|▋ | 2/28 [00:00<00:08, 3.23it/s]\n 11%|█ | 3/28 [00:00<00:08, 3.07it/s]\n 14%|█▍ | 4/28 [00:01<00:08, 3.00it/s]\n 18%|█▊ | 5/28 [00:01<00:07, 2.96it/s]\n 21%|██▏ | 6/28 [00:02<00:07, 2.94it/s]\n 25%|██▌ | 7/28 [00:02<00:07, 2.92it/s]\n 29%|██▊ | 8/28 [00:02<00:06, 2.92it/s]\n 32%|███▏ | 9/28 [00:03<00:06, 2.91it/s]\n 36%|███▌ | 10/28 [00:03<00:06, 2.90it/s]\n 39%|███▉ | 11/28 [00:03<00:05, 2.90it/s]\n 43%|████▎ | 12/28 [00:04<00:05, 2.90it/s]\n 46%|████▋ | 13/28 [00:04<00:05, 2.90it/s]\n 50%|█████ | 14/28 [00:04<00:04, 2.90it/s]\n 54%|█████▎ | 15/28 [00:05<00:04, 2.90it/s]\n 57%|█████▋ | 16/28 [00:05<00:04, 2.90it/s]\n 61%|██████ | 17/28 [00:05<00:03, 2.90it/s]\n 64%|██████▍ | 18/28 [00:06<00:03, 2.90it/s]\n 68%|██████▊ | 19/28 [00:06<00:03, 2.90it/s]\n 71%|███████▏ | 20/28 [00:06<00:02, 2.90it/s]\n 75%|███████▌ | 21/28 [00:07<00:02, 2.90it/s]\n 79%|███████▊ | 22/28 [00:07<00:02, 2.90it/s]\n 82%|████████▏ | 23/28 [00:07<00:01, 2.90it/s]\n 86%|████████▌ | 24/28 [00:08<00:01, 2.90it/s]\n 89%|████████▉ | 25/28 [00:08<00:01, 2.90it/s]\n 93%|█████████▎| 26/28 [00:08<00:00, 2.90it/s]\n 96%|█████████▋| 27/28 [00:09<00:00, 2.90it/s]\n100%|██████████| 28/28 [00:09<00:00, 2.90it/s]\n100%|██████████| 28/28 [00:09<00:00, 2.92it/s]", "metrics": { "predict_time": 10.455089391, "total_time": 10.744096 }, "output": [ "
https://replicate.delivery/yhqm/a7LIo8XmHHacPZNyz27SceoNlh3VbsK1O4s8lE5bSDEumg1JA/out-0.jpg
" ], "started_at": "2024-10-27T15:50:42.076006Z", "status": "succeeded", "urls": { "stream": "
https://stream.replicate.com/v1/files/wcdb-khc7i2crzg42ffcncxmlynpyigkbezujmxn3kaag64572h6b6eeq
", "get": "
https://api.replicate.com/v1/predictions/0et0h8s7fdrm00cjstpahyy684
", "cancel": "
https://api.replicate.com/v1/predictions/0et0h8s7fdrm00cjstpahyy684/cancel
" }, "version": "a9f94946fa0377091ac0bcfe61b0d62ad9a85224e4b421b677d4747914b908c0" }
通过输出的json的内容,我们可以看到的我们可以方便地的知道服务是不是成功创建,创建之后的内容是什么,等更加详细的参数。
接下来我们可以通过如下文档研究下的,该API 在调用时候分别使用了什么样的数据类型的。
https://replicate.com/aleksa-codes/flux-ghibsky-illustration/api/schema
我们可以清晰地看到输入的内容,在定义时候的需要的数据的类型的或者说字符的类型,这样为我们构建dify 上的工作流的提供了便利条件。
好的既然我们API 已经研究清楚那么我们就开始进行工作流的创建
首先确定下,需要输入那些参数
curl -s -X POST \
We -H "Authorization: Bearer $REPLICATE_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Prefer: wait" \
-d $'{ "version": "a9f94946fa0377091ac0bcfe61b0d62ad9a85224e4b421b677d4747914b908c0",
"input": {
"model": "dev", 【string default:dev】
"prompt": "GHIBSKY style, a dog on a windowsill gazing out at a starry night sky and distant city lights", 【string】
"lora_scale": 1, 【number default:1】
"num_outputs": 1, 【integer default:1 1-4 】
"aspect_ratio": "9:16", 【string default:1:1 】
"output_format": "jpg", 【string default: webp 或者jpg】
"guidance_scale": 3.5, 【number default 3.5 3.5-10 】
"output_quality": 100, 【integer default:90 100】
"prompt_strength": 0.8, 【number default:0.8】
"extra_lora_scale": 1, 【number default :1】
"num_inference_steps": 28 【integer default :28】 } }' \
https://api.replicate.com/v1/predictions
注意这里我们暂时不涉及那么复杂的操作,比如上传文件呀,或者使用的URL 链接使用LORA 模型等等的操作。
这里我们发现我们涉及到的三种数据类型的,以下是三种数据类型的解释说明。
Integer 是纯数字,没有小数部分。
Number 可以是任何数字类型,包括整数和浮点数。
String 可以包含任何字符序列,包括数字,但它们被视为文本。
因为在dify 之中只有number 以及string 所以我们在设计的时候需要注意,后续在输入过程之中需要注意,我们验证下的是不是需要的转换的相关的字符串。
这样我们的把开始节点的输入部分已经全部的完成,因为这里涉及的输入内容,太多有些是需要可以进行默认的所以,我们增加一些default 节点将相关的参数都填写进去,并且修改的输入的参数,是否为必须选项
当然我们这里需要首先需要写一段python 脚本进行数据的内容的转换,具体书写的格式如下,如果你不清楚,你可以使用chatGPT学习下。[PS 在后续过程之中发现version还是要传入的,所以后续统一增加的参数version,因为是个固定值的,所以直接添加]
现在我们基本可以确定我们需要的在调用URL 的时候需要输入的参数,输入的数据是:
{ "version": "a9f94946fa0377091ac0bcfe61b0d62ad9a85224e4b421b677d4747914b908c0",
"input": {
"model": "dev", 【string default:dev】
"prompt": "GHIBSKY style, a dog on a windowsill gazing out at a starry night sky and distant city lights", 【string】
"lora_scale": 1, 【number default:1】
"num_outputs": 1, 【integer default:1 1-4 】
"aspect_ratio": "9:16", 【string default:1:1 】
"output_format": "jpg", 【string default: webp 或者jpg】
"guidance_scale": 3.5, 【number default 3.5 3.5-10 】
"output_quality": 100, 【integer default:90 100】
"prompt_strength": 0.8, 【number default:0.8】
"extra_lora_scale": 1, 【number default :1】
"num_inference_steps": 28 【integer default :28】 }
你可以看到,这里的参数的有些可以有的default 的值的,请按照下面格式,将以上所有的参数,设置包含有的默认值格式的,Python脚本如下,请对Python脚本进行修改。python 脚本:
我们的可以看到的生成的脚本还是挺全面的
但是我们可能不需要这么复杂,我们简化处理一下
我们将相关参数填写到的节点的之中的,填写完毕之后的如下
在设计的过程之中要注意的,在每一步骤下,最好都进行测试下,查看下输出的内容是不是正确的。
通过输出的结果我们可以看到,输出的内容符合需求。按照之前的经验,接下来我们将要使用HTTP 工具的调用API ,在进行调用之前的,最好是对输入的内容进行格式化处理,当然我们在之前的已经有了相应的经验的首先我们要先测试一段代码,看代码的调用的过程是否是OK的。
我们看到已经测试成功,并且从后台来看也是OK的,说明http 调用是没有什么问题的。
那么HTT调用已经完成,我们首先的还是需要格式化输入的内容,创建一个脚本的节点。
我现在在做一个任务,主要是为了完成的HTTP 的请求的调用,一般来说我会输入一些参数,这些参数有一些default 的值,为了使输入的内容的是json 的格式并且不出错误的,我想要把输入的内容的使用python 脚本格式的化,类似下面的格式:
我一般输入的内容是:
{ "version": "a9f94946fa0377091ac0bcfe61b0d62ad9a85224e4b421b677d4747914b908c0", "input": { "model": "dev", "prompt": "GHIBSKY style, a elephant on a windowsill gazing out at a starry night sky and distant city lights", "lora_scale": 1, "num_outputs": 1, "aspect_ratio": "9:16", "output_format": "jpg", "guidance_scale": 3.5, "output_quality": 50, "prompt_strength": 0.8, "extra_lora_scale": 1, "num_inference_steps": 28 } }
请你参照以上的格式,将我一般的输入的内容的进行处理,忽略上面格式之中参数的输入的,保留python 脚本的主体结构,请给出我答案
在Chatgpt 的帮助下,我们顺利拿到了GPT 给出的脚本的,这样来看这样的脚本的,基本符合我们的预期。
我们的可以看到输出的内容基本符合,这里我们稍加修改,去除掉的默认的内容
以上就是我们最终要使用的脚本,同样我们需要测试下脚本,这里我们可以试用本地python 程序输入按照要求的数据格式,输出的内容如下,这段代码顺利通过。
好了到目前为止我们已经完成了这个的Http节点调用操作,我们直接copy 之前测试的HTTP 节点的信息,将传入的JSON 修改为上一个节点的输出
同样我们需要对这次的结果进行测试,这次测试我们直接使用“dog ”作为提示词,看下是否可以生成我们想要的图片的信息内容。
我们可以从看到正确生成了想要的图片,当然这里我们直接通过Replicate 的后台就可以看到:
那么接下来其实就是把HTTP 请求之后的内容,正确的json 化之后,然后把生成的照片的文件展示出来,后边内容逻辑流程跟之前基本一致,直接上代码的以及节点信息。
通过代码分析我们知道,目前我们调用的HTTP 仅仅是创建个一个任务,在返回的JSON 之中并没有的图片的URL的地址,所以我们还需要重新的调用的一次HTTP 获取图片的地址的信息。
{ "status_code": 201, "body": { "id": "xz6s3y4bvdrm20cjsxyrzy8d74", "model": "aleksa-codes/flux-ghibsky-illustration", "version": "a9f94946fa0377091ac0bcfe61b0d62ad9a85224e4b421b677d4747914b908c0", "input": { "aspect_ratio": "1:1", "extra_lora_scale": 1, "guidance_scale": 3.5, "lora_scale": 1, "model": "dev", "num_inference_steps": 28, "num_outputs": 1, "output_format": "jpg", "output_quality": 30, "prompt": "have a dog in the sea", "prompt_strength": 0.8, "replicate_weights": "
https://replicate.delivery/yhqm/vL5AgPaGiNbIBp9jRwKBLqz42yxmQHZDmqTxf2wejILflOpmA/trained_model.tar
" }, "logs": "", "output": [ "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABsSFBcUERsXFhceHBsgKEIrKCUlKFE6PTBCYFVlZF9VXVtqeJmBanGQc1tdhbWGkJ6jq62rZ4C8ybqmx5moq6T/2pKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKT/wAARCAQABAADASIAAhEBAxEB/8QAGgAAAgMBAQAAAAAAAAAAAAEnXIZG1+QJWQRvFYyNLDlGzaSYVigKneQAK6ZLnqJZTSoNSLDpAVmA1AiyknvLYS/XwiFM9QIypsVdlb8ze8a35v6y0U+rGPIPGXGfJXCSKHgwyNBqNzC8LEHUQO+kLoB12jup4sZGEBxhbxDzktODCUdn4xEW0vrJ6b3ldRql+7l9ZSIhmB3sPOM2bW8jmJ+cWMPWZbf/2Q==" ], "data_removed": false, "error": null, "status": "processing", "created_at": "2024-10-27T19:39:24.507Z", "urls": { "cancel": "
https://api.replicate.com/v1/predictions/xz6s3y4bvdrm20cjsxyrzy8d74/cancel
", "get": "
https://api.replicate.com/v1/predictions/xz6s3y4bvdrm20cjsxyrzy8d74
", "stream": "
https://stream.replicate.com/v1/files/wcdb-lxh72xpmqwfuy5nfv5iue2d3evg3bu3sbndrbho46a3p7frzjwua
" } }, "headers": { "date": "Sun, 27 Oct 2024 19:39:39 GMT", "content-type": "application/json; charset=UTF-8", "content-length": "124929", "connection": "keep-alive", "cf-ray": "8d9526e54fc3c95b-IAD", "cf-cache-status": "DYNAMIC", "strict-transport-security": "max-age=15552000", "preference-applied": "wait=60", "ratelimit-remaining": "599", "ratelimit-reset": "1", "report-to": "{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=QWx1y%2Fb5rZaT3NVtrcmcD8IHz270Dtn6uUNspY%2FM1tnMUyk6QRHT%2FSEUa7E1y9OR6ADZZuVgUpVZIgFaJaJ%2FRZcnsby0Yll%2BD1AL9XwjVfmsuzU5m%2FEE2thoHUyeDf2tmcSB\"}],\"group\":\"cf-nel\",\"max_age\":604800}", "nel": "{\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}", "vary": "Accept-Encoding", "server": "cloudflare", "alt-svc": "h3=\":443\"; ma=86400" }, "files": [] }
那么现在我们可以通过官方的API 可以看到与任务创建相关的API 的接口,接下来我们需要创建另外的节点的,直接使用上面我们创建的任务下的任务的id
GEThttps://api.replicate.com/v1/predictions/{prediction_id}
例如使用这个的API 可以在浏览器之中打开,就可以访问到之前的任务创建的信息,输出的是json 格式。
GEThttps://api.replicate.com/v1/predictions/xz6s3y4bvdrm20cjsxyrzy8d74
测试之后出结果的json为如下所示:
那么就简单了,我们进需要的把之前的HTTP 请求的数据之中的任务ID 提取出来,填写到上面调用创建的任务的API之中,当然我们这里还是使用python 脚本的进行格式的转化。
同样我们需要对以上节点进行测试,看输出的结果是否符合的要求。
我们可以看到该节点输出的信息就是我们想要的之前任务创建的id ,接下来我们将该节点的获得的任务的id作为输入的条件的,输入任务API 再次进行调用。
当然我们这里还是跟之前一样使用的HTTP 进行调用,调用之后的就可以返回包含创建任务的以及图片URL的地址的json 信息。
最后我们将所获取的图片的地址信息提取出来之后,然后在回话之后进行展示。
最后我们可以看下最终的工作流的效果,因为目前在dify 平台的图片文件的大小的限制,我们暂时生成的小的分辨率质量的图片。
接下来在对话框之中随意输入一些内容,我们可以看到在生成的过程之中
打开图片链接之后,我们可以看到生成的图片文件
因为这仅仅是一个原生的工作流,所以这里暂时没有优化对话的设置的,后续还有一定的优化的空间,大家可以优化下对话设置内容。