[halo-dev/halo]插件能做的咋这么少

2024-04-09 350 views
4
描述一下此特性

想获取halo配置都做不到, 可以注入的bean这么有限, 我感觉大部分spring的starte包都无法生效, websocket我一直都无法开启,难不成真的要一直请求, 不开放这些权限, 好歹也给一些工具类, 要不然感觉插件根本做不了什么. 我认为插件的可定义级别至少要比主题高, 这样主题那边开个iframe就可以很方便的把插件那边的能力继承过来

建议要提供的功能: 插件的动态文件操作 socket通信 插件页面直接开放的权限, redis缓存(没有这个, 至少给个文件这样用sqlite缓存也成啊)

回答

8

Halo 插件是运行时加载的,无法完成 Spring Boot Application 的完整启动,毕竟这这是一个插件。

如果可以描述一下具体的场景可能更有帮助,这样我们才知道在 Halo Core 中开放对应的能力。一开始就开放所有的能力并不是一个好的设计,可能会带来安全性问题。

关于缓存,在 https://github.com/halo-dev/halo/pull/4091 中已经添加了 cache 相关的依赖。

2

是否能做到nacos那样的动态加载, 获取在插件加载的时候, 把spring 的application给注入到插件中, 这样使用. 说实话获取配置信息是很重要, 总不能把动态文件随便放吧, 当心安全的话可以开放一个api这样规范和安全性都有保证

2
  1. 插件有自己的配置体系,可以使用 Setting 自定义模型,也可以使用配置文件,但是对于 Halo 的 application.yaml 的配置并不是都能开放给插件
  2. 插件可以引入任何依赖,对于 spring的starter也是可以的,但是自动配置不支持也就是目前插件还不能加载引入的依赖中的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 所以引入了 starter 后需要手动将 AutoConfiguration 加入到插件的 IOC 中

可以详细的描述你的使用场景让我们明白你想解决的问题

8

@guqing 我想做一个博客在线使用gpt流式问答, 目前的话是想把文章改造成边上可以直接给gpt提问的窗口插件, 就是在别人看不懂文章的时候可以直接问, 做成插件可以人别人更方便的加装这个功能

1

我不太懂具体怎么把AutoConfiguration 加入到插件的 IOC 中, 能给一段代码吗

8

如果你想实现一个 GPT 流式回答的功能,可以参考 plugin-live2d 功能。gpt 流式传输并不需要用到 websocket,它是无状态的,也并不是需要一直保持连接状态。

0

存前端也可以直接搞流失响应, 注意是流失响应, 但是前端会做不安全, 后端做就只能java对接, 如何websocket接入插件前端, 我是这么设想的

9

不太了解是什么方面不安全?提供给你的插件中,所有的 openai 相关的数据都保存在后端,与 openai 的交互也均采用后端 SDK,前端仅保存当前用户的回复历史。如果觉得回复历史也比较不安全,那么可以考虑采用使用 session 的方式将数据保存在后端。

0

我试了一下发现使用 Websocket 需要配合 SimpleUrlHandlerMapping,目前 Halo 还不支持扩展 SimpleUrlHandlerMapping

1

gpt 的交互貌似确实不需要用到 websocket,只需要将问答的上下文以及当前问题通过 API 请求即可,目前的chatgpt客户端都是这样比如 https://github.com/Yidadaa/ChatGPT-Next-Web

简要实现思路:

  1. 通过 Setting 自定义模型提供配置表单参考 developer-guide/form-schemaHalo extension setting example
  2. 开发模式启用插件并配置,比如填写 chatgpt 的 api key
  3. 编写插件提供一个自定义 API 接收参数,参考 https://github.com/halo-sigs/plugin-oauth2/blob/main/src/main/java/run/halo/oauth/UserConnectionEndpoint.java
  4. 自定义 API 实现中通过依赖注入 ReactiveSettingFetch 获取到表单配置,构造 chatgpt 的 Client 对象并发送请求将 Client 响应作为API响应
5

重点不是websocket,我当然知道不需要websocket,我想用websocket对接我的前后端。

7

好的, 我看看, 主要是现在还没得到我想要的, 不过你都这么说了.