Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
ollama
Commits
2c639431
Unverified
Commit
2c639431
authored
Dec 15, 2025
by
Grace
Committed by
GitHub
Dec 15, 2025
Browse files
DeepseekV3 family renderer (#13180)
parent
aacd1cb3
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
616 additions
and
0 deletions
+616
-0
model/renderers/deepseek3.go
model/renderers/deepseek3.go
+121
-0
model/renderers/deepseek3_test.go
model/renderers/deepseek3_test.go
+492
-0
model/renderers/renderer.go
model/renderers/renderer.go
+3
-0
No files found.
model/renderers/deepseek3.go
0 → 100644
View file @
2c639431
package
renderers
import
(
"encoding/json"
"strings"
"github.com/ollama/ollama/api"
)
type
DeepSeek3Variant
int
const
(
Deepseek31
DeepSeek3Variant
=
iota
)
type
DeepSeek3Renderer
struct
{
IsThinking
bool
Variant
DeepSeek3Variant
}
func
(
r
*
DeepSeek3Renderer
)
Render
(
messages
[]
api
.
Message
,
tools
[]
api
.
Tool
,
thinkValue
*
api
.
ThinkValue
)
(
string
,
error
)
{
var
sb
strings
.
Builder
// thinking is enabled: model must support it AND user must request it
thinking
:=
r
.
IsThinking
&&
(
thinkValue
!=
nil
&&
thinkValue
.
Bool
())
// extract system messages first
var
systemPrompt
strings
.
Builder
isFirstSystemPrompt
:=
true
for
_
,
message
:=
range
messages
{
if
message
.
Role
==
"system"
{
if
isFirstSystemPrompt
{
systemPrompt
.
WriteString
(
message
.
Content
)
isFirstSystemPrompt
=
false
}
else
{
systemPrompt
.
WriteString
(
"
\n\n
"
+
message
.
Content
)
}
}
}
sb
.
WriteString
(
"<|begin▁of▁sentence|>"
+
systemPrompt
.
String
())
// state tracking
isTool
:=
false
isLastUser
:=
false
for
_
,
message
:=
range
messages
{
switch
message
.
Role
{
case
"user"
:
isTool
=
false
isLastUser
=
true
sb
.
WriteString
(
"<|User|>"
+
message
.
Content
)
case
"assistant"
:
if
len
(
message
.
ToolCalls
)
>
0
{
if
isLastUser
{
sb
.
WriteString
(
"<|Assistant|></think>"
)
}
isLastUser
=
false
isTool
=
false
if
message
.
Content
!=
""
{
sb
.
WriteString
(
message
.
Content
)
}
sb
.
WriteString
(
"<|tool▁calls▁begin|>"
)
for
_
,
toolCall
:=
range
message
.
ToolCalls
{
sb
.
WriteString
(
"<|tool▁call▁begin|>"
+
toolCall
.
Function
.
Name
+
"<|tool▁sep|>"
)
argsJSON
,
_
:=
json
.
Marshal
(
toolCall
.
Function
.
Arguments
)
sb
.
WriteString
(
string
(
argsJSON
))
sb
.
WriteString
(
"<|tool▁call▁end|>"
)
}
sb
.
WriteString
(
"<|tool▁calls▁end|><|end▁of▁sentence|>"
)
}
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
{
sb
.
WriteString
(
"<think>"
)
}
else
{
sb
.
WriteString
(
"</think>"
)
}
}
isLastUser
=
false
content
:=
message
.
Content
if
isTool
{
sb
.
WriteString
(
content
+
"<|end▁of▁sentence|>"
)
isTool
=
false
}
else
{
if
strings
.
Contains
(
content
,
"</think>"
)
{
parts
:=
strings
.
SplitN
(
content
,
"</think>"
,
2
)
if
len
(
parts
)
>
1
{
content
=
parts
[
1
]
}
}
sb
.
WriteString
(
content
+
"<|end▁of▁sentence|>"
)
}
}
case
"tool"
:
isLastUser
=
false
isTool
=
true
sb
.
WriteString
(
"<|tool▁output▁begin|>"
+
message
.
Content
+
"<|tool▁output▁end|>"
)
}
}
if
isLastUser
&&
!
isTool
{
sb
.
WriteString
(
"<|Assistant|>"
)
if
thinking
{
sb
.
WriteString
(
"<think>"
)
}
else
{
sb
.
WriteString
(
"</think>"
)
}
}
return
sb
.
String
(),
nil
}
model/renderers/deepseek3_test.go
0 → 100644
View file @
2c639431
This diff is collapsed.
Click to expand it.
model/renderers/renderer.go
View file @
2c639431
...
@@ -59,6 +59,9 @@ func rendererForName(name string) Renderer {
...
@@ -59,6 +59,9 @@ func rendererForName(name string) Renderer {
case
"cogito"
:
case
"cogito"
:
renderer
:=
&
CogitoRenderer
{
isThinking
:
true
}
renderer
:=
&
CogitoRenderer
{
isThinking
:
true
}
return
renderer
return
renderer
case
"deepseek-v3.1"
:
renderer
:=
&
DeepSeek3Renderer
{
IsThinking
:
true
,
Variant
:
Deepseek31
}
return
renderer
case
"olmo3"
:
case
"olmo3"
:
renderer
:=
&
Olmo3Renderer
{
UseExtendedSystemMessage
:
false
}
renderer
:=
&
Olmo3Renderer
{
UseExtendedSystemMessage
:
false
}
return
renderer
return
renderer
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment