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