Spaces:
Runtime error
Runtime error
| - [简介](#简介) | |
| - [Fooocus 能力相关接口](#fooocus-能力相关接口) | |
| - [文生图 | text-to-image](#文生图--text-to-image) | |
| - [图像放大 | image-upscale-vary](#图像放大--image-upscale-vary) | |
| - [局部重绘 | image-inpaint-outpaint](#局部重绘--image-inpaint-outpaint) | |
| - [图生图 | image-prompt](#图生图--image-prompt) | |
| - [text-to-image-with-image prompt](#text-to-image-with-image-prompt) | |
| - [图像反推 | describe](#图像反推--describe) | |
| - [列出模型 | all-models](#列出模型--all-models) | |
| - [刷新模型 | refresh-models](#刷新模型--refresh-models) | |
| - [样式 | styles](#样式--styles) | |
| - [Fooocus API 任务相关接口](#fooocus-api-任务相关接口) | |
| - [任务队列 | job-queue](#任务队列--job-queue) | |
| - [查询任务 | query-job](#查询任务--query-job) | |
| - [查询任务历史 | job-history](#查询任务历史--job-history) | |
| - [停止任务 | stop](#停止任务--stop) | |
| - [ping](#ping) | |
| - [webhook](#webhook) | |
| - [公共请求体](#公共请求体) | |
| - [高级参数 | AdvanceParams](#高级参数--advanceparams) | |
| - [lora](#lora) | |
| - [响应参数 | response](#响应参数--response) | |
| # 简介 | |
| Fooocus API 目前提供了十多个 REST 接口, 我大致将其分为两类, 第一类用来调用 Fooocus 的能力, 比如生成图像、刷新模型之类的, 第二类为 Fooocus API 自身相关的, 主要是任务查询相关。我会在接下来的内容中尝试说明它们的作用以及用法并提供示例。 | |
| > 几乎所有的接口参数都有默认值,这意味着你只需要发送你感兴趣的参数即可。完整的参数以及默认值可以通过表格查看 | |
| # Fooocus 能力相关接口 | |
| ## 文生图 | text-to-image | |
| 对应 Fooocus 中的文生图功能 | |
| **基础信息:** | |
| ```yaml | |
| EndPoint: /v1/generation/text-to-image | |
| Method: Post | |
| DataType: json | |
| ``` | |
| **请求参数:** | |
| | Name | Type | Description | | |
| |-------------------------|----------------|-------------------------------------------------------------------------| | |
| | prompt | string | 描述词, 默认为空字符串 | | |
| | negative_prompt | string | 描述词, 反向描述词 | | |
| | style_selections | List[str] | 风格列表, 需要是受支持的风格, 可以通过 [样式接口](#样式--styles) 获取所有支持的样式 | | |
| | performance_selection | Enum | 性能选择, `Speed`, `Quality`, `Extreme Speed`, `Lightning` 中的一个, 默认 `Speed` | | |
| | aspect_ratios_selection | str | 分辨率, 默认 '1152*896' | | |
| | image_number | int | 生成图片数量, 默认 1 , 最大32, 注: 非并行接口 | | |
| | image_seed | int | 图片种子, 默认 -1, 即随机生成 | | |
| | sharpness | float | 锐度, 默认 2.0 , 0-30 | | |
| | guidance_scale | float | 引导比例, 默认 4.0 , 1-30 | | |
| | base_model_name | str | 基础模型, 默认 `juggernautXL_version6Rundiffusion.safetensors` | | |
| | refiner_model_name | str | 优化模型, 默认 `None` | | |
| | refiner_switch | float | 优化模型切换时机, 默认 0.5 | | |
| | loras | List[Lora] | lora 模型列表, 包含配置, lora 结构: [Lora](#lora) | | |
| | advanced_params | AdvancedParams | 高级参数, AdvancedParams 结构 [AdvancedParams](#高级参数--advanceparams) | | |
| | save_meta | bool | 是否保存元数据, 默认 True | | |
| | meta_scheme | str | 元数据方案, 默认 'fooocus', 目前只支持 'fooocus' | | |
| | save_extension | str | 保存文件扩展名, 默认 'png' | | |
| | save_name | str | 保存文件名, 默认 job_id + 序号 | | |
| | read_wildcards_in_order | bool | 是否按照顺序读取通配符, 默认 False | | |
| | require_base64 | bool | 是否返回base64编码, 默认 False | | |
| | async_process | bool | 是否异步处理, 默认 False | | |
| | webhook_url | str | 异步处理完成后, 触发的 webhook 地址, 参考[webhook](#webhook) | | |
| **响应参数:** | |
| 多数响应结构式相同的, 不同的部分会进行特别说明. | |
| 该接口返回通用响应结构, 参考[响应参数](#响应参数--response) | |
| **请求示例:** | |
| ```python | |
| host = "http://127.0.0.1:8888" | |
| def text2img(params: dict) -> dict: | |
| """ | |
| 文生图 | |
| """ | |
| result = requests.post(url=f"{host}/v1/generation/text-to-image", | |
| data=json.dumps(params), | |
| headers={"Content-Type": "application/json"}) | |
| return result.json() | |
| result =text2img({ | |
| "prompt": "1girl sitting on the ground", | |
| "async_process": True}) | |
| print(result) | |
| ``` | |
| ## 图像放大 | image-upscale-vary | |
| 该接口对应 Fooocus 中的 Upscale or Variation 功能 | |
| 该接口参数继承自[文生图](#文生图--text-to-image), 因此后面只会列出和[文生图](#文生图--text-to-image)请求参数差异部分 | |
| 此外, 该接口提供了两个版本, 两个版本并无功能上的差异, 主要是请求方式略有区别 | |
| **基础信息:** | |
| ```yaml | |
| EndPoint_V1: /v1/generation/image-upscale-vary | |
| EndPoint_V2: /v2/generation/image-upscale-vary | |
| Method: Post | |
| DataType: form|json | |
| ``` | |
| ### V1 | |
| **请求参数** | |
| | Name | Type | Description | | |
| |------------------|---------------------|---------------------------------------------------------------------------------------------------------------------------| | |
| | input_image | string($binary) | 二进制 str 图像 | | |
| | uov_method | Enum | 'Vary (Subtle)','Vary (Strong)','Upscale (1.5x)','Upscale (2x)','Upscale (Fast 2x)','Upscale (Custom)' | | |
| | upscale_value | float | 默认为 None , 1.0-5.0, 放大倍数, 仅在 'Upscale (Custom)' 中有效 | | |
| | style_selections | List[str] | 以逗号分割的 Fooocus 风格列表 | | |
| | loras | str(List[Lora]) | lora 模型列表, 包含配置, lora 结构: [Lora](#lora), 比如: [{"model_name": "sd_xl_offset_example-lora_1.0.safetensors", "weight": 0.5}] | | |
| | advanced_params | str(AdvancedParams) | 高级参数, AdvancedParams 结构 [AdvancedParams](#高级参数--advanceparams), 以字符串形式发送, 可以为空 | | |
| **响应参数:** | |
| 该接口返回通用响应结构, 参考[响应参数](#响应参数--response) | |
| **请求示例:** | |
| ```python | |
| # 不要加 {"Content-Type": "application/json"} 这个 header | |
| host = "http://127.0.0.1:8888" | |
| image = open("./examples/imgs/bear.jpg", "rb").read() | |
| def upscale_vary(image, params: dict) -> dict: | |
| """ | |
| Upscale or Vary | |
| """ | |
| response = requests.post(url=f"{host}/v1/generation/image-upscale-vary", | |
| data=params, | |
| files={"input_image": image}) | |
| return response.json() | |
| result =upscale_vary(image=image, | |
| params={ | |
| "uov_method": "Upscale (2x)", | |
| "async_process": True | |
| }) | |
| print(json.dumps(result, indent=4, ensure_ascii=False)) | |
| ``` | |
| ### V2 | |
| **请求参数** | |
| | Name | Type | Description | | |
| |---------------|---------------------|-------------------------------------------------------------------------------------------------------------------| | |
| | uov_method | UpscaleOrVaryMethod | 是个枚举类型, 包括 'Vary (Subtle)','Vary (Strong)','Upscale (1.5x)','Upscale (2x)','Upscale (Fast 2x)','Upscale (Custom)' | | |
| | upscale_value | float | 默认为 None , 1.0-5.0, 放大倍数, 仅在 'Upscale (Custom)' 中有效 | | |
| | input_image | str | 输入图像, base64 格式, 或者一个URL | | |
| **响应参数:** | |
| 该接口返回通用响应结构, 参考[响应参数](#响应参数--response) | |
| **请求示例:** | |
| ```python | |
| host = "http://127.0.0.1:8888" | |
| image = open("./examples/imgs/bear.jpg", "rb").read() | |
| def upscale_vary(image, params: dict) -> dict: | |
| """ | |
| Upscale or Vary | |
| """ | |
| params["input_image"] = base64.b64encode(image).decode('utf-8') | |
| response = requests.post(url=f"{host}/v2/generation/image-upscale-vary", | |
| data=json.dumps(params), | |
| headers={"Content-Type": "application/json"}, | |
| timeout=300) | |
| return response.json() | |
| result =upscale_vary(image=image, | |
| params={ | |
| "uov_method": "Upscale (2x)", | |
| "async_process": True | |
| }) | |
| print(json.dumps(result, indent=4, ensure_ascii=False)) | |
| ``` | |
| ## 局部重绘 | image-inpaint-outpaint | |
| **基础信息:** | |
| ```yaml | |
| EndPoint_V1: /v1/generation/image-inpaint-outpaint | |
| EndPoint_V2: /v2/generation/image-inpaint-outpaint | |
| Method: Post | |
| DataType: form|json | |
| ``` | |
| ### V1 | |
| **请求参数** | |
| | Name | Type | Description | | |
| |---------------------------|---------------------|---------------------------------------------------------------------------------------------------------------------------| | |
| | input_image | string($binary) | 二进制 str 图像 | | |
| | input_mask | string($binary) | 二进制 str 图像 | | |
| | inpaint_additional_prompt | string | 附加描述 | | |
| | outpaint_selections | str | 图像扩展方向, 逗号分割的 'Left', 'Right', 'Top', 'Bottom' | | |
| | outpaint_distance_left | int | 图像扩展距离, 默认 0 | | |
| | outpaint_distance_right | int | 图像扩展距离, 默认 0 | | |
| | outpaint_distance_top | int | 图像扩展距离, 默认 0 | | |
| | outpaint_distance_bottom | int | 图像扩展距离, 默认 0 | | |
| | style_selections | List[str] | 以逗号分割的 Fooocus 风格列表 | | |
| | loras | str(List[Lora]) | lora 模型列表, 包含配置, lora 结构: [Lora](#lora), 比如: [{"model_name": "sd_xl_offset_example-lora_1.0.safetensors", "weight": 0.5}] | | |
| | advanced_params | str(AdvancedParams) | 高级参数, AdvancedParams 结构 [AdvancedParams](#高级参数--advanceparams), 以字符串形式发送 | | |
| **响应参数:** | |
| 该接口返回通用响应结构, 参考[响应参数](#响应参数--response) | |
| **请求示例:** | |
| ```python | |
| # 局部重绘 v1 接口示例 | |
| host = "http://127.0.0.1:8888" | |
| image = open("./examples/imgs/bear.jpg", "rb").read() | |
| def inpaint_outpaint(params: dict, input_image: bytes, input_mask: bytes = None) -> dict: | |
| """ | |
| 局部重绘 v1 接口示例 | |
| """ | |
| response = requests.post(url=f"{host}/v1/generation/image-inpaint-outpaint", | |
| data=params, | |
| files={"input_image": input_image, | |
| "input_mask": input_mask}) | |
| return response.json() | |
| # 图片扩展示例 | |
| result = inpaint_outpaint(params={ | |
| "outpaint_selections": "Left,Right", | |
| "async_process": True}, | |
| input_image=image, | |
| input_mask=None) | |
| print(json.dumps(result, indent=4, ensure_ascii=False)) | |
| # 局部重绘示例 | |
| source = open("./examples/imgs/s.jpg", "rb").read() | |
| mask = open("./examples/imgs/m.png", "rb").read() | |
| result = inpaint_outpaint(params={ | |
| "prompt": "a cat", | |
| "async_process": True}, | |
| input_image=source, | |
| input_mask=mask) | |
| print(json.dumps(result, indent=4, ensure_ascii=False)) | |
| ``` | |
| ### V2 | |
| **请求参数** | |
| | Name | Type | Description | | |
| |---------------------------|-------------------------|-----------------------------------------------------------------| | |
| | input_image | str | 输入图像, base64 格式, 或者一个URL | | |
| | input_mask | str | 输入遮罩, base64 格式, 或者一个URL | | |
| | inpaint_additional_prompt | str | 附加描述词 | | |
| | outpaint_selections | List[OutpaintExpansion] | OutpaintExpansion 是一个枚举类型, 值包括 "Left", "Right", "Top", "Bottom" | | |
| | outpaint_distance_left | int | 图像扩展距离, 默认 0 | | |
| | outpaint_distance_right | int | 图像扩展距离, 默认 0 | | |
| | outpaint_distance_top | int | 图像扩展距离, 默认 0 | | |
| | outpaint_distance_bottom | int | 图像扩展距离, 默认 0 | | |
| **响应参数:** | |
| 该接口返回通用响应结构, 参考[响应参数](#响应参数--response) | |
| **请求示例:** | |
| ```python | |
| # 局部重绘 v2 接口示例 | |
| host = "http://127.0.0.1:8888" | |
| image = open("./examples/imgs/bear.jpg", "rb").read() | |
| def inpaint_outpaint(params: dict) -> dict: | |
| """ | |
| 局部重绘 v1 接口示例 | |
| """ | |
| response = requests.post(url=f"{host}/v2/generation/image-inpaint-outpaint", | |
| data=json.dumps(params), | |
| headers={"Content-Type": "application/json"}) | |
| return response.json() | |
| # 图像扩展示例 | |
| result = inpaint_outpaint(params={ | |
| "input_image": base64.b64encode(image).decode('utf-8'), | |
| "input_mask": None, | |
| "outpaint_selections": ["Left", "Right"], | |
| "async_process": True}) | |
| print(json.dumps(result, indent=4, ensure_ascii=False)) | |
| # 局部重绘示例 | |
| source = open("./examples/imgs/s.jpg", "rb").read() | |
| mask = open("./examples/imgs/m.png", "rb").read() | |
| result = inpaint_outpaint(params={ | |
| "prompt": "a cat", | |
| "input_image": base64.b64encode(source).decode('utf-8'), | |
| "input_mask": base64.b64encode(mask).decode('utf-8'), | |
| "async_process": True}) | |
| print(json.dumps(result, indent=4, ensure_ascii=False)) | |
| ``` | |
| ## 图生图 | image-prompt | |
| 该接口更新自 `v0.3.27` 后有重大更新。从继承自 [文生图](#文生图--text-to-image) 更改为继承自 [局部重绘](#局部重绘--image-inpaint-outpaint) | |
| 该版本之后可以通过该接口实现 `inpaint_outpaint` 以及 `image-prompt` 接口的功能 | |
| > 多功能接口,并非可以同时实现 `inpaint_outpaint` 以及 `image-prompt` 接口的功能 | |
| **基础信息:** | |
| ```yaml | |
| EndPoint_V1: /v1/generation/image-prompt | |
| EndPoint_V2: /v2/generation/image-prompt | |
| Method: Post | |
| DataType: form|json | |
| ``` | |
| ### V1 | |
| **请求参数** | |
| > 注意: 虽然接口更改为继承自[局部重绘](#局部重绘--image-inpaint-outpaint), 但下方表格展示的仍然继承自[文生图](#文生图--text-to-image), 但参数是完整的 | |
| | Name | Type | Description | | |
| |---------------------------|---------------------|---------------------------------------------------------------------------------------------------------------------------| | |
| | input_image | Bytes | 二进制图像, 用于局部重绘 | | |
| | input_mask | Bytes | 二进制图像遮罩, 用于局部重绘 | | |
| | inpaint_additional_prompt | str | inpaint 附加提示词 | | |
| | outpaint_selections | str | 图像扩展选项, 逗号分割的 "Left", "Right", "Top", "Bottom" | | |
| | outpaint_distance_left | int | 图像扩展距离, 默认 0 | | |
| | outpaint_distance_right | int | 图像扩展距离, 默认 0 | | |
| | outpaint_distance_top | int | 图像扩展距离, 默认 0 | | |
| | outpaint_distance_bottom | int | 图像扩展距离, 默认 0 | | |
| | cn_img1 | string($binary) | 二进制 str 图像 | | |
| | cn_stop1 | float | 默认 0.6 | | |
| | cn_weight1 | float | 默认 0.6 | | |
| | cn_type1 | Enum | "ImagePrompt", "FaceSwap", "PyraCanny", "CPDS" 中的一个 | | |
| | cn_img2 | string($binary) | 二进制 str 图像 | | |
| | cn_stop2 | float | 默认 0.6 | | |
| | cn_weight2 | float | 默认 0.6 | | |
| | cn_type2 | Enum | "ImagePrompt", "FaceSwap", "PyraCanny", "CPDS" 中的一个 | | |
| | cn_img3 | string($binary) | 二进制 str 图像 | | |
| | cn_stop3 | float | 默认 0.6 | | |
| | cn_weight3 | float | 默认 0.6 | | |
| | cn_type3 | Enum | "ImagePrompt", "FaceSwap", "PyraCanny", "CPDS" 中的一个 | | |
| | cn_img4 | string($binary) | 二进制 str 图像 | | |
| | cn_stop4 | float | 默认 0.6 | | |
| | cn_weight4 | float | 默认 0.6 | | |
| | cn_type4 | Enum | "ImagePrompt", "FaceSwap", "PyraCanny", "CPDS" 中的一个 | | |
| | style_selections | List[str] | 以逗号分割的 Fooocus 风格列表 | | |
| | loras | str(List[Lora]) | lora 模型列表, 包含配置, lora 结构: [Lora](#lora), 比如: [{"model_name": "sd_xl_offset_example-lora_1.0.safetensors", "weight": 0.5}] | | |
| | advanced_params | str(AdvancedParams) | 高级参数, AdvancedParams 结构 [AdvancedParams](#高级参数--advanceparams), 以字符串形式发送 | | |
| **响应参数:** | |
| 该接口返回通用响应结构, 参考[响应参数](#响应参数--response) | |
| **请求示例:** | |
| ```python | |
| # image_prompt v1 接口示例 | |
| host = "http://127.0.0.1:8888" | |
| image = open("./examples/imgs/bear.jpg", "rb").read() | |
| source = open("./examples/imgs/s.jpg", "rb").read() | |
| mask = open("./examples/imgs/m.png", "rb").read() | |
| def image_prompt(params: dict, | |
| input_image: bytes=None, | |
| input_mask: bytes=None, | |
| cn_img1: bytes=None, | |
| cn_img2: bytes=None, | |
| cn_img3: bytes=None, | |
| cn_img4: bytes=None,) -> dict: | |
| """ | |
| image prompt | |
| """ | |
| response = requests.post(url=f"{host}/v1/generation/image-prompt", | |
| data=params, | |
| files={ | |
| "input_image": input_image, | |
| "input_mask": input_mask, | |
| "cn_img1": cn_img1, | |
| "cn_img2": cn_img2, | |
| "cn_img3": cn_img3, | |
| "cn_img4": cn_img4, | |
| }) | |
| return response.json() | |
| # 图像扩展 | |
| params = { | |
| "outpaint_selections": ["Left", "Right"], | |
| "image_prompts": [] # 必传参数,可以为空列表 | |
| } | |
| result = image_prompt(params=params, input_iamge=image) | |
| print(json.dumps(result, indent=4, ensure_ascii=False)) | |
| # 局部重绘 | |
| params = { | |
| "prompt": "1girl sitting on the chair", | |
| "image_prompts": [], # 必传参数,可以为空列表 | |
| "async_process": True | |
| } | |
| result = image_prompt(params=params, input_iamge=source, input_mask=mask) | |
| print(json.dumps(result, indent=4, ensure_ascii=False)) | |
| # image prompt | |
| params = { | |
| "prompt": "1girl sitting on the chair", | |
| "image_prompts": [ | |
| { | |
| "cn_stop": 0.6, | |
| "cn_weight": 0.6, | |
| "cn_type": "ImagePrompt" | |
| },{ | |
| "cn_stop": 0.6, | |
| "cn_weight": 0.6, | |
| "cn_type": "ImagePrompt" | |
| }] | |
| } | |
| result = image_prompt(params=params, cn_img1=image, cn_img2=source) | |
| print(json.dumps(result, indent=4, ensure_ascii=False)) | |
| ``` | |
| ### V2 | |
| **请求参数** | |
| | Name | Type | Description | | |
| |---------------------------|-------------------------|------------------------------------------------| | |
| | input_image | str | base64 图像, 或者一个URL, 用于局部重绘 | | |
| | input_mask | str | base64 图像遮罩, 或者一个URL, 用于局部重绘 | | |
| | inpaint_additional_prompt | str | inpaint 附加提示词 | | |
| | outpaint_selections | List[OutpaintExpansion] | 图像扩展选项, 逗号分割的 "Left", "Right", "Top", "Bottom" | | |
| | outpaint_distance_left | int | 图像扩展距离, 默认 0 | | |
| | outpaint_distance_right | int | 图像扩展距离, 默认 0 | | |
| | outpaint_distance_top | int | 图像扩展距离, 默认 0 | | |
| | outpaint_distance_bottom | int | 图像扩展距离, 默认 0 | | |
| | image_prompts | List[ImagePrompt] | 图像列表, 包含配置, ImagePrompt 结构如下: | | |
| **ImagePrompt** | |
| | Name | Type | Description | | |
| |-----------|----------------|---------------------------------------------------------------------| | |
| | cn_img | str | 输入图像, base64 编码, 或者一个URL | | |
| | cn_stop | float | 停止位置, 范围 0-1, 默认 0.5 | | |
| | cn_weight | float | 权重, 范围 0-2, 默认 1.0 | | |
| | cn_type | ControlNetType | 控制网络类型, 是一个枚举类型, 包括: "ImagePrompt", "FaceSwap", "PyraCanny", "CPDS" | | |
| **响应参数:** | |
| 该接口返回通用响应结构, 参考[响应参数](#响应参数--response) | |
| **请求示例:** | |
| ```python | |
| # image_prompt v2 接口示例 | |
| host = "http://127.0.0.1:8888" | |
| image = open("./examples/imgs/bear.jpg", "rb").read() | |
| source = open("./examples/imgs/s.jpg", "rb").read() | |
| mask = open("./examples/imgs/m.png", "rb").read() | |
| def image_prompt(params: dict) -> dict: | |
| """ | |
| image prompt | |
| """ | |
| response = requests.post(url=f"{host}/v2/generation/image-prompt", | |
| data=json.dumps(params), | |
| headers={"Content-Type": "application/json"}) | |
| return response.json() | |
| # 图像扩展 | |
| params = { | |
| "input_image": base64.b64encode(image).decode('utf-8'), | |
| "outpaint_selections": ["Left", "Right"], | |
| "image_prompts": [] # 必传参数,可以为空列表 | |
| } | |
| result = image_prompt(params) | |
| print(json.dumps(result, indent=4, ensure_ascii=False)) | |
| # 局部重绘 | |
| params = { | |
| "prompt": "1girl sitting on the chair", | |
| "input_image": base64.b64encode(source).decode('utf-8'), | |
| "input_mask": base64.b64encode(mask).decode('utf-8'), | |
| "image_prompts": [], # 必传参数,可以为空列表 | |
| "async_process": True | |
| } | |
| result = image_prompt(params) | |
| print(json.dumps(result, indent=4, ensure_ascii=False)) | |
| # image prompt | |
| params = { | |
| "prompt": "1girl sitting on the chair", | |
| "image_prompts": [ | |
| { | |
| "cn_img": base64.b64encode(source).decode('utf-8'), | |
| "cn_stop": 0.6, | |
| "cn_weight": 0.6, | |
| "cn_type": "ImagePrompt" | |
| },{ | |
| "cn_img": base64.b64encode(image).decode('utf-8'), | |
| "cn_stop": 0.6, | |
| "cn_weight": 0.6, | |
| "cn_type": "ImagePrompt" | |
| }] | |
| } | |
| result = image_prompt(params) | |
| print(json.dumps(result, indent=4, ensure_ascii=False)) | |
| ``` | |
| ## text to image with image prompt | |
| 该接口暂无 v1 版本 | |
| **基础信息:** | |
| ```yaml | |
| EndPoint: /v2/generation/text-to-image-with-ip | |
| Method: Post | |
| DataType: json | |
| ``` | |
| **请求参数** | |
| | Name | Type | Description | | |
| |---------------|-------------------|-------------| | |
| | image_prompts | List[ImagePrompt] | 图像列表 | | |
| **请求示例**: | |
| ```python | |
| # text to image with image prompt 示例 | |
| host = "http://127.0.0.1:8888" | |
| image = open("./examples/imgs/bear.jpg", "rb").read() | |
| source = open("./examples/imgs/s.jpg", "rb").read() | |
| def image_prompt(params: dict) -> dict: | |
| """ | |
| image prompt | |
| """ | |
| response = requests.post(url=f"{host}/v2/generation/text-to-image-with-ip", | |
| data=json.dumps(params), | |
| headers={"Content-Type": "application/json"}) | |
| return response.json() | |
| params = { | |
| "prompt": "A bear", | |
| "image_prompts": [ | |
| { | |
| "cn_img": base64.b64encode(source).decode('utf-8'), | |
| "cn_stop": 0.6, | |
| "cn_weight": 0.6, | |
| "cn_type": "ImagePrompt" | |
| },{ | |
| "cn_img": base64.b64encode(image).decode('utf-8'), | |
| "cn_stop": 0.6, | |
| "cn_weight": 0.6, | |
| "cn_type": "ImagePrompt" | |
| } | |
| ] | |
| } | |
| result = image_prompt(params) | |
| print(json.dumps(result, indent=4, ensure_ascii=False)) | |
| ``` | |
| ## 图像反推 | describe | |
| **基础信息:** | |
| ```yaml | |
| EndPoint: /v1/tools/describe-image | |
| Method: Post | |
| DataType: form | |
| ``` | |
| **请求参数** | |
| | Name | Type | Description | | |
| |------|------|-----------------------------| | |
| | type | Enum | 反推类型, "Photo", "Anime" 中的一个 | | |
| **请求示例**: | |
| ```python | |
| def describe_image(image: bytes, | |
| params: dict = {"type": "Photo"}) -> dict: | |
| """ | |
| describe-image | |
| """ | |
| response = requests.post(url="http://127.0.0.1:8888/v1/tools/describe-image", | |
| params=params, | |
| files={ | |
| "image": image | |
| }, | |
| timeout=30) | |
| return response.json() | |
| ``` | |
| **响应示例**: | |
| ```python | |
| { | |
| "describe": "a young woman posing with her hands behind her head" | |
| } | |
| ``` | |
| -------------------------------------------- | |
| ## 列出模型 | all-models | |
| **基础信息:** | |
| ```yaml | |
| EndPoint: /v1/engines/all-models | |
| Method: Get | |
| ``` | |
| **请求示例**: | |
| ```python | |
| def all_models() -> dict: | |
| """ | |
| all-models | |
| """ | |
| response = requests.get(url="http://127.0.0.1:8888/v1/engines/all-models", | |
| timeout=30) | |
| return response.json() | |
| ``` | |
| **响应示例**: | |
| ```python | |
| { | |
| "model_filenames": [ | |
| "juggernautXL_version6Rundiffusion.safetensors", | |
| "sd_xl_base_1.0_0.9vae.safetensors", | |
| "sd_xl_refiner_1.0_0.9vae.safetensors" | |
| ], | |
| "lora_filenames": [ | |
| "sd_xl_offset_example-lora_1.0.safetensors" | |
| ] | |
| } | |
| ``` | |
| ## 刷新模型 | refresh-models | |
| **基础信息:** | |
| > 该接口已移除,功能合并到 [列出模型](#列出模型--all-models) | |
| ```yaml | |
| EndPoint: /v1/engines/refresh-models | |
| Method: Post | |
| ``` | |
| **请求示例** | |
| ```python | |
| def refresh() -> dict: | |
| """ | |
| refresh-models | |
| """ | |
| response = requests.post(url="http://127.0.0.1:8888/v1/engines/refresh-models", | |
| timeout=30) | |
| return response.json() | |
| ``` | |
| **响应示例** | |
| ```python | |
| { | |
| "model_filenames": [ | |
| "juggernautXL_version6Rundiffusion.safetensors", | |
| "sd_xl_base_1.0_0.9vae.safetensors", | |
| "sd_xl_refiner_1.0_0.9vae.safetensors" | |
| ], | |
| "lora_filenames": [ | |
| "sd_xl_offset_example-lora_1.0.safetensors" | |
| ] | |
| } | |
| ``` | |
| ## 样式 | styles | |
| **基础信息:** | |
| ```yaml | |
| EndPoint: /v1/engines/styles | |
| Method: Get | |
| ``` | |
| **请求示例**: | |
| ```python | |
| def styles() -> dict: | |
| """ | |
| styles | |
| """ | |
| response = requests.get(url="http://127.0.0.1:8888/v1/engines/styles", | |
| timeout=30) | |
| return response.json() | |
| ``` | |
| **响应示例**: | |
| ```python | |
| [ | |
| "Fooocus V2", | |
| "Fooocus Enhance", | |
| ... | |
| "Watercolor 2", | |
| "Whimsical And Playful" | |
| ] | |
| ``` | |
| # Fooocus API 任务相关接口 | |
| ## 任务队列 | job-queue | |
| **基础信息:** | |
| ```yaml | |
| EndPoint: /v1/engines/job-queue | |
| Method: Get | |
| ``` | |
| **请求示例**: | |
| ```python | |
| def job_queue() -> dict: | |
| """ | |
| job-queue | |
| """ | |
| response = requests.get(url="http://127.0.0.1:8888/v1/generation/job-queue", | |
| timeout=30) | |
| return response.json() | |
| ``` | |
| **响应示例**: | |
| ```python | |
| { | |
| "running_size": 0, | |
| "finished_size": 1, | |
| "last_job_id": "cac3914a-926d-4b6f-a46a-83794a0ce1d4" | |
| } | |
| ``` | |
| ## 查询任务 | query-job | |
| **基础信息:** | |
| ```yaml | |
| EndPoint: /v1/generation/query-job | |
| Method: Get | |
| ``` | |
| **请求示例**: | |
| ```python | |
| def taskResult(task_id: str) -> dict: | |
| # 获取任务状态 | |
| task_status = requests.get(url="http://127.0.0.1:8888/v1/generation/query-job", | |
| params={"job_id": task_id, | |
| "require_step_preview": False}, | |
| timeout=30) | |
| return task_status.json() | |
| ``` | |
| **响应示例**: | |
| ```python | |
| { | |
| "job_id": "cac3914a-926d-4b6f-a46a-83794a0ce1d4", | |
| "job_type": "Text to Image", | |
| "job_stage": "SUCCESS", | |
| "job_progress": 100, | |
| "job_status": "Finished", | |
| "job_step_preview": null, | |
| "job_result": [ | |
| { | |
| "base64": null, | |
| "url": "http://127.0.0.1:8888/files/2023-11-27/b928e50e-3c09-4187-a3f9-1c12280bfd95.png", | |
| "seed": 8228839561385006000, | |
| "finish_reason": "SUCCESS" | |
| } | |
| ] | |
| } | |
| ``` | |
| ## 查询任务历史 | job-history | |
| **基础信息:** | |
| ```yaml | |
| EndPoint: /v1/generation/job-history | |
| Method: get | |
| ``` | |
| **请求示例**: | |
| ```python | |
| def job-history() -> dict: | |
| """ | |
| job-history | |
| """ | |
| response = requests.get(url="http://127.0.0.1:8888/v1/generation/job-history", | |
| timeout=30) | |
| return response.json() | |
| ``` | |
| **响应示例**: | |
| ```python | |
| { | |
| "queue": [], | |
| "history": [ | |
| "job_id": "cac3914a-926d-4b6f-a46a-83794a0ce1d4", | |
| "is_finished": True | |
| ] | |
| } | |
| ``` | |
| ## 停止任务 | stop | |
| **基础信息:** | |
| ```yaml | |
| EndPoint: /v1/generation/stop | |
| Method: post | |
| ``` | |
| **请求示例**: | |
| ```python | |
| def stop() -> dict: | |
| """ | |
| stop | |
| """ | |
| response = requests.post(url="http://127.0.0.1:8888/v1/generation/stop", | |
| timeout=30) | |
| return response.json() | |
| ``` | |
| **响应示例**: | |
| ```python | |
| { | |
| "msg": "success" | |
| } | |
| ``` | |
| ## ping | |
| **基础信息:** | |
| ```yaml | |
| EndPoint: /ping | |
| Method: get | |
| ``` | |
| pong | |
| # webhook | |
| 你可以在命令行通过 `--webhook-url` 指定一个地址,以便异步任务完成之后可以收到通知 | |
| 下面是一个简单的示例来展示 `webhook` 是如何工作的 | |
| 首先,使用下面的代码启动一个简易服务器: | |
| ```python | |
| from fastapi import FastAPI | |
| import uvicorn | |
| app = FastAPI() | |
| @app.post("/status") | |
| async def status(requests: dict): | |
| print(requests) | |
| uvicorn.run(app, host="0.0.0.0", port=8000) | |
| ``` | |
| 然后, 在启动 Fooocus API 时添加 `--webhook-url http://host:8000/status` | |
| 通过任意方式提交一个任务, 等完成后你会在这个简易服务器的后台看到任务结束信息: | |
| ```python | |
| {'job_id': '717ec0b5-85df-4174-80d6-bddf93cd8248', 'job_result': [{'url': 'http://127.0.0.1:8888/files/2023-12-29/f1eca704-718e-4781-9d5f-82d41aa799d7.png', 'seed': '3283449865282320931'}]} | |
| ``` | |
| # 公共请求体 | |
| ## 高级参数 | AdvanceParams | |
| | Name | Type | Description | | |
| |--------------------------------------|-------|-----------------------------------------------------------------------| | |
| | disable_preview | bool | 是否禁用预览, 默认 False | | |
| | disable_intermediate_results | bool | 是否禁用中间结果, 默认 False | | |
| | disable_seed_increment | bool | 是否禁用种子递增, 默认 False | | |
| | adm_scaler_positive | float | 正 ADM Guidance Scaler, 默认 1.5, 范围 0.1-3.0 | | |
| | adm_scaler_negative | float | 负 ADM Guidance Scaler, 默认 0.8, 范围 0.1-3.0 | | |
| | adm_scaler_end | float | ADM Guidance Scaler 结束值, 默认 0.5, 范围 0.0-1.0 | | |
| | refiner_swap_method | str | 优化模型交换方法, 默认 `joint` | | |
| | adaptive_cfg | float | CFG Mimicking from TSNR, 默认 7.0, 范围 1.0-30.0 | | |
| | sampler_name | str | 采样器, 默认 `default_sampler` | | |
| | scheduler_name | str | 调度器, 默认 `default_scheduler` | | |
| | overwrite_step | int | Forced Overwrite of Sampling Step, 默认 -1, 范围 -1-200 | | |
| | overwrite_switch | int | Forced Overwrite of Refiner Switch Step, 默认 -1, 范围 -1-200 | | |
| | overwrite_width | int | Forced Overwrite of Generating Width, 默认 -1, 范围 -1-2048 | | |
| | overwrite_height | int | Forced Overwrite of Generating Height, 默认 -1, 范围 -1-2048 | | |
| | overwrite_vary_strength | float | Forced Overwrite of Denoising Strength of "Vary", 默认 -1, 范围 -1-1.0 | | |
| | overwrite_upscale_strength | float | Forced Overwrite of Denoising Strength of "Upscale", 默认 -1, 范围 -1-1.0 | | |
| | mixing_image_prompt_and_vary_upscale | bool | Mixing Image Prompt and Vary/Upscale, 默认 False | | |
| | mixing_image_prompt_and_inpaint | bool | Mixing Image Prompt and Inpaint, 默认 False | | |
| | debugging_cn_preprocessor | bool | Debug Preprocessors, 默认 False | | |
| | skipping_cn_preprocessor | bool | Skip Preprocessors, 默认 False | | |
| | controlnet_softness | float | Softness of ControlNet, 默认 0.25, 范围 0.0-1.0 | | |
| | canny_low_threshold | int | Canny Low Threshold, 默认 64, 范围 1-255 | | |
| | canny_high_threshold | int | Canny High Threshold, 默认 128, 范围 1-255 | | |
| | freeu_enabled | bool | FreeU enabled, 默认 False | | |
| | freeu_b1 | float | FreeU B1, 默认 1.01 | | |
| | freeu_b2 | float | FreeU B2, 默认 1.02 | | |
| | freeu_s1 | float | FreeU B3, 默认 0.99 | | |
| | freeu_s2 | float | FreeU B4, 默认 0.95 | | |
| | debugging_inpaint_preprocessor | bool | Debug Inpaint Preprocessing, 默认 False | | |
| | inpaint_disable_initial_latent | bool | Disable initial latent in inpaint, 默认 False | | |
| | inpaint_engine | str | Inpaint Engine, 默认 `v2.6` | | |
| | inpaint_strength | float | Inpaint Denoising Strength, 默认 1.0, 范围 0.0-1.0 | | |
| | inpaint_respective_field | float | Inpaint Respective Field, 默认 1.0, 范围 0.0-1.0 | | |
| | inpaint_mask_upload_checkbox | bool | 是否上传掩码图片, 默认 False | | |
| | invert_mask_checkbox | bool | 是否反转掩码, 默认 False | | |
| | inpaint_erode_or_dilate | int | Mask Erode or Dilate, 默认 0, 范围 -64-64 | | |
| ## lora | |
| | Name | Type | Description | | |
| |------------|-------|-------------| | |
| | enabled | bool | 是否启用lora | | |
| | model_name | str | 模型名称 | | |
| | weight | float | 权重, 默认 0.5 | | |
| ## 响应参数 | response | |
| 成功响应: | |
| **async_process: True** | |
| | Name | Type | Description | | |
| |------------------|-------|-------------| | |
| | job_id | int | 任务ID | | |
| | job_type | str | 任务类型 | | |
| | job_stage | str | 任务阶段 | | |
| | job_progress | float | 任务进度 | | |
| | job_status | str | 任务状态 | | |
| | job_step_preview | str | 任务预览 | | |
| | job_result | str | 任务结果 | | |
| **async_process: False** | |
| | Name | Type | Description | | |
| |---------------|------|----------------------------------------------| | |
| | base64 | str | 图片base64编码, 根据 `require_base64` 参数决定是否为 null | | |
| | url | str | 图片url | | |
| | seed | int | 图片种子 | | |
| | finish_reason | str | 任务结束原因 | | |
| 失败响应: | |