Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

NoTrack → OpenAI 兼容代理

notrack.ai 的内部 /api/dispatch 端点封装为 OpenAI 标准 API,让任何兼容 OpenAI 的客户端(NextChat、LobeChat、OpenWebUI、openai-python、LangChain、curl 等)都能直接使用 NoTrack,无需任何修改。

✨ 特性

  • 🔄 完全兼容 OpenAI API/v1/chat/completions/v1/models/v1/responses
  • 📡 流式 + 非流式 — 支持 stream: true 的 SSE 流式响应
  • 🧠 对话记忆 — 通过 chat_id 实现 NoTrack 服务端记忆,绕过 4000 字符限制
  • 🍪 自动获取 Cookie — 无需手动抓包,启动时自动获取匿名 uid
  • ✂️ 智能截断 — 长对话自动截断,优先保留系统提示 + 最新消息 + 最近历史
  • 🛠️ 工具调用 — 支持 OpenAI function calling(6 种格式解析)
  • 📊 监控仪表盘 — 实时 KPI、请求日志、Prometheus 指标(Deno 版)
  • 🔑 客户端管理 — 逐客户端 API Key + 速率限制(Deno 版)
  • 📝 会话持久化 — 服务端存储对话历史(Deno 版)
  • 🐳 Docker 部署 — 两版均支持 Docker

📦 两个版本

特性 Deno 版 Python 版
运行时 Deno 2.x Python 3.10+
依赖 零依赖(纯标准库) aiohttp
监控仪表盘 ✅ 12 个标签页
客户端管理 ✅ CRUD + 限流
会话持久化
工具调用 ✅ 6 种格式
JSON 修复
Cookie 自动获取
智能截断
Docker
适合场景 生产部署 轻量使用 / 二次开发

推荐:功能完整性选 Deno 版,简洁轻量选 Python 版。


🚀 快速开始

Deno 版

cd deno

# 1. 安装 Deno
curl -fsSL https://deno.land/install.sh | sh

# 2. 配置(可选 — 不配也能用,会自动获取 cookie)
cp .env.example .env
# 编辑 .env 填写 NOTRACK_COOKIES(可选)

# 3. 启动
deno task start

# 4. 测试
curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"notrack-c","messages":[{"role":"user","content":"你好"}]}'

Python 版

cd python

# 1. 安装依赖
pip install aiohttp

# 2. 配置(可选)
cp .env.example .env

# 3. 启动
python3 main.py

# 4. 测试
python3 test.py

Docker 部署

# Deno 版
cd deno
docker build -t notrack-proxy .
docker run -d -p 8080:8080 --env-file .env notrack-proxy

# Python 版
cd python
docker build -t notrack-proxy-py .
docker run -d -p 8080:8080 --env-file .env notrack-proxy-py

📖 使用方法

基础对话

curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "notrack-c",
    "messages": [{"role": "user", "content": "用一句话介绍你自己"}]
  }'

流式响应

curl -N http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "notrack-c",
    "stream": true,
    "messages": [{"role": "user", "content": "从1数到10"}]
  }'

对话记忆(chat_id)

NoTrack 支持服务端记忆。第一次请求返回 chat_id,之后带上即可:

# 第 1 轮
curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"notrack-c","messages":[{"role":"user","content":"我叫张三"}]}'

# 响应: {"choices":[...], "notrack": {"chat_id": "abc-123"}}

# 第 2 轮 — 只发最新消息 + chat_id
curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "notrack-c",
    "messages": [{"role": "user", "content": "我叫什么?"}],
    "notrack_chat_id": "abc-123"
  }'

# 响应: "你叫张三"(NoTrack 服务端记住了上下文)

openai-python 客户端

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8080/v1",
    api_key="any-string",  # 未设 API_KEY 则任意
)

resp = client.chat.completions.create(
    model="notrack-c",
    messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)

多轮对话(客户端管理历史)

messages = [
    {"role": "system", "content": "你是一个温柔的助手"},
    {"role": "user", "content": "你好"},
    {"role": "assistant", "content": "你好呀!"},
    {"role": "user", "content": "我刚才说了什么?"},
]

resp = client.chat.completions.create(
    model="notrack-c",
    messages=messages,
)
# 代理自动拼接历史 + 智能截断(超过 3800 字符时丢弃最旧消息)

⚙️ 环境变量

变量 默认值 说明
NOTRACK_COOKIES Cookie 头。留空则自动获取
AUTO_FETCH_COOKIES 1 自动获取匿名 cookie(仅 Deno 版)
PORT 8080 监听端口
API_KEY Bearer Token 鉴权。留空则开放
UPSTREAM_BASE https://notrack.ai 上游地址
DEFAULT_MODEL notrack-c 默认模型
MAX_INPUT_CHARS 3800 user_input 最大字符数(NoTrack 上限 4000)
UPSTREAM_TIMEOUT_MS 60000 上游请求超时(毫秒)
MAX_TURNS 6 NoTrack dispatch max_turns
PERSONA normal NoTrack dispatch persona
MODE usual NoTrack dispatch mode
DEBUG 0 调试日志

📡 API 端点

基础端点(两版均有)

方法 路径 说明
GET /health 服务健康 + 上游可达性
GET /v1/models OpenAI 标准模型列表
GET /v1/models/:id 单个模型详情
POST /v1/chat/completions 聊天补全(流式 + 非流式)

Deno 版额外端点

