Skip to content

Commit

Permalink
Merge pull request #23 from zhengxs2018/model-setting-ui
Browse files Browse the repository at this point in the history
feat(core): Add model setting ui
  • Loading branch information
phodal authored Dec 7, 2023
2 parents 658419f + 3dcd198 commit 9cf3fb5
Show file tree
Hide file tree
Showing 5 changed files with 332 additions and 2 deletions.
164 changes: 164 additions & 0 deletions web/core/lib/editor/components/base/select.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
'use client';

import * as React from 'react';
import {
CaretSortIcon,
CheckIcon,
ChevronDownIcon,
ChevronUpIcon,
} from '@radix-ui/react-icons';
import * as SelectPrimitive from '@radix-ui/react-select';

import { clsx } from 'clsx';

const Select = SelectPrimitive.Root;

const SelectGroup = SelectPrimitive.Group;

const SelectValue = SelectPrimitive.Value;

const SelectTrigger = React.forwardRef<
React.ElementRef<typeof SelectPrimitive.Trigger>,
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>
>(({ className, children, ...props }, ref) => (
<SelectPrimitive.Trigger
ref={ref}
className={clsx(
'flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-solid border-black bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',
className
)}
{...props}
>
{children}
<SelectPrimitive.Icon asChild>
<CaretSortIcon className="h-4 w-4 opacity-50" />
</SelectPrimitive.Icon>
</SelectPrimitive.Trigger>
));
SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;

const SelectScrollUpButton = React.forwardRef<
React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,
React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>
>(({ className, ...props }, ref) => (
<SelectPrimitive.ScrollUpButton
ref={ref}
className={clsx(
'flex cursor-default items-center justify-center py-1',
className
)}
{...props}
>
<ChevronUpIcon />
</SelectPrimitive.ScrollUpButton>
));
SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;

const SelectScrollDownButton = React.forwardRef<
React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,
React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>
>(({ className, ...props }, ref) => (
<SelectPrimitive.ScrollDownButton
ref={ref}
className={clsx(
'flex cursor-default items-center justify-center py-1',
className
)}
{...props}
>
<ChevronDownIcon />
</SelectPrimitive.ScrollDownButton>
));
SelectScrollDownButton.displayName =
SelectPrimitive.ScrollDownButton.displayName;

const SelectContent = React.forwardRef<
React.ElementRef<typeof SelectPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>
>(({ className, children, position = 'popper', ...props }, ref) => (
<SelectPrimitive.Portal>
<SelectPrimitive.Content
ref={ref}
className={clsx(
'relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
position === 'popper' &&
'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',
className
)}
position={position}
{...props}
>
<SelectScrollUpButton />
<SelectPrimitive.Viewport
className={clsx(
'p-1',
position === 'popper' &&
'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'
)}
>
{children}
</SelectPrimitive.Viewport>
<SelectScrollDownButton />
</SelectPrimitive.Content>
</SelectPrimitive.Portal>
));
SelectContent.displayName = SelectPrimitive.Content.displayName;

const SelectLabel = React.forwardRef<
React.ElementRef<typeof SelectPrimitive.Label>,
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>
>(({ className, ...props }, ref) => (
<SelectPrimitive.Label
ref={ref}
className={clsx('px-2 py-1.5 text-sm font-semibold', className)}
{...props}
/>
));
SelectLabel.displayName = SelectPrimitive.Label.displayName;

const SelectItem = React.forwardRef<
React.ElementRef<typeof SelectPrimitive.Item>,
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>
>(({ className, children, ...props }, ref) => (
<SelectPrimitive.Item
ref={ref}
className={clsx(
'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
className
)}
{...props}
>
<span className="absolute right-2 flex h-3.5 w-3.5 items-center justify-center">
<SelectPrimitive.ItemIndicator>
<CheckIcon className="h-4 w-4" />
</SelectPrimitive.ItemIndicator>
</span>
<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
</SelectPrimitive.Item>
));
SelectItem.displayName = SelectPrimitive.Item.displayName;

