mirror of
https://github.com/likelovewant/ollama-for-amd.git
synced 2025-12-21 22:33:56 +00:00
DeepseekV3 Family Parser (#13484)
This commit is contained in:
@@ -70,7 +70,16 @@ func (r *DeepSeek3Renderer) Render(messages []api.Message, tools []api.Tool, thi
|
||||
isTool := false
|
||||
isLastUser := false
|
||||
|
||||
for _, message := range messages {
|
||||
// Find the index of the last user message to determine which assistant message is "current"
|
||||
lastUserIndex := -1
|
||||
for i := len(messages) - 1; i >= 0; i-- {
|
||||
if messages[i].Role == "user" {
|
||||
lastUserIndex = i
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
for i, message := range messages {
|
||||
switch message.Role {
|
||||
case "user":
|
||||
isTool = false
|
||||
@@ -101,9 +110,11 @@ func (r *DeepSeek3Renderer) Render(messages []api.Message, tools []api.Tool, thi
|
||||
} else {
|
||||
if isLastUser {
|
||||
sb.WriteString("<|Assistant|>")
|
||||
// message["prefix"] is defined and message["prefix"] and thinking
|
||||
// message.Thinking != "" represents message["prefix"] being defined
|
||||
if message.Thinking != "" && thinking {
|
||||
hasThinking := message.Thinking != ""
|
||||
|
||||
// only use <think> for the current turn (after last user message)
|
||||
isCurrentTurn := i > lastUserIndex
|
||||
if hasThinking && thinking && isCurrentTurn {
|
||||
sb.WriteString("<think>")
|
||||
} else {
|
||||
sb.WriteString("</think>")
|
||||
|
||||
@@ -422,7 +422,7 @@ Second instruction<|User|>Hello<|Assistant|></think>`,
|
||||
{Role: "user", Content: "How do they interact with matter?"},
|
||||
},
|
||||
thinkValue: &api.ThinkValue{Value: true},
|
||||
expected: `<|begin▁of▁sentence|><|User|>Explain quantum physics<|Assistant|><think>Quantum physics is the study of matter and energy at the smallest scales.<|end▁of▁sentence|><|User|>What about photons?<|Assistant|></think>Photons are particles of light with no mass.<|end▁of▁sentence|><|User|>How do they interact with matter?<|Assistant|><think>`,
|
||||
expected: `<|begin▁of▁sentence|><|User|>Explain quantum physics<|Assistant|></think>Quantum physics is the study of matter and energy at the smallest scales.<|end▁of▁sentence|><|User|>What about photons?<|Assistant|></think>Photons are particles of light with no mass.<|end▁of▁sentence|><|User|>How do they interact with matter?<|Assistant|><think>`,
|
||||
},
|
||||
{
|
||||
name: "tool call with thinking content in response",
|
||||
@@ -959,6 +959,73 @@ Where:
|
||||
- For multiple tool calls, chain them directly without separators or spaces
|
||||
<|User|>What's the weather?<|Assistant|></think>`,
|
||||
},
|
||||
{
|
||||
name: "multi-turn conversation with thinking content on each turn",
|
||||
messages: []api.Message{
|
||||
{Role: "user", Content: "hey!"},
|
||||
{
|
||||
Role: "assistant",
|
||||
Content: "Hey! 😊 How's it going? What's on your mind today?",
|
||||
Thinking: "Hmm, the user just said \"hey!\" which is a simple greeting. This is a straightforward opening where they're likely just starting a conversation or testing the interaction.",
|
||||
},
|
||||
{Role: "user", Content: "fantastic, how has yours been"},
|
||||
{
|
||||
Role: "assistant",
|
||||
Content: "Glad to hear you're having a fantastic day! That's awesome.\n\nMine's been great, thanks for asking! Just buzzing along, helping people out and having conversations like this one. So what's making your day so fantastic? Anything fun happening?",
|
||||
Thinking: "Ah, the user is responding warmly and asking about my \"day.\" Since I'm an AI, I need to gently remind them I don't experience time like a human, but frame it positively to keep the conversation flowing.",
|
||||
},
|
||||
{Role: "user", Content: "awesome, can you tell me a 10 word story?"},
|
||||
},
|
||||
thinkValue: &api.ThinkValue{Value: true},
|
||||
expected: `<|begin▁of▁sentence|><|User|>hey!<|Assistant|></think>Hey! 😊 How's it going? What's on your mind today?<|end▁of▁sentence|><|User|>fantastic, how has yours been<|Assistant|></think>Glad to hear you're having a fantastic day! That's awesome.
|
||||
|
||||
Mine's been great, thanks for asking! Just buzzing along, helping people out and having conversations like this one. So what's making your day so fantastic? Anything fun happening?<|end▁of▁sentence|><|User|>awesome, can you tell me a 10 word story?<|Assistant|><think>`,
|
||||
},
|
||||
{
|
||||
name: "vLLM documentation example - multi-turn with full thinking content",
|
||||
messages: []api.Message{
|
||||
{Role: "system", Content: "You are a helpful assistant"},
|
||||
{Role: "user", Content: "Who are you?"},
|
||||
{
|
||||
Role: "assistant",
|
||||
Content: "I am DeepSeek",
|
||||
Thinking: "Hmm",
|
||||
},
|
||||
{Role: "user", Content: "9.11 and 9.8, which is greater?"},
|
||||
{
|
||||
Role: "assistant",
|
||||
Content: "9.8 is greater than 9.11.\n\nTo compare them easily, you can align the decimal places: \n- 9.11 has a tenths digit of 1 and a hundredths digit of 1. \n- 9.8 can be written as 9.80, which has a tenths digit of 8 and a hundredths digit of 0. \n\nSince the whole number part (9) is the same, compare the tenths place: 8 is greater than 1, so 9.80 (or 9.8) is greater than 9.11.",
|
||||
Thinking: "First, the user is asking which number is greater between 9.11 and 9.8. These are decimal numbers.\n\nI need to compare 9.11 and 9.8. To make it easier, I should think of them as decimals with the same number of decimal places.\n\n9.11 has two decimal places, and 9.8 has one decimal place. I can write 9.8 as 9.80 to make it comparable.\n\nSo, 9.11 versus 9.80.\n\nNow, comparing the whole number parts: both have 9, so they are equal in the units place.\n\nNext, compare the tenths place: for 9.11, the tenths digit is 1. For 9.80, the tenths digit is 8. Since 8 is greater than 1, 9.80 is greater than 9.11.\n\nTherefore, 9.8 is greater than 9.11.\n\nI can also think of them as fractions: 9.11 is 911/100, and 9.8 is 98/10 or 980/100. Comparing 911/100 and 980/100, 980/100 is larger, so 9.8 is greater.\n\nSo, the answer should be that 9.8 is greater than 9.11.\n\nNow, I need to respond helpfully. Since the user might be learning or need clarification, I should explain briefly.\n\nFinally, my response should be in English, as the query is in English.",
|
||||
},
|
||||
{Role: "user", Content: "Thanks! Can you tell me a 10 word story?"},
|
||||
{
|
||||
Role: "assistant",
|
||||
Content: "Of course. Here is a 10-word story:\n\nHe found the key, unlocking a door to forgotten memories.",
|
||||
Thinking: "Hmm, the user just asked for a 10-word story after the previous number comparison question. This is a quick creative task with a strict word count constraint. \n\nThe story needs to be exactly 10 words while maintaining coherence and a hint of narrative. A micro-story about finding a key could work - it implies a larger unseen story. \n\nChecking the word count: \"He found the key, unlocking a door to forgotten memories.\" That's 10 words with a beginning, middle and implied end. It fits the requirement while leaving room for imagination.",
|
||||
},
|
||||
{Role: "user", Content: "That was beautiful! Now can you write a haiku?"},
|
||||
},
|
||||
thinkValue: &api.ThinkValue{Value: true},
|
||||
expected: `<|begin▁of▁sentence|>You are a helpful assistant<|User|>Who are you?<|Assistant|></think>I am DeepSeek<|end▁of▁sentence|><|User|>9.11 and 9.8, which is greater?<|Assistant|></think>9.8 is greater than 9.11.
|
||||
|
||||
To compare them easily, you can align the decimal places:
|
||||
- 9.11 has a tenths digit of 1 and a hundredths digit of 1.
|
||||
- 9.8 can be written as 9.80, which has a tenths digit of 8 and a hundredths digit of 0.
|
||||
|
||||
Since the whole number part (9) is the same, compare the tenths place: 8 is greater than 1, so 9.80 (or 9.8) is greater than 9.11.<|end▁of▁sentence|><|User|>Thanks! Can you tell me a 10 word story?<|Assistant|></think>Of course. Here is a 10-word story:
|
||||
|
||||
He found the key, unlocking a door to forgotten memories.<|end▁of▁sentence|><|User|>That was beautiful! Now can you write a haiku?<|Assistant|><think>`,
|
||||
},
|
||||
{
|
||||
name: "no system prompt - content with embedded thinking tags",
|
||||
messages: []api.Message{
|
||||
{Role: "user", Content: "Who are you?"},
|
||||
{Role: "assistant", Content: "<think>Hmm</think>I am DeepSeek"},
|
||||
{Role: "user", Content: "Thanks! Can you tell me a 10 word story?"},
|
||||
},
|
||||
thinkValue: &api.ThinkValue{Value: true},
|
||||
expected: `<|begin▁of▁sentence|><|User|>Who are you?<|Assistant|></think>I am DeepSeek<|end▁of▁sentence|><|User|>Thanks! Can you tell me a 10 word story?<|Assistant|><think>`,
|
||||
},
|
||||
}
|
||||
|
||||
renderer := &DeepSeek3Renderer{IsThinking: true, Variant: Deepseek31}
|
||||
|
||||
@@ -59,7 +59,7 @@ func rendererForName(name string) Renderer {
|
||||
case "cogito":
|
||||
renderer := &CogitoRenderer{isThinking: true}
|
||||
return renderer
|
||||
case "deepseek-v3.1":
|
||||
case "deepseek3.1":
|
||||
renderer := &DeepSeek3Renderer{IsThinking: true, Variant: Deepseek31}
|
||||
return renderer
|
||||
case "olmo3":
|
||||
|
||||
Reference in New Issue
Block a user