diff --git a/chat.proto b/chat.proto index cfe6995..a8c98b2 100644 --- a/chat.proto +++ b/chat.proto @@ -2,63 +2,191 @@ syntax = "proto3"; package chatpb; -import "google/protobuf/timestamp.proto"; // Import the well-known type for Timestamp +import "google/protobuf/timestamp.proto"; +import "google/protobuf/struct.proto"; -message Row { // `autogenpb:nomutex` - repeated string fields = 1; +// Main request structure + +message GeminiRequest { // `autogenpb:marshal` `autogenpb:mutex` + string model = 1; + Config config = 2; + repeated Content contents = 3; } -message Table { // `autogenpb:nomutex` - int32 columns = 1; - repeated Row rows = 2; +// Abort signal for the request +message AbortSignal { +} + +message Schema { + string type = 1; + map properties = 2; + repeated string required = 3; + string description = 4; + Schema items = 5; + repeated string enum = 6; + int32 minimum = 7; + int32 minLength = 8; + int32 minItems = 9; + google.protobuf.Value default_value = 10 [json_name = "default"]; +} + +message FunctionDeclaration { + string name = 1; + string description = 2; + Schema parameters_json_schema = 3; +} + +message Tool { + repeated FunctionDeclaration functionDeclarations = 1; +} + +// Configuration for the request +message Config { + message ThinkingConfig { + bool includeThoughts = 1; + } + double temperature = 2; + double topP = 3; + string systemInstruction = 4; + ResponseJsonSchema responseJsonSchema = 5; + string responseMimeType = 6; + AbortSignal abort_signal = 7; + ThinkingConfig thinkingConfig = 8; + repeated Tool tools = 9; +} +// JSON schema for the response +message ResponseJsonSchema { + string type = 1; + Properties properties = 2; + repeated string required = 3; +} + +// Properties within the JSON schema +message Properties { + Reasoning reasoning = 1; + NextSpeaker next_speaker = 2; +} + +// Reasoning property +message Reasoning { + string type = 1; + string description = 2; +} + +// Next speaker property +message NextSpeaker { + string type = 1; + repeated string enum = 2; + string description = 3; +} + +// Content of the chat +message Content { + string role = 1; + repeated Part parts = 2; +} + +// Part of the content +message Part { + oneof part_type { + string text = 1; + FunctionCall functionCall = 2; + FunctionResponse functionResponse = 3; + } + string thoughtSignature = 4; +} +// Function call +message FunctionCall { + string name = 1; + argsInfo args = 3; +} + +message argsInfo { + string absolute_path = 1; + string description = 2; + string command = 3; + string new_string = 4; + string old_string = 5; + int32 expected_replacements = 6; + string file_path = 7; + string directory = 8; + string path = 9; + string thinkingConfig = 10; + string pattern = 11; + string content = 12; + string fact = 13; +} + +// Function response +message FunctionResponse { + string id = 1; + string name = 2; + Response response = 3; +} + +// Response from a function call +message Response { + string output = 1; + string error = 2; +} + +message Row { + repeated string fields = 1; +} + +message Table { + int32 columns = 1; + repeated Row rows = 2; } enum Who { - NOONE = 0; + NOONE = 0; REGEX = 1; USER = 2; } -// NEW: A message to hold all the details of a tool call -message ToolCall { // `autogenpb:nomutex` - string name = 1; // e.g., "Shell" - string input = 2; // The command that was run - string description = 3; // The description for the command - string output_stdout = 4; - string output_stderr = 5; - int32 exit_code = 6; +message ToolCall { + string name = 1; + string input = 2; + string description = 3; + string output_stdout = 4; + string output_stderr = 5; + int32 exit_code = 6; } -message CodeSnippet { // `autogenpb:nomutex` - string filename = 1; - string content = 2; +message CodeSnippet { + string filename = 1; + string content = 2; } -message ChatEntry { // `autogenpb:nomutex` - Who from = 1; - google.protobuf.Timestamp ctime = 2; - string content = 3; - Table table = 4; - repeated ToolCall ToolCalls = 5; - string ContentFile = 6; - string uuid = 7; // `autogenpb:unique` `autogenpb:sort` - repeated CodeSnippet Snippets = 8; +message ChatEntry { + Who from = 1; + google.protobuf.Timestamp ctime = 2; + string content = 3; + Table table = 4; + repeated ToolCall ToolCalls = 5; + string ContentFile = 6; + string uuid = 7; + repeated CodeSnippet Snippets = 8; + repeated Part parts = 9; + GeminiRequest GeminiRequest = 10; + int32 RequestCounter = 11; } -message SessionStats { // `autogenpb:nomutex` - string uuid = 1; +message SessionStats { + string uuid = 1; } -message Chat { // `autogenpb:nomutex` - string uuid = 1; // `autogenpb:unique` `autogenpb:sort` - google.protobuf.Timestamp ctime = 2; - string ChatName = 3; - repeated ChatEntry Entries = 4; - repeated SessionStats Session = 5; +message Chat { + string uuid = 1; // `autogenpb:unique` `autogenpb:sort` + google.protobuf.Timestamp ctime = 2; + string ChatName = 3; + repeated ChatEntry Entries = 4; + repeated SessionStats Session = 5; } -message Chats { // `autogenpb:marshal` `autogenpb:mutex` - string uuid = 1; // `autogenpb:uuid:9fd31f10-c25d-4d66-bc8d-5f6eb7c79057` - string version = 2; // `autogenpb:version:v0.0.1` - repeated Chat Chats = 3; // THIS MUST BE Chat and then Chats +message Chats { // `autogenpb:marshal` `autogenpb:mutex` + string uuid = 1; // `autogenpb:uuid:9fd31f10-c25d-4d66-bc8d-5f6eb7c79057` `autogenpb:primary` + string version = 2; // `autogenpb:version:v0.0.1` + repeated Chat Chats = 3; // THIS MUST BE Chat and then Chats } diff --git a/config.go b/config.go index bdfa08e..727b18b 100644 --- a/config.go +++ b/config.go @@ -78,7 +78,7 @@ func (all *Chats) ConfigSave() error { return err } configWrite("regex.text", []byte(cleanChats.FormatTEXT())) - log.Infof("chatpb.ConfigSave() worked len(Chats)=%d bytes=%d", len(cleanChats.Chats), len(data)) + // log.Infof("chatpb.ConfigSave() worked len(Chats)=%d bytes=%d", len(cleanChats.Chats), len(data)) return nil } @@ -131,7 +131,7 @@ func (all *Chats) ConfigLoad() error { log.Warn("versions do not match", test.Version, all.Version) deleteProtobufFile(cfgname) } - log.Info(cfgname, "protobuf versions and uuid match", all.Uuid, all.Version) + // log.Info(cfgname, "protobuf versions and uuid match", all.Uuid, all.Version) return err } diff --git a/helpers.go b/helpers.go index 5385944..35acf88 100644 --- a/helpers.go +++ b/helpers.go @@ -93,3 +93,11 @@ func (x *Chats) AppendNew(y *Chat) { x.Chats = append(x.Chats, chat) } + +// a Append() shortcut (that does Clone() with a mutex) notsure if it really works +func (x *Chat) AppendEntry(y *ChatEntry) { + x.Lock() + defer x.Unlock() + + x.Entries = append(x.Entries, proto.Clone(y).(*ChatEntry)) +}