【.Net/C#之ChatGPT开发系列】四、ChatGPT多KEY动态轮询,自动删除无效KEY - anech

【.Net/C#之ChatGPT开发系列】四、ChatGPT多KEY动态轮询,自动删除无效KEY - anech

💡 原文中文,约10100字,阅读约需24分钟。
📝

内容提要

本文介绍在.NET项目中实现ChatGPT多KEY动态轮询与自动清理:使用Redis的Set存储密钥,通过自定义DelegatingHandler在请求头随机切换KEY;再用BackgroundService定时调用OpenAI账单接口,检测密钥是否过期或额度耗尽,失效则自动删除。

🔎

延伸解读

多KEY轮询的实现机制

文章通过自定义DelegatingHandler拦截HTTP请求,在发送前从Redis的Set中随机获取一个API KEY并替换请求头中的Authorization,从而实现多KEY的动态轮询。这种方式利用了HttpClient的委托处理程序链,无需修改业务代码即可灵活切换密钥,适合需要高可用性的场景。

自动清理无效KEY的策略

后台服务定期调用OpenAI的账单查询接口,检查每个KEY的过期时间和剩余额度。若KEY已过期或额度耗尽,则自动从Redis中移除。这避免了因KEY失效导致的请求失败,但依赖非官方接口,存在接口变更或不可用的风险。

依赖注入与非依赖注入的对比

文章对比了两种使用Betalgo.OpenAI的方式:非依赖注入需手动创建OpenAIService实例并传入KEY,而依赖注入通过注册HttpClient和自定义Handler,在请求管道中自动切换KEY。后者更符合.NET Core的设计模式,便于维护和扩展。

潜在限制与注意事项

实现中使用了Redis存储KEY,需确保Redis服务的可用性。账单查询接口并非OpenAI官方提供,可能随时失效。此外,后台服务每分钟执行一次,频繁调用账单接口可能触发限流。建议根据实际需求调整轮询频率,并考虑KEY的加密存储。

❓

Q&A

在.NET中如何实现ChatGPT多KEY的动态轮询?

通过自定义DelegatingHandler拦截HTTP请求,在SendAsync方法中调用IChatGPTKeyService的GetRandomAsync方法随机获取一个KEY,然后修改请求头的Authorization字段,实现每次请求使用不同的KEY。

如何存储和管理多个ChatGPT API KEY?

可以使用Redis的Set数据结构存储KEY,因为Set能存储不重复元素且支持随机返回成员。通过StackExchange.Redis库操作,实现KEY的添加、随机获取、获取所有和删除。

怎样自动检测并删除无效的ChatGPT KEY?

创建一个BackgroundService后台任务,定时(如每分钟)遍历所有KEY,调用OpenAI的账单查询API检查KEY的过期时间和剩余额度,如果KEY已过期或额度耗尽,则从存储中删除该KEY。

OpenAI提供了哪些API可以查询KEY的余额和有效期?

OpenAI官方没有直接提供查询API,但可以通过抓包发现两个接口:账单查询API(https://api.openai.com/v1/dashboard/billing/subscription)用于查询过期时间和剩余额度;账单明细API(https://api.openai.com/v1/dashboard/billing/usage)用于查询已使用额度,需在Header中携带API KEY。

如何用依赖注入方式实现ChatGPT多KEY切换?

注册自定义的DelegatingHandler(ChatGPTHttpMessageHandler)到HttpClient管道中,通过依赖注入获取IChatGPTKeyService,在SendAsync中动态修改请求头的Authorization字段,从而在依赖注入模式下实现多KEY轮询。

BackgroundService在自动删除无效KEY中起什么作用?

BackgroundService是.NET Core中用于执行后台任务的基类,通过重写ExecuteAsync方法,结合while循环和Task.Delay实现定时任务,定期检查所有KEY的有效性并删除无效KEY。

🏷️

标签

➡️

继续阅读