🎨 NovelAI API

强大的图片生成 API,兼容 OpenAI 格式,轻松集成到您的应用中

📋 目录

🤖 支持的模型

当前支持以下 NovelAI 模型,每个模型都有其独特的风格和特点:

nai-diffusion-furry-3
nai-diffusion-3
nai-diffusion-4-full
nai-diffusion-4-curated-preview
nai-diffusion-4-5-full
nai-diffusion-4-5-curated

🔗 API 端点

GET /v1/models

获取所有可用的模型列表。

响应示例

{
  "object": "list",
  "data": [
    {
      "id": "nai-diffusion-4-5-full",
      "object": "model",
      "created": 0,
      "owned_by": "novelai"
    }
  ]
}
POST /v1/chat/completions

生成图片。兼容 OpenAI Chat Completions API 格式,支持流式和非流式响应。

POST /generate

兼容官方 NovelAI 图片接口格式,接受 input/model/action/parameters 等字段,请求完成后返回图片地址(JSON 中包含 url)。

请求参数(/generate)

参数 类型 必填 说明
inputtag string 必填 图片生成的提示词
model string 可选 模型名称,默认为 nai-diffusion-4-5-full
action string 可选 操作类型,固定为 generate
parameters.return_base64return_base64 boolean 可选 是否返回 base64 格式(true/false),默认为 false。设置为 true 时,返回的 url 字段将是 base64 编码的 data URI。
parameters.width / parameters.height number 可选 图片宽度和高度
parameters.scale / parameters.cfg number 可选 CFG Scale,默认为 5
parameters.steps number 可选 采样步数,默认为 28
parameters.sampler string 可选 采样器名称,默认为 k_euler_ancestral
parameters.negative_prompt string 可选 反向提示词

响应示例(/generate)

默认返回 URL:

{
  "status": "success",
  "url": "/img/xxxxxxxxxxxxxxxx.png"
}

返回 base64 格式(当 return_base64: true 时):

{
  "status": "success",
  "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
}

🖼️ 图片生成接口

请求参数

参数 类型 必填 说明
model string 必填 要使用的模型 ID,从 /v1/models 获取
messages array 必填 消息数组,最后一条 role: "user" 的消息内容将作为图片生成的提示词(prompt)
stream boolean 可选 是否使用流式响应,默认为 false 推荐
sizeimage_size string 可选 图片尺寸,支持:832:12161216:8321024:1024。如果不提供,将从提示词中解析或使用默认尺寸 1216x832
negative_prompt string 可选 反向提示词(负面提示词),用于指定不希望出现在图片中的内容。如果不提供,将使用默认的反向提示词
sampler string 可选 采样器,支持:Euler Ancestral(默认)、EulerDPM++ 2S AncestralDPM++ 2M SDEDPM++ 2MDPM++ SDE

📐 图片尺寸控制

您可以直接在提示词中指定图片尺寸,系统会自动识别并应用。如果不指定尺寸,将使用默认尺寸 1216x832

支持的尺寸格式
  • 832:1216 - 竖版图片(宽 832px,高 1216px)
  • 1216:832 - 横版图片(宽 1216px,高 832px)
  • 1024:1024 - 正方形图片(宽 1024px,高 1024px)

尺寸格式说明:

尺寸控制示例

// 示例 1: 直接连接
"content": "美女1024:1024"

// 示例 2: 带空格
"content": "美女 1024:1024"

// 示例 3: 使用 * 号
"content": "landscape 832*1216"

// 示例 4: 尺寸在中间
"content": "1024:1024 beautiful sunset"

// 示例 5: 不指定尺寸(使用默认 1216x832)
"content": "a beautiful landscape"
注意事项
  • 只支持上述 3 种尺寸配置,其他尺寸会返回错误
  • 尺寸格式必须为 宽度:高度宽度*高度
  • 如果提示词中不包含尺寸信息,将使用默认尺寸 1216x832

