chat_renderer.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package kimi_linear
  2. import (
  3. "encoding/json"
  4. "strings"
  5. "makarna/pkg/chat"
  6. )
  7. type kimiRenderer struct{}
  8. func (r *kimiRenderer) Render(messages []chat.Message, opts chat.Options) (string, error) {
  9. var sb strings.Builder
  10. if len(opts.Tools) > 0 {
  11. b, err := json.Marshal(opts.Tools)
  12. if err != nil {
  13. return "", err
  14. }
  15. sb.WriteString("<|im_system|>tool_declare<|im_middle|")
  16. sb.Write(b)
  17. sb.WriteString("<|im_end|>")
  18. }
  19. for i := 0; i < len(messages); i++ {
  20. m := messages[i]
  21. roleName := m.Role
  22. if roleName == "" {
  23. roleName = "user"
  24. }
  25. switch m.Role {
  26. case "user":
  27. sb.WriteString("<|im_user|")
  28. sb.WriteString(roleName)
  29. sb.WriteString("<|im_middle|>")
  30. case "assistant":
  31. sb.WriteString("<|im_assistant|")
  32. sb.WriteString(roleName)
  33. sb.WriteString("<|im_middle|>")
  34. case "tool":
  35. sb.WriteString("<|im_system|")
  36. sb.WriteString(roleName)
  37. sb.WriteString("<|im_middle|>")
  38. default:
  39. sb.WriteString("<|im_system|")
  40. sb.WriteString(roleName)
  41. sb.WriteString("<|im_middle|>")
  42. }
  43. if m.Role == "assistant" && len(m.ToolCalls) > 0 {
  44. sb.WriteString(m.Content)
  45. sb.WriteString("<|tool_calls_section_begin|>")
  46. for _, tc := range m.ToolCalls {
  47. id := tc.Name
  48. sb.WriteString("<|tool_call_begin|>")
  49. sb.WriteString(id)
  50. sb.WriteString("<|tool_call_argument_begin|>")
  51. if len(tc.Arguments) == 0 {
  52. sb.WriteString("{}")
  53. } else {
  54. sb.Write(tc.Arguments)
  55. }
  56. sb.WriteString("<|tool_call_end|>")
  57. }
  58. sb.WriteString("<|tool_calls_section_end|>")
  59. } else if m.Role == "tool" {
  60. sb.WriteString(m.Content)
  61. } else {
  62. sb.WriteString(m.Content)
  63. }
  64. sb.WriteString("<|im_end|>")
  65. }
  66. if opts.AddGenerationPrompt {
  67. sb.WriteString("<|im_assistant|>assistant<|im_middle|>")
  68. }
  69. return sb.String(), nil
  70. }
  71. func init() {
  72. chat.Register("KimiLinearForCausalLM", &kimiRenderer{})
  73. chat.Register("kimi_linear", &kimiRenderer{})
  74. chat.Register("kimi", &kimiRenderer{})
  75. }