diff --git a/core/src/browser/extensions/engines/OAIEngine.ts b/core/src/browser/extensions/engines/OAIEngine.ts index 12bf81d36..19a58a756 100644 --- a/core/src/browser/extensions/engines/OAIEngine.ts +++ b/core/src/browser/extensions/engines/OAIEngine.ts @@ -102,12 +102,20 @@ export abstract class OAIEngine extends AIEngine { events.emit(MessageEvent.OnMessageUpdate, message) }, error: async (err: any) => { + console.error(`Inference error: ${JSON.stringify(err, null, 2)}`) if (this.isCancelled || message.content.length) { message.status = MessageStatus.Stopped events.emit(MessageEvent.OnMessageUpdate, message) return } message.status = MessageStatus.Error + message.content[0] = { + type: ContentType.Text, + text: { + value: err.message, + annotations: [], + }, + } message.error_code = err.code events.emit(MessageEvent.OnMessageUpdate, message) }, diff --git a/core/src/types/message/messageEntity.ts b/core/src/types/message/messageEntity.ts index b7365c6cd..5444558aa 100644 --- a/core/src/types/message/messageEntity.ts +++ b/core/src/types/message/messageEntity.ts @@ -83,6 +83,8 @@ export enum MessageStatus { export enum ErrorCode { InvalidApiKey = 'invalid_api_key', + InsufficientQuota = 'insufficient_quota', + Unknown = 'unknown', } diff --git a/extensions/assistant-extension/src/tools/retrieval.ts b/extensions/assistant-extension/src/tools/retrieval.ts index 09ab6c2e2..e58305c60 100644 --- a/extensions/assistant-extension/src/tools/retrieval.ts +++ b/extensions/assistant-extension/src/tools/retrieval.ts @@ -18,7 +18,7 @@ export class RetrievalTool extends InferenceTool { tool?: AssistantTool ): Promise { if (!data.model || !data.messages) { - return Promise.resolve(this.normalize(data)) + return Promise.resolve(data) } const latestMessage = data.messages[data.messages.length - 1] @@ -38,6 +38,8 @@ export class RetrievalTool extends InferenceTool { docFile, data.model?.engine ) + } else { + return Promise.resolve(data) } } else if ( // Check whether we need to ingest document or not @@ -48,7 +50,7 @@ export class RetrievalTool extends InferenceTool { ) { // No document ingested, reroute the result to inference engine - return Promise.resolve(this.normalize(data)) + return Promise.resolve(data) } // 2. Load agent on thread changed if (this.retrievalThreadId !== data.threadId) { diff --git a/extensions/model-extension/package.json b/extensions/model-extension/package.json index 5b4f3002b..5f53ff513 100644 --- a/extensions/model-extension/package.json +++ b/extensions/model-extension/package.json @@ -1,6 +1,6 @@ { "name": "@janhq/model-extension", - "version": "1.0.28", + "version": "1.0.30", "description": "Model Management Extension provides model exploration and seamless downloads", "main": "dist/index.js", "module": "dist/module.js", diff --git a/models/mistral-7b/cover.png b/models/mistral-ins-7b-q4/cover.png similarity index 100% rename from models/mistral-7b/cover.png rename to models/mistral-ins-7b-q4/cover.png diff --git a/models/mistral-7b/model.json b/models/mistral-ins-7b-q4/model.json similarity index 93% rename from models/mistral-7b/model.json rename to models/mistral-ins-7b-q4/model.json index 252be947b..3f9cab127 100644 --- a/models/mistral-7b/model.json +++ b/models/mistral-ins-7b-q4/model.json @@ -5,7 +5,7 @@ "url": "https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-GGUF/resolve/main/mistral-7b-instruct-v0.2.Q4_K_M.gguf" } ], - "id": "mistral-7b", + "id": "mistral-ins-7b-q4", "object": "model", "name": "Mistral Instruct 7B Q4", "version": "1.0", @@ -29,7 +29,7 @@ "author": "MistralAI", "tags": ["Featured", "7B", "Foundational Model"], "size": 4370000000, - "cover": "https://raw.githubusercontent.com/janhq/jan/dev/models/mistral-7b/cover.png" + "cover": "https://raw.githubusercontent.com/janhq/jan/dev/models/mistral-ins-7b-q4/cover.png" }, "engine": "nitro" } diff --git a/models/stealth-7b/model.json b/models/stealth-v1.2-7b/model.json similarity index 97% rename from models/stealth-7b/model.json rename to models/stealth-v1.2-7b/model.json index 6448f64e9..235cbbb88 100644 --- a/models/stealth-7b/model.json +++ b/models/stealth-v1.2-7b/model.json @@ -5,7 +5,7 @@ "url": "https://huggingface.co/janhq/stealth-v1.3-GGUF/resolve/main/stealth-v1.3.Q4_K_M.gguf" } ], - "id": "stealth-7b", + "id": "stealth-v1.2-7b", "object": "model", "name": "Stealth 7B Q4", "version": "1.0", diff --git a/models/tinyllama-1.1b/model.json b/models/tinyllama-1.1b/model.json new file mode 100644 index 000000000..6a9187fa5 --- /dev/null +++ b/models/tinyllama-1.1b/model.json @@ -0,0 +1,34 @@ +{ + "sources": [ + { + "filename": "tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf", + "url": "https://huggingface.co/TheBloke/TinyLlama-1.1B-Chat-v1.0-GGUF/resolve/main/tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf" + } + ], + "id": "tinyllama-1.1b", + "object": "model", + "name": "TinyLlama Chat 1.1B Q4", + "version": "1.0", + "description": "TinyLlama is a tiny model with only 1.1B. It's a good model for less powerful computers.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "<|system|>\n{system_message}<|user|>\n{prompt}<|assistant|>", + "llama_model_path": "tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 2048, + "stop": [], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "TinyLlama", + "tags": ["Tiny", "Foundation Model"], + "size": 669000000 + }, + "engine": "nitro" +} diff --git a/models/trinity-7b/cover.png b/models/trinity-v1.2-7b/cover.png similarity index 100% rename from models/trinity-7b/cover.png rename to models/trinity-v1.2-7b/cover.png diff --git a/models/trinity-7b/model.json b/models/trinity-v1.2-7b/model.json similarity index 94% rename from models/trinity-7b/model.json rename to models/trinity-v1.2-7b/model.json index bbd654582..947629642 100644 --- a/models/trinity-7b/model.json +++ b/models/trinity-v1.2-7b/model.json @@ -5,7 +5,7 @@ "url": "https://huggingface.co/janhq/trinity-v1.2-GGUF/resolve/main/trinity-v1.2.Q4_K_M.gguf" } ], - "id": "trinity-7b", + "id": "trinity-v1.2-7b", "object": "model", "name": "Trinity-v1.2 7B Q4", "version": "1.0", @@ -28,7 +28,7 @@ "author": "Jan", "tags": ["7B", "Merged", "Featured"], "size": 4370000000, - "cover": "https://raw.githubusercontent.com/janhq/jan/dev/models/trinity-7b/cover.png" + "cover": "https://raw.githubusercontent.com/janhq/jan/dev/models/trinity-v1.2-7b/cover.png" }, "engine": "nitro" } diff --git a/web/containers/AutoLink/index.tsx b/web/containers/AutoLink/index.tsx new file mode 100644 index 000000000..3bfe47aa4 --- /dev/null +++ b/web/containers/AutoLink/index.tsx @@ -0,0 +1,34 @@ +import React from 'react' + +type Props = { + text: string +} + +const AutoLink: React.FC = ({ text }) => { + const delimiter = + /((?:https?:\/\/)?(?:(?:[a-z0-9]?(?:[a-z0-9-]{1,61}[a-z0-9])?\.[^.|\s])+[a-z.]*[a-z]+|(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})(?::\d{1,5})*[a-z0-9.,_/~#&=;%+?\-\\(\\)]*)/gi + + return ( + <> + {text.split(delimiter).map((word) => { + const match = word.match(delimiter) + if (match) { + const url = match[0] + return ( + + {url} + + ) + } + return word + })} + + ) +} + +export default React.memo(AutoLink) diff --git a/web/hooks/useSendChatMessage.ts b/web/hooks/useSendChatMessage.ts index 21c0508ed..6fd93f058 100644 --- a/web/hooks/useSendChatMessage.ts +++ b/web/hooks/useSendChatMessage.ts @@ -234,6 +234,10 @@ export default function useSendChatMessage() { selectedModelRef.current?.id ?? activeThreadRef.current.assistants[0].model.id + if (base64Blob) { + setFileUpload([]) + } + if (modelRef.current?.id !== modelId) { setQueuedMessage(true) const error = await startModel(modelId).catch((error: Error) => error) @@ -261,10 +265,6 @@ export default function useSendChatMessage() { // Reset states setReloadModel(false) setEngineParamsUpdate(false) - - if (base64Blob) { - setFileUpload([]) - } } return { diff --git a/web/screens/Chat/ErrorMessage/index.tsx b/web/screens/Chat/ErrorMessage/index.tsx index f312f9eb0..1aea38acd 100644 --- a/web/screens/Chat/ErrorMessage/index.tsx +++ b/web/screens/Chat/ErrorMessage/index.tsx @@ -3,6 +3,7 @@ import { Button } from '@janhq/uikit' import { useAtomValue, useSetAtom } from 'jotai' import { RefreshCcw } from 'lucide-react' +import AutoLink from '@/containers/AutoLink' import ModalTroubleShooting, { modalTroubleShootingAtom, } from '@/containers/ModalTroubleShoot' @@ -110,9 +111,9 @@ const ErrorMessage = ({ message }: { message: ThreadMessage }) => { ) : (
- {getErrorTitle()} +

Jan’s in beta. Access  = ({ model, onClick, open }) => { const { requestCreateNewThread } = useCreateNewThread() const totalRam = useAtomValue(totalRamAtom) const { settings } = useSettings() + const [imageLoaded, setImageLoaded] = useState(true) const nvidiaTotalVram = useAtomValue(nvidiaTotalVramAtom) const setMainViewState = useSetAtom(mainViewStateAtom) @@ -143,9 +144,10 @@ const ExploreModelItemHeader: React.FC = ({ model, onClick, open }) => { className="cursor-pointer rounded-t-md bg-background" onClick={onClick} > - {model.metadata.cover && ( -

+ {model.metadata.cover && imageLoaded && ( +
setImageLoaded(false)} src={model.metadata.cover} className="h-[250px] w-full object-cover" alt={`Cover - ${model.id}`}