-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathexample_gemini_test.go
More file actions
89 lines (75 loc) · 2.92 KB
/
example_gemini_test.go
File metadata and controls
89 lines (75 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package acp
import (
"context"
"fmt"
"os/exec"
)
// geminiClient mirrors go/example/gemini in brief: prints text chunks and
// selects the first permission option. File ops are no-ops here.
type geminiClient struct{}
var _ Client = (*geminiClient)(nil)
func (geminiClient) RequestPermission(ctx context.Context, p RequestPermissionRequest) (RequestPermissionResponse, error) {
if len(p.Options) == 0 {
return RequestPermissionResponse{Outcome: RequestPermissionOutcome{Cancelled: &RequestPermissionOutcomeCancelled{}}}, nil
}
return RequestPermissionResponse{Outcome: RequestPermissionOutcome{Selected: &RequestPermissionOutcomeSelected{OptionId: p.Options[0].OptionId}}}, nil
}
func (geminiClient) SessionUpdate(ctx context.Context, n SessionNotification) error {
if n.Update.AgentMessageChunk != nil {
c := n.Update.AgentMessageChunk.Content
if c.Text != nil {
fmt.Print(c.Text.Text)
}
}
return nil
}
func (geminiClient) ReadTextFile(ctx context.Context, _ ReadTextFileRequest) (ReadTextFileResponse, error) {
return ReadTextFileResponse{}, nil
}
func (geminiClient) WriteTextFile(ctx context.Context, _ WriteTextFileRequest) (WriteTextFileResponse, error) {
return WriteTextFileResponse{}, nil
}
// Terminal interface implementations (minimal stubs for examples)
func (geminiClient) CreateTerminal(ctx context.Context, p CreateTerminalRequest) (CreateTerminalResponse, error) {
return CreateTerminalResponse{TerminalId: "t-1"}, nil
}
func (geminiClient) KillTerminal(ctx context.Context, p KillTerminalRequest) (KillTerminalResponse, error) {
return KillTerminalResponse{}, nil
}
func (geminiClient) ReleaseTerminal(ctx context.Context, p ReleaseTerminalRequest) (ReleaseTerminalResponse, error) {
return ReleaseTerminalResponse{}, nil
}
func (geminiClient) TerminalOutput(ctx context.Context, p TerminalOutputRequest) (TerminalOutputResponse, error) {
return TerminalOutputResponse{Output: "ok", Truncated: false}, nil
}
func (geminiClient) WaitForTerminalExit(ctx context.Context, p WaitForTerminalExitRequest) (WaitForTerminalExitResponse, error) {
return WaitForTerminalExitResponse{}, nil
}
// Example_gemini connects to a Gemini CLI speaking ACP over stdio,
// then initializes, opens a session, and sends a prompt.
func Example_gemini() {
ctx := context.Background()
cmd := exec.Command("gemini", "--experimental-acp")
stdin, _ := cmd.StdinPipe()
stdout, _ := cmd.StdoutPipe()
_ = cmd.Start()
conn := NewClientSideConnection(geminiClient{}, stdin, stdout)
_, _ = conn.Initialize(ctx, InitializeRequest{
ProtocolVersion: ProtocolVersionNumber,
ClientCapabilities: ClientCapabilities{
Fs: FileSystemCapabilities{
ReadTextFile: true,
WriteTextFile: true,
},
Terminal: true,
},
})
sess, _ := conn.NewSession(ctx, NewSessionRequest{
Cwd: "/",
McpServers: []McpServer{},
})
_, _ = conn.Prompt(ctx, PromptRequest{
SessionId: sess.SessionId,
Prompt: []ContentBlock{TextBlock("list files")},
})
}