@@ -12,6 +12,7 @@ import (
1212 "github.com/bricks-cloud/bricksllm/internal/util"
1313 "github.com/gin-gonic/gin"
1414
15+ responsesOpenai "github.com/openai/openai-go/responses"
1516 goopenai "github.com/sashabaranov/go-openai"
1617)
1718
@@ -42,11 +43,11 @@ func getResponsesHandler(prod, private bool, client http.Client, e estimator) gi
4243
4344 // TODO
4445 isStreaming := c .GetBool ("stream" )
45- // if isStreaming {
46- // req.Header.Set("Accept", "text/event-stream")
47- // req.Header.Set("Cache-Control", "no-cache")
48- // req.Header.Set("Connection", "keep-alive")
49- // }
46+ if isStreaming {
47+ req .Header .Set ("Accept" , "text/event-stream" )
48+ req .Header .Set ("Cache-Control" , "no-cache" )
49+ req .Header .Set ("Connection" , "keep-alive" )
50+ }
5051
5152 start := time .Now ()
5253 res , err := client .Do (req )
@@ -66,8 +67,47 @@ func getResponsesHandler(prod, private bool, client http.Client, e estimator) gi
6667 }
6768 }
6869
70+ model := c .GetString ("model" )
71+
6972 if res .StatusCode == http .StatusOK && ! isStreaming {
73+ dur := time .Since (start )
74+ telemetry .Timing ("bricksllm.proxy.get_responses_handler.latency" , dur , nil , 1 )
75+
76+ bytes , err := io .ReadAll (res .Body )
77+ if err != nil {
78+ logError (log , "error when reading openai http response api response body" , prod , err )
79+ JSON (c , http .StatusInternalServerError , "[BricksLLM] failed to read openai response body" )
80+ return
81+ }
82+
83+ var cost float64 = 0
84+ resp := & responsesOpenai.Response {}
85+ telemetry .Incr ("bricksllm.proxy.get_responses_handler.success" , nil , 1 )
86+ telemetry .Timing ("bricksllm.proxy.get_responses_handler.success_latency" , dur , nil , 1 )
87+
88+ err = json .Unmarshal (bytes , resp )
89+ if err != nil {
90+ logError (log , "error when unmarshalling openai http response api response body" , prod , err )
91+ }
7092 // TODO: implement non-streaming logic here
93+
94+ if err == nil {
95+ // TODO log
96+ //logChatCompletionResponse(log, prod, private, chatRes)
97+ cost , err = e .EstimateResponseApiTotalCost (model , resp .Usage )
98+ if err != nil {
99+ telemetry .Incr ("bricksllm.proxy.get_chat_completion_handler.estimate_total_cost_error" , nil , 1 )
100+ logError (log , "error when estimating openai cost" , prod , err )
101+ }
102+ //m, exists := c.Get("cost_map")
103+ }
104+
105+ c .Set ("costInUsd" , cost )
106+ c .Set ("promptTokenCount" , resp .Usage .InputTokens )
107+ c .Set ("completionTokenCount" , resp .Usage .OutputTokens )
108+
109+ c .Data (res .StatusCode , "application/json" , bytes )
110+ return
71111 }
72112
73113 if res .StatusCode != http .StatusOK {
@@ -94,7 +134,9 @@ func getResponsesHandler(prod, private bool, client http.Client, e estimator) gi
94134 return
95135 }
96136
137+ // handle streaming response
138+ telemetry .Incr ("bricksllm.proxy.get_responses_handler.streaming_requests" , nil , 1 )
97139 // TODO: implement the actual streaming logic here
98-
140+ telemetry . Timing ( "bricksllm.proxy.get_chat_completion_handler.streaming_latency" , time . Since ( start ), nil , 1 )
99141 }
100142}
0 commit comments