Files
dify-plugin-daemon/pkg/entities/plugin_entities/tool_declaration_test.go
Yeuoly 878edde455 feat(datasource): Implement datasource validation and invocation steps (#295)
* feat(datasource): Implement datasource validation and invocation steps

- Added new functionality for validating datasource credentials and invoking the first and second steps of the datasource process.
- Introduced new API endpoints for datasource operations in the HTTP server.
- Created corresponding service and controller methods to handle datasource requests.
- Defined new request and response structures for datasource operations in the entities package.

* feat: add routes

* feat(datasource): Add initial datasource models and validation

- Introduced new `DatasourceInstallation` model to represent datasource installations with relevant fields.
- Created `datasource.go` file for future datasource service implementation.
- Enhanced `datasource_declaration.go` with new types and validation functions for datasource provider and parameters.
- Updated `plugin_declaration.go` to include datasource support in plugin structures.
- Refactored `agent_declaration.go` and `tool_declaration.go` to use a unified `ParameterOption` type for options.

* refactor(datasource): Update request and response types for online document content retrieval

- Renamed and updated request and response types for the `DatasourceGetOnlineDocumentPageContent` function to improve clarity and consistency.
- Introduced `RequestInvokeOnlineDocumentDatasourceGetContent` and `DatasourceInvokeOnlineDocumentGetContentResponse` types.
- Adjusted related function signatures and dispatchers to reflect the new types across the datasource service and controller implementations.

* feat(datasource): Implement datasource installation handling

- Added functionality to create and update `DatasourceInstallation` records during plugin installation and upgrade processes.
- Enhanced the `InstallPlugin` function to create a new datasource installation if a datasource declaration is present.
- Updated the `UpgradePlugin` function to handle the deletion of the original datasource installation and creation of a new one if the datasource declaration changes.

* feat(datasource): Add datasource registration handling in plugin runtime

- Introduced handling for datasource declarations in the plugin runtime.
- Updated `RemotePluginRuntime` to track datasource registration status.
- Enhanced message processing to include validation and assignment of datasource declarations.

* feat(datasource): Implement datasource listing and retrieval endpoints

- Added `ListDatasources` and `GetDatasource` functions to the service layer for handling datasource queries.
- Created corresponding controller methods to process HTTP requests for listing and retrieving datasources.
- Implemented request validation for tenant ID, page, page size, plugin ID, and provider parameters.

* add datasource routes

* feat(datasource): Add icon remapping for datasource declarations

- Implemented functionality to remap icons for both the main datasource and its individual datasources within the plugin declaration.
- Enhanced error handling to provide clearer feedback when remapping fails.

* fix(datasource): update OAuthSchema validation to remove unnecessary 'dive' tag

- Modified the validation tag for OAuthSchema in DatasourceProviderDeclaration to simplify the validation process by removing the 'dive' requirement.

* feat(tests): add datasource declaration parsing and output

- Introduced a new main.go file for testing datasource declaration parsing.
- Implemented JSON unmarshalling for RemotePluginRegisterPayload and DatasourceProviderDeclaration.
- Added a sample datasource declaration for testing purposes.

* fix(plugin): improve error handling in UninstallPlugin and add datasource deletion

- Enhanced error handling to return a specific message when a plugin is not installed.
- Added functionality to delete the associated datasource installation during the uninstallation process.

* feat(datasource): add support for decoding datasource provider declaration

- Added custom JSON marshalling and unmarshalling methods to handle CredentialsSchema and Datasources more effectively.
- Improved error handling during YAML unmarshalling to support both object and array formats for CredentialsSchema.
- Ensured proper initialization of DatasourceFiles and Tags to prevent nil references.

* fix: provider type

* refactor(datasource): simplify JSON unmarshalling for CredentialsSchema

- Removed complex handling of CredentialsSchema in the UnmarshalJSON method, focusing on the Datasources field.
- Streamlined the code to improve readability and maintainability by eliminating unnecessary checks and logic related to CredentialsSchema.

* feat: streaming datasource

* feat: datasource

* feat: datasource

* feat:datasource

* feat:datasource

* feat:datasource

* feat: add redirect_uri field to OAuth request structs

* feat: add online driver file request and response structures

* feat: add online driver file request and response structures

* feat: add online_driver datasource type to validation

* feat: rename online driver to online drive and update related classes and methods :)

* refactor: rename OnlineDocumentPageChunk to DatasourceGetPagesResponse and update related references

* feat: update request types for online drive browsing and downloading

* feat: add metadata field to OAuthGetCredentialsResult

* feat: built-in json schema definations

