Metadata-Version: 2.4
Name: sitellm
Version: 0.5.6
Summary: SiteLLM= LiteLLM + Chinese + Security
License: MIT
License-File: LICENSE
License-File: LICENSE_BerriAI
Author: maple5218
Requires-Python: >=3.9,<4.0
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Provides-Extra: all
Provides-Extra: analytics
Provides-Extra: azure
Provides-Extra: cache
Provides-Extra: devtools
Provides-Extra: experimental
Provides-Extra: gcp
Requires-Dist: PyJWT (==2.12.1) ; python_version >= "3.9"
Requires-Dist: a2a-sdk (==0.3.25) ; (python_version >= "3.10") and (extra == "experimental" or extra == "all")
Requires-Dist: aiohttp (==3.13.5)
Requires-Dist: apscheduler (==3.11.2)
Requires-Dist: azure-identity (==1.25.3) ; (python_version >= "3.9") and (extra == "azure" or extra == "all")
Requires-Dist: azure-keyvault-secrets (==4.10.0) ; extra == "azure" or extra == "all"
Requires-Dist: azure-storage-blob (==12.28.0) ; extra == "azure" or extra == "all"
Requires-Dist: backoff (==2.2.1)
Requires-Dist: boto3 (==1.42.80)
Requires-Dist: click (==8.1.8)
Requires-Dist: cryptography (==43.0.3)
Requires-Dist: diskcache (==5.6.3) ; extra == "cache" or extra == "all"
Requires-Dist: fastapi (==0.124.4)
Requires-Dist: fastapi-sso (==0.16.0)
Requires-Dist: fastuuid (==0.14.0)
Requires-Dist: google-cloud-aiplatform (==1.133.0) ; extra == "gcp" or extra == "all"
Requires-Dist: google-cloud-iam (==2.19.1) ; extra == "gcp" or extra == "all"
Requires-Dist: google-cloud-kms (==2.24.2) ; extra == "gcp" or extra == "all"
Requires-Dist: grpcio (==1.80.0) ; extra == "devtools" or extra == "all"
Requires-Dist: gunicorn (==23.0.0)
Requires-Dist: httpx (==0.28.1)
Requires-Dist: importlib-metadata (==8.5.0)
Requires-Dist: jinja2 (==3.1.6)
Requires-Dist: jsonschema (==4.23.0)
Requires-Dist: mcp (==1.26.0) ; (python_version >= "3.10") and (extra == "experimental" or extra == "all")
Requires-Dist: mlflow (==3.9.0) ; (python_version >= "3.10") and (extra == "analytics" or extra == "all")
Requires-Dist: numpydoc (==1.8.0) ; extra == "devtools" or extra == "all"
Requires-Dist: openai (==2.30.0)
Requires-Dist: orjson (==3.10.15)
Requires-Dist: polars (==1.39.3) ; (python_version >= "3.10") and (extra == "analytics" or extra == "all")
Requires-Dist: prisma (==0.15.0)
Requires-Dist: pydantic (==2.12.5)
Requires-Dist: pynacl (==1.6.2)
Requires-Dist: pyroscope-io (==0.8.16) ; (sys_platform != "win32") and (extra == "devtools" or extra == "all")
Requires-Dist: python-dotenv (==1.0.1)
Requires-Dist: python-multipart (==0.0.20)
Requires-Dist: pyyaml (==6.0.3)
Requires-Dist: redisvl (==0.4.1) ; (python_version >= "3.9" and python_version < "3.14") and (extra == "cache" or extra == "all")
Requires-Dist: resend (==2.23.0) ; extra == "devtools" or extra == "all"
Requires-Dist: rich (==13.9.4)
Requires-Dist: sitellm-proxy-extras (==0.0.5)
Requires-Dist: soundfile (==0.12.1)
Requires-Dist: tiktoken (==0.12.0)
Requires-Dist: tokenizers (==0.22.2)
Requires-Dist: uvicorn (==0.33.0)
Requires-Dist: uvloop (==0.22.1)
Requires-Dist: websockets (==15.0.1)
Project-URL: Documentation, https://sitellm.yunzhisec.com
Project-URL: Homepage, https://sitellm.yunzhisec.com
Project-URL: Repository, https://gitee.com/zhds/sitellm
Description-Content-Type: text/markdown

