imccyu hace 1 mes
padre
commit
7e2f6f474d

+ 40 - 34
packages/client/ui-model/src/client/ModelSelect.tsx

@@ -75,16 +75,16 @@ export function ModelSelect({ locked, directory, load, select }: ModelSelectInje
   const effortChoices = useMemo<readonly EffortChoice[]>(() => reasoning === undefined
     ? []
     : [
-        ...reasoning.defaultEffort === undefined
-          ? [{ key: 'provider-default', effort: undefined, label: 'Provider default' }]
-          : [],
-        ...reasoning.efforts.map((effort: ModelReasoningEffort) => ({
-          key: `effort:${effort.id}`,
-          effort: effort.id,
-          label: effort.name,
-          ...effort.description === undefined ? {} : { description: effort.description },
-        })),
-      ], [reasoning])
+      ...reasoning.defaultEffort === undefined
+        ? [{ key: 'provider-default', effort: undefined, label: 'Provider default' }]
+        : [],
+      ...reasoning.efforts.map((effort: ModelReasoningEffort) => ({
+        key: `effort:${effort.id}`,
+        effort: effort.id,
+        label: effort.name,
+        ...effort.description === undefined ? {} : { description: effort.description },
+      })),
+    ], [reasoning])
   const busy = state.status === 'selecting'
 
   // Mount-time load resolves the trigger label; every open refreshes.
@@ -186,7 +186,13 @@ export function ModelSelect({ locked, directory, load, select }: ModelSelectInje
         aria-controls={open ? `${id}-menu` : undefined}
         title={triggerLabel}
         disabled={locked}
-        onClick={() => { open ? close() : show() }}
+        onClick={() => {
+          if (open) {
+            close()
+          } else {
+            show()
+          }
+        }}
       >
         <span className={css.triggerLabel}>{modelLabel}</span>
         {effortLabel !== undefined && <span className={css.triggerEffort}>{effortLabel}</span>}
@@ -203,13 +209,13 @@ export function ModelSelect({ locked, directory, load, select }: ModelSelectInje
         >
           {pane === 'root' && (
             <>
-              <button ref={itemRef()} type="button" role="menuitem" className={css.cell} onClick={() => setPane('model')}>
+              <button ref={itemRef()} type="button" role="menuitem" className={css.cell} onClick={() => { setPane('model') }}>
                 <span className={css.cellLabel}>Model</span>
                 <span className={css.cellValue}>{modelLabel}</span>
                 <IconChevronRightOutline14 className={css.cellChevron} />
               </button>
               {reasoning !== undefined && (
-                <button ref={itemRef()} type="button" role="menuitem" className={css.cell} onClick={() => setPane('effort')}>
+                <button ref={itemRef()} type="button" role="menuitem" className={css.cell} onClick={() => { setPane('effort') }}>
                   <span className={css.cellLabel}>Effort</span>
                   <span className={css.cellValue}>{effortLabel}</span>
                   <IconChevronRightOutline14 className={css.cellChevron} />
@@ -291,27 +297,27 @@ export function ModelSelect({ locked, directory, load, select }: ModelSelectInje
               {effortChoices.length === 0
                 ? <div className={css.empty}>当前模型未提供推理等级。</div>
                 : effortChoices.map(level => (
-                    <button
-                      ref={itemRef()}
-                      type="button"
-                      role="menuitemradio"
-                      aria-checked={effectiveEffort === level.effort}
-                      className={clsx(css.option, effectiveEffort === level.effort && css.selected)}
-                      key={level.key}
-                      disabled={busy}
-                      onClick={() => { chooseEffort(level.effort) }}
-                    >
-                      <span className={css.optionCopy}>
-                        <span className={css.modelName}>{level.label}</span>
-                        {level.description !== undefined && (
-                          <span className={css.description}>{level.description}</span>
-                        )}
-                      </span>
-                      <span className={css.check}>
-                        {effectiveEffort === level.effort ? <IconCheckOutline16 /> : null}
-                      </span>
-                    </button>
-                  ))}
+                  <button
+                    ref={itemRef()}
+                    type="button"
+                    role="menuitemradio"
+                    aria-checked={effectiveEffort === level.effort}
+                    className={clsx(css.option, effectiveEffort === level.effort && css.selected)}
+                    key={level.key}
+                    disabled={busy}
+                    onClick={() => { chooseEffort(level.effort) }}
+                  >
+                    <span className={css.optionCopy}>
+                      <span className={css.modelName}>{level.label}</span>
+                      {level.description !== undefined && (
+                        <span className={css.description}>{level.description}</span>
+                      )}
+                    </span>
+                    <span className={css.check}>
+                      {effectiveEffort === level.effort ? <IconCheckOutline16 /> : null}
+                    </span>
+                  </button>
+                ))}
             </>
           )}
         </div>

+ 2 - 2
packages/client/ui-model/src/client/slots.ts

@@ -13,11 +13,11 @@ export interface ModelSelectInjected {
   /** The session's shared directory store (same instance the /model popup reads). */
   directory: SnapshotStore<ModelDirectoryState>
   /** Refresh the advisory directory (fire-and-forget; errors land on the store). */
-  load(): void
+  load: () => void
   /**
    * Select a complete provider/model/reasoning target through the shared route.
    * @param target - model target and optional adapter-owned effort.
    * @returns whether the host accepted the selection.
    */
-  select(target: ModelTarget): Promise<boolean>
+  select: (target: ModelTarget) => Promise<boolean>
 }