['required', 'string', function ($attribute, $value, $fail) { if (!ProviderFactory::isSupported($value)) { $fail("The {$attribute} must be one of: " . implode(', ', ProviderFactory::getSupportedProviders())); } }], 'model' => 'required|string|max:100', 'messages' => 'required|array|min:1', 'messages.*.role' => 'required|string|in:system,user,assistant', 'messages.*.content' => 'required|string', // Optional parameters 'temperature' => 'sometimes|numeric|min:0|max:2', 'max_tokens' => 'sometimes|integer|min:1|max:100000', 'top_p' => 'sometimes|numeric|min:0|max:1', 'frequency_penalty' => 'sometimes|numeric|min:-2|max:2', 'presence_penalty' => 'sometimes|numeric|min:-2|max:2', 'stop' => 'sometimes|array', ]; } /** * Get custom messages for validator errors. */ public function messages(): array { return [ 'provider.required' => 'Provider is required (e.g., openai, anthropic)', 'model.required' => 'Model is required (e.g., gpt-4o-mini, claude-sonnet-4)', 'messages.required' => 'Messages array is required', 'messages.*.role.in' => 'Message role must be system, user, or assistant', 'temperature.between' => 'Temperature must be between 0 and 2', 'max_tokens.min' => 'Max tokens must be at least 1', ]; } }