分享一个由rust实现的openai api服务端+Android客户端

news2024/11/15 8:10:56

开发缘由

  1. 官方网页存在经常中途断开的问题.
  2. 经常使用不同ip登录openai帐号可能会导致封号.
  3. 使用开源项目chatgpt-web搭建过一个网页端,目前已被DNS污染,
  4. 体验GitHub Copilot.
  5. 已经使用了rust语言一段时间,打算用它写个服务端练手.

服务端

技术栈

  1. rust

Rust是一种系统级编程语言,由Mozilla开发。它的设计目标是提供一种安全、并发、实用的编程语言。Rust的语法类似于C++,但它具有内存安全和线程安全的特性,这使得它在编写高性能系统级代码时非常有用。Rust还有一个强大的包管理器Cargo,可以帮助开发者管理依赖项和构建项目。

  1. tokio

Tokio是一个基于Rust语言的异步运行时库,它提供了一种高效的方式来编写异步I/O应用程序。Tokio的核心是一个事件循环,它可以处理大量的并发连接,而不会消耗太多的系统资源。Tokio还提供了一组异步I/O原语,包括TCP、UDP、Unix域套接字、定时器等,这些原语可以帮助开发者编写高性能的网络应用程序。Tokio还提供了一些工具和宏,可以帮助开发者编写简洁、易于维护的异步代码。

  1. axum

Axum是一个基于Rust语言的Web框架,它使用了异步I/O和Tokio运行时来提供高性能的Web服务。Axum的设计目标是提供一种简单、易于使用的Web框架,同时保持高性能和可扩展性。Axum的核心是一个基于路由的处理器,它可以将HTTP请求路由到不同的处理器函数中。Axum还提供了一些中间件,可以用于处理请求和响应,例如身份验证、日志记录、错误处理等。Axum还提供了一些工具和宏,可以帮助开发者编写简洁、易于维护的Web应用程序。Axum的依赖管理使用Cargo,这使得开发者可以轻松地管理依赖项和构建项目。

  1. clap

Clap是一个基于Rust语言的命令行参数解析库,它提供了一种简单、易于使用的方式来解析命令行参数。Clap的设计目标是提供一种灵活、可定制的命令行解析器,同时保持高性能和易于使用。Clap支持各种类型的命令行参数,包括标志、选项、位置参数等。Clap还支持子命令,可以帮助开发者构建复杂的命令行工具。Clap的API文档非常详细,而且提供了大量的示例代码,这使得开发者可以快速上手并使用Clap来解析命令行参数。Clap的依赖管理使用Cargo,这使得开发者可以轻松地管理依赖项和构建项目。

  1. async-openai

async-openai是一个基于Rust语言的异步OpenAI API客户端库,它使用异步I/O和Tokio运行时来提供高性能的OpenAI API服务。async-openai的设计目标是提供一种简单、易于使用的方式来访问OpenAI API,同时保持高性能和可扩展性。async-openai支持各种类型的OpenAI API,包括文本生成、语言翻译、语言理解等。async-openai还提供了一些工具和宏,可以帮助开发者编写简洁、易于维护的异步代码。async-openai的依赖管理使用Cargo,这使得开发者可以轻松地管理依赖项和构建项目。

  1. anyhow

anyhow是一个基于Rust语言的错误处理库,它提供了一种简单、易于使用的方式来处理错误。anyhow的设计目标是提供一种灵活、可定制的错误处理机制,同时保持高性能和易于使用。anyhow的核心是一个Error类型,它可以包含任何类型的错误信息。anyhow还提供了一些工具和宏,可以帮助开发者编写简洁、易于维护的错误处理代码。anyhow的依赖管理使用Cargo,这使得开发者可以轻松地管理依赖项和构建项目。

  1. serde

serde是一个基于Rust语言的序列化和反序列化库,它提供了一种简单、易于使用的方式来将数据结构转换为字节流或从字节流中解析数据结构。serde的设计目标是提供一种灵活、可定制的序列化和反序列化机制,同时保持高性能和易于使用。serde支持各种类型的数据结构,包括基本类型、元组、数组、结构体、枚举等。serde还支持各种格式的数据序列化和反序列化,包括JSON、YAML、TOML、Bincode等。serde的API文档非常详细,而且提供了大量的示例代码,这使得开发者可以快速上手并使用serde来序列化和反序列化数据。serde的依赖管理使用Cargo,这使得开发者可以轻松地管理依赖项和构建项目。

  1. tracing

