diff --git a/gateway/app.py b/gateway/app.py index 076365b..5e60079 100644 --- a/gateway/app.py +++ b/gateway/app.py @@ -185,11 +185,17 @@ async def health(): @app.get("/", include_in_schema=False) async def index(): - cfg = load_config() return { "service": "旷视五接口 — 网关", "version": "0.1.0", - "docs": f"{cfg['public_base_url']}/docs", + "docs": "/docs", + "integration_guide": "/static/integration.html", + "test_pages": { + "if1_measure": "/static/test_interface1.html", + "if2_hair_grow": "/static/test_interface2.html", + "if3_hair_grow_b": "/static/test_interface3.html", + "if5_hairline": "/static/test_interface5.html", + }, } diff --git a/static/integration.html b/static/integration.html new file mode 100644 index 0000000..3f9d0c0 --- /dev/null +++ b/static/integration.html @@ -0,0 +1,277 @@ + + +
+ + +Base URL: https://hair.xiangsilian.com | 在线文档: /docs | 在线测试页见底部
| 协议 | HTTPS |
| 请求方式 | 全部 POST |
| 编码 | UTF-8 |
| Content-Type | multipart/form-data |
| 图片参数 | 三选一:image_file(文件上传)/ image_url(URL)/ image_base64(base64 + 前缀) |
| 图片格式 | JPG / PNG,≤ 1 MB,单人正面照 |
统一响应结构:
+{
+ "code": 0, // 0=成功,非0=错误
+ "message": "success",
+ "request_id": "...", // 请求追踪 ID
+ "data": { ... } // 业务数据,各接口不同
+}
+ /api/v1/face/measure上传正面照 → 返回标注好的 PNG(仅标注图层,透明底)+ 四庭七眼厘米数值 + 关键点像素坐标。
+ +入参
+| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| image_file | file | 三选一 | 上传图片文件 |
| image_url | string | 三选一 | 图片 URL |
| image_base64 | string | 三选一 | base64 字符串,需带 data:image/...;base64, 前缀 |
data 字段
+| 字段 | 类型 | 说明 |
|---|---|---|
annotated_image_url | string | 标注 PNG URL(仅标注图层,透明底,叠加到原图上显示) |
face_total_height_cm | number | 全脸高度(cm) |
four_courts | object | 四庭:top/upper/middle/lower,各含 _cm 和 ratios |
seven_eyes | object | 七眼:eye_width/face_width/inter_eye_distance,各含 _cm 和 ratios |
landmarks | object | 5 个关键点像素坐标:hair_top/hairline/brow_center/nose_bottom/chin_tip |
💡 前端把标注图叠加到原图上即可呈现测量效果(标注图白色线条 #FFFFFF,透明底)。
+ +请求示例(fetch):
+const fd = new FormData();
+fd.append('image_file', file); // 或 image_url / image_base64
+
+const res = await fetch('https://hair.xiangsilian.com/api/v1/face/measure', {
+ method: 'POST',
+ body: fd
+});
+const { code, data } = await res.json();
+// data.annotated_image_url → 标注 PNG
+// data.face_total_height_cm → 全脸高度
+// data.four_courts.ratios → { top_court: 0.25, ... }
+// 前端叠加显示:原图 + annotated_image_url(absolute 叠加)
+ /api/v1/hair/grow上传正面照 + 性别 → 多组发际线方案。每组含发际线叠加预览图 + ComfyUI 生发效果图。
+ +入参
+| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| image_file / image_url / image_base64 | — | 三选一 | 用户正面照 |
| gender | string | ✅ 必填 | "male" / "female" |
data.results[] 元素
+| 字段 | 类型 | 说明 |
|---|---|---|
image_url | string | 发际线叠加预览图(曲线叠在原图上) |
grown_image_url | string | 生发后效果图(ComfyUI/Flux「植发3个月」)⚠ 可空 |
hairline_type | string | 发际线类型 key |
order | int | 排序(1=最佳,当前按贴图顺序) |
+ Female 5 种:ellipse/flower/heart/straight/wave |
+ Male 4 种:ellipse/m/straight/inverse_arc
+ ⚠ 生发图由本机 ComfyUI 生成,耗时可达数分钟,fetch 超时需放大(≥5min)。
+
/api/v1/hair/grow-b医生用马克笔在用户照片额头画线 → 拍照上传 → 系统生成生发效果图。
+ +入参
+| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| marked_image_file / marked_image_url / marked_image_base64 | — | ✅ 三选一 | 已用马克笔标注发际线的图片 |
data 字段
+| 字段 | 类型 | 说明 |
|---|---|---|
hair_growth_image_url | string | 生发后效果图 URL ⚠ 可空 |
hairline_type | string | 固定 "custom"(手绘定制) |
⚠ 划线图未检测到划线(或无人脸)→ code=1001
+/api/v1/face/features上传照片 → 火山方舟豆包视觉模型分析 → 返回几十项面部特征(脸型/眉形/肤色/四季色彩…)。
+ +入参:image_file / image_url / image_base64 三选一。无其他参数。
+ +data 字段
+| 字段 | 类型 | 说明 |
|---|---|---|
features | string | JSON 字符串(不是对象!客户端需 JSON.parse()) |
features 英文优先字段(其余中文字段同时返回,共~42个):
+| 字段 | 说明 | 字段 | 说明 |
|---|---|---|---|
| face_shape | 脸型 | eyebrow_shape | 眉形 |
| facial_age | 面部年龄区间 | gender | 性别 |
| dynamic_static_type | 动静类型 | gene_style | 基因风格 |
const res = await fetch('https://hair.xiangsilian.com/api/v1/face/features', {
+ method: 'POST',
+ body: fd
+});
+const { code, data } = await res.json();
+const features = JSON.parse(data.features); // ← 注意:data.features 是字符串!
+console.log(features.face_shape); // "鹅蛋脸"
+console.log(features['四季色彩季型']); // "冷夏型"(中文字段也保留)
+ /api/v1/hairline/generate上传正面照 + 性别 → N 张发际线叠加图 + 最佳发际线中心点坐标。
+ +入参
+| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| image_file / image_url / image_base64 | — | 三选一 | 用户正面照 |
| gender | string | ✅ 必填 | "male" / "female" |
data 字段
+| 字段 | 类型 | 说明 |
|---|---|---|
hairline_images[] | object[] | 发际线叠加图列表,每项含 image_url + order |
best_hairline_center_point | object | 最佳发际线中心点像素坐标 { x: number, y: number } |
| code | message | 说明 |
|---|---|---|
| 1001 | 无法识别人像 | 未检测到人脸 |
| 1002 | 人像分辨率过低 | 低于最低分辨率 |
| 1003 | 角度问题,非正面照 | 非正面 / 角度过大 |
| 1005 | 检测到多张人脸 | 仅支持单人 |
| 1006 | 文件超出大小限制 | 单文件 > 1 MB |
| 1007 | 图片参数错误 / 后端不可用 | 参数传错 / 服务繁忙请稍后重试 |
| 1008 | 图片格式不支持 | 非 JPG/PNG / base64 解码失败 |
1004 已废弃(接口2 不再自动判性别,改由客户端传 gender 参数)。
+| 接口 | 测试页 | 功能 |
|---|---|---|
| 1. 四庭七眼 | /static/test_interface1.html | 上传照片 → 原图+标注叠加,底图/标注开关,指标卡片 |
| 2. C端生发 | /static/test_interface2.html | 上传+性别 → 方案一覧(原图/叠加/生发),双图对比 |
| 3. B端生发 | /static/test_interface3.html | 划线图上传 → 生发效果图 |
| 5. 发际线PNG | /static/test_interface5.html | 上传+性别 → 发际线方案+中心点坐标 |
+ 接口4 无测试页(纯 JSON 返回特征字段,浏览器直接调即可查看)。 + 完整 API 文档:/docs(Swagger UI) +
++ Base: https://hair.xiangsilian.com | Swagger: /docs | 接入说明: /static/integration.html +
+