Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions docs/API快速开始文档.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# API 快速开始文档

## 一、前置条件
- 已注册账号并获取 API Key;
若未注册账号,请阅读:xxx
若未获取 API Key,请阅读:xxx
-


## 二、API 请求示例

### (1) cURL

```curl


```

### (2) Python

```python


```

### (3) JavaScript

```javascript


```


## 三、


## 四、错误码速查

### 401:鉴权失败



### 429:限流



### 500:服务端错误



其余错误排查方法详见:xxx
1 change: 1 addition & 0 deletions docs/FAQ与常见报错排查.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# FAQ 与常见报错排查
50 changes: 50 additions & 0 deletions docs/HotAI国内API平台用户手册v1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# HotAI 国内 API 平台用户手册

## 一、平台简介

HotAI 是一款国内 AI 模型 API 聚合平台,可一站式接入 DeepSeek、xxx、xxx 等多种主流模型。





## 二、快速入门

### 1. 访问平台




### 2. 账号注册与登录




### 3. 控制台概览




## 三、API Key 管理





## 四、模型列表与选择





## 五、用量与计费





## 六、常见问题快速索引




10 changes: 10 additions & 0 deletions docs/模型介绍页模板.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# 模型介绍

本平台提供的模型及其属性如下:

| 编号 | 模型ID | 提供商 | 适用场景 | 模型能力 | 鉴权类型 | API格式 | 价格 | 上下文长度 | 流式输出 | JSON输出 | 基础测试 | 响应速度 | key状态 | 并发限制 | 接入状态 | 链接 | 更新时间 | 备注 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 1 | deepseek-v4-flash | 官方渠道 | 高并发客服对话、长文档 RAG 问答、大批量文本处理(摘要 / 分类 / 打标)、轻量工具调用、内容批量生成。 | 100 万 token 超长上下文支持,高并发低延迟,价格远低于 Pro 版,支持多模式推理(non-think/think-high/think-max)。 | API BASE | OPENAI | 缓存命中输入仅 0.02 元 / 百万 tokens,缓存未命中输入1 元 / 百万 tokens,输出 2 元 / 百万 tokens。 | 1M | 支持 | 支持 | 已完成 | 非流式总延迟:约 1372ms 流式首 token 延迟:约 1274ms | 可用 | 2500 | 已接入 | https://api-docs.deepseek.com/zh-cn | 2026/7/1 | 流式对话中存在乱码 |
| 2 | deepseek-v4-pro | 官方渠道 | 适合复杂推理、高精度代码开发、专业文档分析、高风险合规业务,是对质量要求远高于成本 / 延迟的旗舰场景首选。 | 旗舰级通用模型,1.6T 总参 / 49B 激活,1M 超长上下文,强推理 + 高精度代码 + 复杂 Agent 能力,性能比肩国际顶级模型,适合高要求复杂任务。 | API BASE | OEPNAI | 缓存命中输入仅 0.025 元 / 百万 tokens,缓存未命中输入3 元 / 百万 tokens,输出 6 元 / 百万 tokens。 | 1M | 支持 | 支持 | 已完成 | 非流式总延迟:约 1822ms 流式首 token 延迟:约 1107ms | 可用 | 500 | 已接入 | https://api-docs.deepseek.com/zh-cn | 2026/7/1 | 基础对话和流式对话中存在输出空白的现象 |
| 3 | kimi-k2.6 | 官方渠道 | Kimi K2.6 适合灵活短任务、多模态结合代码、高频轻量调用。 | Kimi K2.6 是 Kimi 最新最智能的模型,Kimi K2.6 的通用 Agent、代码、视觉理解等综合能力得到全面提升,其中在博士级难度的完整版人类最后的考试(Humanity’s Last Exam)、在考察模型真实软件工程能力的 SWE-Bench Pro、评估 Agent 深度检索能力的 DeepSearchQA 等基准测试中均取得行业领先的成绩,同时支持文本、图片与视频输入,思考与非思考模式,对话与 Agent 任务。 | API BASE | OEPNAI | 缓存命中输入仅 1.1 元 / 百万 tokens,缓存未命中输入6.5 元 / 百万 tokens,输出 27 元 / 百万 tokens。 | 256K | 支持 | 支持 | 已完成 | 待测试 | 可用 | 3 | 已接入 | https://platform.kimi.com/docs/overview | 2026/7/2 | 模型可用性有待进一步测试。 |
| 4 | kimi-k2.7-code | 官方渠道 | K2.7 Code 主打复杂编码、长工程、Agent 自动化等专业代码场景。 | Kimi K2.7 Code 是 Kimi 迄今最智能的 Coding 模型,在长上下文中更可靠地遵循指令,能以更高的成功率完成编程任务,同时支持文本、图片与视频输入,思考模式,对话与 Agent 任务。 | API BASE | OEPNAI | 缓存命中输入仅 1.3 元 / 百万 tokens,缓存未命中输入6.5 元 / 百万 tokens,输出 28 元 / 百万 tokens。 | 256K | 支持 | 支持 | 已完成 | 待测试 | 可用 | 3 | 已接入 | https://platform.kimi.com/docs/overview | 2026/7/3 | 模型可用性有待进一步测试。 |
16 changes: 16 additions & 0 deletions scripts/feishu/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
FEISHU_APP_ID=cli_xxx
FEISHU_APP_SECRET=xxx

