From 619399d250a850f5560a2d99d93e8d84f1be04a1 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Mon, 11 May 2026 18:22:16 +0800 Subject: [PATCH] docs: remove deprecated UAPI class from documentation --- README.md | 54 +++++++++++++++++++----------------------------------- 1 file changed, 19 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 8667630..bcf3c4d 100644 --- a/README.md +++ b/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(缓存)