This commit is contained in:
Zheng Kai
2023-06-13 18:15:34 +08:00
parent 86ad8ec9b4
commit 8457bf7efa
10 changed files with 72 additions and 72 deletions

View File

@@ -1,8 +1,75 @@
Orca
======
openai api proxy
Proxy for [OpenAI API](https://platform.openai.com/docs/api-reference), written by golang
缓存已经做完
解决两个问题:
计费还在做
1. 缓存重复请求,节省费用
2. 内部使用不需要 token走流量监控
访问记录会记在 prometheus 和 elastic可选
注意目前只能代理 `chat``completions` 两个接口,其他像 fine-tune 什么的还要走长连接,太麻烦了还没搞
## 为什么要写这个
OpenAI 目前的后台非常惨,一个 org 下好几个帐号,都没法看清每个帐号每天花了多少钱,有一天费用暴增,我都不知道是不是我还是同事消耗的,还是 token 泄漏了,我需要一个更详细、实时的监控。而且我那个程序本来是有缓存的,但是 dev 和 prod 没法共享缓存,所以在想如果走一个统一的代理还能节省每个程序单独写缓存。基于这两点,写了这个代理,目前在公司内部小量使用。
## 部署
`server/build` 目录,将 `sample-env.sh` 复制为 `env.sh` 并修改,
```
export OPENAI_API_KEY="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"
export ORCA_WEB=":22035"
export ORCA_ES_ADDR="https://10.0.84.49:9200/"
export ORCA_ES_USER=""
export ORCA_ES_PASS=""
```
`ORCA_WEB` 是代理对外监听地址,不写 IP 表示监听所有
如果不使用 elastic 可以把 `ORCA_ES_USER``ORCA_ES_PASS` 留空
改完后直接敲 `make` 可运行
注意所有请求会缓存在 `static/cache` 目录
## 使用
声明变量 `OPENAI_API_KEY``OPENAI_API_BASE`,大部分 OpenAI 脚本应该都会认这两个变量
由于 `OPENAI_API_KEY` 不再是真正的 key而是上一节 `env.sh` 里的),建议写个自己好懂的,比如 `zhengkai.common`,这样能在统计时做区分
```
export OPENAI_API_KEY="zhengkai.common"
export OPENAI_API_BASE=http://10.0.84.49:22035/v1
```
prometheus endpoint 在服务启动后 `/_metrics` 路径
流量 log 打在 prometheus 和 elastic 后可以自己分析了,这是简单的效果截图
![Grafana](misc/img/grafana.png)
![Kibana](misc/img/kibana.png)
## Docker
`misc/docker` 下有个简单脚本用来构建镜像
先按 **部署** 一节修改 `env.sh`,如果使用 elastic tls 需要将 `http-ca.crt` 替换成你的
`make run` 是尝试本地运行 docker 镜像
`make install` 是拷到目标主机上将镜像作为服务后台运行
具体操作需要看一下 `Makefile` 文件,主要是目录、端口等习惯问题
我运行的方式比较笨拙,只是公司内网跑没考虑太多安全性(比方说 scp env.sh 这个操作),如果有更优雅的方式欢迎指点我,提前感谢
## TODO
* 完善 docker image
* 内置 web 端查询流量/查看每个请求

1
misc/db/.gitignore vendored
View File

@@ -1 +0,0 @@
*.sql

View File

@@ -1,20 +0,0 @@
#!/bin/bash
DB="orca"
DIR="$(dirname "$(readlink -f "$0")")" && cd "$DIR" || exit 1
mkdir -p table
for T in $(echo "SHOW TABLES" | mysql "$DB" --skip-column-names); do
/usr/bin/mysqldump \
--default-character-set=binary \
--add-drop-database \
--add-drop-table \
--add-locks \
--hex-blob \
--quick \
--skip-dump-date \
"${DB}" "${T}" > "table/${T}.sql"
done

View File

@@ -1,16 +0,0 @@
#!/bin/bash
DB="orca"
DIR="$(dirname "$(readlink -f "$0")")" && cd "$DIR" || exit 1
/usr/bin/mysqldump \
--default-character-set=binary \
--add-drop-database \
--add-drop-table \
--add-locks \
--hex-blob \
--quick \
--skip-dump-date \
--databases "$DB" \
> "${DB}-full.sql"

View File

@@ -1,18 +0,0 @@
#!/bin/bash
DB="orca"
DIR="$(dirname "$(readlink -f "$0")")" && cd "$DIR" || exit 1
/usr/bin/mysqldump \
--no-data \
--default-character-set=binary \
--add-drop-database \
--add-drop-table \
--add-locks \
--hex-blob \
--quick \
--skip-dump-date \
--databases "$DB" \
| sed 's# AUTO_INCREMENT=[0-9]*##g' \
> "${DB}-struct.sql"

View File

@@ -1,6 +0,0 @@
CREATE USER 'orca'@'172.17.0.0/24' IDENTIFIED WITH caching_sha2_password BY 'orca';
GRANT USAGE ON *.* TO 'orca'@'172.17.0.0/24';
ALTER USER 'orca'@'172.17.0.0/24' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, LOCK TABLES ON `orca`.* TO 'orca'@'172.17.0.0/24';
ALTER USER 'orca'@'172.17.0.0/24' ;

View File

@@ -1,6 +0,0 @@
CREATE USER 'orca'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'orca';
GRANT USAGE ON *.* TO 'orca'@'localhost';
ALTER USER 'orca'@'localhost' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, LOCK TABLES ON `orca`.* TO 'orca'@'localhost';
ALTER USER 'orca'@'localhost' ;

BIN
misc/img/grafana.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
misc/img/kibana.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

View File

@@ -5,5 +5,5 @@
export OPENAI_API_KEY="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"
export ORCA_WEB=":22035"
export ORCA_ES_ADDR="https://10.0.84.49:9200/"
export ORCA_ES_USER="elastic"
export ORCA_ES_PASS="a0iKg{Q,}!7T95Z"
export ORCA_ES_USER=""
export ORCA_ES_PASS=""