diff --git a/app/api/types.go b/app/api/types.go index a879532..28145b4 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 ce6dec5..669e084 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 173da82..bb61670 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 32774d5..43b45df 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 7864725..095d717 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 413890c..e680260 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 02d2693..5c2e660 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 586fc40..1fdd019 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 c457bd1..28fc0a7 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 c788e6e..819bba4 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 c1b6d46..143fda7 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 83bb667..821ba98 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 94588d0..2586cbf 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 0000000..8378535 --- /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 e837565..0911e35 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 2288697..8e925a3 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 5743cec..0256d4e 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 6d5cf04..ae66074 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 cf49d5c..47a8f23 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 35627c4..aa006a3 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 c4acd66..b37110e 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 517e852..44a06ef 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 0000000..19c188a --- /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 0000000..69c920c --- /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