+ Jan is a ChatGPT-alternative that runs 100% offline on your device. Our goal is to make it easy for anyone to download and run LLMs and use AI with full control and privacy. +
+Features:
+Latest stable release of Jan AI
+| (null)
const configuredModels = useAtomValue(configuredModelsAtom)
- const featuredModel = configuredModels.filter(
+ const featuredModels = configuredModels.filter(
(x) =>
manualRecommendationModel.includes(x.id) &&
x.metadata?.tags?.includes('Featured') &&
@@ -105,6 +102,16 @@ const ModelDropdown = ({
)
const { updateThreadMetadata } = useCreateNewThread()
+ const engineList = useMemo(
+ () =>
+ Object.entries(engines ?? {}).flatMap((e) => ({
+ name: e[0],
+ type: e[1][0]?.type === 'remote' ? 'remote' : 'local',
+ engine: e[1][0],
+ })),
+ [engines]
+ )
+
useClickOutside(() => handleChangeStateOpen(false), null, [
dropdownOptions,
toggle,
@@ -122,13 +129,6 @@ const ModelDropdown = ({
[setModelDropdownState]
)
- const isModelSupportRagAndTools = useCallback((model: Model) => {
- return (
- model?.engine === InferenceEngine.openai ||
- isLocalEngine(model?.engine as InferenceEngine)
- )
- }, [])
-
const filteredDownloadedModels = useMemo(
() =>
configuredModels
@@ -142,11 +142,12 @@ const ModelDropdown = ({
)
.filter((e) => {
if (searchFilter === 'local') {
- return isLocalEngine(e.engine)
- }
- if (searchFilter === 'remote') {
- return !isLocalEngine(e.engine)
+ return (
+ engineList.find((t) => t.engine?.engine === e.engine)?.type ===
+ 'local'
+ )
}
+ return true
})
.sort((a, b) => a.name.localeCompare(b.name))
.sort((a, b) => {
@@ -164,7 +165,7 @@ const ModelDropdown = ({
return 0
}
}),
- [configuredModels, searchText, searchFilter, downloadedModels]
+ [configuredModels, searchText, searchFilter, downloadedModels, engineList]
)
useEffect(() => {
@@ -179,6 +180,15 @@ const ModelDropdown = ({
}
}, [open])
+ useEffect(() => {
+ setShowEngineListModel((prev) => [
+ ...prev,
+ ...engineList
+ .filter((x) => (x.engine?.api_key?.length ?? 0) > 0)
+ .map((e) => e.name),
+ ])
+ }, [setShowEngineListModel, engineList])
+
useEffect(() => {
if (!activeThread) return
const modelId = activeAssistant?.model?.id
@@ -193,6 +203,14 @@ const ModelDropdown = ({
activeAssistant?.model?.id,
])
+ const isLocalEngine = useCallback(
+ (engine?: string) => {
+ if (!engine) return false
+ return engineList.some((t) => t.name === engine && t.type === 'local')
+ },
+ [engineList]
+ )
+
const onClickModelItem = useCallback(
async (modelId: string) => {
if (!activeAssistant) return
@@ -210,7 +228,7 @@ const ModelDropdown = ({
tools: [
{
type: 'retrieval',
- enabled: isModelSupportRagAndTools(model as Model),
+ enabled: model?.engine === InferenceEngine.cortex,
settings: {
...(activeAssistant.tools &&
activeAssistant.tools[0]?.settings),
@@ -225,13 +243,15 @@ const ModelDropdown = ({
8192,
model?.settings.ctx_len ?? 8192
)
+
const overriddenParameters = {
- ctx_len: !isLocalEngine(model?.engine)
- ? undefined
- : defaultContextLength,
- max_tokens: !isLocalEngine(model?.engine)
- ? (model?.parameters.max_tokens ?? 8192)
- : defaultContextLength,
+ ctx_len: model?.settings.ctx_len ? defaultContextLength : undefined,
+ max_tokens: defaultContextLength
+ ? Math.min(
+ model?.parameters.token_limit ?? 8192,
+ defaultContextLength
+ )
+ : model?.parameters.token_limit,
}
const modelParams = {
@@ -258,95 +278,17 @@ const ModelDropdown = ({
setSelectedModel,
activeThread,
updateThreadMetadata,
- isModelSupportRagAndTools,
setThreadModelParams,
updateModelParameter,
]
)
- const [extensionHasSettings, setExtensionHasSettings] = useState<
- { name?: string; setting: string; apiKey: string; provider: string }[]
- >([])
-
- const inActiveEngineProvider = useAtomValue(inActiveEngineProviderAtom)
-
- useEffect(() => {
- const getAllSettings = async () => {
- const extensionsMenu: {
- name?: string
- setting: string
- apiKey: string
- provider: string
- }[] = []
- const extensions = extensionManager.getAll()
-
- for (const extension of extensions) {
- if (typeof extension.getSettings === 'function') {
- const settings = await extension.getSettings()
- if (
- (settings && settings.length > 0) ||
- (await extension.installationState()) !== 'NotRequired'
- ) {
- extensionsMenu.push({
- name: extension.productName,
- setting: extension.name,
- apiKey:
- 'apiKey' in extension && typeof extension.apiKey === 'string'
- ? extension.apiKey
- : '',
- provider:
- 'provider' in extension &&
- typeof extension.provider === 'string'
- ? extension.provider
- : '',
- })
- }
- }
- }
- setExtensionHasSettings(extensionsMenu)
- }
- getAllSettings()
- }, [])
-
- const findByEngine = filteredDownloadedModels
- .map((x) => {
- // Legacy engine support - they will be grouped under Cortex LlamaCPP
- if (x.engine === InferenceEngine.nitro)
- return InferenceEngine.cortex_llamacpp
- return x.engine
- })
- .filter((x) => !inActiveEngineProvider.includes(x))
-
- const groupByEngine = findByEngine
- .filter(function (item, index) {
- if (findByEngine.indexOf(item) === index) return item
- })
- .sort((a, b) => {
- if (priorityEngine.includes(a) && priorityEngine.includes(b)) {
- return priorityEngine.indexOf(a) - priorityEngine.indexOf(b)
- } else if (priorityEngine.includes(a)) {
- return -1
- } else if (priorityEngine.includes(b)) {
- return 1
- } else {
- return 0 // Leave the rest in their original order
- }
- })
-
- const getEngineStatusReady: InferenceEngine[] = extensionHasSettings
- ?.filter((e) => e.apiKey.length > 0)
- .map((x) => x.provider as InferenceEngine)
-
- useEffect(() => {
- setShowEngineListModel((prev) => [
- ...prev,
- ...(getEngineStatusReady as InferenceEngine[]),
- ])
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [setShowEngineListModel, extensionHasSettings])
-
- const isDownloadALocalModel = downloadedModels.some((x) =>
- isLocalEngine(x.engine)
+ const isDownloadALocalModel = useMemo(
+ () =>
+ downloadedModels.some((x) =>
+ engineList.some((t) => t.name === x.engine && t.type === 'local')
+ ),
+ [downloadedModels, engineList]
)
if (strictedThread && !activeThread) {
@@ -434,85 +376,193 @@ const ModelDropdown = ({
/>
-
-
-
- {engineLogo && (
-
- - {getTitleByEngine(engine)} --
- {!isLocalEngine(engine) && (
- |