在探索大模型的奇妙世界时,我们经常需要巧妙处理和分发一堆 API key,有了API Key 才能打开魔幻的大门。
这个任务本身就像是在进行一场精细的平衡术,还得密切注意不让任何关键信息泄露。
毕竟,key 的泄露和不恰当的使用可是大忌。
但是,无需担心,救星来了!
开发者 songquanpeng 带来了他的最新作品:OneAPI。
这个开源项目是一个既强大又灵活的 OpenAI 接口管理和分发系统,专门为各种大模型设计,让 key 的管理和分发变得简单而高效。
OneAPI 的美妙之处在于它的便捷性——提供了一键部署的 Docker 镜像,只需轻轻一点,你就可以开启你的模型管理之旅。
重要的是可以突破限制,再也不用配置繁琐的网络了。
还有最最重要的一点,一些第三方平台提供了免费额度,一个人玩足够了!
项目地址:https://github.com/songquanpeng/one-api
使用 root 用户初次登录系统后,务必修改默认密码
123456
image-20231127125747414
image-20231127125856244
image-20231127130013978
image-20231127130123433
image-20231127130212661
image-20231127130246362
后面所有的API操作都需要这个令牌,一定要复制下来,并且妥善保管,拿到这个令牌就有系统所有的访问权限了。
image-20231129202226917
推荐使用 Sealos 进行一键部署,注册默认赠送5元额度,可以使用2-3天。
直达:https://cloud.sealos.io/?openapp=system-fastdeploy?templateName=one-api
image-20231127130359101
服务部署完成以后,点击首页的应用管理
image-20231127130646475
image-20231127130707437
进入应用详情页面,有个外网地址,点击访问,第一次登录使用 root 123456 ,切记修改密码。
image-20231127130750104
然后进行渠道配置就可以了。
由于openai官方策略导致,普通的账号只能一分钟调用3次,如果要多次调用怎么办?多添加几个账号就可以了。
我一次性添加了100个key进去,当有的key过期以后管理比较麻烦,幸运的是oneapi提供了调用鉴权,解决了cookie过期的问题。
渠道的管理相对比较简单,主要包含下面几个功能:
快捷键:F12
或者鼠标右键 检查
打开浏览器调试功能,点击 Network
面板,可以找到关键的请求,然后copy curl,然后让GPT生成具体的代码。
image-20231129202623425
curl '{YOUR_HOST}/api/channel/?p=1' \
-H 'Authorization: YOU KEY'
上面的内容我进行了简化,并且把鉴权信息替换成了令牌访问
你是一个高级Python工程师,擅长爬虫代码编写,请帮我把下面的curl命令转成使用requst调用,注意代码的复用性,需要包含get、post、delet、put公共方法,域名和鉴权信息当做类初始化参数 curl '{YOUR_HOST}/api/channel/?p=1'
-H 'Authorization: YOU KEY' curl调用的方法定义为page,main方法循环获取所有页码数据,页码从0开始
image-20231130202522758
将上面的host和key替换成自己的,测试执行一次性通过
image-20231129205037480
image-20231130202619271
image-20231130202645985
import requests
class APIClient:
def __init__(self, base_url, auth_key):
self.base_url = base_url
self.headers = {'Authorization': auth_key}
def get(self, endpoint, **kwargs):
return requests.get(self.base_url + endpoint, headers=self.headers, **kwargs)
def post(self, endpoint, data=None, json=None, **kwargs):
return requests.post(self.base_url + endpoint, headers=self.headers, data=data, json=json, **kwargs)
def delete(self, endpoint, **kwargs):
return requests.delete(self.base_url + endpoint, headers=self.headers, **kwargs)
def put(self, endpoint, data=None, **kwargs):
return requests.put(self.base_url + endpoint, headers=self.headers, data=data, **kwargs)
def page(self, p):
return self.get(f'/api/channel/?p={p}')
def delete_channel(self, id_):
response = self.delete(f'/api/channel/{id_}')
if response.status_code == 200:
print(f"Channel with ID {id_} successfully deleted.")
else:
print(f"Failed to delete channel with ID {id_}. Status code: {response.status_code}")
def test(self, id_):
response = self.get(f'/api/channel/test/{id_}')
if response.status_code == 200:
result = response.json()
if not result.get('success'):
error_message = result.get('message', '')
print(f"Test for ID {id_} failed: {error_message}")
# Check for specific error messages and delete if necessary
if any(keyword in error_message for keyword in [
"account_deactivated",
"insufficient_quota",
"invalid_api_key",
"no_organization",
"model_not_found"
]):
self.delete_channel(id_)
return result
else:
print(f"Test request for ID {id_} failed with status code: {response.status_code}")
return None
def process_data(self, data):
for item in data:
id_ = item.get('id')
if id_:
result = self.test(id_)
if result and result.get('success'):
print(f"Processed test for ID: {id_} with time: {result.get('time')}")
# Failure handling and channel deletion performed inside self.test method
def main(api_client):
page_number = 0
while True:
response = api_client.page(page_number)
if response.status_code != 200:
print(f"Failed to retrieve page {page_number}: {response.status_code}")
break
page_data = response.json()
if not page_data.get('success', False) or not page_data.get('data'):
break
api_client.process_data(page_data['data'])
# Go to the next page
page_number += 1
print(f"Moving to page {page_number}...")
if __name__ == "__main__":
YOUR_HOST = "http://example.com"
YOUR_KEY = "Bearer YOUR_API_KEY"
api_client = APIClient(YOUR_HOST, YOUR_KEY)
main(api_client)
不到100行的代码通过GPT不到半小时搞定,发布到服务器写个定时任务跑起来就是了。
image-20231130204242386