tracing是一个基于Rust语言的分布式应用程序跟踪系统,它提供了一种简单、易于使用的方式来跟踪应用程序中的事件和操作。tracing的设计目标是提供一种灵活、可定制的跟踪机制,同时保持高性能和易于使用。tracing支持各种类型的跟踪事件,包括日志记录、性能分析、错误处理等。tracing还提供了一些工具和宏,可以帮助开发者编写简洁、易于维护的跟踪代码。tracing的依赖管理使用Cargo,这使得开发者可以轻松地管理依赖项和构建项目。在Rust生态系统中,tracing是一个非常流行的跟踪库,被广泛用于构建高性能、可扩展的分布式应用程序。

服务端功能

  1. 隐私安全
    配合客户端,不记录任何设备信息,未保存ip信息,不记录任何聊天记录,高度隐私.

  2. 支持服务端指定api_key.

  3. 支持客户端自定义api_key.服务端只做转发功能.

  4. 自定义端口.

部分代码由GitHub Copilot生成

用法

./openai_api_server -a "your_key" -p "your_port"

客户端

技术栈

  1. okhttp
  2. room
  3. jtokkit
    用于token数计算
  4. lottie
    动画展示
  5. openai-client
    用于本地模式

部分代码由GitHub Copilot生成,大部分图片由Stable Diffusion WebUI生成.

客户端功能

  1. 自定义api_key.
  2. 本地模式(使用自己api_key,从本地发出请求,不使用服务器转发)
  3. 隐私安全.
    聊天记录存本地,可删除. 不收集任何隐私信息.
  4. 自定义最大token数.
  5. 自定义内容记录长度.
  6. 支持prompts

客户端截图

服务端项目地址:https://github.com/tangxuesong6/kyf_server
客户端项目地址:https://github.com/tangxuesong6/kyf_client

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/735695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch【域的属性、分词器、Elasticsearch搜索文档】(三)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch常用操作_域的属性 分词器_默认分词器 分词器_IK分词器 分词器_拼音分词器 分词器_自定义分词器 Elasticsearch搜索文档_准备工作 Elasticsearch搜索文档_搜索方式 Elasticsearch常用操作_域的属性 index 该域是否创建索引。只有值设置为true&#…

【双指针】844. 比较含退格的字符串

844. 比较含退格的字符串 解题思路 思路:函数deLETE的作用是处理带有退格符号的字符串。它使用双指针法来模拟字符串处理。初始时,慢指针slow和快指针fast都指向字符串的开头。然后,通过遍历字符串,如果当前字符不是退格符号&…

postman报错提示 Could not get any response怎么解决

目录 postman报错 解决方法: 在通过postman请求做接口测试的过程中,有时候会遇到一些报错,当遇到这些报错我们不要着急,看着具体哪里报错,然后进行解决 postman报错 经常使用postman的小伙伴们都应该遇到过一些报错…

工作:三菱PLC之CC-LINK通讯知识及应用

