前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >把AI神器OpenWebUI接入现有系统,没想到这么简单

把AI神器OpenWebUI接入现有系统,没想到这么简单

作者头像
大风写全栈
发布2025-03-06 23:13:47
发布2025-03-06 23:13:47
11500
代码可运行
举报
文章被收录于专栏:锤子代码锤子代码
运行总次数:0
代码可运行

起因

最近在接触AI方面的东西,发现OpenWebUI很不错。

有用户系统,可以记住会话内容,还可以自定义模型地址等等。

UI风格也不错,美中不足的有两点。

  1. 接入现有系统存在一定成本;
  2. 联网搜索里面只有国外的搜索引擎。

搜索引擎暂且不谈。

接入现有系统一般需要考虑用户信息如何打通,怎么实现一键登录。

这个我们晚点讲。

安装OpenWebUI

必须是Python 3.11版本。

安装

代码语言:javascript
代码运行次数:0
复制
pip install open-webui

速度会有点慢,建议配置阿里云的源。

临时使用阿里云的源进行安装:

代码语言:javascript
代码运行次数:0
复制
pip install open-webui -i https://mirrors.aliyun.com/pypi/simple/

长期使用参考配置:

https://developer.aliyun.com/mirror/pypi

安装完成之后使用下面的命令启动:

代码语言:javascript
代码运行次数:0
复制
open-webui serve

启动成功会显示OpenWebUI的Banner。

打开浏览器访问:

http://localhost:8080/

第一次会有点慢。原因是OpenWebUI会默认去连接OpenAI的接口。

由于特殊原因,OpenAI接口不可用,导致第一次很慢很慢。

耐心等,过一会好了之后会提示你设置管理员的用户名密码。

OpenWebUI配置

假设现在已经安装完成,需要做的是:

允许新用户注册

左下角头像,选择管理员面板,选择设置-通用。

允许新用户注册,默认用户角色选择: 用户

设置好之后,就可以继续下面的流程了。

实现一键登录的步骤

采用Java实现,逻辑是:

  1. 使用GET方式接收入参,入参为用户名;
  2. 使用用户名组成默认邮箱和默认密码进行登录;
  3. 登录成功就拿到token,直接跳转OpenWebUI;
  4. 如果登录失败(用户不存在),就进行注册;
  5. 注册成功就跳转OpenWebUI。

注意,有如下几个需要配置的地方:

  1. REGISTER_URL: 注册路径,只需要修改chat.openwebuitest.com为你自己的地址即可;
  2. LOGIN_URL: 登录路径,只需要修改chat.openwebuitest.com为你自己的地址即可;
  3. REDIRECT_TOKEN_URL: 跳转路径,只需要修改chat.openwebuitest.com为你自己的地址即可;
  4. email:修改 @example-auto.com 为你自己想要的任意邮箱(不验证邮箱是否有效);
  5. password: 默认密码,修改成你自己想设置的(强度可以高点)

代码中使用了hutool工具库。

使用的是Spring Boot 3.2.5,maven的配置文件如下:

代码语言:javascript
代码运行次数:0
复制
   <dependency>
	    <groupId>cn.hutool</groupId>
	    <artifactId>hutool-all</artifactId>
	    <version>5.8.26</version>
	</dependency>

实现代码如下:

代码语言:javascript
代码运行次数:0
复制
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.HashMap;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
 * 通过接口自动跳转并登陆OpenWebUI
 *
 * 1. 先登陆,如果登录失败,则注册;
 * 2. 注册成功后,自动跳转到OpenWebUI页面.
 * 
 * @author pc
 * @since 2025/3/4
 */
