iop/apps/edge/internal/openai/responses_completion.go

52 lines
1.6 KiB
Go

package openai
import (
"go.uber.org/zap"
edgeservice "iop/apps/edge/internal/service"
"net/http"
"time"
)
func (s *Server) completeResponse(w http.ResponseWriter, dc *responsesDispatchContext, handle edgeservice.RunResult) {
metricLabels := dc.usageLabels(s, responseModeNormalized)
text, reasoning, _, _, usage, _, err := collectRunResult(dc.r.Context(), handle.Stream(), handle.WaitTimeout())
if err != nil {
s.cancelRunOnHTTPGiveUp(handle.Dispatch(), err)
emitUsageMetrics(metricLabels, usageStatusForError(err), usageObservation{})
writeError(w, httpStatusForRunError(err), "run_error", err.Error())
return
}
text, reasoning, normalized := normalizeCompletionOutput(dc.outputPolicy, text, reasoning, false)
s.logger.Info("openai responses output",
zap.String("run_id", handle.Dispatch().RunID),
zap.Bool("strict_output", dc.outputPolicy.Strict),
zap.String("xml_completion_tool", dc.outputPolicy.XMLCompletionTool),
zap.Bool("normalized", normalized),
zap.Int("content_len", len(text)),
zap.Int("reasoning_len", len(reasoning)),
)
var u openAIUsage
if usage != nil {
u = *usage
}
emitUsageMetrics(metricLabels, usageStatusSuccess, usageObservationFromOpenAIUsage(usage, len(reasoning)))
writeJSON(w, http.StatusOK, responsesResponse{
ID: "resp-" + handle.Dispatch().RunID,
Object: "response",
CreatedAt: time.Now().Unix(),
Model: responseModel(dc.req.Model, handle.Dispatch().Target),
OutputText: text,
Output: []responsesOutputItem{{
Type: "message",
Role: "assistant",
Content: []responsesContentItem{{
Type: "output_text",
Text: text,
}},
}},
Usage: u,
})
}