From 580546958125eb523e1b07eb5893df2064b23720 Mon Sep 17 00:00:00 2001 From: Pabloader Date: Sun, 3 Nov 2024 13:06:06 +0000 Subject: [PATCH] AI story: load model template from HF & count tokens --- bun.lockb | Bin 30275 -> 31377 bytes package.json | 1 + src/games/ai/components/ace.tsx | 2 + .../ai/components/header/header.module.css | 5 + src/games/ai/components/header/header.tsx | 29 +-- src/games/ai/contexts/llm.tsx | 192 ++++++++++++++---- src/games/ai/huggingface.ts | 68 +++++++ 7 files changed, 235 insertions(+), 62 deletions(-) create mode 100644 src/games/ai/huggingface.ts diff --git a/bun.lockb b/bun.lockb index 6ebbd7a561e199a2402f8320b2badd58edbeb577..597e5c52cb15522c32ca7bfe92a904b08f5b46ee 100755 GIT binary patch delta 5132 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 fbUf#D4qET(Mndt^V+5&#=#T z_CEVO_BrS7b2cqsiL-aa4oh6%D@kuP4gd1o_RpG6G+uu5r+;r*eX`>Awbv7t8mivg ze(Ew>YDlXqKCiq=l{*E9+d#r4@D6l~t=G=>RHxB&qo|4{iYlfWIsxX(;d< z&=0somLvsu61+dK2fQ!v5cojg9*=y`V7K0bLGFHA!TU5pVGau1k;zMv!hq30?qCY! zjKhXVk{-Aa$P?;A2Q0q{59v{MK82WA1Io6`;CGpMg4VDJ?oj#7`8UEHL&A$Bp6T*%9*4f###K^{+W z-gdEyT*!}7o3~xQCsVJtO;{;TXBTzkLheUx$jhilXIJ)P_s3%hFS@JC5Pv3@Vpk^M zWXywX5Z(38P4m)E^bqtpIwY27xHD)=4Y3W>!@9ClOO4*S8r2tU^DkVm`9WkD^%-m zlW!^1?r&3Ku<+^X$jPW%=tJ#3Hsy5)6Cf1yrY=K12jNhg@S>ifc6pjFnF4Iedh8>c zshT9e?@R3vdSjEUs&J)}p=5!Z3QkfxY4xMpK%3WP>}xSC3(WCK#7u%A2Qkg3I14>S{l#4@RBeO0?UK2>BU>kPD6>L{l;cW3l z1+T2~b8wmNX%ESeKMx{Ph)s?kMzw&o!>Aqb>tWOzViO9*h1z9jFx7_Ilw&xBNoeLp zFl?M3&YS}roXvlvZ=r?hG(TG1H8T67;~VLsmqB)hkSWY2|0INJ0e=ahc0gn(^#W#u zlF49`8$+oU@Xt_c2V{j&FJMg=nT$61R2bC)z6qmtfZag7#_VLQ2)i;hJq>Zd_`6XP zqoB#*(QsMn*T!F#6bpiTk;Z`F=cKV9PK+!!F@y9ZvR*uh5r;!f{|mCd87}LyaAPqy zvZyWHh{G(Ud3Z+F#c5PA!y|thvL5zPO^h(paPmb9+U)_S}i{JY#qtwWm+jQkSK+ z-u=yL&mgyqT5Q`o4(B-ne6Dz0M(}LfImbS+|B*YP7uD;qJJ3FFb~?=S5C#w@Zq2g1 z+004OOV85}=8mE91({9kHQ2M@Q6f1(&x7WGxCv`>ciA9*a9Kc!Al!daGRO)_0rAkd z?f9+C&r@j_h`mr5h`khhGX5CyL3jqJuS#~#xjai7-7Sa?WY3)i;u+(eC`FQaZrDV= zvDh85r^Pj^-UnlVv7k{PcC+I^aUi~rj36`UAX|YnssMJzjGTcYk2?vJ2f~v}Rp;i> zpeX8|yDN=5;?75dxbu;q5g@#8r5F$o%9kRSc|g9566n|q(M`N2yf!>EY*H^CUN1I^ z*NzQiZ98ZpXab1W<2le|5F5;E!zQw+(?C2D6W8+|@P2Tasfb+wQa^7VuG9R&(H)Bm zbs`Ll-@GlL^46N+@4O+4Buk2gw`mLQn`acS(YweGQ1`r)2rZy#FKmu&&re)0i}EZ> zk_G#Dh<@cXij$O!{2WavGK$Nz66Gbd1$hr`hvW&J2rV+1mA~O$Sd@POdP+i1sgl%5 z`XXb57SYsfXz7jk>Qn>jQ&5i+<^*ce(Lc-{M4vvM{S*o;Hi|hEUu=x{jusfJl`4vjY2Q(g z9<`|M&Z3gSPsg8r4r67yZ86ai^!zx=TRAE>&v$4h>aFg%ETrog{}cKKc_;an8zZ%V zE7y0|ho<23r=aUumyHTFmKfw63hgej%B>2W2e)6LTO~6hwQ%nDsr6UxUEA4*R>@c= z%+2mgvr4UzTKx8wzrUQb`t7v?3hVsn$EAiyEs$$G-cbL$%xUI<4}EJPyP?+2Q;++b_aW0_+%Qq${JEiaa`4ktBbqqiYpWa$Yd~3ot#H!WTrzH-jmAK~(q`@Yjg+ jnk)L=-@9zml{Yf^0zf*{Ky?cacUUUN=sK*m6#@SS%pqJM diff --git a/package.json b/package.json index 13645a1..4960a8d 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "bake": "bun build/build.ts" }, "dependencies": { + "@huggingface/hub": "0.19.0", "@huggingface/jinja": "0.3.1", "@inquirer/select": "2.3.10", "ace-builds": "1.36.3", diff --git a/src/games/ai/components/ace.tsx b/src/games/ai/components/ace.tsx index cd82bd4..e5af98f 100644 --- a/src/games/ai/components/ace.tsx +++ b/src/games/ai/components/ace.tsx @@ -26,6 +26,8 @@ export const Ace = ({ value, onInput }: IAceProps) => { displayIndentGuides: false, fontSize: 16, maxLines: Infinity, + tabSize: 2, + useSoftTabs: true, wrap: "free", }); return e; diff --git a/src/games/ai/components/header/header.module.css b/src/games/ai/components/header/header.module.css index ee7f15e..4e6b9d6 100644 --- a/src/games/ai/components/header/header.module.css +++ b/src/games/ai/components/header/header.module.css @@ -23,6 +23,11 @@ } } + .info { + margin: 0 8px; + line-height: 36px; + } + .buttons { display: flex; flex-direction: row; diff --git a/src/games/ai/components/header/header.tsx b/src/games/ai/components/header/header.tsx index d0c4ab1..8031bc8 100644 --- a/src/games/ai/components/header/header.tsx +++ b/src/games/ai/components/header/header.tsx @@ -11,38 +11,25 @@ import styles from './header.module.css'; import { Ace } from "../ace"; export const Header = () => { - const { getContextLength } = useContext(LLMContext); + const { modelName, modelTemplate, contextLength, promptTokens, blockConnection } = useContext(LLMContext); const { messages, connectionUrl, systemPrompt, lore, userPrompt, bannedWords, instruct, setConnectionUrl, setSystemPrompt, setLore, setUserPrompt, addSwipe, setBannedWords, setInstruct } = useContext(StateContext); - const [urlValid, setUrlValid] = useState(false); - const [urlEditing, setUrlEditing] = useState(false); const loreOpen = useBool(); const promptsOpen = useBool(); const assistantOpen = useBool(); const bannedWordsInput = useMemo(() => bannedWords.join('\n'), [bannedWords]); - - const handleFocusUrl = useCallback(() => setUrlEditing(true), []); + const urlValid = useMemo(() => contextLength > 0, [contextLength]); const handleBlurUrl = useCallback(() => { const regex = /^(?:http(s?):\/\/)?(.*?)\/?$/i const normalizedConnectionUrl = connectionUrl.replace(regex, 'http$1://$2'); - console.log({ connectionUrl, normalizedConnectionUrl }) setConnectionUrl(normalizedConnectionUrl); - setUrlEditing(false); - setUrlValid(false); - }, [connectionUrl, setConnectionUrl]); - - useEffect(() => { - if (!urlEditing) { - getContextLength().then(length => { - setUrlValid(length > 0); - }); - } - }, [connectionUrl, urlEditing]); + blockConnection.setFalse(); + }, [connectionUrl, setConnectionUrl, blockConnection]); const handleAssistantAddSwipe = useCallback((answer: string) => { const index = messages.findLastIndex(m => m.role === 'assistant'); @@ -69,17 +56,21 @@ export const Header = () => {
+
+ {promptTokens} / {contextLength} +