FEISHU_OPEN_BROWSER=true
FEISHU_REDIRECT_URI=http://localhost:3001/
FEISHU_OAUTH_STATE=hotai-test

FEISHU_SAVE_USER_ACCESS_TOKEN=true
FEISHU_USER_ACCESS_TOKEN=u-xxx

FEISHU_WIKI_URL=https://pcn43kg7pnzs.feishu.cn/wiki/DG5cwq12EiuaQGk8UbtcaQKdnif
FEISHU_FETCH_DOC_AFTER_AUTH=true

FEISHU_DOC_OUTPUT=docs/feishu_content.txt
FEISHU_SYNC_MODEL_TEMPLATE=true
FEISHU_MODEL_TEMPLATE_PATH=docs/模型介绍页模板.md
Binary file not shown.
Binary file added scripts/feishu/__pycache__/main.cpython-311.pyc
Binary file not shown.
Binary file not shown.
Binary file not shown.
211 changes: 211 additions & 0 deletions scripts/feishu/fetch_wiki_doc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
# scripts/feishu/fetch_wiki_doc.py

"""
获取飞书知识库资源的文本内容。

输入 URL 中 /wiki/ 后面的 token 是知识库节点 token。本脚本会先将它解析
为实际云文档 token,再根据资源类型读取新版文档(docx)或电子表格(sheet)。
"""

from urllib.parse import urlparse

import requests


FEISHU_API_BASE = "https://open.feishu.cn/open-apis"
SUPPORTED_OBJ_TYPES = {"docx", "sheet"}


class FeishuApiError(RuntimeError):
pass


def build_feishu_error(response, payload=None):
"""保留飞书返回体和 log_id,方便根据错误码定位权限或参数问题。"""
log_id = response.headers.get("x-tt-logid")
if payload is None:
try:
payload = response.json()
except ValueError:
payload = response.text

detail = f"飞书 API 请求失败: HTTP {response.status_code}, response={payload}"
if log_id:
detail = f"{detail}, x-tt-logid={log_id}"
return FeishuApiError(detail)


def extract_wiki_token(value):
"""从 Wiki URL 中提取节点 token;如果传入本身就是 token,则原样返回。"""
if value.startswith("http://") or value.startswith("https://"):
path_parts = [part for part in urlparse(value).path.split("/") if part]
if len(path_parts) >= 2 and path_parts[0] == "wiki":
return path_parts[1]
raise ValueError(f"URL 不是有效的飞书知识库链接: {value}")
return value


def request_json(method, url, *, user_access_token, **kwargs):
"""统一封装飞书 OpenAPI 请求、鉴权头、JSON 解析和错误处理。"""
headers = kwargs.pop("headers", {})
headers["Authorization"] = f"Bearer {user_access_token}"

response = requests.request(method, url, headers=headers, timeout=20, **kwargs)
if not response.ok:
raise build_feishu_error(response)

try:
payload = response.json()
except ValueError as exc:
raise FeishuApiError(f"飞书 API 返回非 JSON 响应: {response.text}") from exc

if payload.get("code") != 0:
raise build_feishu_error(response, payload)
return payload


def get_wiki_node(user_access_token, wiki_token):
"""查询 Wiki 节点,拿到背后的真实资源类型和 obj_token。"""
payload = request_json(
"GET",
f"{FEISHU_API_BASE}/wiki/v2/spaces/get_node",
user_access_token=user_access_token,
params={"token": wiki_token},
)
return payload["data"]["node"]


