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 | 任务结束原因 | | |
失败响应: | |