From 0cc2a40f262128796b2d65ebf76447ff94af8fd7 Mon Sep 17 00:00:00 2001 From: jialin Date: Thu, 28 Nov 2024 23:18:09 +0800 Subject: [PATCH] chore: docker add worker command --- config/config.ts | 2 +- .../icon-font/iconfont/iconfont.css | 14 +- src/components/icon-font/iconfont/iconfont.js | 28 +- .../icon-font/iconfont/iconfont.json | 14 + .../icon-font/iconfont/iconfont.ttf | Bin 16512 -> 17000 bytes .../icon-font/iconfont/iconfont.woff | Bin 9872 -> 10228 bytes .../icon-font/iconfont/iconfont.woff2 | Bin 8332 -> 8636 bytes src/components/speech-content/speech-item.tsx | 4 +- src/components/version-info/index.tsx | 7 +- src/layouts/index.tsx | 2 +- src/locales/en-US/playground.ts | 3 +- src/locales/zh-CN/playground.ts | 3 +- .../playground/components/ground-images.tsx | 43 +- .../playground/components/ground-stt.tsx | 43 +- .../playground/components/message-input.tsx | 760 +++++++++--------- src/pages/playground/config/index.ts | 12 + src/pages/resources/components/add-worker.tsx | 5 + src/pages/resources/config/index.ts | 7 + 18 files changed, 531 insertions(+), 416 deletions(-) diff --git a/config/config.ts b/config/config.ts index f5474751..8633f558 100644 --- a/config/config.ts +++ b/config/config.ts @@ -14,7 +14,7 @@ const isProduction = env === 'production'; const t = Date.now(); export default defineConfig({ proxy: { - ...proxy('http://192.168.50.2') + ...proxy('http://192.168.50.3') }, history: { type: 'hash' diff --git a/src/components/icon-font/iconfont/iconfont.css b/src/components/icon-font/iconfont/iconfont.css index a28a5d2e..a7a25f11 100644 --- a/src/components/icon-font/iconfont/iconfont.css +++ b/src/components/icon-font/iconfont/iconfont.css @@ -1,9 +1,9 @@ @font-face { font-family: iconfont; /* Project id 4613488 */ src: - url('iconfont.woff2?t=1732245003614') format('woff2'), - url('iconfont.woff?t=1732245003614') format('woff'), - url('iconfont.ttf?t=1732245003614') format('truetype'); + url('iconfont.woff2?t=1732806927800') format('woff2'), + url('iconfont.woff?t=1732806927800') format('woff'), + url('iconfont.ttf?t=1732806927800') format('truetype'); } .iconfont { @@ -14,6 +14,14 @@ -moz-osx-font-smoothing: grayscale; } +.icon-random::before { + content: '\e603'; +} + +.icon-suijisenlin::before { + content: '\e60e'; +} + .icon-stop2::before { content: '\e8db'; } diff --git a/src/components/icon-font/iconfont/iconfont.js b/src/components/icon-font/iconfont/iconfont.js index 06c2b5dc..8ef116da 100644 --- a/src/components/icon-font/iconfont/iconfont.js +++ b/src/components/icon-font/iconfont/iconfont.js @@ -1,17 +1,17 @@ (window._iconfont_svg_string_4613488 = - ''), + ''), ((h) => { var a = (l = (l = document.getElementsByTagName('script'))[ l.length - 1 ]).getAttribute('data-injectcss'), l = l.getAttribute('data-disable-injectsvg'); if (!l) { - var z, + var c, + z, t, - c, i, - v, - m = function (a, l) { + m, + v = function (a, l) { l.parentNode.insertBefore(a, l); }; if (a && !h.__iconfont__svg__cssinject__) { @@ -24,7 +24,7 @@ console && console.log(a); } } - (z = function () { + (c = function () { var a, l = document.createElement('div'); (l.innerHTML = h._iconfont_svg_string_4613488), @@ -36,20 +36,20 @@ (l.style.overflow = 'hidden'), (l = l), (a = document.body).firstChild - ? m(l, a.firstChild) + ? v(l, a.firstChild) : a.appendChild(l)); }), document.addEventListener ? ~['complete', 'loaded', 'interactive'].indexOf(document.readyState) - ? setTimeout(z, 0) - : ((t = function () { - document.removeEventListener('DOMContentLoaded', t, !1), z(); + ? setTimeout(c, 0) + : ((z = function () { + document.removeEventListener('DOMContentLoaded', z, !1), c(); }), - document.addEventListener('DOMContentLoaded', t, !1)) + document.addEventListener('DOMContentLoaded', z, !1)) : document.attachEvent && - ((c = z), + ((t = c), (i = h.document), - (v = !1), + (m = !1), p(), (i.onreadystatechange = function () { 'complete' == i.readyState && @@ -57,7 +57,7 @@ })); } function o() { - v || ((v = !0), c()); + m || ((m = !0), t()); } function p() { try { diff --git a/src/components/icon-font/iconfont/iconfont.json b/src/components/icon-font/iconfont/iconfont.json index 206b0e84..347f51f8 100644 --- a/src/components/icon-font/iconfont/iconfont.json +++ b/src/components/icon-font/iconfont/iconfont.json @@ -5,6 +5,20 @@ "css_prefix_text": "icon-", "description": "", "glyphs": [ + { + "icon_id": "13059398", + "name": "随机", + "font_class": "random", + "unicode": "e603", + "unicode_decimal": 58883 + }, + { + "icon_id": "5978743", + "name": "random-forest", + "font_class": "suijisenlin", + "unicode": "e60e", + "unicode_decimal": 58894 + }, { "icon_id": "15617444", "name": "stop", diff --git a/src/components/icon-font/iconfont/iconfont.ttf b/src/components/icon-font/iconfont/iconfont.ttf index 133aed60f42c2a34a5cae90d8099383574939fc2..5d5095b5aa502323734571a719ecfd05cb6bdaed 100644 GIT binary patch delta 1441 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 = (props) => {
{props.format} - - {props.speed}x + {/* + {props.speed}x */}
= ({ intl }) => { const currentVersion = getAtomStorage(GPUStackVersionAtom)?.version; const isProd = - currentVersion !== '0.0.0' && currentVersion?.indexOf('rc') === -1; + currentVersion?.indexOf('rc') === -1 && + currentVersion?.indexOf('0.0.0') === -1; const uiVersion = document.documentElement.getAttribute('data-version'); @@ -39,7 +40,7 @@ const VersionInfo: React.FC<{ intl: any }> = ({ intl }) => { {' '} {intl.formatMessage({ id: 'common.footer.version.server' })} - {currentVersion === '0.0.0' + {currentVersion.indexOf('0.0.0') > -1 ? getAtomStorage(GPUStackVersionAtom)?.git_commit : getAtomStorage(GPUStackVersionAtom)?.version} @@ -55,7 +56,7 @@ const VersionInfo: React.FC<{ intl: any }> = ({ intl }) => { {latestVersion && latestVersion !== currentVersion && - latestVersion !== '0.0.0' + latestVersion.indexOf('0.0.0') === -1 ? intl.formatMessage( { id: 'users.version.update' }, { version: latestVersion } diff --git a/src/layouts/index.tsx b/src/layouts/index.tsx index fff8919d..1b57c7cc 100644 --- a/src/layouts/index.tsx +++ b/src/layouts/index.tsx @@ -182,7 +182,7 @@ export default (props: any) => { initialState?.currentUser?.is_admin && updateCheck.latest_version && updateCheck.latest_version !== version?.version && - updateCheck.latest_version !== '0.0.0' && + updateCheck.latest_version?.indexOf('0.0.0') === -1 && updateCheck.latest_version?.indexOf('rc') === -1 ); }, [updateCheck, version, initialState]); diff --git a/src/locales/en-US/playground.ts b/src/locales/en-US/playground.ts index 883b52a0..d5e8b608 100644 --- a/src/locales/en-US/playground.ts +++ b/src/locales/en-US/playground.ts @@ -109,5 +109,6 @@ export default { 'In the chart, the distance between points indicates the similarity between the corresponding documents. Closer points mean higher similarity.', 'playground.audio.button.play': 'Play', 'playground.audio.button.download': 'Download', - 'playground.audio.button.stop': 'Stop' + 'playground.audio.button.stop': 'Stop', + 'playground.image.prompt.random': 'Random Prompt' }; diff --git a/src/locales/zh-CN/playground.ts b/src/locales/zh-CN/playground.ts index 165b02ed..1a38e8b7 100644 --- a/src/locales/zh-CN/playground.ts +++ b/src/locales/zh-CN/playground.ts @@ -106,5 +106,6 @@ export default { '在图表中,点之间的距离表示相应文档之间的相似度。点越近意味着相似度越高。', 'playground.audio.button.play': '播放', 'playground.audio.button.download': '下载', - 'playground.audio.button.stop': '停止' + 'playground.audio.button.stop': '停止', + 'playground.image.prompt.random': '随机提示词' }; diff --git a/src/pages/playground/components/ground-images.tsx b/src/pages/playground/components/ground-images.tsx index 5bfb2ca8..3e9ce863 100644 --- a/src/pages/playground/components/ground-images.tsx +++ b/src/pages/playground/components/ground-images.tsx @@ -1,4 +1,5 @@ import AlertInfo from '@/components/alert-info'; +import IconFont from '@/components/icon-font'; import FieldComponent from '@/components/seal-form/field-component'; import SealInput from '@/components/seal-form/seal-input'; import SealSelect from '@/components/seal-form/seal-select'; @@ -25,7 +26,7 @@ import React, { useState } from 'react'; import { CREAT_IMAGE_API } from '../apis'; -import { OpenAIViewCode } from '../config'; +import { OpenAIViewCode, promptList } from '../config'; import { ImageAdvancedParamsConfig, ImageconstExtraConfig, @@ -124,6 +125,7 @@ const GroundImages: React.FC = forwardRef((props, ref) => { const requestToken = useRef(null); const [currentPrompt, setCurrentPrompt] = useState(''); const form = useRef(null); + const inputRef = useRef(null); const size = Form.useWatch('size', form.current?.form); @@ -142,6 +144,20 @@ const GroundImages: React.FC = forwardRef((props, ref) => { }; }); + const generateNumber = (min: number, max: number) => { + return Math.floor(Math.random() * (max - min + 1) + min); + }; + + const handleRandomPrompt = useCallback(() => { + const randomIndex = generateNumber(0, promptList.length - 1); + const randomPrompt = promptList[randomIndex]; + inputRef.current?.handleInputChange({ + target: { + value: randomPrompt + } + }); + }, []); + const setImageSize = useCallback(() => { let size: Record = { with: 256, @@ -497,10 +513,15 @@ const GroundImages: React.FC = forwardRef((props, ref) => { )}
= forwardRef((props, ref) => { shouldResetMessage={false} clearAll={handleClear} tools={ - - {intl.formatMessage({ id: 'playground.image.prompt' })} - + <> + + {intl.formatMessage({ id: 'playground.image.prompt' })} + + + + + } />
diff --git a/src/pages/playground/components/ground-stt.tsx b/src/pages/playground/components/ground-stt.tsx index 1d23ee60..e3dc70d9 100644 --- a/src/pages/playground/components/ground-stt.tsx +++ b/src/pages/playground/components/ground-stt.tsx @@ -270,7 +270,7 @@ const GroundLeft: React.FC = forwardRef((props, ref) => {
{audioData ? ( -
+
= forwardRef((props, ref) => { duration={audioData.duration} >
+
+ + + +
) : ( renderAniamtion() @@ -327,22 +352,6 @@ const GroundLeft: React.FC = forwardRef((props, ref) => {
-
- - - -
void; handleAbortFetch: () => void; updateLayout?: (value: { span: number; count: number }) => void; @@ -89,411 +97,425 @@ interface MessageInputProps { defaultSize?: { minRows: number; maxRows: number }; } -const MessageInput: React.FC = ({ - handleSubmit, - handleAbortFetch, - presetPrompt, - clearAll, - updateLayout, - addMessage, - onCheck, - loading, - disabled, - isEmpty, - submitIcon, - placeholer, - tools, - style, - checkLabel, - defaultSize = { minRows: 3, maxRows: 8 }, - shouldResetMessage = true, - actions = ['clear', 'layout', 'role', 'upload', 'add', 'paste'] -}) => { - const { TextArea } = Input; - const intl = useIntl(); - const [open, setOpen] = useState(false); - const [focused, setFocused] = useState(false); - const [message, setMessage] = useState({ - role: Roles.User, - content: '', - imgs: [] - }); - const imgCountRef = useRef(0); - const inputRef = useRef(null); - - const isDisabled = useMemo(() => { - return disabled - ? true - : !message.content && isEmpty && !message.imgs?.length; - }, [disabled, message, isEmpty]); - - const resetMessage = () => { - setMessage({ - role: message.role, +const MessageInput: React.FC = forwardRef( + ( + { + handleSubmit, + handleAbortFetch, + presetPrompt, + clearAll, + updateLayout, + addMessage, + onCheck, + loading, + disabled, + isEmpty, + submitIcon, + placeholer, + tools, + style, + checkLabel, + defaultSize = { minRows: 3, maxRows: 8 }, + shouldResetMessage = true, + actions = ['clear', 'layout', 'role', 'upload', 'add', 'paste'] + }, + ref + ) => { + const { TextArea } = Input; + const intl = useIntl(); + const [open, setOpen] = useState(false); + const [focused, setFocused] = useState(false); + const [message, setMessage] = useState({ + role: Roles.User, content: '', imgs: [] }); - }; + const imgCountRef = useRef(0); + const inputRef = useRef(null); - const handleInputChange = (e: any) => { - console.log('input change:', e.target?.value); - setMessage({ - ...message, - content: e.target?.value - }); - }; - const handleSendMessage = () => { - handleSubmit({ ...message }); - if (shouldResetMessage) { - resetMessage(); - } - }; - const onStop = () => { - handleAbortFetch(); - }; - const handleLayoutChange = (value: { span: number; count: number }) => { - updateLayout?.(value); - }; + const isDisabled = useMemo(() => { + return disabled + ? true + : !message.content && isEmpty && !message.imgs?.length; + }, [disabled, message, isEmpty]); - const handleToggleRole = () => { - setMessage({ - ...message, - role: message.role === Roles.User ? Roles.Assistant : Roles.User - }); - }; + const resetMessage = () => { + setMessage({ + role: message.role, + content: '', + imgs: [] + }); + }; - const handleClearAll = (e: any) => { - e.stopPropagation(); - clearAll(); - setMessage({ - role: Roles.User, - content: '', - imgs: [] - }); - }; + const handleInputChange = (e: any) => { + console.log('input change:', e.target?.value); + setMessage({ + ...message, + content: e.target?.value + }); + }; + const handleSendMessage = () => { + handleSubmit({ ...message }); + if (shouldResetMessage) { + resetMessage(); + } + }; + const onStop = () => { + handleAbortFetch(); + }; + const handleLayoutChange = (value: { span: number; count: number }) => { + updateLayout?.(value); + }; - const handleAddMessage = (e?: any) => { - e?.preventDefault(); - addMessage?.({ ...message }); - resetMessage(); - setFocused(true); - setTimeout(() => { - inputRef.current?.focus?.(); - }, 100); - }; + const handleToggleRole = () => { + setMessage({ + ...message, + role: message.role === Roles.User ? Roles.Assistant : Roles.User + }); + }; - const getPasteContent = useCallback( - async (event: any) => { - const clipboardData = event.clipboardData || window.clipboardData; - const items = clipboardData.items; - const imgPromises: Promise[] = []; + const handleClearAll = (e: any) => { + e.stopPropagation(); + clearAll(); + setMessage({ + role: Roles.User, + content: '', + imgs: [] + }); + }; - for (let i = 0; i < items.length; i++) { - let item = items[i]; + const handleAddMessage = (e?: any) => { + e?.preventDefault(); + addMessage?.({ ...message }); + resetMessage(); + setFocused(true); + setTimeout(() => { + inputRef.current?.focus?.(); + }, 100); + }; - if (item.kind === 'file' && item.type.indexOf('image') !== -1) { - const file = item.getAsFile(); - const imgPromise = new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onload = function (event) { - const base64String = event.target?.result as string; - if (base64String) { - resolve(base64String); - } else { - reject('Failed to convert image to base64'); - } - }; - reader.readAsDataURL(file); - }); - imgPromises.push(imgPromise); - } else if (item.kind === 'string') { - // string - } - } + const getPasteContent = useCallback( + async (event: any) => { + const clipboardData = event.clipboardData || window.clipboardData; + const items = clipboardData.items; + const imgPromises: Promise[] = []; - try { - const imgs = await Promise.all(imgPromises); + for (let i = 0; i < items.length; i++) { + let item = items[i]; - if (imgs.length) { - const list = _.map(imgs, (img: string) => { - imgCountRef.current += 1; - return { - uid: imgCountRef.current, - dataUrl: img - }; - }); - setMessage({ - ...message, - imgs: [...(message.imgs || []), ...list] - }); + if (item.kind === 'file' && item.type.indexOf('image') !== -1) { + const file = item.getAsFile(); + const imgPromise = new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = function (event) { + const base64String = event.target?.result as string; + if (base64String) { + resolve(base64String); + } else { + reject('Failed to convert image to base64'); + } + }; + reader.readAsDataURL(file); + }); + imgPromises.push(imgPromise); + } else if (item.kind === 'string') { + // string + } } - } catch (error) { - console.error('Error processing images:', error); - } - }, - [message] - ); - // ========== upload image ========== - const handleUpdateImgList = ( - list: { uid: number | string; dataUrl: string }[] - ) => { - setMessage({ - ...message, - imgs: [...(message.imgs || []), ...list] - }); - }; + try { + const imgs = await Promise.all(imgPromises); - const handleDeleteImg = (uid: number | string) => { - const list = _.filter( - message.imgs, - (item: MessageItem) => item.uid !== uid + if (imgs.length) { + const list = _.map(imgs, (img: string) => { + imgCountRef.current += 1; + return { + uid: imgCountRef.current, + dataUrl: img + }; + }); + setMessage({ + ...message, + imgs: [...(message.imgs || []), ...list] + }); + } + } catch (error) { + console.error('Error processing images:', error); + } + }, + [message] ); - setMessage({ - ...message, - imgs: list - }); - }; - const handleOnPaste = (e: any) => { - const text = e.clipboardData.getData('text'); - if (!text) { - e.preventDefault(); - getPasteContent(e); - } - }; + // ========== upload image ========== + const handleUpdateImgList = ( + list: { uid: number | string; dataUrl: string }[] + ) => { + setMessage({ + ...message, + imgs: [...(message.imgs || []), ...list] + }); + }; + + const handleDeleteImg = (uid: number | string) => { + const list = _.filter( + message.imgs, + (item: MessageItem) => item.uid !== uid + ); + setMessage({ + ...message, + imgs: list + }); + }; - const handleDeleteLastImage = useCallback(() => { - if (message.imgs && message.imgs?.length > 0) { - const newImgList = [...(message.imgs || [])]; - const lastImage = newImgList.pop(); - if (lastImage) { - handleDeleteImg(lastImage.uid); + const handleOnPaste = (e: any) => { + const text = e.clipboardData.getData('text'); + if (!text) { + e.preventDefault(); + getPasteContent(e); } - } - }, [message.imgs, handleDeleteImg]); + }; - const handleKeyDown = useCallback( - (event: any) => { - if ( - event.key === 'Backspace' && - message.content === '' && - message.imgs && - message.imgs?.length > 0 - ) { - // inputref blur - event.preventDefault(); - handleDeleteLastImage(); + const handleDeleteLastImage = useCallback(() => { + if (message.imgs && message.imgs?.length > 0) { + const newImgList = [...(message.imgs || [])]; + const lastImage = newImgList.pop(); + if (lastImage) { + handleDeleteImg(lastImage.uid); + } } - }, - [message, handleDeleteLastImage] - ); + }, [message.imgs, handleDeleteImg]); - const handleSelectPrompt = (list: CurrentMessage[]) => { - presetPrompt?.(list); - }; + const handleKeyDown = useCallback( + (event: any) => { + if ( + event.key === 'Backspace' && + message.content === '' && + message.imgs && + message.imgs?.length > 0 + ) { + // inputref blur + event.preventDefault(); + handleDeleteLastImage(); + } + }, + [message, handleDeleteLastImage] + ); - useHotkeys( - HotKeys.SUBMIT, - (e: any) => { - console.log('submit message', loading); - e.preventDefault(); - handleSendMessage(); - }, - { - enabled: !loading && !isDisabled, - enableOnFormTags: focused, - preventDefault: true - } - ); - useHotkeys( - HotKeys.ADD, - (e: any) => { - e.preventDefault(); - e.stopPropagation(); - handleAddMessage(); - }, - { - enabled: !loading, - enableOnFormTags: focused, - preventDefault: true - } - ); + const handleSelectPrompt = (list: CurrentMessage[]) => { + presetPrompt?.(list); + }; - useHotkeys( - HotKeys.FOCUS, - () => { - inputRef.current?.focus?.({ - cursor: 'end' - }); - }, - { preventDefault: true } - ); + useImperativeHandle(ref, () => ({ + handleInputChange: handleInputChange + })); + + useHotkeys( + HotKeys.SUBMIT, + (e: any) => { + console.log('submit message', loading); + e.preventDefault(); + handleSendMessage(); + }, + { + enabled: !loading && !isDisabled, + enableOnFormTags: focused, + preventDefault: true + } + ); + useHotkeys( + HotKeys.ADD, + (e: any) => { + e.preventDefault(); + e.stopPropagation(); + handleAddMessage(); + }, + { + enabled: !loading, + enableOnFormTags: focused, + preventDefault: true + } + ); + + useHotkeys( + HotKeys.FOCUS, + () => { + inputRef.current?.focus?.({ + cursor: 'end' + }); + }, + { preventDefault: true } + ); - return ( -
-
-
- { - <> - {actions.includes('role') && ( - <> - + + + )} + {actions.includes('upload') && message.role === Roles.User && ( + } - > - {intl.formatMessage({ id: `playground.${message.role}` })} - - - - )} - {actions.includes('upload') && message.role === Roles.User && ( - + )} + + } + {tools} + {actions.includes('check') && ( + + {checkLabel} + + )} + {actions.includes('clear') && ( + + - - )} + onClick={handleClearAll} + > + + )} - {actions.includes('layout') && updateLayout && ( - <> - - {layoutOptions.map((option) => ( - - - - ))} - - )} -
-
- {actions.includes('add') && ( - - [{KeyMap.ADD.textKeybinding}]{' '} + > + + + ))} + + )} +
+
+ {actions.includes('add') && ( + + [{KeyMap.ADD.textKeybinding}]{' '} + {intl.formatMessage({ id: 'common.button.add' })} + + } + > + - - )} - {!loading ? ( - - [{KeyMap.SUBMIT.textKeybinding}]{' '} - {intl.formatMessage({ id: 'common.button.submit' })} - - } - > + + + )} + {!loading ? ( + + [{KeyMap.SUBMIT.textKeybinding}]{' '} + {intl.formatMessage({ id: 'common.button.submit' })} + + } + > + + + ) : ( - + icon={ + + } + > + )} +
+
+ +
+ {actions.includes('paste') ? ( + ) : ( - + + )} + {!message.content && !focused && ( + )}
+ setOpen(false)} + onSelect={handleSelectPrompt} + >
- -
- {actions.includes('paste') ? ( - - ) : ( - - )} - {!message.content && !focused && ( - - )} -
- setOpen(false)} - onSelect={handleSelectPrompt} - > -
- ); -}; + ); + } +); export default MessageInput; diff --git a/src/pages/playground/config/index.ts b/src/pages/playground/config/index.ts index b7295123..990a3bcf 100644 --- a/src/pages/playground/config/index.ts +++ b/src/pages/playground/config/index.ts @@ -121,3 +121,15 @@ export const OpenAIViewCode = { logcommand: 'data[0].b64_json' } }; + +export const promptList = [ + 'a lovely cat.', + "Digital art, portrait of an anthropomorphic roaring Tiger warrior with full armor, close up in the middle of a battle, behind him there is a banner with the text 'Open Source'.", + 'An astronaut riding a green horse.', + "a female character with long, flowing hair that appears to be made of ethereal, swirling patterns resembling the Northern Lights or Aurora Borealis. The background is dominated by deep blues and purples, creating a mysterious and dramatic atmosphere. The character's face is serene, with pale skin and striking features. She wears a dark-colored outfit with subtle patterns. The overall style of the artwork is reminiscent of fantasy or supernatural genres.", + "A whimsical and creative image depicting a hybrid creature that is a mix of a waffle and a hippopotamus, basking in a river of melted butter amidst a breakfast-themed landscape. It features the distinctive, bulky body shape of a hippo. However, instead of the usual grey skin, the creature's body resembles a golden-brown, crispy waffle fresh off the griddle. The skin is textured with the familiar grid pattern of a waffle, each square filled with a glistening sheen of syrup. The environment combines the natural habitat of a hippo with elements of a breakfast table setting, a river of warm, melted butter, with oversized utensils or plates peeking out from the lush, pancake-like foliage in the background, a towering pepper mill standing in for a tree. As the sun rises in this fantastical world, it casts a warm, buttery glow over the scene. The creature, content in its butter river, lets out a yawn. Nearby, a flock of birds take flight.", + 'A cinematic shot of a baby racoon wearing an intricate italian priest robe.', + 'Create portraits of characters in the style of classical oil painting, Capturing the essence of Chinese aristocracy in the Han Dynasty period. This portrait should feature a Chinese male character dressed in exquisite and gorgeous Chinese Han style clothing, with a dignified demeanor. The background should be a simple and elegant wallpaper pattern, with the face and upper body of the character as the focus. The lighting should be soft and diffuse, highlighting the characteristics of the character and the complex details of the clothing. The color palette should be rich and warm, with red, gold, and dark green.', + 'photo of a young woman with long, wavy brown hair tied in a bun and glasses. She has a fair complexion and is wearing subtle makeup, emphasizing her eyes and lips. She is dressed in a black top. The background appears to be an urban setting with a building facade, and the sunlight casts a warm glow on her face.', + 'A portrait of women with blue eyes.' +]; diff --git a/src/pages/resources/components/add-worker.tsx b/src/pages/resources/components/add-worker.tsx index 9ee1ea18..1b01a7dc 100644 --- a/src/pages/resources/components/add-worker.tsx +++ b/src/pages/resources/components/add-worker.tsx @@ -62,6 +62,11 @@ const AddWorker: React.FC = (props) => { theme="dark" code={addWorkerGuide.win.registerWorker(origin)} > +

Docker

+

3. {intl.formatMessage({ id: 'resources.worker.add.step3' })}

diff --git a/src/pages/resources/config/index.ts b/src/pages/resources/config/index.ts index f2b09829..844afa62 100644 --- a/src/pages/resources/config/index.ts +++ b/src/pages/resources/config/index.ts @@ -28,5 +28,12 @@ export const addWorkerGuide = { registerWorker(server: string) { return `Invoke-Expression "& { $((Invoke-WebRequest -Uri "https://get.gpustack.ai" -UseBasicParsing).Content) } --server-url ${server} --token mytoken"`; } + }, + docker: { + getToken: + 'Get-Content -Path (Join-Path -Path $env:APPDATA -ChildPath "gpustack\\token") -Raw', + registerWorker(server: string) { + return `docker run -d --gpus all --ipc=host --network=host gpustack/gpustack --server-url ${server} --token mytoken`; + } } };