<h1 align="center">
    <img  width="400" src="https://gitee.com/zhds/sitellm/raw/master/logo.jpg">
</h1>
    <p align="center">
        <p align="center">SiteLLM = LiteLLM + 中文生态 + 安全
        </p>
        <p align="center">SiteLLM 开源Token运营中枢，集安全基座（Security）、智能运营（Intelligence）、全链路追溯（Trace）与生态协同（Ecosystem）四大能力；上承大模型，下启智能体，让你每一个Token都能发光发热。</p>
    </p>

# 架构图
<img width="1500"  alt="架构图" src="https://gitee.com/zhds/sitellm/raw/master/docs/arch.png" />

# UI
<img width="1500"  alt="Web UI" src="https://gitee.com/zhds/sitellm/raw/master/docs/main.png" />

# LiteLLM
- LiteLLM 是一个开源的 AI 网关（AI Gateway）。它提供了一个统一且标准化的接口，让你能够轻松调用超过 100 种大语言模型（LLM）提供商的服务——包括 OpenAI、Anthropic、Gemini、Bedrock、Azure 等等——并且全程都可以直接沿用大家最熟悉的 OpenAI 接口格式。
- 简单来说，它就是一个强大的 OpenAI 代理服务器（也就是 LLM 网关）。除了能帮你统一对接各种模型外，它还能帮你追踪各项 API 的开销（track spend），甚至可以为每一个虚拟密钥（virtual key）或用户单独设置预算限额，非常适合需要集中管理 AI 资源的企业或开发者。

# ChangeList
   v0.5.0    安全加固 + 功能修复，修补5个P0安全漏洞（Jinja2沙盒、路径穿越、JWT泄露等）和6个功能问题

   v0.5.1    架构升级，新增模型定价同步脚本、护栏幂等、路由组、加权故障转移和v3速率限制器

   v0.5.2    云智护栏增强，修复4个云智护栏相关问题（422报错、参数缺失、解析错误、Response API不兼容）

   v0.5.3    解决Response API护栏信息未入库的问题（metadata参数被吞）以及前端UI解析格式问题
   
   v0.5.4    YunZhi-UEBA 回调接收所有日志，包括成功的和失败的(其实是所有回调都这样处理)
   
   v0.5.6    修复时间统计的区间问题，以及发送UEBA日志对象循环引用的问题
 
# 中文生态

### 中文界面：更亲切直观
SiteLLM 提供完整的中文界面支持,降低使用门槛，尤其适合企业内部推广和快速上手。

### SiteLLM 原生支持国内主流大模型，开箱即用：

- 阿里通义千问（Qwen 系列）
- 百度文心一言（ERNIE Bot）
- 智谱清言（GLM 系列）
- 月之暗面 Kimi（Moonshot）
- 科大讯飞星火（Spark）
- Llama.cpp (本地)
以及更多通过 OpenAI 兼容接口接入的国内模型
无需翻墙、无需代理，直接在国内网络环境下调用，延迟低、稳定性好。


### 中文安全护栏：适配国内场景
原有内置护栏基于英文环境设计，在国内对话场景中实用性有限。升级后，内置护栏全面支持中文内容检测，包括：

- 中文敏感词过滤
- 中文 Prompt 注入检测
- 中文合规内容识别

### 组织管理：一键接入国内协作平台
后续规划与主流国内协作平台深度集成：

- 飞书：一键同步组织架构、用户身份
- 钉钉：SSO 单点登录、部门权限映射
- 企业微信：通讯录同步、审批流程对接

# 安全

## 专业红队+AI代码审计
版本发布经过AI和红队的双重审计才发布，尽可能减少安全风险

