mirror of
https://github.com/langgenius/dify-plugin-daemon.git
synced 2026-07-22 01:35:24 -04:00
888ad788bc
* refactor: introduce local plugin control panel and cleanup environment setup process * fix: args * refactor: new local runtime * temp: stash work for refactor on RemotePluginServer * refactor: unify local runtime lifetime and sperate init environment process * chore: add missing files * stash * refactor: local plugin lifetime control * refactor: complete installation process of control panel * refactor: adapt service layer to new controlpanel * refactor: pluginManager.Install * fix: add routine wrap to InstallServerless, avoid blocking main thread * feat: reinstall serverless runtime * chore: add comments to Reinstall and update confusing naming * refactor: unify install plugin service * refactor: add labels to debugging runtime * refactor: add getters to plugin manager * refactor: split install service to decode/install_task/install service * ??? * refactor: adapt controllers * refactor: session write * refactor: session runtime * Refine install task orchestration (#501) * refactor: installing task * refactor cluster management, decouple lifetime management and cluster * fix cli test command * fix: cleanup TODO comments and implement GracefulStop for instance * feat: add logger to control panel * fix: multiple nil references * refactor: better lifetime control * refactor: better cycle interval * fix(LocalPluginRuntime): prevent returning err when it's not error * fix: avoid adding empty PipExtraArgs * fix: missing errors in Environment init * fix: add truncateMessage to avoid db explosion * cleanup: better lifecycle management * fix: init status at the beginning of installation * optimize: GracefulStop for pluginInstance * refactor: tests * refactor: centralize routine labels (#504) * cleanup: RoutineKey * fix: init routine pool * fix: correctly handle cluster register error * fix: memory leak * fix: add \n to instance write * fix(installer.go): set success to true after succeed for defer func * refactor * fix: missing cwd in testutils * fix: scaleup default runtime nums to 1 when testing * fix: localruntime appconfig in testing module * Update internal/core/local_runtime/load_balancing.go Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * fix: more efficiency implement in installer_local.go * fix: returns after failing in onDebuggingRuntimeDisconnected * fix: returns after failing in onDebuggingRuntimeDisconnected * fix: splits tests * refactor: naming * refactor: manifest.VersionX * fix: adapt SetDefault to tests * fix: enforce use constants in DBType * fix: generate * fix: linter * cleanup tests * refactor: change package to * cleanup: useless codes * Update internal/cluster/plugin.go Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * cleanup * refactor: decouple connection_key management from debugging_time * refactor: confused naming * feat: recycle resources to adapt to https://github.com/langgenius/dify-plugin-daemon/pull/500 * refactor: confusing redirecting * fix: support get serverless runtime * fix: race condition in Launching * fix: avoid ManifestValidate in first step of debugging handshake * fix: adding ReleaseAllLocks to finalizers * wtf: what a beautiful code * refactor: rename Stream.Async to Stream.Process * fix: kill process if daed instance was detected * fix: correctly handle failures * fix: consistence of difference interfaces * fix: add stacktrace to panic * fix: only trigger once event * fix: ensure plugin runtime was shutdown * feat: cleanup install tasks * fix: add scale logs --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
185 lines
4.7 KiB
Go
185 lines
4.7 KiB
Go
package plugin_entities
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"github.com/langgenius/dify-plugin-daemon/pkg/utils/parser"
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
func parse_yaml_to_json(data []byte) ([]byte, error) {
|
|
var obj interface{}
|
|
err := yaml.Unmarshal(data, &obj)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
jsonData, err := json.Marshal(obj)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return jsonData, nil
|
|
}
|
|
|
|
func TestFullFunctionModelProvider_Validate(t *testing.T) {
|
|
const (
|
|
model_provider_template = `
|
|
provider: openai
|
|
label:
|
|
en_US: OpenAI
|
|
description:
|
|
en_US: Models provided by OpenAI, such as GPT-3.5-Turbo and GPT-4.
|
|
zh_Hans: OpenAI 提供的模型,例如 GPT-3.5-Turbo 和 GPT-4。
|
|
icon_small:
|
|
en_US: icon_s_en.svg
|
|
icon_large:
|
|
en_US: icon_l_en.svg
|
|
background: "#E5E7EB"
|
|
help:
|
|
title:
|
|
en_US: Get your API Key from OpenAI
|
|
zh_Hans: 从 OpenAI 获取 API Key
|
|
url:
|
|
en_US: https://platform.openai.com/account/api-keys
|
|
supported_model_types:
|
|
- llm
|
|
- text-embedding
|
|
- speech2text
|
|
- moderation
|
|
- tts
|
|
configurate_methods:
|
|
- predefined-model
|
|
- customizable-model
|
|
model_credential_schema:
|
|
model:
|
|
label:
|
|
en_US: Model Name
|
|
zh_Hans: 模型名称
|
|
placeholder:
|
|
en_US: Enter your model name
|
|
zh_Hans: 输入模型名称
|
|
credential_form_schemas:
|
|
- variable: openai_api_key
|
|
label:
|
|
en_US: API Key
|
|
type: secret-input
|
|
required: true
|
|
placeholder:
|
|
zh_Hans: 在此输入您的 API Key
|
|
en_US: Enter your API Key
|
|
- variable: openai_organization
|
|
label:
|
|
zh_Hans: 组织 ID
|
|
en_US: Organization
|
|
type: text-input
|
|
required: false
|
|
placeholder:
|
|
zh_Hans: 在此输入您的组织 ID
|
|
en_US: Enter your Organization ID
|
|
- variable: openai_api_base
|
|
label:
|
|
zh_Hans: API Base
|
|
en_US: API Base
|
|
type: text-input
|
|
required: false
|
|
placeholder:
|
|
zh_Hans: 在此输入您的 API Base
|
|
en_US: Enter your API Base
|
|
provider_credential_schema:
|
|
credential_form_schemas:
|
|
- variable: openai_api_key
|
|
label:
|
|
en_US: API Key
|
|
type: secret-input
|
|
required: true
|
|
placeholder:
|
|
zh_Hans: 在此输入您的 API Key
|
|
en_US: Enter your API Key
|
|
- variable: openai_organization
|
|
label:
|
|
zh_Hans: 组织 ID
|
|
en_US: Organization
|
|
type: text-input
|
|
required: false
|
|
placeholder:
|
|
zh_Hans: 在此输入您的组织 ID
|
|
en_US: Enter your Organization ID
|
|
- variable: openai_api_base
|
|
label:
|
|
zh_Hans: API Base
|
|
en_US: API Base
|
|
type: text-input
|
|
required: false
|
|
placeholder:
|
|
zh_Hans: 在此输入您的 API Base, 如:https://api.openai.com
|
|
en_US: Enter your API Base, e.g. https://api.openai.com
|
|
`
|
|
)
|
|
jsonData, err := parse_yaml_to_json([]byte(model_provider_template))
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
_, err = parser.UnmarshalYamlBytes[ModelProviderDeclaration](jsonData)
|
|
if err != nil {
|
|
t.Errorf("UnmarshalModelProviderConfiguration() error = %v", err)
|
|
}
|
|
}
|
|
|
|
func TestModelParameterRule_UseTemplateYAML(t *testing.T) {
|
|
const (
|
|
model_parameter_rule_template = `
|
|
name: temperature
|
|
use_template: temperature
|
|
`
|
|
)
|
|
|
|
yamlData := []byte(model_parameter_rule_template)
|
|
|
|
model, err := parser.UnmarshalYamlBytes[ModelParameterRule](yamlData)
|
|
if err != nil {
|
|
t.Errorf("UnmarshalModelParameterRule() error = %v", err)
|
|
return
|
|
}
|
|
|
|
if model.Type == nil {
|
|
t.Errorf("UnmarshalModelParameterRule() error = %v", err)
|
|
return
|
|
}
|
|
|
|
if *model.Type != PARAMETER_TYPE_FLOAT {
|
|
t.Errorf("UnmarshalModelParameterRule() error = %v", err)
|
|
}
|
|
|
|
if model.Min == nil || model.Max == nil || model.Precision == nil {
|
|
t.Errorf("Missing default value")
|
|
}
|
|
}
|
|
|
|
func TestModelParameterRule_UseTemplateJSON(t *testing.T) {
|
|
const (
|
|
model_parameter_rule_template = `{"name": "temperature", "use_template": "temperature"}`
|
|
)
|
|
|
|
jsonData := []byte(model_parameter_rule_template)
|
|
|
|
model, err := parser.UnmarshalJsonBytes[ModelParameterRule](jsonData)
|
|
if err != nil {
|
|
t.Errorf("UnmarshalModelParameterRule() error = %v", err)
|
|
}
|
|
|
|
if model.Type == nil {
|
|
t.Errorf("UnmarshalModelParameterRule() error = %v", err)
|
|
}
|
|
|
|
if *model.Type != PARAMETER_TYPE_FLOAT {
|
|
t.Errorf("UnmarshalModelParameterRule() error = %v", err)
|
|
}
|
|
|
|
if model.Min == nil || model.Max == nil || model.Precision == nil {
|
|
t.Errorf("Missing default value")
|
|
}
|
|
}
|