invoke_model.go 8.5 KB

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