linshenkx/prompt-optimizer · error · TestError
At least one message is required
Error message
At least one message is required
What it means
testCustomConversationStream requires at least one entry in request.messages; an empty or missing array throws TestError 'At least one message is required'. The custom conversation test replays a message list, so an empty list has nothing to send.
Source
Thrown at packages/core/src/services/prompt/service.ts:1113
// 3. 版本管理逻辑在UI层更容易处理
//
// 相比之下,优化操作会创建新的链,所以可以在核心层处理
// 这种混合架构是经过权衡的设计决策
/**
* 自定义会话测试(流式)- 高级模式功能
*/
async testCustomConversationStream(
request: CustomConversationRequest,
callbacks: StreamHandlers,
): Promise<void> {
try {
// 验证请求
if (!request.modelKey?.trim()) {
throw new TestError("", "", "Model key is required");
}
if (!request.messages || request.messages.length === 0) {
throw new TestError("", "", "At least one message is required");
}
// 验证模型存在
const modelConfig = await this.modelManager.getModel(request.modelKey);
if (!modelConfig) {
throw new TestError("", "", "Model not found");
}
// 处理会话消息:替换变量
const processedMessages = TemplateProcessor.processConversationMessages(
request.messages,
request.variables,
);
if (processedMessages.length === 0) {
throw new TestError("", "", "No valid messages after processing");
}
View on GitHub (pinned to 3e677b1d9f)
Solutions
- Ensure at least one message (typically the user's draft) is appended before invoking the test
- Guard in the UI: disable Test when the conversation list is empty
- Construct the request only after pushing the current draft message
Example fix
// before
await service.testCustomConversationStream({ modelKey, messages: [] }, handlers);
// after
const messages = [...conversation, { role: 'user', content: draft }];
if (messages.length === 0) return;
await service.testCustomConversationStream({ modelKey, messages }, handlers); Defensive patterns
Strategy: validation
Validate before calling
const messages = [...conversation];
if (messages.length === 0) throw new Error('Add at least one message before testing'); Type guard
const hasMessages = (
r: { messages?: unknown[] }
): r is { messages: unknown[] } =>
Array.isArray(r.messages) && r.messages.length > 0; Try / catch
try {
await svc.testCustomConversationStream(req, handlers);
} catch (e) {
if (e instanceof TestError && e.message === 'At least one message is required') {
// notify user to write a message first
} else throw e;
} Prevention
- Append the current draft to the conversation before invoking the test
- Disable Test when the message list is empty
- Build the request object only after required arrays are populated
When it happens
Trigger: Calling testCustomConversationStream with messages: [], messages: undefined, or a messages array that was filtered down to zero entries.
Common situations: Chat editor state cleared before Test clicked; message draft not yet appended to the conversation array; serialization dropping empty-ish message collections.
Understand the failure class
Background: Missing required parameter errors: what 'X is required' and 'the required X param is missing' mean, and how to fix them — this error's family across 27 libraries.
Related errors
- ${label} testCaseId must not be empty.
- Function mode (functionMode) cannot be empty
- CONFIG_INVALID
- Model config cannot be empty
- Messages array cannot be empty
AI-assisted analysis of linshenkx/prompt-optimizer@3e677b1d9f (2026-08-27).
Data as JSON: /api/errors/4e14601dfca90868.
Report an issue: GitHub.