让 OpenAI 更 Open,在 ChatGPT 里自由接入数据源( 四 )


和上面调用 Token 的逻辑类似,不过这里我们需要使用 POST 来发送请求,并携带合适的请求参数 。
关于图片风格的定义,这里简单实现了一个随机选取风格,更好的实现是根据用户的内容,自动选择合适的模型风格,如果你感兴趣,可以在项目中提交你的代码实现,让更多的人受惠于此 。
好了,上面的代码就是核心实现 。但是,为了让实现生效,我们还需要完成一些边边角角的调整 。
我们需要先在流式响应组件中/-/.go,添加一段调用,让服务端在响应请求的时候,能够将用户提交的交给我们刚刚封装好的程序 。
package StreamResponser...func StreamBuilder(parentMessageID string, conversationID string, modelSlug string, broker *eb.Broker, input string, mode StreamMessageMode) bool {...switch modelSlug {...case datatypes.MODEL_FLAGSTUDIO.Slug:if define.ENABLE_FLAGSTUDIO {sequences = MakeStreamingMessage(FlagStudio.GenerateImageByText(input), modelSlug, conversationID, messageID, mode)quickMode = true}...}...}
接着,是在程序功能开关中添加一些定义 。如果你不需要按需启用,可以不进行实现:
var (ENABLE_FLAGSTUDIO= GetBool("ENABLE_FLAGSTUDIO", false)// Enable FlagstudioENABLE_FLAGSTUDIO_ONLY = GetBool("ENABLE_FLAGSTUDIO_ONLY", false)// Enable Flagstudio onlyFLAGSTUDIO_API_KEY= GetSecret("FLAGSTUDIO_API_KEY", "YOUR_FLAGSTUDIO_SECRET") // Flagstudio API Token)
为了实现多种模型、数据源的切换,我们还需要为每一种数据源进行一些数据预定义 。在模型列表目录中创建一个新程序文件//.go,在其中添加我们自定义的新数据源:
var MODEL_FLAGSTUDIO = ModelListItem{Slug:"flag-studio",MaxTokens:1000,Title:"FlagStudio",Description: "FlagStudio is a text-to-image platform developed by BAAI's z-lab and FlagAI team.\n\nIt supports 18-language text-to-image generation including Chinese and English, and aims to provide advanced AI art creation experience.",Tags:[]string{},QualitativeProperties: ModelListQualitativeProperties{Reasoning:[]int{4, 5},Speed:[]int{4, 5},Conciseness: []int{3, 5},},}
为了让模型能够被正常调用,我们还需要实现模型获取 API 中的一些实现,依旧是创建一个新的程序 /api//.go,定义一个获取我们定义好的模型类型的功能:
package modelsimport ("github.com/soulteary/sparrow/internal/datatypes""github.com/soulteary/sparrow/internal/define")func GetFlagStudioModel() (result []datatypes.ModelListItem) {model := datatypes.MODEL_FLAGSTUDIOif define.ENABLE_I18N {model.Description = "FlagStudio 是由 BAAI 旗下的创新应用实验室和 FlagAI 团队开发的文图生成工具 。\n\n支持中英等18语的文图生成,旨在为大家提供先进的AI艺术创作体验 。"}result = append(result, model)return result}
最后,实现完调用函数,我们将调用函数添加到/api//.go 中,当调用模型列表的时候,就能够访问到我们的新增的模型或者数据源了 。
package modelsimport ("net/http""github.com/gin-gonic/gin""github.com/soulteary/sparrow/internal/datatypes""github.com/soulteary/sparrow/internal/define")func GetModels(c *gin.Context) {...if define.ENABLE_FLAGSTUDIO {model := GetFlagStudioModel()if define.ENABLE_FLAGSTUDIO_ONLY {c.JSON(http.StatusOK, datatypes.Models{Models: model})}modelList = append(modelList, model...)}...}
目前添加新数据源的体验还不是很好,后续我考虑进行一些优化调整,让添加数据源能够更简单明了一些 。当然,后端服务是开源实现,如果你有好的想法,也可以进行开源共建 。