@RestController
public class AutoLoginController {
  private static final String REGISTER_URL = "https://chat.openwebuitest.com/api/v1/auths/signup";
  private static final String LOGIN_URL = "https://chat.openwebuitest.com/api/v1/auths/signin";
  private static final String REDIRECT_TOKEN_URL = "https://chat.openwebuitest.com/auth#";
  @GetMapping("/auto-register-login")
  public Object handleAutoLogin(
      HttpServletRequest req, HttpServletResponse resp, @RequestParam String username) {
    try {
      String email = username + "@example-auto.com";
      String password = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
      var loginParams = new HashMap<>();
      loginParams.put("email", email);
      loginParams.put("password", password);
      var loginRes =
          HttpRequest.post(LOGIN_URL)
              .header("Content-Type", "application/json")
              .body(JSONUtil.toJsonStr(loginParams))
              .execute();
      if (loginRes.isOk()) {
        JSONObject jsonResponse = JSONUtil.parseObj(loginRes.body());
        String token = jsonResponse.getStr("token");
        if (StringUtils.hasLength(token)) {
          resp.sendRedirect(REDIRECT_TOKEN_URL + "token=" + token);
          return null;
        }
      }
      var registerParams = new HashMap<>();
      registerParams.put("name", username);
      registerParams.put("password", password);
      registerParams.put("email", email);
      registerParams.put(
          "profile_image_url",
          "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IArs4c6QAAAq9JREFUeF7tmz9rU3EYhc+9Se+lVUopXSyCIP4ZpOCQRQtOTjo4FAp+BPUrWBxdRMHZTb9Ah44OIjo4STeddGkXt6KkptcruUJoEVL4wXtzuDyZArnv+zs8T04SEpIdvFquxc2GQIYQGxdNEIR4+UCImQ+EIMSNgFke3kMQYkbALA4NQYgZAbM4NAQhZgTM4tAQhJgRMItDQxBiRsAsDg1BiBkBszg0BCFmBMzi0BCEmBEwi0NDEGJGwCwODUGIGQGzODQEIWYEzOLQEISYETCLQ0MQYkbALE5nGpLNndX8nW3lK9dV/9rX8N0DVXvvzXCfHqczQorBloq1h1JeIOR077FX9C/cVbn+XNn8SnMQDYnlPXV77/xtlTeeKl+8OLkOITMS0ju3rvLmM+VLV04kQMgMhPQvbaocbCk7s/rf6QhpUcj401QxeKz+5fsa329uf46kupJ6Je8hLbrQuBXF2iPly9fG/1f9d3Q11OjLa/VWbylfuoqQNoUsbHycQG+KcfBNo88vNPr6Rscf4yWrJSsT6NWhjr7v6PDTE9U/95rTEdKShOPHLNx7q3r4Q793X6ra/3AiAUJmIGTakQhBSAiBznyXRUNCnh/pSxGSzi5kEiEhWNOXIiSdXcgkQkKwpi9FSDq7kEmEhGBNX4qQdHYhkwgJwZq+FCHp7EImERKCNX0pQtLZhUwiJARr+lKEpLMLmURICNb0pQhJZ8fkFAKd+YGqK5YRYmYSIQgxI2AWh4YgxIyAWRwaghAzAmZxaAhCzAiYxaEhCDEjYBaHhiDEjIBZHBqCEDMCZnFoCELMCJjFoSEIMSNgFoeGIMSMgFkcGoIQMwJmcWgIQswImMWhIQgxI2AWh4YgxIyAWRwaghAzAmZxaAhCzAiYxaEhCDEjYBaHhiDEjIBZnL8EWjIDsmw/0QAAAABJRU5ErkJggg==");
      var registerRes =
          HttpRequest.post(REGISTER_URL)
              .header("Content-Type", "application/json")
              .body(JSONUtil.toJsonStr(registerParams))
              .execute();
      if (!registerRes.isOk()) {
        return "注册失败: " + registerRes.body();
      }
      JSONObject jsonResponse = JSONUtil.parseObj(loginRes.body());
      String token = jsonResponse.getStr("token");
      resp.sendRedirect(REDIRECT_TOKEN_URL + "token=" + token);
      return null;
    } catch (Exception e) {
      return "操作异常: " + e.getMessage();
    }
  }
}

是不是很简单?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 锤子代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档