MCPcopy Create free account
hub / github.com/InferCore/InferCore / invokeNonStream

Method invokeNonStream

internal/adapters/gemini/gemini.go:132–193  ·  view source on GitHub ↗
(ctx context.Context, text, model string)

Source from the content-addressed store, hash-verified

130}
131
132func (a *Adapter) invokeNonStream(ctx context.Context, text, model string) (types.BackendResponse, error) {
133 t0 := time.Now()
134 payload := map[string]any{
135 "contents": []map[string]any{
136 {
137 "role": "user",
138 "parts": []map[string]string{{"text": text}},
139 },
140 },
141 }
142 raw, err := json.Marshal(payload)
143 if err != nil {
144 return types.BackendResponse{}, err
145 }
146 url := a.baseURL + a.actionPath(model, "generateContent")
147 httpReq, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(raw))
148 if err != nil {
149 return types.BackendResponse{}, err
150 }
151 httpReq.Header.Set("Content-Type", "application/json")
152 a.applyAPIKey(httpReq)
153 a.applyExtraHeaders(httpReq)
154
155 resp, err := a.httpClient.Do(httpReq)
156 if err != nil {
157 if errors.Is(err, context.DeadlineExceeded) {
158 return types.BackendResponse{}, upstream.New(upstream.KindTimeout, err.Error())
159 }
160 return types.BackendResponse{}, err
161 }
162 defer resp.Body.Close()
163 if resp.StatusCode < 200 || resp.StatusCode >= 300 {
164 if resp.StatusCode >= 500 {
165 return types.BackendResponse{}, upstream.New(upstream.KindUpstream5xx, fmt.Sprintf("gemini generateContent failed status=%d", resp.StatusCode))
166 }
167 return types.BackendResponse{}, upstream.New(upstream.KindUpstream4xx, fmt.Sprintf("gemini generateContent failed status=%d", resp.StatusCode))
168 }
169
170 var parsed geminiGenerateResponse
171 if err := json.NewDecoder(resp.Body).Decode(&parsed); err != nil {
172 return types.BackendResponse{}, upstream.New(upstream.KindBackendError, err.Error())
173 }
174 out := geminiCandidatesText(parsed.Candidates)
175 if out == "" {
176 out = "[gemini] empty response"
177 }
178 t1 := time.Now()
179 lat := t1.Sub(t0).Milliseconds()
180 return types.BackendResponse{
181 Output: map[string]any{
182 "text": out,
183 "backend": a.cfg.Name,
184 "stream_requested": false,
185 "stream_degraded": false,
186 },
187 Timing: &types.BackendTiming{
188 TTFTMs: lat,
189 CompletionLatencyMs: lat,

Callers 1

InvokeMethod · 0.95

Calls 7

actionPathMethod · 0.95
applyAPIKeyMethod · 0.95
applyExtraHeadersMethod · 0.95
NewFunction · 0.92
geminiCandidatesTextFunction · 0.85
CloseMethod · 0.65
ErrorMethod · 0.45

Tested by

no test coverage detected