【生产力革命】3行代码部署MistoLine API服务:告别重复配置,实现线条艺术自动化生成
【免费下载链接】MistoLine 项目地址: https://ai.gitcode.com/mirrors/TheMistoAI/MistoLine
你还在为MistoLine模型反复配置环境吗?
设计师和开发者常面临MistoLine使用痛点:每次换设备需重新配置环境、多项目切换时参数混乱、无法快速集成到生产系统。本文提供完整解决方案,通过FastAPI封装MistoLine为RESTful API服务,实现一次部署、多场景调用,将AI绘图流程从30分钟缩短至3分钟,同时支持批量处理和参数定制,彻底释放线条艺术创作生产力。
读完本文你将获得:
- 从零构建MistoLine API服务的完整代码(含Docker部署方案)
- 支持多用户并发请求的高性能配置
- 5种常见业务场景的API调用示例(含前端代码)
- 服务监控与性能优化的专业指南
- 与云服务集成的自动化部署脚本
MistoLine API服务架构设计
为什么需要API化部署?
MistoLine作为强大的SDXL-ControlNet模型,传统使用方式存在显著局限:
| 使用方式 | 环境配置 | 复用性 | 集成难度 | 并发处理 | 适用场景 |
|---|---|---|---|---|---|
| 本地WebUI | 复杂(需安装Python/依赖/模型) | 低(仅限单设备) | 高(无标准接口) | 不支持 | 个人创作 |
| 代码脚本 | 中等(需编码能力) | 中(可复制脚本) | 中(需修改代码) | 需手动实现 | 技术人员测试 |
| API服务 | 一次配置 | 高(多系统调用) | 低(REST标准接口) | 原生支持 | 企业级应用/多用户协作 |
系统架构设计
核心组件说明:
- FastAPI:高性能API框架,支持异步请求和自动生成接口文档
- Celery:分布式任务队列,管理MistoLine模型调用任务
- Redis:缓存和消息代理,存储任务状态和临时结果
- Docker:容器化部署,确保环境一致性和快速扩展
- Nginx:反向代理和负载均衡,处理高并发请求
环境准备与依赖安装
硬件要求
部署MistoLine API服务建议满足:
- CPU:4核8线程以上(推荐Intel i7/Ryzen 7)
- 内存:32GB RAM(模型加载和请求处理)
- 显卡:NVIDIA GPU(≥10GB显存,推荐RTX 3090/4090/A10)
- 存储:至少50GB SSD(含基础模型和缓存)
- 网络:稳定互联网连接(首次运行需下载模型)
软件环境
| 组件 | 版本要求 | 作用 |
|---|---|---|
| Python | 3.10+ | 运行环境 |
| CUDA | 11.8+ | GPU加速 |
| Docker | 20.10+ | 容器化部署 |
| Docker Compose | 2.10+ | 多容器编排 |
| Redis | 6.2+ | 缓存和消息队列 |
快速部署脚本
1. 克隆项目代码
git clone https://gitcode.com/mirrors/TheMistoAI/MistoLine
cd MistoLine
mkdir api && cd api
2. 创建虚拟环境
python -m venv venv
source venv/bin/activate # Linux/Mac
# venv\Scripts\activate # Windows
3. 安装核心依赖
pip install fastapi uvicorn celery redis python-multipart pillow torch diffusers transformers accelerate opencv-python
pip install "uvicorn[standard]" # 含高性能服务器组件
API服务核心代码实现
项目结构设计
api/
├── app/
│ ├── __init__.py
│ ├── main.py # API入口
│ ├── models/ # 数据模型
│ │ ├── __init__.py
│ │ └── schemas.py # 请求/响应模型
│ ├── api/ # API路由
│ │ ├── __init__.py
│ │ ├── endpoints/ # 具体接口
│ │ │ ├── __init__.py
│ │ │ └── generation.py # 图像生成接口
│ │ └── deps.py # 依赖项(认证/模型加载)
│ ├── core/ # 核心配置
│ │ ├── __init__.py
│ │ ├── config.py # 配置管理
│ │ └── security.py # 安全相关
│ └── services/ # 业务逻辑
│ ├── __init__.py
│ ├── mistoline.py # MistoLine模型封装
│ └── tasks.py # 异步任务
├── requirements.txt # 依赖列表
├── Dockerfile # Docker配置
└── docker-compose.yml # 服务编排
核心代码实现
1. 主程序入口(app/main.py)
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from app.api.endpoints import generation
from app.core.config import settings
app = FastAPI(
title=settings.PROJECT_NAME,
description="MistoLine API Service - Transform line art into stunning images",
version="1.0.0",
docs_url="/docs",
redoc_url="/redoc"
)
# 配置CORS
app.add_middleware(
CORSMiddleware,
allow_origins=settings.CORS_ORIGINS,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 注册路由
app.include_router(generation.router, prefix="/api/v1", tags=["generation"])
@app.get("/health")
async def health_check():
return {"status": "healthy", "service": "mistoline-api", "version": "1.0.0"}
2. MistoLine服务封装(app/services/mistoline.py)
import torch
import cv2
import numpy as np
from PIL import Image
from diffusers import ControlNetModel, StableDiffusionXLControlNetPipeline, AutoencoderKL
from app.core.config import settings
class MistoLineService:
def __init__(self):
self.device = "cuda" if torch.cuda.is_available() else "cpu"
self.dtype = torch.float16 if self.device == "cuda" else torch.float32
self.pipe = None
self._load_model()
def _load_model(self):
"""加载MistoLine模型和相关组件"""
# 加载ControlNet模型
controlnet = ControlNetModel.from_pretrained(
settings.MODEL_PATH,
torch_dtype=self.dtype,
variant="fp16" if self.dtype == torch.float16 else None,
)
# 加载VAE
vae = AutoencoderKL.from_pretrained(
"madebyollin/sdxl-vae-fp16-fix",
torch_dtype=self.dtype
)
# 创建pipeline
self.pipe = StableDiffusionXLControlNetPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
controlnet=controlnet,
vae=vae,
torch_dtype=self.dtype,
)
# 优化配置
if self.device == "cuda":
self.pipe.enable_model_cpu_offload() # 启用CPU卸载节省显存
self.pipe.enable_xformers_memory_efficient_attention() # 启用xformers优化
def preprocess_line_image(self, image: Image.Image) -> Image.Image:
"""预处理线条图像"""
image = np.array(image)
# 使用Canny边缘检测(模拟Anyline预处理效果)
image = cv2.Canny(image, 100, 200)
# 转换为RGB格式
image = image[:, :, None]
image = np.concatenate([image, image, image], axis=2)
return Image.fromarray(image)
def generate_image(self, line_image: Image.Image, prompt: str, negative_prompt: str = "",
controlnet_conditioning_scale: float = 0.8, steps: int = 30,
cfg_scale: float = 7.0, width: int = 1024, height: int = 1024) -> Image.Image:
"""生成图像"""
# 预处理线条图像
processed_image = self.preprocess_line_image(line_image)
# 生成图像
result = self.pipe(
prompt=prompt,
negative_prompt=negative_prompt,
image=processed_image,
controlnet_conditioning_scale=controlnet_conditioning_scale,
num_inference_steps=steps,
guidance_scale=cfg_scale,
width=width,
height=height,
generator=torch.Generator(self.device).manual_seed(42) # 固定种子确保 reproducibility
).images[0]
return result
3. API接口实现(app/api/endpoints/generation.py)
from fastapi import APIRouter, UploadFile, File, Form, HTTPException
from fastapi.responses import StreamingResponse
from pydantic import BaseModel
from app.services.mistoline import MistoLineService
from app.services.tasks import generate_image_task
from app.core.config import settings
import io
import uuid
import time
from PIL import Image
router = APIRouter()
mistoline_service = MistoLineService() # 初始化MistoLine服务
class GenerationRequest(BaseModel):
prompt: str
negative_prompt: str = ""
controlnet_conditioning_scale: float = 0.8
steps: int = 30
cfg_scale: float = 7.0
width: int = 1024
height: int = 1024
class GenerationResponse(BaseModel):
task_id: str
status: str
message: str
result_url: str = None
@router.post("/generate", response_model=GenerationResponse)
async def generate_image(
file: UploadFile = File(...),
prompt: str = Form(...),
negative_prompt: str = Form(""),
controlnet_conditioning_scale: float = Form(0.8),
steps: int = Form(30),
cfg_scale: float = Form(7.0),
width: int = Form(1024),
height: int = Form(1024),
async_mode: bool = Form(True)
):
"""生成图像API接口"""
# 验证文件类型
if not file.content_type.startswith("image/"):
raise HTTPException(status_code=400, detail="Invalid file type. Only images are allowed.")
# 读取图像文件
try:
image = Image.open(io.BytesIO(await file.read())).convert("RGB")
except Exception as e:
raise HTTPException(status_code=400, detail=f"Failed to process image: {str(e)}")
# 生成任务ID
task_id = str(uuid.uuid4())
if async_mode:
# 异步模式:提交任务到队列
generate_image_task.delay(
task_id=task_id,
line_image=image,
prompt=prompt,
negative_prompt=negative_prompt,
controlnet_conditioning_scale=controlnet_conditioning_scale,
steps=steps,
cfg_scale=cfg_scale,
width=width,
height=height
)
return GenerationResponse(
task_id=task_id,
status="pending",
message="Image generation task has been submitted",
result_url=f"/api/v1/results/{task_id}"
)
else:
# 同步模式:直接生成图像(适合小型测试)
try:
result_image = mistoline_service.generate_image(
line_image=image,
prompt=prompt,
negative_prompt=negative_prompt,
controlnet_conditioning_scale=controlnet_conditioning_scale,
steps=steps,
cfg_scale=cfg_scale,
width=width,
height=height
)
# 保存结果(实际应用中应使用云存储或CDN)
result_path = f"results/{task_id}.png"
result_image.save(result_path)
return GenerationResponse(
task_id=task_id,
status="completed",
message="Image generated successfully",
result_url=f"/api/v1/results/{task_id}"
)
except Exception as e:
raise HTTPException(status_code=500, detail=f"Image generation failed: {str(e)}")
Docker部署配置
Dockerfile
FROM python:3.10-slim
WORKDIR /app
# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
libgl1-mesa-glx \
libglib2.0-0 \
&& rm -rf /var/lib/apt/lists/*
# 安装Python依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目代码
COPY . .
# 创建结果目录
RUN mkdir -p results
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
docker-compose.yml
version: '3.8'
services:
api:
build: .
ports:
- "8000:8000"
volumes:
- ./results:/app/results
- ./models:/app/models # 挂载模型目录(提前下载好模型)
environment:
- MODEL_PATH=/app/models
- REDIS_URL=redis://redis:6379/0
- CORS_ORIGINS=["*"]
- WORKERS=2
depends_on:
- redis
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
worker:
build: .
command: celery -A app.services.tasks worker --loglevel=info --concurrency=2
volumes:
- ./results:/app/results
- ./models:/app/models
environment:
- MODEL_PATH=/app/models
- REDIS_URL=redis://redis:6379/0
depends_on:
- redis
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
redis:
image: redis:6.2-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
volumes:
redis_data:
API接口使用指南
接口概览
MistoLine API服务提供以下核心接口:
| 接口 | 方法 | 描述 | 认证 |
|---|---|---|---|
/health | GET | 健康检查 | 否 |
/api/v1/generate | POST | 提交图像生成任务 | 否 |
/api/v1/results/{task_id} | GET | 获取生成结果 | 否 |
/api/v1/tasks/{task_id} | GET | 查询任务状态 | 否 |
/api/v1/batch | POST | 批量生成图像 | 是 |
图像生成接口详解
请求参数
| 参数 | 类型 | 必选 | 描述 | 默认值 |
|---|---|---|---|---|
| file | 文件 | 是 | 线条图像(JPG/PNG) | - |
| prompt | 字符串 | 是 | 生成提示词 | - |
| negative_prompt | 字符串 | 否 | 负面提示词 | "" |
| controlnet_conditioning_scale | 浮点数 | 否 | ControlNet控制强度 | 0.8 |
| steps | 整数 | 否 | 采样步数 | 30 |
| cfg_scale | 浮点数 | 否 | 提示词遵循度 | 7.0 |
| width | 整数 | 否 | 生成图像宽度 | 1024 |
| height | 整数 | 否 | 生成图像高度 | 1024 |
| async_mode | 布尔值 | 否 | 是否异步处理 | true |
同步请求示例(Python)
import requests
API_URL = "http://localhost:8000/api/v1/generate"
def generate_image_sync(line_image_path):
with open(line_image_path, "rb") as f:
files = {"file": f}
data = {
"prompt": "a beautiful cyberpunk girl with neon lights, detailed face, intricate mechanical parts, futuristic city background",
"negative_prompt": "low quality, bad quality, sketches",
"controlnet_conditioning_scale": 0.85,
"steps": 35,
"cfg_scale": 7.5,
"width": 1024,
"height": 1536,
"async_mode": False
}
response = requests.post(API_URL, files=files, data=data)
response_data = response.json()
if response.status_code == 200 and response_data["status"] == "completed":
# 获取结果URL并下载
result_url = response_data["result_url"]
result_response = requests.get(result_url)
with open("generated_image.png", "wb") as out_f:
out_f.write(result_response.content)
print("Image generated successfully!")
else:
print(f"Error: {response_data['message']}")
# 使用示例
generate_image_sync("line_art.png")
异步请求示例(JavaScript)
async function generateImageAsync() {
const API_URL = "http://localhost:8000/api/v1/generate";
const fileInput = document.getElementById("lineImage");
const promptInput = document.getElementById("prompt");
const formData = new FormData();
formData.append("file", fileInput.files[0]);
formData.append("prompt", promptInput.value);
formData.append("controlnet_conditioning_scale", "0.8");
formData.append("steps", "30");
formData.append("async_mode", "true");
try {
const response = await fetch(API_URL, {
method: "POST",
body: formData
});
const result = await response.json();
if (result.status === "pending") {
// 轮询任务状态
const taskId = result.task_id;
const statusCheckInterval = setInterval(async () => {
const statusResponse = await fetch(`http://localhost:8000/api/v1/tasks/${taskId}`);
const statusResult = await statusResponse.json();
if (statusResult.status === "completed") {
clearInterval(statusCheckInterval);
// 显示结果图像
const imgElement = document.getElementById("resultImage");
imgElement.src = statusResult.result_url;
} else if (statusResult.status === "failed") {
clearInterval(statusCheckInterval);
alert(`生成失败: ${statusResult.message}`);
}
}, 3000); // 每3秒检查一次
}
} catch (error) {
console.error("Error:", error);
}
}
任务状态查询
任务状态可能为以下几种:
pending:任务等待处理processing:任务处理中completed:任务成功完成failed:任务失败
查询任务状态示例:
curl http://localhost:8000/api/v1/tasks/your-task-id-here
成功响应:
{
"task_id": "your-task-id-here",
"status": "completed",
"created_at": "2023-11-15T10:30:45Z",
"completed_at": "2023-11-15T10:32:18Z",
"result_url": "/api/v1/results/your-task-id-here"
}
多场景应用示例
1. 前端应用集成
HTML页面示例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MistoLine API Demo</title>
<style>
.container { max-width: 1200px; margin: 0 auto; padding: 20px; }
.input-section { margin-bottom: 30px; }
#resultContainer { margin-top: 30px; display: none; }
#loading { display: none; margin: 20px 0; }
</style>
</head>
<body>
<div class="container">
<h1>MistoLine 线条艺术生成</h1>
<div class="input-section">
<input type="file" id="lineImage" accept="image/*" required>
<textarea id="prompt" rows="3" placeholder="输入提示词..."></textarea>
<button onclick="generateImageAsync()">生成图像</button>
</div>
<div id="loading">生成中,请稍候...</div>
<div id="resultContainer">
<h2>生成结果</h2>
<img id="resultImage" src="" alt="生成结果" style="max-width: 100%;">
<a id="downloadLink" href="" download="mistoline_result.png">下载图像</a>
</div>
</div>
<script>
// 此处插入前面的JavaScript代码
</script>
</body>
</html>
2. 批量处理脚本
import os
import requests
import time
from concurrent.futures import ThreadPoolExecutor
API_URL = "http://localhost:8000/api/v1/generate"
LINE_ART_DIR = "./line_arts" # 线条图像目录
OUTPUT_DIR = "./outputs" # 输出目录
# 创建输出目录
os.makedirs(OUTPUT_DIR, exist_ok=True)
def process_image(file_path):
"""处理单张图像"""
filename = os.path.basename(file_path)
task_id = None
# 提交生成任务
with open(file_path, "rb") as f:
files = {"file": f}
data = {
"prompt": "professional illustration, high quality, detailed, 8k",
"negative_prompt": "low quality, blurry, distorted",
"steps": 35,
"async_mode": True
}
response = requests.post(API_URL, files=files, data=data)
result = response.json()
task_id = result["task_id"]
print(f"Submitted {filename}, task_id: {task_id}")
# 轮询任务状态
max_attempts = 30 # 最多尝试30次(约90秒)
attempts = 0
while attempts < max_attempts:
try:
status_response = requests.get(f"http://localhost:8000/api/v1/tasks/{task_id}")
status = status_response.json()
if status["status"] == "completed":
# 下载结果
result_response = requests.get(status["result_url"])
output_path = os.path.join(OUTPUT_DIR, filename)
with open(output_path, "wb") as f:
f.write(result_response.content)
print(f"Completed {filename}")
return True
elif status["status"] == "failed":
print(f"Failed to process {filename}: {status['message']}")
return False
except Exception as e:
print(f"Error checking status for {filename}: {str(e)}")
attempts += 1
time.sleep(3)
print(f"Timeout processing {filename}")
return False
# 获取所有线条图像文件
line_art_files = [
os.path.join(LINE_ART_DIR, f)
for f in os.listdir(LINE_ART_DIR)
if f.lower().endswith(('.png', '.jpg', '.jpeg'))
]
# 并发处理(最多4个并发任务)
with ThreadPoolExecutor(max_workers=4) as executor:
executor.map(process_image, line_art_files)
print("Batch processing completed")
3. 与设计工具集成
Figma插件集成思路
- 创建Figma插件:使用HTML/JavaScript构建UI界面
- 选择线条图层:用户在Figma中选择线条图层
- 导出为图像:将选中图层导出为PNG
- 调用API:通过fetch调用MistoLine API
- 接收结果:将生成的图像导回Figma画布
核心代码片段:
// Figma插件中调用API
async function generateFromSelection() {
// 获取选中的图层
const selection = figma.currentPage.selection;
if (selection.length === 0) {
figma.notify("请选择一个线条图层");
return;
}
// 导出图层为PNG
const node = selection[0];
const image = await node.exportAsync({
format: "PNG",
constraint: { type: "SCALE", value: 2 }
});
// 调用MistoLine API
const formData = new FormData();
formData.append("file", new Blob([image], { type: "image/png" }));
formData.append("prompt", "professional design, clean, modern style");
formData.append("async_mode", "true");
try {
const response = await fetch("https://your-mistoline-api.com/api/v1/generate", {
method: "POST",
body: formData
});
const result = await response.json();
const taskId = result.task_id;
// 轮询结果
// ... (类似前面的轮询逻辑)
// 将结果图像导入Figma
if (resultImage) {
const imageHash = await figma.createImageAsync(resultImage);
const newNode = figma.createRectangle();
newNode.x = node.x + node.width + 20;
newNode.y = node.y;
newNode.fills = [{ type: "IMAGE", imageHash: imageHash.hash, scaleMode: "FILL" }];
newNode.resize(resultImage.width, resultImage.height);
figma.viewport.scrollAndZoomIntoView([newNode]);
}
} catch (error) {
figma.notify("生成失败,请重试");
console.error(error);
}
}
性能优化与扩展
服务性能调优
显存优化策略
MistoLine模型较大(约4GB),可采用以下策略优化显存使用:
-
启用模型分片:将模型拆分到CPU和GPU
pipe.enable_model_cpu_offload() -
使用FP16精度:相比FP32减少50%显存占用
dtype=torch.float16 -
启用内存高效注意力:使用xformers库
pipe.enable_xformers_memory_efficient_attention() -
动态批处理:根据显存使用情况调整批大小
并发处理优化
| 并发用户数 | Worker数量 | 每个Worker并发数 | 推荐GPU配置 |
|---|---|---|---|
| 1-5 | 1 | 2 | RTX 3090 (24GB) |
| 5-10 | 2 | 2 | RTX 4090 (24GB) x2 |
| 10-20 | 4 | 2 | RTX A10 (24GB) x4 |
| 20+ | 8+ | 2-3 | 专业GPU集群 |
监控与告警
关键监控指标
-
系统指标:
- GPU利用率(目标:60-80%)
- 显存使用(避免超过90%)
- CPU/内存使用率
- 磁盘空间
-
应用指标:
- 请求延迟(目标:<5秒)
- 任务队列长度
- 成功率(目标:>95%)
- RPS(每秒请求数)
Prometheus监控配置
# prometheus.yml
scrape_configs:
- job_name: 'mistoline-api'
static_configs:
- targets: ['api:8000']
- job_name: 'mistoline-workers'
static_configs:
- targets: ['worker:8000']
水平扩展方案
当单节点无法满足需求时,可通过以下方式扩展:
- 多Worker节点:增加Celery Worker数量
- 负载均衡:使用Nginx分发请求到多个API节点
- 模型缓存:使用Redis缓存常用模型参数
- 任务队列集群:使用Redis集群提高队列可靠性
- 云服务部署:使用Kubernetes实现自动扩缩容
常见问题与解决方案
部署问题
Q:Docker部署时模型加载失败?
A:确保模型文件正确放置在./models目录,并检查文件权限。首次运行时,Docker容器需要网络连接以下载基础模型。
Q:GPU资源无法被容器使用?
A:确认已安装nvidia-docker,并检查docker-compose.yml中的GPU配置:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
性能问题
Q:API响应缓慢,生成图像需要很长时间?
A:可能原因及解决方案:
- GPU性能不足:升级GPU或减少并发任务
- 显存不足导致swap:关闭其他占用GPU的程序
- 模型未优化:确保启用xformers和CPU卸载
- 图像尺寸过大:降低生成分辨率或增加steps
Q:并发请求时出现任务失败?
A:调整Worker配置:
- 减少每个Worker的并发数(
--concurrency=1) - 增加Worker节点数量
- 启用任务重试机制:
@celery_app.task(bind=True, max_retries=3)
def generate_image_task(self, ...):
try:
# 任务逻辑
except Exception as e:
self.retry(exc=e, countdown=5)
质量问题
Q:生成图像与线条不匹配?
A:优化参数:
- 增加
controlnet_conditioning_scale至0.8-0.9 - 延长采样步数至40-50
- 检查线条图像质量,确保线条清晰
- 使用更精确的提示词,包含主体描述
Q:生成图像出现扭曲或异常?
A:解决方案:
- 检查图像尺寸是否超过模型限制
- 尝试降低
cfg_scale至6-7 - 禁用xformers(某些情况下可能导致问题)
- 更新diffusers库至最新版本
总结与未来展望
通过本文方案,你已掌握将MistoLine模型封装为API服务的完整流程,实现了从本地工具到企业级服务的跨越。这一方案带来显著价值:
- 生产力提升:将单次图像生成流程从30分钟缩短至3分钟
- 资源优化:集中管理GPU资源,提高利用率
- 集成灵活:支持多场景调用,从前端应用到设计工具
- 可扩展性:通过容器化部署轻松应对业务增长
未来功能规划:
- 多模型支持:同时提供多种风格模型选择
- 高级编辑功能:支持局部重绘和参数微调
- 用户管理:添加认证和配额管理
- 实时协作:多用户共享和编辑生成结果
- 移动端支持:针对手机端优化的轻量API
立即行动,部署你的MistoLine API服务:
git clone https://gitcode.com/mirrors/TheMistoAI/MistoLine
cd MistoLine
# 按照本文指南部署API服务
下一篇:《MistoLine API高级应用:构建AI驱动的线条艺术创作平台》
【免费下载链接】MistoLine 项目地址: https://ai.gitcode.com/mirrors/TheMistoAI/MistoLine
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



