api.md 8.1 KB

Sentinel Lens API 文档

Base URL: http://localhost:8000


认证

POST /api/auth/login

登录获取 JWT Token。

Request Body

{
  "username": "admin",
  "password": "admin123"
}

Response 200

{
  "access_token": "eyJ...",
  "token_type": "bearer"
}

Response 401 — 用户名或密码错误


公开价格接口

GET /api/public/prices

获取最新一次爬取任务的所有模型价格数据。调用时会自动记录来源 IP 和 Referer,并根据域名匹配折扣。

Query Parameters

参数 类型 必填 说明
url string 指定单个模型页面 URL 过滤

Response 200

{
  "models": [
    {
      "url": "https://bailian.console.aliyun.com/...",
      "model_name": "qwen-plus-latest",
      "prices": { "256k<input": { "输入": {...}, "输出": {...} } },
      "model_info": {
        "model_code": "qwen-plus-latest",
        "display_tags": ["Qwen3", "文本生成"],
        "description": "...",
        "input_modalities": ["Text"],
        "output_modalities": ["Text"],
        "features": { "cache存储": true, "function calling": true, ... }
      },
      "rate_limits": { "RPM": "30000", "TPM": "10000000", "上下文长度": "1M" },
      "tool_prices": [{ "label": "联网搜索", "price": 0, "unit": "元/千次", "note": null }],
      "scraped_at": "2026-04-03T09:30:12+00:00"
    }
  ],
  "parsed_prices": [
    {
      "url": "...",
      "model_name": "qwen-plus-latest",
      "tier_min": null,
      "tier_max": 256,
      "tier_unit": "k",
      "input_price": 0.8,
      "output_price": 2.0,
      "currency": "CNY",
      "unit": "元/百万tokens",
      "label": "输入"
    }
  ],
  "discounted_prices": [
    {
      "url": "...",
      "model_name": "qwen-plus-latest",
      "tier_min": null,
      "tier_max": 256,
      "tier_unit": "k",
      "input_price": 0.64,
      "output_price": 1.6,
      "currency": "CNY",
      "unit": "元/百万tokens",
      "label": "输入",
      "discount": 0.8
    }
  ],
  "types": [
    { "model_name": "qwen-plus-latest", "type": ["文本生成"] },
    { "model_name": "qwen-vl-plus", "type": ["视觉理解"] }
  ],
  "discount": 0.8
}

discount 为调用方域名对应的折扣率,无折扣时为 1.0discounted_prices 中的价格已乘以折扣率。

Response 404 — 指定 url 无爬取结果


爬取任务

POST /api/scrape

创建爬取任务,异步执行。

Request Body

{
  "urls": [
    "https://bailian.console.aliyun.com/...#/model-market/detail/qwen-plus",
    "https://bailian.console.aliyun.com/...#/model-market/detail/qwen-max"
  ]
}

Response 202

{
  "job_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "pending",
  "error": null,
  "created_at": "2026-04-03T09:30:00+00:00"
}

GET /api/scrape

获取所有爬取任务列表,按创建时间倒序。

Response 200

[
  {
    "job_id": "550e8400-...",
    "status": "done",
    "error": null,
    "created_at": "2026-04-03T09:30:00+00:00"
  }
]

status 枚举值:pending | running | done | failed


GET /api/scrape/{job_id}

获取单个任务详情,done 状态时包含爬取结果。

Response 200

{
  "job_id": "550e8400-...",
  "status": "done",
  "error": null,
  "created_at": "2026-04-03T09:30:00+00:00",
  "results": [
    {
      "url": "...",
      "model_name": "qwen-plus-latest",
      "prices": {},
      "model_info": {},
      "rate_limits": {},
      "tool_prices": [],
      "scraped_at": "2026-04-03T09:30:12+00:00"
    }
  ]
}

Response 404 — 任务不存在


模型管理

GET /api/models

获取所有已注册模型列表。

Response 200

[
  {
    "id": 1,
    "name": "qwen-plus",
    "url": "https://bailian.console.aliyun.com/...#/model-market/detail/qwen-plus",
    "created_at": "2026-04-01T00:00:00+00:00"
  }
]

POST /api/models

添加模型。

Request Body

