@@ -58,8 +58,7 @@ func (oc *Config) GetBetweenResponse(prompt, suffix string) (OutputResponse, err
58
58
return res , nil
59
59
}
60
60
}
61
- var reqBody GenerateRequest
62
- reqBody = GenerateRequest {
61
+ reqBody := GenerateRequest {
63
62
Model : oc .ModelName ,
64
63
Prompt : prompt ,
65
64
Suffix : suffix ,
@@ -125,3 +124,71 @@ func (oc *Config) Complete(codeStart, codeEnd string) (string, error) {
125
124
}
126
125
return response .Response , nil
127
126
}
127
+
128
+ // StreamBetween sends a request to the Ollama API and returns the generated output via a callback function.
129
+ // The callback function is given a string and "true" when the streaming is done (or if an error occurred).
130
+ func (oc * Config ) StreamBetween (callbackFunction func (string , bool ), prompt , suffix string ) error {
131
+ defer callbackFunction ("" , true )
132
+ var (
133
+ temperature float64
134
+ seed = oc .SeedOrNegative
135
+ )
136
+ if prompt == "" {
137
+ return errors .New ("the prompt can not be empty" )
138
+ }
139
+ if seed < 0 {
140
+ temperature = oc .TemperatureIfNegativeSeed
141
+ }
142
+ reqBody := GenerateRequest {
143
+ Model : oc .ModelName ,
144
+ System : oc .SystemPrompt ,
145
+ Prompt : prompt ,
146
+ Suffix : suffix ,
147
+ Stream : true ,
148
+ Options : RequestOptions {
149
+ Seed : seed , // set to -1 to make it random
150
+ Temperature : temperature , // set to 0 together with a specific seed to make output reproducible
151
+ },
152
+ }
153
+ if oc .ContextLength != 0 {
154
+ reqBody .Options .ContextLength = oc .ContextLength
155
+ }
156
+ reqBytes , err := json .Marshal (reqBody )
157
+ if err != nil {
158
+ return err
159
+ }
160
+ if oc .Verbose {
161
+ fmt .Printf ("Sending request to %s/api/generate: %s\n " , oc .ServerAddr , string (reqBytes ))
162
+ }
163
+ HTTPClient := & http.Client {
164
+ Timeout : oc .HTTPTimeout ,
165
+ }
166
+ resp , err := HTTPClient .Post (oc .ServerAddr + "/api/generate" , mimeJSON , bytes .NewBuffer (reqBytes ))
167
+ if err != nil {
168
+ return err
169
+ }
170
+ defer resp .Body .Close ()
171
+ var (
172
+ decoder = json .NewDecoder (resp .Body )
173
+ first = true
174
+ answer string
175
+ )
176
+ for {
177
+ var genResp GenerateResponse
178
+ if err := decoder .Decode (& genResp ); err != nil {
179
+ break
180
+ }
181
+ answer = genResp .Response
182
+ if first {
183
+ if len (answer ) > 0 && answer [0 ] == ' ' {
184
+ answer = answer [1 :]
185
+ }
186
+ first = false
187
+ }
188
+ callbackFunction (answer , false )
189
+ if genResp .Done {
190
+ break
191
+ }
192
+ }
193
+ return nil
194
+ }
0 commit comments