X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/a606686934b4028c29dca8e9dae6b2e188cee9c5..f226928c3a074ac4856ba07e8fd7107aba5444a3:/model.go?ds=inline diff --git a/model.go b/model.go index 7c85643..507fbb1 100644 --- a/model.go +++ b/model.go @@ -98,8 +98,10 @@ func modelUserMessage(texts ...string) any { // modelOutputText returns the text of the message items of output. func modelOutputText(output []json.RawMessage) (string, error) { var text strings.Builder + for _, raw := range output { var item ModelOutputItem + err := json.Unmarshal(raw, &item) if err != nil { return "", fmt.Errorf("decode output item: %w", err) @@ -131,6 +133,7 @@ type ModelAPIKey string // Authorize sets the key as the bearer token. func (k ModelAPIKey) Authorize(ctx context.Context, header http.Header) error { header.Set("Authorization", "Bearer "+string(k)) + return ctx.Err() } @@ -214,6 +217,7 @@ func (c *ModelClient) Create(ctx context.Context, request ModelRequest) (ModelRe httpRequest.Header.Set("Content-Type", "application/json") httpRequest.Header.Set("Accept", "text/event-stream") + err = c.auth.Authorize(ctx, httpRequest.Header) if err != nil { return ModelResponse{}, fmt.Errorf("authorize model call: %w", err) @@ -434,6 +438,7 @@ type ModelWireError struct { // without the turn state. func modelQuotaHeaders(header http.Header) map[string]string { var quota map[string]string + for name, values := range header { if !strings.HasPrefix(name, modelQuotaPrefix) || name == modelTurnStateHeader || len(values) == 0 { continue @@ -454,8 +459,11 @@ func modelQuotaHeaders(header http.Header) map[string]string { // the completed response when the stream sent none. func modelReadStream(stream io.Reader) (ModelResponse, error) { var response ModelResponse + reader := bufio.NewReader(stream) + var data bytes.Buffer + for { line, err := reader.ReadBytes('\n') if err != nil && !errors.Is(err, io.EOF) { @@ -472,6 +480,7 @@ func modelReadStream(stream io.Reader) (ModelResponse, error) { } else if data.Len() > 0 { done, eventErr := modelReadEvent(&response, data.Bytes()) data.Reset() + if eventErr != nil || done { return response, eventErr } @@ -487,6 +496,7 @@ func modelReadStream(stream io.Reader) (ModelResponse, error) { // stream. func modelReadEvent(response *ModelResponse, data []byte) (bool, error) { var event ModelStreamEvent + err := json.Unmarshal(data, &event) if err != nil { return true, fmt.Errorf("decode stream event: %w", err)