def get_docx_raw_content(user_access_token, document_id, *, lang=0):
"""读取新版飞书文档 docx 的纯文本内容。"""
payload = request_json(
"GET",
f"{FEISHU_API_BASE}/docx/v1/documents/{document_id}/raw_content",
user_access_token=user_access_token,
params={"lang": lang},
)
return payload["data"]["content"]


def get_spreadsheet_sheets(user_access_token, spreadsheet_token):
"""读取电子表格中的工作表列表。"""
payload = request_json(
"GET",
f"{FEISHU_API_BASE}/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/query",
user_access_token=user_access_token,
)
return payload["data"].get("sheets", [])


def get_sheet_values(user_access_token, spreadsheet_token, sheet_id):
"""读取单个工作表的全部单元格值。"""
payload = request_json(
"GET",
f"{FEISHU_API_BASE}/sheets/v2/spreadsheets/{spreadsheet_token}/values/{sheet_id}",
user_access_token=user_access_token,
params={
"valueRenderOption": "ToString",
"dateTimeRenderOption": "FormattedString",
},
)
return payload["data"].get("valueRange", {}).get("values", [])


def stringify_cell(value):
"""将飞书单元格返回值规整成适合文本输出的字符串。"""
if value is None:
return ""
if isinstance(value, list):
return " ".join(stringify_cell(item) for item in value if item is not None)
if isinstance(value, dict):
text = value.get("text") or value.get("name") or value.get("value")
if text is not None:
return stringify_cell(text)
return str(value)


def normalize_table(values):
"""补齐不等长行,保证后续可以稳定转换为 Markdown 表格。"""
if not values:
return []

width = max(len(row) for row in values)
return [
[stringify_cell(row[index]) if index < len(row) else "" for index in range(width)]
for row in values
]


def escape_markdown_table_cell(value):
"""转义 Markdown 表格单元格中的特殊字符。"""
return value.replace("\\", "\\\\").replace("|", "\\|").replace("\n", "<br>")


def values_to_markdown_table(values):
"""把二维单元格数组转换为 Markdown 表格文本。"""
rows = normalize_table(values)
if not rows:
return "_空工作表_"

header = [escape_markdown_table_cell(cell) for cell in rows[0]]
body = [
[escape_markdown_table_cell(cell) for cell in row]
for row in rows[1:]
]
separator = ["---"] * len(header)

lines = [
"| " + " | ".join(header) + " |",
"| " + " | ".join(separator) + " |",
]
lines.extend("| " + " | ".join(row) + " |" for row in body)
return "\n".join(lines)


def get_sheet_content(user_access_token, spreadsheet_token):
"""读取电子表格中所有可见的普通工作表,并合并为 Markdown 文本。"""
sheets = get_spreadsheet_sheets(user_access_token, spreadsheet_token)
if not sheets:
return "未读取到任何工作表。"

sections = []
for sheet in sheets:
if sheet.get("hidden"):
continue
if sheet.get("resource_type") != "sheet":
continue

title = sheet.get("title") or sheet["sheet_id"]
values = get_sheet_values(user_access_token, spreadsheet_token, sheet["sheet_id"])
sections.append(f"## {title}\n\n{values_to_markdown_table(values)}")

if not sections:
return "未读取到可导出的普通工作表。"
return "\n\n".join(sections)


def fetch_wiki_doc_content(user_access_token, wiki_url_or_token, *, lang=0):
"""根据 Wiki 节点背后的资源类型,分发到 docx 或 sheet 的读取逻辑。"""
wiki_token = extract_wiki_token(wiki_url_or_token)
node = get_wiki_node(user_access_token, wiki_token)

obj_type = node["obj_type"]
obj_token = node["obj_token"]
if obj_type == "docx":
return node, get_docx_raw_content(user_access_token, obj_token, lang=lang)
if obj_type == "sheet":
return node, get_sheet_content(user_access_token, obj_token)

if obj_type not in SUPPORTED_OBJ_TYPES:
raise NotImplementedError(
f"暂不支持的知识库对象类型: {obj_type!r}。"
f"当前脚本支持的类型: {', '.join(sorted(SUPPORTED_OBJ_TYPES))}。"
)


if __name__ == "__main__":
from main import main
import sys

if len(sys.argv) == 1 or sys.argv[1] not in {"serve", "fetch"}:
sys.argv.insert(1, "fetch")
main()
Loading