123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- package plugin_manager
- import (
- "fmt"
- "time"
- "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_manager/basic_runtime"
- "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_manager/serverless_runtime"
- "github.com/langgenius/dify-plugin-daemon/internal/db"
- "github.com/langgenius/dify-plugin-daemon/internal/types/models"
- "github.com/langgenius/dify-plugin-daemon/internal/utils/cache"
- "github.com/langgenius/dify-plugin-daemon/internal/utils/cache/helper"
- "github.com/langgenius/dify-plugin-daemon/pkg/entities/plugin_entities"
- )
- const (
- PLUGIN_SERVERLESS_CACHE_KEY = "serverless:runtime:%s"
- )
- func (p *PluginManager) getServerlessRuntimeCacheKey(
- identity plugin_entities.PluginUniqueIdentifier,
- ) string {
- return fmt.Sprintf(PLUGIN_SERVERLESS_CACHE_KEY, identity.String())
- }
- func (p *PluginManager) getServerlessPluginRuntime(
- identity plugin_entities.PluginUniqueIdentifier,
- ) (plugin_entities.PluginLifetime, error) {
- model, err := p.getServerlessPluginRuntimeModel(identity)
- if err != nil {
- return nil, err
- }
- // FIXME: get declaration
- declaration, err := helper.CombinedGetPluginDeclaration(identity, plugin_entities.PLUGIN_RUNTIME_TYPE_SERVERLESS)
- if err != nil {
- return nil, err
- }
- // init runtime entity
- runtimeEntity := plugin_entities.PluginRuntime{
- Config: *declaration,
- }
- runtimeEntity.InitState()
- // convert to plugin runtime
- pluginRuntime := serverless_runtime.AWSPluginRuntime{
- BasicChecksum: basic_runtime.BasicChecksum{
- MediaTransport: basic_runtime.NewMediaTransport(p.mediaBucket),
- InnerChecksum: model.Checksum,
- },
- PluginRuntime: runtimeEntity,
- LambdaURL: model.FunctionURL,
- LambdaName: model.FunctionName,
- }
- if err := pluginRuntime.InitEnvironment(); err != nil {
- return nil, err
- }
- return &pluginRuntime, nil
- }
- func (p *PluginManager) getServerlessPluginRuntimeModel(
- identity plugin_entities.PluginUniqueIdentifier,
- ) (*models.ServerlessRuntime, error) {
- // check if plugin is a serverless runtime
- runtime, err := cache.Get[models.ServerlessRuntime](
- p.getServerlessRuntimeCacheKey(identity),
- )
- if err != nil && err != cache.ErrNotFound {
- return nil, fmt.Errorf("unexpected error occurred during fetch serverless runtime cache: %v", err)
- }
- if err == cache.ErrNotFound {
- runtimeModel, err := db.GetOne[models.ServerlessRuntime](
- db.Equal("plugin_unique_identifier", identity.String()),
- )
- if err == db.ErrDatabaseNotFound {
- return nil, fmt.Errorf("plugin serverless runtime not found: %s", identity.String())
- }
- if err != nil {
- return nil, fmt.Errorf("failed to load serverless runtime from db: %v", err)
- }
- cache.Store(p.getServerlessRuntimeCacheKey(identity), runtimeModel, time.Minute*30)
- runtime = &runtimeModel
- } else if err != nil {
- return nil, fmt.Errorf("failed to load serverless runtime from cache: %v", err)
- }
- return runtime, nil
- }
|