Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
191 lines
7.1 KiB
Go
191 lines
7.1 KiB
Go
package api
|
|
|
|
import (
|
|
"strings"
|
|
|
|
tuttigenerated "github.com/tutti-os/tutti/services/tuttid/api/generated"
|
|
agentservice "github.com/tutti-os/tutti/services/tuttid/service/agent"
|
|
)
|
|
|
|
func generatedAgentProviderSkillOptions(options []agentservice.ComposerSkillOption) []tuttigenerated.AgentProviderSkillOption {
|
|
if len(options) == 0 {
|
|
return []tuttigenerated.AgentProviderSkillOption{}
|
|
}
|
|
result := make([]tuttigenerated.AgentProviderSkillOption, 0, len(options))
|
|
for _, option := range options {
|
|
name := strings.TrimSpace(option.Name)
|
|
trigger := strings.TrimSpace(option.Trigger)
|
|
sourceKind := strings.TrimSpace(option.SourceKind)
|
|
if name == "" || trigger == "" || sourceKind == "" {
|
|
continue
|
|
}
|
|
generated := tuttigenerated.AgentProviderSkillOption{
|
|
Name: name,
|
|
Trigger: trigger,
|
|
SourceKind: tuttigenerated.AgentProviderSkillOptionSourceKind(sourceKind),
|
|
}
|
|
if description := strings.TrimSpace(option.Description); description != "" {
|
|
generated.Description = optionalStringPointer(description)
|
|
}
|
|
if pluginName := strings.TrimSpace(option.PluginName); pluginName != "" {
|
|
generated.PluginName = optionalStringPointer(pluginName)
|
|
}
|
|
if path := strings.TrimSpace(option.Path); path != "" {
|
|
generated.Path = optionalStringPointer(path)
|
|
}
|
|
result = append(result, generated)
|
|
}
|
|
return result
|
|
}
|
|
|
|
func generatedAgentProviderCapabilityOptions(options []agentservice.ComposerCapabilityOption) []tuttigenerated.AgentProviderCapabilityOption {
|
|
if len(options) == 0 {
|
|
return []tuttigenerated.AgentProviderCapabilityOption{}
|
|
}
|
|
result := make([]tuttigenerated.AgentProviderCapabilityOption, 0, len(options))
|
|
for _, option := range options {
|
|
id := strings.TrimSpace(option.ID)
|
|
kind := strings.TrimSpace(option.Kind)
|
|
name := strings.TrimSpace(option.Name)
|
|
label := strings.TrimSpace(option.Label)
|
|
status := strings.TrimSpace(option.Status)
|
|
invocation := strings.TrimSpace(option.Invocation)
|
|
if id == "" || kind == "" || name == "" || label == "" || status == "" || invocation == "" {
|
|
continue
|
|
}
|
|
generated := tuttigenerated.AgentProviderCapabilityOption{
|
|
Id: id,
|
|
Kind: tuttigenerated.AgentProviderCapabilityOptionKind(kind),
|
|
Name: name,
|
|
Label: label,
|
|
Status: tuttigenerated.AgentProviderCapabilityOptionStatus(status),
|
|
Invocation: tuttigenerated.AgentProviderCapabilityOptionInvocation(invocation),
|
|
}
|
|
if description := strings.TrimSpace(option.Description); description != "" {
|
|
generated.Description = optionalStringPointer(description)
|
|
}
|
|
if iconURL := strings.TrimSpace(option.IconURL); iconURL != "" {
|
|
generated.IconUrl = optionalStringPointer(iconURL)
|
|
}
|
|
if option.InstalledAtUnixMS > 0 {
|
|
generated.InstalledAtUnixMs = &option.InstalledAtUnixMS
|
|
}
|
|
if source := strings.TrimSpace(option.Source); source != "" {
|
|
generated.Source = optionalStringPointer(source)
|
|
}
|
|
if pluginName := strings.TrimSpace(option.PluginName); pluginName != "" {
|
|
generated.PluginName = optionalStringPointer(pluginName)
|
|
}
|
|
if serverName := strings.TrimSpace(option.ServerName); serverName != "" {
|
|
generated.ServerName = optionalStringPointer(serverName)
|
|
}
|
|
if toolName := strings.TrimSpace(option.ToolName); toolName != "" {
|
|
generated.ToolName = optionalStringPointer(toolName)
|
|
}
|
|
if trigger := strings.TrimSpace(option.Trigger); trigger != "" {
|
|
generated.Trigger = optionalStringPointer(trigger)
|
|
}
|
|
if path := strings.TrimSpace(option.Path); path != "" {
|
|
generated.Path = optionalStringPointer(path)
|
|
}
|
|
result = append(result, generated)
|
|
}
|
|
return result
|
|
}
|
|
|
|
func generatedAgentProviderComposerCommands(options []agentservice.ComposerCommandOption) []tuttigenerated.AgentProviderComposerCommandOption {
|
|
result := make([]tuttigenerated.AgentProviderComposerCommandOption, 0, len(options))
|
|
for _, option := range options {
|
|
name := strings.TrimSpace(option.Name)
|
|
if name == "" {
|
|
continue
|
|
}
|
|
generated := tuttigenerated.AgentProviderComposerCommandOption{Name: name}
|
|
if description := strings.TrimSpace(option.Description); description != "" {
|
|
generated.Description = optionalStringPointer(description)
|
|
}
|
|
if inputHint := strings.TrimSpace(option.InputHint); inputHint != "" {
|
|
generated.InputHint = optionalStringPointer(inputHint)
|
|
}
|
|
result = append(result, generated)
|
|
}
|
|
return result
|
|
}
|
|
|
|
func generatedAgentProviderComposerReasoningOptionsByModel(
|
|
profiles map[string]agentservice.ComposerReasoningProfile,
|
|
) tuttigenerated.AgentProviderComposerReasoningOptionsByModel {
|
|
result := make(tuttigenerated.AgentProviderComposerReasoningOptionsByModel, len(profiles))
|
|
for model, profile := range profiles {
|
|
model = strings.TrimSpace(model)
|
|
if model == "" {
|
|
continue
|
|
}
|
|
generated := tuttigenerated.AgentProviderComposerReasoningProfile{
|
|
Options: generatedComposerConfigOption(agentservice.ComposerConfigOption{
|
|
Options: profile.Options,
|
|
}).Options,
|
|
}
|
|
if defaultValue := strings.TrimSpace(profile.DefaultValue); defaultValue != "" {
|
|
generated.DefaultValue = optionalStringPointer(defaultValue)
|
|
}
|
|
result[model] = generated
|
|
}
|
|
return result
|
|
}
|
|
|
|
// generatedComposerConfigOptionPointer projects an optional composer config
|
|
// (the orthogonal speed dimension) and omits it entirely for providers that do
|
|
// not expose it, so the GUI hides the control.
|
|
func generatedComposerConfigOptionPointer(config agentservice.ComposerConfigOption) *tuttigenerated.AgentProviderComposerConfig {
|
|
if !config.Configurable && len(config.Options) == 0 {
|
|
return nil
|
|
}
|
|
generated := generatedComposerConfigOption(config)
|
|
return &generated
|
|
}
|
|
|
|
func generatedComposerConfigOption(config agentservice.ComposerConfigOption) tuttigenerated.AgentProviderComposerConfig {
|
|
result := tuttigenerated.AgentProviderComposerConfig{
|
|
Configurable: config.Configurable,
|
|
Options: make([]tuttigenerated.AgentProviderComposerConfigOptionValue, 0, len(config.Options)),
|
|
}
|
|
if strings.TrimSpace(config.CurrentValue) != "" {
|
|
result.CurrentValue = optionalStringPointer(config.CurrentValue)
|
|
}
|
|
if strings.TrimSpace(config.EffectiveValue) != "" {
|
|
result.EffectiveValue = optionalStringPointer(config.EffectiveValue)
|
|
}
|
|
if strings.TrimSpace(config.DefaultValue) != "" {
|
|
result.DefaultValue = optionalStringPointer(config.DefaultValue)
|
|
}
|
|
for _, option := range config.Options {
|
|
value := strings.TrimSpace(option.Value)
|
|
id := strings.TrimSpace(option.ID)
|
|
label := strings.TrimSpace(option.Label)
|
|
if value == "" || id == "" || label == "" {
|
|
continue
|
|
}
|
|
resultOption := tuttigenerated.AgentProviderComposerConfigOptionValue{
|
|
Id: id,
|
|
Label: label,
|
|
Value: value,
|
|
}
|
|
if strings.TrimSpace(option.Description) != "" {
|
|
resultOption.Description = optionalStringPointer(option.Description)
|
|
}
|
|
if strings.TrimSpace(option.ConsumptionMultiplier) != "" {
|
|
resultOption.ConsumptionMultiplier = optionalStringPointer(option.ConsumptionMultiplier)
|
|
}
|
|
if option.SupportsImageInput != nil {
|
|
resultOption.SupportsImageInput = option.SupportsImageInput
|
|
}
|
|
if option.Requested {
|
|
requested := true
|
|
resultOption.Requested = &requested
|
|
}
|
|
result.Options = append(result.Options, resultOption)
|
|
}
|
|
return result
|
|
}
|