@@ -59,6 +59,7 @@ type Message struct {
5959 Parts []* ContentPart `json:"parts,omitempty"`
6060 ToolCallID * string `json:"tool_call_id,omitempty"`
6161 ToolCalls []* ToolCall `json:"tool_calls,omitempty"`
62+ NoRender * bool `json:"no_render,omitempty"`
6263
6364 Metadata map [string ]string `json:"metadata,omitempty"`
6465}
@@ -246,36 +247,80 @@ func (pt *PromptTemplate) formatMessages(messages []*Message, variableVals []*Va
246247 formattedMessages = append (formattedMessages , placeholderMessage )
247248 }
248249 }
249- default :
250- if templateStr := ptr .From (message .Content ); templateStr != "" {
251- formattedStr , err := formatText (pt .TemplateType , templateStr , defMap , valMap )
252- if err != nil {
250+
251+ case RoleTool :
252+ // Tool:不渲染
253+ formattedMessages = append (formattedMessages , message )
254+
255+ case RoleSystem , RoleUser :
256+ // System/User:渲染,除非 NoRender=true
257+ if message .NoRender == nil || ! ptr .From (message .NoRender ) {
258+ // 需要渲染
259+ if err := pt .renderMessage (message , defMap , valMap ); err != nil {
253260 return nil , err
254261 }
255- message .Content = ptr .Of (formattedStr )
256262 }
257- for _ , part := range message .Parts {
258- if part .Type == ContentTypeText && ptr .From (part .Text ) != "" {
259- formattedStr , err := formatText (pt .TemplateType , ptr .From (part .Text ), defMap , valMap )
260- if err != nil {
261- return nil , err
262- }
263- part .Text = ptr .Of (formattedStr )
263+ formattedMessages = append (formattedMessages , message )
264+
265+ case RoleAssistant :
266+ // Assistant:仅当 NoRender=false(显式标记,通常来自原始 prompt)才渲染;nil 或 true 均不渲染
267+ if message .NoRender != nil && ! ptr .From (message .NoRender ) {
268+ // NoRender=false,需要渲染
269+ if err := pt .renderMessage (message , defMap , valMap ); err != nil {
270+ return nil , err
264271 }
265272 }
266- message .Parts = formatMultiPart (message .Parts , defMap , valMap )
273+ formattedMessages = append (formattedMessages , message )
274+
275+ default :
276+ // 其他角色默认不渲染
267277 formattedMessages = append (formattedMessages , message )
268278 }
269279 }
270280 return formattedMessages , nil
271281}
272282
283+ func (pt * PromptTemplate ) renderMessage (message * Message , defMap map [string ]* VariableDef , valMap map [string ]* VariableVal ) error {
284+ // 渲染消息内容
285+ if templateStr := ptr .From (message .Content ); templateStr != "" {
286+ formattedStr , err := formatText (pt .TemplateType , templateStr , defMap , valMap )
287+ if err != nil {
288+ return err
289+ }
290+ message .Content = ptr .Of (formattedStr )
291+ }
292+
293+ // 渲染消息部分
294+ for _ , part := range message .Parts {
295+ if part .Type == ContentTypeText && ptr .From (part .Text ) != "" {
296+ formattedStr , err := formatText (pt .TemplateType , ptr .From (part .Text ), defMap , valMap )
297+ if err != nil {
298+ return err
299+ }
300+ part .Text = ptr .Of (formattedStr )
301+ }
302+ }
303+
304+ // 格式化多部分内容
305+ message .Parts = formatMultiPart (message .Parts , defMap , valMap )
306+ return nil
307+ }
308+
273309func (pt * PromptTemplate ) getTemplateMessages (messages []* Message ) []* Message {
274310 if pt == nil {
275311 return nil
276312 }
277313 var messagesToFormat []* Message
278- messagesToFormat = append (messagesToFormat , pt .Messages ... )
314+
315+ // 对于来自pt的messages(原始托管的message),统一设置no_render为false,表示一定要渲染
316+ for _ , msg := range pt .Messages {
317+ if msg != nil {
318+ msg .NoRender = ptr .Of (false )
319+ messagesToFormat = append (messagesToFormat , msg )
320+ }
321+ }
322+
323+ // 入参的messages的no_render不需要改变,保持原状
279324 messagesToFormat = append (messagesToFormat , messages ... )
280325 return messagesToFormat
281326}
0 commit comments