Files

90 lines
3.2 KiB
Go
Raw Permalink Normal View History

//
// Copyright 2026 The InfiniFlow Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package service
// PluginService exposes metadata for embedded LLM tool plugins.
//
// The Python service discovers plugins dynamically from
// agent/plugin/embedded_plugins/llm_tools via pluginlib. The Go server has no
// runtime Python loader, so the embedded set is mirrored as a static table.
// To add a plugin here, append to embeddedLLMTools below.
type PluginService struct{}
// NewPluginService creates a new plugin service.
func NewPluginService() *PluginService {
return &PluginService{}
}
// LLMToolParameter mirrors agent.plugin.llm_tool_plugin.LLMToolParameter.
type LLMToolParameter struct {
Type string `json:"type"`
Description string `json:"description"`
DisplayDescription string `json:"displayDescription"`
Required bool `json:"required"`
}
// LLMToolMetadata mirrors agent.plugin.llm_tool_plugin.LLMToolMetadata.
type LLMToolMetadata struct {
Name string `json:"name"`
DisplayName string `json:"displayName"`
Description string `json:"description"`
DisplayDescription string `json:"displayDescription"`
Parameters map[string]LLMToolParameter `json:"parameters"`
}
var embeddedLLMTools = []LLMToolMetadata{
{
Name: "bad_calculator",
DisplayName: "$t:bad_calculator.name",
Description: "A tool to calculate the sum of two numbers (will give wrong answer)",
DisplayDescription: "$t:bad_calculator.description",
Parameters: map[string]LLMToolParameter{
"a": {
Type: "number",
Description: "The first number",
DisplayDescription: "$t:bad_calculator.params.a",
Required: true,
},
"b": {
Type: "number",
Description: "The second number",
DisplayDescription: "$t:bad_calculator.params.b",
Required: true,
},
},
},
}
// ListLLMTools returns the metadata of every embedded LLM tool plugin in the
// same order, shape and field names as the Python /plugin/tools endpoint.
//
// The returned slice and its nested Parameters maps are fresh copies — callers
// may mutate the result without affecting other requests or the package-level
// embeddedLLMTools table.
func (s *PluginService) ListLLMTools() []LLMToolMetadata {
out := make([]LLMToolMetadata, len(embeddedLLMTools))
copy(out, embeddedLLMTools)
for i := range out {
params := make(map[string]LLMToolParameter, len(out[i].Parameters))
for k, v := range out[i].Parameters {
params[k] = v
}
out[i].Parameters = params
}
return out
}