Ollama: Add reasoning content extraction
| @@ -101,6 +101,8 @@ export function extractReasoningFromData(data, { | ||
| 101 | 101 | switch (textGenType ?? textgenerationwebui_settings.type) { |
| 102 | 102 | case textgen_types.OPENROUTER: |
| 103 | 103 | return data?.choices?.[0]?.reasoning ?? ''; |
| 104 | + case textgen_types.OLLAMA: | |
| 105 | + return data?.thinking ?? ''; | |
| 104 | 106 | } |
| 105 | 107 | break; |
| 106 | 108 | |
| @@ -234,6 +234,20 @@ async function* parseStreamData(json) { | ||
| 234 | 234 | } |
| 235 | 235 | return; |
| 236 | 236 | } |
| 237 | + else if (typeof json.choices[0].thinking === 'string' && json.choices[0].thinking.length > 0) { | |
| 238 | + for (let j = 0; j < json.choices[0].thinking.length; j++) { | |
| 239 | + const str = json.choices[0].thinking[j]; | |
| 240 | + const choiceClone = structuredClone(json.choices[0]); | |
| 241 | + choiceClone.thinking = str; | |
| 242 | + const choices = [choiceClone]; | |
| 243 | + yield { | |
| 244 | + data: { ...json, choices }, | |
| 245 | + chunk: str, | |
| 246 | + reasoning: true, | |
| 247 | + }; | |
| 248 | + } | |
| 249 | + return; | |
| 250 | + } | |
| 237 | 251 | else if (typeof json.choices[0].delta === 'object') { |
| 238 | 252 | if (typeof json.choices[0].delta.text === 'string' && json.choices[0].delta.text.length > 0) { |
| 239 | 253 | for (let j = 0; j < json.choices[0].delta.text.length; j++) { |
| @@ -1292,7 +1292,7 @@ export async function generateTextGenWithStreaming(generate_data, signal) { | ||
| 1292 | 1292 | const newText = data?.choices?.[0]?.text || data?.content || ''; |
| 1293 | 1293 | text += newText; |
| 1294 | 1294 | logprobs = parseTextgenLogprobs(newText, data.choices?.[0]?.logprobs || data?.completion_probabilities); |
| 1295 | 1295 | state.reasoning += data?.choices?.[0]?.reasoning ?? data?.choices?.[0]?.thinking ?? ''; |
| 1296 | 1296 | } |
| 1297 | 1297 | |
| 1298 | 1298 | yield { text, swipes, logprobs, toolCalls, state }; |
| @@ -44,7 +44,8 @@ async function parseOllamaStream(jsonStream, request, response) { | ||
| 44 | 44 | break; |
| 45 | 45 | } |
| 46 | 46 | const text = json.response || ''; |
| 47 | - const chunk = { choices: [{ text }] }; | |
| 47 | + const thinking = json.thinking || ''; | |
| 48 | + const chunk = { choices: [{ text, thinking }] }; | |
| 48 | 49 | response.write(`data: ${JSON.stringify(chunk)}\n\n`); |
| 49 | 50 | partialData = ''; |
| 50 | 51 | } |