请求示例(非流式)

POST /v1/chat/completions
Content-Type: application/json

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "a beautiful landscape with mountains and lakes"
    }
  ]
}

请求示例(带尺寸参数)

POST /v1/chat/completions
Content-Type: application/json

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "a beautiful landscape"
    }
  ],
  "size": "1024:1024"
}

请求示例(带反向提示词)

POST /v1/chat/completions
Content-Type: application/json

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "a beautiful landscape"
    }
  ],
  "negative_prompt": "blurry, lowres, bad quality, worst quality, ugly, deformed"
}

请求示例(完整参数)

POST /v1/chat/completions
Content-Type: application/json

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "a beautiful landscape"
    }
  ],
  "size": "1024:1024",
  "negative_prompt": "blurry, lowres, bad quality",
  "stream": true
}

响应示例(非流式)

{
  "id": "nai-img-1234567890",
  "object": "chat.completion",
  "created": 1234567890,
  "model": "nai-diffusion-4-5-full",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "http://your-domain.com/img/abc123.png"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 0,
    "completion_tokens": 0,
    "total_tokens": 0
  }
}

流式响应

stream: true 时,API 会返回 Server-Sent Events (SSE) 格式的流式响应,提供实时的生成进度反馈。

请求示例(流式)

POST /v1/chat/completions
Content-Type: application/json

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "a beautiful landscape with mountains and lakes"
    }
  ],
  "stream": true
}

流式响应格式

流式响应会发送多个事件:

  1. 排队提示:当所有 Token 都在使用时,会发送排队消息
  2. 进度更新:生成过程中的进度提示(10%, 30%, 60%, 90%)
  3. 最终结果:包含图片 URL 的 Markdown 格式链接
  4. 完成提示:生成完成的确认消息
  5. 结束标记[DONE]
data: {"id":"","object":"chat.completion.chunk","created":1234567890,"model":"nai-diffusion-4-5-full","choices":[{"index":0,"delta":{"role":"assistant","reasoning_content":"🎨 正在生成图片,进度 30%"},"finish_reason":null}]}

data: {"id":"","object":"chat.completion.chunk","created":1234567890,"model":"nai-diffusion-4-5-full","choices":[{"index":0,"delta":{"role":"assistant","content":"![image_0](http://your-domain.com/img/abc123.png)\n"},"finish_reason":"stop"}]}

data: {"id":"","object":"chat.completion.chunk","created":1234567890,"model":"nai-diffusion-4-5-full","choices":[{"index":0,"delta":{"role":"assistant","content":"✅ 图片生成完成!"},"finish_reason":null}]}

data: [DONE]

🚀 进阶玩法

本节介绍如何使用高级功能来获得更好的图片生成效果。

1. 图片尺寸控制

您可以通过两种方式指定图片尺寸:

支持的三种预设尺寸:

方式一:使用 size 参数(推荐)

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "beautiful portrait"
    }
  ],
  "size": "1024:1024"
}

方式二:在提示词中指定

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "beautiful portrait 1024:1024"
    }
  ]
}
提示
  • 推荐使用 size 参数,这样提示词更清晰,不会被尺寸信息干扰
  • 如果同时提供了 size 参数和在提示词中指定尺寸,优先使用 size 参数
  • 支持使用 :* 作为分隔符
  • 如果使用提示词方式,尺寸信息会自动从提示词中移除
  • 如果不指定尺寸,默认使用 1216x832

2. 反向提示词(Negative Prompt)

使用反向提示词可以排除不希望出现在图片中的元素,提高生成质量。

反向提示词示例

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "a beautiful sunset over the ocean"
    }
  ],
  "negative_prompt": "blurry, lowres, bad quality, worst quality, ugly, deformed, low quality, jpeg artifacts"
}
提示
  • 如果不提供 negative_prompt,系统会使用默认的反向提示词
  • 反向提示词使用逗号分隔多个关键词
  • 常用的反向提示词包括:blurrylowresbad qualityworst qualityuglydeformed

