This repository has been archived on 2026-08-16. You can view files and clone it, but cannot push or open issues or pull requests.
ollie-core/tools/schema.go

97 lines
2.4 KiB
Go

package tools
import (
"encoding/json"
"strings"
)
type ToolMeta struct {
ReadOnly bool `json:"readOnly,omitempty"`
RequiresApproval bool `json:"requiresApproval,omitempty"`
NetworkAccess bool `json:"networkAccess,omitempty"`
PathScope string `json:"pathScope,omitempty"`
SandboxLevel string `json:"sandboxLevel,omitempty"`
Examples []string `json:"examples,omitempty"`
Tags []string `json:"tags,omitempty"`
}
func ExtractArgsSchema(script string) json.RawMessage {
for _, line := range strings.Split(script, "\n") {
trimmed := strings.TrimSpace(line)
if strings.HasPrefix(trimmed, "# args_json:") {
schema := strings.TrimSpace(strings.TrimPrefix(trimmed, "# args_json:"))
if schema != "" {
return json.RawMessage(schema)
}
}
}
return nil
}
func ExtractReturnSchema(script string) json.RawMessage {
for _, line := range strings.Split(script, "\n") {
trimmed := strings.TrimSpace(line)
if strings.HasPrefix(trimmed, "# returns_json:") {
schema := strings.TrimSpace(strings.TrimPrefix(trimmed, "# returns_json:"))
if schema != "" {
return json.RawMessage(schema)
}
}
}
return nil
}
func ExtractTier(script string) string {
for _, line := range strings.Split(script, "\n") {
idx := strings.Index(line, "ollie:tier")
if idx < 0 {
continue
}
rest := strings.TrimSpace(line[idx+len("ollie:tier"):])
switch {
case rest == "cold" || strings.HasPrefix(rest, "cold "):
return "cold"
case rest == "warm" || strings.HasPrefix(rest, "warm "):
return "warm"
case rest == "hot" || strings.HasPrefix(rest, "hot "):
return "hot"
}
}
return ""
}
func ExtractMetadata(script string) ToolMeta {
var meta ToolMeta
for _, line := range strings.Split(script, "\n") {
trimmed := strings.TrimSpace(line)
if strings.Contains(trimmed, "ollie:parallel read") {
meta.ReadOnly = true
}
}
return meta
}
func ParseToolInfo(name, script string) ToolInfo {
prompt := ExtractPrompt(script)
desc := ExtractShortDescription(prompt)
argsSchema := ExtractArgsSchema(script)
if argsSchema == nil {
argsSchema = json.RawMessage(`{"type":"object","properties":{}}`)
}
meta := ExtractMetadata(script)
tier := ExtractTier(script)
if tier == "" {
tier = "hot"
}
return ToolInfo{
Name: name,
Description: desc,
InputSchema: argsSchema,
Prompt: prompt,
Tier: tier,
ReadOnly: meta.ReadOnly,
}
}