const SelectSeparator = React.forwardRef<
React.ElementRef<typeof SelectPrimitive.Separator>,
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>
>(({ className, ...props }, ref) => (
<SelectPrimitive.Separator
ref={ref}
className={clsx('-mx-1 my-1 h-px bg-muted', className)}
{...props}
/>
));
SelectSeparator.displayName = SelectPrimitive.Separator.displayName;

export {
Select,
SelectGroup,
SelectValue,
SelectTrigger,
SelectContent,
SelectLabel,
SelectItem,
SelectSeparator,
SelectScrollUpButton,
SelectScrollDownButton,
};
27 changes: 27 additions & 0 deletions web/core/lib/editor/components/base/slider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
'use client';

import * as React from 'react';
import * as SliderPrimitive from '@radix-ui/react-slider';

import { clsx } from 'clsx';

export const Slider = React.forwardRef<
React.ElementRef<typeof SliderPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>
>(({ className, ...props }, ref) => (
<SliderPrimitive.Root
ref={ref}
className={clsx(
'relative flex w-full touch-none select-none items-center',
className
)}
{...props}
>
<SliderPrimitive.Track className="relative h-1.5 w-full grow overflow-hidden rounded-full bg-black/20">
<SliderPrimitive.Range className="absolute h-full bg-black" />
</SliderPrimitive.Track>
<SliderPrimitive.Thumb className="block h-4 w-4 rounded-full border border-black/50 bg-white transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50" />
</SliderPrimitive.Root>
));

Slider.displayName = SliderPrimitive.Root.displayName;
138 changes: 138 additions & 0 deletions web/core/lib/editor/components/sidebar.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,21 @@
import React from 'react'
import * as Accordion from '@radix-ui/react-accordion'
import { ChevronDownIcon } from '@radix-ui/react-icons'


import { useTranslation } from "react-i18next";

import { Slider } from './base/slider'
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectLabel,
SelectTrigger,
SelectValue,
} from './base/select';

