wu981526092 commited on
Commit
01e3890
·
1 Parent(s): 60d7f1e

Add assistant rename and template auto-conversion features

Browse files
frontend/src/pages/Playground.tsx CHANGED
@@ -97,7 +97,9 @@ export function Playground() {
97
 
98
  // Saved assistants state
99
  const [savedAssistants, setSavedAssistants] = useState<any[]>([])
100
- const [selectedAssistant, setSelectedAssistant] = useState<{id: string, name: string, type: 'user'|'template'} | null>(null)
 
 
101
 
102
  // Load saved assistants
103
  const loadSavedAssistants = () => {
@@ -180,7 +182,12 @@ export function Playground() {
180
  setSystemPrompt('')
181
  setTemperature(0.7)
182
  setMaxTokens(1024)
183
- setSelectedAssistant(null)
 
 
 
 
 
184
  }
185
 
186
  // Clear current assistant
@@ -188,6 +195,57 @@ export function Playground() {
188
  setSelectedAssistant(null)
189
  }
190
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  // Load available models and saved assistants on startup
192
  useEffect(() => {
193
  fetchModels()
@@ -526,6 +584,12 @@ export function Playground() {
526
  selectedAssistant={selectedAssistant}
527
  createNewAssistant={createNewAssistant}
528
  clearCurrentAssistant={clearCurrentAssistant}
 
 
 
 
 
 
529
  />
530
  </div>
531
 
@@ -549,16 +613,16 @@ export function Playground() {
549
  setSelectedModel={setSelectedModel}
550
  autoLoadingModel={autoLoadingModel}
551
  temperature={temperature}
552
- setTemperature={setTemperature}
553
  maxTokens={maxTokens}
554
- setMaxTokens={setMaxTokens}
555
  />
556
  </TabsContent>
557
 
558
  <TabsContent value="instructions" className="p-6 space-y-6 m-0">
559
  <SystemInstructionsTab
560
  systemPrompt={systemPrompt}
561
- setSystemPrompt={setSystemPrompt}
562
  isLoading={isLoading}
563
  />
564
  </TabsContent>
@@ -756,7 +820,13 @@ function AssistantSelector({
756
  isLoading,
757
  selectedAssistant,
758
  createNewAssistant,
759
- clearCurrentAssistant
 
 
 
 
 
 
760
  }: {
761
  savedAssistants: any[]
762
  loadSavedAssistant: (id: string) => void
@@ -764,9 +834,15 @@ function AssistantSelector({
764
  presets: Array<{name: string; prompt: string}>
765
  onPresetSelect: (presetName: string) => void
766
  isLoading: boolean
767
- selectedAssistant: {id: string, name: string, type: 'user'|'template'} | null
768
  createNewAssistant: () => void
769
  clearCurrentAssistant: () => void
 
 
 
 
 
 
770
  }) {
771
  const handleAssistantSelect = (value: string) => {
772
  if (value === 'create_new') {
@@ -789,11 +865,25 @@ function AssistantSelector({
789
 
790
  if (selectedAssistant.type === 'user') {
791
  return `user_${selectedAssistant.id}`
 
 
792
  } else {
793
  return selectedAssistant.id
794
  }
795
  }
796
 
 
 
 
 
 
 
 
 
 
 
 
 
797
  const totalAssistants = savedAssistants.length + presets.length
798
 
799
  return (
@@ -807,8 +897,16 @@ function AssistantSelector({
807
  <div className="flex items-center gap-2">
808
  <Bot className="h-4 w-4" />
809
  <span>{selectedAssistant.name}</span>
810
- <Badge variant={selectedAssistant.type === 'user' ? 'secondary' : 'outline'} className="text-xs ml-auto">
811
- {selectedAssistant.type === 'user' ? 'Mine' : 'Template'}
 
 
 
 
 
 
 
 
812
  </Badge>
813
  </div>
814
  ) : (
@@ -895,6 +993,48 @@ function AssistantSelector({
895
  </Select>
896
  </div>
897
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
898
  {/* Save Current Configuration */}
899
  <Button
900
  onClick={saveAssistant}
 
97
 
98
  // Saved assistants state
99
  const [savedAssistants, setSavedAssistants] = useState<any[]>([])
100
+ const [selectedAssistant, setSelectedAssistant] = useState<{id: string, name: string, type: 'user'|'template'|'new', originalTemplate?: string} | null>(null)
101
+ const [isRenaming, setIsRenaming] = useState(false)
102
+ const [tempAssistantName, setTempAssistantName] = useState('')
103
 
104
  // Load saved assistants
105
  const loadSavedAssistants = () => {
 
182
  setSystemPrompt('')
183
  setTemperature(0.7)
184
  setMaxTokens(1024)
185
+ setSelectedAssistant({
186
+ id: 'new_assistant',
187
+ name: 'New Assistant',
188
+ type: 'new'
189
+ })
190
+ setTempAssistantName('New Assistant')
191
  }
192
 
193
  // Clear current assistant
 
195
  setSelectedAssistant(null)
196
  }
197
 
198
+ // Rename assistant
199
+ const startRenaming = () => {
200
+ if (selectedAssistant) {
201
+ setTempAssistantName(selectedAssistant.name)
202
+ setIsRenaming(true)
203
+ }
204
+ }
205
+
206
+ const confirmRename = () => {
207
+ if (selectedAssistant && tempAssistantName.trim()) {
208
+ setSelectedAssistant({
209
+ ...selectedAssistant,
210
+ name: tempAssistantName.trim()
211
+ })
212
+ setIsRenaming(false)
213
+ }
214
+ }
215
+
216
+ const cancelRename = () => {
217
+ setIsRenaming(false)
218
+ setTempAssistantName('')
219
+ }
220
+
221
+ // Convert template to new assistant when settings change
222
+ const convertTemplateToNew = () => {
223
+ if (selectedAssistant && selectedAssistant.type === 'template') {
224
+ setSelectedAssistant({
225
+ id: 'new_assistant',
226
+ name: `Custom ${selectedAssistant.name}`,
227
+ type: 'new',
228
+ originalTemplate: selectedAssistant.name
229
+ })
230
+ }
231
+ }
232
+
233
+ // Wrapped setters that trigger template conversion
234
+ const handleSystemPromptChange = (prompt: string) => {
235
+ setSystemPrompt(prompt)
236
+ convertTemplateToNew()
237
+ }
238
+
239
+ const handleTemperatureChange = (temp: number) => {
240
+ setTemperature(temp)
241
+ convertTemplateToNew()
242
+ }
243
+
244
+ const handleMaxTokensChange = (tokens: number) => {
245
+ setMaxTokens(tokens)
246
+ convertTemplateToNew()
247
+ }
248
+
249
  // Load available models and saved assistants on startup
250
  useEffect(() => {
251
  fetchModels()
 
584
  selectedAssistant={selectedAssistant}
585
  createNewAssistant={createNewAssistant}
586
  clearCurrentAssistant={clearCurrentAssistant}
587
+ isRenaming={isRenaming}
588
+ tempAssistantName={tempAssistantName}
589
+ setTempAssistantName={setTempAssistantName}
590
+ startRenaming={startRenaming}
591
+ confirmRename={confirmRename}
592
+ cancelRename={cancelRename}
593
  />
594
  </div>
595
 
 
613
  setSelectedModel={setSelectedModel}
614
  autoLoadingModel={autoLoadingModel}
615
  temperature={temperature}
616
+ setTemperature={handleTemperatureChange}
617
  maxTokens={maxTokens}
618
+ setMaxTokens={handleMaxTokensChange}
619
  />
620
  </TabsContent>
621
 
622
  <TabsContent value="instructions" className="p-6 space-y-6 m-0">
623
  <SystemInstructionsTab
624
  systemPrompt={systemPrompt}
625
+ setSystemPrompt={handleSystemPromptChange}
626
  isLoading={isLoading}
627
  />
628
  </TabsContent>
 
820
  isLoading,
821
  selectedAssistant,
822
  createNewAssistant,
823
+ clearCurrentAssistant,
824
+ isRenaming,
825
+ tempAssistantName,
826
+ setTempAssistantName,
827
+ startRenaming,
828
+ confirmRename,
829
+ cancelRename
830
  }: {
831
  savedAssistants: any[]
832
  loadSavedAssistant: (id: string) => void
 
834
  presets: Array<{name: string; prompt: string}>
835
  onPresetSelect: (presetName: string) => void
836
  isLoading: boolean
837
+ selectedAssistant: {id: string, name: string, type: 'user'|'template'|'new', originalTemplate?: string} | null
838
  createNewAssistant: () => void
839
  clearCurrentAssistant: () => void
840
+ isRenaming: boolean
841
+ tempAssistantName: string
842
+ setTempAssistantName: (name: string) => void
843
+ startRenaming: () => void
844
+ confirmRename: () => void
845
+ cancelRename: () => void
846
  }) {
847
  const handleAssistantSelect = (value: string) => {
848
  if (value === 'create_new') {
 
865
 
866
  if (selectedAssistant.type === 'user') {
867
  return `user_${selectedAssistant.id}`
868
+ } else if (selectedAssistant.type === 'new') {
869
+ return 'new_assistant'
870
  } else {
871
  return selectedAssistant.id
872
  }
873
  }
874
 
875
+ // Get badge for assistant type
876
+ const getAssistantBadge = (type: 'user'|'template'|'new') => {
877
+ switch (type) {
878
+ case 'user':
879
+ return { variant: 'secondary' as const, text: 'Mine' }
880
+ case 'template':
881
+ return { variant: 'outline' as const, text: 'Template' }
882
+ case 'new':
883
+ return { variant: 'default' as const, text: 'New', className: 'bg-green-100 text-green-700' }
884
+ }
885
+ }
886
+
887
  const totalAssistants = savedAssistants.length + presets.length
888
 
889
  return (
 
897
  <div className="flex items-center gap-2">
898
  <Bot className="h-4 w-4" />
899
  <span>{selectedAssistant.name}</span>
900
+ {selectedAssistant.originalTemplate && (
901
+ <span className="text-xs text-muted-foreground">
902
+ (from {selectedAssistant.originalTemplate})
903
+ </span>
904
+ )}
905
+ <Badge
906
+ variant={getAssistantBadge(selectedAssistant.type).variant}
907
+ className={`text-xs ml-auto ${getAssistantBadge(selectedAssistant.type).className || ''}`}
908
+ >
909
+ {getAssistantBadge(selectedAssistant.type).text}
910
  </Badge>
911
  </div>
912
  ) : (
 
993
  </Select>
994
  </div>
995
 
996
+ {/* Rename Assistant Section */}
997
+ {selectedAssistant && selectedAssistant.type !== 'template' && (
998
+ <>
999
+ {isRenaming ? (
1000
+ <div className="space-y-2">
1001
+ <Label className="text-sm font-medium">Rename Assistant</Label>
1002
+ <div className="flex gap-2">
1003
+ <input
1004
+ type="text"
1005
+ value={tempAssistantName}
1006
+ onChange={(e) => setTempAssistantName(e.target.value)}
1007
+ className="flex-1 px-3 py-1.5 text-sm border border-input rounded-md focus:outline-none focus:ring-2 focus:ring-ring"
1008
+ placeholder="Enter assistant name..."
1009
+ autoFocus
1010
+ onKeyDown={(e) => {
1011
+ if (e.key === 'Enter') confirmRename()
1012
+ if (e.key === 'Escape') cancelRename()
1013
+ }}
1014
+ />
1015
+ <Button size="sm" onClick={confirmRename} disabled={!tempAssistantName.trim()}>
1016
+
1017
+ </Button>
1018
+ <Button size="sm" variant="ghost" onClick={cancelRename}>
1019
+
1020
+ </Button>
1021
+ </div>
1022
+ </div>
1023
+ ) : (
1024
+ <Button
1025
+ onClick={startRenaming}
1026
+ size="sm"
1027
+ variant="ghost"
1028
+ className="w-full justify-start"
1029
+ disabled={isLoading}
1030
+ >
1031
+ <Settings className="h-4 w-4 mr-2" />
1032
+ Rename "{selectedAssistant.name}"
1033
+ </Button>
1034
+ )}
1035
+ </>
1036
+ )}
1037
+
1038
  {/* Save Current Configuration */}
1039
  <Button
1040
  onClick={saveAssistant}
static/assets/index-39cedd31.js ADDED
The diff for this file is too large to render. See raw diff
 
static/assets/index-39cedd31.js.map ADDED
The diff for this file is too large to render. See raw diff
 
static/index.html CHANGED
@@ -5,7 +5,7 @@
5
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
  <title>Edge LLM</title>
8
- <script type="module" crossorigin src="/assets/index-92339890.js"></script>
9
  <link rel="stylesheet" href="/assets/index-b386becc.css">
10
  </head>
11
  <body>
 
5
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
  <title>Edge LLM</title>
8
+ <script type="module" crossorigin src="/assets/index-39cedd31.js"></script>
9
  <link rel="stylesheet" href="/assets/index-b386becc.css">
10
  </head>
11
  <body>