3. 组合使用

将尺寸控制和反向提示词结合使用,可以获得最佳效果:

完整示例(推荐方式)

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "beautiful anime girl, best quality, very aesthetic"
    }
  ],
  "size": "832:1216",
  "negative_prompt": "blurry, lowres, bad quality, worst quality, ugly, deformed, low quality, jpeg artifacts, watermark, signature, text",
  "stream": true
}

完整示例(提示词方式)

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "beautiful anime girl, best quality, very aesthetic 832:1216"
    }
  ],
  "negative_prompt": "blurry, lowres, bad quality, worst quality, ugly, deformed, low quality, jpeg artifacts, watermark, signature, text",
  "stream": true
}

4. 流式响应

使用流式响应可以获得实时的生成进度反馈,提升用户体验:

流式响应示例

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "epic fantasy landscape"
    }
  ],
  "size": "1216:832",
  "negative_prompt": "blurry, lowres, bad quality",
  "stream": true
}

流式响应会返回以下事件:

  1. 排队提示:当所有 Token 都在使用时
  2. 进度更新:10%, 30%, 60%, 90%
  3. 最终结果:包含图片 URL
  4. 完成提示:生成完成确认
  5. 结束标记[DONE]

5. 采样器自定义

不同的采样器会产生不同的生成效果和风格:

采样器使用示例

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "detailed fantasy landscape"
    }
  ],
  "size": "1216:832",
  "sampler": "DPM++ 2M SDE",
  "negative_prompt": "blurry, lowres, bad quality"
}
提示
  • 可以使用友好名称(如 "Euler Ancestral")或代码名称(如 "k_euler_ancestral"
  • 系统会自动将友好名称转换为对应的代码名称
  • 如果不指定采样器,默认使用 Euler Ancestral
  • 不同采样器可能需要不同的步数才能达到最佳效果

6. Parameter{...} 高级参数语法

您可以在提示词中使用 Parameter{...} 语法来指定多个图片生成参数,这样可以在一个提示词中同时设置图片大小、反向提示词、采样器等所有参数。

语法格式

Parameter{参数名1:值1,参数名2:值2,...}

支持的参数

参数名 说明 示例值
sizeimage_size 图片尺寸 1024:1024, 832:1216, 1216:832
width 图片宽度 1024
height 图片高度 1024
negative_promptnegative 反向提示词 low quality, blurry
sampler 采样器名称 Euler Ancestral, k_euler_ancestral
scalecfgcfg_scale CFG Scale(引导强度) 7.0
steps 采样步数 28, 50
seed 随机种子 12345
model 模型名称 nai-diffusion-4-5-full
return_base64base64 是否返回 base64 格式(true/false) true, false

使用示例

示例 1:基本用法

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "beautiful landscape Parameter{size:1024:1024,negative_prompt:low quality,steps:50}"
    }
  ]
}

示例 2:多个参数组合

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "anime girl Parameter{size:832:1216,sampler:Euler Ancestral,scale:7,steps:28,negative_prompt:blurry,low quality}"
    }
  ]
}

示例 3:使用 width 和 height

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "portrait Parameter{width:1024,height:1024,scale:7.5,steps:40}"
    }
  ]
}

示例 4:在 Parameter{...} 中指定模型

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "artistic portrait Parameter{model:nai-diffusion-4-5-curated,size:1024:1024,scale:7.5}"
    }
  ]
}

在这个例子中,虽然请求中指定了 nai-diffusion-4-5-full,但实际会使用 nai-diffusion-4-5-curated(Parameter{...} 中的模型)。

示例 5:完整参数(包含模型)

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "fantasy scene Parameter{model:nai-diffusion-4-5-curated,size:1216:832,sampler:DPM++ 2M SDE,scale:8,steps:50,negative_prompt:blurry,lowres,bad quality,seed:12345}"
    }
  ]
}

