Hello,大家好。今天给大家带来一个Java版本的chatgpt SDK。
项目地址: swordintent/chatgpt-web-api
2022.12.12:目前OpenAI升级接入了cloudflare的前置端,楼主正在加紧适配中。
2023.2.4:采用openAI的官方api实现,可用
2023.2.2:免费模型已经不可用,需要使用付费模型,新账号包含$18额度,a)pip3 install revChatGPT==1.2.2 b)export GPT_ENGINE="text-davinci-003",后边将切换至java版本的api
2023.3.2 升级至官方api.
最近chatgpt在技术圈大火,甚至有些出圈的趋势。
虽然第一时间就进行了体验,但本着独乐乐不如众乐乐,萌生接入到个人公众号的后台的想法。
说干就干,这是一个典型的单账户(只有一个OpenAI的账户)下的多用户(公众号服务于多个用户)场景,同时需要支持多轮对话(聊天嘛,不寒掺),所以需要调研目前的chatgpt服务能否满足要求。
在github上搜索了一下,star数最多的应该是acheong08/ChatGPT,是一个基于python的项目,研究了一下他的实现,发现能够良好的满足要求,感兴趣的同学可以阅读一下相关代码或留言,此处不详细展开。
本项目为了避免重复造轮子,底层直接使用了acheong08/ChatGPT,通过http协议进行交互,而没有去适配OpenAI的http接口,这样随着acheong08/ChatGPT的迭代,我们可以有更多精力放在上层的业务功能上。
限制: 目前OpenAI的服务并不稳定,且响应时间略长,所以集成到微信公众号内需要使用异步消息,同步体验可能不佳,大家感兴趣可以搜索gz号swordintent进行体验,也可以参照本项目实现公众号机器人
进入OpenAI进行注册,中国大陆手机号码无法注册,个人用途建议因不涉及到隐私,可以考虑使用接码平台,请自行搜索。
python >= 3.7
服务文件在 src/main/resources/server.py。
pip3 install flask flask-restful
pip3 install --upgrade revChatGPT
python3 server.py
默认服务启动会在 http://127.0.0.1:5000 提供服务
https://search.maven.org/artifact/com.swordintent.chatgpt/web-api/
Maven
<dependency>
<groupId>com.swordintent.chatgpt</groupId>
<artifactId>web-api</artifactId>
<version>1.0.0</version>
</dependency>
Gradle
implementation 'com.swordintent.chatgpt:web-api:1.0.0'
chatgptClient.init(address, chatGptConfig) 方法来初始化客户端。password和address, password为openAI的api-keys, 可以从这里找到.address根据实际部署情况来设置. ChatgptClient chatgptClient = ChatgptClientImpl.getInstance();
ChatGptConfig chatGptConfig = ChatGptConfig.builder()
.email("")
.password("")
.build();
String address = "http://127.0.0.1:5000";
chatgptClient.init(address, chatGptConfig);
chatgptClient.chat(request) 方法来进行聊天.conversationId需要置为null(默认).null即可. //第一轮对话,或重置多轮对话
ChatRequest request = ChatRequest.builder()
.prompt(content)
.conversationId(null)
.build();
ChatResponse response = chatgptClient.chat(request);
conversationId设置到下一轮对话的请求参数中即可。 //多轮对话
ChatRequest request = ChatRequest.builder()
.prompt(content)
.conversationId(response.getConversationId())
.build();
ChatResponse response = chatgptClient.chat(request);
conversationId,所以可能会比较大,后边会优化.给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这