(provider providerStrategy, targetSize int, numMessages int)
| 90 | } |
| 91 | |
| 92 | func generateConversation(provider providerStrategy, targetSize int, numMessages int) []any { |
| 93 | if targetSize <= 0 { |
| 94 | return nil |
| 95 | } |
| 96 | if numMessages < 1 { |
| 97 | numMessages = 1 |
| 98 | } |
| 99 | |
| 100 | roles := []string{"user", "assistant"} |
| 101 | messages := make([]message, numMessages) |
| 102 | for i := range messages { |
| 103 | messages[i].Role = roles[i%2] |
| 104 | } |
| 105 | // Ensure last message is from user (required for LLM APIs). |
| 106 | if messages[len(messages)-1].Role != "user" { |
| 107 | messages[len(messages)-1].Role = "user" |
| 108 | } |
| 109 | |
| 110 | overhead := measureJSONSize(provider.formatMessages(messages)) |
| 111 | |
| 112 | bytesPerMessage := targetSize - overhead |
| 113 | if bytesPerMessage < 0 { |
| 114 | bytesPerMessage = 0 |
| 115 | } |
| 116 | |
| 117 | perMessage := bytesPerMessage / len(messages) |
| 118 | remainder := bytesPerMessage % len(messages) |
| 119 | |
| 120 | for i := range messages { |
| 121 | size := perMessage |
| 122 | if i == len(messages)-1 { |
| 123 | size += remainder |
| 124 | } |
| 125 | messages[i].Content = strings.Repeat("x", size) |
| 126 | } |
| 127 | |
| 128 | return provider.formatMessages(messages) |
| 129 | } |
| 130 | |
| 131 | func measureJSONSize(v any) int { |
| 132 | data, err := json.Marshal(v) |
no test coverage detected