@@ -47,21 +47,36 @@ type Server struct {
47
47
shuttingDownB bool
48
48
// shuttingDownCh will receive when we start graceful shutdown
49
49
shuttingDownCh chan struct {}
50
+
51
+ bridge * Bridge
50
52
}
51
53
52
- func New (clientDialer Dialer ,logger slog.Logger ) (* Server ,error ) {
53
- ctx ,ctxCancel := context .WithCancel (context .Background ())
54
+ func New (rpcDialer Dialer ,httpAddr string ,logger slog.Logger ) (* Server ,error ) {
55
+ if rpcDialer == nil {
56
+ return nil ,xerrors .Errorf ("nil rpcDialer given" )
57
+ }
58
+
59
+ ctx ,cancel := context .WithCancel (context .Background ())
60
+ bridge := NewBridge (httpAddr )
54
61
daemon := & Server {
55
62
logger :logger ,
56
- clientDialer :clientDialer ,
63
+ clientDialer :rpcDialer ,
57
64
clientCh :make (chan proto.DRPCAIBridgeDaemonClient ),
58
65
closeContext :ctx ,
59
- closeCancel :ctxCancel ,
66
+ closeCancel :cancel ,
60
67
closedCh :make (chan struct {}),
61
68
shuttingDownCh :make (chan struct {}),
62
69
initConnectionCh :make (chan struct {}),
70
+
71
+ bridge :bridge ,
63
72
}
64
73
go daemon .connect ()
74
+ go func () {
75
+ err := bridge .Serve ()
76
+ // TODO: better error handling.
77
+ // TODO: close on shutdown.
78
+ logger .Error (ctx ,"bridge server stopped" ,slog .Error (err ))
79
+ }()
65
80
66
81
return daemon ,nil
67
82
}// Connect establishes a connection to coderd.
@@ -148,57 +163,61 @@ func (s *Server) AuditPrompt(ctx context.Context, in *proto.AuditPromptRequest)
148
163
return out ,nil
149
164
}
150
165
151
- func (s * Server )ChatCompletions (payload * proto.JSONPayload ,stream proto.DRPCOpenAIService_ChatCompletionsStream )error {
152
- // TODO: call OpenAI API.
166
+ //func (s *Server) ChatCompletions(payload *proto.JSONPayload, stream proto.DRPCOpenAIService_ChatCompletionsStream) error {
167
+ //// TODO: call OpenAI API.
168
+ //
169
+ //select {
170
+ //case <-stream.Context().Done():
171
+ //return nil
172
+ //default:
173
+ //}
174
+ //
175
+ //err := stream.Send(&proto.JSONPayload{
176
+ //Content: `
177
+ //{
178
+ // "id": "chatcmpl-B9MBs8CjcvOU2jLn4n570S5qMJKcT",
179
+ // "object": "chat.completion",
180
+ // "created": 1741569952,
181
+ // "model": "gpt-4.1-2025-04-14",
182
+ // "choices": [
183
+ // {
184
+ // "index": 0,
185
+ // "message": {
186
+ // "role": "assistant",
187
+ // "content": "Hello! How can I assist you today?",
188
+ // "refusal": null,
189
+ // "annotations": []
190
+ // },
191
+ // "logprobs": null,
192
+ // "finish_reason": "stop"
193
+ // }
194
+ // ],
195
+ // "usage": {
196
+ // "prompt_tokens": 19,
197
+ // "completion_tokens": 10,
198
+ // "total_tokens": 29,
199
+ // "prompt_tokens_details": {
200
+ // "cached_tokens": 0,
201
+ // "audio_tokens": 0
202
+ // },
203
+ // "completion_tokens_details": {
204
+ // "reasoning_tokens": 0,
205
+ // "audio_tokens": 0,
206
+ // "accepted_prediction_tokens": 0,
207
+ // "rejected_prediction_tokens": 0
208
+ // }
209
+ // },
210
+ // "service_tier": "default"
211
+ //}
212
+ //`})
213
+ //if err != nil {
214
+ //return xerrors.Errorf("stream chat completion response: %w", err)
215
+ //}
216
+ //return nil
217
+ //}
153
218
154
- select {
155
- case <- stream .Context ().Done ():
156
- return nil
157
- default :
158
- }
159
-
160
- err := stream .Send (& proto.JSONPayload {
161
- Content :`
162
- {
163
- "id": "chatcmpl-B9MBs8CjcvOU2jLn4n570S5qMJKcT",
164
- "object": "chat.completion",
165
- "created": 1741569952,
166
- "model": "gpt-4.1-2025-04-14",
167
- "choices": [
168
- {
169
- "index": 0,
170
- "message": {
171
- "role": "assistant",
172
- "content": "Hello! How can I assist you today?",
173
- "refusal": null,
174
- "annotations": []
175
- },
176
- "logprobs": null,
177
- "finish_reason": "stop"
178
- }
179
- ],
180
- "usage": {
181
- "prompt_tokens": 19,
182
- "completion_tokens": 10,
183
- "total_tokens": 29,
184
- "prompt_tokens_details": {
185
- "cached_tokens": 0,
186
- "audio_tokens": 0
187
- },
188
- "completion_tokens_details": {
189
- "reasoning_tokens": 0,
190
- "audio_tokens": 0,
191
- "accepted_prediction_tokens": 0,
192
- "rejected_prediction_tokens": 0
193
- }
194
- },
195
- "service_tier": "default"
196
- }
197
- ` })
198
- if err != nil {
199
- return xerrors .Errorf ("stream chat completion response: %w" ,err )
200
- }
201
- return nil
219
+ func (s * Server )BridgeAddr ()string {
220
+ return s .bridge .Addr ()
202
221
}
203
222
204
223
// TODO: direct copy/paste from provisionerd, abstract into common util.