mirror of
https://github.com/danielmiessler/Fabric.git
synced 2026-01-09 14:28:01 -05:00
### CHANGES - Introduce `cmd` directory for all main application binaries. - Move all Go packages into the `internal` directory. - Rename the `restapi` package to `server` for clarity. - Consolidate patterns and strategies into a new `data` directory. - Group all auxiliary scripts into a new `scripts` directory. - Move all documentation and images into a `docs` directory. - Update all Go import paths to reflect the new structure. - Adjust CI/CD workflows and build commands for new layout.
133 lines
4.5 KiB
Go
133 lines
4.5 KiB
Go
package chat
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
)
|
|
|
|
const (
|
|
ChatMessageRoleSystem = "system"
|
|
ChatMessageRoleUser = "user"
|
|
ChatMessageRoleAssistant = "assistant"
|
|
ChatMessageRoleFunction = "function"
|
|
ChatMessageRoleTool = "tool"
|
|
ChatMessageRoleDeveloper = "developer"
|
|
)
|
|
|
|
var ErrContentFieldsMisused = errors.New("can't use both Content and MultiContent properties simultaneously")
|
|
|
|
type ChatMessagePartType string
|
|
|
|
const (
|
|
ChatMessagePartTypeText ChatMessagePartType = "text"
|
|
ChatMessagePartTypeImageURL ChatMessagePartType = "image_url"
|
|
)
|
|
|
|
type ChatMessageImageURL struct {
|
|
URL string `json:"url,omitempty"`
|
|
}
|
|
|
|
type ChatMessagePart struct {
|
|
Type ChatMessagePartType `json:"type,omitempty"`
|
|
Text string `json:"text,omitempty"`
|
|
ImageURL *ChatMessageImageURL `json:"image_url,omitempty"`
|
|
}
|
|
|
|
type FunctionCall struct {
|
|
Name string `json:"name,omitempty"`
|
|
Arguments string `json:"arguments,omitempty"`
|
|
}
|
|
|
|
type ToolType string
|
|
|
|
const (
|
|
ToolTypeFunction ToolType = "function"
|
|
)
|
|
|
|
type ToolCall struct {
|
|
Index *int `json:"index,omitempty"`
|
|
ID string `json:"id,omitempty"`
|
|
Type ToolType `json:"type"`
|
|
Function FunctionCall `json:"function"`
|
|
}
|
|
|
|
type ChatCompletionMessage struct {
|
|
Role string `json:"role"`
|
|
Content string `json:"content,omitempty"`
|
|
Refusal string `json:"refusal,omitempty"`
|
|
MultiContent []ChatMessagePart `json:"-"`
|
|
Name string `json:"name,omitempty"`
|
|
ReasoningContent string `json:"reasoning_content,omitempty"`
|
|
FunctionCall *FunctionCall `json:"function_call,omitempty"`
|
|
ToolCalls []ToolCall `json:"tool_calls,omitempty"`
|
|
ToolCallID string `json:"tool_call_id,omitempty"`
|
|
}
|
|
|
|
func (m ChatCompletionMessage) MarshalJSON() ([]byte, error) {
|
|
if m.Content != "" && m.MultiContent != nil {
|
|
return nil, ErrContentFieldsMisused
|
|
}
|
|
if len(m.MultiContent) > 0 {
|
|
msg := struct {
|
|
Role string `json:"role"`
|
|
Content string `json:"-"`
|
|
Refusal string `json:"refusal,omitempty"`
|
|
MultiContent []ChatMessagePart `json:"content,omitempty"`
|
|
Name string `json:"name,omitempty"`
|
|
ReasoningContent string `json:"reasoning_content,omitempty"`
|
|
FunctionCall *FunctionCall `json:"function_call,omitempty"`
|
|
ToolCalls []ToolCall `json:"tool_calls,omitempty"`
|
|
ToolCallID string `json:"tool_call_id,omitempty"`
|
|
}(m)
|
|
return json.Marshal(msg)
|
|
}
|
|
|
|
msg := struct {
|
|
Role string `json:"role"`
|
|
Content string `json:"content,omitempty"`
|
|
Refusal string `json:"refusal,omitempty"`
|
|
MultiContent []ChatMessagePart `json:"-"`
|
|
Name string `json:"name,omitempty"`
|
|
ReasoningContent string `json:"reasoning_content,omitempty"`
|
|
FunctionCall *FunctionCall `json:"function_call,omitempty"`
|
|
ToolCalls []ToolCall `json:"tool_calls,omitempty"`
|
|
ToolCallID string `json:"tool_call_id,omitempty"`
|
|
}(m)
|
|
return json.Marshal(msg)
|
|
}
|
|
|
|
func (m *ChatCompletionMessage) UnmarshalJSON(bs []byte) error {
|
|
msg := struct {
|
|
Role string `json:"role"`
|
|
Content string `json:"content"`
|
|
Refusal string `json:"refusal,omitempty"`
|
|
MultiContent []ChatMessagePart
|
|
Name string `json:"name,omitempty"`
|
|
ReasoningContent string `json:"reasoning_content,omitempty"`
|
|
FunctionCall *FunctionCall `json:"function_call,omitempty"`
|
|
ToolCalls []ToolCall `json:"tool_calls,omitempty"`
|
|
ToolCallID string `json:"tool_call_id,omitempty"`
|
|
}{}
|
|
|
|
if err := json.Unmarshal(bs, &msg); err == nil {
|
|
*m = ChatCompletionMessage(msg)
|
|
return nil
|
|
}
|
|
multiMsg := struct {
|
|
Role string `json:"role"`
|
|
Content string
|
|
Refusal string `json:"refusal,omitempty"`
|
|
MultiContent []ChatMessagePart `json:"content"`
|
|
Name string `json:"name,omitempty"`
|
|
ReasoningContent string `json:"reasoning_content,omitempty"`
|
|
FunctionCall *FunctionCall `json:"function_call,omitempty"`
|
|
ToolCalls []ToolCall `json:"tool_calls,omitempty"`
|
|
ToolCallID string `json:"tool_call_id,omitempty"`
|
|
}{}
|
|
if err := json.Unmarshal(bs, &multiMsg); err != nil {
|
|
return err
|
|
}
|
|
*m = ChatCompletionMessage(multiMsg)
|
|
return nil
|
|
}
|