示例 6:不指定模型(使用请求中的模型)

{
  "model": "nai-diffusion-4-5-curated",
  "messages": [
    {
      "role": "user",
      "content": "beautiful landscape Parameter{size:1024:1024,steps:50,negative_prompt:low quality}"
    }
  ]
}

在这个例子中,Parameter{...} 中没有指定模型,所以会使用请求中的 nai-diffusion-4-5-curated

示例 7:返回 base64 格式(进阶玩法)

{
  "model": "nai-diffusion-4-5-full",
  "messages": [
    {
      "role": "user",
      "content": "anime girl Parameter{size:832:1216,return_base64:true}"
    }
  ]
}

或者直接在请求参数中指定:

{
  "model": "nai-diffusion-4-5-full",
  "return_base64": true,
  "messages": [
    {
      "role": "user",
      "content": "anime girl Parameter{size:832:1216}"
    }
  ]
}

return_base64 设置为 true 时,返回的图片内容将是 base64 编码的 data URI 格式(data:image/png;base64,...),而不是 URL。这样可以避免下载图片时的延迟,直接在前端显示图片。

重要提示
  • 模型参数优先级:Parameter{...} 中的 model > 请求中的 model > 默认值。如果 Parameter{...} 中指定了 model,会优先使用它;如果没有指定,则使用请求中的 model 参数。
  • 其他参数优先级:对于其他参数(如 size、negative_prompt、sampler、return_base64 等),优先级为:请求参数 > Parameter{...} > 默认值。
  • return_base64 参数:当设置为 true 时,返回 base64 编码的图片(data URI 格式),而不是 URL。这样可以避免下载延迟,直接在前端显示图片。默认值为 false
  • 参数格式:参数名和值之间使用冒号 : 分隔,多个参数之间使用逗号 , 分隔。
  • 值中包含逗号:如果参数值中包含逗号(如反向提示词),系统会自动处理。
  • 自动清理:Parameter{...} 部分会自动从提示词中移除,不会影响图片生成。
  • 向后兼容:如果提示词中没有 Parameter{...},系统会继续使用原有的尺寸解析方式(如 1024:1024)。

7. 不同模型的选择

不同模型适合不同的场景:

模型选择示例

{
  "model": "nai-diffusion-4-5-curated",
  "messages": [
    {
      "role": "user",
      "content": "artistic painting style portrait"
    }
  ],
  "size": "1024:1024",
  "negative_prompt": "photorealistic, photo, photograph"
}
注意事项
  • 只有 nai-diffusion-4-5-fullnai-diffusion-4-5-curated 支持流式响应
  • 旧版本模型(4 及以下)返回的是 ZIP 压缩包格式,系统会自动处理
  • 不同模型对提示词的理解可能略有不同,建议多尝试

💡 使用示例

Python 示例(非流式)

import requests

url = "http://your-domain.com/v1/chat/completions"
headers = {
    "Content-Type": "application/json"
}
data = {
    "model": "nai-diffusion-4-5-full",
    "messages": [
        {
            "role": "user",
            "content": "a beautiful sunset over the ocean"
        }
    ]
}

response = requests.post(url, json=data, headers=headers)
result = response.json()
image_url = result["choices"][0]["message"]["content"]
print(f"生成的图片: {image_url}")

Python 示例(指定尺寸)

import requests

url = "http://your-domain.com/v1/chat/completions"
headers = {
    "Content-Type": "application/json"
}
data = {
    "model": "nai-diffusion-4-5-full",
    "messages": [
        {
            "role": "user",
            "content": "beautiful landscape 1024:1024"  # 指定生成 1024x1024 的正方形图片
        }
    ]
}

response = requests.post(url, json=data, headers=headers)
result = response.json()
image_url = result["choices"][0]["message"]["content"]
print(f"生成的图片: {image_url}")

Python 示例(带反向提示词)

