diff --git a/app/components/chat/Chat.client.tsx b/app/components/chat/Chat.client.tsx index b7834824..f818db4c 100644 --- a/app/components/chat/Chat.client.tsx +++ b/app/components/chat/Chat.client.tsx @@ -118,7 +118,7 @@ export const ChatImpl = memo( const [searchParams, setSearchParams] = useSearchParams(); const files = useStore(workbenchStore.files); const actionAlert = useStore(workbenchStore.alert); - const { activeProviders, promptId } = useSettings(); + const { activeProviders, promptId, contextOptimizationEnabled } = useSettings(); const [model, setModel] = useState(() => { const savedModel = Cookies.get('selectedModel'); @@ -141,6 +141,7 @@ export const ChatImpl = memo( apiKeys, files, promptId, + contextOptimization: contextOptimizationEnabled, }, sendExtraMessageFields: true, onError: (error) => { diff --git a/app/components/settings/features/FeaturesTab.tsx b/app/components/settings/features/FeaturesTab.tsx index 0af3d401..abba6714 100644 --- a/app/components/settings/features/FeaturesTab.tsx +++ b/app/components/settings/features/FeaturesTab.tsx @@ -14,6 +14,8 @@ export default function FeaturesTab() { enableLatestBranch, promptId, setPromptId, + enableContextOptimization, + contextOptimizationEnabled, } = useSettings(); const handleToggle = (enabled: boolean) => { @@ -39,6 +41,19 @@ export default function FeaturesTab() { +
+
+ Use Context Optimization +

+ redact file contents form chat and puts the latest file contents on the system prompt +

+
+ +
diff --git a/app/lib/.server/llm/stream-text.ts b/app/lib/.server/llm/stream-text.ts index a7179228..fee99e21 100644 --- a/app/lib/.server/llm/stream-text.ts +++ b/app/lib/.server/llm/stream-text.ts @@ -150,8 +150,9 @@ export async function streamText(props: { files?: FileMap; providerSettings?: Record; promptId?: string; + contextOptimization?: boolean; }) { - const { messages, env: serverEnv, options, apiKeys, files, providerSettings, promptId } = props; + const { messages, env: serverEnv, options, apiKeys, files, providerSettings, promptId, contextOptimization } = props; // console.log({serverEnv}); @@ -170,9 +171,11 @@ export async function streamText(props: { return { ...message, content }; } else if (message.role == 'assistant') { - const content = message.content; + let content = message.content; - // content = simplifyBoltActions(content); + if (contextOptimization) { + content = simplifyBoltActions(content); + } return { ...message, content }; } @@ -192,11 +195,9 @@ export async function streamText(props: { allowedHtmlElements: allowedHTMLElements, modificationTagName: MODIFICATIONS_TAG_NAME, }) ?? getSystemPrompt(); - let codeContext = ''; - if (files) { - codeContext = createFilesContext(files); - codeContext = ''; + if (files && contextOptimization) { + const codeContext = createFilesContext(files); systemPrompt = `${systemPrompt}\n\n ${codeContext}`; } diff --git a/app/lib/hooks/useSettings.tsx b/app/lib/hooks/useSettings.tsx index 28548329..4596e26c 100644 --- a/app/lib/hooks/useSettings.tsx +++ b/app/lib/hooks/useSettings.tsx @@ -7,6 +7,7 @@ import { promptStore, providersStore, latestBranchStore, + enableContextOptimizationStore, } from '~/lib/stores/settings'; import { useCallback, useEffect, useState } from 'react'; import Cookies from 'js-cookie'; @@ -31,6 +32,7 @@ export function useSettings() { const isLocalModel = useStore(isLocalModelsEnabled); const isLatestBranch = useStore(latestBranchStore); const [activeProviders, setActiveProviders] = useState([]); + const contextOptimizationEnabled = useStore(enableContextOptimizationStore); // Function to check if we're on stable version const checkIsStableVersion = async () => { @@ -118,6 +120,12 @@ export function useSettings() { } else { latestBranchStore.set(savedLatestBranch === 'true'); } + + const savedContextOptimizationEnabled = Cookies.get('contextOptimizationEnabled'); + + if (savedContextOptimizationEnabled) { + enableContextOptimizationStore.set(savedContextOptimizationEnabled === 'true'); + } }, []); // writing values to cookies on change @@ -179,6 +187,12 @@ export function useSettings() { Cookies.set('isLatestBranch', String(enabled)); }, []); + const enableContextOptimization = useCallback((enabled: boolean) => { + enableContextOptimizationStore.set(enabled); + logStore.logSystem(`Context optimization ${enabled ? 'enabled' : 'disabled'}`); + Cookies.set('contextOptimizationEnabled', String(enabled)); + }, []); + return { providers, activeProviders, @@ -193,5 +207,7 @@ export function useSettings() { setPromptId, isLatestBranch, enableLatestBranch, + contextOptimizationEnabled, + enableContextOptimization, }; } diff --git a/app/lib/stores/settings.ts b/app/lib/stores/settings.ts index cbaf30e9..c53a708a 100644 --- a/app/lib/stores/settings.ts +++ b/app/lib/stores/settings.ts @@ -39,6 +39,9 @@ PROVIDER_LIST.forEach((provider) => { }, }; }); + +//TODO: need to create one single map for all these flags + export const providersStore = map(initialProviderSettings); export const isDebugMode = atom(false); @@ -50,3 +53,5 @@ export const isLocalModelsEnabled = atom(true); export const promptStore = atom('default'); export const latestBranchStore = atom(false); + +export const enableContextOptimizationStore = atom(false); diff --git a/app/routes/api.chat.ts b/app/routes/api.chat.ts index 16ce9134..b20331f5 100644 --- a/app/routes/api.chat.ts +++ b/app/routes/api.chat.ts @@ -29,10 +29,11 @@ function parseCookies(cookieHeader: string): Record { } async function chatAction({ context, request }: ActionFunctionArgs) { - const { messages, files, promptId } = await request.json<{ + const { messages, files, promptId, contextOptimization } = await request.json<{ messages: Messages; files: any; promptId?: string; + contextOptimization: boolean; }>(); const cookieHeader = request.headers.get('Cookie'); @@ -100,6 +101,7 @@ async function chatAction({ context, request }: ActionFunctionArgs) { files, providerSettings, promptId, + contextOptimization, }); return stream.switchSource(result.toDataStream()); @@ -114,6 +116,7 @@ async function chatAction({ context, request }: ActionFunctionArgs) { files, providerSettings, promptId, + contextOptimization, }); stream.switchSource(result.toDataStream());