工作:三菱PLC之CC-LINK通讯及应用 一. cc-link接线图(RS485两线式接线) CC-Link Ver.1.00兼容电缆(特性阻抗:100Ω,终端电阻100Ω) CC-Link Ver.1.10兼容电缆(特性阻抗:…

Gradio库:使用Markdown模块创建交互式应用

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

如何使用多线程

一个进程正在运行时,至少会有一个线程在运行。 package ChapterOne;public class Test {public static void main(String[] args) {System.out.println(Thread.currentThread().getName());//currentThread方法返回正在被执行的线程的信息//getName返回正在被执行线…

【Docker】Docker实战

文章目录 搭建nginx服务搭建私有库Busybox阿里云上创建私有库 搭建nginx服务 首先拉取nginx的镜像。 docker pull nginx:1.24.0以后台的方式运行nginx,并且创建一个shell进行交互。 docker run --name nginx1 --rm -it -p 8080:80 nginx:1.24.0 bash#在交互的bas…

Kubernetes_核心组件_KubeProxy_Service找到Pod与DNS解析Service/Pod

文章目录 前言一、Service找到Pod(Iptables)二、Service找到Pod(IPVS)2.1 IPVS模式原理2.2 IPVS模式实践修改为 IPVS 模式 之前修改为 IPVS 模式之中修改为 IPVS 模式之后 三、Service和Pod的DNS域名3.1 Service DNS域名3.2 Service与Deployment/StatefulSet配合Deployment普通…

无源光网络(PON)介绍及其应用

文章目录 1、无源光网络(PON)介绍ONU(Optical Network Unit),光网络单元OLT(Optical line terminal),光线路终端 2、FTTH、FTTB、FTTR组网介绍FTTR组网规划 3、局端接入设备产品介绍…

Elasticsearch 基本使用(五)查询条件匹配方式(query query_string)

查询条件匹配方式 概述querytermtermsrangematch_allmatchmatch 匹配精度问题 match_phrasematch_pharse_prefixmatch_bool_prefixmulti_match query_string简单查询一个字段在多个字段上应用同一个条件 (类似multi_match)在所有字段上应用同一个条件 &a…

mysql 大数据量从“.log“文件插入方法

要被插入的数据文件以及内容 表结构 插入成功,插入时如果有主键唯一索引,则按照唯一索引的大小顺序插入,速度会快很多

基于Spring Boot的智能学生考勤系统设计与实现(Java+spring boot+MySQL+微信小程序+

获取源码或者论文请私信博主 演示视频: 基于Spring Boot的智能学生考勤系统设计与实现(Javaspring bootMySQL微信小程序人脸识别) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 后端:Java…

SpringBoot 如何使用 TestEntityManager 进行 JPA 集成测试, 如何使用

Spring Boot 是一个非常流行的 Java Web 开发框架,它简化了开发过程,提高了开发效率。在开发过程中,我们通常需要使用 JPA 操作数据库,为了保证代码的质量和正确性,我们需要进行集成测试。TestEntityManager 是 Spring…

bat批处理脚本控制台输出中文乱码问题

背景 最近在搞springcloud框架,涉及各种微服务。比如服务注册与发现、网关、鉴权、文件服务、日志服务、搜索服务、用户中心等等。如果要打包发布应用,就得一个个去打包,一个个去拷贝jar包,很繁琐。所以就想着写个bat脚本&#x…

【Zookeeper】使用Curator操作Zookeeper

简介 Curator 是 Apache ZooKeeper 的Java客户端库。 Zookeeper现有常见的Java API如&#xff1a;原生JavaAPI、Curator、ZkClient等。 添加依赖 <dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId&…

gitlab:(二)gitlab添加win10 台式机的ssh key

当前gitlab版本为12系列&#xff1a; 点击settings 找到ssh keys &#xff0c;再找到“ generate one or use an existing key.” 点击 generate one 参考如下的教程&#xff1a; window cmd 命令行示例 添加 ssh keys 添加的效果

路由基本使用

编程式导航 默认路由 模糊匹配模式 精确匹配

【C语言】指针进化 !!!

前言 &#x1f388;大家好&#xff0c;我是何小侠&#x1f388; &#x1f343;大家可以叫我小何或者小侠&#x1f343; &#x1f490;希望能通过写博客加深自己对于学习内容的理解&#x1f490; &#x1f338;也能帮助更多人理解和学习&#x1f338; 兰生幽谷&#xff0c;不为…

Redis 五种基本数据结构及基本使用

一、数据结构 二、使用 2.1 String 的使用 Redis String 一个键对应一个值&#xff0c;并且是二进制安全的&#xff0c;值可以是图片或者序列化后的对象。 一个键最大能存储 512 MB。 2.1.1 set 命令的使用 set key value127.0.0.1:6379> set name yunhu OK 127.0.0.1:…

【Docker】docker基础使用

文章目录 docker概念什么是dockerdocker引擎迭代docker与虚拟机docker版本发展 docker基础docker架构docker Registry(镜像仓库)镜像仓库使用流程实际研发镜像仓库使用不同镜像仓库的拉取 docker常用命令镜像仓库命令docker logindocker pulldocker pushdocker searchdocker lo…