## 安全护栏：
SiteLLM 的安全护栏体系继承LiteLLM,支持三种类型的护栏，覆盖从本地规则到外部 API 的完整能力，满足企业级 AI 应用的安全合规需求。

### 1. 内容过滤护栏（规则型）

- **实现方式**：基于内置规则引擎进行本地内容过滤
- **特点**：
  - 无需外部依赖，本地即可运行
  - 低延迟，实时拦截
  - 支持关键词、正则表达式、敏感词库等规则配置
  - **全面支持中文检测**：内置中文敏感词库、中文 Prompt 注入检测规则，适配国内对话场景
- **适用场景**：输入/输出内容的实时过滤，如敏感词、违规内容、Prompt 注入检测

### 2. 第三方合作伙伴护栏（API 型）

- **实现方式**：调用第三方合作伙伴提供的安全检测 API 接口
- **特点**：
  - 借助成熟的安全服务提供商能力
  - 无需自行维护规则库和模型
  - 可按需选择不同供应商（如内容安全、合规检测等）
  - **深度集成国内安全服务商**：支持**云智信安**等国内护栏 API，提供中文内容安全检测、合规判断等专业能力
- **适用场景**：需要专业级内容审核、合规判断的场景

### 3. 自研 API 护栏（API 型）

- **实现方式**：通过调用自主开发的 API 接口进行安全检测
- **特点**：
  - 完全自主可控，可根据业务深度定制
  - 支持私有模型、自定义规则、内部知识库
  - 与内部系统无缝集成
- **适用场景**：有定制化安全需求、数据不出域要求的企业场景

## 关于策略：灵活绑定，层层防护
使用策略来分组护栏并控制哪些策略适用于特定团队、密钥或模型。
### 为什么使用策略？
为团队、密钥或模型启用/禁用特定护栏，将护栏组合到单个策略中，继承现有策略并覆盖所需内容 
### 关于策略应用
策略应用控制您的策略在何处应用。策略在应用到特定团队、密钥、模型、标签或全局之前不会产生任何作用。

### 应用范围：

- 全局 (*) - 应用于所有请求
- 团队 - 仅适用于特定团队
- 密钥 - 仅适用于特定API密钥（支持通配符如dev-*）
- 模型 - 仅在使用特定模型时适用
- 标签 - 匹配来自密钥/团队 metadata.tags 或在请求体中动态传递的标签（metadata.tags）。使用此功能可在跨组强制执行策略，例如"标记为healthcare的所有密钥获得HIPAA护栏。"支持通配符（prod-*）。

# 安装部署
## 一、安装 SiteLLM

### 环境要求

- **Python >= 3.9**（推荐使用 3.10+）
- **操作系统**：Linux（本文以 Ubuntu 为例）

### 安装命令

```bash
pip install sitellm
```

就这么简单。SiteLLM 的 Python 包管理非常规范，依赖会自动安装。

**验证安装**：

```bash
sitellm --version
```

如果能正常输出版本号，说明安装成功。

---

## 二、安装 PostgreSQL 数据库

SiteLLM 支持多种数据库，但**生产环境推荐使用 PostgreSQL**，因为它在事务处理、并发性能和数据一致性方面表现优秀。

### 1. 安装 PostgreSQL

在 Ubuntu 22.04 上，默认提供的是 PostgreSQL 16 版本：

```bash
sudo apt install -y postgresql
```

安装完成后，服务会自动启动。你可以用以下命令检查状态：

```bash
sudo systemctl status postgresql
```

### 2. 创建数据库和用户

切换到 postgres 用户，进入数据库命令行：

```bash
sudo -u postgres psql
```

然后执行以下 SQL 语句：

