invoke_model.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. package service
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_daemon"
  5. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_daemon/access_types"
  6. "github.com/langgenius/dify-plugin-daemon/internal/core/session_manager"
  7. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/model_entities"
  8. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
  9. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/requests"
  10. "github.com/langgenius/dify-plugin-daemon/internal/types/exception"
  11. "github.com/langgenius/dify-plugin-daemon/internal/utils/stream"
  12. )
  13. func InvokeLLM(
  14. r *plugin_entities.InvokePluginRequest[requests.RequestInvokeLLM],
  15. ctx *gin.Context,
  16. max_timeout_seconds int,
  17. ) {
  18. // create session
  19. session, err := createSession(
  20. r,
  21. access_types.PLUGIN_ACCESS_TYPE_MODEL,
  22. access_types.PLUGIN_ACCESS_ACTION_INVOKE_LLM,
  23. ctx.GetString("cluster_id"),
  24. )
  25. if err != nil {
  26. ctx.JSON(500, exception.InternalServerError(err).ToResponse())
  27. return
  28. }
  29. defer session.Close(session_manager.CloseSessionPayload{
  30. IgnoreCache: false,
  31. })
  32. baseSSEService(
  33. func() (*stream.Stream[model_entities.LLMResultChunk], error) {
  34. return plugin_daemon.InvokeLLM(session, &r.Data)
  35. },
  36. ctx,
  37. max_timeout_seconds,
  38. )
  39. }
  40. func InvokeTextEmbedding(
  41. r *plugin_entities.InvokePluginRequest[requests.RequestInvokeTextEmbedding],
  42. ctx *gin.Context,
  43. max_timeout_seconds int,
  44. ) {
  45. // create session
  46. session, err := createSession(
  47. r,
  48. access_types.PLUGIN_ACCESS_TYPE_MODEL,
  49. access_types.PLUGIN_ACCESS_ACTION_INVOKE_TEXT_EMBEDDING,
  50. ctx.GetString("cluster_id"))
  51. if err != nil {
  52. ctx.JSON(500, exception.InternalServerError(err).ToResponse())
  53. return
  54. }
  55. defer session.Close(session_manager.CloseSessionPayload{
  56. IgnoreCache: false,
  57. })
  58. baseSSEService(
  59. func() (*stream.Stream[model_entities.TextEmbeddingResult], error) {
  60. return plugin_daemon.InvokeTextEmbedding(session, &r.Data)
  61. },
  62. ctx,
  63. max_timeout_seconds,
  64. )
  65. }
  66. func InvokeRerank(
  67. r *plugin_entities.InvokePluginRequest[requests.RequestInvokeRerank],
  68. ctx *gin.Context,
  69. max_timeout_seconds int,
  70. ) {
  71. // create session
  72. session, err := createSession(
  73. r,
  74. access_types.PLUGIN_ACCESS_TYPE_MODEL,
  75. access_types.PLUGIN_ACCESS_ACTION_INVOKE_RERANK,
  76. ctx.GetString("cluster_id"),
  77. )
  78. if err != nil {
  79. ctx.JSON(500, exception.InternalServerError(err).ToResponse())
  80. return
  81. }
  82. defer session.Close(session_manager.CloseSessionPayload{
  83. IgnoreCache: false,
  84. })
  85. baseSSEService(
  86. func() (*stream.Stream[model_entities.RerankResult], error) {
  87. return plugin_daemon.InvokeRerank(session, &r.Data)
  88. },
  89. ctx,
  90. max_timeout_seconds,
  91. )
  92. }
  93. func InvokeTTS(
  94. r *plugin_entities.InvokePluginRequest[requests.RequestInvokeTTS],
  95. ctx *gin.Context,
  96. max_timeout_seconds int,
  97. ) {
  98. // create session
  99. session, err := createSession(
  100. r,
  101. access_types.PLUGIN_ACCESS_TYPE_MODEL,
  102. access_types.PLUGIN_ACCESS_ACTION_INVOKE_TTS,
  103. ctx.GetString("cluster_id"),
  104. )
  105. if err != nil {
  106. ctx.JSON(500, exception.InternalServerError(err).ToResponse())
  107. return
  108. }
  109. defer session.Close(session_manager.CloseSessionPayload{
  110. IgnoreCache: false,
  111. })
  112. baseSSEService(
  113. func() (*stream.Stream[model_entities.TTSResult], error) {
  114. return plugin_daemon.InvokeTTS(session, &r.Data)
  115. },
  116. ctx,
  117. max_timeout_seconds,
  118. )
  119. }
  120. func InvokeSpeech2Text(
  121. r *plugin_entities.InvokePluginRequest[requests.RequestInvokeSpeech2Text],
  122. ctx *gin.Context,
  123. max_timeout_seconds int,
  124. ) {
  125. // create session
  126. session, err := createSession(
  127. r,
  128. access_types.PLUGIN_ACCESS_TYPE_MODEL,
  129. access_types.PLUGIN_ACCESS_ACTION_INVOKE_SPEECH2TEXT,
  130. ctx.GetString("cluster_id"),
  131. )
  132. if err != nil {
  133. ctx.JSON(500, exception.InternalServerError(err).ToResponse())
  134. return
  135. }
  136. defer session.Close(session_manager.CloseSessionPayload{
  137. IgnoreCache: false,
  138. })
  139. baseSSEService(
  140. func() (*stream.Stream[model_entities.Speech2TextResult], error) {
  141. return plugin_daemon.InvokeSpeech2Text(session, &r.Data)
  142. },
  143. ctx,
  144. max_timeout_seconds,
  145. )
  146. }
  147. func InvokeModeration(
  148. r *plugin_entities.InvokePluginRequest[requests.RequestInvokeModeration],
  149. ctx *gin.Context,
  150. max_timeout_seconds int,
  151. ) {
  152. // create session
  153. session, err := createSession(
  154. r,
  155. access_types.PLUGIN_ACCESS_TYPE_MODEL,
  156. access_types.PLUGIN_ACCESS_ACTION_INVOKE_MODERATION,
  157. ctx.GetString("cluster_id"),
  158. )
  159. if err != nil {
  160. ctx.JSON(500, exception.InternalServerError(err).ToResponse())
  161. return
  162. }
  163. defer session.Close(session_manager.CloseSessionPayload{
  164. IgnoreCache: false,
  165. })
  166. baseSSEService(
  167. func() (*stream.Stream[model_entities.ModerationResult], error) {
  168. return plugin_daemon.InvokeModeration(session, &r.Data)
  169. },
  170. ctx,
  171. max_timeout_seconds,
  172. )
  173. }
  174. func ValidateProviderCredentials(
  175. r *plugin_entities.InvokePluginRequest[requests.RequestValidateProviderCredentials],
  176. ctx *gin.Context,
  177. max_timeout_seconds int,
  178. ) {
  179. // create session
  180. session, err := createSession(
  181. r,
  182. access_types.PLUGIN_ACCESS_TYPE_MODEL,
  183. access_types.PLUGIN_ACCESS_ACTION_VALIDATE_PROVIDER_CREDENTIALS,
  184. ctx.GetString("cluster_id"),
  185. )
  186. if err != nil {
  187. ctx.JSON(500, exception.InternalServerError(err).ToResponse())
  188. return
  189. }
  190. defer session.Close(session_manager.CloseSessionPayload{
  191. IgnoreCache: false,
  192. })
  193. baseSSEService(
  194. func() (*stream.Stream[model_entities.ValidateCredentialsResult], error) {
  195. return plugin_daemon.ValidateProviderCredentials(session, &r.Data)
  196. },
  197. ctx,
  198. max_timeout_seconds,
  199. )
  200. }
  201. func ValidateModelCredentials(
  202. r *plugin_entities.InvokePluginRequest[requests.RequestValidateModelCredentials],
  203. ctx *gin.Context,
  204. max_timeout_seconds int,
  205. ) {
  206. // create session
  207. session, err := createSession(
  208. r,
  209. access_types.PLUGIN_ACCESS_TYPE_MODEL,
  210. access_types.PLUGIN_ACCESS_ACTION_VALIDATE_MODEL_CREDENTIALS,
  211. ctx.GetString("cluster_id"),
  212. )
  213. if err != nil {
  214. ctx.JSON(500, exception.InternalServerError(err).ToResponse())
  215. return
  216. }
  217. defer session.Close(session_manager.CloseSessionPayload{
  218. IgnoreCache: false,
  219. })
  220. baseSSEService(
  221. func() (*stream.Stream[model_entities.ValidateCredentialsResult], error) {
  222. return plugin_daemon.ValidateModelCredentials(session, &r.Data)
  223. },
  224. ctx,
  225. max_timeout_seconds,
  226. )
  227. }
  228. func GetTTSModelVoices(
  229. r *plugin_entities.InvokePluginRequest[requests.RequestGetTTSModelVoices],
  230. ctx *gin.Context,
  231. max_timeout_seconds int,
  232. ) {
  233. session, err := createSession(
  234. r,
  235. access_types.PLUGIN_ACCESS_TYPE_MODEL,
  236. access_types.PLUGIN_ACCESS_ACTION_GET_TTS_MODEL_VOICES,
  237. ctx.GetString("cluster_id"),
  238. )
  239. if err != nil {
  240. ctx.JSON(500, exception.InternalServerError(err).ToResponse())
  241. return
  242. }
  243. defer session.Close(session_manager.CloseSessionPayload{
  244. IgnoreCache: false,
  245. })
  246. baseSSEService(
  247. func() (*stream.Stream[model_entities.GetTTSVoicesResponse], error) {
  248. return plugin_daemon.GetTTSModelVoices(session, &r.Data)
  249. },
  250. ctx,
  251. max_timeout_seconds,
  252. )
  253. }
  254. func GetTextEmbeddingNumTokens(
  255. r *plugin_entities.InvokePluginRequest[requests.RequestGetTextEmbeddingNumTokens],
  256. ctx *gin.Context,
  257. max_timeout_seconds int,
  258. ) {
  259. session, err := createSession(
  260. r,
  261. access_types.PLUGIN_ACCESS_TYPE_MODEL,
  262. access_types.PLUGIN_ACCESS_ACTION_GET_TEXT_EMBEDDING_NUM_TOKENS,
  263. ctx.GetString("cluster_id"),
  264. )
  265. if err != nil {
  266. ctx.JSON(500, exception.InternalServerError(err).ToResponse())
  267. return
  268. }
  269. defer session.Close(session_manager.CloseSessionPayload{
  270. IgnoreCache: false,
  271. })
  272. baseSSEService(
  273. func() (*stream.Stream[model_entities.GetTextEmbeddingNumTokensResponse], error) {
  274. return plugin_daemon.GetTextEmbeddingNumTokens(session, &r.Data)
  275. },
  276. ctx,
  277. max_timeout_seconds,
  278. )
  279. }
  280. func GetAIModelSchema(
  281. r *plugin_entities.InvokePluginRequest[requests.RequestGetAIModelSchema],
  282. ctx *gin.Context,
  283. max_timeout_seconds int,
  284. ) {
  285. session, err := createSession(
  286. r,
  287. access_types.PLUGIN_ACCESS_TYPE_MODEL,
  288. access_types.PLUGIN_ACCESS_ACTION_GET_AI_MODEL_SCHEMAS,
  289. ctx.GetString("cluster_id"),
  290. )
  291. if err != nil {
  292. ctx.JSON(500, exception.InternalServerError(err).ToResponse())
  293. return
  294. }
  295. defer session.Close(session_manager.CloseSessionPayload{
  296. IgnoreCache: false,
  297. })
  298. baseSSEService(
  299. func() (*stream.Stream[model_entities.GetModelSchemasResponse], error) {
  300. return plugin_daemon.GetAIModelSchema(session, &r.Data)
  301. },
  302. ctx,
  303. max_timeout_seconds,
  304. )
  305. }
  306. func GetLLMNumTokens(
  307. r *plugin_entities.InvokePluginRequest[requests.RequestGetLLMNumTokens],
  308. ctx *gin.Context,
  309. max_timeout_seconds int,
  310. ) {
  311. session, err := createSession(
  312. r,
  313. access_types.PLUGIN_ACCESS_TYPE_MODEL,
  314. access_types.PLUGIN_ACCESS_ACTION_GET_LLM_NUM_TOKENS,
  315. ctx.GetString("cluster_id"),
  316. )
  317. if err != nil {
  318. ctx.JSON(500, exception.InternalServerError(err).ToResponse())
  319. return
  320. }
  321. defer session.Close(session_manager.CloseSessionPayload{
  322. IgnoreCache: false,
  323. })
  324. baseSSEService(
  325. func() (*stream.Stream[model_entities.LLMGetNumTokensResponse], error) {
  326. return plugin_daemon.GetLLMNumTokens(session, &r.Data)
  327. },
  328. ctx,
  329. max_timeout_seconds,
  330. )
  331. }