81 lines
1.7 KiB
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
|
|
}
|