{
  "name": "qwen-plus",
  "url": "https://bailian.console.aliyun.com/...#/model-market/detail/qwen-plus"
}

Response 201 — 同上结构

Response 409 — URL 已存在


DELETE /api/models/{model_id}

删除模型。

Response 204 — 成功

Response 404 — 模型不存在


定时爬取配置

GET /api/schedule

获取当前定时爬取配置。

Response 200

{
  "enabled": false,
  "interval_days": 1,
  "start_hour": 2,
  "updated_at": "2026-04-01T00:00:00+00:00"
}

PUT /api/schedule

更新定时爬取配置。

Request Body

{
  "enabled": true,
  "interval_days": 1,
  "start_hour": 2
}

Response 200 — 同上结构


折扣管理

GET /api/discounts

获取所有域名折扣配置。

Response 200

[
  {
    "id": 1,
    "domain": "example.com",
    "discount": 0.8,
    "note": "合作伙伴八折",
    "created_at": "2026-04-01T00:00:00+00:00",
    "updated_at": "2026-04-01T00:00:00+00:00"
  }
]

POST /api/discounts

新增或更新域名折扣(domain 唯一,重复则覆盖)。

Request Body

{
  "domain": "example.com",
  "discount": 0.8,
  "note": "合作伙伴八折"
}

discount 范围:(0, 1],如 0.8 表示八折。

Response 201 — 同上结构


PUT /api/discounts/{discount_id}

更新指定折扣记录。

Request Body — 同 POST

Response 200 — 同上结构

Response 404 — 不存在


DELETE /api/discounts/{discount_id}

删除折扣记录。

Response 204 — 成功

Response 404 — 不存在


系统统计

GET /api/stats

获取系统运行统计。

Response 200

{
  "uptime_seconds": 3600.5,
  "total_hits": 1024,
  "active_ips": 3,
  "avg_latency_ms": 45.2
}

active_ips 为最近 5 分钟内有请求的 IP 数量。


GET /api/geo/distribution

获取访问来源国家分布。

Response 200

[
  { "country": "China", "count": 800, "percentage": 78.13 }
]

GET /api/geo/points

获取访问来源地理坐标点(最多 1000 条)。

Response 200

[
  {
    "latitude": 39.9042,
    "longitude": 116.4074,
    "country": "China",
    "city": "Beijing",
    "hit_count": 120
  }
]

GET /api/prices/top-ips

获取价格接口调用量 Top 20 IP。

Response 200

[
  { "ip": "127.0.0.1", "hit_count": 21, "percentage": 100.0 }
]

访问日志

GET /api/logs

获取访问日志,支持分页。

Query Parameters

参数 类型 默认值 说明
page int 1 页码,从 1 开始
page_size int 50 每页条数,最大 500

Response 200

[
  {
    "id": 1,
    "ip": "127.0.0.1",
    "method": "GET",
    "path": "/api/public/prices",
    "status_code": 200,
    "latency_ms": 45.2,
    "country": "China",
    "city": "Beijing",
    "latitude": 39.9042,
    "longitude": 116.4074,
    "created_at": "2026-04-03T09:30:00+00:00"
  }
]

爬虫统计

GET /api/scrape-stats

获取爬虫运行统计,用于仪表盘展示。

Response 200

{
  "overview": {
    "total_jobs": 25,
    "success_jobs": 22,
    "failed_jobs": 3,
    "total_models_scraped": 7,
    "last_scraped_at": "2026-04-03T09:30:34+00:00"
  },
  "daily_counts": [
    { "date": "2026-03-05", "count": 2 },
    { "date": "2026-04-03", "count": 5 }
  ],
  "model_ranks": [
    { "model_name": "qwen-plus-latest", "count": 10 },
    { "model_name": "qwen-max", "count": 8 }
  ],
  "recent_jobs": [
    {
      "job_id": "550e8400-...",
      "status": "done",
      "model_count": 5,
      "created_at": "2026-04-03T09:30:00+00:00"
    }
  ]
}

WebSocket

WS /ws/logs

实时推送访问日志。连接后服务端会主动推送每条新请求的 JSON 数据,格式同 /api/logs 单条记录。

连接示例

const ws = new WebSocket('ws://localhost:8000/ws/logs');
ws.onmessage = (e) => console.log(JSON.parse(e.data));