From 26dbff4debd3db4e739d56c281b83cc6f850845b Mon Sep 17 00:00:00 2001 From: Jeremy Lewi Date: Thu, 3 Oct 2024 06:42:03 -0700 Subject: [PATCH] =?UTF-8?q?Properly=20handle=20completions=20in=20middle?= =?UTF-8?q?=20of=20document=20-=20Include=20LLM=20reque=E2=80=A6=20(#271)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …st/response in the trace * Fix #111 * If we are generating a completion for a cell that is in the middle of the document then we need to truncate the cells after the currently corrected cell. This is needed because our prompt just asks the AI to continue writing the document. So if we have a bunch of cells after the currently selected cell we will have problems. * Truncating the cells after the selected cell is the easiest way to avoid this confusion. * Fix #267 include the LLM request and response in the actual trace * This is a much more efficient way to get the raw request and response * GetLLMLogs does a linear search over the logs which is not efficient. * Here's my notebook with my test that its working https://gist.github.com/jlewi/164389227f5f797752ca1a290a05ad1e --- app/api/types.go | 34 ++ app/pkg/agent/agent.go | 23 +- app/pkg/agent/agent_test.go | 70 +++ app/pkg/analyze/logs.go | 4 - app/pkg/analyze/spans.go | 66 +++ app/pkg/analyze/spans_test.go | 107 +++++ app/pkg/anthropic/completer.go | 6 +- app/pkg/logs/matchers/names.go | 17 +- .../logs/matchers/{ => test}/names_test.go | 29 +- app/pkg/oai/completer.go | 6 +- protos/buf.lock | 4 +- protos/foyle/logs/traces.proto | 10 +- protos/foyle/v1alpha1/agent.proto | 4 + protos/foyle/v1alpha1/providers.proto | 11 + protos/go/foyle/logs/blocks.zap.go | 2 +- protos/go/foyle/logs/conversion.zap.go | 2 +- .../logs/logspbconnect/traces.connect.go | 2 + protos/go/foyle/logs/traces.pb.go | 402 +++++++++++------- protos/go/foyle/logs/traces.zap.go | 31 ++ protos/go/foyle/v1alpha1/agent.pb.go | 275 ++++++------ protos/go/foyle/v1alpha1/agent.zap.go | 6 + protos/go/foyle/v1alpha1/eval.pb.go | 3 +- protos/go/foyle/v1alpha1/providers.pb.go | 140 ++++++ protos/go/foyle/v1alpha1/providers.zap.go | 15 + 24 files changed, 964 insertions(+), 305 deletions(-) rename app/pkg/logs/matchers/{ => test}/names_test.go (70%) create mode 100644 protos/foyle/v1alpha1/providers.proto create mode 100644 protos/go/foyle/v1alpha1/providers.pb.go create mode 100644 protos/go/foyle/v1alpha1/providers.zap.go diff --git a/app/api/types.go b/app/api/types.go index a8795327..28145b4c 100644 --- a/app/api/types.go +++ b/app/api/types.go @@ -4,6 +4,8 @@ import ( "encoding/json" "time" + "github.com/jlewi/foyle/app/pkg/logs/matchers" + "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" @@ -222,3 +224,35 @@ func (L *LogEntry) Time() time.Time { timestamp := time.Unix(seconds, nanoseconds) return timestamp } + +// SetRequest sets the request field in the log entry. +// This is only intended for constructing log entries as part of testing +func SetRequest(e *LogEntry, req interface{}) error { + b, err := json.Marshal(req) + if err != nil { + return err + } + + o := make(map[string]interface{}) + if err := json.Unmarshal(b, &o); err != nil { + return err + } + (*e)[matchers.RequestField] = o + return nil +} + +// SetResponse sets the response field in the log entry. +// This is only intended for constructing log entries as part of testing +func SetResponse(e *LogEntry, req interface{}) error { + b, err := json.Marshal(req) + if err != nil { + return err + } + + o := make(map[string]interface{}) + if err := json.Unmarshal(b, &o); err != nil { + return err + } + (*e)[matchers.ResponseField] = o + return nil +} diff --git a/app/pkg/agent/agent.go b/app/pkg/agent/agent.go index ce6dec5a..669e0842 100644 --- a/app/pkg/agent/agent.go +++ b/app/pkg/agent/agent.go @@ -137,7 +137,8 @@ func (a *Agent) Generate(ctx context.Context, req *v1alpha1.GenerateRequest) (*v func (a *Agent) completeWithRetries(ctx context.Context, req *v1alpha1.GenerateRequest, examples []*v1alpha1.Example) ([]*v1alpha1.Block, error) { log := logs.FromContext(ctx) - t := docs.NewTailer(req.Doc.GetBlocks(), MaxDocChars) + cells := preprocessDoc(req) + t := docs.NewTailer(cells, MaxDocChars) exampleArgs := make([]Example, 0, len(examples)) for _, example := range examples { @@ -224,7 +225,8 @@ func (a *Agent) StreamGenerate(ctx context.Context, stream *connect.BidiStream[v // This should be safe because each time we update pendingDoc we update it to point to // a new doc object. So the other thread won't be modifying the doc pendingDoc points to r := &v1alpha1.GenerateRequest{ - Doc: pendingDoc, + Doc: pendingDoc, + SelectedIndex: selectedCell, } pendingDoc = nil return r @@ -234,7 +236,7 @@ func (a *Agent) StreamGenerate(ctx context.Context, stream *connect.BidiStream[v continue } - response, err := a.createCompletion(ctx, generateRequest, notebookUri, selectedCell, state.getContextID()) + response, err := a.createCompletion(ctx, generateRequest, notebookUri, state.getContextID()) if err != nil { log.Error(err, "createCompletion failed") @@ -448,7 +450,8 @@ func (a *Agent) GenerateCells(ctx context.Context, req *connect.Request[v1alpha1 return nil, err } agentReq := &v1alpha1.GenerateRequest{ - Doc: doc, + Doc: doc, + SelectedIndex: req.Msg.GetSelectedIndex(), } // Call the agent @@ -475,11 +478,12 @@ func (a *Agent) GenerateCells(ctx context.Context, req *connect.Request[v1alpha1 } // createCompletion is a helper function to create a single completion as part of a stream. -func (a *Agent) createCompletion(ctx context.Context, generateRequest *v1alpha1.GenerateRequest, notebookUri string, selectedCell int32, contextID string) (*v1alpha1.StreamGenerateResponse, error) { +func (a *Agent) createCompletion(ctx context.Context, generateRequest *v1alpha1.GenerateRequest, notebookUri string, contextID string) (*v1alpha1.StreamGenerateResponse, error) { span := trace.SpanFromContext(ctx) log := logs.FromContext(ctx) traceId := span.SpanContext().TraceID() tp := tracer() + // We need to generate a new ctx with a new trace ID because we want one trace per completion // We need to use withNewRoot because we want to make it a new trace and not rooted at the current one generateCtx, generateSpan := tp.Start(ctx, "CreateCompletion", trace.WithNewRoot(), trace.WithAttributes(attribute.String("streamTraceID", traceId.String()), attribute.String("contextID", contextID))) @@ -501,7 +505,7 @@ func (a *Agent) createCompletion(ctx context.Context, generateRequest *v1alpha1. response := &v1alpha1.StreamGenerateResponse{ Cells: cells, NotebookUri: notebookUri, - InsertAt: selectedCell + 1, + InsertAt: generateRequest.GetSelectedIndex() + 1, ContextId: contextID, } @@ -631,3 +635,10 @@ func dropResponse(response *v1alpha1.StreamGenerateResponse) bool { } return false } + +// preprocessDoc does some preprocessing of the doc. +func preprocessDoc(req *v1alpha1.GenerateRequest) []*v1alpha1.Block { + // We want to remove all cells after the selected cell because our prompt doesn't know how to take them into account. + cells := req.Doc.Blocks[:req.SelectedIndex+1] + return cells +} diff --git a/app/pkg/agent/agent_test.go b/app/pkg/agent/agent_test.go index 173da824..bb61670b 100644 --- a/app/pkg/agent/agent_test.go +++ b/app/pkg/agent/agent_test.go @@ -12,6 +12,8 @@ import ( "testing" "time" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/go-cmp/cmp" "github.com/sashabaranov/go-openai" @@ -424,3 +426,71 @@ func Test_dropResponse(t *testing.T) { }) } } + +func Test_peprocessDoc(t *testing.T) { + type testCase struct { + name string + input *v1alpha1.GenerateRequest + expected []*v1alpha1.Block + } + + doc := &v1alpha1.Doc{ + Blocks: []*v1alpha1.Block{ + { + Kind: v1alpha1.BlockKind_MARKUP, + Contents: "cell 0", + }, + { + Kind: v1alpha1.BlockKind_CODE, + Contents: "cell 1", + }, + { + Kind: v1alpha1.BlockKind_MARKUP, + Contents: "cell 2", + }, + }, + } + cases := []testCase{ + { + name: "basic", + input: &v1alpha1.GenerateRequest{ + Doc: doc, + SelectedIndex: 0, + }, + expected: []*v1alpha1.Block{ + { + Kind: v1alpha1.BlockKind_MARKUP, + Contents: "cell 0", + }, + }, + }, + { + name: "middle", + input: &v1alpha1.GenerateRequest{ + Doc: doc, + SelectedIndex: 1, + }, + expected: []*v1alpha1.Block{ + { + Kind: v1alpha1.BlockKind_MARKUP, + Contents: "cell 0", + }, + { + Kind: v1alpha1.BlockKind_CODE, + Contents: "cell 1", + }, + }, + }, + } + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + actual := preprocessDoc(c.input) + + opts := cmpopts.IgnoreUnexported(v1alpha1.Block{}) + if d := cmp.Diff(c.expected, actual, opts); d != "" { + t.Errorf("Unexpected diff:\n%s", d) + } + }) + } +} diff --git a/app/pkg/analyze/logs.go b/app/pkg/analyze/logs.go index 32774d5e..43b45df1 100644 --- a/app/pkg/analyze/logs.go +++ b/app/pkg/analyze/logs.go @@ -52,10 +52,6 @@ func readLLMLog(ctx context.Context, traceId string, logFile string) (*logspb.Ge continue } isMatch := false - if strings.HasSuffix(entry.Function(), "anthropic.(*Completer).Complete") { - provider = api.ModelProviderAnthropic - isMatch = true - } if matchers.IsOAIComplete(entry.Function()) { provider = api.ModelProviderOpenAI diff --git a/app/pkg/analyze/spans.go b/app/pkg/analyze/spans.go index 7864725c..095d7178 100644 --- a/app/pkg/analyze/spans.go +++ b/app/pkg/analyze/spans.go @@ -4,6 +4,9 @@ import ( "context" "strings" + "github.com/jlewi/foyle/app/pkg/logs/matchers" + "google.golang.org/protobuf/proto" + "github.com/jlewi/foyle/app/api" logspb "github.com/jlewi/foyle/protos/go/foyle/logs" "github.com/jlewi/foyle/protos/go/foyle/v1alpha1" @@ -13,6 +16,47 @@ func logEntryToSpan(ctx context.Context, e *api.LogEntry) *logspb.Span { if strings.Contains(e.Function(), "learn.(*InMemoryExampleDB).GetExamples") { return logEntryToRAGSpan(ctx, e) } + + if matchers.IsOAIComplete(e.Function()) || matchers.IsAnthropicComplete(e.Function()) { + return logEntryToLLMSpan(ctx, e) + } + return nil +} + +func logEntryToLLMSpan(ctx context.Context, e *api.LogEntry) *logspb.Span { + provider := v1alpha1.ModelProvider_MODEL_PROVIDER_UNKNOWN + if matchers.IsOAIComplete(e.Function()) { + provider = v1alpha1.ModelProvider_OPEN_AI + } else if matchers.IsAnthropicComplete(e.Function()) { + provider = v1alpha1.ModelProvider_ANTHROPIC + } + + // Code relies on the fact that the completer field only use the fields request and response for the LLM model. + // The code below also relies on the fact that the request and response are logged on separate log lines + reqB := e.Request() + if reqB != nil { + return &logspb.Span{ + Data: &logspb.Span_Llm{ + Llm: &logspb.LLMSpan{ + Provider: provider, + RequestJson: string(reqB), + }, + }, + } + } + + resB := e.Response() + if resB != nil { + return &logspb.Span{ + Data: &logspb.Span_Llm{ + Llm: &logspb.LLMSpan{ + Provider: provider, + ResponseJson: string(resB), + }, + }, + } + } + return nil } @@ -54,6 +98,8 @@ func combineSpans(trace *logspb.Trace) { trace.Spans = make([]*logspb.Span, 0, len(oldSpans)) var ragSpan *logspb.RAGSpan + var llmSpan *logspb.LLMSpan + for _, s := range oldSpans { if s.GetRag() != nil { if ragSpan == nil { @@ -61,6 +107,12 @@ func combineSpans(trace *logspb.Trace) { } else { ragSpan = combineRAGSpans(ragSpan, s.GetRag()) } + } else if s.GetLlm() != nil { + if llmSpan == nil { + llmSpan = s.GetLlm() + } else { + llmSpan = combineLLMSpans(llmSpan, s.GetLlm()) + } } else { trace.Spans = append(trace.Spans, s) } @@ -73,6 +125,14 @@ func combineSpans(trace *logspb.Trace) { }, }) } + + if llmSpan != nil { + trace.Spans = append(trace.Spans, &logspb.Span{ + Data: &logspb.Span_Llm{ + Llm: llmSpan, + }, + }) + } } // combine two RagSpans @@ -90,3 +150,9 @@ func combineRAGSpans(a, b *logspb.RAGSpan) *logspb.RAGSpan { span.Results = append(span.Results, b.Results...) return span } + +// combine two LLMSpans +func combineLLMSpans(a, b *logspb.LLMSpan) *logspb.LLMSpan { + proto.Merge(a, b) + return a +} diff --git a/app/pkg/analyze/spans_test.go b/app/pkg/analyze/spans_test.go index 413890c5..e6802602 100644 --- a/app/pkg/analyze/spans_test.go +++ b/app/pkg/analyze/spans_test.go @@ -5,6 +5,9 @@ import ( "encoding/json" "testing" + "github.com/jlewi/foyle/app/pkg/logs/matchers" + "github.com/sashabaranov/go-openai" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/jlewi/foyle/app/api" @@ -71,6 +74,110 @@ func Test_logEntryToSpan(t *testing.T) { } } +func Test_logEntrytoLLMSpan(t *testing.T) { + type testCase struct { + name string + entry *api.LogEntry + expected *logspb.Span + } + + oaiRequestEntry := &api.LogEntry{ + "function": matchers.OAIComplete, + } + + oaiRequest := &openai.ChatCompletionRequest{ + Model: "model", + } + + if err := api.SetRequest(oaiRequestEntry, oaiRequest); err != nil { + t.Fatalf("Failed to set request: %v", err) + } + + oaiRequestJson, err := json.Marshal(oaiRequest) + + if err != nil { + t.Fatalf("Failed to marshal request: %v", err) + } + + oaiResponseEntry := &api.LogEntry{ + "function": matchers.OAIComplete, + } + + oaiResponse := &openai.ChatCompletionResponse{ + Model: "somemodel", + } + if err := api.SetResponse(oaiResponseEntry, oaiResponse); err != nil { + t.Fatalf("Failed to set request: %v", err) + } + oaiResponseJson, err := json.Marshal(oaiResponse) + + if err != nil { + t.Fatalf("Failed to marshal response: %v", err) + } + + cases := []testCase{ + { + name: "OAIRequest", + entry: oaiRequestEntry, + expected: &logspb.Span{ + Data: &logspb.Span_Llm{ + Llm: &logspb.LLMSpan{ + Provider: v1alpha1.ModelProvider_OPEN_AI, + RequestJson: string(oaiRequestJson), + }, + }, + }, + }, + { + name: "OAIResponse", + entry: oaiResponseEntry, + expected: &logspb.Span{ + Data: &logspb.Span_Llm{ + Llm: &logspb.LLMSpan{ + Provider: v1alpha1.ModelProvider_OPEN_AI, + ResponseJson: string(oaiResponseJson), + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + span := logEntryToSpan(context.Background(), tc.entry) + + if span == nil { + t.Fatalf("Expected non nil span") + } + + if span.GetLlm() == nil { + t.Fatalf("Expected LLM span") + } + + if span.GetLlm().GetProvider() != v1alpha1.ModelProvider_OPEN_AI { + t.Fatalf("Expected OpenAI provider") + } + + // The JSON serialization of the proto isn't deterministic so we can't use cmp.diff to evaluate the response + expectedHasRequest := tc.expected.GetLlm().GetRequestJson() != "" + expectedHasResponse := tc.expected.GetLlm().GetResponseJson() != "" + + if expectedHasRequest { + if span.GetLlm().GetRequestJson() == "" { + t.Fatalf("Expected request") + } + } + + if expectedHasResponse { + if span.GetLlm().GetResponseJson() == "" { + t.Fatalf("Expected response") + } + } + }) + + } +} + func Test_CombineSpans(t *testing.T) { type testCase struct { name string diff --git a/app/pkg/anthropic/completer.go b/app/pkg/anthropic/completer.go index 02d26932..5c2e660c 100644 --- a/app/pkg/anthropic/completer.go +++ b/app/pkg/anthropic/completer.go @@ -4,6 +4,8 @@ import ( "context" "net/http" + "github.com/jlewi/foyle/app/pkg/logs/matchers" + "github.com/jlewi/foyle/app/api" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" @@ -65,7 +67,7 @@ func (c *Completer) Complete(ctx context.Context, systemPrompt string, message s System: systemPrompt, } - log.Info("Anthropic:CreateMessages", "request", request) + log.Info("Anthropic:CreateMessages", matchers.RequestField, request) resp, err := c.client.CreateMessages(ctx, request) if err != nil { @@ -88,7 +90,7 @@ func (c *Completer) Complete(ctx context.Context, systemPrompt string, message s attribute.String("llm.stop_reason", string(resp.StopReason)), ) - log.Info("Anthropic:CreateMessages response", "resp", resp) + log.Info("Anthropic:CreateMessages response", matchers.ResponseField, resp) usage := api.LLMUsage{ InputTokens: resp.Usage.InputTokens, OutputTokens: resp.Usage.OutputTokens, diff --git a/app/pkg/logs/matchers/names.go b/app/pkg/logs/matchers/names.go index 586fc40d..1fdd0193 100644 --- a/app/pkg/logs/matchers/names.go +++ b/app/pkg/logs/matchers/names.go @@ -6,9 +6,16 @@ package matchers import "strings" const ( - OAIComplete = "github.com/jlewi/foyle/app/pkg/oai.(*Completer).Complete" - LogEvents = "github.com/jlewi/foyle/app/pkg/agent.(*Agent).LogEvents" - StreamGenerate = "github.com/jlewi/foyle/app/pkg/agent.(*Agent).StreamGenerate" + OAIComplete = "github.com/jlewi/foyle/app/pkg/oai.(*Completer).Complete" + AnthropicComplete = "github.com/jlewi/foyle/app/pkg/anthropic.(*Completer).Complete" + LogEvents = "github.com/jlewi/foyle/app/pkg/agent.(*Agent).LogEvents" + StreamGenerate = "github.com/jlewi/foyle/app/pkg/agent.(*Agent).StreamGenerate" + + RequestField = "request" + // ResponseField is the field storing the response of the LLM. + // TODO(jeremy): The use of the abbreviation resp is inconsistent with the name of the field request but its what + // we used. + ResponseField = "resp" ) type Matcher func(name string) bool @@ -17,6 +24,10 @@ func IsOAIComplete(name string) bool { return strings.HasPrefix(name, OAIComplete) } +func IsAnthropicComplete(name string) bool { + return strings.HasPrefix(name, AnthropicComplete) +} + func IsLogEvent(fname string) bool { // We need to use HasPrefix because the logging statement is nested inside an anonymous function so there // will be a suffix like "func1" diff --git a/app/pkg/logs/matchers/names_test.go b/app/pkg/logs/matchers/test/names_test.go similarity index 70% rename from app/pkg/logs/matchers/names_test.go rename to app/pkg/logs/matchers/test/names_test.go index c457bd1e..28fc0a75 100644 --- a/app/pkg/logs/matchers/names_test.go +++ b/app/pkg/logs/matchers/test/names_test.go @@ -1,4 +1,7 @@ -package matchers +// package test is a hacky way to avoid circular imports in the test. +// The test imports some packages (e.g. anthropic/oai) that also import matchers +// so if we don't use a separate package we end up with a circular import. +package test import ( "reflect" @@ -6,6 +9,10 @@ import ( "strings" "testing" + "github.com/jlewi/foyle/app/pkg/logs/matchers" + + "github.com/jlewi/foyle/app/pkg/anthropic" + "github.com/jlewi/foyle/app/pkg/oai" "github.com/jlewi/foyle/app/pkg/agent" @@ -30,12 +37,12 @@ func Test_Names(t *testing.T) { cases := []testCases{ { - expected: LogEvents, + expected: matchers.LogEvents, input: (&agent.Agent{}).LogEvents, }, { - expected: StreamGenerate, + expected: matchers.StreamGenerate, input: (&agent.Agent{}).StreamGenerate, }, } @@ -50,7 +57,7 @@ func Test_Names(t *testing.T) { func Test_Matchers(t *testing.T) { type testCases struct { name string - Matcher Matcher + Matcher matchers.Matcher input interface{} expected bool } @@ -58,25 +65,31 @@ func Test_Matchers(t *testing.T) { cases := []testCases{ { input: (&oai.Completer{}).Complete, - Matcher: IsOAIComplete, + Matcher: matchers.IsOAIComplete, name: "IsOAIComplete", expected: true, }, + { + input: (&anthropic.Completer{}).Complete, + Matcher: matchers.IsAnthropicComplete, + name: "IsAnthropicComplete", + expected: true, + }, { input: (&agent.Agent{}).Generate, - Matcher: IsGenerate, + Matcher: matchers.IsGenerate, name: "IsGenerate", expected: true, }, { input: (&agent.Agent{}).StreamGenerate, - Matcher: IsStreamGenerate, + Matcher: matchers.IsStreamGenerate, name: "IsStreamGenerate", expected: true, }, { input: logs.LogLLMUsage, - Matcher: IsLLMUsage, + Matcher: matchers.IsLLMUsage, name: "IsLLMUsage", expected: true, }, diff --git a/app/pkg/oai/completer.go b/app/pkg/oai/completer.go index c788e6ed..819bba48 100644 --- a/app/pkg/oai/completer.go +++ b/app/pkg/oai/completer.go @@ -3,6 +3,8 @@ package oai import ( "context" + "github.com/jlewi/foyle/app/pkg/logs/matchers" + "github.com/jlewi/foyle/app/api" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" @@ -56,7 +58,7 @@ func (c *Completer) Complete(ctx context.Context, systemPrompt string, message s Temperature: temperature, } - log.Info("OpenAI:CreateChatCompletion", "request", request) + log.Info("OpenAI:CreateChatCompletion", matchers.RequestField, request) resp, err := c.client.CreateChatCompletion(ctx, request) if err != nil { @@ -75,7 +77,7 @@ func (c *Completer) Complete(ctx context.Context, systemPrompt string, message s return nil, errors.Wrapf(err, "CreateChatCompletion failed") } - log.Info("OpenAI:CreateChatCompletion response", "resp", resp) + log.Info("OpenAI:CreateChatCompletion response", matchers.ResponseField, resp) usage := api.LLMUsage{ InputTokens: resp.Usage.PromptTokens, OutputTokens: resp.Usage.CompletionTokens, diff --git a/protos/buf.lock b/protos/buf.lock index c1b6d463..143fda73 100644 --- a/protos/buf.lock +++ b/protos/buf.lock @@ -8,5 +8,5 @@ deps: commit: e7f8d366f5264595bcc4cd4139af9973 digest: b5:0cd69a689ee320ed815663d57d1bc3a1d6823224a7a717d46fee3a68197c25a6f5f932c0b0e49f8370c70c247a6635969a6a54af5345cafd51e0667298768aca - name: buf.build/stateful/runme - commit: 20a8540bddaf485682d5bef7e619d15f - digest: b5:627fd8553c9470db441f4e338a5a628e43f3a684c62d41678f13765840e4189540e9df547eaae3c006722513811725fc70b5a6206628c71db80da3a8c2994507 + commit: 45813f39881a42538128c8d9757878a4 + digest: b5:669c5838be7211c2fb8a663716813eb19682db4fe1dcec3e076c3aa8579d511aceb9f0ba5016294f205d7ec51bbe8e5bbc45c52bea8a1e01b6fdbc3871c43b5a diff --git a/protos/foyle/logs/traces.proto b/protos/foyle/logs/traces.proto index 83bb667e..821ba980 100644 --- a/protos/foyle/logs/traces.proto +++ b/protos/foyle/logs/traces.proto @@ -2,6 +2,7 @@ syntax = "proto3"; import "foyle/logs/logs.proto"; import "foyle/v1alpha1/agent.proto"; +import "foyle/v1alpha1/providers.proto"; import "foyle/v1alpha1/trainer.proto"; import "foyle/logs/blocks.proto"; import "runme/runner/v1/runner.proto"; @@ -36,15 +37,21 @@ message Span { string id = 1; oneof data { RAGSpan rag = 2; + LLMSpan llm = 3; } } message RAGSpan { string query = 1; - repeated RAGResult results = 2; } +message LLMSpan { + ModelProvider provider = 1; + string request_json = 2; + string response_json = 3; +} + message GenerateTrace { GenerateRequest request = 1; GenerateResponse response = 2; @@ -65,6 +72,7 @@ service LogsService { // GetLLMLogs returns the logs associated with an LLM call. // These will include the rendered prompt and response. Unlike GetTraceRequest this has the // actual prompt and response of the LLM. + // TODO(jeremy): Can we deprecate this once we start adding the LLM request/response to the trace as an LLMSpan? rpc GetLLMLogs(GetLLMLogsRequest) returns (GetLLMLogsResponse) {} rpc Status(GetLogsStatusRequest) returns (GetLogsStatusResponse) {} diff --git a/protos/foyle/v1alpha1/agent.proto b/protos/foyle/v1alpha1/agent.proto index 94588d07..2586cbf2 100644 --- a/protos/foyle/v1alpha1/agent.proto +++ b/protos/foyle/v1alpha1/agent.proto @@ -9,6 +9,8 @@ option go_package = "github.com/jlewi/foyle/protos/go/foyle/v1alpha1"; message GenerateRequest { Doc doc = 1; + // The index of the selected cell. + int32 selected_index = 2; } message GenerateResponse { @@ -112,6 +114,8 @@ message StreamGenerateResponse { message GenerateCellsRequest { runme.parser.v1.Notebook notebook = 1; + // The index of the selected cell. + int32 selected_index = 2; } message GenerateCellsResponse { diff --git a/protos/foyle/v1alpha1/providers.proto b/protos/foyle/v1alpha1/providers.proto new file mode 100644 index 00000000..8378535c --- /dev/null +++ b/protos/foyle/v1alpha1/providers.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + + +option go_package = "github.com/jlewi/foyle/protos/go/foyle/v1alpha1"; + +enum ModelProvider { + MODEL_PROVIDER_UNKNOWN = 0; + OPEN_AI = 1; + ANTHROPIC = 2; + REPLICATE = 3; +} \ No newline at end of file diff --git a/protos/go/foyle/logs/blocks.zap.go b/protos/go/foyle/logs/blocks.zap.go index e8375652..0911e359 100644 --- a/protos/go/foyle/logs/blocks.zap.go +++ b/protos/go/foyle/logs/blocks.zap.go @@ -7,9 +7,9 @@ import ( fmt "fmt" math "math" proto "github.com/golang/protobuf/proto" - _ "google.golang.org/protobuf/types/known/timestamppb" _ "github.com/jlewi/foyle/protos/go/foyle/v1alpha1" _ "google.golang.org/protobuf/types/known/structpb" + _ "google.golang.org/protobuf/types/known/timestamppb" go_uber_org_zap_zapcore "go.uber.org/zap/zapcore" ) diff --git a/protos/go/foyle/logs/conversion.zap.go b/protos/go/foyle/logs/conversion.zap.go index 2288697e..8e925a3d 100644 --- a/protos/go/foyle/logs/conversion.zap.go +++ b/protos/go/foyle/logs/conversion.zap.go @@ -7,9 +7,9 @@ import ( fmt "fmt" math "math" proto "github.com/golang/protobuf/proto" + _ "github.com/jlewi/foyle/protos/go/foyle/v1alpha1" _ "google.golang.org/protobuf/types/known/structpb" _ "google.golang.org/protobuf/types/known/timestamppb" - _ "github.com/jlewi/foyle/protos/go/foyle/v1alpha1" go_uber_org_zap_zapcore "go.uber.org/zap/zapcore" ) diff --git a/protos/go/foyle/logs/logspbconnect/traces.connect.go b/protos/go/foyle/logs/logspbconnect/traces.connect.go index 5743cecd..0256d4ea 100644 --- a/protos/go/foyle/logs/logspbconnect/traces.connect.go +++ b/protos/go/foyle/logs/logspbconnect/traces.connect.go @@ -59,6 +59,7 @@ type LogsServiceClient interface { // GetLLMLogs returns the logs associated with an LLM call. // These will include the rendered prompt and response. Unlike GetTraceRequest this has the // actual prompt and response of the LLM. + // TODO(jeremy): Can we deprecate this once we start adding the LLM request/response to the trace as an LLMSpan? GetLLMLogs(context.Context, *connect.Request[logs.GetLLMLogsRequest]) (*connect.Response[logs.GetLLMLogsResponse], error) Status(context.Context, *connect.Request[logs.GetLogsStatusRequest]) (*connect.Response[logs.GetLogsStatusResponse], error) } @@ -135,6 +136,7 @@ type LogsServiceHandler interface { // GetLLMLogs returns the logs associated with an LLM call. // These will include the rendered prompt and response. Unlike GetTraceRequest this has the // actual prompt and response of the LLM. + // TODO(jeremy): Can we deprecate this once we start adding the LLM request/response to the trace as an LLMSpan? GetLLMLogs(context.Context, *connect.Request[logs.GetLLMLogsRequest]) (*connect.Response[logs.GetLLMLogsResponse], error) Status(context.Context, *connect.Request[logs.GetLogsStatusRequest]) (*connect.Response[logs.GetLogsStatusResponse], error) } diff --git a/protos/go/foyle/logs/traces.pb.go b/protos/go/foyle/logs/traces.pb.go index 6d5cf044..ae66074f 100644 --- a/protos/go/foyle/logs/traces.pb.go +++ b/protos/go/foyle/logs/traces.pb.go @@ -142,6 +142,7 @@ type Span struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Types that are assignable to Data: // *Span_Rag + // *Span_Llm Data isSpan_Data `protobuf_oneof:"data"` } @@ -198,6 +199,13 @@ func (x *Span) GetRag() *RAGSpan { return nil } +func (x *Span) GetLlm() *LLMSpan { + if x, ok := x.GetData().(*Span_Llm); ok { + return x.Llm + } + return nil +} + type isSpan_Data interface { isSpan_Data() } @@ -206,8 +214,14 @@ type Span_Rag struct { Rag *RAGSpan `protobuf:"bytes,2,opt,name=rag,proto3,oneof"` } +type Span_Llm struct { + Llm *LLMSpan `protobuf:"bytes,3,opt,name=llm,proto3,oneof"` +} + func (*Span_Rag) isSpan_Data() {} +func (*Span_Llm) isSpan_Data() {} + type RAGSpan struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -263,6 +277,69 @@ func (x *RAGSpan) GetResults() []*v1alpha1.RAGResult { return nil } +type LLMSpan struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Provider v1alpha1.ModelProvider `protobuf:"varint,1,opt,name=provider,proto3,enum=ModelProvider" json:"provider,omitempty"` + RequestJson string `protobuf:"bytes,2,opt,name=request_json,json=requestJson,proto3" json:"request_json,omitempty"` + ResponseJson string `protobuf:"bytes,3,opt,name=response_json,json=responseJson,proto3" json:"response_json,omitempty"` +} + +func (x *LLMSpan) Reset() { + *x = LLMSpan{} + if protoimpl.UnsafeEnabled { + mi := &file_foyle_logs_traces_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LLMSpan) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LLMSpan) ProtoMessage() {} + +func (x *LLMSpan) ProtoReflect() protoreflect.Message { + mi := &file_foyle_logs_traces_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LLMSpan.ProtoReflect.Descriptor instead. +func (*LLMSpan) Descriptor() ([]byte, []int) { + return file_foyle_logs_traces_proto_rawDescGZIP(), []int{3} +} + +func (x *LLMSpan) GetProvider() v1alpha1.ModelProvider { + if x != nil { + return x.Provider + } + return v1alpha1.ModelProvider(0) +} + +func (x *LLMSpan) GetRequestJson() string { + if x != nil { + return x.RequestJson + } + return "" +} + +func (x *LLMSpan) GetResponseJson() string { + if x != nil { + return x.ResponseJson + } + return "" +} + type GenerateTrace struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -275,7 +352,7 @@ type GenerateTrace struct { func (x *GenerateTrace) Reset() { *x = GenerateTrace{} if protoimpl.UnsafeEnabled { - mi := &file_foyle_logs_traces_proto_msgTypes[3] + mi := &file_foyle_logs_traces_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -288,7 +365,7 @@ func (x *GenerateTrace) String() string { func (*GenerateTrace) ProtoMessage() {} func (x *GenerateTrace) ProtoReflect() protoreflect.Message { - mi := &file_foyle_logs_traces_proto_msgTypes[3] + mi := &file_foyle_logs_traces_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -301,7 +378,7 @@ func (x *GenerateTrace) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateTrace.ProtoReflect.Descriptor instead. func (*GenerateTrace) Descriptor() ([]byte, []int) { - return file_foyle_logs_traces_proto_rawDescGZIP(), []int{3} + return file_foyle_logs_traces_proto_rawDescGZIP(), []int{4} } func (x *GenerateTrace) GetRequest() *v1alpha1.GenerateRequest { @@ -331,7 +408,7 @@ type LogEntries struct { func (x *LogEntries) Reset() { *x = LogEntries{} if protoimpl.UnsafeEnabled { - mi := &file_foyle_logs_traces_proto_msgTypes[4] + mi := &file_foyle_logs_traces_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -344,7 +421,7 @@ func (x *LogEntries) String() string { func (*LogEntries) ProtoMessage() {} func (x *LogEntries) ProtoReflect() protoreflect.Message { - mi := &file_foyle_logs_traces_proto_msgTypes[4] + mi := &file_foyle_logs_traces_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -357,7 +434,7 @@ func (x *LogEntries) ProtoReflect() protoreflect.Message { // Deprecated: Use LogEntries.ProtoReflect.Descriptor instead. func (*LogEntries) Descriptor() ([]byte, []int) { - return file_foyle_logs_traces_proto_rawDescGZIP(), []int{4} + return file_foyle_logs_traces_proto_rawDescGZIP(), []int{5} } func (x *LogEntries) GetLines() []string { @@ -385,7 +462,7 @@ type GetTraceRequest struct { func (x *GetTraceRequest) Reset() { *x = GetTraceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_foyle_logs_traces_proto_msgTypes[5] + mi := &file_foyle_logs_traces_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -398,7 +475,7 @@ func (x *GetTraceRequest) String() string { func (*GetTraceRequest) ProtoMessage() {} func (x *GetTraceRequest) ProtoReflect() protoreflect.Message { - mi := &file_foyle_logs_traces_proto_msgTypes[5] + mi := &file_foyle_logs_traces_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -411,7 +488,7 @@ func (x *GetTraceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTraceRequest.ProtoReflect.Descriptor instead. func (*GetTraceRequest) Descriptor() ([]byte, []int) { - return file_foyle_logs_traces_proto_rawDescGZIP(), []int{5} + return file_foyle_logs_traces_proto_rawDescGZIP(), []int{6} } func (x *GetTraceRequest) GetId() string { @@ -432,7 +509,7 @@ type GetTraceResponse struct { func (x *GetTraceResponse) Reset() { *x = GetTraceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_foyle_logs_traces_proto_msgTypes[6] + mi := &file_foyle_logs_traces_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -445,7 +522,7 @@ func (x *GetTraceResponse) String() string { func (*GetTraceResponse) ProtoMessage() {} func (x *GetTraceResponse) ProtoReflect() protoreflect.Message { - mi := &file_foyle_logs_traces_proto_msgTypes[6] + mi := &file_foyle_logs_traces_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -458,7 +535,7 @@ func (x *GetTraceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTraceResponse.ProtoReflect.Descriptor instead. func (*GetTraceResponse) Descriptor() ([]byte, []int) { - return file_foyle_logs_traces_proto_rawDescGZIP(), []int{6} + return file_foyle_logs_traces_proto_rawDescGZIP(), []int{7} } func (x *GetTraceResponse) GetTrace() *Trace { @@ -479,7 +556,7 @@ type GetBlockLogRequest struct { func (x *GetBlockLogRequest) Reset() { *x = GetBlockLogRequest{} if protoimpl.UnsafeEnabled { - mi := &file_foyle_logs_traces_proto_msgTypes[7] + mi := &file_foyle_logs_traces_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -492,7 +569,7 @@ func (x *GetBlockLogRequest) String() string { func (*GetBlockLogRequest) ProtoMessage() {} func (x *GetBlockLogRequest) ProtoReflect() protoreflect.Message { - mi := &file_foyle_logs_traces_proto_msgTypes[7] + mi := &file_foyle_logs_traces_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -505,7 +582,7 @@ func (x *GetBlockLogRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBlockLogRequest.ProtoReflect.Descriptor instead. func (*GetBlockLogRequest) Descriptor() ([]byte, []int) { - return file_foyle_logs_traces_proto_rawDescGZIP(), []int{7} + return file_foyle_logs_traces_proto_rawDescGZIP(), []int{8} } func (x *GetBlockLogRequest) GetId() string { @@ -526,7 +603,7 @@ type GetBlockLogResponse struct { func (x *GetBlockLogResponse) Reset() { *x = GetBlockLogResponse{} if protoimpl.UnsafeEnabled { - mi := &file_foyle_logs_traces_proto_msgTypes[8] + mi := &file_foyle_logs_traces_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -539,7 +616,7 @@ func (x *GetBlockLogResponse) String() string { func (*GetBlockLogResponse) ProtoMessage() {} func (x *GetBlockLogResponse) ProtoReflect() protoreflect.Message { - mi := &file_foyle_logs_traces_proto_msgTypes[8] + mi := &file_foyle_logs_traces_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -552,7 +629,7 @@ func (x *GetBlockLogResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBlockLogResponse.ProtoReflect.Descriptor instead. func (*GetBlockLogResponse) Descriptor() ([]byte, []int) { - return file_foyle_logs_traces_proto_rawDescGZIP(), []int{8} + return file_foyle_logs_traces_proto_rawDescGZIP(), []int{9} } func (x *GetBlockLogResponse) GetBlockLog() *BlockLog { @@ -577,7 +654,7 @@ type GetLLMLogsRequest struct { func (x *GetLLMLogsRequest) Reset() { *x = GetLLMLogsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_foyle_logs_traces_proto_msgTypes[9] + mi := &file_foyle_logs_traces_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -590,7 +667,7 @@ func (x *GetLLMLogsRequest) String() string { func (*GetLLMLogsRequest) ProtoMessage() {} func (x *GetLLMLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_foyle_logs_traces_proto_msgTypes[9] + mi := &file_foyle_logs_traces_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -603,7 +680,7 @@ func (x *GetLLMLogsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLLMLogsRequest.ProtoReflect.Descriptor instead. func (*GetLLMLogsRequest) Descriptor() ([]byte, []int) { - return file_foyle_logs_traces_proto_rawDescGZIP(), []int{9} + return file_foyle_logs_traces_proto_rawDescGZIP(), []int{10} } func (x *GetLLMLogsRequest) GetTraceId() string { @@ -638,7 +715,7 @@ type GetLLMLogsResponse struct { func (x *GetLLMLogsResponse) Reset() { *x = GetLLMLogsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_foyle_logs_traces_proto_msgTypes[10] + mi := &file_foyle_logs_traces_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -651,7 +728,7 @@ func (x *GetLLMLogsResponse) String() string { func (*GetLLMLogsResponse) ProtoMessage() {} func (x *GetLLMLogsResponse) ProtoReflect() protoreflect.Message { - mi := &file_foyle_logs_traces_proto_msgTypes[10] + mi := &file_foyle_logs_traces_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -664,7 +741,7 @@ func (x *GetLLMLogsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLLMLogsResponse.ProtoReflect.Descriptor instead. func (*GetLLMLogsResponse) Descriptor() ([]byte, []int) { - return file_foyle_logs_traces_proto_rawDescGZIP(), []int{10} + return file_foyle_logs_traces_proto_rawDescGZIP(), []int{11} } func (x *GetLLMLogsResponse) GetRequestHtml() string { @@ -703,7 +780,9 @@ var file_foyle_logs_traces_proto_rawDesc = []byte{ 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x15, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2f, + 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2f, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, @@ -732,87 +811,97 @@ var file_foyle_logs_traces_proto_rawDesc = []byte{ 0x73, 0x70, 0x61, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x05, 0x73, 0x70, 0x61, 0x6e, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x4a, 0x04, 0x08, 0x05, - 0x10, 0x06, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x47, 0x0a, 0x04, 0x53, 0x70, 0x61, 0x6e, + 0x10, 0x06, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x70, 0x0a, 0x04, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x03, 0x72, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x52, 0x41, 0x47, 0x53, 0x70, - 0x61, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x67, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x22, 0x45, 0x0a, 0x07, 0x52, 0x41, 0x47, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x14, 0x0a, 0x05, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x24, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x52, 0x41, 0x47, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, - 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x6a, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x21, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x05, 0x74, 0x72, - 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x66, 0x6f, 0x79, 0x6c, - 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x74, 0x72, - 0x61, 0x63, 0x65, 0x22, 0x24, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, - 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x48, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x31, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, - 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x52, 0x08, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x4c, 0x6f, 0x67, 0x22, 0x49, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4c, 0x4c, 0x4d, 0x4c, 0x6f, 0x67, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x61, 0x63, - 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa4, - 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4c, 0x4c, 0x4d, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x5f, 0x68, 0x74, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x48, 0x74, 0x6d, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x74, 0x6d, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x12, 0x21, 0x0a, - 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4a, 0x73, 0x6f, 0x6e, - 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6a, 0x73, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x32, 0xc8, 0x02, 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x63, - 0x65, 0x12, 0x1b, 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x54, - 0x72, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, - 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x12, 0x1e, 0x2e, - 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, - 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x4d, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4c, 0x4c, 0x4d, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x1d, - 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4c, - 0x4c, 0x4d, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x4c, - 0x4d, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x4f, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x66, 0x6f, 0x79, 0x6c, - 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x66, 0x6f, - 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x42, 0x9a, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, - 0x6f, 0x67, 0x73, 0x42, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, - 0x6c, 0x65, 0x77, 0x69, 0x2f, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x3b, - 0x6c, 0x6f, 0x67, 0x73, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x46, 0x4c, 0x58, 0xaa, 0x02, 0x0a, 0x46, - 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x73, 0xca, 0x02, 0x0a, 0x46, 0x6f, 0x79, 0x6c, - 0x65, 0x5c, 0x4c, 0x6f, 0x67, 0x73, 0xe2, 0x02, 0x16, 0x46, 0x6f, 0x79, 0x6c, 0x65, 0x5c, 0x4c, - 0x6f, 0x67, 0x73, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x0b, 0x46, 0x6f, 0x79, 0x6c, 0x65, 0x3a, 0x3a, 0x4c, 0x6f, 0x67, 0x73, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x72, 0x61, 0x67, 0x12, 0x27, 0x0a, 0x03, 0x6c, 0x6c, 0x6d, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, + 0x6f, 0x67, 0x73, 0x2e, 0x4c, 0x4c, 0x4d, 0x53, 0x70, 0x61, 0x6e, 0x48, 0x00, 0x52, 0x03, 0x6c, + 0x6c, 0x6d, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x45, 0x0a, 0x07, 0x52, 0x41, + 0x47, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x24, 0x0a, 0x07, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x52, + 0x41, 0x47, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x22, 0x7d, 0x0a, 0x07, 0x4c, 0x4c, 0x4d, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x2a, 0x0a, 0x08, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, + 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x73, 0x6f, 0x6e, + 0x22, 0x6a, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x63, + 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, + 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x0a, 0x0a, + 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x21, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3b, + 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x27, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x54, + 0x72, 0x61, 0x63, 0x65, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x22, 0x24, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x22, 0x48, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x6f, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x66, 0x6f, + 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x6f, + 0x67, 0x52, 0x08, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x22, 0x49, 0x0a, 0x11, 0x47, + 0x65, 0x74, 0x4c, 0x4c, 0x4d, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x19, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6c, + 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, + 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4c, 0x4c, + 0x4d, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x74, 0x6d, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x74, 0x6d, 0x6c, + 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x74, 0x6d, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x48, 0x74, 0x6d, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x32, 0xc8, 0x02, + 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, + 0x08, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x2e, 0x66, 0x6f, 0x79, 0x6c, + 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, + 0x6f, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x12, 0x1e, 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, + 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, + 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4c, + 0x4c, 0x4d, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x1d, 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, + 0x6f, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x4c, 0x4d, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, + 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x4c, 0x4d, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x20, 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x2e, 0x47, + 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, + 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x9a, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, + 0x2e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x42, 0x0b, 0x54, 0x72, 0x61, + 0x63, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x6c, 0x65, 0x77, 0x69, 0x2f, 0x66, 0x6f, 0x79, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x66, 0x6f, 0x79, + 0x6c, 0x65, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x3b, 0x6c, 0x6f, 0x67, 0x73, 0x70, 0x62, 0xa2, 0x02, + 0x03, 0x46, 0x4c, 0x58, 0xaa, 0x02, 0x0a, 0x46, 0x6f, 0x79, 0x6c, 0x65, 0x2e, 0x4c, 0x6f, 0x67, + 0x73, 0xca, 0x02, 0x0a, 0x46, 0x6f, 0x79, 0x6c, 0x65, 0x5c, 0x4c, 0x6f, 0x67, 0x73, 0xe2, 0x02, + 0x16, 0x46, 0x6f, 0x79, 0x6c, 0x65, 0x5c, 0x4c, 0x6f, 0x67, 0x73, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0b, 0x46, 0x6f, 0x79, 0x6c, 0x65, 0x3a, + 0x3a, 0x4c, 0x6f, 0x67, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -827,51 +916,55 @@ func file_foyle_logs_traces_proto_rawDescGZIP() []byte { return file_foyle_logs_traces_proto_rawDescData } -var file_foyle_logs_traces_proto_msgTypes = make([]protoimpl.MessageInfo, 11) +var file_foyle_logs_traces_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_foyle_logs_traces_proto_goTypes = []interface{}{ (*Trace)(nil), // 0: foyle.logs.Trace (*Span)(nil), // 1: foyle.logs.Span (*RAGSpan)(nil), // 2: foyle.logs.RAGSpan - (*GenerateTrace)(nil), // 3: foyle.logs.GenerateTrace - (*LogEntries)(nil), // 4: foyle.logs.LogEntries - (*GetTraceRequest)(nil), // 5: foyle.logs.GetTraceRequest - (*GetTraceResponse)(nil), // 6: foyle.logs.GetTraceResponse - (*GetBlockLogRequest)(nil), // 7: foyle.logs.GetBlockLogRequest - (*GetBlockLogResponse)(nil), // 8: foyle.logs.GetBlockLogResponse - (*GetLLMLogsRequest)(nil), // 9: foyle.logs.GetLLMLogsRequest - (*GetLLMLogsResponse)(nil), // 10: foyle.logs.GetLLMLogsResponse - (*timestamppb.Timestamp)(nil), // 11: google.protobuf.Timestamp - (*v1alpha1.RAGResult)(nil), // 12: RAGResult - (*v1alpha1.GenerateRequest)(nil), // 13: GenerateRequest - (*v1alpha1.GenerateResponse)(nil), // 14: GenerateResponse - (*BlockLog)(nil), // 15: foyle.logs.BlockLog - (*GetLogsStatusRequest)(nil), // 16: foyle.logs.GetLogsStatusRequest - (*GetLogsStatusResponse)(nil), // 17: foyle.logs.GetLogsStatusResponse + (*LLMSpan)(nil), // 3: foyle.logs.LLMSpan + (*GenerateTrace)(nil), // 4: foyle.logs.GenerateTrace + (*LogEntries)(nil), // 5: foyle.logs.LogEntries + (*GetTraceRequest)(nil), // 6: foyle.logs.GetTraceRequest + (*GetTraceResponse)(nil), // 7: foyle.logs.GetTraceResponse + (*GetBlockLogRequest)(nil), // 8: foyle.logs.GetBlockLogRequest + (*GetBlockLogResponse)(nil), // 9: foyle.logs.GetBlockLogResponse + (*GetLLMLogsRequest)(nil), // 10: foyle.logs.GetLLMLogsRequest + (*GetLLMLogsResponse)(nil), // 11: foyle.logs.GetLLMLogsResponse + (*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp + (*v1alpha1.RAGResult)(nil), // 13: RAGResult + (v1alpha1.ModelProvider)(0), // 14: ModelProvider + (*v1alpha1.GenerateRequest)(nil), // 15: GenerateRequest + (*v1alpha1.GenerateResponse)(nil), // 16: GenerateResponse + (*BlockLog)(nil), // 17: foyle.logs.BlockLog + (*GetLogsStatusRequest)(nil), // 18: foyle.logs.GetLogsStatusRequest + (*GetLogsStatusResponse)(nil), // 19: foyle.logs.GetLogsStatusResponse } var file_foyle_logs_traces_proto_depIdxs = []int32{ - 11, // 0: foyle.logs.Trace.end_time:type_name -> google.protobuf.Timestamp - 11, // 1: foyle.logs.Trace.start_time:type_name -> google.protobuf.Timestamp - 3, // 2: foyle.logs.Trace.generate:type_name -> foyle.logs.GenerateTrace + 12, // 0: foyle.logs.Trace.end_time:type_name -> google.protobuf.Timestamp + 12, // 1: foyle.logs.Trace.start_time:type_name -> google.protobuf.Timestamp + 4, // 2: foyle.logs.Trace.generate:type_name -> foyle.logs.GenerateTrace 1, // 3: foyle.logs.Trace.spans:type_name -> foyle.logs.Span 2, // 4: foyle.logs.Span.rag:type_name -> foyle.logs.RAGSpan - 12, // 5: foyle.logs.RAGSpan.results:type_name -> RAGResult - 13, // 6: foyle.logs.GenerateTrace.request:type_name -> GenerateRequest - 14, // 7: foyle.logs.GenerateTrace.response:type_name -> GenerateResponse - 0, // 8: foyle.logs.GetTraceResponse.trace:type_name -> foyle.logs.Trace - 15, // 9: foyle.logs.GetBlockLogResponse.block_log:type_name -> foyle.logs.BlockLog - 5, // 10: foyle.logs.LogsService.GetTrace:input_type -> foyle.logs.GetTraceRequest - 7, // 11: foyle.logs.LogsService.GetBlockLog:input_type -> foyle.logs.GetBlockLogRequest - 9, // 12: foyle.logs.LogsService.GetLLMLogs:input_type -> foyle.logs.GetLLMLogsRequest - 16, // 13: foyle.logs.LogsService.Status:input_type -> foyle.logs.GetLogsStatusRequest - 6, // 14: foyle.logs.LogsService.GetTrace:output_type -> foyle.logs.GetTraceResponse - 8, // 15: foyle.logs.LogsService.GetBlockLog:output_type -> foyle.logs.GetBlockLogResponse - 10, // 16: foyle.logs.LogsService.GetLLMLogs:output_type -> foyle.logs.GetLLMLogsResponse - 17, // 17: foyle.logs.LogsService.Status:output_type -> foyle.logs.GetLogsStatusResponse - 14, // [14:18] is the sub-list for method output_type - 10, // [10:14] is the sub-list for method input_type - 10, // [10:10] is the sub-list for extension type_name - 10, // [10:10] is the sub-list for extension extendee - 0, // [0:10] is the sub-list for field type_name + 3, // 5: foyle.logs.Span.llm:type_name -> foyle.logs.LLMSpan + 13, // 6: foyle.logs.RAGSpan.results:type_name -> RAGResult + 14, // 7: foyle.logs.LLMSpan.provider:type_name -> ModelProvider + 15, // 8: foyle.logs.GenerateTrace.request:type_name -> GenerateRequest + 16, // 9: foyle.logs.GenerateTrace.response:type_name -> GenerateResponse + 0, // 10: foyle.logs.GetTraceResponse.trace:type_name -> foyle.logs.Trace + 17, // 11: foyle.logs.GetBlockLogResponse.block_log:type_name -> foyle.logs.BlockLog + 6, // 12: foyle.logs.LogsService.GetTrace:input_type -> foyle.logs.GetTraceRequest + 8, // 13: foyle.logs.LogsService.GetBlockLog:input_type -> foyle.logs.GetBlockLogRequest + 10, // 14: foyle.logs.LogsService.GetLLMLogs:input_type -> foyle.logs.GetLLMLogsRequest + 18, // 15: foyle.logs.LogsService.Status:input_type -> foyle.logs.GetLogsStatusRequest + 7, // 16: foyle.logs.LogsService.GetTrace:output_type -> foyle.logs.GetTraceResponse + 9, // 17: foyle.logs.LogsService.GetBlockLog:output_type -> foyle.logs.GetBlockLogResponse + 11, // 18: foyle.logs.LogsService.GetLLMLogs:output_type -> foyle.logs.GetLLMLogsResponse + 19, // 19: foyle.logs.LogsService.Status:output_type -> foyle.logs.GetLogsStatusResponse + 16, // [16:20] is the sub-list for method output_type + 12, // [12:16] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_foyle_logs_traces_proto_init() } @@ -919,7 +1012,7 @@ func file_foyle_logs_traces_proto_init() { } } file_foyle_logs_traces_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateTrace); i { + switch v := v.(*LLMSpan); i { case 0: return &v.state case 1: @@ -931,7 +1024,7 @@ func file_foyle_logs_traces_proto_init() { } } file_foyle_logs_traces_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogEntries); i { + switch v := v.(*GenerateTrace); i { case 0: return &v.state case 1: @@ -943,7 +1036,7 @@ func file_foyle_logs_traces_proto_init() { } } file_foyle_logs_traces_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTraceRequest); i { + switch v := v.(*LogEntries); i { case 0: return &v.state case 1: @@ -955,7 +1048,7 @@ func file_foyle_logs_traces_proto_init() { } } file_foyle_logs_traces_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTraceResponse); i { + switch v := v.(*GetTraceRequest); i { case 0: return &v.state case 1: @@ -967,7 +1060,7 @@ func file_foyle_logs_traces_proto_init() { } } file_foyle_logs_traces_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBlockLogRequest); i { + switch v := v.(*GetTraceResponse); i { case 0: return &v.state case 1: @@ -979,7 +1072,7 @@ func file_foyle_logs_traces_proto_init() { } } file_foyle_logs_traces_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBlockLogResponse); i { + switch v := v.(*GetBlockLogRequest); i { case 0: return &v.state case 1: @@ -991,7 +1084,7 @@ func file_foyle_logs_traces_proto_init() { } } file_foyle_logs_traces_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLLMLogsRequest); i { + switch v := v.(*GetBlockLogResponse); i { case 0: return &v.state case 1: @@ -1003,6 +1096,18 @@ func file_foyle_logs_traces_proto_init() { } } file_foyle_logs_traces_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLLMLogsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_foyle_logs_traces_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetLLMLogsResponse); i { case 0: return &v.state @@ -1020,6 +1125,7 @@ func file_foyle_logs_traces_proto_init() { } file_foyle_logs_traces_proto_msgTypes[1].OneofWrappers = []interface{}{ (*Span_Rag)(nil), + (*Span_Llm)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -1027,7 +1133,7 @@ func file_foyle_logs_traces_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_foyle_logs_traces_proto_rawDesc, NumEnums: 0, - NumMessages: 11, + NumMessages: 12, NumExtensions: 0, NumServices: 1, }, diff --git a/protos/go/foyle/logs/traces.zap.go b/protos/go/foyle/logs/traces.zap.go index cf49d5c1..47a8f234 100644 --- a/protos/go/foyle/logs/traces.zap.go +++ b/protos/go/foyle/logs/traces.zap.go @@ -95,6 +95,17 @@ func (m *Span) MarshalLogObject(enc go_uber_org_zap_zapcore.ObjectEncoder) error } } + keyName = "llm" // field llm = 3 + if ov, ok := m.GetData().(*Span_Llm); ok { + _ = ov + if ov.Llm != nil { + var vv interface{} = ov.Llm + if marshaler, ok := vv.(go_uber_org_zap_zapcore.ObjectMarshaler); ok { + enc.AddObject(keyName, marshaler) + } + } + } + return nil } @@ -126,6 +137,26 @@ func (m *RAGSpan) MarshalLogObject(enc go_uber_org_zap_zapcore.ObjectEncoder) er return nil } +func (m *LLMSpan) MarshalLogObject(enc go_uber_org_zap_zapcore.ObjectEncoder) error { + var keyName string + _ = keyName + + if m == nil { + return nil + } + + keyName = "provider" // field provider = 1 + enc.AddString(keyName, m.Provider.String()) + + keyName = "request_json" // field request_json = 2 + enc.AddString(keyName, m.RequestJson) + + keyName = "response_json" // field response_json = 3 + enc.AddString(keyName, m.ResponseJson) + + return nil +} + func (m *GenerateTrace) MarshalLogObject(enc go_uber_org_zap_zapcore.ObjectEncoder) error { var keyName string _ = keyName diff --git a/protos/go/foyle/v1alpha1/agent.pb.go b/protos/go/foyle/v1alpha1/agent.pb.go index 35627c4c..aa006a3e 100644 --- a/protos/go/foyle/v1alpha1/agent.pb.go +++ b/protos/go/foyle/v1alpha1/agent.pb.go @@ -140,6 +140,8 @@ type GenerateRequest struct { unknownFields protoimpl.UnknownFields Doc *Doc `protobuf:"bytes,1,opt,name=doc,proto3" json:"doc,omitempty"` + // The index of the selected cell. + SelectedIndex int32 `protobuf:"varint,2,opt,name=selected_index,json=selectedIndex,proto3" json:"selected_index,omitempty"` } func (x *GenerateRequest) Reset() { @@ -181,6 +183,13 @@ func (x *GenerateRequest) GetDoc() *Doc { return nil } +func (x *GenerateRequest) GetSelectedIndex() int32 { + if x != nil { + return x.SelectedIndex + } + return 0 +} + type GenerateResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -668,6 +677,8 @@ type GenerateCellsRequest struct { unknownFields protoimpl.UnknownFields Notebook *v1.Notebook `protobuf:"bytes,1,opt,name=notebook,proto3" json:"notebook,omitempty"` + // The index of the selected cell. + SelectedIndex int32 `protobuf:"varint,2,opt,name=selected_index,json=selectedIndex,proto3" json:"selected_index,omitempty"` } func (x *GenerateCellsRequest) Reset() { @@ -709,6 +720,13 @@ func (x *GenerateCellsRequest) GetNotebook() *v1.Notebook { return nil } +func (x *GenerateCellsRequest) GetSelectedIndex() int32 { + if x != nil { + return x.SelectedIndex + } + return 0 +} + type GenerateCellsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1128,137 +1146,142 @@ var file_foyle_v1alpha1_agent_proto_rawDesc = []byte{ 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x72, 0x75, 0x6e, 0x6d, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0x29, 0x0a, 0x0f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x22, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x03, 0x64, 0x6f, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x04, 0x2e, 0x44, 0x6f, 0x63, 0x52, 0x03, 0x64, 0x6f, 0x63, 0x22, 0x4d, 0x0a, 0x10, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1e, 0x0a, 0x06, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x06, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x06, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, - 0x19, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x0e, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x05, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x06, 0x2e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x39, 0x0a, 0x0f, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, - 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x07, 0x6f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x73, 0x22, 0x9e, 0x01, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x31, 0x0a, 0x0c, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x66, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x12, 0x28, 0x0a, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x48, 0x00, 0x52, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x49, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x0b, 0x46, 0x75, 0x6c, 0x6c, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6f, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x75, 0x6e, 0x6d, 0x65, - 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, - 0x6f, 0x6f, 0x6b, 0x52, 0x08, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x6f, 0x74, - 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x55, 0x72, 0x69, 0x22, 0x3a, 0x0a, 0x0d, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x29, 0x0a, - 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x75, - 0x6e, 0x6d, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x65, - 0x6c, 0x6c, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x24, 0x0a, 0x06, 0x46, 0x69, 0x6e, 0x69, - 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x22, 0xa4, - 0x01, 0x0a, 0x16, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x63, 0x65, 0x6c, - 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x75, 0x6e, 0x6d, 0x65, - 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x52, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6f, - 0x6f, 0x6b, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x6f, - 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x55, 0x72, 0x69, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x73, - 0x65, 0x72, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x69, 0x6e, - 0x73, 0x65, 0x72, 0x74, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x49, 0x64, 0x22, 0x4d, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, + 0x32, 0x04, 0x2e, 0x44, 0x6f, 0x63, 0x52, 0x03, 0x64, 0x6f, 0x63, 0x12, 0x25, 0x0a, 0x0e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x22, 0x4d, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x06, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x06, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x06, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, + 0x64, 0x22, 0x2e, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x06, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x22, 0x39, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x22, 0x9e, 0x01, 0x0a, + 0x15, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0c, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x46, + 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x66, 0x75, + 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x28, 0x0a, 0x06, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x48, 0x00, 0x52, 0x06, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x49, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x83, 0x01, + 0x0a, 0x0b, 0x46, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x75, 0x6e, 0x6d, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, 0x08, 0x6e, 0x6f, 0x74, 0x65, - 0x62, 0x6f, 0x6f, 0x6b, 0x22, 0x44, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, - 0x75, 0x6e, 0x6d, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x65, 0x6c, 0x6c, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, - 0x41, 0x49, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x23, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x45, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x38, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x22, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x07, 0x65, - 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0x35, 0x0a, 0x10, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x06, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x4c, 0x6f, 0x67, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xdc, 0x01, - 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, - 0x75, 0x6e, 0x6d, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x65, 0x6c, 0x6c, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x13, 0x0a, 0x11, + 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x5f, 0x75, 0x72, 0x69, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, + 0x55, 0x72, 0x69, 0x22, 0x3a, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x75, 0x6e, 0x6d, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, + 0x24, 0x0a, 0x06, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63, 0x63, + 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x63, 0x63, + 0x65, 0x70, 0x74, 0x65, 0x64, 0x22, 0xa4, 0x01, 0x0a, 0x16, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2b, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x72, 0x75, 0x6e, 0x6d, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x55, 0x72, 0x69, + 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x41, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x49, 0x64, 0x22, 0x74, 0x0a, 0x14, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x75, 0x6e, 0x6d, 0x65, 0x2e, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, + 0x6b, 0x52, 0x08, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x25, 0x0a, 0x0e, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x22, 0x44, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x65, + 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x63, + 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x75, 0x6e, + 0x6d, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x65, 0x6c, + 0x6c, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x41, 0x49, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x23, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x38, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x22, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x08, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x07, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x22, 0x35, 0x0a, 0x10, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xdc, 0x01, 0x0a, 0x08, + 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x63, + 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x75, 0x6e, + 0x6d, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x65, 0x6c, + 0x6c, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x19, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x4c, 0x6f, + 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, + 0x32, 0x0a, 0x0f, 0x41, 0x49, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, + 0x06, 0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x54, 0x5f, 0x4f, + 0x4b, 0x10, 0x02, 0x2a, 0x6e, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, + 0x45, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x43, 0x43, 0x45, 0x50, 0x54, 0x45, 0x44, 0x10, + 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, + 0x11, 0x0a, 0x0d, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, + 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, + 0x44, 0x10, 0x05, 0x32, 0x44, 0x0a, 0x0f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x12, 0x10, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x0f, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xb2, 0x02, 0x0a, 0x09, + 0x41, 0x49, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x0e, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, + 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x65, + 0x6c, 0x6c, 0x73, 0x12, 0x15, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x65, + 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x37, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x45, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x12, 0x12, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x34, 0x0a, + 0x09, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x11, 0x2e, 0x4c, 0x6f, 0x67, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2a, 0x32, 0x0a, 0x0f, 0x41, 0x49, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, - 0x00, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x54, - 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x2a, 0x6e, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x45, 0x43, - 0x55, 0x54, 0x45, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x43, 0x43, 0x45, 0x50, 0x54, 0x45, - 0x44, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, - 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, - 0x52, 0x54, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, - 0x45, 0x4e, 0x44, 0x10, 0x05, 0x32, 0x44, 0x0a, 0x0f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x12, 0x10, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0x40, 0x0a, 0x0e, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2e, 0x0a, - 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x0f, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xb2, 0x02, - 0x0a, 0x09, 0x41, 0x49, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x0e, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x28, 0x01, 0x30, 0x01, 0x12, 0x40, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x15, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x37, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x45, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x12, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x34, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x11, 0x2e, 0x4c, - 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x12, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x0e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x0f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x3f, 0x42, 0x0a, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, - 0x6c, 0x65, 0x77, 0x69, 0x2f, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0e, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x42, 0x3f, 0x42, 0x0a, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x6c, 0x65, + 0x77, 0x69, 0x2f, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, + 0x67, 0x6f, 0x2f, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/protos/go/foyle/v1alpha1/agent.zap.go b/protos/go/foyle/v1alpha1/agent.zap.go index c4acd663..b37110e8 100644 --- a/protos/go/foyle/v1alpha1/agent.zap.go +++ b/protos/go/foyle/v1alpha1/agent.zap.go @@ -33,6 +33,9 @@ func (m *GenerateRequest) MarshalLogObject(enc go_uber_org_zap_zapcore.ObjectEnc } } + keyName = "selected_index" // field selected_index = 2 + enc.AddInt32(keyName, m.SelectedIndex) + return nil } @@ -252,6 +255,9 @@ func (m *GenerateCellsRequest) MarshalLogObject(enc go_uber_org_zap_zapcore.Obje } } + keyName = "selected_index" // field selected_index = 2 + enc.AddInt32(keyName, m.SelectedIndex) + return nil } diff --git a/protos/go/foyle/v1alpha1/eval.pb.go b/protos/go/foyle/v1alpha1/eval.pb.go index 517e8523..44a06ef1 100644 --- a/protos/go/foyle/v1alpha1/eval.pb.go +++ b/protos/go/foyle/v1alpha1/eval.pb.go @@ -182,7 +182,8 @@ type EvalResult struct { // Example is the answer and expected result Example *EvalExample `protobuf:"bytes,1,opt,name=example,proto3" json:"example,omitempty"` ActualCells []*v1.Cell `protobuf:"bytes,11,rep,name=actual_cells,json=actualCells,proto3" json:"actual_cells,omitempty"` - Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` + // Error indicates an error generating the completion. + Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` // Status of the evaluation Status EvalResultStatus `protobuf:"varint,6,opt,name=status,proto3,enum=EvalResultStatus" json:"status,omitempty"` // The ID of the generate trace diff --git a/protos/go/foyle/v1alpha1/providers.pb.go b/protos/go/foyle/v1alpha1/providers.pb.go new file mode 100644 index 00000000..19c188a4 --- /dev/null +++ b/protos/go/foyle/v1alpha1/providers.pb.go @@ -0,0 +1,140 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc (unknown) +// source: foyle/v1alpha1/providers.proto + +package v1alpha1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ModelProvider int32 + +const ( + ModelProvider_MODEL_PROVIDER_UNKNOWN ModelProvider = 0 + ModelProvider_OPEN_AI ModelProvider = 1 + ModelProvider_ANTHROPIC ModelProvider = 2 + ModelProvider_REPLICATE ModelProvider = 3 +) + +// Enum value maps for ModelProvider. +var ( + ModelProvider_name = map[int32]string{ + 0: "MODEL_PROVIDER_UNKNOWN", + 1: "OPEN_AI", + 2: "ANTHROPIC", + 3: "REPLICATE", + } + ModelProvider_value = map[string]int32{ + "MODEL_PROVIDER_UNKNOWN": 0, + "OPEN_AI": 1, + "ANTHROPIC": 2, + "REPLICATE": 3, + } +) + +func (x ModelProvider) Enum() *ModelProvider { + p := new(ModelProvider) + *p = x + return p +} + +func (x ModelProvider) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ModelProvider) Descriptor() protoreflect.EnumDescriptor { + return file_foyle_v1alpha1_providers_proto_enumTypes[0].Descriptor() +} + +func (ModelProvider) Type() protoreflect.EnumType { + return &file_foyle_v1alpha1_providers_proto_enumTypes[0] +} + +func (x ModelProvider) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ModelProvider.Descriptor instead. +func (ModelProvider) EnumDescriptor() ([]byte, []int) { + return file_foyle_v1alpha1_providers_proto_rawDescGZIP(), []int{0} +} + +var File_foyle_v1alpha1_providers_proto protoreflect.FileDescriptor + +var file_foyle_v1alpha1_providers_proto_rawDesc = []byte{ + 0x0a, 0x1e, 0x66, 0x6f, 0x79, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2a, 0x56, 0x0a, 0x0d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x4f, 0x44, 0x45, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, + 0x44, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x4f, 0x50, 0x45, 0x4e, 0x5f, 0x41, 0x49, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x4e, + 0x54, 0x48, 0x52, 0x4f, 0x50, 0x49, 0x43, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x45, 0x50, + 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x10, 0x03, 0x42, 0x43, 0x42, 0x0e, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x6c, 0x65, 0x77, 0x69, 0x2f, 0x66, + 0x6f, 0x79, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x66, + 0x6f, 0x79, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_foyle_v1alpha1_providers_proto_rawDescOnce sync.Once + file_foyle_v1alpha1_providers_proto_rawDescData = file_foyle_v1alpha1_providers_proto_rawDesc +) + +func file_foyle_v1alpha1_providers_proto_rawDescGZIP() []byte { + file_foyle_v1alpha1_providers_proto_rawDescOnce.Do(func() { + file_foyle_v1alpha1_providers_proto_rawDescData = protoimpl.X.CompressGZIP(file_foyle_v1alpha1_providers_proto_rawDescData) + }) + return file_foyle_v1alpha1_providers_proto_rawDescData +} + +var file_foyle_v1alpha1_providers_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_foyle_v1alpha1_providers_proto_goTypes = []interface{}{ + (ModelProvider)(0), // 0: ModelProvider +} +var file_foyle_v1alpha1_providers_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_foyle_v1alpha1_providers_proto_init() } +func file_foyle_v1alpha1_providers_proto_init() { + if File_foyle_v1alpha1_providers_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_foyle_v1alpha1_providers_proto_rawDesc, + NumEnums: 1, + NumMessages: 0, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_foyle_v1alpha1_providers_proto_goTypes, + DependencyIndexes: file_foyle_v1alpha1_providers_proto_depIdxs, + EnumInfos: file_foyle_v1alpha1_providers_proto_enumTypes, + }.Build() + File_foyle_v1alpha1_providers_proto = out.File + file_foyle_v1alpha1_providers_proto_rawDesc = nil + file_foyle_v1alpha1_providers_proto_goTypes = nil + file_foyle_v1alpha1_providers_proto_depIdxs = nil +} diff --git a/protos/go/foyle/v1alpha1/providers.zap.go b/protos/go/foyle/v1alpha1/providers.zap.go new file mode 100644 index 00000000..69c920c9 --- /dev/null +++ b/protos/go/foyle/v1alpha1/providers.zap.go @@ -0,0 +1,15 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: foyle/v1alpha1/providers.proto + +package v1alpha1 + +import ( + fmt "fmt" + math "math" + proto "github.com/golang/protobuf/proto" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf