iop/apps/node/internal/adapters/ollama/input.go

81 lines
1.7 KiB
Go

package ollama
import "strings"
func ollamaMessagesFromInput(input map[string]any) []ollamaMessage {
if raw, ok := input["messages"].([]any); ok {
out := make([]ollamaMessage, 0, len(raw))
for _, item := range raw {
m, ok := item.(map[string]any)
if !ok {
continue
}
role, _ := m["role"].(string)
content, _ := m["content"].(string)
thinking, _ := m["thinking"].(string)
toolName, _ := m["tool_name"].(string)
role = strings.TrimSpace(role)
content = strings.TrimSpace(content)
if role == "" || (content == "" && thinking == "") {
continue
}
out = append(out, ollamaMessage{
Role: role,
Content: content,
Thinking: thinking,
Images: anySlice(m["images"]),
ToolCalls: anySlice(m["tool_calls"]),
ToolName: toolName,
})
}
if len(out) > 0 {
return out
}
}
prompt := strings.TrimSpace(stringInput(input, "prompt"))
if prompt == "" {
return nil
}
return []ollamaMessage{{Role: "user", Content: prompt}}
}
func ollamaOptionsFromInput(input map[string]any, contextSize int) map[string]any {
options := map[string]any{}
if raw, ok := input["options"].(map[string]any); ok {
for k, v := range raw {
options[k] = v
}
}
if contextSize > 0 {
options["num_ctx"] = contextSize // Edge-owned: always overrides request
}
if len(options) == 0 {
return nil
}
return options
}
func anySlice(v any) []any {
if items, ok := v.([]any); ok {
return items
}
return nil
}
func stringInput(input map[string]any, key string) string {
if input == nil {
return ""
}
if v, ok := input[key].(string); ok {
return v
}
return ""
}
func countMessageWords(messages []ollamaMessage) int {
n := 0
for _, msg := range messages {
n += len(strings.Fields(msg.Content))
}
return n
}