方法 路径 说明
GET / 实时监控仪表盘(HTML)
POST /v1/responses OpenAI Responses API
POST /v1/embeddings 伪嵌入(SHA-256)
POST /v1/images/generations SVG 占位图
POST /v1/moderations 内容审核
GET /stats JSON 指标
GET /metrics Prometheus 指标
GET /admin/logs 请求日志
GET /admin/config 运行时配置
PATCH /admin/config 热重载 Cookie
GET/POST/DELETE /admin/clients 客户端 CRUD
GET/POST/DELETE /admin/presets 服务端预设
GET/POST/DELETE /v1/chat/sessions 会话管理
GET /admin/export 导出备份
POST /admin/import 导入备份

🧠 对话记忆机制

问题

NoTrack 的 user_input 限制 4000 字符。长对话拼接后超限会报 400 错误。

解决方案一:智能截断(自动)

代理自动截断对话历史,按优先级保留:

  1. 系统消息 — 角色设定始终保留
  2. 最新用户消息 — 当前问题完整保留
  3. 最近的对话 — 从新到旧依次保留
  4. 最旧的消息 — 优先丢弃

解决方案二:chat_id 服务端记忆(推荐)

notrack_chat_id 让 NoTrack 服务端记住对话,每次只发最新消息,完全绕过 4000 限制

# 第 1 轮 → 拿到 chat_id
# 第 2 轮+ → 只发最新消息 + notrack_chat_id

需要 Cookie 才能生效。Deno 版默认自动获取,Python 版需手动配置。


🍪 Cookie 说明

自动获取(Deno 版,默认开启)

NoTrack 是免登录的匿名服务。代理启动时自动访问 notrack.ai 获取匿名 uid cookie:

启动 → GET notrack.ai → 服务器返回 Set-Cookie: uid=xxx → 自动使用
  • 无需手动抓包
  • Cookie 过期时自动重新获取
  • AUTO_FETCH_COOKIES=0 可禁用

手动获取

  1. 浏览器打开 notrack.ai
  2. F12 → Network → 点击任意 /api/ 请求
  3. 复制请求头中的 cookie:
  4. 填入 .env 文件:NOTRACK_COOKIES="si_usr_id=xxx; uid=xxx"

📁 项目结构

github-code/
├── README.md               ← 本文件
├── LICENSE                 ← MIT
├── .gitignore
│
├── deno/                   ← Deno 版(功能完整)
│   ├── main.ts             ← 主程序入口
│   ├── auth.ts             ← 客户端鉴权 + 限流
│   ├── compat.ts           ← OpenAI 兼容接口
│   ├── dashboard.ts        ← 监控仪表盘
│   ├── jsonrepair.ts       ← JSON 修复
│   ├── logging.ts          ← 请求日志
│   ├── metrics.ts          ← Prometheus 指标
│   ├── sessions.ts         ← 会话持久化
│   ├── tokenizer.ts        ← Token 估算
│   ├── tools.ts            ← 工具调用
│   ├── cookie-refresh.ts   ← Cookie 刷新助手
│   ├── deno.json           ← Deno 配置
│   ├── Dockerfile
│   ├── docker-compose.yml
│   ├── prometheus.yml
│   ├── .env.example
│   └── scripts/
│       ├── smoke.ts        ← 冒烟测试
│       └── curl-test.sh    ← 手动测试
│
└── python/                 ← Python 版(轻量)
    ├── main.py             ← 主程序(单文件)
    ├── test.py             ← 测试脚本
    ├── requirements.txt
    ├── Dockerfile
    └── .env.example

🔧 OpenAI 兼容性

支持的请求参数

参数 支持 说明
model notrack-c / C / notrack
messages system / user / assistant / tool
stream SSE 流式
temperature 提示注入
max_tokens 提示注入
top_p 提示注入
tools 函数调用(仅 Deno 版)
tool_choice auto / required / 指定函数
response_format json_object / json_schema(仅 Deno 版)
stop 停止序列
n 多项选择(并行,上限 4)
seed 确定性提示
frequency_penalty 提示注入
presence_penalty 提示注入
stream_options include_usage
timeout 每请求超时(秒)
user 审计日志
notrack_chat_id NoTrack 会话 ID
notrack_session_id 代理会话 ID(仅 Deno 版)

Dispatch → OpenAI 事件映射

NoTrack 事件 OpenAI 输出
chat_meta 捕获 chat_id
delta chat.completion.chunk delta.content
message 非流式完整内容
done finish_reason: stop + [DONE]

📊 Deno 版监控仪表盘

启动后访问 http://localhost:8080/ 查看:

  • 概览 — KPI 卡片 + sparkline 折线图 + 延迟直方图 + 模型分布甜甜圈图
  • 上游 — notrack.ai 可达性 + 延迟分位数
  • 请求日志 — 实时请求记录
  • 客户端 — API Key 管理 + 速率限制
  • 会话 — 对话历史 + Markdown 渲染
  • Playground — 交互式 API 测试器 + 11 个预设模板
  • 配置 — 运行时配置 + Cookie 热重载 + 备份导入导出
  • Prometheus — 原始指标文本

❓ 常见问题

Q: 不配置 Cookie 能用吗?

能。 聊天功能不依赖 Cookie。但 chat_id 记忆需要 Cookie。

  • Deno 版:默认自动获取,无需配置
  • Python 版:需手动配置 NOTRACK_COOKIES

Q: 长对话报 400 错误怎么办?

代理已内置智能截断(默认 3800 字符),不会报错。如需完全保留记忆,使用 notrack_chat_id

Q: 如何在 NextChat / LobeChat 中使用?

将 API Base URL 设置为 http://your-server:8080/v1,API Key 任意填写(未设 API_KEY 时)。

Q: Cookie 会过期吗?

NoTrack 的 uid 有效期 1 年。Deno 版在遇到 401 时会自动重新获取。


📄 License

MIT

About

仅供学习交流使用

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages