Skip to content

Commit 23e1d30

Browse files
committed
feat: add model selector dropdown to AI Schema Creator chat
1 parent 1f89774 commit 23e1d30

4 files changed

Lines changed: 35 additions & 7 deletions

File tree

‎apps/dashboard-api/src/controllers/ai.controller.js‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ const collectionCreator = async (req, res, next) => {
169169

170170
try {
171171
const { projectId } = req.params;
172-
const { userMessage } = req.body;
172+
const { userMessage, model } = req.body;
173173

174174
if (typeof userMessage !== 'string' || userMessage.trim().length === 0) {
175175
throw new AppError(400, "User message is required");
@@ -245,7 +245,8 @@ const collectionCreator = async (req, res, next) => {
245245
messages: session.messages,
246246
developer_id: req.user._id.toString(),
247247
plan: effectivePlan,
248-
encrypted_byok: encryptedByok
248+
encrypted_byok: encryptedByok,
249+
model: model || 'llama-3.3-70b-versatile'
249250
});
250251

251252
const allowedTypes = new Set(['String', 'Number', 'Boolean', 'Date', 'Object', 'Array', 'Ref']);

‎apps/python-service/routers/ai.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ class CollectionCreatorRequest(BaseModel):
8080
developer_id: str
8181
plan: str = "free"
8282
encrypted_byok: EncryptedByok | None = None
83+
model: str = "llama-3.3-70b-versatile"
8384

8485
class CollectionCreatorResponse(BaseModel):
8586
type: Literal["clarify", "schema", "complete"]
@@ -189,6 +190,7 @@ async def collection_creator(request: CollectionCreatorRequest, req: Request):
189190
encrypted_byok=request.encrypted_byok.model_dump() if request.encrypted_byok else None,
190191
feature="collection-creator",
191192
increment=(len(request.messages) == 1),
193+
model=request.model,
192194
)
193195

194196
structured_llm = llm.with_structured_output(CollectionCreatorResponse)

‎apps/python-service/services/byok.py‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ async def resolve_ai_client(
4141
encrypted_byok: dict | None,
4242
feature: str = "query-builder",
4343
increment: bool = True,
44+
model: str = "llama-3.3-70b-versatile",
4445
) -> ChatGroq:
4546
"""Resolve the appropriate AI client based on BYOK and plan.
4647
@@ -69,10 +70,10 @@ async def resolve_ai_client(
6970
logger.info("🔑 Attempting to decrypt BYOK Groq key for developer_id=%s...", developer_id)
7071
try:
7172
decrypted_key = decrypt_transit(encrypted_byok["groqKey"])
72-
logger.info("✅ BYOK Groq key decrypted successfully. Initializing ChatGroq client (model=llama-3.3-70b-versatile)...")
73+
logger.info("✅ BYOK Groq key decrypted successfully. Initializing ChatGroq client (model=%s)...", model)
7374
return ChatGroq(
7475
api_key=decrypted_key,
75-
model_name="llama-3.3-70b-versatile",
76+
model_name=model,
7677
temperature=0,
7778
)
7879
except Exception as e:
@@ -135,10 +136,10 @@ async def resolve_ai_client(
135136
)
136137

137138
# ── 4. Return platform client ──
138-
logger.info("✅ Rate limit check passed for developer_id=%s. Initializing Platform ChatGroq client (model=llama-3.3-70b-versatile)...", developer_id)
139+
logger.info("✅ Rate limit check passed for developer_id=%s. Initializing Platform ChatGroq client (model=%s)...", developer_id, model)
139140
return ChatGroq(
140141
api_key=settings.GROQ_API_KEY,
141-
model_name="llama-3.3-70b-versatile",
142+
model_name=model,
142143
temperature=0,
143144
)
144145

‎apps/web-dashboard/src/components/CollectionCreatorAgent.jsx‎

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,19 @@ const SUGGESTIONS = [
1111
{ label: 'Content Management (CMS)', prompt: 'Design a headless CMS with articles, authors, categories, media assets, and publishing revisions' },
1212
];
1313

14+
const MODELS = [
15+
'llama-3.3-70b-versatile',
16+
'llama-3.1-8b-instant',
17+
'qwen/qwen3.6-27b',
18+
'openai/gpt-oss-120b',
19+
'openai/gpt-oss-20b',
20+
'openai/gpt-oss-safeguard-20b',
21+
'canopylabs/orpheus-v1-english',
22+
'canopylabs/orpheus-arabic-saudi',
23+
'groq/compound',
24+
'groq/compound-mini'
25+
];
26+
1427
const createMsg = (role, content) => ({
1528
id: `${Date.now()}_${Math.random().toString(36).slice(2, 7)}`,
1629
role,
@@ -28,6 +41,7 @@ export default function CollectionCreatorAgent({ projectId, onInsertAll }) {
2841
const [inputValue, setInputValue] = useState('');
2942
const [isInserting, setIsInserting] = useState(false);
3043
const [insertResults, setInsertResults] = useState(null);
44+
const [selectedModel, setSelectedModel] = useState(MODELS[0]);
3145

3246
const messagesEndRef = useRef(null);
3347
const timersRef = useRef([]);
@@ -71,7 +85,8 @@ export default function CollectionCreatorAgent({ projectId, onInsertAll }) {
7185

7286
try {
7387
const res = await api.post(`/api/projects/${projectId}/ai/collection-creator`, {
74-
userMessage: textToSend
88+
userMessage: textToSend,
89+
model: selectedModel
7590
});
7691

7792
const { message, schema: newSchema, iterationsLeft: left, iterationLimit: limit } = res.data.data;
@@ -228,6 +243,15 @@ export default function CollectionCreatorAgent({ projectId, onInsertAll }) {
228243
<Bot size={16} className="text-[var(--color-primary)]" />
229244
<span>AI Schema Assistant</span>
230245
</h3>
246+
<select
247+
value={selectedModel}
248+
onChange={(e) => setSelectedModel(e.target.value)}
249+
className="text-xs py-1 px-2 rounded-md border border-[var(--color-border)] bg-[var(--color-bg-input)] text-[var(--color-text-main)] focus:outline-none focus:border-[var(--color-primary)] max-w-[180px] overflow-hidden text-ellipsis whitespace-nowrap"
250+
>
251+
{MODELS.map(m => (
252+
<option key={m} value={m}>{m}</option>
253+
))}
254+
</select>
231255
</div>
232256

233257
{/* Messages Stream (Only this scrolls) */}

0 commit comments

Comments
 (0)