{"record":{"id":"07ff4fb95a1f2d76","repo":"dotnet/machinelearning","slug":"please-provide-at-most-one-system-message","errorCode":null,"errorMessage":"Please provide at most one system message.","messagePattern":"Please provide at most one system message\\.","errorType":"validation","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.ML.GenAI.Mistral/Mistral_7B_0_3ChatTemplateBuilder.cs","lineNumber":32,"sourceCode":"namespace Microsoft.ML.GenAI.Mistral;\n\n/// <summary>\n/// the chat template builder for Mistral 7B v0.3\n/// </summary>\n#pragma warning disable MSML_GeneralName // This name should be PascalCased\npublic class Mistral_7B_0_3ChatTemplateBuilder : IChatTemplateBuilder\n#pragma warning restore MSML_GeneralName // This name should be PascalCased\n{\n    private const string Newline = \"\\r\\n\";\n\n    public static Mistral_7B_0_3ChatTemplateBuilder Instance { get; } = new Mistral_7B_0_3ChatTemplateBuilder();\n\n    public string BuildPrompt(IEnumerable<IMessage> messages, IEnumerable<FunctionContract>? tools = null)\n    {\n        // can only contain at most one system message\n        if (messages.Where(m => m.GetRole() == Role.System).Count() > 1)\n        {\n            throw new InvalidOperationException(\"Please provide at most one system message.\");\n        }\n\n        var systemMessage = messages.FirstOrDefault(m => m.GetRole() == Role.System)?.GetContent();\n\n        // split the messages into two sequences by the last user message\n        // e.g [user, assistant, user, assistant, user] -> [[user, assistant, user, assistant], [user]]\n\n        var firstSequence = messages.Take(messages.ToList().FindLastIndex(m => m.GetRole() == Role.User));\n        var secondSequence = messages.Skip(messages.ToList().FindLastIndex(m => m.GetRole() == Role.User));\n\n        var sb = new StringBuilder();\n        foreach (var message in firstSequence)\n        {\n            // skip system\n            if (message.GetRole() == Role.System)\n            {\n                continue;\n            }","sourceCodeStart":14,"sourceCodeEnd":50,"githubUrl":"https://github.com/dotnet/machinelearning/blob/7b76e69cf964daeca3f1377af6bc5543284d56c6/src/Microsoft.ML.GenAI.Mistral/Mistral_7B_0_3ChatTemplateBuilder.cs#L14-L50","documentation":"Mistral_7B_0_3ChatTemplateBuilder.BuildPrompt throws InvalidOperationException because the Mistral 7B v0.3 chat template only allows a single system message in the conversation. Multiple system messages cannot be rendered into the template.","triggerScenarios":"Calling BuildPrompt with an IEnumerable<IMessage> containing two or more messages whose role is Role.System.","commonSituations":"Merging chat histories from multiple sources that each added their own system prompt; multi-agent pipelines appending a system message per turn; a tool layer injecting system-level instructions on top of the app's system prompt.","solutions":["Merge all system content into a single system message before calling BuildPrompt.","Downgrade subsequent system-role messages to user role (with a clear preamble) instead of Role.System.","Sanitize/normalize the incoming chat history so only the first system message keeps the System role."],"exampleFix":"// before\nmessages.Add(new Message(Role.System, \"Be concise.\")); // second system message\nvar prompt = builder.BuildPrompt(messages);\n// after\nvar merged = string.Join(\"\\n\", systemMsgs.Select(m => m.GetContent()));\nvar prompt = builder.BuildPrompt(new[] { new Message(Role.System, merged) }.Concat(rest));","handlingStrategy":"validation","validationCode":"int systemCount = messages.Count(m => m.GetRole() == Role.System);\nif (systemCount > 1) throw new ArgumentException(\"Mistral template allows at most one system message.\");","typeGuard":null,"tryCatchPattern":"try { prompt = builder.BuildPrompt(messages, tools); } catch (InvalidOperationException ex) when (ex.Message.Contains(\"at most one system message\")) { /* merge system messages and retry */ }","preventionTips":["Merge all system prompts into one message before building the chat history","Never append a new Role.System message mid-conversation","Downgrade extra system-level instructions to user role","Sanitize histories received from external sources"],"tags":["chat-template","mistral","validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"7b76e69cf964daeca3f1377af6bc5543284d56c6","analyzedAt":"2026-09-11T12:35:38.930Z","contentChangedAt":"2026-09-11T12:35:38.930Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}