Skip to content

Commit 2846957

Browse files
authored
Merge branch 'router-for-me:main' into main
2 parents ef0edbf + bb6312b commit 2846957

File tree

5 files changed

+276
-328
lines changed

5 files changed

+276
-328
lines changed

internal/runtime/executor/aistudio_executor.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
// Package executor provides runtime execution capabilities for various AI service providers.
2+
// This file implements the AI Studio executor that routes requests through a websocket-backed
3+
// transport for the AI Studio provider.
14
package executor
25

36
import (
@@ -26,19 +29,28 @@ type AIStudioExecutor struct {
2629
cfg *config.Config
2730
}
2831

29-
// NewAIStudioExecutor constructs a websocket executor for the provider name.
32+
// NewAIStudioExecutor creates a new AI Studio executor instance.
33+
//
34+
// Parameters:
35+
// - cfg: The application configuration
36+
// - provider: The provider name
37+
// - relay: The websocket relay manager
38+
//
39+
// Returns:
40+
// - *AIStudioExecutor: A new AI Studio executor instance
3041
func NewAIStudioExecutor(cfg *config.Config, provider string, relay *wsrelay.Manager) *AIStudioExecutor {
3142
return &AIStudioExecutor{provider: strings.ToLower(provider), relay: relay, cfg: cfg}
3243
}
3344

34-
// Identifier returns the logical provider key for routing.
45+
// Identifier returns the executor identifier.
3546
func (e *AIStudioExecutor) Identifier() string { return "aistudio" }
3647

37-
// PrepareRequest is a no-op because websocket transport already injects headers.
48+
// PrepareRequest prepares the HTTP request for execution (no-op for AI Studio).
3849
func (e *AIStudioExecutor) PrepareRequest(_ *http.Request, _ *cliproxyauth.Auth) error {
3950
return nil
4051
}
4152

53+
// Execute performs a non-streaming request to the AI Studio API.
4254
func (e *AIStudioExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth, req cliproxyexecutor.Request, opts cliproxyexecutor.Options) (resp cliproxyexecutor.Response, err error) {
4355
reporter := newUsageReporter(ctx, e.Identifier(), req.Model, auth)
4456
defer reporter.trackFailure(ctx, &err)
@@ -92,6 +104,7 @@ func (e *AIStudioExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth,
92104
return resp, nil
93105
}
94106

107+
// ExecuteStream performs a streaming request to the AI Studio API.
95108
func (e *AIStudioExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth.Auth, req cliproxyexecutor.Request, opts cliproxyexecutor.Options) (stream <-chan cliproxyexecutor.StreamChunk, err error) {
96109
reporter := newUsageReporter(ctx, e.Identifier(), req.Model, auth)
97110
defer reporter.trackFailure(ctx, &err)
@@ -239,6 +252,7 @@ func (e *AIStudioExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth
239252
return stream, nil
240253
}
241254

255+
// CountTokens counts tokens for the given request using the AI Studio API.
242256
func (e *AIStudioExecutor) CountTokens(ctx context.Context, auth *cliproxyauth.Auth, req cliproxyexecutor.Request, opts cliproxyexecutor.Options) (cliproxyexecutor.Response, error) {
243257
_, body, err := e.translateRequest(req, opts, false)
244258
if err != nil {
@@ -293,8 +307,8 @@ func (e *AIStudioExecutor) CountTokens(ctx context.Context, auth *cliproxyauth.A
293307
return cliproxyexecutor.Response{Payload: []byte(translated)}, nil
294308
}
295309

296-
func (e *AIStudioExecutor) Refresh(ctx context.Context, auth *cliproxyauth.Auth) (*cliproxyauth.Auth, error) {
297-
_ = ctx
310+
// Refresh refreshes the authentication credentials (no-op for AI Studio).
311+
func (e *AIStudioExecutor) Refresh(_ context.Context, auth *cliproxyauth.Auth) (*cliproxyauth.Auth, error) {
298312
return auth, nil
299313
}
300314

internal/runtime/executor/antigravity_executor.go

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
// Package executor provides runtime execution capabilities for various AI service providers.
2+
// This file implements the Antigravity executor that proxies requests to the antigravity
3+
// upstream using OAuth credentials.
14
package executor
25

36
import (
@@ -30,16 +33,15 @@ import (
3033
const (
3134
antigravityBaseURLDaily = "https://daily-cloudcode-pa.sandbox.googleapis.com"
3235
// antigravityBaseURLAutopush = "https://autopush-cloudcode-pa.sandbox.googleapis.com"
33-
antigravityBaseURLProd = "https://cloudcode-pa.googleapis.com"
34-
antigravityStreamPath = "/v1internal:streamGenerateContent"
35-
antigravityGeneratePath = "/v1internal:generateContent"
36-
antigravityModelsPath = "/v1internal:fetchAvailableModels"
37-
antigravityClientID = "1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com"
38-
antigravityClientSecret = "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"
39-
defaultAntigravityAgent = "antigravity/1.11.5 windows/amd64"
40-
antigravityAuthType = "antigravity"
41-
refreshSkew = 3000 * time.Second
42-
streamScannerBuffer int = 52_428_800 // 50MB
36+
antigravityBaseURLProd = "https://cloudcode-pa.googleapis.com"
37+
antigravityStreamPath = "/v1internal:streamGenerateContent"
38+
antigravityGeneratePath = "/v1internal:generateContent"
39+
antigravityModelsPath = "/v1internal:fetchAvailableModels"
40+
antigravityClientID = "1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com"
41+
antigravityClientSecret = "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"
42+
defaultAntigravityAgent = "antigravity/1.11.5 windows/amd64"
43+
antigravityAuthType = "antigravity"
44+
refreshSkew = 3000 * time.Second
4345
)
4446

4547
var (
@@ -52,18 +54,24 @@ type AntigravityExecutor struct {
5254
cfg *config.Config
5355
}
5456

55-
// NewAntigravityExecutor constructs a new executor instance.
57+
// NewAntigravityExecutor creates a new Antigravity executor instance.
58+
//
59+
// Parameters:
60+
// - cfg: The application configuration
61+
//
62+
// Returns:
63+
// - *AntigravityExecutor: A new Antigravity executor instance
5664
func NewAntigravityExecutor(cfg *config.Config) *AntigravityExecutor {
5765
return &AntigravityExecutor{cfg: cfg}
5866
}
5967

60-
// Identifier implements ProviderExecutor.
68+
// Identifier returns the executor identifier.
6169
func (e *AntigravityExecutor) Identifier() string { return antigravityAuthType }
6270

63-
// PrepareRequest implements ProviderExecutor.
71+
// PrepareRequest prepares the HTTP request for execution (no-op for Antigravity).
6472
func (e *AntigravityExecutor) PrepareRequest(_ *http.Request, _ *cliproxyauth.Auth) error { return nil }
6573

66-
// Execute handles non-streaming requests via the antigravity generate endpoint.
74+
// Execute performs a non-streaming request to the Antigravity API.
6775
func (e *AntigravityExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth, req cliproxyexecutor.Request, opts cliproxyexecutor.Options) (resp cliproxyexecutor.Response, err error) {
6876
token, updatedAuth, errToken := e.ensureAccessToken(ctx, auth)
6977
if errToken != nil {
@@ -156,7 +164,7 @@ func (e *AntigravityExecutor) Execute(ctx context.Context, auth *cliproxyauth.Au
156164
return resp, err
157165
}
158166

159-
// ExecuteStream handles streaming requests via the antigravity upstream.
167+
// ExecuteStream performs a streaming request to the Antigravity API.
160168
func (e *AntigravityExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth.Auth, req cliproxyexecutor.Request, opts cliproxyexecutor.Options) (stream <-chan cliproxyexecutor.StreamChunk, err error) {
161169
ctx = context.WithValue(ctx, "alt", "")
162170

@@ -296,7 +304,7 @@ func (e *AntigravityExecutor) ExecuteStream(ctx context.Context, auth *cliproxya
296304
return nil, err
297305
}
298306

299-
// Refresh refreshes the OAuth token using the refresh token.
307+
// Refresh refreshes the authentication credentials using the refresh token.
300308
func (e *AntigravityExecutor) Refresh(ctx context.Context, auth *cliproxyauth.Auth) (*cliproxyauth.Auth, error) {
301309
if auth == nil {
302310
return auth, nil
@@ -308,7 +316,7 @@ func (e *AntigravityExecutor) Refresh(ctx context.Context, auth *cliproxyauth.Au
308316
return updated, nil
309317
}
310318

311-
// CountTokens is not supported for the antigravity provider.
319+
// CountTokens counts tokens for the given request (not supported for Antigravity).
312320
func (e *AntigravityExecutor) CountTokens(context.Context, *cliproxyauth.Auth, cliproxyexecutor.Request, cliproxyexecutor.Options) (cliproxyexecutor.Response, error) {
313321
return cliproxyexecutor.Response{}, statusErr{code: http.StatusNotImplemented, msg: "count tokens not supported"}
314322
}

internal/runtime/executor/gemini_cli_executor.go

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
// Package executor provides runtime execution capabilities for various AI service providers.
2+
// This file implements the Gemini CLI executor that talks to Cloud Code Assist endpoints
3+
// using OAuth credentials from auth metadata.
14
package executor
25

36
import (
@@ -29,11 +32,11 @@ import (
2932
const (
3033
codeAssistEndpoint = "https://cloudcode-pa.googleapis.com"
3134
codeAssistVersion = "v1internal"
32-
geminiOauthClientID = "681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com"
33-
geminiOauthClientSecret = "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"
35+
geminiOAuthClientID = "681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com"
36+
geminiOAuthClientSecret = "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"
3437
)
3538

36-
var geminiOauthScopes = []string{
39+
var geminiOAuthScopes = []string{
3740
"https://www.googleapis.com/auth/cloud-platform",
3841
"https://www.googleapis.com/auth/userinfo.email",
3942
"https://www.googleapis.com/auth/userinfo.profile",
@@ -44,14 +47,24 @@ type GeminiCLIExecutor struct {
4447
cfg *config.Config
4548
}
4649

50+
// NewGeminiCLIExecutor creates a new Gemini CLI executor instance.
51+
//
52+
// Parameters:
53+
// - cfg: The application configuration
54+
//
55+
// Returns:
56+
// - *GeminiCLIExecutor: A new Gemini CLI executor instance
4757
func NewGeminiCLIExecutor(cfg *config.Config) *GeminiCLIExecutor {
4858
return &GeminiCLIExecutor{cfg: cfg}
4959
}
5060

61+
// Identifier returns the executor identifier.
5162
func (e *GeminiCLIExecutor) Identifier() string { return "gemini-cli" }
5263

64+
// PrepareRequest prepares the HTTP request for execution (no-op for Gemini CLI).
5365
func (e *GeminiCLIExecutor) PrepareRequest(_ *http.Request, _ *cliproxyauth.Auth) error { return nil }
5466

67+
// Execute performs a non-streaming request to the Gemini CLI API.
5568
func (e *GeminiCLIExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth, req cliproxyexecutor.Request, opts cliproxyexecutor.Options) (resp cliproxyexecutor.Response, err error) {
5669
tokenSource, baseTokenData, err := prepareGeminiCLITokenSource(ctx, e.cfg, auth)
5770
if err != nil {
@@ -189,6 +202,7 @@ func (e *GeminiCLIExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth
189202
return resp, err
190203
}
191204

205+
// ExecuteStream performs a streaming request to the Gemini CLI API.
192206
func (e *GeminiCLIExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth.Auth, req cliproxyexecutor.Request, opts cliproxyexecutor.Options) (stream <-chan cliproxyexecutor.StreamChunk, err error) {
193207
tokenSource, baseTokenData, err := prepareGeminiCLITokenSource(ctx, e.cfg, auth)
194208
if err != nil {
@@ -309,7 +323,7 @@ func (e *GeminiCLIExecutor) ExecuteStream(ctx context.Context, auth *cliproxyaut
309323
}()
310324
if opts.Alt == "" {
311325
scanner := bufio.NewScanner(resp.Body)
312-
scanner.Buffer(nil, 52_428_800) // 50MB
326+
scanner.Buffer(nil, streamScannerBuffer)
313327
var param any
314328
for scanner.Scan() {
315329
line := scanner.Bytes()
@@ -371,6 +385,7 @@ func (e *GeminiCLIExecutor) ExecuteStream(ctx context.Context, auth *cliproxyaut
371385
return nil, err
372386
}
373387

388+
// CountTokens counts tokens for the given request using the Gemini CLI API.
374389
func (e *GeminiCLIExecutor) CountTokens(ctx context.Context, auth *cliproxyauth.Auth, req cliproxyexecutor.Request, opts cliproxyexecutor.Options) (cliproxyexecutor.Response, error) {
375390
tokenSource, baseTokenData, err := prepareGeminiCLITokenSource(ctx, e.cfg, auth)
376391
if err != nil {
@@ -471,9 +486,8 @@ func (e *GeminiCLIExecutor) CountTokens(ctx context.Context, auth *cliproxyauth.
471486
return cliproxyexecutor.Response{}, newGeminiStatusErr(lastStatus, lastBody)
472487
}
473488

474-
func (e *GeminiCLIExecutor) Refresh(ctx context.Context, auth *cliproxyauth.Auth) (*cliproxyauth.Auth, error) {
475-
log.Debugf("gemini cli executor: refresh called")
476-
_ = ctx
489+
// Refresh refreshes the authentication credentials (no-op for Gemini CLI).
490+
func (e *GeminiCLIExecutor) Refresh(_ context.Context, auth *cliproxyauth.Auth) (*cliproxyauth.Auth, error) {
477491
return auth, nil
478492
}
479493

@@ -515,9 +529,9 @@ func prepareGeminiCLITokenSource(ctx context.Context, cfg *config.Config, auth *
515529
}
516530

517531
conf := &oauth2.Config{
518-
ClientID: geminiOauthClientID,
519-
ClientSecret: geminiOauthClientSecret,
520-
Scopes: geminiOauthScopes,
532+
ClientID: geminiOAuthClientID,
533+
ClientSecret: geminiOAuthClientSecret,
534+
Scopes: geminiOAuthScopes,
521535
Endpoint: google.Endpoint,
522536
}
523537

0 commit comments

Comments
 (0)