/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { PlaygroundChat } from './components/chat/playground-chat' import { PlaygroundInput } from './components/input/playground-input' import { useChatHandler, usePlaygroundConversation, usePlaygroundOptions, usePlaygroundState, } from './hooks' export function Playground() { const { config, parameterEnabled, messages, isLoadingMessages, models, groups, updateMessages, setModels, setGroups, updateConfig, updateParameterEnabled, clearMessages, } = usePlaygroundState() const { sendChat, stopGeneration, isGenerating } = useChatHandler({ config, parameterEnabled, onMessageUpdate: updateMessages, }) const { editingMessageKey, handleSendMessage, handleRegenerateMessage, handleEditMessage, handleEditOpenChange, applyEdit, handleDeleteMessage, } = usePlaygroundConversation({ messages, updateMessages, sendChat, }) const handleClearMessages = () => { handleEditOpenChange(false) clearMessages() } const { isLoadingModels } = usePlaygroundOptions({ currentGroup: config.group, currentModel: config.model, setGroups, setModels, updateConfig, }) return (
{/* Full-width scroll container: scrolling works even over side whitespace */}
applyEdit(newContent, false)} onSaveEditAndSubmit={(newContent) => applyEdit(newContent, true)} />
{/* Input area: center content and constrain to the same container width */}
updateConfig('group', value)} onConfigChange={updateConfig} onClearMessages={handleClearMessages} onModelChange={(value) => updateConfig('model', value)} onParameterEnabledChange={updateParameterEnabled} onStop={stopGeneration} onSubmit={handleSendMessage} parameterEnabled={parameterEnabled} hasMessages={messages.length > 0} />
) }