* feat(plugin_entities): add built-in schema definitions and processing for datasource YAML

* test(plugin_entities): add unit tests for schema definitions and YAML processing

* refactor(plugin_entities): centralize built-in schema definitions and processing

* refactor(plugin_entities): remove unused properties from built-in schema definitions

* refactor(plugin_entities): built-in schema & new datasource structure

* refactor(plugin_entities): enhance schema processing with  checks and error handling

* refactor(plugin_entities): update validation for OnlineDriveBrowseFilesRequest prefix field to be optional

* refactor(json_schema): remove json schema definitions and validation

* fix(plugin_entities): remove output_schema validation tests

* feat: add rag tag

---------

Co-authored-by: Harry <xh001x@hotmail.com>
Co-authored-by: Dongyu Li <544104925@qq.com>
Co-authored-by: Novice <novice12185727@gmail.com>
2025-09-16 17:32:14 +08:00

1178 lines
22 KiB
Go

package plugin_entities
import (
"strings"
"testing"
"github.com/langgenius/dify-plugin-daemon/internal/utils/parser"
)
func TestFullFunctionToolProvider_Validate(t *testing.T) {
const json_data = `
{
"identity": {
"author": "author",
"name": "name",
"description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"icon": "icon",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"tags": [
"image",
"videos"
]
},
"credentials_schema": [
{
"name": "api_key",
"type": "secret-input",
"required": false,
"default": "default",
"label": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
},
"help": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
},
"url": "https://example.com",
"placeholder": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
}
}
],
"tools": [
{
"identity": {
"author": "author",
"name": "tool",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
}
},
"description": {
"human": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"llm": "description"
},
"parameters": [
{
"name": "parameter",
"type": "string",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"human_description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"form": "llm",
"required": true,
"default": "default",
"options": [
{
"value": "value",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
}
}
]
}
]
}
]
}
`
const yaml_data = `identity:
author: author
name: name
description:
en_US: description
zh_Hans: 描述
pt_BR: descrição
icon: icon
label:
en_US: label
zh_Hans: 标签
pt_BR: etiqueta
tags:
- image
- videos
credentials_schema:
- name: api_key
type: secret-input
required: false
default: default
label:
en_US: API Key
zh_Hans: API 密钥
pt_BR: Chave da API
help:
en_US: API Key
zh_Hans: API 密钥
pt_BR: Chave da API
url: https://example.com
placeholder:
en_US: API Key
zh_Hans: API 密钥
pt_BR: Chave da API
tools:
- identity:
author: author
name: tool
label:
en_US: label
zh_Hans: 标签
pt_BR: etiqueta
description:
human:
en_US: description
zh_Hans: 描述
pt_BR: descrição
llm: description
parameters:
- name: parameter
type: string
label:
en_US: label
zh_Hans: 标签
pt_BR: etiqueta
human_description:
en_US: description
zh_Hans: 描述
pt_BR: descrição
form: llm
required: true
default: default
options:
- value: value
label:
en_US: label
zh_Hans: 标签
pt_BR: etiqueta
`
jsonDeclaration, jsonErr := parser.UnmarshalJsonBytes[ToolProviderDeclaration]([]byte(json_data))
if jsonErr != nil {
t.Errorf("UnmarshalToolProviderConfiguration() error for JSON = %v", jsonErr)
return
}
if len(jsonDeclaration.CredentialsSchema) != 1 {
t.Errorf("UnmarshalToolProviderConfiguration() error for JSON: incorrect CredentialsSchema length")
return
}
yamlDeclaration, yamlErr := parser.UnmarshalYamlBytes[ToolProviderDeclaration]([]byte(yaml_data))
if yamlErr != nil {
t.Errorf("UnmarshalToolProviderConfiguration() error for YAML = %v", yamlErr)
return
}
if len(yamlDeclaration.CredentialsSchema) != 1 {
t.Errorf("UnmarshalToolProviderConfiguration() error for YAML: incorrect CredentialsSchema length")
return
}
}
func TestToolProviderWithMapCredentials_Validate(t *testing.T) {
const json_data = `
{
"identity": {
"author": "author",
"name": "name",
"description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"icon": "icon",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"tags": [
"image",
"videos"
]
},
"credentials_schema": {
"api_key": {
"type": "secret-input",
"required": false,
"default": "default",
"label": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
},
"help": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
},
"url": "https://example.com",
"placeholder": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
}
}
},
"tools": [
{
"identity": {
"author": "author",
"name": "tool",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
}
},
"description": {
"human": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"llm": "description"
},
"parameters": [
{
"name": "parameter",
"type": "string",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"human_description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"form": "llm",
"required": true,
"default": "default",
"options": [
{
"value": "value",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
}
}
]
}
]
}
]
}
`
const yaml_data = `identity:
author: author
name: name
description:
en_US: description
zh_Hans: 描述
pt_BR: descrição
icon: icon
label:
en_US: label
zh_Hans: 标签
pt_BR: etiqueta
tags:
- image
- videos
credentials_schema:
api_key:
type: secret-input
required: false
default: default
label:
en_US: API Key
zh_Hans: API 密钥
pt_BR: Chave da API
help:
en_US: API Key
zh_Hans: API 密钥
pt_BR: Chave da API
url: https://example.com
placeholder:
en_US: API Key
zh_Hans: API 密钥
pt_BR: Chave da API
tools:
- identity:
author: author
name: tool
label:
en_US: label
zh_Hans: 标签
pt_BR: etiqueta
description:
human:
en_US: description
zh_Hans: 描述
pt_BR: descrição
llm: description
parameters:
- name: parameter
type: string
label:
en_US: label
zh_Hans: 标签
pt_BR: etiqueta
human_description:
en_US: description
zh_Hans: 描述
pt_BR: descrição
form: llm
required: true
default: default
options:
- value: value
label:
en_US: label
zh_Hans: 标签
pt_BR: etiqueta
`
jsonDeclaration, jsonErr := parser.UnmarshalJsonBytes[ToolProviderDeclaration]([]byte(json_data))
if jsonErr != nil {
t.Errorf("UnmarshalToolProviderConfiguration() error for JSON = %v", jsonErr)
return
}
if len(jsonDeclaration.CredentialsSchema) != 1 {
t.Errorf("UnmarshalToolProviderConfiguration() error for JSON: incorrect CredentialsSchema length")
return
}
if len(jsonDeclaration.Tools) != 1 {
t.Errorf("UnmarshalToolProviderConfiguration() error for JSON: incorrect Tools length")
return
}
yamlDeclaration, yamlErr := parser.UnmarshalYamlBytes[ToolProviderDeclaration]([]byte(yaml_data))
if yamlErr != nil {
t.Errorf("UnmarshalToolProviderConfiguration() error for YAML = %v", yamlErr)
return
}
if len(yamlDeclaration.CredentialsSchema) != 1 {
t.Errorf("UnmarshalToolProviderConfiguration() error for YAML: incorrect CredentialsSchema length")
return
}
if len(yamlDeclaration.Tools) != 1 {
t.Errorf("UnmarshalToolProviderConfiguration() error for YAML: incorrect Tools length")
return
}
}
func TestWithoutAuthorToolProvider_Validate(t *testing.T) {
const data = `
{
"identity": {
"name": "name",
"description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"icon": "icon",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"tags": [
"image",
"videos"
]
},
"credentials_schema": [
{
"name": "api_key",
"type": "secret-input",
"required": false,
"default": "default",
"label": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
},
"help": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
},
"url": "https://example.com",
"placeholder": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
}
}
]
},
"tools": [
]
}
`
_, err := UnmarshalToolProviderDeclaration([]byte(data))
if err == nil {
t.Errorf("UnmarshalToolProviderConfiguration() error = %v, wantErr %v", err, true)
return
}
}
func TestWithoutNameToolProvider_Validate(t *testing.T) {
const data = `
{
"identity": {
"author": "author",
"description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"icon": "icon",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"tags": [
"image",
"videos"
]
},
"credentials_schema": [
{
"name": "api_key",
"type": "secret-input",
"type": "secret-input",
"required": false,
"default": "default",
"label": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
},
"help": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
},
"url": "https://example.com",
"placeholder": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
}
}
],
"tools": [
]
}
`
_, err := UnmarshalToolProviderDeclaration([]byte(data))
if err == nil {
t.Errorf("UnmarshalToolProviderConfiguration() error = %v, wantErr %v", err, true)
return
}
}
func TestWithoutDescriptionToolProvider_Validate(t *testing.T) {
const data = `
{
"identity": {
"author": "author",
"name": "name",
"icon": "icon",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"tags": [
"image",
"videos"
]
},
"credentials_schema": [
{
"name": "api_key",
"type": "secret-input",
"required": false,
"default": "default",
"label": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
},
"help": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
},
"url": "https://example.com",
"placeholder": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
}
}
],
"tools": [
]
}
`
_, err := UnmarshalToolProviderDeclaration([]byte(data))
if err == nil {
t.Errorf("UnmarshalToolProviderConfiguration() error = %v, wantErr %v", err, true)
return
}
}
func TestWrongCredentialTypeToolProvider_Validate(t *testing.T) {
const data = `
{
"identity": {
"author": "author",
"name": "name",
"description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"icon": "icon",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"tags": [
"image",
"videos"
]
},
"credentials_schema": [
{
"name": "api_key",
"type": "wrong",
"required": false,
"default": "default",
"label": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
},
"help": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
},
"url": "https://example.com",
"placeholder": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
}
}
],
"tools": [
]
}
`
_, err := UnmarshalToolProviderDeclaration([]byte(data))
if err == nil {
t.Errorf("UnmarshalToolProviderConfiguration() error = %v, wantErr %v", err, true)
return
}
}
func TestWrongIdentityTagsToolProvider_Validate(t *testing.T) {
const data = `
{
"identity": {
"author": "author",
"name": "name",
"description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"icon": "icon",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"tags": [
"wrong",
"videos"
]
},
"credentials_schema": [
{
"name": "api_key",
"type": "secret-input",
"required": false,
"default": "default",
"label": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
},
"help": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
},
"url": "https://example.com",
"placeholder": {
"en_US": "API Key",
"zh_Hans": "API 密钥",
"pt_BR": "Chave da API"
}
}
],
"tools": [
]
}
`
_, err := UnmarshalToolProviderDeclaration([]byte(data))
if err == nil {
t.Errorf("UnmarshalToolProviderConfiguration() error = %v, wantErr %v", err, true)
return
}
}
func TestWrongToolParameterTypeToolProvider_Validate(t *testing.T) {
const data = `
{
"identity": {
"author": "author",
"name": "name",
"description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"icon": "icon",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"tags": []
},
"credentials_schema": [],
"tools": [
{
"identity": {
"author": "author",
"name": "tool",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
}
},
"description": {
"human": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"llm": "description"
},
"parameters": [
{
"name": "parameter",
"type": "wrong",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"human_description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"form": "llm",
"required": true,
"default": "default",
"options": []
}
]
}
]
}
`
_, err := UnmarshalToolProviderDeclaration([]byte(data))
if err == nil {
t.Errorf("UnmarshalToolProviderConfiguration() error = %v, wantErr %v", err, true)
return
}
}
func TestWrongToolParameterFormToolProvider_Validate(t *testing.T) {
const data = `
{
"identity": {
"author": "author",
"name": "name",
"description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"icon": "icon",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"tags": []
},
"credentials_schema": [],
"tools": [
{
"identity": {
"author": "author",
"name": "tool",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
}
},
"description": {
"human": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"llm": "description"
},
"parameters": [
{
"name": "parameter",
"type": "string",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"human_description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"form": "wrong",
"required": true,
"default": "default",
"options": []
}
]
}
]
}
`
_, err := UnmarshalToolProviderDeclaration([]byte(data))
if err == nil {
t.Errorf("UnmarshalToolProviderConfiguration() error = %v, wantErr %v", err, true)
return
}
}
func TestJSONSchemaTypeToolProvider_Validate(t *testing.T) {
const data = `
{
"identity": {
"author": "author",
"name": "name",
"description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"icon": "icon",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"tags": []
},
"credentials_schema": [],
"tools": [
{
"identity": {
"author": "author",
"name": "tool",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
}
},
"description": {
"human": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"llm": "description"
},
"output_schema": {
"type": "object",
"properties": {
"name": {
"type": "string"
}
}
}
}
]
}
`
_, err := UnmarshalToolProviderDeclaration([]byte(data))
if err != nil {
t.Errorf("UnmarshalToolProviderConfiguration() error = %v, wantErr %v", err, true)
return
}
}
func TestWrongAppSelectorScopeToolProvider_Validate(t *testing.T) {
const data = `
{
"identity": {
"author": "author",
"name": "name",
"description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"icon": "icon",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"tags": []
},
"credentials_schema": [
{
"name": "api_key",
"type": "app-selector",
"scope": "wrong",
"required": false,
"default": null,
"label": {
"en_US": "app-selector",
"zh_Hans": "app-selector",
"pt_BR": "app-selector"
},
"help": {
"en_US": "app-selector",
"zh_Hans": "app-selector",
"pt_BR": "app-selector"
},
"url": "https://example.com",
"placeholder": {
"en_US": "app-selector",
"zh_Hans": "app-selector",
"pt_BR": "app-selector"
}
}
],
"tools": [
{
"identity": {
"author": "author",
"name": "tool",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
}
},
"description": {
"human": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"llm": "description"
},
"parameters": [
{
"name": "parameter-app-selector",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"human_description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"type": "app-selector",
"form": "llm",
"scope": "wrong",
"required": true,
"default": "default",
"options": []
}
]
}
]
}
`
_, err := UnmarshalToolProviderDeclaration([]byte(data))
if err == nil {
t.Errorf("UnmarshalToolProviderConfiguration() error = %v, wantErr %v", err, true)
return
}
str := err.Error()
if !strings.Contains(str, "is_scope") {
t.Errorf("UnmarshalToolProviderConfiguration() error = %v, wantErr %v", err, true)
return
}
if !strings.Contains(str, "ToolProviderDeclaration.Tools[0].Parameters[0].Scope") {
t.Errorf("UnmarshalToolProviderConfiguration() error = %v, wantErr %v", err, true)
return
}
}
func TestAppSelectorScopeToolProvider_Validate(t *testing.T) {
const data = `
{
"identity": {
"author": "author",
"name": "name",
"description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"icon": "icon",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"tags": []
},
"credentials_schema": [
{
"name": "app-selector",
"type": "app-selector",
"scope": "all",
"required": false,
"default": null,
"label": {
"en_US": "app-selector",
"zh_Hans": "app-selector",
"pt_BR": "app-selector"
},
"help": {
"en_US": "app-selector",
"zh_Hans": "app-selector",
"pt_BR": "app-selector"
},
"url": "https://example.com",
"placeholder": {
"en_US": "app-selector",
"zh_Hans": "app-selector",
"pt_BR": "app-selector"
}
}
],
"tools": [
{
"identity": {
"author": "author",
"name": "tool",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
}
},
"description": {
"human": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"llm": "description"
},
"parameters": [
{
"name": "parameter-app-selector",
"label": {
"en_US": "label",
"zh_Hans": "标签",
"pt_BR": "etiqueta"
},
"human_description": {
"en_US": "description",
"zh_Hans": "描述",
"pt_BR": "descrição"
},
"type": "app-selector",
"form": "llm",
"scope": "all",
"required": true,
"default": "default",
"options": []
}
]
}
]
}
`
_, err := UnmarshalToolProviderDeclaration([]byte(data))
if err != nil {
t.Errorf("UnmarshalToolProviderConfiguration() error = %v, wantErr %v", err, true)
return
}
}
func TestParameterScope_Validate(t *testing.T) {
config := ToolParameter{
Name: "test",
Type: TOOL_PARAMETER_TYPE_MODEL_SELECTOR,
Scope: parser.ToPtr("llm& document&tool-call"),
Required: true,
Label: I18nObject{
ZhHans: "模型",
EnUS: "Model",
},
HumanDescription: I18nObject{
ZhHans: "请选择模型",
EnUS: "Please select a model",
},
LLMDescription: "please select a model",
Form: TOOL_PARAMETER_FORM_FORM,
}
data := parser.MarshalJsonBytes(config)
if _, err := parser.UnmarshalJsonBytes[ToolParameter](data); err != nil {
t.Errorf("ParameterScope_Validate() error = %v", err)
}
}
func TestToolName_Validate(t *testing.T) {
data := parser.MarshalJsonBytes(ToolProviderIdentity{
Author: "author",
Name: "tool-name",
Description: I18nObject{
EnUS: "description",
ZhHans: "描述",
},
Icon: "icon",
Label: I18nObject{
EnUS: "label",
ZhHans: "标签",
},
})
if _, err := parser.UnmarshalJsonBytes[ToolProviderIdentity](data); err != nil {
t.Errorf("TestToolName_Validate() error = %v", err)
}
data = parser.MarshalJsonBytes(ToolProviderIdentity{
Author: "author",
Name: "tool AA",
Label: I18nObject{
EnUS: "label",
ZhHans: "标签",
},
})
if _, err := parser.UnmarshalJsonBytes[ToolProviderIdentity](data); err == nil {
t.Errorf("TestToolName_Validate() error = %v", err)
}
data = parser.MarshalJsonBytes(ToolIdentity{
Author: "author",
Name: "tool-name-123",
Label: I18nObject{
EnUS: "label",
ZhHans: "标签",
},
})
if _, err := parser.UnmarshalJsonBytes[ToolIdentity](data); err != nil {
t.Errorf("TestToolName_Validate() error = %v", err)
}
data = parser.MarshalJsonBytes(ToolIdentity{
Author: "author",
Name: "tool name-123",
Label: I18nObject{
EnUS: "label",
ZhHans: "标签",
},
})
if _, err := parser.UnmarshalJsonBytes[ToolIdentity](data); err == nil {
t.Errorf("TestToolName_Validate() error = %v", err)
}
}