export const Sidebar: React.FC<any> = ({ editor }) => {
const { t } = useTranslation();

Expand Down Expand Up @@ -62,6 +75,131 @@ export const Sidebar: React.FC<any> = ({ editor }) => {
</div>
</Accordion.Content>
</Accordion.Item>

<Accordion.Item className={'AccordionItem'} value="model-setting">
<AccordionTrigger>{t('Model Setting')}</AccordionTrigger>
<Accordion.Content className={'AccordionContent'}>
<div className="py-4 px-5">
<div className="grid gap-2 pt-2">
<div className="flex items-center justify-between">
<label htmlFor="model">Model</label>
<span className="w-[200px] rounded-md border border-transparent px-2 py-0.5 text-right text-sm text-muted-foreground hover:border-border">
gpt-3.5-turbo
</span>
</div>

<Select >
<SelectTrigger className="w-full box-border">
<SelectValue placeholder="Select a model..." />
</SelectTrigger>
<SelectContent className="bg-white">
<SelectGroup>
<SelectLabel>Open AI</SelectLabel>
<SelectItem value="gpt-3.5-turbo">gpt-3.5-turbo</SelectItem>
<SelectItem value="gpt-3.5-turbo-16k">gpt-3.5-turbo-16k</SelectItem>
<SelectItem value="gpt-4">gpt-4</SelectItem>
<SelectItem value="gpt-4-32k">gpt-4-32k</SelectItem>

<SelectLabel>文心一言</SelectLabel>
<SelectItem value="ernie-bot">ernie-bot</SelectItem>
<SelectItem value="ernie-bot-turbo">ernie-bot-turbo</SelectItem>
<SelectItem value="ernie-bot-4">ernie-bot-4</SelectItem>
<SelectItem value="ernie-bot-8k">ernie-bot-8k</SelectItem>

<SelectLabel>通义千问</SelectLabel>
<SelectItem value="qwen-turbo">qwen-turbo</SelectItem>
<SelectItem value="qwen-plus">qwen-plus</SelectItem>
<SelectItem value="qwen-max">qwen-max</SelectItem>
<SelectItem value="qwen-max-longcontext">qwen-max-longcontext</SelectItem>

<SelectLabel>Minimax</SelectLabel>
<SelectItem value="abab5-chat">abab5-chat</SelectItem>
<SelectItem value="abab5.5-chat">abab5.5-chat</SelectItem>
<SelectItem value="abab5.5-chat-pro">abab5.5-chat-pro</SelectItem>

</SelectGroup>
</SelectContent>
</Select>
</div>

<div className="grid gap-2 pt-2">
<div className="grid gap-4">
<div className="flex items-center justify-between">
<label htmlFor="temperature">Temperature</label>
<span className="w-12 rounded-md border border-transparent px-2 py-0.5 text-right text-sm text-muted-foreground hover:border-border">
0.56
</span>
</div>
<Slider
id="temperature"
max={1}
defaultValue={[0.56]}
step={0.1}
className="[&_[role=slider]]:h-4 [&_[role=slider]]:w-4"
aria-label="Temperature"
/>
</div>
</div>

<div className="grid gap-2 pt-2">
<div className="grid gap-4">
<div className="flex items-center justify-between">
<label htmlFor="maxlength">Maximum Length</label>
<span className="w-12 rounded-md border border-transparent px-2 py-0.5 text-right text-sm text-muted-foreground hover:border-border">
256
</span>
</div>
<Slider
id="maxlength"
max={4000}
defaultValue={[256]}
step={10}
className="[&_[role=slider]]:h-4 [&_[role=slider]]:w-4"
aria-label="Maximum Length"
/>
</div>
</div>

<div className="grid gap-2 pt-2">
<div className="grid gap-4">
<div className="flex items-center justify-between">
<label htmlFor="top-p">Top P</label>
<span className="w-12 rounded-md border border-transparent px-2 py-0.5 text-right text-sm text-muted-foreground hover:border-border">
0.9
</span>
</div>
<Slider
id="top-p"
max={1}
defaultValue={[0.9]}
step={0.1}
className="[&_[role=slider]]:h-4 [&_[role=slider]]:w-4"
aria-label="top-p"
/>
</div>
</div>

<div className="grid gap-2 pt-2">
<div className="grid gap-4">
<div className="flex items-center justify-between">
<label htmlFor="presence-penalty">Presence penalty</label>
<span className="w-12 rounded-md border border-transparent px-2 py-0.5 text-right text-sm text-muted-foreground hover:border-border">
0
</span>
</div>
<Slider
id="presence-penalty"
max={1}
defaultValue={[0]}
step={0.1}
className="[&_[role=slider]]:h-4 [&_[role=slider]]:w-4"
aria-label="presence-penalty"
/>
</div>
</div>
</div>
</Accordion.Content>
</Accordion.Item>
</Accordion.Root>
</div>
</aside>
Expand Down
1 change: 1 addition & 0 deletions web/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@
"@tiptap/react": "^2.1.12",
"@tiptap/starter-kit": "^2.1.12",
"@tiptap/suggestion": "^2.1.12",
"clsx": "^2.0.0",
"handlebars": "^4.7.8",
"i18next": "^23.7.6",
"i18next-browser-languagedetector": "^7.2.0",
Expand Down
4 changes: 2 additions & 2 deletions web/studio/i18n/i18n.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ const resources = {
'Text Prediction': 'Text Prediction',
'Text Similarity': 'Text Similarity',
'Web Search': 'Web Search',

'Model Setting': 'Model Setting',
'Continue writing': 'Continue writing',
'Help Me Write': 'Help Me Write',
'Spelling and Grammar': 'Spelling and Grammar',
Expand All @@ -94,7 +94,7 @@ const resources = {
'Text Prediction': '文本预测',
'Text Similarity': '文本相似度',
'Web Search': '网页搜索',

'Model Setting': '模型设置',
'Continue writing': '续写',
'Help Me Write': '帮助我写作',
'Spelling and Grammar': '拼写和语法检查',
Expand Down

0 comments on commit 9cf3fb5

Please sign in to comment.