import requests

url = "http://your-domain.com/v1/chat/completions"
headers = {
    "Content-Type": "application/json"
}
data = {
    "model": "nai-diffusion-4-5-full",
    "messages": [
        {
            "role": "user",
            "content": "beautiful sunset over the ocean"
        }
    ],
    "negative_prompt": "blurry, lowres, bad quality, worst quality, ugly, deformed, low quality"
}

response = requests.post(url, json=data, headers=headers)
result = response.json()
image_url = result["choices"][0]["message"]["content"]
print(f"生成的图片: {image_url}")

Python 示例(流式)

import requests
import json

url = "http://your-domain.com/v1/chat/completions"
headers = {
    "Content-Type": "application/json"
}
data = {
    "model": "nai-diffusion-4-5-full",
    "messages": [
        {
            "role": "user",
            "content": "a beautiful sunset over the ocean"
        }
    ],
    "stream": True
}

response = requests.post(url, json=data, headers=headers, stream=True)

for line in response.iter_lines():
    if line:
        line_str = line.decode('utf-8')
        if line_str.startswith('data: '):
            data_str = line_str[6:]  # 移除 "data: " 前缀
            if data_str == '[DONE]':
                break
            try:
                chunk = json.loads(data_str)
                delta = chunk.get('choices', [{}])[0].get('delta', {})
                if 'content' in delta:
                    print(delta['content'], end='', flush=True)
                elif 'reasoning_content' in delta:
                    print(delta['reasoning_content'])
            except json.JSONDecodeError:
                pass

cURL 示例

curl -X POST http://your-domain.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "nai-diffusion-4-5-full",
    "messages": [
      {
        "role": "user",
        "content": "a beautiful landscape"
      }
    ]
  }'

cURL 示例(指定尺寸)

curl -X POST http://your-domain.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "nai-diffusion-4-5-full",
    "messages": [
      {
        "role": "user",
        "content": "portrait 832:1216"
      }
    ]
  }'

JavaScript (Fetch) 示例

fetch('http://your-domain.com/v1/chat/completions', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'nai-diffusion-4-5-full',
    messages: [
      {
        role: 'user',
        content: 'a beautiful landscape'
      }
    ],
    stream: true
  })
})
.then(response => {
  const reader = response.body.getReader();
  const decoder = new TextDecoder();
  
  function readStream() {
    reader.read().then(({ done, value }) => {
      if (done) return;
      
      const chunk = decoder.decode(value);
      const lines = chunk.split('\n');
      
      for (const line of lines) {
        if (line.startsWith('data: ')) {
          const data = line.slice(6);
          if (data === '[DONE]') return;
          
          try {
            const json = JSON.parse(data);
            const delta = json.choices?.[0]?.delta;
            if (delta?.content) {
              console.log(delta.content);
            }
          } catch (e) {}
        }
      }
      
      readStream();
    });
  }
  
  readStream();
});

⚠️ 注意事项

重要提示
  • 如果所有 Token 都在使用中,请求会进入队列等待
  • 建议使用流式响应以获得更好的用户体验
  • 图片生成可能需要几秒到几十秒,请设置合适的超时时间
  • 可以在提示词中指定图片尺寸(832:12161216:8321024:1024),不指定则使用默认尺寸 1216x832
  • 如果指定的尺寸不在支持列表中,API 会返回错误:"不支持的图片尺寸。支持的尺寸:832:1216, 1216:832, 1024:1024"

❌ 错误处理

API 可能返回以下错误:

状态码 错误类型 说明
400 invalid_request_error 缺少必需参数(如 model 或 messages),或指定的图片尺寸不在支持列表中
429 rate_limit_error 当前没有可用的 Token(全部已禁用、过期或正在冷却)
500 server_error 服务器内部错误或图片生成失败

错误响应格式

{
  "error": {
    "message": "错误描述信息",
    "type": "error_type"
  }
}