docs: remove deprecated UAPI class from documentation
This commit is contained in:
parent
5189abf931
commit
619399d250
54
README.md
54
README.md
@ -24,8 +24,8 @@ uapi/
|
||||
├── uapi/ # Python 源码包
|
||||
│ ├── __init__.py # 空
|
||||
│ ├── init.py # 模块初始化,注册函数到 ServerEnv
|
||||
│ ├── appapi.py # UAPI 核心类 + deerer/bearer 认证
|
||||
│ ├── uapi.py # UpAppApi 类(基于 UAPIData 缓存的版本)
|
||||
│ ├── appapi.py # deerer/bearer 认证 + 辅助查询函数
|
||||
│ ├── uapi.py # UpAppApi 类(API 调用核心类)
|
||||
│ ├── apidata.py # UAPIData 单例缓存
|
||||
│ └── uptask.py # 异步长任务管理
|
||||
├── json/ # CRUD 定义(bricks-framework)
|
||||
@ -88,7 +88,6 @@ upapp (上位系统) ──1:N──> upappkey (API密钥)
|
||||
```python
|
||||
def load_uapi():
|
||||
g = ServerEnv()
|
||||
g.UAPI = UAPI
|
||||
g.UpAppApi = UpAppApi
|
||||
g.uapi_data = UAPIData()
|
||||
g.get_deerer = get_deerer
|
||||
@ -105,50 +104,37 @@ def load_uapi():
|
||||
|
||||
其他模块的 `.dspy` 文件可通过 `globals()` 直接使用这些函数。
|
||||
|
||||
### UAPI 类(appapi.py)
|
||||
### UpAppApi 类(uapi.py)
|
||||
|
||||
**直接查数据库调用外部 API 的核心类。**
|
||||
**基于 UAPIData 缓存的 API 调用类。**
|
||||
|
||||
```python
|
||||
# 在 .dspy 中使用
|
||||
uapi = UAPI(request, DictObject(**globals()))
|
||||
api = UpAppApi(request)
|
||||
|
||||
# 调用方式 1:流式调用(返回生成器)
|
||||
async for chunk in uapi(upappid, apiname, callerid, params={}):
|
||||
async for chunk in api(upappid, apiname, callerid, params={}):
|
||||
# chunk 是 bytes
|
||||
|
||||
# 调用方式 2:一次性获取全部响应
|
||||
result = await uapi.call(upappid, apiname, callerid, params={})
|
||||
result = await api.call(upappid, apiname, callerid, params={})
|
||||
# result 是 bytes
|
||||
|
||||
# 调用方式 3:逐行流式处理(自动过滤 chunk_match 前缀)
|
||||
async for line in uapi.stream_linify(upappid, apiname, callerid, params={}):
|
||||
async for line in api.stream_linify(upappid, apiname, callerid, params={}):
|
||||
# line 是 str,已去除 chunk_match 前缀,经 response 模板渲染
|
||||
```
|
||||
|
||||
**构造参数:**
|
||||
- `request`: HTTP 请求对象(可选,用于获取运行时命名空间)
|
||||
- `env`: DictObject 环境变量(可选,默认从 ServerEnv 获取)
|
||||
- `sor`: sqlor 游标(可选,传入后不再自行创建数据库连接)
|
||||
|
||||
**工作流程:**
|
||||
1. 通过 `sor_get_uapi()` 查询 uapi/upapp/uapiset 三表获取 API 配置
|
||||
1. 通过 `UAPIData` 获取 API 定义(内存缓存,不直接查库)
|
||||
2. 如果 API 定义了 `auth_apiname`,先执行认证 API(`do_auth`),将结果注入 `self.env`
|
||||
3. 通过 `get_userapikey()` 获取调用者的 API 密钥信息
|
||||
4. 渲染 path/headers/data/params 模板,组装 HTTP 请求
|
||||
5. 如果配置了 `dynamic_func_name`,执行动态函数
|
||||
6. 通过 `StreamHttpClient` 发起 HTTP 请求并流式返回
|
||||
|
||||
### UpAppApi 类(uapi.py)
|
||||
|
||||
**基于 UAPIData 缓存的 API 调用类,接口与 UAPI 完全一致。**
|
||||
|
||||
区别在于:UAPI 每次都查数据库,UpAppApi 通过 UAPIData 单例缓存 API 定义和密钥信息,适合高频调用场景。
|
||||
|
||||
```python
|
||||
# 在 .dspy 中使用
|
||||
api = UpAppApi(request)
|
||||
result = await api.call(upappid, apiname, callerid, params={})
|
||||
```
|
||||
|
||||
### UAPIData 类(apidata.py)
|
||||
@ -277,7 +263,7 @@ import asyncio
|
||||
from appPublic.jsonConfig import getConfig
|
||||
from sqlor.dbpools import DBPools
|
||||
from ahserver.serverenv import ServerEnv
|
||||
from uapi.appapi import UAPI
|
||||
from uapi.uapi import UpAppApi
|
||||
|
||||
def get_module_dbname(mn):
|
||||
return 'sage'
|
||||
@ -289,7 +275,7 @@ async def main():
|
||||
env = ServerEnv()
|
||||
env.get_module_dbname = get_module_dbname
|
||||
|
||||
uapi = UAPI()
|
||||
api = UpAppApi()
|
||||
params = {
|
||||
'baseurl': 'https://qianfan.baidubce.com',
|
||||
'model': 'deepseek-v3',
|
||||
@ -297,7 +283,7 @@ async def main():
|
||||
}
|
||||
upapiid = 'R47xUJay76dCCt1sLmWvE'
|
||||
|
||||
async for line in uapi.stream_linify(upapiid, '0', callerid, params=params):
|
||||
async for line in api.stream_linify(upapiid, '0', callerid, params=params):
|
||||
print(line)
|
||||
|
||||
if __name__ == '__main__':
|
||||
@ -389,14 +375,13 @@ xls2ui -m ../models -o ../wwwroot uapi *.json
|
||||
|
||||
## 关键设计要点
|
||||
|
||||
1. **双调用路径**:UAPI(直接查库)和 UpAppApi(缓存版)提供相同接口,按需选择
|
||||
2. **模板引擎渲染**:path/headers/data/params/response 全部支持模板语法,可在配置中动态组装
|
||||
3. **流式响应支持**:通过 `StreamHttpClient` 和 `stream_linify` 支持 SSE 场景(如 LLM API)
|
||||
4. **chunk_match 过滤**:自动去除流式响应中的前缀行(如 `data:`),只提取有效数据
|
||||
5. **response 模板**:可定义响应数据转换模板,将上游 JSON 映射为前端需要的格式
|
||||
6. **AES 加密密钥**:`secretkey` 在数据库中 AES 加密存储,运行时通过 `password_decode()` 解密
|
||||
7. **Deerer 认证**:自定义认证头,时间戳 + apikey AES 加密,防重放攻击
|
||||
8. **动态函数扩展**:`dynamic_func` 允许在 HTTP 请求前执行自定义逻辑(通过 RegisterFunction)
|
||||
1. **模板引擎渲染**:path/headers/data/params/response 全部支持模板语法,可在配置中动态组装
|
||||
2. **流式响应支持**:通过 `StreamHttpClient` 和 `stream_linify` 支持 SSE 场景(如 LLM API)
|
||||
3. **chunk_match 过滤**:自动去除流式响应中的前缀行(如 `data:`),只提取有效数据
|
||||
4. **response 模板**:可定义响应数据转换模板,将上游 JSON 映射为前端需要的格式
|
||||
5. **AES 加密密钥**:`secretkey` 在数据库中 AES 加密存储,运行时通过 `password_decode()` 解密
|
||||
6. **Deerer 认证**:自定义认证头,时间戳 + apikey AES 加密,防重放攻击
|
||||
7. **动态函数扩展**:`dynamic_func` 允许在 HTTP 请求前执行自定义逻辑(通过 RegisterFunction)
|
||||
|
||||
---
|
||||
|
||||
@ -419,4 +404,3 @@ uapi
|
||||
3. **密钥解密**:从数据库读取的 apikey/secretkey 必须通过 `password_decode()` 解密
|
||||
4. **模板渲染异常**:headers/body 模板渲染后需 json.loads 验证,渲染失败会抛出异常
|
||||
5. **uptask 回调**:convert_func 返回 None 时会抛异常,必须返回包含 status 字段的字典
|
||||
6. **UAPI 与 UpAppApi 选择**:低频调用用 UAPI(每次查库确保最新),高频调用用 UpAppApi(缓存)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user