myChat - 第三方ChatGPT原生客户端,支持win和mac系统
Posted 潘高
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了myChat - 第三方ChatGPT原生客户端,支持win和mac系统相关的知识,希望对你有一定的参考价值。
前言
可能你没体验过 ChatGPT,但肯定听说过。苦于高高的围墙,无法便捷的使用 ChatGPT。那你就不能错过 myChat ,一款第三方 ChatGPT 原生客户端。基于 OpenAI 提供的 ChatGPT 同款模型 GPT-3.5,可达到与 ChatGPT 类似的效果,即开即用,不用魔法上网。
搭后语
哎,以上是我原本想好的台词。可不曾想 openAI 公司一层层的加码,先是禁用了我们国家访问 API,然后又将18 美元的免费额度降低到5 美元,今天甚至直接取消了免费额度。如果你恰好是今天申请的 API,应该能看到免费额度归零了。
所以吧,我又临时改变了软件用法,支持自定义 API 地址,同时支持输入代理 IP 和端口,以应对 openAI 的封闭。
如何使用
下载对应程序包
分别有 win 版,mac 的 M 芯片版,mac 的 Intel 版,在我的 github (https://github.com/pangao1990/myChat) 里可以下载对应版本。
输入 openAI 的 sh 码
原本想把我的 sh 码预装在程序中的,不过想想。万一我的 sh 码的额度用完了,那岂不是程序也用不了了。所以,这里就还是填写大家自己申请的 sh 码吧。
可以看我另外一篇博客, 超详细注册 OpenAI 接口账号的教程 获取 OpenAI API sh 码 。
如果嫌麻烦,也可以有偿试用我的 sh 码。谈钱不伤感情。
设置代理
没错,原本是不需要魔法上网的,可惜在 3 月 2 号那天,openAI 把 API 也封锁了,现在国内是访问不了的。所以,想用这款软件,必须要使用魔法。如果是代理上网,这里需要填入代理 IP 和端口。
新增聊天主题
这里可以分类设置聊天主题,ChatGPT 会根据不同的聊天主题,来给出不同的回答。
测试
要不百度一下,我都不知道 ChatGPT 又在煞有介事的胡说八道。似乎并没有一位叫潘高的著名歌手。这应该是 ChatGPT 自己编的吧。
更多编程教学请关注公众号:潘高陪你学编程
使用原生方法从kafka消费消息
kafka最早是linkedin开发的一套高性能类队列结构,具有发布—订阅功能。现在是apache的项目之一。支持很多种客户端从其中进行consume,网上也有许多第三方的客户端(注1),但下面我们只使用其自己的包中的方法,来进行consume。我们的这个例子是从一个servlet中调用kafka的Consumer相关类,来读取远端kafka中的message。
代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String topic = "test"; List<Message> list = new ArrayList<Message>(); StringBuilder builder = new StringBuilder(); KafkaHttpConsumer consumer = new KafkaHttpConsumer(); list = consumer.consume(topic); builder.append("["); for(int i=0; i<list.size(); i++){ builder.append(list.get(i).message); builder.append(","); } builder.deleteCharAt(builder.length()-1); builder.append("]"); response.getWriter().append(builder.toString()); }
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import com.fasterxml.jackson.annotation.JsonInclude;
import kafka.consumer.Consumer;
import kafka.consumer.ConsumerConfig;
import kafka.consumer.ConsumerTimeoutException;
import kafka.consumer.KafkaStream;
import kafka.javaapi.consumer.ConsumerConnector;
import kafka.message.MessageAndMetadata;
public class KafkaHttpConsumer { public List<Message> consume(String topic) { Properties prop = new Properties(); try { prop.load(this.getClass().getResourceAsStream("/kafka-http.properties")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } ConsumerConfig config = new ConsumerConfig(prop); ConsumerConnector connector = Consumer.createJavaConsumerConnector(config); Map<String, Integer> streamCounts = Collections.singletonMap(topic, 1); Map<String, List<KafkaStream<byte[], byte[]>>> streams = connector.createMessageStreams(streamCounts); KafkaStream<byte[], byte[]> stream = streams.get(topic).get(0);
List<Message> messages = new ArrayList<>(); try { for (MessageAndMetadata<byte[], byte[]> messageAndMetadata : stream) messages.add(new Message(messageAndMetadata)); } catch (ConsumerTimeoutException ignore) { } finally { connector.commitOffsets(); connector.shutdown(); } return messages; } /* for test */ public static void main(String[] args) { Properties prop = new Properties(); try { prop.load(KafkaHttpConsumer.class.getResourceAsStream("/kafka-http.properties")); Iterator<Object> ite = prop.keySet().iterator(); while(ite.hasNext()){ String key = (String)ite.next(); System.out.println("value:" + prop.getProperty(key)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static class Message { public String topic; @JsonInclude(JsonInclude.Include.NON_NULL) public String key; public String message; public int partition; public long offset; public Message(MessageAndMetadata<byte[], byte[]> message) { this.topic = message.topic(); this.key = message.key() != null ? new String(message.key(), Charset.forName("utf-8")) : null; this.message = new String(message.message(), Charset.forName("utf-8")); this.partition = message.partition(); this.offset = message.offset(); } } }
注1:https://cwiki.apache.org/confluence/display/KAFKA/Clients
以上是关于myChat - 第三方ChatGPT原生客户端,支持win和mac系统的主要内容,如果未能解决你的问题,请参考以下文章
ZooKeeper客户端原生API的使用以及ZkClient第三方API的使用
教你如何让ChatGPT 访问插件?(2023年3月26日)