|
|
package schema |
|
|
|
|
|
import ( |
|
|
"encoding/json" |
|
|
|
|
|
"github.com/mudler/xlog" |
|
|
|
|
|
"github.com/mudler/LocalAI/pkg/grpc/proto" |
|
|
) |
|
|
|
|
|
type Message struct { |
|
|
|
|
|
Role string `json:"role,omitempty" yaml:"role"` |
|
|
|
|
|
|
|
|
Name string `json:"name,omitempty" yaml:"name"` |
|
|
|
|
|
|
|
|
Content interface{} `json:"content" yaml:"content"` |
|
|
|
|
|
StringContent string `json:"string_content,omitempty" yaml:"string_content,omitempty"` |
|
|
StringImages []string `json:"string_images,omitempty" yaml:"string_images,omitempty"` |
|
|
StringVideos []string `json:"string_videos,omitempty" yaml:"string_videos,omitempty"` |
|
|
StringAudios []string `json:"string_audios,omitempty" yaml:"string_audios,omitempty"` |
|
|
|
|
|
|
|
|
FunctionCall interface{} `json:"function_call,omitempty" yaml:"function_call,omitempty"` |
|
|
|
|
|
ToolCalls []ToolCall `json:"tool_calls,omitempty" yaml:"tool_call,omitempty"` |
|
|
|
|
|
|
|
|
Reasoning *string `json:"reasoning,omitempty" yaml:"reasoning,omitempty"` |
|
|
} |
|
|
|
|
|
type ToolCall struct { |
|
|
Index int `json:"index"` |
|
|
ID string `json:"id"` |
|
|
Type string `json:"type"` |
|
|
FunctionCall FunctionCall `json:"function"` |
|
|
} |
|
|
|
|
|
type FunctionCall struct { |
|
|
Name string `json:"name,omitempty"` |
|
|
Arguments string `json:"arguments"` |
|
|
} |
|
|
|
|
|
type Messages []Message |
|
|
|
|
|
|
|
|
|
|
|
func (messages Messages) ToProto() []*proto.Message { |
|
|
protoMessages := make([]*proto.Message, len(messages)) |
|
|
for i, message := range messages { |
|
|
protoMessages[i] = &proto.Message{ |
|
|
Role: message.Role, |
|
|
Name: message.Name, |
|
|
} |
|
|
|
|
|
switch ct := message.Content.(type) { |
|
|
case string: |
|
|
protoMessages[i].Content = ct |
|
|
case []interface{}: |
|
|
|
|
|
data, _ := json.Marshal(ct) |
|
|
resultData := []struct { |
|
|
Text string `json:"text"` |
|
|
}{} |
|
|
json.Unmarshal(data, &resultData) |
|
|
for _, r := range resultData { |
|
|
protoMessages[i].Content += r.Text |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if len(message.ToolCalls) > 0 { |
|
|
toolCallsJSON, err := json.Marshal(message.ToolCalls) |
|
|
if err != nil { |
|
|
xlog.Warn("failed to marshal tool_calls to JSON", "error", err) |
|
|
} else { |
|
|
protoMessages[i].ToolCalls = string(toolCallsJSON) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
return protoMessages |
|
|
} |
|
|
|