From 763085726b9769579b7e72a3319f6f612df08a9c Mon Sep 17 00:00:00 2001 From: Pabloader Date: Mon, 4 Nov 2024 13:25:49 +0000 Subject: [PATCH] AI story: remove exceptions from templates, fix minichat, fix autotextarea, add gemma --- src/games/ai/components/autoTextarea.tsx | 4 ++-- src/games/ai/components/minichat/minichat.tsx | 6 +++--- src/games/ai/contexts/state.tsx | 4 +++- src/games/ai/huggingface.ts | 1 + 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/games/ai/components/autoTextarea.tsx b/src/games/ai/components/autoTextarea.tsx index feccd64..65a26bd 100644 --- a/src/games/ai/components/autoTextarea.tsx +++ b/src/games/ai/components/autoTextarea.tsx @@ -6,10 +6,10 @@ import { useIsVisible } from '@common/hooks/useIsVisible'; export const AutoTextarea = (props: JSX.HTMLAttributes) => { const { value } = props; const ref = useRef(null); - const isVisible = useIsVisible(ref, true); + const isVisible = useIsVisible(ref); useEffect(() => { - if (ref.current) { + if (ref.current && isVisible) { const area = ref.current; area.style.height = '0'; // reset diff --git a/src/games/ai/components/minichat/minichat.tsx b/src/games/ai/components/minichat/minichat.tsx index 68f7e0b..3ba990d 100644 --- a/src/games/ai/components/minichat/minichat.tsx +++ b/src/games/ai/components/minichat/minichat.tsx @@ -58,11 +58,11 @@ export const MiniChat = ({ history = [], buttons = {}, open, onClose }: IProps) for await (const chunk of generate(prompt)) { text += chunk; - setMessages(MessageTools.updateSwipe(newMessages, messageId, text)); + setMessages(MessageTools.updateSwipe(newMessages, messageId, { content: text.trim() })); } setMessages([ - ...MessageTools.updateSwipe(newMessages, messageId, MessageTools.trimSentence(text)), + ...MessageTools.updateSwipe(newMessages, messageId, { content: MessageTools.trimSentence(text) }), MessageTools.create('', 'user', true), ]); MessageTools.playReady(); @@ -78,7 +78,7 @@ export const MiniChat = ({ history = [], buttons = {}, open, onClose }: IProps) const handleChange = useCallback((i: number, e: InputEvent) => { if (e.target instanceof HTMLTextAreaElement) { - setMessages(MessageTools.updateSwipe(messages, i, e.target.value)); + setMessages(MessageTools.updateSwipe(messages, i, { content: e.target.value })); } }, [messages]); diff --git a/src/games/ai/contexts/state.tsx b/src/games/ai/contexts/state.tsx index 70dadae..ac80911 100644 --- a/src/games/ai/contexts/state.tsx +++ b/src/games/ai/contexts/state.tsx @@ -47,6 +47,8 @@ export enum Instruct { MISTRAL = `{%- if messages[0]['role'] == 'system' %}{%- set system_message = messages[0]['content'] %}{%- set loop_messages = messages[1:] %}{%- else %}{%- set loop_messages = messages %}{%- endif %}{%- for message in loop_messages %}{%- if message['role'] == 'user' %}{%- if loop.first and system_message is defined %}{{- ' [INST] ' + system_message + '\\n\\n' + message['content'] + ' [/INST]' }}{%- else %}{{- ' [INST] ' + message['content'] + ' [/INST]' }}{%- endif %}{%- elif message['role'] == 'assistant' %}{{- ' ' + message['content'] + ''}}{%- endif %}{%- endfor %}`, + GEMMA = `{% for message in messages %}{% if (message['role'] == 'assistant') %}{% set role = 'model' %}{% else %}{% set role = message['role'] %}{% endif %}{{ '' + role + '\n' + message['content'] | trim + '\n' }}{% endfor %}{% if add_generation_prompt %}{{'model\n'}}{% endif %}`, + ALPACA = `{% for message in messages %}{% if message['role'] == 'system' and message['content'] %}{{ message['content'] + '\\n\\n'}}{% elif message['role'] == 'user' %}{{'### Instruction:\\n\\n' + message['content'] + '\\n\\n'}}{% elif message['role'] == 'assistant' %}{{'### Response:\\n\\n' + message['content'] + '\\n\\n'}}{% endif %}{% endfor %}{% if add_generation_prompt %}{{ '### Response:\\n\\n' }}{% endif %}`, }; @@ -66,7 +68,7 @@ export const loadContext = (): IContext => { lore: '', userPrompt: `{% if prompt %}{% if isStart %}Start{% else %}Continue{% endif %} this story, taking information into account: {{ prompt | trim }} Remember that this story should be infinite and go forever. Avoid cliffhangers and pauses, be creative.{% elif isStart %}Write a novel using information above as a reference. Make sure to follow the lore exactly and avoid cliffhangers.{% else %}Continue the story forward. Avoid cliffhangers and pauses.{% endif %}`, - summarizePrompt: 'Make the following text shorter, keeping all important details:\n\n{{ message }}\n\nYour answer should only contain the shortened text.', + summarizePrompt: 'Shrink following text down to one paragraph, keeping all important details, your answer should contain only the shortened text:\n\n{{ message }}', bannedWords: [], messages: [], triggerNext: false, diff --git a/src/games/ai/huggingface.ts b/src/games/ai/huggingface.ts index d99cb1a..7f4ccf3 100644 --- a/src/games/ai/huggingface.ts +++ b/src/games/ai/huggingface.ts @@ -269,6 +269,7 @@ export namespace Huggingface { try { let template = compiledTemplates.get(templateString); if (!template) { + templateString = templateString.replace(/raise_exception\(('[^')]+'|"[^")]+")\)/g, `''`) template = new Template(templateString); compiledTemplates.set(templateString, template); }