lov-backend · v0.1.1 · 2026-09-25 · sha256 705375370338c50a
lov-backend v0.1.1A
Immutable. This exact content never changes and is served at /api/v1/blob/705375370338c50a.
---
name: lov-backend
description: >
在 uni-api(FastAPI 聚合网关)项目内为某个 app 新增网关能力:新建业务 package 与 router,
注册进 router/__init__.py 并接入 config/app_groups.py 分组,让该 app 通过网关调用聚合 API。
触发:给 uni-api 加网关能力 / add gateway endpoints in uni-api。
license: MIT
metadata:
author: lovstudio
version: "0.1.1"
card_standard: lovstudio/skill-card/v1
tags:
- uni-api
- fastapi
- gateway
compatibility: "Portable Agent Skills format. 需要在 uni-api(FastAPI)仓库根目录内执行;启动前提见仓库 AGENTS.md。"
dependencies: []
---
# 网关后端 · Gateway Backend
在 uni-api(FastAPI 聚合网关)仓库里为该 app 新增一组网关端点并挂进 `/docs` 分组,让该 app
通过网关调用聚合后的上游 API。改动只落在 uni-api 既有约定内,不引入新框架。
## Triggers
### Activate when
- “给 uni-api 加一个 app 的网关能力 / 聚合接口”。
- “后端需要为 <app> 暴露一组 API”。
- "add gateway endpoints in uni-api for my app".
- "expose aggregated APIs for my app through the uni-api gateway".
### Do not activate when
- 只需加单个第三方 AI 代理(如 Gemini 生图):交给 `lov-install-zenmux-api`。
- 重构已有后端冗余 API:交给 `lov-refactor-api`。
- 前端调用层封装:由本 Kit 的 `lov-frontend` 模块处理。
## User Profile (cross-session)
Every generated Skill is connected to the shared `user-profile/v1` contract in
`skill.yaml`. Read the shared user, brand, workspace, preferences, and this
Skill's `skills.<skill_id>` namespace at the start of every run. Keep the source
portable: resolved personal values belong in the shared profile, never here.
When the user directly states a durable preference or brand fact, persist it
through `scripts/profile_store.py` and report the saved profile path. Put
Skill-specific values under `records.<field>`; use `brand.<field>` or
`user.<field>` for shared values. Do not persist inferred secrets or credentials.
See `references/user-profile.md` for the complete contract.
## Skill Group Composition
Read `references/skill-composition.md` before deciding whether to invoke or
extend any adjacent capability. The record distinguishes optional upstream and
downstream handoffs from embedded Kit modules. Do not silently depend on a
sibling Skill that is not shipped with this source.
## Workflow (MANDATORY)
**You MUST follow these steps in order.**
### Step 0: Resolve skill root, dependencies, and runtime context
- Use `SKILL_DIR` if the environment provides it;否则从当前上下文推断已安装的模块目录。
- 确认工作目录在 uni-api 仓库根目录(有 `main.py`、`router/`、`packages/`、`settings.py`)。
- 确认仓库根目录 `AGENTS.md` 的运行前提(`.env` 必填字段、`socksio` 等)已满足,避免破坏 app 启动。
- 读取 `references/uni-api-patterns.md` 掌握 uni-api 既有约定后再动手。
Resolve `context.profile` on every invocation. The precedence is current request,
project context, Skill-specific profile records, shared preferences, shared
brand/user profile, then safe defaults. A direct user statement about a durable
preference or brand fact should be saved with `scripts/profile_store.py record`
using `--confirm`, followed by a concise saved-path report.
### Step 1: Understand the requested outcome
- 确认 **app 名称** 与 **需要网关化的上游能力**(例如:新增某类 LLM 供应商聚合、某业务数据接口、
OSS/媒体代理等)。
- 复用 uni-api 已有的 `packages/llm`、`packages/spider` 等能力,避免重复造轮子。
- 分离内部上下文与用户可见输出:最终交付的是**网关端点清单**(method + path + 说明),
不是内部实现笔记。
### Step 1.5: Analyze nearby Skills before implementation
- 确认本次不依赖 `lov-install-zenmux-api`(不同网关槽位)与 `lov-refactor-api`(下游可选重构),
记录见 `references/skill-composition.md`。
### Step 2: Execute the workflow
1. **业务逻辑**:按能力归属放入 `packages/<domain>/`(新能力则新建目录)。复用已有
`packages/llm`、`packages/spider` 等模块,保持依赖最小化。
2. **网关端点**:新建 `router/<capability>.py`(复杂能力用 `router/<capability>/` 包):
- `APIRouter(prefix='/<capability>', tags=['<Tag>'])`,tag 名用英文驼峰/短横线,与 app 分组对应。
- 请求/响应体使用 `packages/common.pydantic` 的 `BaseModel`,字段尽量少。
- 用 `@standard_error_handler()` 装饰路由,保证错误结构统一(见 `packages/fastapi/standard_error.py`)。
- 参考既有 `router/llm.py`、`router/account.py` 的写法保持一致。
3. **注册**:在 `router/__init__.py` 里 import 并 `root_router.include_router(...)`。
4. **/docs 分组**:把该 app 的 tag 加入 `config/app_groups.py` 的 `APP_GROUPS`(新增分组或并入现有组)。
分组名即 `/docs` Tab 名,用简洁中文。
5. **env(按需)**:新增上游密钥或配置时,在 `settings.py` 的 `Settings` 加字段,并在 `.env.sample`
补充占位,不硬编码密钥到源码。
6. **本地验证**:
- `python -c "import main"` 通过(先满足 AGENTS.md 前提);
- `openapi.json` 出现新 tag;
- 启动后 `/docs` 出现对应 Tab。
### Step 3: Validate the deliverable
- 检查 `router/__init__.py` 注册完整、`config/app_groups.py` 分组正确、无硬编码密钥。
- 汇报**网关端点清单**(表格:method / path / 说明),这是交给 frontend 模块的契约。
- Report concrete files or results, plus any remaining evidence gaps.
## Dependencies
- uni-api(FastAPI)仓库;python3 + 项目 poetry 环境。
- `.env`(含 AGENTS.md 列出的必填变量)与 `socksio` 等运行前提。
- 无第三方外部服务依赖。