Skip to content

Commit f4e1603

Browse files
committed
lint
1 parent 67fe23e commit f4e1603

File tree

5 files changed

+63
-59
lines changed

5 files changed

+63
-59
lines changed

run.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -495,12 +495,12 @@ func (c *Client) CreateThreadAndStream(
495495
req.Header.Set("Cache-Control", "no-cache")
496496
req.Header.Set("Connection", "keep-alive")
497497

498-
resp, err := c.config.HTTPClient.Do(req) //nolint:bodyclose // body is closed in stream.Close()
498+
resp, err := c.config.HTTPClient.Do(req)
499499
if err != nil {
500500
return
501501
}
502502

503-
if resp.StatusCode != 200 {
503+
if resp.StatusCode != http.StatusOK {
504504
resp.Body.Close()
505505
return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode)
506506
}

sse.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"strings"
88
)
99

10-
// NewEOLSplitterFunc returns a bufio.SplitFunc tied to a new EOLSplitter instance
10+
// NewEOLSplitterFunc returns a bufio.SplitFunc tied to a new EOLSplitter instance.
1111
func NewEOLSplitterFunc() bufio.SplitFunc {
1212
splitter := NewEOLSplitter()
1313
return splitter.Split
@@ -23,6 +23,8 @@ func NewEOLSplitter() *EOLSplitter {
2323
return &EOLSplitter{prevCR: false}
2424
}
2525

26+
const crlfLen = 2
27+
2628
// Split function to handle CR LF, CR, and LF as end-of-line.
2729
func (s *EOLSplitter) Split(data []byte, atEOF bool) (advance int, token []byte, err error) {
2830
// Check if the previous data ended with a CR
@@ -38,7 +40,7 @@ func (s *EOLSplitter) Split(data []byte, atEOF bool) (advance int, token []byte,
3840
if data[i] == '\r' {
3941
if i+1 < len(data) && data[i+1] == '\n' {
4042
// Found CR LF
41-
return i + 2, data[:i], nil
43+
return i + crlfLen, data[:i], nil
4244
}
4345
// Found CR
4446
if !atEOF && i == len(data)-1 {
@@ -119,29 +121,27 @@ func (s *SSEScanner) Next() bool {
119121
}
120122

121123
seenNonEmptyLine = true
122-
123-
if strings.HasPrefix(line, "id: ") {
124+
switch {
125+
case strings.HasPrefix(line, "id: "):
124126
event.ID = strings.TrimPrefix(line, "id: ")
125-
} else if strings.HasPrefix(line, "data: ") {
127+
case strings.HasPrefix(line, "data: "):
126128
dataLines = append(dataLines, strings.TrimPrefix(line, "data: "))
127-
} else if strings.HasPrefix(line, "event: ") {
129+
case strings.HasPrefix(line, "event: "):
128130
event.Event = strings.TrimPrefix(line, "event: ")
129-
} else if strings.HasPrefix(line, "retry: ") {
131+
case strings.HasPrefix(line, "retry: "):
130132
retry, err := strconv.Atoi(strings.TrimPrefix(line, "retry: "))
131133
if err == nil {
132134
event.Retry = retry
133135
}
134-
135136
// ignore invalid retry values
136-
} else if strings.HasPrefix(line, ":") {
137+
case strings.HasPrefix(line, ":"):
137138
if s.readComment {
138139
event.Comment = strings.TrimPrefix(line, ":")
139140
}
140-
141141
// ignore comment line
142+
default:
143+
// ignore unknown lines
142144
}
143-
144-
// ignore unknown lines
145145
}
146146

147147
s.err = s.scanner.Err()

sse_test.go

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
package openai
1+
package openai_test
22

33
import (
44
"bufio"
55
"io"
66
"reflect"
77
"strings"
88
"testing"
9+
10+
"github.com/sashabaranov/go-openai"
911
)
1012

1113
// ChunksReader simulates a reader that splits the input across multiple reads.
@@ -55,7 +57,7 @@ func TestEolSplitter(t *testing.T) {
5557
t.Run(test.name, func(t *testing.T) {
5658
reader := strings.NewReader(test.input)
5759
scanner := bufio.NewScanner(reader)
58-
scanner.Split(NewEOLSplitterFunc())
60+
scanner.Split(openai.NewEOLSplitterFunc())
5961

6062
var lines []string
6163
for scanner.Scan() {
@@ -97,7 +99,7 @@ func TestEolSplitterBoundaryCondition(t *testing.T) {
9799
// Custom reader to simulate the boundary condition
98100
reader := NewChunksReader(c.input)
99101
scanner := bufio.NewScanner(reader)
100-
scanner.Split(NewEOLSplitterFunc())
102+
scanner.Split(openai.NewEOLSplitterFunc())
101103

102104
var lines []string
103105
for scanner.Scan() {
@@ -124,11 +126,11 @@ func TestEolSplitterBoundaryCondition(t *testing.T) {
124126
func TestSSEScanner(t *testing.T) {
125127
tests := []struct {
126128
raw string
127-
want []ServerSentEvent
129+
want []openai.ServerSentEvent
128130
}{
129131
{
130132
raw: `data: hello world`,
131-
want: []ServerSentEvent{
133+
want: []openai.ServerSentEvent{
132134
{
133135
Data: "hello world",
134136
},
@@ -137,7 +139,7 @@ func TestSSEScanner(t *testing.T) {
137139
{
138140
raw: `event: hello
139141
data: hello world`,
140-
want: []ServerSentEvent{
142+
want: []openai.ServerSentEvent{
141143
{
142144
Event: "hello",
143145
Data: "hello world",
@@ -150,7 +152,7 @@ data: {
150152
data: "msg": "hello world",
151153
data: "id": 12345
152154
data: }`,
153-
want: []ServerSentEvent{
155+
want: []openai.ServerSentEvent{
154156
{
155157
Event: "hello-json",
156158
Data: "{\n\"msg\": \"hello world\",\n\"id\": 12345\n}",
@@ -161,7 +163,7 @@ data: }`,
161163
raw: `data: hello world
162164
163165
data: hello again`,
164-
want: []ServerSentEvent{
166+
want: []openai.ServerSentEvent{
165167
{
166168
Data: "hello world",
167169
},
@@ -173,7 +175,7 @@ data: hello again`,
173175
{
174176
raw: `retry: 10000
175177
data: hello world`,
176-
want: []ServerSentEvent{
178+
want: []openai.ServerSentEvent{
177179
{
178180
Retry: 10000,
179181
Data: "hello world",
@@ -184,7 +186,7 @@ data: hello again`,
184186
raw: `retry: 10000
185187
186188
retry: 20000`,
187-
want: []ServerSentEvent{
189+
want: []openai.ServerSentEvent{
188190
{
189191
Retry: 10000,
190192
},
@@ -200,7 +202,7 @@ id: message-id
200202
retry: 20000
201203
event: hello-event
202204
data: hello`,
203-
want: []ServerSentEvent{
205+
want: []openai.ServerSentEvent{
204206
{
205207
ID: "message-id",
206208
Retry: 20000,
@@ -222,7 +224,7 @@ id: message 2
222224
retry: 20000
223225
event: hello-event 2
224226
`,
225-
want: []ServerSentEvent{
227+
want: []openai.ServerSentEvent{
226228
{
227229
ID: "message 1",
228230
Retry: 10000,
@@ -254,10 +256,10 @@ event: hello-event 2
254256
}
255257
}
256258

257-
func runSSEScanTest(t *testing.T, raw string, want []ServerSentEvent) {
258-
sseScanner := NewSSEScanner(strings.NewReader(raw), false)
259+
func runSSEScanTest(t *testing.T, raw string, want []openai.ServerSentEvent) {
260+
sseScanner := openai.NewSSEScanner(strings.NewReader(raw), false)
259261

260-
var got []ServerSentEvent
262+
var got []openai.ServerSentEvent
261263
for sseScanner.Next() {
262264
got = append(got, sseScanner.Scan())
263265
}

stream_v2.go

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ type StreamRawEvent struct {
1313
type StreamDone struct {
1414
}
1515

16-
// Define StreamThreadMessageDelta
1716
type StreamThreadMessageDelta struct {
1817
ID string `json:"id"`
1918
Object string `json:"object"`
@@ -75,7 +74,7 @@ type StreamerV2 struct {
7574
buffer []byte
7675
}
7776

78-
// Close closes the underlying io.ReadCloser
77+
// Close closes the underlying io.ReadCloser.
7978
func (s *StreamerV2) Close() error {
8079
return s.r.Close()
8180
}
@@ -92,7 +91,6 @@ func (s *StreamerV2) Next() bool {
9291
var delta StreamThreadMessageDelta
9392
if err := json.Unmarshal([]byte(event.Data), &delta); err == nil {
9493
s.next = delta
95-
9694
}
9795
case "done":
9896
s.next = StreamDone{}
@@ -106,30 +104,30 @@ func (s *StreamerV2) Next() bool {
106104
return true
107105
}
108106

109-
// Read implements io.Reader of the text deltas of thread.message.delta events
110-
func (r *StreamerV2) Read(p []byte) (int, error) {
107+
// Read implements io.Reader of the text deltas of thread.message.delta events.
108+
func (s *StreamerV2) Read(p []byte) (int, error) {
111109
// If we have data in the buffer, copy it to p first.
112-
if len(r.buffer) > 0 {
113-
n := copy(p, r.buffer)
114-
r.buffer = r.buffer[n:]
110+
if len(s.buffer) > 0 {
111+
n := copy(p, s.buffer)
112+
s.buffer = s.buffer[n:]
115113
return n, nil
116114
}
117115

118-
for r.Next() {
116+
for s.Next() {
119117
// Read only text deltas
120-
text, ok := r.MessageDeltaText()
118+
text, ok := s.MessageDeltaText()
121119
if !ok {
122120
continue
123121
}
124122

125-
r.buffer = []byte(text)
126-
n := copy(p, r.buffer)
127-
r.buffer = r.buffer[n:]
123+
s.buffer = []byte(text)
124+
n := copy(p, s.buffer)
125+
s.buffer = s.buffer[n:]
128126
return n, nil
129127
}
130128

131129
// Check for streamer error
132-
if err := r.Err(); err != nil {
130+
if err := s.Err(); err != nil {
133131
return 0, err
134132
}
135133

@@ -145,7 +143,7 @@ func (s *StreamerV2) Text() (string, bool) {
145143
return s.MessageDeltaText()
146144
}
147145

148-
// MessageDeltaText returns text delta if the current event is a "thread.message.delta"
146+
// MessageDeltaText returns text delta if the current event is a "thread.message.delta".
149147
func (s *StreamerV2) MessageDeltaText() (string, bool) {
150148
event, ok := s.next.(StreamThreadMessageDelta)
151149
if !ok {
@@ -157,7 +155,7 @@ func (s *StreamerV2) MessageDeltaText() (string, bool) {
157155
if content.Text != nil {
158156
// Can we return the first text we find? Does OpenAI stream ever
159157
// return multiple text contents in a delta?
160-
text = text + content.Text.Value
158+
text += content.Text.Value
161159
}
162160
}
163161

stream_v2_test.go

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
package openai
1+
//nolint:lll
2+
package openai_test
23

34
import (
45
"encoding/json"
6+
"errors"
57
"io"
68
"reflect"
79
"strings"
810
"testing"
11+
12+
"github.com/sashabaranov/go-openai"
913
)
1014

1115
func TestNewStreamTextReader(t *testing.T) {
@@ -19,7 +23,7 @@ data: {"id":"msg_KFiZxHhXYQo6cGFnGjRDHSee","object":"thread.message.delta","delt
1923
event: done
2024
data: [DONE]
2125
`
22-
reader := NewStreamerV2(strings.NewReader(raw))
26+
reader := openai.NewStreamerV2(strings.NewReader(raw))
2327

2428
expected := "helloworld"
2529
buffer := make([]byte, len(expected))
@@ -46,7 +50,7 @@ data: [DONE]
4650
}
4751

4852
n, err = reader.Read(buffer)
49-
if err != io.EOF {
53+
if !errors.Is(err, io.EOF) {
5054
t.Fatalf("expected io.EOF, got %v", err)
5155
}
5256
if n != 0 {
@@ -65,7 +69,7 @@ event: done
6569
data: [DONE]
6670
`
6771

68-
scanner := NewStreamerV2(strings.NewReader(raw))
72+
scanner := openai.NewStreamerV2(strings.NewReader(raw))
6973
var events []any
7074

7175
for scanner.Next() {
@@ -74,26 +78,26 @@ data: [DONE]
7478
}
7579

7680
expectedValues := []any{
77-
StreamRawEvent{
81+
openai.StreamRawEvent{
7882
Type: "thread.created",
7983
Data: json.RawMessage(`{"id":"thread_vMWb8sJ14upXpPO2VbRpGTYD","object":"thread","created_at":1715864046,"metadata":{},"tool_resources":{"code_interpreter":{"file_ids":[]}}}`),
8084
},
81-
StreamThreadMessageDelta{
85+
openai.StreamThreadMessageDelta{
8286
ID: "msg_KFiZxHhXYQo6cGFnGjRDHSee",
8387
Object: "thread.message.delta",
84-
Delta: Delta{
85-
Content: []DeltaContent{
88+
Delta: openai.Delta{
89+
Content: []openai.DeltaContent{
8690
{
8791
Index: 0,
8892
Type: "text",
89-
Text: &DeltaText{
93+
Text: &openai.DeltaText{
9094
Value: "hello",
9195
},
9296
},
9397
},
9498
},
9599
},
96-
StreamDone{},
100+
openai.StreamDone{},
97101
}
98102

99103
if len(events) != len(expectedValues) {
@@ -119,25 +123,25 @@ func TestStreamThreadMessageDeltaJSON(t *testing.T) {
119123
name: "DeltaContent with Text",
120124
jsonData: `{"index":0,"type":"text","text":{"value":"hello"}}`,
121125
expectType: "text",
122-
expectValue: &DeltaText{Value: "hello"},
126+
expectValue: &openai.DeltaText{Value: "hello"},
123127
},
124128
{
125129
name: "DeltaContent with ImageFile",
126130
jsonData: `{"index":1,"type":"image_file","image_file":{"file_id":"file123","detail":"An image"}}`,
127131
expectType: "image_file",
128-
expectValue: &DeltaImageFile{FileID: "file123", Detail: "An image"},
132+
expectValue: &openai.DeltaImageFile{FileID: "file123", Detail: "An image"},
129133
},
130134
{
131135
name: "DeltaContent with ImageURL",
132136
jsonData: `{"index":2,"type":"image_url","image_url":{"url":"https://example.com/image.jpg","detail":"low"}}`,
133137
expectType: "image_url",
134-
expectValue: &DeltaImageURL{URL: "https://example.com/image.jpg", Detail: "low"},
138+
expectValue: &openai.DeltaImageURL{URL: "https://example.com/image.jpg", Detail: "low"},
135139
},
136140
}
137141

138142
for _, tt := range tests {
139143
t.Run(tt.name, func(t *testing.T) {
140-
var content DeltaContent
144+
var content openai.DeltaContent
141145
err := json.Unmarshal([]byte(tt.jsonData), &content)
142146
if err != nil {
143147
t.Fatalf("Error unmarshalling JSON: %v", err)

0 commit comments

Comments
 (0)