```sql
-- 创建数据库（指定 UTF8 编码，确保中文支持）
CREATE DATABASE litellm WITH ENCODING = 'UTF8';

-- 创建用户并设置密码，换成自己的密码
CREATE USER sitellm WITH PASSWORD 'sitellm_ai2000';

-- 授予连接权限
GRANT CONNECT ON DATABASE litellm TO sitellm;

-- 切换到 litellm 数据库
\c litellm

-- 授予 public schema 的使用权
GRANT USAGE ON SCHEMA public TO sitellm;

-- 允许用户在 public schema 下创建对象
GRANT CREATE ON SCHEMA public TO sitellm;

-- 授予所有表的增删改查权限
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO sitellm;
```

完成后输入 `\q` 退出。

**注意事项**：

- 密码 `sitellm_ai2000` 是示例，**生产环境请使用强密码**
- `GRANT ON ALL TABLES` 只对当前已存在的表生效，后续新建的表需要重新授权或设置默认权限

---

## 三、Prisma 代码生成（关键步骤）

这一步很容易被忽略，但**非常关键**。SiteLLM 使用 Prisma 作为 ORM 框架，需要在启动前生成数据库访问代码。

### 执行命令

```bash
# 方式一：指定 schema 文件路径
prisma generate --schema /usr/local/lib/python3.10/site-packages/sitellm/proxy/schema.prisma

# 方式二：动态获取 Python 包路径（推荐）
prisma generate --schema $(python3 -m site --user-site)/sitellm/proxy/schema.prisma
```

**路径说明**：

- 如果你使用 `pip install` 全局安装，路径通常在 `/usr/local/lib/python3.x/site-packages/sitellm/proxy/schema.prisma`
- 如果你使用 `pip install --user` 安装，路径在用户目录下

可以用以下命令确认实际路径：

```bash
python3 -c "import sitellm; print(sitellm.__path__)"
```

---

## 四、配置文件（config.yaml）

SiteLLM 通过 YAML 配置文件管理所有设置。创建一个 `config.yaml` 文件：

```yaml
general_settings:
  master_key: "your_admin_password_here"
  database_url: "postgresql://sitellm:sitellm_ai2000@127.0.0.1:5432/litellm"
  store_model_in_db: true
  store_prompts_in_spend_logs: true

litellm_settings:
  drop_params: true
```

### 配置项说明

| 配置项 | 说明 |
|--------|------|
| `master_key` | Web 登录时 admin 的密码，同时也是主密钥用于加密数据库中的敏感信息 |
| `database_url` | PostgreSQL 连接字符串，格式：`postgresql://用户:密码@主机:端口/数据库` |
| `store_model_in_db` | 是否在数据库中存储模型信息，建议开启 |
| `store_prompts_in_spend_logs` | 是否在消费日志中存储 Prompt 内容，便于审计和调试 |
| `drop_params` | 是否丢弃未识别的参数，避免上游模型报错 |

### ⚠️ 重要提醒

**`master_key` 一旦设置，启动后不可修改。**

这个密码不仅用于 Web 登录，还将作为**主密钥**来加密数据库中的其他敏感信息（如 API 密钥、凭证等）。如果后续修改了这个密码，之前加密的数据将无法解密。

因此：

1. 使用强密码（建议 16 位以上，包含大小写字母、数字、特殊字符）
2. 妥善保存，不要丢失
3. 不要在代码仓库中明文存储

---

## 五、启动 SiteLLM

### 环境变量配置

```bash
# 设置日志在数据库中存储的最大长度（默认可能较短，建议调大）
export MAX_STRING_LENGTH_PROMPT_IN_DB=32000
```

### 启动命令

```bash
# 默认端口 4000
sitellm -c config.yaml

# 自定义端口
sitellm -c config.yaml --port 8080
```

### 验证启动

启动成功后，访问 `http://localhost:4000`（或你设置的端口），使用 admin 账号和 `master_key` 中的密码登录。

---

# 服务与支持
1. 可以通过gitee来给我们提建议和issue, 也欢迎fork仓库提交代码。 https://gitee.com/zhds/sitellm
2. 邮箱联系：maple5218@163.com
3. 微信群：
<img width="200"  alt="微信群" src="https://gitee.com/zhds/sitellm/raw/master/docs/webwxgetmsgimg.jpeg" />


