f
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
export default {
|
||||
index: "文档中心",
|
||||
"getting-started": "快速开始",
|
||||
models: "AI 模型接入",
|
||||
guides: "使用指南",
|
||||
integrations: "工具接入",
|
||||
guides: "开发指南",
|
||||
concepts: "核心概念",
|
||||
faq: "常见问题",
|
||||
legal: "法律条款",
|
||||
};
|
||||
|
||||
3
content/concepts/_meta.js
Normal file
3
content/concepts/_meta.js
Normal file
@@ -0,0 +1,3 @@
|
||||
export default {
|
||||
overview: "核心概念",
|
||||
};
|
||||
74
content/concepts/overview.mdx
Normal file
74
content/concepts/overview.mdx
Normal file
@@ -0,0 +1,74 @@
|
||||
---
|
||||
title: 核心概念
|
||||
sidebarTitle: 核心概念
|
||||
description: Token、上下文窗口、模型 ID 与计费
|
||||
---
|
||||
|
||||
# 核心概念
|
||||
|
||||
理解以下概念,有助于控制成本、避免超长报错,并正确对接 [HTTP API](/docs/guides/http_api) 与 [OpenAI SDK](/docs/guides/openai_compatible)。
|
||||
|
||||
## Token 与 usage
|
||||
|
||||
**Token** 是模型处理文本的基本单位,可粗略理解为「字 / 词」的切分片段。不同模型分词方式不同,**中文、英文、数字、符号** 的 token 数未必与字符数 1:1 对应。
|
||||
|
||||
每次成功的 Chat Completions 响应(非流式)通常包含 `usage` 字段,例如:
|
||||
|
||||
```json
|
||||
"usage": {
|
||||
"prompt_tokens": 100,
|
||||
"completion_tokens": 200,
|
||||
"total_tokens": 300
|
||||
}
|
||||
```
|
||||
|
||||
- **prompt_tokens**:输入侧(含 `messages` 与部分系统开销)
|
||||
- **completion_tokens**:模型生成内容
|
||||
- 控制台 **使用记录** 与 **费用账单** 按平台计价规则据此扣费
|
||||
|
||||
流式调用结束后,也可能在最后一个 chunk 或汇总接口中提供 usage,以实际返回为准。
|
||||
|
||||
## 上下文窗口
|
||||
|
||||
**上下文窗口** 指单次请求中,模型能处理的 **最大 token 总量**(通常包括用户输入、历史多轮、模型输出;部分推理模型还包含中间推理 token)。
|
||||
|
||||
若对话过长:
|
||||
|
||||
1. **超出部分可能被截断**,导致模型「忘记」 earlier 内容
|
||||
2. 可能直接返回参数或长度类错误
|
||||
|
||||
**建议:**
|
||||
|
||||
- 在 [模型广场](https://console.haiyushuke.com/models) 查看各模型上下文上限
|
||||
- 长文档场景优先选用 **长上下文** 模型,或做分段摘要 + RAG
|
||||
- 多模态输入(图片、音频等)常有 **更严格的输入限制**,以模型说明为准
|
||||
|
||||
## 模型 ID
|
||||
|
||||
**模型 ID** 是 API 中 `model` 字段的字符串,是调用时的唯一标识。
|
||||
|
||||
- 必须从 **控制台模型广场** 复制,勿臆造或沿用其他平台的名称
|
||||
- API Key 可配置 **可用模型** 子集;请求未授权的 ID 会失败
|
||||
- 厂商升级版本时 ID 可能变化(如 `glm-5` → `glm-5.1`),需关注控制台公告
|
||||
|
||||
详见 [工具接入概览](/docs/integrations/overview) 与控制台 **模型广场**。
|
||||
|
||||
## API Key 与控制台登录
|
||||
|
||||
- **API Key**:用于 `Authorization: Bearer`,调用 **网关 API**
|
||||
- **控制台 JWT / Session**:仅用于登录 **console.haiyushuke.com** 管理资源
|
||||
|
||||
二者不可混用。Key 泄露风险高,须 [妥善保管](/docs/guides/api_keys)。
|
||||
|
||||
## 余额与扣费
|
||||
|
||||
调用前账户需有足够 **余额**(预付费模式)。扣费一般发生在请求成功并完成计量之后;余额不足时返回 **402** / `INSUFFICIENT_BALANCE`。见 [计费与财务](/docs/guides/billing)。
|
||||
|
||||
## 统一网关
|
||||
|
||||
海宇数科 **统一网关** 对上游多厂商做路由与计量:您面对的是一个 Base URL 与一套 Key 体系,底层模型由平台调度至对应供应商。因此文档与控制台以 **海宇模型 ID** 为准,而非各厂商原站产品名。
|
||||
|
||||
## 延伸阅读
|
||||
|
||||
- [快速开始](/docs/getting-started)
|
||||
- [常见问题](/docs/faq)
|
||||
126
content/faq.mdx
126
content/faq.mdx
@@ -1,32 +1,128 @@
|
||||
---
|
||||
title: 常见问题
|
||||
description: 接入与使用中的常见问题解答
|
||||
description: 接入、账号、计费与错误排查
|
||||
---
|
||||
|
||||
# 常见问题
|
||||
|
||||
## 返回 401 Unauthorized
|
||||
## 账号与实名认证
|
||||
|
||||
- 检查 `Authorization: Bearer` 后是否有多余空格
|
||||
- 确认 Key 未被禁用、未过期
|
||||
- 确认请求发往正确的 Base URL
|
||||
### 为什么无法创建 API Key 或充值?
|
||||
|
||||
## 返回 429 Too Many Requests
|
||||
创建 API Key、使用体验中心、充值与查看完整财务信息前,需先在 **账户中心 → 实名认证** 完成认证。若页面提示「请先完成实名认证」,按指引提交材料即可。
|
||||
|
||||
表示触发 **限流**。请降低并发、实现指数退避重试,或联系商务提升配额。
|
||||
### 个人认证和企业认证有什么区别?
|
||||
|
||||
## 模型不存在 / model_not_found
|
||||
- **个人认证**:满足个人开发者试调用、在线充值与 API 接入。
|
||||
- **企业认证**:满足企业对公结算、发票与合规要求;**对公转账充值** 仅企业认证用户可用。
|
||||
|
||||
模型 ID 拼写错误或账号未开通该模型。请在 **模型广场** 复制准确 ID。
|
||||
### 实名核验次数有限制吗?
|
||||
|
||||
## 如何对账?
|
||||
个人/企业/法人相关核验接口有 **每日次数上限**(如单日 10 次)。若提示「今日核验次数已达上限」,请次日再试或联系客服。
|
||||
|
||||
控制台 **账单** 模块可按日查看调用量与费用;企业客户可申请导出明细与发票。
|
||||
### 如何修改登录密码?
|
||||
|
||||
## 是否支持私有化部署?
|
||||
**账户中心 → 账号设置** 中通过手机号验证修改密码;忘记密码可在登录页使用 **忘记密码** 流程。
|
||||
|
||||
企业方案支持专有云与私有化,请通过官网 [联系我们](/#contact) 获取方案与 POC 安排。
|
||||
---
|
||||
|
||||
## 文档有错误怎么办?
|
||||
## 接入与 API
|
||||
|
||||
文档随产品迭代更新;若发现过时信息,请通过控制台反馈或邮件联系技术支持。
|
||||
### Base URL 和路径是什么?
|
||||
|
||||
- Base URL:`https://api.haiyushuke.com/v1`
|
||||
- 对话补全:`POST /chat/completions`
|
||||
- 鉴权:`Authorization: Bearer <API Key>`
|
||||
|
||||
与 OpenAI 官方 SDK 兼容时,仅需修改 `apiKey` 与 `baseURL`。详见 [OpenAI SDK 兼容](/docs/guides/openai_compatible) 与 [核心概念 · Token](/docs/concepts/overview#token-与-usage)。
|
||||
|
||||
### 返回 401 Unauthorized
|
||||
|
||||
- 确认 Header 为 `Bearer <Key>`,Bearer 与 Key 之间有一个空格
|
||||
- Key 是否已 **禁用** 或 **过期**
|
||||
- 是否误用了控制台登录 JWT 代替 API Key
|
||||
- 请求是否发往正确的网关域名
|
||||
|
||||
### 返回 403 Forbidden
|
||||
|
||||
常见原因:
|
||||
|
||||
- 未完成实名认证却访问受限能力(控制台内功能)
|
||||
- API Key 绑定的 **模型列表** 不包含当前请求的 `model`
|
||||
- **IP 白名单** 未包含调用方出口 IP
|
||||
|
||||
### 返回 402 / 余额不足还能调用吗?
|
||||
|
||||
不能。业务码一般为 `INSUFFICIENT_BALANCE`,表示账户余额不足以完成扣费。请在 **财务 → 账户充值** 充值,或在 **通知管理** 中设置余额告警。
|
||||
|
||||
### 返回 429 Too Many Requests
|
||||
|
||||
表示触发 **限流**(网关或上游)。请降低并发、对可重试错误做指数退避,或联系商务提升配额。
|
||||
|
||||
### 模型不存在 / model_not_found
|
||||
|
||||
- 检查 `model` 字符串是否与 **模型广场** 中的 ID 完全一致(区分大小写与后缀)
|
||||
- 确认该 Key 的 **可用模型** 范围是否包含此模型
|
||||
- 新模型上线后若不可用,刷新模型列表或联系支持确认开通状态
|
||||
|
||||
### 流式调用没有输出或中途断开
|
||||
|
||||
- 请求体需设置 `"stream": true`
|
||||
- 客户端需持续读取 SSE,并处理网络超时与代理缓冲
|
||||
- 详见 [流式调用](/docs/guides/streaming)
|
||||
|
||||
### 能否在前端网页直接调用 API?
|
||||
|
||||
**不建议。** API Key 会暴露在浏览器中。请由后端服务器持有 Key 并转发请求。
|
||||
|
||||
---
|
||||
|
||||
## 计费与账单
|
||||
|
||||
### 如何计费?
|
||||
|
||||
通常按模型的 **输入 token** 与 **输出 token** 单价从余额扣减;部分多模态模型按分辨率或时长分档,以模型广场说明为准。
|
||||
|
||||
### 如何对账?
|
||||
|
||||
- **使用记录**:按次查看模型、用量与费用
|
||||
- **费用账单**:按月汇总
|
||||
- 企业客户如需定制导出,请 [联系我们](/#contact)
|
||||
|
||||
### 如何开发票?
|
||||
|
||||
**财务 → 发票开具**(需实名认证)。按页面选择已结清账单并填写开票信息;具体规则以控制台为准。
|
||||
|
||||
### 充值未到账怎么办?
|
||||
|
||||
在 **充值明细** 查看订单状态;在线支付可能存在几分钟延迟。长时间未到账请保留订单号并联系客服。
|
||||
|
||||
---
|
||||
|
||||
## 控制台与产品
|
||||
|
||||
### 控制台「开发文档」在哪里?
|
||||
|
||||
侧栏 **开发文档**、模型卡片 **接入文档**、底部 **常见问题** 均跳转至官网 **文档中心**(本站 `/docs`)。
|
||||
|
||||
### 智能报告和 Agent 技能如何接入?
|
||||
|
||||
官网 [智能报告](/reports) 与 [Agent 技能](/agents) 介绍场景与示例;Skill 安装能力持续开放,可关注控制台与官网公告。
|
||||
|
||||
### 是否支持私有化部署?
|
||||
|
||||
企业方案支持专有云与私有化部署,请通过 [联系我们](/#contact) 获取方案与 POC 安排。
|
||||
|
||||
---
|
||||
|
||||
## 其他
|
||||
|
||||
### 文档有错误或过时怎么办?
|
||||
|
||||
文档随产品迭代更新。若与控制台展示不一致,以控制台为准,并欢迎通过客服或 main@haiyushuke.cn 反馈。
|
||||
|
||||
### 如何获取技术支持?
|
||||
|
||||
- 控制台侧栏 **在线客服**
|
||||
- 官网 [联系我们](/#contact)
|
||||
- 邮件 main@haiyushuke.cn
|
||||
|
||||
@@ -1,44 +1,88 @@
|
||||
---
|
||||
title: 快速开始
|
||||
description: 五分钟完成 API Key 创建与首次调用
|
||||
description: 注册、环境配置、API Key 与首次调用
|
||||
---
|
||||
|
||||
# 快速开始
|
||||
|
||||
按以下步骤即可在海宇数科平台完成首次模型调用。
|
||||
本指南对应开放平台常见的「分钟级接入」流程(参见 [智谱 · 快速开始](https://docs.bigmodel.cn/cn/guide/start/introduction) 类文档结构),步骤以 **海宇数科控制台与网关** 为准。
|
||||
|
||||
## 1. 注册并登录控制台
|
||||
|
||||
访问 [控制台](https://console.haiyushuke.com),使用企业邮箱或手机号完成注册。首次登录建议完成实名/企业认证(若你方环境要求)。
|
||||
访问 [控制台](https://console.haiyushuke.com),使用手机号注册并登录。
|
||||
|
||||
## 2. 创建 API Key
|
||||
## 2. 完成实名认证
|
||||
|
||||
1. 进入 **设置 → API Key**
|
||||
2. 点击 **创建密钥**,填写名称(如 `prod-backend`)
|
||||
3. 复制密钥并妥善保存(仅展示一次)
|
||||
创建 **API Key**、使用 **体验中心**、**账户充值** 与查看完整 **财务** 信息前,需完成实名认证:
|
||||
|
||||
## 3. 选择模型与端点
|
||||
1. 侧栏 **账户中心 → 实名认证**
|
||||
2. 按页面指引提交个人或企业认证材料
|
||||
3. 认证通过后,上述功能即可正常使用
|
||||
|
||||
在 **模型广场** 或 **接入文档** 中确认:
|
||||
企业用户若需 **对公转账充值**,须完成 **企业认证**。
|
||||
|
||||
- 模型 ID(如 `gpt-4o-mini`、`deepseek-chat`)
|
||||
- 兼容协议(一般为 OpenAI Chat Completions)
|
||||
## 3. 配置开发环境(可选)
|
||||
|
||||
## 4. 发起测试请求
|
||||
在集成代码的机器上设置环境变量,避免硬编码 Key:
|
||||
|
||||
```bash
|
||||
export HAIYUSHUKE_API_KEY="你的密钥"
|
||||
export HAIYUSHUKE_BASE_URL="https://api.haiyushuke.com/v1"
|
||||
```
|
||||
|
||||
SDK 安装:
|
||||
|
||||
```bash
|
||||
# Node.js
|
||||
npm install openai
|
||||
|
||||
# Python
|
||||
pip install openai
|
||||
```
|
||||
|
||||
详见 [OpenAI SDK 兼容](/docs/guides/openai_compatible)。
|
||||
|
||||
## 4. 为账户充值(可选)
|
||||
|
||||
预付费环境下,请进入 **财务 → 账户充值** 完成充值后再调用 API。
|
||||
|
||||
## 5. 创建 API Key
|
||||
|
||||
1. 侧栏 **API Key** → **创建**
|
||||
2. 填写名称(如 `dev-backend`)
|
||||
3. 可选:可用模型、额度、过期时间、IP 白名单
|
||||
4. **立即复制并保存** 完整密钥(仅展示一次)
|
||||
|
||||
## 6. 选择模型 ID
|
||||
|
||||
在控制台 **模型广场** 确认 `model` ID;也可在 **体验中心** 试调用后再写入代码。IDE 配置见 [工具接入概览](/docs/integrations/overview)。
|
||||
|
||||
## 7. 发起测试请求
|
||||
|
||||
**HTTP(curl):**
|
||||
|
||||
```bash
|
||||
curl https://api.haiyushuke.com/v1/chat/completions \
|
||||
-H "Authorization: Bearer YOUR_API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"model": "gpt-4o-mini",
|
||||
"model": "deepseek-chat",
|
||||
"messages": [{"role": "user", "content": "你好,请用一句话介绍海宇数科"}]
|
||||
}'
|
||||
```
|
||||
|
||||
成功时响应 JSON 中包含 `choices[0].message.content`。
|
||||
成功时 JSON 含 `choices[0].message.content` 与 `usage`。接口细节见 [HTTP API](/docs/guides/http_api)。
|
||||
|
||||
## 8. 核对用量
|
||||
|
||||
在 **财务 → 使用记录** 查看 token 与费用;理解 **Token** 含义见 [核心概念](/docs/concepts/overview)。
|
||||
|
||||
## 下一步
|
||||
|
||||
- 按厂商阅读 [OpenAI 接入](/docs/models/openai)、[Claude 接入](/docs/models/claude)
|
||||
- 了解 [流式调用](/docs/guides/streaming) 与 [API Key 管理](/docs/guides/api_keys)
|
||||
| 目标 | 文档 |
|
||||
| --- | --- |
|
||||
| 用 SDK 接入 | [OpenAI SDK 兼容](/docs/guides/openai_compatible) |
|
||||
| 流式 UI | [流式调用](/docs/guides/streaming) |
|
||||
| 配置 IDE | [Cursor](/docs/integrations/cursor)、[Claude Code](/docs/integrations/claude_code) 等 |
|
||||
| 运维与计费 | [API Key](/docs/guides/api_keys)、[计费与财务](/docs/guides/billing) |
|
||||
| 排错 | [常见问题](/docs/faq) |
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
export default {
|
||||
console: "???",
|
||||
http_api: "HTTP API",
|
||||
openai_compatible: "OpenAI 兼容 SDK",
|
||||
console: "控制台",
|
||||
api_keys: "API Key",
|
||||
streaming: "????",
|
||||
streaming: "流式调用",
|
||||
billing: "计费与财务",
|
||||
};
|
||||
|
||||
@@ -1,26 +1,55 @@
|
||||
---
|
||||
title: API Key 管理
|
||||
sidebarTitle: API Key
|
||||
description: 创建、轮换与权限最佳实践
|
||||
description: 创建、轮换、额度与白名单最佳实践
|
||||
---
|
||||
|
||||
# API Key 管理
|
||||
|
||||
在控制台侧栏 **API Key** 中管理所有调用凭证。创建与管理前需完成 **实名认证**。
|
||||
|
||||
## 创建
|
||||
|
||||
控制台 → **设置 → API Key** → **创建**。建议命名包含环境与用途,例如 `prod-report-agent`。
|
||||
1. 点击 **创建**
|
||||
2. 填写名称(建议包含环境与用途,如 `prod-report-agent`)
|
||||
3. 可选配置:
|
||||
- **可用模型**:限制该 Key 只能调用指定模型
|
||||
- **额度上限 / 剩余额度**:控制总消耗
|
||||
- **过期时间**:到期后 Key 自动失效
|
||||
- **IP 白名单**:仅允许 listed IP 调用(留空表示不限制,生产环境建议配置)
|
||||
|
||||
创建成功后请 **立即复制并保存** 完整密钥;之后列表仅显示脱敏前缀。
|
||||
|
||||
## 鉴权方式
|
||||
|
||||
HTTP 请求头:
|
||||
|
||||
```http
|
||||
Authorization: Bearer <你的 API Key>
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
||||
OpenAI SDK 中将该 Key 设为 `apiKey`,`baseURL` 设为 `https://api.haiyushuke.com/v1`(见 [OpenAI 兼容 SDK](/docs/guides/openai_compatible))。
|
||||
|
||||
## 存储
|
||||
|
||||
- 使用环境变量:`HAIYUSHUKE_API_KEY`
|
||||
- 密钥管理系统(KMS / Vault)中保存,勿提交至 Git
|
||||
- 环境变量:如 `HAIYUSHUKE_API_KEY`
|
||||
- 密钥管理系统(KMS / Vault),勿提交至 Git 或镜像层
|
||||
|
||||
## 轮换流程
|
||||
|
||||
1. 创建新 Key
|
||||
2. 在应用配置中灰度切换
|
||||
3. 确认流量稳定后禁用旧 Key
|
||||
1. 创建新 Key(可先绑定相同模型与 IP 策略)
|
||||
2. 在应用配置中灰度切换
|
||||
3. 观察 **使用记录** 确认旧 Key 无流量后 **禁用** 旧 Key
|
||||
|
||||
## 泄露应急
|
||||
|
||||
若 Key 已泄露:立即 **禁用** 该 Key → 新建 → 排查仓库与 CI 日志是否残留。
|
||||
1. 控制台中 **禁用** 泄露的 Key
|
||||
2. 新建 Key 并更新部署
|
||||
3. 检查 Git 历史、CI 日志、前端 bundle 是否残留
|
||||
4. 若曾未设 IP 白名单,建议新 Key 启用白名单
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [快速开始](/docs/getting-started)
|
||||
- [常见问题:401 与 Key](/docs/faq#返回-401-unauthorized)
|
||||
|
||||
43
content/guides/billing.mdx
Normal file
43
content/guides/billing.mdx
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: 计费与财务
|
||||
sidebarTitle: 计费与财务
|
||||
description: 充值、账单、使用记录与发票说明
|
||||
---
|
||||
|
||||
# 计费与财务
|
||||
|
||||
模型调用按 **输入 token / 输出 token**(或模型广场标注的计价单位)从账户 **余额** 扣费。请在控制台 **财务** 菜单中查看与充值。
|
||||
|
||||
## 模块说明
|
||||
|
||||
| 菜单 | 作用 |
|
||||
| --- | --- |
|
||||
| 财务总览 | 当前余额、近期消耗与快捷入口 |
|
||||
| 账户充值 | 在线充值(需先完成实名认证) |
|
||||
| 充值明细 | 充值订单与到账状态 |
|
||||
| 费用账单 | 按月汇总模型与相关服务费用 |
|
||||
| 使用记录 | 单次调用的模型、用量与扣费明细 |
|
||||
| 发票开具 | 对已结清账单申请增值税发票(需实名认证) |
|
||||
|
||||
## 计费逻辑(概要)
|
||||
|
||||
1. 发起 API 或体验中心调用前,账户需有足够余额。
|
||||
2. 请求成功后,系统按模型定价与实际上下 token 用量记账。
|
||||
3. 余额不足时,网关可能返回 **402 Payment Required**(业务码 `INSUFFICIENT_BALANCE`),请先 [账户充值](https://console.haiyushuke.com/finance/recharge)。
|
||||
|
||||
具体单价以 **模型广场** 各模型卡片为准;促销或「特惠」模型以控制台标注为准。
|
||||
|
||||
## 余额告警
|
||||
|
||||
在 **账户中心 → 通知管理** 中可配置余额阈值与通知方式,避免生产流量因余额耗尽中断。
|
||||
|
||||
## 对账建议
|
||||
|
||||
- 日常:用 **使用记录** 按模型、时间筛选,与业务日志中的 request id 对照。
|
||||
- 月度:导出或查看 **费用账单**,与财务系统对账。
|
||||
- 企业客户:如需明细导出、合同价或专票流程,请通过 [联系我们](/#contact) 联系商务。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [控制台使用指南](/docs/guides/console)
|
||||
- [常见问题:余额与账单](/docs/faq#余额不足还能调用吗)
|
||||
@@ -8,23 +8,38 @@ description: 控制台主要功能与导航说明
|
||||
|
||||
控制台地址:[https://console.haiyushuke.com](https://console.haiyushuke.com)
|
||||
|
||||
## 主要模块
|
||||
## 侧栏模块
|
||||
|
||||
1. **概览**:用量、余额与近期调用趋势
|
||||
2. **模型广场**:浏览可用模型、定价与能力说明
|
||||
3. **API Key**:创建、轮换、禁用密钥
|
||||
4. **调用日志**(若已开通):按时间筛选请求与错误
|
||||
5. **账单**:充值、发票与明细导出
|
||||
| 模块 | 说明 |
|
||||
| --- | --- |
|
||||
| 数据看板 | 用量与账户概览(持续完善中) |
|
||||
| 模型广场 | 浏览国内模型、价格、能力标签;复制模型 ID;**接入文档** 跳转官网 [工具接入](/docs/integrations/overview) |
|
||||
| 体验中心 | 登录且实名认证后,在线对话试调用 |
|
||||
| API Key | 创建与管理调用凭证、额度与 IP 白名单 |
|
||||
| 开发文档 | 跳转至官网 [文档中心](/docs) |
|
||||
| 财务 | 总览、充值、充值明细、账单、使用记录、发票 |
|
||||
| 账户中心 | 账号设置、实名认证、通知管理 |
|
||||
|
||||
侧栏底部 **常见问题** 同样跳转至官网文档 [FAQ](/docs/faq);**在线客服** 打开企业微信客服。
|
||||
|
||||
## 推荐工作流
|
||||
|
||||
1. 创建 API Key
|
||||
2. 在模型广场选择目标模型
|
||||
3. 使用 SDK 或 cURL 完成联调
|
||||
4. 在概览与调用日志中核对用量
|
||||
1. 完成 **实名认证**
|
||||
2. **账户充值**(若账户需预付费)
|
||||
3. 在 **模型广场** 选定模型,在 **体验中心** 验证效果
|
||||
4. 在 **API Key** 创建密钥并限制模型范围
|
||||
5. 在 Cursor 等工具或业务服务中配置 `baseURL` 与 Key,见 [工具接入概览](/docs/integrations/overview)
|
||||
6. 在 **使用记录** / **费用账单** 中核对用量
|
||||
|
||||
## 权限与安全
|
||||
|
||||
- 为不同环境(开发 / 预发 / 生产)使用不同 Key
|
||||
- 定期轮换 Key;泄露后立即 **禁用** 并新建
|
||||
- 生产环境勿将 Key 写入前端 bundle
|
||||
- 开发、预发、生产使用 **不同 API Key**,便于泄露时单独轮换
|
||||
- 生产环境勿将 Key 写入前端静态资源或公开仓库
|
||||
- 为 Key 配置 **IP 白名单** 可降低密钥泄露风险
|
||||
- Key 泄露后:立即 **禁用** → 新建 Key → 排查 CI 与日志是否残留
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [API Key 管理](/docs/guides/api_keys)
|
||||
- [计费与财务](/docs/guides/billing)
|
||||
- [工具接入概览](/docs/integrations/overview)
|
||||
|
||||
95
content/guides/http_api.mdx
Normal file
95
content/guides/http_api.mdx
Normal file
@@ -0,0 +1,95 @@
|
||||
---
|
||||
title: HTTP API 调用
|
||||
sidebarTitle: HTTP API
|
||||
description: RESTful Chat Completions 接口说明
|
||||
---
|
||||
|
||||
# HTTP API 调用
|
||||
|
||||
海宇数科网关提供与 OpenAI 兼容的 **RESTful HTTP API**,适用于任意编程语言、curl、API 网关或服务 mesh,无需安装专用 SDK。
|
||||
|
||||
## 基本信息
|
||||
|
||||
| 项目 | 值 |
|
||||
| --- | --- |
|
||||
| Base URL | `https://api.haiyushuke.com/v1` |
|
||||
| 对话补全 | `POST /chat/completions` |
|
||||
| Content-Type | `application/json` |
|
||||
| 鉴权 | `Authorization: Bearer <API_KEY>` |
|
||||
|
||||
API Key 在控制台 **API Key** 创建;详见 [API Key 管理](/docs/guides/api_keys)。
|
||||
|
||||
## 请求示例
|
||||
|
||||
```bash
|
||||
curl https://api.haiyushuke.com/v1/chat/completions \
|
||||
-H "Authorization: Bearer YOUR_API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"model": "deepseek-chat",
|
||||
"messages": [
|
||||
{"role": "system", "content": "你是简洁的企业助手。"},
|
||||
{"role": "user", "content": "什么是 Token?"}
|
||||
],
|
||||
"temperature": 0.7,
|
||||
"max_tokens": 1024
|
||||
}'
|
||||
```
|
||||
|
||||
## 请求体常用字段
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `model` | string | **必填**。控制台模型广场中的 ID |
|
||||
| `messages` | array | **必填**。`role`:`system` / `user` / `assistant` |
|
||||
| `temperature` | number | 可选,采样随机性,常见 0–2 |
|
||||
| `max_tokens` | integer | 可选,限制本次最大生成 token |
|
||||
| `stream` | boolean | 可选,`true` 时返回 SSE,见 [流式调用](/docs/guides/streaming) |
|
||||
|
||||
部分模型支持更多参数(如 `top_p`、`stop` 等),与 OpenAI 兼容子集一致;不支持的字段可能被忽略或返回参数错误。
|
||||
|
||||
## 响应结构(非流式)
|
||||
|
||||
成功时 HTTP **200**,JSON 主体包含:
|
||||
|
||||
- `id`:请求标识
|
||||
- `choices[].message.content`:模型回复文本
|
||||
- `usage`:token 统计,用于对账,见 [核心概念](/docs/concepts/overview#token-与-usage)
|
||||
|
||||
```json
|
||||
{
|
||||
"choices": [
|
||||
{
|
||||
"message": { "role": "assistant", "content": "..." },
|
||||
"finish_reason": "stop"
|
||||
}
|
||||
],
|
||||
"usage": {
|
||||
"prompt_tokens": 12,
|
||||
"completion_tokens": 48,
|
||||
"total_tokens": 60
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 错误与 HTTP 状态码
|
||||
|
||||
| 状态 | 常见原因 |
|
||||
| --- | --- |
|
||||
| 401 | Key 无效、过期、禁用或 Authorization 格式错误 |
|
||||
| 402 | 账户余额不足(`INSUFFICIENT_BALANCE`) |
|
||||
| 403 | Key 无该模型权限、IP 不在白名单等 |
|
||||
| 429 | 限流,需退避重试 |
|
||||
| 4xx/5xx | 参数错误、模型不存在或上游异常,见响应 body 中的 `message` / `code` |
|
||||
|
||||
更多排查见 [常见问题](/docs/faq)。
|
||||
|
||||
## 流式响应
|
||||
|
||||
设置 `"stream": true` 后,响应为 **SSE** 增量块,格式与 OpenAI 流式兼容。客户端须持续读取直至 `[DONE]`,并处理断线重试。
|
||||
|
||||
## 下一步
|
||||
|
||||
- [OpenAI SDK 兼容](/docs/guides/openai_compatible)
|
||||
- [快速开始](/docs/getting-started)
|
||||
- [工具接入概览](/docs/integrations/overview)(Cursor、Claude Code 等)
|
||||
99
content/guides/openai_compatible.mdx
Normal file
99
content/guides/openai_compatible.mdx
Normal file
@@ -0,0 +1,99 @@
|
||||
---
|
||||
title: OpenAI 兼容 SDK
|
||||
sidebarTitle: OpenAI 兼容 SDK
|
||||
description: 使用 OpenAI 官方 SDK 对接海宇数科网关(协议兼容,模型为国内 ID)
|
||||
---
|
||||
|
||||
# OpenAI SDK 兼容
|
||||
|
||||
若您已有基于 **OpenAI 官方 SDK** 的应用,迁移到海宇数科通常只需两步:
|
||||
|
||||
1. 将 `baseURL`(或 `base_url`)改为 `https://api.haiyushuke.com/v1`
|
||||
2. 将 `apiKey` 改为在海宇控制台创建的 **API Key**
|
||||
|
||||
协议兼容 **Chat Completions**(`client.chat.completions.create`),便于零学习成本切换。
|
||||
|
||||
## 环境变量(推荐)
|
||||
|
||||
```bash
|
||||
# Linux / macOS
|
||||
export HAIYUSHUKE_API_KEY="sk-..."
|
||||
export HAIYUSHUKE_BASE_URL="https://api.haiyushuke.com/v1"
|
||||
```
|
||||
|
||||
```powershell
|
||||
# Windows PowerShell
|
||||
$env:HAIYUSHUKE_API_KEY="sk-..."
|
||||
$env:HAIYUSHUKE_BASE_URL="https://api.haiyushuke.com/v1"
|
||||
```
|
||||
|
||||
## Node.js
|
||||
|
||||
安装依赖:
|
||||
|
||||
```bash
|
||||
npm install openai
|
||||
```
|
||||
|
||||
```ts
|
||||
import OpenAI from "openai";
|
||||
|
||||
const client = new OpenAI({
|
||||
apiKey: process.env.HAIYUSHUKE_API_KEY,
|
||||
baseURL: process.env.HAIYUSHUKE_BASE_URL ?? "https://api.haiyushuke.com/v1",
|
||||
});
|
||||
|
||||
const completion = await client.chat.completions.create({
|
||||
model: "deepseek-chat",
|
||||
messages: [{ role: "user", content: "Hello" }],
|
||||
});
|
||||
|
||||
console.log(completion.choices[0]?.message?.content);
|
||||
```
|
||||
|
||||
## Python
|
||||
|
||||
安装依赖:
|
||||
|
||||
```bash
|
||||
pip install openai
|
||||
```
|
||||
|
||||
```python
|
||||
import os
|
||||
from openai import OpenAI
|
||||
|
||||
client = OpenAI(
|
||||
api_key=os.environ["HAIYUSHUKE_API_KEY"],
|
||||
base_url=os.environ.get("HAIYUSHUKE_BASE_URL", "https://api.haiyushuke.com/v1"),
|
||||
)
|
||||
|
||||
resp = client.chat.completions.create(
|
||||
model="deepseek-chat",
|
||||
messages=[{"role": "user", "content": "Hello"}],
|
||||
)
|
||||
print(resp.choices[0].message.content)
|
||||
```
|
||||
|
||||
## 流式
|
||||
|
||||
与 OpenAI 相同,设置 `stream=True` / `stream: true`,详见 [流式调用](/docs/guides/streaming)。
|
||||
|
||||
## LangChain 等框架
|
||||
|
||||
在 LangChain 中配置自定义 `baseURL` 与 API Key 即可指向海宇网关(具体类名随 LangChain 版本而异,原则与上文一致)。模型名填控制台 **模型 ID**。
|
||||
|
||||
## 与直连 OpenAI 的差异
|
||||
|
||||
| 项目 | 说明 |
|
||||
| --- | --- |
|
||||
| 模型名 | 使用海宇 **模型广场 ID**,非 OpenAI 原站名称(若不同) |
|
||||
| 账号与计费 | 海宇控制台余额与 **使用记录**,与 OpenAI 账单无关 |
|
||||
| 能力边界 | 以各模型在海宇侧实际上线能力为准(工具调用、多模态等) |
|
||||
| 密钥 | 必须使用 **API Key**,不能使用控制台登录 JWT |
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [HTTP API 调用](/docs/guides/http_api)
|
||||
- [工具接入概览](/docs/integrations/overview)
|
||||
- [API Key 管理](/docs/guides/api_keys)
|
||||
@@ -6,7 +6,7 @@ description: SSE 流式输出接入说明
|
||||
|
||||
# 流式调用
|
||||
|
||||
在请求体中设置 `"stream": true`,服务端以 SSE 形式返回增量内容。
|
||||
在请求体中设置 `"stream": true`,服务端以 SSE 形式返回增量内容。协议与 OpenAI 流式兼容;HTTP 基础见 [HTTP API](/docs/guides/http_api)。
|
||||
|
||||
## cURL
|
||||
|
||||
@@ -14,14 +14,14 @@ description: SSE 流式输出接入说明
|
||||
curl https://api.haiyushuke.com/v1/chat/completions \
|
||||
-H "Authorization: Bearer YOUR_API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"model":"gpt-4o-mini","stream":true,"messages":[{"role":"user","content":"写一首四句诗"}]}'
|
||||
-d '{"model":"deepseek-chat","stream":true,"messages":[{"role":"user","content":"写一首四句诗"}]}'
|
||||
```
|
||||
|
||||
## OpenAI SDK(Node)
|
||||
|
||||
```ts
|
||||
const stream = await client.chat.completions.create({
|
||||
model: "gpt-4o-mini",
|
||||
model: "deepseek-chat",
|
||||
stream: true,
|
||||
messages: [{ role: "user", content: "你好" }],
|
||||
});
|
||||
|
||||
1160
content/index.mdx
1160
content/index.mdx
File diff suppressed because it is too large
Load Diff
7
content/integrations/_meta.js
Normal file
7
content/integrations/_meta.js
Normal file
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
overview: "接入概览",
|
||||
cursor: "Cursor",
|
||||
claude_code: "Claude Code",
|
||||
continue: "Continue",
|
||||
cline: "Cline",
|
||||
};
|
||||
56
content/integrations/claude_code.mdx
Normal file
56
content/integrations/claude_code.mdx
Normal file
@@ -0,0 +1,56 @@
|
||||
---
|
||||
title: Claude Code 接入
|
||||
sidebarTitle: Claude Code
|
||||
description: 在 Claude Code CLI 中对接自定义 API(OpenAI 兼容)
|
||||
---
|
||||
|
||||
# Claude Code 接入
|
||||
|
||||
**Claude Code** 是面向终端的 AI 编程助手。不同版本对「自定义后端」的支持方式可能不同;海宇数科网关当前对外主要提供 **OpenAI Chat Completions 兼容** 接口(`https://api.haiyushuke.com/v1`),**不提供** Anthropic 海外 Claude 原厂模型。
|
||||
|
||||
若你的 Claude Code 版本支持 **OpenAI 兼容 Base URL** 或可在配置中指定 OpenAI 风格端点,可按下列方式接入;若仅支持 Anthropic 原生 API,则需改用 [Cursor](/docs/integrations/cursor)、[Continue](/docs/integrations/continue) 等工具,或通过业务后端自行调用 [HTTP API](/docs/guides/http_api)。
|
||||
|
||||
## 前置条件
|
||||
|
||||
- 控制台已 **实名认证**,已创建 **API Key**
|
||||
- 已在 **模型广场** 选定国内模型 ID(勿填海外 `claude-*` 名称)
|
||||
|
||||
## 配置思路(OpenAI 兼容)
|
||||
|
||||
在 Claude Code 的环境变量或配置文件中(以官方文档为准),尝试设置与海宇网关等价的 OpenAI 兼容项,例如:
|
||||
|
||||
```bash
|
||||
# 示例:名称以 Claude Code 当前版本文档为准
|
||||
export OPENAI_API_KEY="YOUR_HAIYUSHUKE_API_KEY"
|
||||
export OPENAI_BASE_URL="https://api.haiyushuke.com/v1"
|
||||
```
|
||||
|
||||
将 **模型名** 设为控制台模型 ID,例如:
|
||||
|
||||
```bash
|
||||
# 示例模型 ID,请替换为模型广场实际值
|
||||
export ANTHROPIC_MODEL="deepseek-chat"
|
||||
```
|
||||
|
||||
> 部分 CLI 仍使用 `ANTHROPIC_*` 前缀命名环境变量,但后端实际走的是您配置的 Base URL;请以 Claude Code 官方说明为准,并确认其请求是否落在 `/v1/chat/completions` 兼容路径上。
|
||||
|
||||
## 验证
|
||||
|
||||
1. 在控制台 **体验中心** 用同一模型 ID 发送一条消息
|
||||
2. 在 Claude Code 中发起简单任务(如解释一个本地文件)
|
||||
3. 在 **财务 → 使用记录** 查看是否产生对应调用
|
||||
|
||||
## 故障排查
|
||||
|
||||
| 现象 | 建议 |
|
||||
| --- | --- |
|
||||
| 401 | 检查 API Key、是否误用登录 token |
|
||||
| 403 | Key 未授权该模型 ID,或 IP 白名单限制 |
|
||||
| 402 | 余额不足,前往充值 |
|
||||
| 协议不匹配 | 换用 Cursor / Continue,或直接用 HTTP/SDK 集成 |
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [工具接入概览](/docs/integrations/overview)
|
||||
- [Cursor 接入](/docs/integrations/cursor)
|
||||
- [常见问题](/docs/faq)
|
||||
33
content/integrations/cline.mdx
Normal file
33
content/integrations/cline.mdx
Normal file
@@ -0,0 +1,33 @@
|
||||
---
|
||||
title: Cline 接入
|
||||
sidebarTitle: Cline
|
||||
description: 在 VS Code 的 Cline 扩展中使用海宇 OpenAI 兼容 API
|
||||
---
|
||||
|
||||
# Cline 接入
|
||||
|
||||
[Cline](https://github.com/cline/cline)(原 Claude Dev)是 VS Code 中的自主编程扩展,支持通过 **OpenAI 兼容 API** 使用自定义模型。
|
||||
|
||||
## 前置条件
|
||||
|
||||
- 控制台创建 **API Key**,并确认可用模型包含目标 ID
|
||||
|
||||
## 配置步骤
|
||||
|
||||
1. 打开 VS Code → Cline 侧边栏 → **Settings**(设置)
|
||||
2. 选择 API Provider 为 **OpenAI Compatible** / **OpenAI**(以扩展当前版本为准)
|
||||
3. 填写:
|
||||
- **Base URL**:`https://api.haiyushuke.com/v1`
|
||||
- **API Key**:海宇 API Key
|
||||
- **Model ID**:模型广场中的 ID(如 `glm-5.1`、`deepseek-chat` 等)
|
||||
4. 保存并新建任务测试
|
||||
|
||||
## 注意
|
||||
|
||||
- 扩展界面若默认展示海外模型名称,请 **手动改为** 控制台国内模型 ID。
|
||||
- 复杂 Agent 任务消耗 token 较多,请关注 [计费与财务](/docs/guides/billing) 与余额告警。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [Cursor 接入](/docs/integrations/cursor)
|
||||
- [工具接入概览](/docs/integrations/overview)
|
||||
39
content/integrations/continue.mdx
Normal file
39
content/integrations/continue.mdx
Normal file
@@ -0,0 +1,39 @@
|
||||
---
|
||||
title: Continue 接入
|
||||
sidebarTitle: Continue
|
||||
description: 在 VS Code / JetBrains 的 Continue 插件中使用海宇 API
|
||||
---
|
||||
|
||||
# Continue 接入
|
||||
|
||||
[Continue](https://continue.dev) 是 VS Code、JetBrains 等 IDE 中的开源 AI 编程插件,支持配置 **OpenAI 兼容** 模型提供商。
|
||||
|
||||
## 前置条件
|
||||
|
||||
- 海宇控制台 **API Key** 与国内模型 ID(见 [模型广场](https://console.haiyushuke.com/models))
|
||||
|
||||
## 配置示例
|
||||
|
||||
在 Continue 配置文件 `config.yaml`(或旧版 `config.json`)中增加自定义 OpenAI 兼容提供商,例如:
|
||||
|
||||
```yaml
|
||||
models:
|
||||
- name: Haiyu DeepSeek
|
||||
provider: openai
|
||||
model: deepseek-chat
|
||||
apiKey: YOUR_HAIYUSHUKE_API_KEY
|
||||
apiBase: https://api.haiyushuke.com/v1
|
||||
```
|
||||
|
||||
请将 `model` 替换为你在模型广场复制的 **准确 ID**;可配置多个条目对应不同模型。
|
||||
|
||||
## 注意
|
||||
|
||||
- `apiBase` 需包含 `/v1` 前缀,与海宇网关一致。
|
||||
- 不要使用未在海宇上线的海外模型 ID。
|
||||
- Key 勿写入公开仓库;本地 config 建议加入 `.gitignore`。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [工具接入概览](/docs/integrations/overview)
|
||||
- [OpenAI 兼容 SDK](/docs/guides/openai_compatible)
|
||||
50
content/integrations/cursor.mdx
Normal file
50
content/integrations/cursor.mdx
Normal file
@@ -0,0 +1,50 @@
|
||||
---
|
||||
title: Cursor 接入
|
||||
sidebarTitle: Cursor
|
||||
description: 在 Cursor 中配置海宇数科 API 与国内模型
|
||||
---
|
||||
|
||||
# Cursor 接入
|
||||
|
||||
[Cursor](https://cursor.com) 支持使用 **OpenAI 兼容** 自定义接口。将 Base URL 指向海宇数科网关后,可在 Cursor 中选择控制台已上线的 **国内模型 ID** 进行补全与对话。
|
||||
|
||||
## 前置条件
|
||||
|
||||
1. 登录 [控制台](https://console.haiyushuke.com),完成 **实名认证**
|
||||
2. 在 **API Key** 创建密钥,并确认 Key 的 **可用模型** 包含你要用的模型 ID
|
||||
3. 在 **模型广场** 复制目标模型 ID(例如 `deepseek-chat`、`glm-5.1` 等,以实际列表为准)
|
||||
|
||||
## 配置步骤
|
||||
|
||||
1. 打开 Cursor → **Settings**(设置)
|
||||
2. 进入 **Models** 或 **OpenAI API** 相关区域(版本不同菜单名可能略有差异)
|
||||
3. 填写:
|
||||
- **OpenAI API Key**:海宇控制台创建的 API Key
|
||||
- **Override OpenAI Base URL**(或 Custom OpenAI Endpoint):`https://api.haiyushuke.com/v1`
|
||||
4. 在模型列表中添加 **自定义模型名**,名称必须与模型广场 **模型 ID 完全一致**
|
||||
5. 保存后在新对话中选择该模型进行测试
|
||||
|
||||
## 示例(settings.json 片段)
|
||||
|
||||
若你通过 `settings.json` 管理配置,可参考(键名以 Cursor 当前版本为准):
|
||||
|
||||
```json
|
||||
{
|
||||
"openai.apiKey": "YOUR_HAIYUSHUKE_API_KEY",
|
||||
"openai.baseUrl": "https://api.haiyushuke.com/v1"
|
||||
}
|
||||
```
|
||||
|
||||
自定义模型请在 Cursor 的 Models 界面添加,ID 使用控制台复制的字符串。
|
||||
|
||||
## 使用建议
|
||||
|
||||
- **不要** 使用 `gpt-4o`、`claude-sonnet` 等海外模型名;平台未提供这些模型。
|
||||
- 生产环境 Key 不要提交到 Git;可配合 Key 的 **IP 白名单**。
|
||||
- 若补全无响应,先在 **体验中心** 用同一模型 ID 验证,再查 [常见问题](/docs/faq)。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [工具接入概览](/docs/integrations/overview)
|
||||
- [API Key 管理](/docs/guides/api_keys)
|
||||
- [计费与财务](/docs/guides/billing)
|
||||
39
content/integrations/overview.mdx
Normal file
39
content/integrations/overview.mdx
Normal file
@@ -0,0 +1,39 @@
|
||||
---
|
||||
title: 工具接入概览
|
||||
sidebarTitle: 接入概览
|
||||
description: 在 Cursor、Claude Code 等客户端中使用海宇数科 API
|
||||
---
|
||||
|
||||
# 工具接入概览
|
||||
|
||||
海宇数科提供 **OpenAI 兼容** 的 `https://api.haiyushuke.com/v1` 网关。多数支持「自定义 OpenAI Base URL + API Key」的 IDE / 编程助手,均可指向海宇,并在请求中使用控制台 **模型广场** 里的 **国内模型 ID**(如 DeepSeek、智谱 GLM、通义、Kimi、MiniMax 等)。
|
||||
|
||||
> 当前平台 **不提供** OpenAI GPT、Anthropic Claude 等海外原厂模型;请勿在文档或客户端中填写 `gpt-*`、`claude-*` 等海外 ID,一律以 [控制台模型广场](https://console.haiyushuke.com/models) 为准。
|
||||
|
||||
## 接入三要素
|
||||
|
||||
| 项 | 值 |
|
||||
| --- | --- |
|
||||
| API Base URL | `https://api.haiyushuke.com/v1` |
|
||||
| API Key | 控制台 **API Key** 中创建(非登录密码) |
|
||||
| Model | 模型广场复制的 **模型 ID** |
|
||||
|
||||
创建 Key、实名认证与充值说明见 [快速开始](/docs/getting-started)、[API Key 管理](/docs/guides/api_keys)。
|
||||
|
||||
## 按工具查看
|
||||
|
||||
| 工具 | 文档 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| Cursor | [Cursor 接入](/docs/integrations/cursor) | 覆盖 OpenAI Base URL,适合日常编码 |
|
||||
| Claude Code | [Claude Code 接入](/docs/integrations/claude_code) | CLI 助手,需确认客户端协议与网关兼容 |
|
||||
| Continue | [Continue 接入](/docs/integrations/continue) | VS Code / JetBrains 插件 |
|
||||
| Cline | [Cline 接入](/docs/integrations/cline) | VS Code 自主编程扩展 |
|
||||
|
||||
## 通用 HTTP / SDK
|
||||
|
||||
不通过 IDE 而由业务服务调用时,请阅 [HTTP API](/docs/guides/http_api)、[OpenAI 兼容 SDK](/docs/guides/openai_compatible)。
|
||||
|
||||
## 常见问题
|
||||
|
||||
- Key 无效、402 余额不足、403 模型未授权:见 [常见问题](/docs/faq)
|
||||
- Token 与上下文:见 [核心概念](/docs/concepts/overview)
|
||||
4
content/legal/_meta.js
Normal file
4
content/legal/_meta.js
Normal file
@@ -0,0 +1,4 @@
|
||||
export default {
|
||||
"user-agreement": "用户协议",
|
||||
privacy: "隐私政策",
|
||||
};
|
||||
73
content/legal/privacy.mdx
Normal file
73
content/legal/privacy.mdx
Normal file
@@ -0,0 +1,73 @@
|
||||
---
|
||||
title: 隐私政策
|
||||
description: 海宇数科 AI 模型控制台个人信息保护政策
|
||||
---
|
||||
|
||||
# 隐私政策
|
||||
|
||||
**更新日期:2026 年 6 月 28 日**
|
||||
|
||||
**海宇数科(广东横琴)科技有限公司**(以下简称「我们」)重视您的个人信息保护。本政策说明您在使用**海宇数科 AI 模型控制台**(以下简称「本平台」)时,我们如何收集、使用、存储、共享与保护您的个人信息,以及您享有的权利。
|
||||
|
||||
请您在使用注册、登录、模型调用、充值、实名认证等功能前仔细阅读本政策。您使用本平台即表示您理解并同意我们按本政策处理相关信息;若您不同意,请停止使用并可联系我们咨询。
|
||||
|
||||
## 一、我们收集的信息
|
||||
|
||||
- **账户信息**:手机号码、邮箱、登录密码(加密存储)、昵称或您主动填写的资料。
|
||||
- **身份与认证信息**:个人实名或企业认证所需的姓名、证件信息、企业名称、统一社会信用代码、营业执照影像、法人及联系人信息等(以您提交的认证材料为准)。
|
||||
- **交易与用量信息**:充值记录、账单、发票抬头、API 调用量、模型名称、时间戳及与计费相关的日志。
|
||||
- **设备与日志信息**:IP 地址、浏览器类型、访问时间、操作日志、错误日志,用于安全风控、故障排查与统计分析。
|
||||
- **您主动提交的内容**:在线体验中的对话内容、您上传用于业务处理的文件或文本(若功能开放),以及您通过客服渠道提供的反馈。
|
||||
|
||||
## 二、我们如何使用信息
|
||||
|
||||
- 为您提供注册登录、短信验证、模型 API 鉴权、用量统计、账单与开票、企业认证审核等核心功能。
|
||||
- 保障账户与 API 密钥安全,识别异常登录、滥用调用或欺诈行为,并进行必要的风险提示或处置。
|
||||
- 改进产品体验、分析聚合后的使用趋势,以及向您发送与服务相关的通知(如安全提醒、政策更新、账单通知)。
|
||||
- 履行法律法规规定的义务,配合有权机关依法提出的要求。
|
||||
|
||||
## 三、Cookie 与同类技术
|
||||
|
||||
我们可能使用 Cookie、本地存储或类似技术维持登录状态、记住偏好并统计访问量。您可通过浏览器设置管理 Cookie,但关闭后部分功能可能无法正常使用。
|
||||
|
||||
## 四、信息的共享、委托处理与公开披露
|
||||
|
||||
我们不会出售您的个人信息。仅在以下情形共享或委托处理:为实现功能所必需的云服务、短信、支付、实名核验等合作方(我们要求其遵守保密与安全义务);法律法规要求或经您明确同意;为保护您、我们或其他用户的生命财产安全所必需。
|
||||
|
||||
企业认证、支付结果等可能涉及向监管或税务合规所需的合作方传输必要字段,范围以完成该业务所必需为限。
|
||||
|
||||
未经您同意,我们不会公开披露您的个人信息,法律强制要求的情况除外。
|
||||
|
||||
## 五、信息的存储与跨境
|
||||
|
||||
我们在中华人民共和国境内存储个人信息,存储期限为实现本政策目的所必需的最短时间,或法律法规要求的留存期限。超出期限后我们将删除或匿名化处理。
|
||||
|
||||
若未来因业务需要向境外提供个人信息,我们将依法履行安全评估、标准合同或征得您的单独同意等义务,并更新本政策。
|
||||
|
||||
## 六、您的权利
|
||||
|
||||
您有权访问、更正、删除您的个人信息,撤回同意、注销账户,以及获取个人信息副本(法律法规另有规定的除外)。
|
||||
|
||||
您可通过控制台「账户设置」、认证页面或联系客服行使上述权利。我们将在验证身份后合理期限内答复。
|
||||
|
||||
若您认为我们处理个人信息的行为损害您的合法权益,可向网信、电信等主管部门投诉或举报,或依法提起诉讼。
|
||||
|
||||
## 七、未成年人保护
|
||||
|
||||
本平台主要面向企业用户与具有完全民事行为能力的成年人。若您为未成年人,请在监护人指导下阅读本政策并使用服务;我们不会主动面向未成年人提供定向营销。
|
||||
|
||||
## 八、安全措施
|
||||
|
||||
我们采用访问控制、传输加密、密钥分级管理、日志审计等技术和管理措施保护您的信息。尽管已尽合理努力,互联网环境仍存在风险,请您妥善保管账户与 API 密钥。
|
||||
|
||||
## 九、政策更新
|
||||
|
||||
我们可能适时修订本政策,修订版本将公布于文档中心并更新生效日期。重大变更我们将通过显著方式提示;若您继续使用,即表示接受更新后的政策。相关服务条款见 [用户协议](/docs/legal/user-agreement)。
|
||||
|
||||
## 十、联系我们
|
||||
|
||||
如您对本政策或个人信息处理有任何疑问、意见或投诉,请通过 [控制台在线客服](https://work.weixin.qq.com/kfid/kfc1f8fc41acaca0895) 或邮件 [main@haiyushuke.cn](mailto:main@haiyushuke.cn) 联系我们。
|
||||
|
||||
个人信息保护负责人联系渠道同上。
|
||||
|
||||
海宇数科(广东横琴)科技有限公司
|
||||
74
content/legal/user-agreement.mdx
Normal file
74
content/legal/user-agreement.mdx
Normal file
@@ -0,0 +1,74 @@
|
||||
---
|
||||
title: 用户协议
|
||||
description: 海宇数科 AI 模型控制台用户服务协议
|
||||
---
|
||||
|
||||
# 用户协议
|
||||
|
||||
**更新日期:2026 年 6 月 28 日**
|
||||
|
||||
欢迎使用**海宇数科 AI 模型控制台**(以下简称「本平台」或「控制台」)。本协议由您与**海宇数科(广东横琴)科技有限公司**(以下简称「我们」)订立。
|
||||
|
||||
请您在注册、登录或使用本平台提供的模型接入、在线体验、API 密钥、账户充值与账单等服务前,仔细阅读并充分理解本协议。您点击同意、完成注册或实际使用服务,即视为您已接受本协议全部条款。
|
||||
|
||||
## 一、服务说明
|
||||
|
||||
本平台面向企业用户与开发者,提供大语言模型及多模态模型的统一接入、控制台在线体验、API 调用、用量与账单管理、企业实名认证等功能。具体可用模型、计费方式与功能以 [控制台](https://console.haiyushuke.com) 页面及本 [文档中心](/docs) 公示为准。
|
||||
|
||||
我们有权根据业务需要调整模型列表、价格、接口形态或功能模块,并将通过控制台公告、站内通知或文档中心等方式告知;若调整对您已生效的订单或权益产生重大影响,我们将依法或依约另行说明。
|
||||
|
||||
## 二、账户注册与安全
|
||||
|
||||
您应使用真实、合法、有效的手机号或邮箱注册账户,并妥善保管登录密码、短信验证码及 API 密钥。账户下的全部操作视为您的行为,您须对因保管不善导致的损失自行承担责任。
|
||||
|
||||
您不得冒用他人身份注册、批量注册恶意账户、转让或出借账户。发现账户被盗用或异常使用时,请立即联系我们并修改密码、轮换 API 密钥。
|
||||
|
||||
为符合监管要求及保障交易安全,我们可能要求您完成个人或企业实名认证;未完成认证时,部分功能(如开票、部分模型或更高额度)可能受限。详见 [常见问题 · 实名认证](/docs/faq#账号与实名认证)。
|
||||
|
||||
## 三、使用规范
|
||||
|
||||
您在使用模型 API、在线体验或相关工具时,应遵守中华人民共和国法律法规及公序良俗,不得利用本平台生成、传播违法信息,不得从事欺诈、侵权、干扰网络安全、未经授权的数据抓取或其他损害我们或第三方合法权益的行为。
|
||||
|
||||
您向模型提交的提示词、上传的内容及通过 API 输出的结果,其合法性、权利归属由您负责。您应确保已获得必要授权,不得输入国家秘密、他人个人信息或商业秘密等依法禁止或未经授权处理的内容。
|
||||
|
||||
您不得对本平台进行反向工程、绕过鉴权、压测攻击、滥用接口频率,不得将 API 密钥嵌入公开客户端或向不可信第三方泄露。Key 管理要求见 [API Key 管理](/docs/guides/api_keys)。
|
||||
|
||||
## 四、费用与支付
|
||||
|
||||
本平台部分服务为有偿服务。您充值或消费产生的费用、计费单位、扣费顺序及发票规则以控制台「费用中心」及 [计费与财务](/docs/guides/billing) 说明为准。
|
||||
|
||||
通过第三方支付完成的充值,除法律另有规定外,虚拟余额或已消耗用量一般不支持无理由退款;错误充值或系统异常扣费,您可凭凭证联系我们核实处理。
|
||||
|
||||
## 五、知识产权
|
||||
|
||||
本平台软件、界面设计、文档、商标及我们提供的模型服务相关权利归我们或相应权利人所有。未经书面许可,您不得复制、修改、传播或用于本协议以外的商业目的。
|
||||
|
||||
在法律法规允许的范围内,您对依法享有权利的输入内容保留相应权利;对于模型输出,您可在遵守本协议及模型 / provider 使用政策的前提下用于约定场景。若输出涉及第三方权利,您应自行评估并承担合规责任。
|
||||
|
||||
## 六、隐私保护
|
||||
|
||||
我们处理个人信息的方式详见 [隐私政策](/docs/legal/privacy)。该政策为本协议的重要组成部分,与本协议具有同等法律效力。
|
||||
|
||||
## 七、免责声明与责任限制
|
||||
|
||||
模型输出由人工智能自动生成,可能存在不准确、不完整或过时的情况,不构成专业意见(包括但不限于法律、医疗、财务建议)。您应自行判断并承担使用后果。
|
||||
|
||||
因不可抗力、网络故障、第三方服务中断、您自身设备或操作原因导致的服务不可用或数据丢失,我们在法律允许范围内不承担责任;我们将尽力维护服务稳定与安全。
|
||||
|
||||
在法律允许的最大范围内,我们对您因使用本平台产生的间接损失、预期利润损失等不承担责任;我们的总赔偿责任以您就相关争议服务在过去十二个月内已向我们支付的费用为上限(如无付费则为零),法律另有强制性规定的除外。
|
||||
|
||||
## 八、协议变更与终止
|
||||
|
||||
我们可修订本协议,修订后将公布于本平台、文档中心并注明生效日期。若您不同意修订内容,应停止使用并申请注销账户;继续使用视为接受修订。
|
||||
|
||||
若您严重违反本协议,我们有权暂停或终止向您提供服务、冻结账户余额或依法向主管部门报告。您可随时停止使用并申请注销账户;注销后我们将依法删除或匿名化处理您的个人信息,法律法规另有要求的除外。
|
||||
|
||||
## 九、法律适用与争议解决
|
||||
|
||||
本协议的订立、执行与解释适用中华人民共和国大陆地区法律。因本协议产生的争议,双方应友好协商;协商不成的,提交我们住所地有管辖权的人民法院诉讼解决。
|
||||
|
||||
## 十、联系我们
|
||||
|
||||
如您对本协议有疑问,请通过 [控制台在线客服](https://work.weixin.qq.com/kfid/kfc1f8fc41acaca0895) 或发送邮件至 [main@haiyushuke.cn](mailto:main@haiyushuke.cn) 与我们联系。
|
||||
|
||||
海宇数科(广东横琴)科技有限公司
|
||||
@@ -1,5 +0,0 @@
|
||||
export default {
|
||||
openai: "OpenAI",
|
||||
claude: "Claude (Anthropic)",
|
||||
deepseek: "DeepSeek",
|
||||
};
|
||||
@@ -1,42 +0,0 @@
|
||||
---
|
||||
title: Claude 接入
|
||||
sidebarTitle: Claude
|
||||
description: Anthropic Claude 系列模型接入说明
|
||||
---
|
||||
|
||||
# Claude (Anthropic) 接入
|
||||
|
||||
Claude 模型可通过 **OpenAI 兼容接口** 或 **Anthropic Messages API** 接入(以控制台开通能力为准)。
|
||||
|
||||
## OpenAI 兼容方式(推荐迁移)
|
||||
|
||||
```bash
|
||||
curl https://api.haiyushuke.com/v1/chat/completions \
|
||||
-H "Authorization: Bearer YOUR_API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"model": "claude-sonnet-4-20250514",
|
||||
"messages": [{"role": "user", "content": "总结以下三点:安全、成本、延迟"}]
|
||||
}'
|
||||
```
|
||||
|
||||
将 `model` 替换为控制台提供的 Claude 模型 ID。
|
||||
|
||||
## 系统提示与多轮对话
|
||||
|
||||
与 OpenAI 相同,使用 `messages` 数组:
|
||||
|
||||
```json
|
||||
{
|
||||
"model": "claude-sonnet-4-20250514",
|
||||
"messages": [
|
||||
{ "role": "system", "content": "你是企业知识库助手,回答需简洁。" },
|
||||
{ "role": "user", "content": "什么是 RAG?" }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 部分 Claude 特性(如扩展思考、工具调用)需使用对应 API 形态,请参考控制台该模型的「能力标签」。
|
||||
- 长上下文模型请留意单次请求的 `max_tokens` 与账单中的输入 token 统计。
|
||||
@@ -1,32 +0,0 @@
|
||||
---
|
||||
title: DeepSeek 接入
|
||||
sidebarTitle: DeepSeek
|
||||
description: DeepSeek 系列模型接入说明
|
||||
---
|
||||
|
||||
# DeepSeek 接入
|
||||
|
||||
DeepSeek 模型通过统一网关暴露,协议为 **OpenAI Chat Completions 兼容**。
|
||||
|
||||
## 示例
|
||||
|
||||
```bash
|
||||
curl https://api.haiyushuke.com/v1/chat/completions \
|
||||
-H "Authorization: Bearer YOUR_API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"model": "deepseek-chat",
|
||||
"messages": [{"role": "user", "content": "用列表说明大模型网关的三项优势"}]
|
||||
}'
|
||||
```
|
||||
|
||||
## 模型选择建议
|
||||
|
||||
| 场景 | 建议 |
|
||||
| --- | --- |
|
||||
| 通用对话 / 代码 | `deepseek-chat` |
|
||||
| 复杂推理(若已开通) | 控制台标注的 Reasoner 类模型 ID |
|
||||
|
||||
## 与 OpenAI SDK 共用配置
|
||||
|
||||
仅需修改 `model` 字段,无需更换 SDK;`baseURL` 与 API Key 与 [OpenAI 接入](/docs/models/openai) 相同。
|
||||
@@ -1,62 +0,0 @@
|
||||
---
|
||||
title: OpenAI 接入
|
||||
sidebarTitle: OpenAI
|
||||
description: 通过 OpenAI 兼容协议接入 GPT 系列模型
|
||||
---
|
||||
|
||||
# OpenAI 兼容接入
|
||||
|
||||
海宇数科对 OpenAI 官方 SDK 及 HTTP API 提供兼容层,便于现有应用零改造迁移。
|
||||
|
||||
## 端点
|
||||
|
||||
| 项目 | 值 |
|
||||
| --- | --- |
|
||||
| Base URL | `https://api.haiyushuke.com/v1` |
|
||||
| Chat Completions | `POST /chat/completions` |
|
||||
| 鉴权 | `Authorization: Bearer <API_KEY>` |
|
||||
|
||||
## Node.js(官方 SDK)
|
||||
|
||||
```ts
|
||||
import OpenAI from "openai";
|
||||
|
||||
const client = new OpenAI({
|
||||
apiKey: process.env.HAIYUSHUKE_API_KEY,
|
||||
baseURL: "https://api.haiyushuke.com/v1",
|
||||
});
|
||||
|
||||
const completion = await client.chat.completions.create({
|
||||
model: "gpt-4o-mini",
|
||||
messages: [{ role: "user", content: "Hello" }],
|
||||
});
|
||||
|
||||
console.log(completion.choices[0]?.message?.content);
|
||||
```
|
||||
|
||||
## Python
|
||||
|
||||
```python
|
||||
from openai import OpenAI
|
||||
|
||||
client = OpenAI(
|
||||
api_key="YOUR_API_KEY",
|
||||
base_url="https://api.haiyushuke.com/v1",
|
||||
)
|
||||
|
||||
resp = client.chat.completions.create(
|
||||
model="gpt-4o-mini",
|
||||
messages=[{"role": "user", "content": "Hello"}],
|
||||
)
|
||||
print(resp.choices[0].message.content)
|
||||
```
|
||||
|
||||
## 常用参数
|
||||
|
||||
- `temperature`:0–2,控制随机性
|
||||
- `max_tokens`:最大生成 token
|
||||
- `stream: true`:开启流式,见 [流式调用](/docs/guides/streaming)
|
||||
|
||||
## 模型 ID
|
||||
|
||||
请在控制台 **模型广场** 查看当前可用 ID;名称可能随供应商更新,以控制台为准。
|
||||
@@ -16,17 +16,35 @@ test.describe("站点冒烟", () => {
|
||||
/智能报告/,
|
||||
);
|
||||
await expect(page.locator("#reports")).toBeVisible();
|
||||
await expect(page.getByText("KYB 企业核验")).toBeVisible();
|
||||
await expect(page.getByText("企业综合风险报告")).toBeVisible();
|
||||
const exampleBtn = page
|
||||
.locator("#reports")
|
||||
.getByRole("button", { name: "查看智能体报告示例" })
|
||||
.first();
|
||||
await exampleBtn.scrollIntoViewIfNeeded();
|
||||
await exampleBtn.click();
|
||||
await expect(page.getByRole("dialog")).toBeVisible();
|
||||
await expect(page.getByRole("dialog")).toContainText("核验结论");
|
||||
await exampleBtn.click({ force: true });
|
||||
await expect(page.locator(".report-example-overlay")).toBeVisible({
|
||||
timeout: 10_000,
|
||||
});
|
||||
await expect(page.locator(".report-example-overlay")).toContainText(
|
||||
"敬请期待",
|
||||
);
|
||||
await page
|
||||
.locator(".report-example-overlay")
|
||||
.getByRole("button", { name: "关闭" })
|
||||
.click();
|
||||
await expect(page.locator(".report-example-overlay")).toHaveCount(0);
|
||||
await expect(page.locator("#models")).toBeVisible();
|
||||
|
||||
const businessConsult = page.getByRole("button", { name: "商务咨询" });
|
||||
await businessConsult.scrollIntoViewIfNeeded();
|
||||
await expect(businessConsult).toBeVisible();
|
||||
await businessConsult.click();
|
||||
await expect(
|
||||
page.getByRole("dialog", { name: "商务咨询" }),
|
||||
).toContainText("扫描二维码");
|
||||
await page.getByRole("button", { name: "关闭" }).click();
|
||||
|
||||
const squareLink = page.getByRole("link", { name: "模型广场" }).first();
|
||||
await squareLink.click();
|
||||
await expect(page).toHaveURL(/\/models$/);
|
||||
@@ -41,12 +59,12 @@ test.describe("站点冒烟", () => {
|
||||
"AI 新闻资讯",
|
||||
);
|
||||
await page
|
||||
.getByRole("link", { name: "智能报告模板库 2.0 发布" })
|
||||
.getByRole("link", { name: "用户协议与隐私政策正式发布" })
|
||||
.first()
|
||||
.click();
|
||||
await expect(page).toHaveURL(/\/news\/report-templates-2/);
|
||||
await expect(page).toHaveURL(/\/news\/legal-policies-published/);
|
||||
await expect(page.getByRole("heading", { level: 1 })).toContainText(
|
||||
"智能报告模板库 2.0 发布",
|
||||
"用户协议与隐私政策正式发布",
|
||||
);
|
||||
|
||||
expect(
|
||||
@@ -83,12 +101,27 @@ test.describe("站点冒烟", () => {
|
||||
),
|
||||
).toBeVisible({ timeout: 15_000 });
|
||||
await expect(page.getByRole("link", { name: "快速开始" }).first()).toBeVisible();
|
||||
await page.getByRole("link", { name: "OpenAI" }).first().click();
|
||||
await expect(page).toHaveURL(/\/docs\/models\/openai/);
|
||||
await page.getByRole("link", { name: "Cursor" }).first().click();
|
||||
await expect(page).toHaveURL(/\/docs\/integrations\/cursor/);
|
||||
await expect(page.locator(".docs-prose h1, .docs-prose h2").first()).toContainText(
|
||||
"OpenAI",
|
||||
"Cursor",
|
||||
);
|
||||
await expect(page.getByText("chat/completions")).toBeVisible();
|
||||
await expect(page.getByText("api.haiyushuke.com")).toBeVisible();
|
||||
});
|
||||
|
||||
test("文档中心法律条款页可访问", async ({ page }) => {
|
||||
const agreement = await page.goto("/docs/legal/user-agreement", {
|
||||
waitUntil: "domcontentloaded",
|
||||
});
|
||||
expect(agreement?.ok()).toBeTruthy();
|
||||
await expect(page.locator(".docs-prose h1").first()).toContainText("用户协议");
|
||||
await expect(page.locator(".docs-prose")).toContainText("服务说明");
|
||||
|
||||
const privacy = await page.goto("/docs/legal/privacy", {
|
||||
waitUntil: "domcontentloaded",
|
||||
});
|
||||
expect(privacy?.ok()).toBeTruthy();
|
||||
await expect(page.locator(".docs-prose h1").first()).toContainText("隐私政策");
|
||||
});
|
||||
|
||||
test("全局样式编译通过(无 Turbopack CSS 报错页)", async ({ page }) => {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { defineConfig, devices } from "@playwright/test";
|
||||
|
||||
const baseURL = process.env.PLAYWRIGHT_BASE_URL ?? "http://127.0.0.1:3000";
|
||||
const baseURL = process.env.PLAYWRIGHT_BASE_URL ?? "http://localhost:3000";
|
||||
|
||||
export default defineConfig({
|
||||
testDir: "./e2e",
|
||||
|
||||
BIN
public/qrcode.jpg
Normal file
BIN
public/qrcode.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 161 KiB |
@@ -7,7 +7,9 @@ import { NewsCoverImage } from "@/components/news-cover-image";
|
||||
import {
|
||||
getAllNewsSlugs,
|
||||
getNewsBySlug,
|
||||
newsArticleHasCover,
|
||||
} from "@/content/news-articles";
|
||||
import { site } from "@/content/site";
|
||||
import {
|
||||
articleMetadata,
|
||||
newsArticleJsonLd,
|
||||
@@ -29,13 +31,20 @@ export async function generateMetadata({
|
||||
if (!article) {
|
||||
return { title: "文章未找到", robots: { index: false, follow: false } };
|
||||
}
|
||||
const coverImage = newsArticleHasCover(article)
|
||||
? article.image
|
||||
: site.brandAssets.logo;
|
||||
const coverAlt = newsArticleHasCover(article)
|
||||
? (article.imageAlt ?? article.title)
|
||||
: site.brandAssets.logoAlt;
|
||||
|
||||
return articleMetadata({
|
||||
title: article.title,
|
||||
description: article.summary,
|
||||
path: `/news/${slug}`,
|
||||
publishedTime: `${article.date}T08:00:00+08:00`,
|
||||
imagePath: article.image,
|
||||
imageAlt: article.imageAlt,
|
||||
imagePath: coverImage,
|
||||
imageAlt: coverAlt,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -58,14 +67,16 @@ export default async function NewsDetailPage({ params }: PageProps) {
|
||||
← 返回资讯列表
|
||||
</Link>
|
||||
|
||||
<div className="news-detail-cover">
|
||||
<NewsCoverImage
|
||||
src={article.image}
|
||||
alt={article.imageAlt}
|
||||
priority
|
||||
sizes="(max-width: 1280px) 100vw, 1280px"
|
||||
/>
|
||||
</div>
|
||||
{newsArticleHasCover(article) ? (
|
||||
<div className="news-detail-cover">
|
||||
<NewsCoverImage
|
||||
src={article.image}
|
||||
alt={article.imageAlt ?? article.title}
|
||||
priority
|
||||
sizes="(max-width: 1280px) 100vw, 1280px"
|
||||
/>
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
<header className="page-hero__copy">
|
||||
<p className="section-eyebrow page-hero__eyebrow">{article.tag}</p>
|
||||
|
||||
@@ -8,6 +8,7 @@ import { SectionModels } from "@/components/section-models";
|
||||
import { SectionEnterprise } from "@/components/section-enterprise";
|
||||
import { SectionNews } from "@/components/section-news";
|
||||
import { SectionContact } from "@/components/section-contact";
|
||||
import { HomeFloatingConsult } from "@/components/home-floating-consult";
|
||||
import { ScrollReveal, ScrollRevealHero } from "@/components/scroll-reveal";
|
||||
import { canonicalAbsoluteUrl } from "@/lib/site-url";
|
||||
|
||||
@@ -51,6 +52,7 @@ export default function Home() {
|
||||
<ScrollReveal>
|
||||
<SiteFooter />
|
||||
</ScrollReveal>
|
||||
<HomeFloatingConsult />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -16,6 +16,18 @@ export default function sitemap(): MetadataRoute.Sitemap {
|
||||
"/docs",
|
||||
"/docs/getting-started",
|
||||
"/docs/faq",
|
||||
"/docs/integrations/overview",
|
||||
"/docs/integrations/cursor",
|
||||
"/docs/integrations/claude_code",
|
||||
"/docs/integrations/continue",
|
||||
"/docs/integrations/cline",
|
||||
"/docs/guides/http_api",
|
||||
"/docs/guides/openai_compatible",
|
||||
"/docs/guides/console",
|
||||
"/docs/guides/api_keys",
|
||||
"/docs/guides/streaming",
|
||||
"/docs/guides/billing",
|
||||
"/docs/concepts/overview",
|
||||
] as const;
|
||||
|
||||
const staticEntries: MetadataRoute.Sitemap = staticPaths.map((path) => ({
|
||||
|
||||
75
src/components/home-floating-consult.tsx
Normal file
75
src/components/home-floating-consult.tsx
Normal file
@@ -0,0 +1,75 @@
|
||||
"use client";
|
||||
|
||||
import { useState } from "react";
|
||||
import { site } from "@/content/site";
|
||||
import { WechatQrDialog } from "@/components/wechat-qr-dialog";
|
||||
|
||||
export function HomeFloatingConsult() {
|
||||
const [qrOpen, setQrOpen] = useState(false);
|
||||
const { customerService } = site.links;
|
||||
|
||||
return (
|
||||
<>
|
||||
<aside
|
||||
className="home-consult-float"
|
||||
aria-label="快捷咨询"
|
||||
>
|
||||
<a
|
||||
href={customerService}
|
||||
className="home-consult-float__btn home-consult-float__btn--primary"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<svg
|
||||
className="home-consult-float__icon"
|
||||
width="18"
|
||||
height="18"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
aria-hidden
|
||||
>
|
||||
<path
|
||||
d="M8 10h8M8 14h5M21 12c0 3.866-3.582 7-8 7-.873 0-1.712-.12-2.5-.34L5 20l1.34-3.2C5.49 15.84 5 13.99 5 12c0-3.866 3.582-7 8-7s8 3.134 8 7Z"
|
||||
stroke="currentColor"
|
||||
strokeWidth="1.75"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
/>
|
||||
</svg>
|
||||
在线咨询
|
||||
</a>
|
||||
<button
|
||||
type="button"
|
||||
className="home-consult-float__btn home-consult-float__btn--secondary"
|
||||
onClick={() => setQrOpen(true)}
|
||||
>
|
||||
<svg
|
||||
className="home-consult-float__icon"
|
||||
width="18"
|
||||
height="18"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
aria-hidden
|
||||
>
|
||||
<path
|
||||
d="M3 7h5l2 2h11v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"
|
||||
stroke="currentColor"
|
||||
strokeWidth="1.75"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
/>
|
||||
<path
|
||||
d="M3 7V5a2 2 0 0 1 2-2h4l2 2h10a2 2 0 0 1 2 2v2"
|
||||
stroke="currentColor"
|
||||
strokeWidth="1.75"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
/>
|
||||
</svg>
|
||||
商务咨询
|
||||
</button>
|
||||
</aside>
|
||||
<WechatQrDialog open={qrOpen} onClose={() => setQrOpen(false)} />
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -83,26 +83,32 @@ export function IntelligentReportGrid() {
|
||||
<p className="type-mono-caption text-body">{active.example.meta}</p>
|
||||
</header>
|
||||
<div className="report-example-dialog__body">
|
||||
{active.example.sections.map((sec) => (
|
||||
<section
|
||||
key={sec.heading}
|
||||
className="report-example-section"
|
||||
>
|
||||
<h4 className="type-caption-strong text-ink">
|
||||
{sec.heading}
|
||||
</h4>
|
||||
{"body" in sec && sec.body ? (
|
||||
<p className="type-body-md text-body">{sec.body}</p>
|
||||
) : null}
|
||||
{"bullets" in sec && sec.bullets ? (
|
||||
<ul className="report-example-list">
|
||||
{sec.bullets.map((item) => (
|
||||
<li key={item}>{item}</li>
|
||||
))}
|
||||
</ul>
|
||||
) : null}
|
||||
</section>
|
||||
))}
|
||||
{"comingSoon" in active.example && active.example.comingSoon ? (
|
||||
<p className="type-display-md py-16 text-center text-body">
|
||||
敬请期待
|
||||
</p>
|
||||
) : (
|
||||
active.example.sections.map((sec) => (
|
||||
<section
|
||||
key={sec.heading}
|
||||
className="report-example-section"
|
||||
>
|
||||
<h4 className="type-caption-strong text-ink">
|
||||
{sec.heading}
|
||||
</h4>
|
||||
{"body" in sec && sec.body ? (
|
||||
<p className="type-body-md text-body">{sec.body}</p>
|
||||
) : null}
|
||||
{"bullets" in sec && sec.bullets ? (
|
||||
<ul className="report-example-list">
|
||||
{sec.bullets.map((item) => (
|
||||
<li key={item}>{item}</li>
|
||||
))}
|
||||
</ul>
|
||||
) : null}
|
||||
</section>
|
||||
))
|
||||
)}
|
||||
</div>
|
||||
<footer className="report-example-dialog__footer">
|
||||
<button
|
||||
|
||||
@@ -13,6 +13,8 @@ export type ModelCardData = Pick<
|
||||
| "context"
|
||||
| "priceIn"
|
||||
| "priceOut"
|
||||
| "priceCacheIn"
|
||||
| "priceCacheCreation"
|
||||
| "priceLabel"
|
||||
| "pricingNote"
|
||||
| "contextLabel"
|
||||
@@ -99,7 +101,10 @@ export function ModelLibraryCard({ model }: ModelLibraryCardProps) {
|
||||
<p className="type-body-md-strong text-ink">{model.pricingNote}</p>
|
||||
) : (
|
||||
<p className="type-body-md-strong text-ink">
|
||||
入 {model.priceIn} / 出 {model.priceOut}
|
||||
入(未命中) {model.priceIn}
|
||||
{model.priceCacheIn ? ` / 入(缓存命中) ${model.priceCacheIn}` : ""}
|
||||
{model.priceCacheCreation ? ` / 入(缓存创建) ${model.priceCacheCreation}` : ""} / 出{" "}
|
||||
{model.priceOut}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -33,6 +33,11 @@ export function NewsListCard({
|
||||
const summaryClamp =
|
||||
layout === "primary" ? "news-list-card__summary news-list-card__summary--clamp" : "";
|
||||
|
||||
const hasCover = Boolean(article.image);
|
||||
const articleClassWithMedia = hasCover
|
||||
? articleClass
|
||||
: `${articleClass} news-list-card--no-cover`;
|
||||
|
||||
const mediaLinkClass =
|
||||
layout === "default"
|
||||
? "news-list-card__media-link relative block aspect-video w-full overflow-hidden bg-hairline no-underline hover:no-underline"
|
||||
@@ -41,14 +46,16 @@ export function NewsListCard({
|
||||
: "news-list-card__media-link relative block w-full shrink-0 overflow-hidden no-underline hover:no-underline";
|
||||
|
||||
return (
|
||||
<article className={articleClass}>
|
||||
<Link href={`/news/${article.slug}`} className={mediaLinkClass}>
|
||||
<NewsCoverImage
|
||||
src={article.image}
|
||||
alt={article.imageAlt}
|
||||
priority={priorityImage}
|
||||
/>
|
||||
</Link>
|
||||
<article className={articleClassWithMedia}>
|
||||
{hasCover && article.image ? (
|
||||
<Link href={`/news/${article.slug}`} className={mediaLinkClass}>
|
||||
<NewsCoverImage
|
||||
src={article.image}
|
||||
alt={article.imageAlt ?? article.title}
|
||||
priority={priorityImage}
|
||||
/>
|
||||
</Link>
|
||||
) : null}
|
||||
<div className="news-list-card__body flex flex-col gap-2">
|
||||
<span className="type-caption-strong text-body">{article.tag}</span>
|
||||
<h2 className={titleClass}>
|
||||
|
||||
@@ -58,36 +58,41 @@ export function SectionContact() {
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{/* <aside className="contact-business card-on-light">
|
||||
<p className="contact-business__eyebrow type-caption-strong">
|
||||
商务洽谈
|
||||
</p>
|
||||
<div className="contact-business__panel">
|
||||
<h3 className="contact-business__title type-body-md-strong">
|
||||
{b.title}
|
||||
</h3>
|
||||
<p className="contact-business__lead type-caption">{b.lead}</p>
|
||||
<div className="contact-business__qr-wrap">
|
||||
<Image
|
||||
src={b.qrImage}
|
||||
alt={b.qrAlt}
|
||||
width={220}
|
||||
height={220}
|
||||
className="contact-business__qr"
|
||||
priority={false}
|
||||
/>
|
||||
</div>
|
||||
<a
|
||||
href={`tel:${c.phoneTel}`}
|
||||
className="contact-business__phone type-body-md-strong no-underline hover:no-underline"
|
||||
>
|
||||
<span className="contact-business__phone-icon" aria-hidden>
|
||||
☎
|
||||
</span>
|
||||
{b.phoneLabel}:{c.phoneDisplay}
|
||||
</a>
|
||||
</div>
|
||||
</aside> */}
|
||||
<aside className="contact-business card-on-light">
|
||||
<p className="contact-business__eyebrow type-caption-strong">
|
||||
商务咨询
|
||||
</p>
|
||||
<div className="contact-business__panel">
|
||||
<h3 className="contact-business__title type-body-md-strong">
|
||||
{b.title}
|
||||
</h3>
|
||||
<p className="contact-business__lead type-caption">
|
||||
{b.lead}
|
||||
</p>
|
||||
<div className="contact-business__qr-wrap">
|
||||
<Image
|
||||
src={b.qrImage}
|
||||
alt={b.qrAlt}
|
||||
width={220}
|
||||
height={220}
|
||||
className="contact-business__qr"
|
||||
priority={false}
|
||||
/>
|
||||
</div>
|
||||
<a
|
||||
href={`tel:${c.phoneTel}`}
|
||||
className="contact-business__phone type-body-md-strong no-underline hover:no-underline"
|
||||
>
|
||||
<span
|
||||
className="contact-business__phone-icon"
|
||||
aria-hidden
|
||||
>
|
||||
☎
|
||||
</span>
|
||||
{b.phoneLabel}:{c.phoneDisplay}
|
||||
</a>
|
||||
</div>
|
||||
</aside>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import Image from "next/image";
|
||||
import Link from "next/link";
|
||||
import { site } from "@/content/site";
|
||||
import { resolveSiteHref } from "@/lib/nav-href";
|
||||
@@ -13,12 +14,13 @@ function isExternalHref(href: string) {
|
||||
|
||||
export function SiteFooter() {
|
||||
const f = site.footer;
|
||||
const businessQr = site.contact.business;
|
||||
|
||||
return (
|
||||
<footer className="band-light">
|
||||
<div className="band-section">
|
||||
<div className="container-site">
|
||||
<div className="grid gap-10 sm:grid-cols-2 lg:grid-cols-4">
|
||||
<div className="site-footer-columns grid gap-10 sm:grid-cols-2 lg:grid-cols-5">
|
||||
{f.columns.map((col) => (
|
||||
<div key={col.title} className="flex flex-col gap-4">
|
||||
<p className="type-caption-strong text-body">{col.title}</p>
|
||||
@@ -51,6 +53,19 @@ export function SiteFooter() {
|
||||
</ul>
|
||||
</div>
|
||||
))}
|
||||
<div className="site-footer-contact-qr flex flex-col gap-4">
|
||||
<p className="type-caption-strong text-body">微信客服</p>
|
||||
<p className="type-caption text-body">{businessQr.lead}</p>
|
||||
<div className="site-footer-contact-qr__wrap">
|
||||
<Image
|
||||
src={businessQr.qrImage}
|
||||
alt={businessQr.qrAlt}
|
||||
width={168}
|
||||
height={168}
|
||||
className="site-footer-contact-qr__img"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{f.friendLinks.length > 0 ? (
|
||||
<nav
|
||||
|
||||
@@ -21,21 +21,27 @@ export function SkillExampleContent({ report }: SkillExampleContentProps) {
|
||||
<p className="type-mono-caption text-body">{report.example.meta}</p>
|
||||
</header>
|
||||
<div className="report-example-content__body">
|
||||
{report.example.sections.map((sec) => (
|
||||
<section key={sec.heading} className="report-example-section">
|
||||
<h4 className="type-caption-strong text-ink">{sec.heading}</h4>
|
||||
{"body" in sec && sec.body ? (
|
||||
<p className="type-body-md text-body">{sec.body}</p>
|
||||
) : null}
|
||||
{"bullets" in sec && sec.bullets ? (
|
||||
<ul className="report-example-list">
|
||||
{sec.bullets.map((item) => (
|
||||
<li key={item}>{item}</li>
|
||||
))}
|
||||
</ul>
|
||||
) : null}
|
||||
</section>
|
||||
))}
|
||||
{"comingSoon" in report.example && report.example.comingSoon ? (
|
||||
<p className="type-display-md py-16 text-center text-body">
|
||||
敬请期待
|
||||
</p>
|
||||
) : (
|
||||
report.example.sections.map((sec) => (
|
||||
<section key={sec.heading} className="report-example-section">
|
||||
<h4 className="type-caption-strong text-ink">{sec.heading}</h4>
|
||||
{"body" in sec && sec.body ? (
|
||||
<p className="type-body-md text-body">{sec.body}</p>
|
||||
) : null}
|
||||
{"bullets" in sec && sec.bullets ? (
|
||||
<ul className="report-example-list">
|
||||
{sec.bullets.map((item) => (
|
||||
<li key={item}>{item}</li>
|
||||
))}
|
||||
</ul>
|
||||
) : null}
|
||||
</section>
|
||||
))
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
75
src/components/wechat-qr-dialog.tsx
Normal file
75
src/components/wechat-qr-dialog.tsx
Normal file
@@ -0,0 +1,75 @@
|
||||
"use client";
|
||||
|
||||
import Image from "next/image";
|
||||
import { useEffect } from "react";
|
||||
import { site } from "@/content/site";
|
||||
|
||||
type WechatQrDialogProps = {
|
||||
open: boolean;
|
||||
onClose: () => void;
|
||||
title?: string;
|
||||
lead?: string;
|
||||
};
|
||||
|
||||
export function WechatQrDialog({
|
||||
open,
|
||||
onClose,
|
||||
title = site.contact.business.title,
|
||||
lead = site.contact.business.lead,
|
||||
}: WechatQrDialogProps) {
|
||||
const { qrImage, qrAlt } = site.contact.business;
|
||||
|
||||
useEffect(() => {
|
||||
if (!open) return;
|
||||
const onKeyDown = (e: KeyboardEvent) => {
|
||||
if (e.key === "Escape") onClose();
|
||||
};
|
||||
window.addEventListener("keydown", onKeyDown);
|
||||
return () => window.removeEventListener("keydown", onKeyDown);
|
||||
}, [open, onClose]);
|
||||
|
||||
if (!open) return null;
|
||||
|
||||
return (
|
||||
<div
|
||||
className="report-example-overlay"
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
aria-labelledby="wechat-qr-dialog-title"
|
||||
onClick={(e) => {
|
||||
if (e.target === e.currentTarget) onClose();
|
||||
}}
|
||||
>
|
||||
<div className="wechat-qr-dialog report-example-dialog">
|
||||
<div className="report-example-dialog__inner">
|
||||
<header className="report-example-dialog__header flex flex-col gap-2 text-center">
|
||||
<h3
|
||||
id="wechat-qr-dialog-title"
|
||||
className="type-display-lg text-balance text-ink"
|
||||
>
|
||||
{title}
|
||||
</h3>
|
||||
<p className="type-body-md text-body">{lead}</p>
|
||||
</header>
|
||||
<div className="wechat-qr-dialog__body flex flex-col items-center gap-6">
|
||||
<div className="contact-business__qr-wrap">
|
||||
<Image
|
||||
src={qrImage}
|
||||
alt={qrAlt}
|
||||
width={220}
|
||||
height={220}
|
||||
className="contact-business__qr"
|
||||
priority={false}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<footer className="report-example-dialog__footer">
|
||||
<button type="button" className="btn-primary" onClick={onClose}>
|
||||
关闭
|
||||
</button>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -18,6 +18,10 @@ export type ModelCatalogItem = {
|
||||
context: string;
|
||||
priceIn: string;
|
||||
priceOut: string;
|
||||
/** 命中缓存的 prompt 输入价展示文案 */
|
||||
priceCacheIn?: string;
|
||||
/** 缓存创建的 prompt 输入价展示文案 */
|
||||
priceCacheCreation?: string;
|
||||
category: ModelCategory;
|
||||
provider: string;
|
||||
priceLabel?: string;
|
||||
@@ -37,6 +41,8 @@ export type ApiModelItem = {
|
||||
type: string;
|
||||
inputPrice?: number;
|
||||
outputPrice?: number;
|
||||
cacheInputPrice?: number;
|
||||
cacheCreationPrice?: number;
|
||||
currency?: string;
|
||||
unit?: string;
|
||||
columns?: string[];
|
||||
@@ -131,10 +137,12 @@ function inferCategory(
|
||||
|
||||
function formatPricing(api: ApiModelItem): Pick<
|
||||
ModelCatalogItem,
|
||||
"priceIn" | "priceOut" | "priceLabel" | "pricingNote"
|
||||
"priceIn" | "priceOut" | "priceCacheIn" | "priceCacheCreation" | "priceLabel" | "pricingNote"
|
||||
> {
|
||||
let priceIn = "—";
|
||||
let priceOut = "—";
|
||||
let priceCacheIn: string | undefined;
|
||||
let priceCacheCreation: string | undefined;
|
||||
let pricingNote: string | undefined;
|
||||
let priceLabel: string | undefined;
|
||||
|
||||
@@ -147,8 +155,25 @@ function formatPricing(api: ApiModelItem): Pick<
|
||||
p.outputPrice !== undefined
|
||||
) {
|
||||
const cur = p.currency ?? "¥";
|
||||
priceIn = `${cur}${p.inputPrice.toFixed(2)}`;
|
||||
priceOut = `${cur}${p.outputPrice.toFixed(2)}`;
|
||||
const fmt = (n: number) => n.toFixed(6).replace(/\.?0+$/, "");
|
||||
priceIn = `${cur}${fmt(p.inputPrice)}`;
|
||||
priceOut = `${cur}${fmt(p.outputPrice)}`;
|
||||
const cache =
|
||||
p.cacheInputPrice != null && p.cacheInputPrice > 0
|
||||
? p.cacheInputPrice
|
||||
: p.inputPrice;
|
||||
priceCacheIn = `${cur}${fmt(cache)}`;
|
||||
const creation =
|
||||
p.cacheCreationPrice != null && p.cacheCreationPrice > 0
|
||||
? p.cacheCreationPrice
|
||||
: p.inputPrice;
|
||||
priceCacheCreation = `${cur}${fmt(creation)}`;
|
||||
if (p.cacheInputPrice == null || p.cacheInputPrice <= 0) {
|
||||
pricingNote = "缓存命中价未单独配置时按输入价计费";
|
||||
}
|
||||
if (p.cacheCreationPrice == null || p.cacheCreationPrice <= 0) {
|
||||
pricingNote = [pricingNote, "缓存创建价未单独配置时按输入价计费"].filter(Boolean).join(";");
|
||||
}
|
||||
} else if (p.type === "table" && p.rows && p.columns) {
|
||||
priceLabel = p.unitLabel ?? "价格";
|
||||
const parts: string[] = [];
|
||||
@@ -163,7 +188,7 @@ function formatPricing(api: ApiModelItem): Pick<
|
||||
pricingNote = parts.length > 0 ? parts.join(" · ") : undefined;
|
||||
}
|
||||
|
||||
return { priceIn, priceOut, priceLabel, pricingNote };
|
||||
return { priceIn, priceOut, priceCacheIn, priceCacheCreation, priceLabel, pricingNote };
|
||||
}
|
||||
|
||||
/** 将后端公开模型列表映射为展示用目录(无静态合并) */
|
||||
|
||||
@@ -6,145 +6,104 @@ export type NewsArticle = {
|
||||
date: string;
|
||||
author: string;
|
||||
readMinutes: number;
|
||||
image: string;
|
||||
imageAlt: string;
|
||||
/** 封面图;暂不提供时留空 */
|
||||
image?: string | null;
|
||||
imageAlt?: string;
|
||||
paragraphs: string[];
|
||||
};
|
||||
|
||||
export const newsListPage = {
|
||||
eyebrow: "资讯",
|
||||
title: "AI 新闻资讯",
|
||||
lead: "精选行业动态、模型发布与产品实践,帮助团队保持对 AI 生态的同步认知。",
|
||||
lead: "海宇数科官网发布的平台能力、文档接入与产品动态,与控制台实际上线能力保持一致。",
|
||||
} as const;
|
||||
|
||||
/** 与 public/news/1.webp … 8.webp 一一对应 */
|
||||
/** 站内已上线能力与页面的官方说明 */
|
||||
export const newsArticles: NewsArticle[] = [
|
||||
{
|
||||
slug: "legal-policies-published",
|
||||
tag: "公告",
|
||||
title: "用户协议与隐私政策正式发布",
|
||||
summary: "官网文档中心提供用户协议、隐私政策全文,便于注册与接入前查阅。",
|
||||
date: "2026-06-25",
|
||||
author: "海宇数科",
|
||||
readMinutes: 3,
|
||||
paragraphs: [
|
||||
"《用户协议》与《隐私政策》已在官网文档中心上线,路径分别为 /docs/legal/user-agreement 与 /docs/legal/privacy。",
|
||||
"协议说明平台提供的大模型网关、控制台、智能报告与 Agent 技能等服务的适用范围、账号义务与变更规则;隐私政策列明实名认证、API 调用与客服沟通等场景下的信息处理方式。",
|
||||
"注册控制台或接入 API 前,建议团队法务或合规同事完成内部审阅;如有疑问可通过首页「联系我们」或企业微信客服沟通。",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "intelligent-report-enterprise-scenarios",
|
||||
tag: "产品",
|
||||
title: "大模型智能报告:四类企业场景上线展示",
|
||||
summary:
|
||||
"首页与企业 SKILL 广场同步展示企业综合风险、司法涉诉、全量核验与股权结构四类报告能力。",
|
||||
date: "2026-06-18",
|
||||
author: "海宇数科产品团队",
|
||||
readMinutes: 4,
|
||||
paragraphs: [
|
||||
"官网首页「大模型智能报告」区块已更新为企业尽调相关四类场景:企业综合风险报告、企业司法涉诉、企业全量信息核验、企业股权结构全景。",
|
||||
"智能报告介绍页(/reports)与 Agent 技能页(/agents)保持同一能力叙事,SKILL 广场可查看各技能的在线运行与安装说明;报告示例通道整理中,页面展示「敬请期待」。",
|
||||
"生产环境任务创建、计费与导出以控制台为准;官网侧重能力说明与接入指引,具体模型 ID 与价格请结合模型广场与控制台目录核对。",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "model-square-launch",
|
||||
tag: "产品",
|
||||
title: "模型广场上线:统一浏览平台可用模型",
|
||||
summary: "按场景分类查看上下文、能力与参考价格,技术选型一页完成。",
|
||||
date: "2026-05-20",
|
||||
summary: "按场景查看国内大模型的上下文、能力与参考价格,便于技术选型。",
|
||||
date: "2026-06-01",
|
||||
author: "海宇数科产品团队",
|
||||
readMinutes: 3,
|
||||
image: "/news/1.webp",
|
||||
imageAlt: "模型广场界面与多模型能力示意",
|
||||
paragraphs: [
|
||||
"模型广场页面现已上线,汇总海宇数科自营与接入模型的能力标签、上下文长度与参考单价,方便技术负责人做选型对比。",
|
||||
"首页「超全模型库」精选三款主力模型,完整目录请访问模型广场。后续将支持按行业筛选与 API 文档跳转。",
|
||||
"建议结合报告智能体场景模板一起评估:文本推理、报告成稿与多模态可组合调用,避免「单模型包打天下」带来的成本与效果失衡。",
|
||||
"官网模型广场(/models)已开放,汇总海宇数科网关侧展示的模型名录,包括文本、Agent、多模态、向量、编程等分类标签与参考单价。",
|
||||
"首页「超全模型库」区块与模型广场数据源一致,便于从品牌站点跳转到完整目录;请求参数中的 model 须与控制台模型 ID 完全一致。",
|
||||
"复制模型 ID、创建 API Key 与试调用请在控制台完成:console.haiyushuke.com。",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "report-templates-2",
|
||||
slug: "docs-center-launch",
|
||||
tag: "产品",
|
||||
title: "智能报告模板库 2.0 发布",
|
||||
summary: "新增制造业与零售行业模板,支持多语言导出。",
|
||||
date: "2026-05-12",
|
||||
title: "文档中心上线:快速开始与国内模型接入指南",
|
||||
summary: "覆盖 OpenAI 兼容 API、Cursor 等 IDE 接入、流式调用与计费说明。",
|
||||
date: "2026-05-22",
|
||||
author: "海宇数科产品团队",
|
||||
readMinutes: 4,
|
||||
image: "/news/2.webp",
|
||||
imageAlt: "智能报告模板与结构化章节预览",
|
||||
paragraphs: [
|
||||
"智能报告模板库 2.0 即日起面向全部企业客户开放。本次更新重点补齐制造业产能分析、零售渠道动销解读两类高频场景,模板结构与首页「大模型智能报告」四类智能体输出保持一致,便于从示例一键切换到生产任务。",
|
||||
"多语言导出支持简体中文、英文与繁体中文三种排版骨架;图表与表格标题将随语言包自动切换。若你已在用 1.x 模板,升级后历史任务无需重配字段映射。",
|
||||
"建议团队在上线前用 KYB 或供应商筛查场景各跑一条试算任务,确认复核节点与导出样式符合内部合规要求。",
|
||||
"文档中心(/docs)已上线,按「了解平台 → 选择国内模型 → 接工具 / 写代码 → 运维计费」组织内容。",
|
||||
"快速开始、HTTP API、OpenAI 兼容 SDK、流式调用、API Key 与控制台使用说明均已提供;集成章节包含 Cursor、Claude Code、Continue、Cline 等配置示例。",
|
||||
"网关 Base URL 为 https://api.haiyushuke.com/v1;不提供 GPT、Claude 等海外原厂模型,选型请以控制台已上线国内模型为准。",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "kyb-batch-export",
|
||||
slug: "solutions-hub-launch",
|
||||
tag: "产品",
|
||||
title: "KYB 报告支持批量导出与审计留痕",
|
||||
summary: "复核结论、证据链与时间戳一并打包,满足银行尽调归档。",
|
||||
title: "AI Agent 行业解决方案专题上线",
|
||||
summary:
|
||||
"企业数字化、新媒体分发、股市投研情报与多平台运营等方案可在官网专题页查看。",
|
||||
date: "2026-05-15",
|
||||
author: "海宇数科解决方案",
|
||||
readMinutes: 3,
|
||||
paragraphs: [
|
||||
"官网「AI Agent 行业解决方案」专题(/solutions)已上线,集中展示通用企业数字化底座与行业智能体方案入口。",
|
||||
"各方案详情页介绍场景能力标签与典型流程,包括新媒体内容分发、股市投研情报、多平台自动运营等方向;具体项目交付与定制可通过商务咨询沟通。",
|
||||
"方案页内容与首页解决方案区块一致,便于从首页卡片跳转阅读完整说明。",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "agent-skills-and-reports-pages",
|
||||
tag: "产品",
|
||||
title: "智能报告与 Agent 技能介绍页开放",
|
||||
summary: "SKILL 广场、MCP 配置说明与智能体一键安装规划同步展示。",
|
||||
date: "2026-05-08",
|
||||
author: "海宇数科产品团队",
|
||||
readMinutes: 4,
|
||||
image: "/news/3.webp",
|
||||
imageAlt: "KYB 企业核验与批量导出流程示意",
|
||||
readMinutes: 3,
|
||||
paragraphs: [
|
||||
"KYB 企业核验场景新增批量导出:单次任务最多 50 个主体,导出 ZIP 内含 PDF 报告、证据链 JSON 与操作审计日志,满足银行尽调留痕要求。",
|
||||
"审计日志记录模型版本、工具调用摘要与人工复核人,不可篡改字段由平台侧签名。",
|
||||
"批量任务仍支持在关键节点暂停复核,避免高风险主体在未确认情况下进入正式档案系统。",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "long-context-report-trial",
|
||||
tag: "模型",
|
||||
title: "长上下文报告模型开放试用",
|
||||
summary: "256K 上下文面向超长年报与招股书场景。",
|
||||
date: "2026-04-28",
|
||||
author: "海宇数科模型平台",
|
||||
readMinutes: 5,
|
||||
image: "/news/4.webp",
|
||||
imageAlt: "长文档报告模型与上下文能力示意",
|
||||
paragraphs: [
|
||||
"Haiyu-Report-Max 256K 上下文版本进入限量试用。该版本针对年报、招股书与合并报表等超长输入做了分段索引优化,在 IC Memo 与管理层汇报场景中可显著减少人工摘抄时间。",
|
||||
"试用配额按企业账号发放,默认并发 2 路。价格参考模型广场公示的输入 / 输出单价,试用期间不计入正式账单。",
|
||||
"若文档含大量扫描页,建议与 Haiyu-Vision-Doc 组合调用:视觉模型先提取表格与段落,再由报告模型成稿。",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "finance-shared-services-ai",
|
||||
tag: "行业",
|
||||
title: "大模型在财务共享中心的落地观察",
|
||||
summary: "从试点到规模化的三条路径与常见坑位。",
|
||||
date: "2026-04-15",
|
||||
author: "海宇数科行业研究",
|
||||
readMinutes: 6,
|
||||
image: "/news/5.webp",
|
||||
imageAlt: "财务共享与 AI 助手协同办公场景",
|
||||
paragraphs: [
|
||||
"财务共享中心是大模型落地最密集的企业职能之一,但成功率差异主要来自「流程嵌入深度」而非模型选型本身。我们观察到三条可复用路径:制度问答助手、关账说明自动生成、异常凭证解释。",
|
||||
"试点阶段常见坑位包括:指标口径未与数据中台对齐、输出直接进 ERP 缺少人工节点、以及把通用聊天模型硬用于结构化报告。",
|
||||
"规模化阶段建议将模型调用纳入统一网关,按场景路由到 Text-Pro 或 Report-Max,并在模型广场查看实时价格与上下文上限。",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "report-agent-orchestration",
|
||||
tag: "实践",
|
||||
title: "报告智能体编排最佳实践",
|
||||
summary: "如何在关键节点保留人工审核而不拖慢交付。",
|
||||
date: "2026-03-30",
|
||||
author: "海宇数科解决方案",
|
||||
readMinutes: 5,
|
||||
image: "/news/6.webp",
|
||||
imageAlt: "报告智能体三步流程与编排示意",
|
||||
paragraphs: [
|
||||
"报告智能体的一体化流水线已内置模型与工具,但风控场景仍需要在关键节点保留人工审核。推荐在「高风险信号写出后」「导出 PDF 前」设置两个可选暂停点,平均只增加约 3–8 分钟等待。",
|
||||
"编排上尽量用场景模板驱动,而不是在对话里临时描述输出结构;模板与智能报告卡片一一对应,可减少返工。",
|
||||
"安装渠道与 IDE 插件形态仍在完善中,官网「一键安装」入口将同步更新。",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "multimodal-contract-review",
|
||||
tag: "行业",
|
||||
title: "多模态审阅如何缩短合同核验周期",
|
||||
summary: "扫描件 OCR 与主体风险批注一体化,降低法务重复劳动。",
|
||||
date: "2026-03-18",
|
||||
author: "海宇数科行业研究",
|
||||
readMinutes: 5,
|
||||
image: "/news/7.webp",
|
||||
imageAlt: "合同扫描件与多模态风险批注示意",
|
||||
paragraphs: [
|
||||
"法务团队在处理供应商合同时,往往需要在 PDF 扫描件、工商数据和司法风险之间来回切换。Haiyu-Vision-Doc 与合同核验场景模板组合后,可在同一任务流中完成主体状态校验与条款风险提示。",
|
||||
"试点客户反馈:平均首轮审阅时间从约 45 分钟降至 15 分钟以内,复核节点仍由法务负责人确认后导出。",
|
||||
"对于含大量表格的附件,建议开启「表格优先解析」选项,避免段落顺序错乱影响批注位置。",
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "enterprise-rag-knowledge-base",
|
||||
tag: "实践",
|
||||
title: "企业制度库 RAG:从问答到可引用报告",
|
||||
summary: "向量检索 + 报告模型,让制度问答输出带条款出处。",
|
||||
date: "2026-03-05",
|
||||
author: "海宇数科解决方案",
|
||||
readMinutes: 6,
|
||||
image: "/news/8.webp",
|
||||
imageAlt: "企业知识库检索与 RAG 问答示意",
|
||||
paragraphs: [
|
||||
"许多企业将 Haiyu-Embed-v2 用于制度库与历史报告片段召回,再交由 Haiyu-Text-Pro 或 Report-Max 生成带引用的答复。相比纯聊天接口,报告模型更易输出结构化章节,便于合规归档。",
|
||||
"实施时建议按部门拆分知识库权限,并在网关侧记录检索命中片段 ID,以满足内控审计要求。",
|
||||
"若与报告智能体联用,可将高频问答沉淀为场景模板,减少业务人员重复描述需求。",
|
||||
"智能报告页(/reports)展示 SKILL 广场、MCP 接入步骤与企业尽调相关技能列表;Agent 技能页(/agents)说明面向小龙虾等智能体的官方 Skill 安装规划。",
|
||||
"当前 Skill 一键安装通道筹备中,页面以「敬请期待」提示为主;已支持通过文档与 MCP 配置手动接入网关能力。",
|
||||
"在线运行入口将跳转控制台或后续开放的能力页,请以控制台公告为准。",
|
||||
],
|
||||
},
|
||||
];
|
||||
@@ -160,3 +119,9 @@ export function getAllNewsSlugs(): string[] {
|
||||
export function getHomeNewsPreview(count = 3): NewsArticle[] {
|
||||
return newsArticles.slice(0, count);
|
||||
}
|
||||
|
||||
export function newsArticleHasCover(
|
||||
article: Pick<NewsArticle, "image">,
|
||||
): article is NewsArticle & { image: string } {
|
||||
return Boolean(article.image);
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@ export const site = {
|
||||
},
|
||||
links: {
|
||||
console: "https://console.haiyushuke.com",
|
||||
docs: "/docs",
|
||||
docsFaq: "/docs/faq",
|
||||
customerService:
|
||||
"https://work.weixin.qq.com/kfid/kfc1f8fc41acaca0895",
|
||||
},
|
||||
@@ -19,14 +21,14 @@ export const site = {
|
||||
title: "联系我们",
|
||||
lead: "产品咨询、技术支持与合作洽谈,可通过以下方式与我们联系。",
|
||||
email: "main@haiyushuke.cn",
|
||||
phoneDisplay: "+86 15018866168",
|
||||
phoneTel: "+8615018866168",
|
||||
phoneDisplay: "+86 17722052522",
|
||||
phoneTel: "+8617722052522",
|
||||
customerServiceLabel: "在线客服",
|
||||
business: {
|
||||
title: "扫码咨询",
|
||||
lead: "扫码加企微,一对一咨询 MCP 接入",
|
||||
qrImage: "/contact/business-wechat-qr.png",
|
||||
qrAlt: "企业微信商务洽谈二维码",
|
||||
title: "商务咨询",
|
||||
lead: "扫描二维码,添加微信客服",
|
||||
qrImage: "/qrcode.jpg",
|
||||
qrAlt: "微信客服二维码",
|
||||
phoneLabel: "电话咨询",
|
||||
},
|
||||
},
|
||||
@@ -49,143 +51,71 @@ export const site = {
|
||||
intelligentReport: {
|
||||
eyebrow: "产品",
|
||||
title: "大模型智能报告",
|
||||
lead: "面向银行、投资、法务与采购等场景,智能体自动完成企业核验与多维尽调,输出带证据链的结构化报告,支持一键查看示例与导出分享。",
|
||||
lead: "面向企业合规、尽调与经营决策场景,智能体自动完成企业核验与多维分析,输出带证据链的结构化报告,支持一键查看示例与导出分享。",
|
||||
viewExampleLabel: "查看智能体报告示例",
|
||||
reports: [
|
||||
{
|
||||
id: "kyb",
|
||||
audience: "银行 / 金融机构",
|
||||
title: "KYB 企业核验",
|
||||
body: "贷款申请提交后,AI 自动核验申请方工商状态、34 类司法风险与关联方异常,识别问题主体立即触发复核标注,将人工尽调从 2 小时压缩至分钟级。",
|
||||
id: "enterprise-risk",
|
||||
audience: "企业场景",
|
||||
title: "企业综合风险报告",
|
||||
body: "一次任务整合工商登记、经营异常、司法信号与关联方风险,AI 输出综合风险等级、复核建议与证据摘要,帮助团队在合作与准入前快速掌握主体风险全貌。",
|
||||
example: {
|
||||
title: "KYB 企业核验报告",
|
||||
meta: "智能体输出 · 示例 · 申请主体:某科技有限公司",
|
||||
sections: [
|
||||
{
|
||||
heading: "核验结论",
|
||||
body: "主体存续正常;存在 2 项需复核风险信号,建议进入人工复核队列。",
|
||||
},
|
||||
{
|
||||
heading: "工商与经营状态",
|
||||
bullets: [
|
||||
"统一社会信用代码登记状态:存续",
|
||||
"法定代表人近 12 个月无变更",
|
||||
"经营范围与贷款用途类别匹配",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "司法与信用风险(34 类扫描摘要)",
|
||||
bullets: [
|
||||
"无失信被执行人记录",
|
||||
"关联企业 A 存在 1 条未结商事诉讼(标的 120 万)→ 已标注复核",
|
||||
"无股权冻结、无限制高消费",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "关联方异常",
|
||||
bullets: [
|
||||
"实际控制人对外担任高管的企业 3 家,均非注销/吊销",
|
||||
"1 家关联方近 90 天新增行政处罚 → 触发复核标注",
|
||||
],
|
||||
},
|
||||
],
|
||||
comingSoon: true,
|
||||
title: "企业综合风险报告",
|
||||
meta: "敬请期待",
|
||||
sections: [] as {
|
||||
heading: string;
|
||||
body?: string;
|
||||
bullets?: string[];
|
||||
}[],
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "ic-memo",
|
||||
audience: "投资人 / FA",
|
||||
title: "IC Memo 投资备忘录",
|
||||
body: "DD 阶段一次对话,AI 并行完成股权穿透、司法诉讼、知识产权与招投标多维扫描,自动输出股权结构图 + 诉讼摘要 + 专利清单,直接用于 IC Memo 撰写。",
|
||||
id: "enterprise-litigation",
|
||||
audience: "企业场景",
|
||||
title: "企业司法涉诉",
|
||||
body: "自动梳理企业作为当事人涉及的诉讼、执行、限高与失信等公开司法信息,按时间线与案由聚合摘要,便于法务与商务团队评估涉诉暴露与履约影响。",
|
||||
example: {
|
||||
title: "IC Memo 尽调摘要",
|
||||
meta: "智能体输出 · 示例 · 标的:某智能制造有限公司",
|
||||
sections: [
|
||||
{
|
||||
heading: "股权结构(穿透摘要)",
|
||||
bullets: [
|
||||
"控股股东:创始团队持股平台 62%",
|
||||
"机构股东:A 轮基金 28%,员工期权池 10%",
|
||||
"无代持、无对赌条款在公开登记信息中披露",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "诉讼与合规",
|
||||
body: "近 3 年作为被告案件 1 起(劳动争议,已结案);无重大环保、安全生产处罚。",
|
||||
},
|
||||
{
|
||||
heading: "知识产权",
|
||||
bullets: [
|
||||
"发明专利 14 项(其中 9 项已授权)",
|
||||
"软件著作权 6 项",
|
||||
"核心商标 3 件,均在有效期内",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "招投标与市场",
|
||||
bullets: [
|
||||
"近 12 个月中标金额合计约 4,200 万",
|
||||
"主要客户行业:汽车零部件、工业自动化",
|
||||
],
|
||||
},
|
||||
],
|
||||
comingSoon: true,
|
||||
title: "企业司法涉诉",
|
||||
meta: "敬请期待",
|
||||
sections: [] as {
|
||||
heading: string;
|
||||
body?: string;
|
||||
bullets?: string[];
|
||||
}[],
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "contract",
|
||||
audience: "法务 / 律师",
|
||||
title: "合同核验",
|
||||
body: "AI 审阅合同文本时同步核验合同双方工商状态、34 类司法风险,营业执照注销、被执行、股权冻结等异常立即生成高风险批注,防范与问题主体签约导致合同无效或履约失败。",
|
||||
id: "enterprise-verify",
|
||||
audience: "企业场景",
|
||||
title: "企业全量信息核验",
|
||||
body: "以企业完整登记名称为入口,交叉核验工商状态、主要人员、资质证照与关键公开字段一致性,识别注销、吊销与信息冲突等问题主体并标注复核项。",
|
||||
example: {
|
||||
title: "合同双方核验批注",
|
||||
meta: "智能体输出 · 示例 · 合同:软件采购框架协议",
|
||||
sections: [
|
||||
{
|
||||
heading: "甲方(采购方)",
|
||||
body: "工商存续正常;无司法高风险项。",
|
||||
},
|
||||
{
|
||||
heading: "乙方(供应方)— 高风险批注",
|
||||
bullets: [
|
||||
"【高风险】登记状态为「注销」→ 建议暂停签署",
|
||||
"【高风险】法定代表人被列入失信被执行人名单",
|
||||
"【中风险】股权 30% 处于冻结状态",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "条款关联提示",
|
||||
body: "第 3.2 条交付义务、第 8 条违约责任在乙方主体异常情况下履约风险极高,建议更换主体或要求母公司担保后再签。",
|
||||
},
|
||||
],
|
||||
comingSoon: true,
|
||||
title: "企业全量信息核验",
|
||||
meta: "敬请期待",
|
||||
sections: [] as {
|
||||
heading: string;
|
||||
body?: string;
|
||||
bullets?: string[];
|
||||
}[],
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "supplier",
|
||||
audience: "采购 / 供应链",
|
||||
title: "新供应商快速筛选",
|
||||
body: "招投标评审前批量核验候选供应商,AI 同步扫描工商合规、失信被执行黑名单与资质证件真实性,3 分钟批量出筛查结论,在评审会召开前帮助采购团队锁定高风险候选方。",
|
||||
id: "enterprise-equity",
|
||||
audience: "企业场景",
|
||||
title: "企业股权结构全景",
|
||||
body: "多层穿透股权链路与实际控制人,生成结构全景与关键持股节点说明,辅助识别一致行动关系、交叉持股与隐性关联,支撑尽调与治理审查。",
|
||||
example: {
|
||||
title: "供应商批量筛查结果",
|
||||
meta: "智能体输出 · 示例 · 批次:2025-Q2 设备采购 8 家候选",
|
||||
sections: [
|
||||
{
|
||||
heading: "批次结论",
|
||||
body: "建议进入短名单 4 家;建议剔除 2 家;待补充资质 2 家。",
|
||||
},
|
||||
{
|
||||
heading: "高风险(建议剔除)",
|
||||
bullets: [
|
||||
"供应商 C:失信被执行人 + 经营异常名录",
|
||||
"供应商 F:营业执照信息与投标文件不一致",
|
||||
],
|
||||
},
|
||||
{
|
||||
heading: "通过项(节选)",
|
||||
bullets: [
|
||||
"供应商 A、B、D、H:工商、失信、资质证照交叉验证通过",
|
||||
"供应商 G:ISO9001 证书链验证通过,有效期至 2026-08",
|
||||
],
|
||||
},
|
||||
],
|
||||
comingSoon: true,
|
||||
title: "企业股权结构全景",
|
||||
meta: "敬请期待",
|
||||
sections: [] as {
|
||||
heading: string;
|
||||
body?: string;
|
||||
bullets?: string[];
|
||||
}[],
|
||||
},
|
||||
},
|
||||
],
|
||||
@@ -193,7 +123,7 @@ export const site = {
|
||||
skillMarket: {
|
||||
eyebrow: "产品",
|
||||
title: "SKILL 广场",
|
||||
lead: "27 个经过真实场景验证的 SKILL,覆盖银行、投资、法务、采购四大客群。配置海宇数科 MCP,3 分钟跑通首份尽调报告。",
|
||||
lead: "27 个经过真实场景验证的 SKILL,覆盖企业合规、投资、法务、采购等场景。配置海宇数科 MCP,3 分钟跑通首份尽调报告。",
|
||||
howToUse: {
|
||||
eyebrow: "使用指南",
|
||||
title: "怎么使用 SKILL ?",
|
||||
@@ -238,7 +168,7 @@ export const site = {
|
||||
},
|
||||
categories: [
|
||||
{ id: "all", label: "全部", emoji: "✨" },
|
||||
{ id: "bank", label: "银行", emoji: "🏦" },
|
||||
{ id: "bank", label: "企业合规", emoji: "🏢" },
|
||||
{ id: "invest", label: "投资", emoji: "📊" },
|
||||
{ id: "legal", label: "法务", emoji: "⚖️" },
|
||||
{ id: "supply", label: "供应链", emoji: "🔗" },
|
||||
@@ -249,8 +179,8 @@ export const site = {
|
||||
category: "bank",
|
||||
title: "KYB 企业核验",
|
||||
slug: "/kyb-verification",
|
||||
body: "银行开户和授信审批前的核心合规工具。输入企业名称,AI 自动完成主体真实性核验、股权结构穿透、34 类司法与经营风险扫描,3 分钟输出符合 FATF / PBOC / CBIRC 标准的合规报告,替代传统客户经理 2-3 小时人工尽调流程。",
|
||||
exampleId: "kyb",
|
||||
body: "企业准入与合作伙伴核验的核心工具。输入企业名称,AI 自动完成主体真实性核验、股权结构穿透、34 类司法与经营风险扫描,3 分钟输出结构化合规报告,替代传统人工尽调流程。",
|
||||
exampleId: "enterprise-verify",
|
||||
},
|
||||
{
|
||||
id: "ic-memo",
|
||||
@@ -258,7 +188,7 @@ export const site = {
|
||||
title: "IC Memo 投资备忘录",
|
||||
slug: "/ic-memo",
|
||||
body: "PE/VC 投资决策的核心尽调工具。一次对话并行完成目标公司工商登记、多层股权穿透、司法风险、知识产权全维度扫描,直接输出符合投委会要求的标准格式备忘录,传统分析师 2-3 小时工作量压缩至约 3 分钟。",
|
||||
exampleId: "ic-memo",
|
||||
exampleId: "enterprise-equity",
|
||||
},
|
||||
{
|
||||
id: "contract-review",
|
||||
@@ -266,7 +196,7 @@ export const site = {
|
||||
title: "合同核验",
|
||||
slug: "/contract-review",
|
||||
body: "合同审核与主体核验一体化工具。AI 审阅合同文本的同时,自动核验合同双方的工商登记状态、34 类司法与经营风险,营业执照注销、被执行、股权冻结等异常立即生成高风险批注,防范与问题主体签约导致合同无效或履约失败。",
|
||||
exampleId: "contract",
|
||||
exampleId: "enterprise-litigation",
|
||||
},
|
||||
{
|
||||
id: "new-supplier-screening",
|
||||
@@ -274,7 +204,7 @@ export const site = {
|
||||
title: "新供应商快速筛选",
|
||||
slug: "/new-supplier-screening",
|
||||
body: "招投标评审阶段的候选供应商快速筛查工具。对多家候选供应商同步核查工商合规性、失信被执行黑名单状态与资质证件真实性,3 分钟批量出具筛查结论,在评审会召开前帮助采购团队快速排除存在硬性风险的候选方。",
|
||||
exampleId: "supplier",
|
||||
exampleId: "enterprise-risk",
|
||||
},
|
||||
{
|
||||
id: "history-evolution",
|
||||
@@ -309,7 +239,7 @@ export const site = {
|
||||
category: "bank",
|
||||
title: "受益所有人识别",
|
||||
slug: "/ubo-screening",
|
||||
body: "对公开户、高净值客户尽调与反洗钱日常筛查场景下的受益所有人识别工具。3 分钟自动锁定企业最终受益人,按央行 3 号令 25% 阈值穿透股权链路、查明实控人画像与关联企业网络,输出可直接归档 KYC 系统的合规档案。",
|
||||
body: "对公开户、高净值客户尽调与反洗钱日常筛查场景下的受益所有人识别工具。3 分钟自动锁定企业最终受益人,按监管阈值穿透股权链路、查明实控人画像与关联企业网络,输出可直接归档 KYC 系统的合规档案。",
|
||||
},
|
||||
{
|
||||
id: "equity-structure",
|
||||
@@ -328,30 +258,30 @@ export const site = {
|
||||
{
|
||||
id: "credit-due-diligence",
|
||||
category: "bank",
|
||||
title: "授信尽调报告",
|
||||
title: "企业尽调底稿报告",
|
||||
slug: "/credit-due-diligence",
|
||||
body: "信贷审批流程中的企业全维度尽调工具。授信前自动汇总目标企业工商登记、实控人信息、经营异常记录与司法风险状况,输出标准化授信尽调底稿,帮助信贷审批人在放款前全面掌握企业风险画像,支撑有据可查的授信决策。",
|
||||
body: "合作与准入前的企业全维度尽调工具。自动汇总目标企业工商登记、实控人信息、经营异常记录与司法风险状况,输出标准化尽调底稿,帮助团队在决策前全面掌握企业风险画像。",
|
||||
},
|
||||
{
|
||||
id: "credit-monitoring",
|
||||
category: "bank",
|
||||
title: "信贷风险定期监控",
|
||||
title: "企业风险定期监控",
|
||||
slug: "/credit-monitoring",
|
||||
body: "贷后管理中对存量借款客户的持续风险监控工具。定期对贷款企业进行风险体检,失信被执行、经营异常登记、法定代表人变更等关键风险信号一旦发生变化即时推送预警,帮助客户经理在风险暴露初期及时采取措施。",
|
||||
body: "对重点合作企业与存量伙伴的持续风险监控工具。定期对企业进行风险体检,失信被执行、经营异常登记、法定代表人变更等关键风险信号一旦发生变化即时推送预警,帮助团队在风险暴露初期及时采取措施。",
|
||||
},
|
||||
{
|
||||
id: "litigation-analysis",
|
||||
category: "legal",
|
||||
title: "诉讼风险评估",
|
||||
slug: "/litigation-analysis",
|
||||
body: "立案前的对手方诉讼风险评估工具。以「企业当前 × 企业历史 × 核心人员」三层穿透扫描对手方,整合裁判文书、立案信息、执行风险、限高/限出境与法代/实控人个人涉诉档案,基于 5-10 年历史数据做时间序列趋势分析,支撑立案、授信、投资决策。",
|
||||
body: "立案前的对手方诉讼风险评估工具。以「企业当前 × 企业历史 × 核心人员」三层穿透扫描对手方,整合裁判文书、立案信息、执行风险、限高/限出境与法代/实控人个人涉诉档案,基于 5-10 年历史数据做时间序列趋势分析,支撑立案与投资决策。",
|
||||
},
|
||||
{
|
||||
id: "counterparty-risk",
|
||||
category: "bank",
|
||||
title: "交易对手风险评估",
|
||||
slug: "/counterparty-risk",
|
||||
body: "贸易融资业务中对交易对手的多维风险评估工具。整合企业进出口信用等级、行政处罚记录、失信被执行情况与经营异常信息,生成综合风险评分,帮助贸易金融团队在开证、议付等关键节点识别潜在违约风险。",
|
||||
body: "跨境与供应链场景中对交易对手的多维风险评估工具。整合企业进出口合规信息、行政处罚记录、失信被执行情况与经营异常信息,生成综合风险评分,帮助业务团队在开立合同、交付与结算等关键节点识别潜在履约风险。",
|
||||
},
|
||||
{
|
||||
id: "strip-profile",
|
||||
@@ -372,7 +302,7 @@ export const site = {
|
||||
category: "supply",
|
||||
title: "供应商年度健康体检",
|
||||
slug: "/supplier-annual-check",
|
||||
body: "供应商年度评审的标准化核查工具。对核心供应商进行全面年度体检,一次性输出经营状态变化、资质证件到期情况、信用记录变更的结构化报告,帮助采购团队在年度供应商评审和续签决策中有充分的数据支撑。",
|
||||
body: "供应商年度评审的标准化核查工具。对核心供应商进行全面年度体检,一次性输出经营状态变化、资质证件到期情况、合规与失信记录变更的结构化报告,帮助采购团队在年度供应商评审和续签决策中有充分的数据支撑。",
|
||||
},
|
||||
],
|
||||
runLabel: "在线运行",
|
||||
@@ -409,7 +339,7 @@ export const site = {
|
||||
},
|
||||
{
|
||||
name: "挑选 Skill",
|
||||
desc: "浏览智能报告、KYB、合同核验等技能包与版本说明。",
|
||||
desc: "浏览智能报告、企业核验、合同核验等技能包与版本说明。",
|
||||
screenTitle: "技能市场",
|
||||
screenHint: "报告 Skill · 尽调 Skill",
|
||||
},
|
||||
@@ -471,7 +401,7 @@ export const site = {
|
||||
news: {
|
||||
eyebrow: "资讯",
|
||||
title: "AI 新闻资讯",
|
||||
lead: "精选行业动态、模型发布与产品实践,帮助团队保持对 AI 生态的同步认知。",
|
||||
lead: "海宇数科产品与平台动态、文档接入与能力更新。",
|
||||
listHref: "/news",
|
||||
previewCount: 4,
|
||||
},
|
||||
@@ -499,9 +429,12 @@ export const site = {
|
||||
{
|
||||
title: "资源",
|
||||
links: [
|
||||
{ label: "文档中心", href: "/docs" },
|
||||
{ label: "常见问题", href: "/docs/faq" },
|
||||
{ label: "用户协议", href: "/docs/legal/user-agreement" },
|
||||
{ label: "隐私政策", href: "/docs/legal/privacy" },
|
||||
{ label: "AI 资讯", href: "/news" },
|
||||
{ label: "模型广场", href: "/models" },
|
||||
{ label: "服务状态", href: "#" },
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -509,7 +442,7 @@ export const site = {
|
||||
links: [
|
||||
{ label: "在线客服", href: "https://work.weixin.qq.com/kfid/kfc1f8fc41acaca0895" },
|
||||
{ label: "main@haiyushuke.cn", href: "mailto:main@haiyushuke.cn" },
|
||||
{ label: "+86 15018866168", href: "tel:+8615018866168" },
|
||||
{ label: "+86 17722052522", href: "tel:+8617722052522" },
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
@@ -41,7 +41,7 @@ export const categoryMeta: Record<
|
||||
SkillCategory,
|
||||
{ slug: string; label: string }
|
||||
> = {
|
||||
bank: { slug: "banking", label: "银行 · 合规风控" },
|
||||
bank: { slug: "banking", label: "企业 · 合规风控" },
|
||||
invest: { slug: "invest", label: "投资 · 尽调" },
|
||||
legal: { slug: "legal", label: "法务 · 合规" },
|
||||
supply: { slug: "supply", label: "供应链 · 采购" },
|
||||
@@ -63,8 +63,8 @@ export const skills: Skill[] = [
|
||||
category: "bank",
|
||||
title: "KYB 企业核验",
|
||||
slug: "/kyb-verification",
|
||||
body: "银行开户和授信审批前的核心合规工具。输入企业名称,AI 自动完成主体真实性核验、股权结构穿透、34 类司法与经营风险扫描,3 分钟输出符合 FATF / PBOC / CBIRC 标准的合规报告,替代传统客户经理 2-3 小时人工尽调流程。",
|
||||
exampleId: "kyb",
|
||||
body: "企业准入与合作伙伴核验的核心工具。输入企业名称,AI 自动完成主体真实性核验、股权结构穿透、34 类司法与经营风险扫描,3 分钟输出结构化合规报告,替代传统人工尽调流程。",
|
||||
exampleId: "enterprise-verify",
|
||||
detail: {
|
||||
runSubtitle: "输入企业名称,AI 自动完成 KYB 企业核验",
|
||||
...sharedRun,
|
||||
@@ -77,7 +77,7 @@ export const skills: Skill[] = [
|
||||
title: "IC Memo 投资备忘录",
|
||||
slug: "/ic-memo",
|
||||
body: "PE/VC 投资决策的核心尽调工具。一次对话并行完成目标公司工商登记、多层股权穿透、司法风险、知识产权全维度扫描,直接输出符合投委会要求的标准格式备忘录,传统分析师 2-3 小时工作量压缩至约 3 分钟。",
|
||||
exampleId: "ic-memo",
|
||||
exampleId: "enterprise-equity",
|
||||
detail: {
|
||||
runSubtitle: "输入目标公司,AI 自动生成 IC Memo 投资备忘录",
|
||||
...sharedRun,
|
||||
@@ -90,7 +90,7 @@ export const skills: Skill[] = [
|
||||
title: "合同核验",
|
||||
slug: "/contract-review",
|
||||
body: "合同审核与主体核验一体化工具。AI 审阅合同文本的同时,自动核验合同双方的工商登记状态、34 类司法与经营风险,营业执照注销、被执行、股权冻结等异常立即生成高风险批注,防范与问题主体签约导致合同无效或履约失败。",
|
||||
exampleId: "contract",
|
||||
exampleId: "enterprise-litigation",
|
||||
detail: {
|
||||
runSubtitle: "上传合同或输入双方名称,AI 自动核验并批注风险",
|
||||
...sharedRun,
|
||||
@@ -103,7 +103,7 @@ export const skills: Skill[] = [
|
||||
title: "新供应商快速筛选",
|
||||
slug: "/new-supplier-screening",
|
||||
body: "招投标评审阶段的候选供应商快速筛查工具。对多家候选供应商同步核查工商合规性、失信被执行黑名单状态与资质证件真实性,3 分钟批量出具筛查结论,在评审会召开前帮助采购团队快速排除存在硬性风险的候选方。",
|
||||
exampleId: "supplier",
|
||||
exampleId: "enterprise-risk",
|
||||
detail: {
|
||||
runSubtitle: "批量输入候选供应商,AI 同步筛查并给出结论",
|
||||
...sharedRun,
|
||||
@@ -197,25 +197,25 @@ export const skills: Skill[] = [
|
||||
{
|
||||
id: "credit-due-diligence",
|
||||
category: "bank",
|
||||
title: "授信尽调报告",
|
||||
title: "企业尽调底稿报告",
|
||||
slug: "/credit-due-diligence",
|
||||
body: "信贷审批流程中的企业全维度尽调工具。授信前自动汇总目标企业工商登记、实控人信息、经营异常记录与司法风险状况,输出标准化授信尽调底稿,帮助信贷审批人在放款前全面掌握企业风险画像,支撑有据可查的授信决策。",
|
||||
body: "合作与准入前的企业全维度尽调工具。自动汇总目标企业工商登记、实控人信息、经营异常记录与司法风险状况,输出标准化尽调底稿,帮助团队在决策前全面掌握企业风险画像。",
|
||||
detail: {
|
||||
runSubtitle: "输入借款企业,AI 汇总风险并输出授信尽调底稿",
|
||||
runSubtitle: "输入目标企业,AI 汇总风险并输出尽调底稿",
|
||||
...sharedRun,
|
||||
installPrompt: sharedInstall("授信尽调报告", "/credit-due-diligence"),
|
||||
installPrompt: sharedInstall("企业尽调底稿报告", "/credit-due-diligence"),
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "credit-monitoring",
|
||||
category: "bank",
|
||||
title: "信贷风险定期监控",
|
||||
title: "企业风险定期监控",
|
||||
slug: "/credit-monitoring",
|
||||
body: "贷后管理中对存量借款客户的持续风险监控工具。定期对贷款企业进行风险体检,失信被执行、经营异常登记、法定代表人变更等关键风险信号一旦发生变化即时推送预警,帮助客户经理在风险暴露初期及时采取措施。",
|
||||
body: "对重点合作企业与存量伙伴的持续风险监控工具。定期对企业进行风险体检,失信被执行、经营异常登记、法定代表人变更等关键风险信号一旦发生变化即时推送预警,帮助团队在风险暴露初期及时采取措施。",
|
||||
detail: {
|
||||
runSubtitle: "输入存量借款企业,AI 定期体检并推送风险预警",
|
||||
runSubtitle: "输入重点合作企业,AI 定期体检并推送风险预警",
|
||||
...sharedRun,
|
||||
installPrompt: sharedInstall("信贷风险定期监控", "/credit-monitoring"),
|
||||
installPrompt: sharedInstall("企业风险定期监控", "/credit-monitoring"),
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -223,7 +223,7 @@ export const skills: Skill[] = [
|
||||
category: "legal",
|
||||
title: "诉讼风险评估",
|
||||
slug: "/litigation-analysis",
|
||||
body: "立案前的对手方诉讼风险评估工具。以「企业当前 × 企业历史 × 核心人员」三层穿透扫描对手方,整合裁判文书、立案信息、执行风险、限高/限出境与法代/实控人个人涉诉档案,基于 5-10 年历史数据做时间序列趋势分析,支撑立案、授信、投资决策。",
|
||||
body: "立案前的对手方诉讼风险评估工具。以「企业当前 × 企业历史 × 核心人员」三层穿透扫描对手方,整合裁判文书、立案信息、执行风险、限高/限出境与法代/实控人个人涉诉档案,基于 5-10 年历史数据做时间序列趋势分析,支撑立案与投资决策。",
|
||||
detail: {
|
||||
runSubtitle: "输入对手方企业,AI 三层穿透扫描并研判诉讼风险",
|
||||
...sharedRun,
|
||||
@@ -235,7 +235,7 @@ export const skills: Skill[] = [
|
||||
category: "bank",
|
||||
title: "交易对手风险评估",
|
||||
slug: "/counterparty-risk",
|
||||
body: "贸易融资业务中对交易对手的多维风险评估工具。整合企业进出口信用等级、行政处罚记录、失信被执行情况与经营异常信息,生成综合风险评分,帮助贸易金融团队在开证、议付等关键节点识别潜在违约风险。",
|
||||
body: "跨境与供应链场景中对交易对手的多维风险评估工具。整合企业进出口合规信息、行政处罚记录、失信被执行情况与经营异常信息,生成综合风险评分,帮助业务团队在开立合同、交付与结算等关键节点识别潜在履约风险。",
|
||||
detail: {
|
||||
runSubtitle: "输入交易对手,AI 生成综合风险评分",
|
||||
...sharedRun,
|
||||
@@ -271,7 +271,7 @@ export const skills: Skill[] = [
|
||||
category: "supply",
|
||||
title: "供应商年度健康体检",
|
||||
slug: "/supplier-annual-check",
|
||||
body: "供应商年度评审的标准化核查工具。对核心供应商进行全面年度体检,一次性输出经营状态变化、资质证件到期情况、信用记录变更的结构化报告,帮助采购团队在年度供应商评审和续签决策中有充分的数据支撑。",
|
||||
body: "供应商年度评审的标准化核查工具。对核心供应商进行全面年度体检,一次性输出经营状态变化、资质证件到期情况、合规与失信记录变更的结构化报告,帮助采购团队在年度供应商评审和续签决策中有充分的数据支撑。",
|
||||
detail: {
|
||||
runSubtitle: "输入核心供应商,AI 输出年度健康体检报告",
|
||||
...sharedRun,
|
||||
|
||||
@@ -9,22 +9,40 @@ export const docsNav: DocsNavItem[] = [
|
||||
{ href: "/docs", label: "文档中心" },
|
||||
{ href: "/docs/getting-started", label: "快速开始" },
|
||||
{
|
||||
href: "/docs/models/openai",
|
||||
label: "AI 模型接入",
|
||||
href: "/docs/integrations/overview",
|
||||
label: "工具接入",
|
||||
children: [
|
||||
{ href: "/docs/models/openai", label: "OpenAI" },
|
||||
{ href: "/docs/models/claude", label: "Claude" },
|
||||
{ href: "/docs/models/deepseek", label: "DeepSeek" },
|
||||
{ href: "/docs/integrations/overview", label: "接入概览" },
|
||||
{ href: "/docs/integrations/cursor", label: "Cursor" },
|
||||
{ href: "/docs/integrations/claude_code", label: "Claude Code" },
|
||||
{ href: "/docs/integrations/continue", label: "Continue" },
|
||||
{ href: "/docs/integrations/cline", label: "Cline" },
|
||||
],
|
||||
},
|
||||
{
|
||||
href: "/docs/guides/console",
|
||||
label: "使用指南",
|
||||
href: "/docs/guides/http_api",
|
||||
label: "开发指南",
|
||||
children: [
|
||||
{ href: "/docs/guides/http_api", label: "HTTP API" },
|
||||
{ href: "/docs/guides/openai_compatible", label: "OpenAI 兼容 SDK" },
|
||||
{ href: "/docs/guides/streaming", label: "流式调用" },
|
||||
{ href: "/docs/guides/console", label: "控制台" },
|
||||
{ href: "/docs/guides/api_keys", label: "API Key" },
|
||||
{ href: "/docs/guides/streaming", label: "流式调用" },
|
||||
{ href: "/docs/guides/billing", label: "计费与财务" },
|
||||
],
|
||||
},
|
||||
{
|
||||
href: "/docs/concepts/overview",
|
||||
label: "核心概念",
|
||||
children: [{ href: "/docs/concepts/overview", label: "核心概念" }],
|
||||
},
|
||||
{ href: "/docs/faq", label: "常见问题" },
|
||||
{
|
||||
href: "/docs/legal/user-agreement",
|
||||
label: "法律条款",
|
||||
children: [
|
||||
{ href: "/docs/legal/user-agreement", label: "用户协议" },
|
||||
{ href: "/docs/legal/privacy", label: "隐私政策" },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
@@ -175,10 +175,10 @@ export function newsArticleJsonLd(article: {
|
||||
slug: string;
|
||||
date: string;
|
||||
author: string;
|
||||
image: string;
|
||||
image?: string | null;
|
||||
}) {
|
||||
const url = absoluteUrl(`/news/${article.slug}`);
|
||||
return {
|
||||
const jsonLd: Record<string, unknown> = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "NewsArticle",
|
||||
headline: article.title,
|
||||
@@ -188,7 +188,6 @@ export function newsArticleJsonLd(article: {
|
||||
"@type": "Organization",
|
||||
name: article.author,
|
||||
},
|
||||
image: [absoluteUrl(article.image)],
|
||||
mainEntityOfPage: { "@type": "WebPage", "@id": url },
|
||||
publisher: {
|
||||
"@type": "Organization",
|
||||
@@ -196,4 +195,8 @@ export function newsArticleJsonLd(article: {
|
||||
url: getSiteUrl().toString(),
|
||||
},
|
||||
};
|
||||
if (article.image) {
|
||||
jsonLd.image = [absoluteUrl(article.image)];
|
||||
}
|
||||
return jsonLd;
|
||||
}
|
||||
|
||||
@@ -291,6 +291,105 @@
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.home-consult-float {
|
||||
position: fixed;
|
||||
right: calc(var(--spacing-xl) + var(--spacing-md));
|
||||
bottom: calc(var(--spacing-2xl) + var(--spacing-md));
|
||||
z-index: 45;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--spacing-sm);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
@media (width >= 768px) {
|
||||
.home-consult-float {
|
||||
right: calc(var(--spacing-2xl) + var(--spacing-xl));
|
||||
bottom: calc(var(--spacing-2xl) + var(--spacing-lg));
|
||||
}
|
||||
}
|
||||
|
||||
.home-consult-float__icon {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.home-consult-float__btn {
|
||||
pointer-events: auto;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: var(--spacing-xs);
|
||||
min-width: 7.5rem;
|
||||
padding: var(--spacing-sm) var(--spacing-lg);
|
||||
border-radius: 999px;
|
||||
border: none;
|
||||
font-size: 0.9375rem;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.02em;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
box-shadow: 0 8px 24px rgb(20 30 45 / 0.18);
|
||||
transition:
|
||||
transform 0.15s ease,
|
||||
box-shadow 0.15s ease,
|
||||
background-color 0.15s ease;
|
||||
}
|
||||
|
||||
.home-consult-float__btn:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 12px 28px rgb(20 30 45 / 0.22);
|
||||
}
|
||||
|
||||
.home-consult-float__btn--primary {
|
||||
background-color: #006fe4;
|
||||
color: rgb(255 255 255);
|
||||
}
|
||||
|
||||
.home-consult-float__btn--primary:hover {
|
||||
background-color: #005ec4;
|
||||
color: rgb(255 255 255);
|
||||
}
|
||||
|
||||
.home-consult-float__btn--secondary {
|
||||
background-color: var(--color-canvas-elevated);
|
||||
color: var(--color-ink);
|
||||
border: 1px solid var(--color-hairline);
|
||||
}
|
||||
|
||||
.wechat-qr-dialog {
|
||||
max-width: min(400px, 100%);
|
||||
}
|
||||
|
||||
.wechat-qr-dialog__body {
|
||||
padding: var(--spacing-xl) var(--spacing-2xl);
|
||||
}
|
||||
|
||||
.site-footer-contact-qr__wrap {
|
||||
width: fit-content;
|
||||
padding: var(--spacing-sm);
|
||||
border-radius: var(--radius-sm);
|
||||
background-color: rgb(255 255 255);
|
||||
border: 1px solid var(--color-hairline);
|
||||
line-height: 0;
|
||||
}
|
||||
|
||||
.site-footer-contact-qr__img {
|
||||
width: 168px;
|
||||
height: auto;
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@media (width >= 1024px) {
|
||||
.site-footer-columns {
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
.site-footer-contact-qr {
|
||||
max-width: 12.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
.page-hero__back {
|
||||
transition: color 0.15s ease;
|
||||
}
|
||||
@@ -670,6 +769,19 @@
|
||||
line-height: 1.7;
|
||||
}
|
||||
|
||||
.news-list-card--no-cover .news-list-card__body {
|
||||
padding: var(--spacing-lg) var(--spacing-2xl) var(--spacing-2xl);
|
||||
}
|
||||
|
||||
.news-home-preview .news-list-card--no-cover.news-list-card--primary .news-list-card__body,
|
||||
.news-home-preview .news-list-card--no-cover.news-list-card--secondary .news-list-card__body {
|
||||
padding: var(--spacing-xl) var(--spacing-2xl);
|
||||
}
|
||||
|
||||
.news-list-card--no-cover.news-list-card--secondary {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.news-list-card {
|
||||
transition: box-shadow 0.2s ease;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user