Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update docs 14th mar #2362

Merged
merged 45 commits into from
Mar 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
f5bd865
docs: update slogan
0xHieu01 Mar 8, 2024
3e04514
docs: update website-docs content
0xHieu01 Mar 10, 2024
7cd2a76
docs: update README.md
0xHieu01 Mar 10, 2024
6c9fa25
delete docs/docs/.gitignore
0xHieu01 Mar 10, 2024
7026d2d
feat: update changelog configuration
0xHieu01 Mar 10, 2024
90d208a
feat: fetching changelogs
0xHieu01 Mar 10, 2024
86af902
fix: message from quick ask not get the selected model (#2307)
namchuai Mar 11, 2024
c8ea16e
fix: quick ask blocks app update (#2310)
louis-menlo Mar 11, 2024
bbfc686
fix: quick ask not show (#2315)
louis-menlo Mar 11, 2024
6f899eb
janhq/jan: Update README.md with nightly build artifact URL
jan-service-account Mar 11, 2024
de433bb
janhq/jan: Update README.md with nightly build artifact URL
jan-service-account Mar 11, 2024
c2c1793
Merge branch 'dev' into docs-update-changelog-configuration
aindrajaya Mar 12, 2024
ad7e483
fix: jan app tray blocks app update (#2319)
louis-menlo Mar 12, 2024
259698e
janhq/jan: Update README.md with nightly build artifact URL
jan-service-account Mar 12, 2024
facfaa1
feat: quick ask support darkmode (#2316)
urmauur Mar 12, 2024
9dfb7a6
docs: update slogan (#2282)
0xHieu01 Mar 12, 2024
468322a
docs: update website-docs content (#2287)
0xHieu01 Mar 12, 2024
f4f1888
docs: enhance autogenerate changelog configuration (#2289)
0xHieu01 Mar 12, 2024
b9b421a
fix: quick app bugs (#2327)
louis-menlo Mar 12, 2024
32b7649
fix: existing-changelog
0xHieu01 Mar 12, 2024
af5bcea
fix: gate quick ask with feature toggle (#2331)
louis-menlo Mar 12, 2024
0747c15
fix: not fetch existing changelog (#2330)
0xHieu01 Mar 12, 2024
2082b81
janhq/jan: Update README.md with nightly build artifact URL
jan-service-account Mar 12, 2024
e5369ed
fix: do not migrate extensions from quick ask window (#2336)
louis-menlo Mar 12, 2024
fb893b8
janhq/jan: Update README.md with nightly build artifact URL
jan-service-account Mar 12, 2024
bff20ab
fix: put quick ask feature toggle under experimental feature (#2338)
louis-menlo Mar 13, 2024
f1db7a4
janhq/jan: Update README.md with nightly build artifact URL
jan-service-account Mar 13, 2024
7048c85
janhq/jan: Update README.md with nightly build artifact URL
jan-service-account Mar 13, 2024
24c6dd0
Add icon file contain image size in file name to fix linux icon (#2344)
hiento09 Mar 14, 2024
d85d026
feat: Nitro-Tensorrt-LLM Extension (#2280)
louis-menlo Mar 14, 2024
561b1dd
janhq/jan: Update README.md with nightly build artifact URL
jan-service-account Mar 14, 2024
03a0978
fix: some costmetic issues: badges corner, recommended for tensorrt m…
namchuai Mar 14, 2024
d9c3852
fix: ts error when declar var in case (#2348)
namchuai Mar 14, 2024
8120ad2
fix: badge or progress tensorRtExtensionItem (#2349)
urmauur Mar 14, 2024
aab8ee8
fix: disable rag & stream settings from tensorrt model.json (#2351)
louis-menlo Mar 14, 2024
0415786
fix: app does not recognize GPU first launch (#2350)
louis-menlo Mar 14, 2024
f878555
docs: trt-llm extension guides
freelerobot Mar 14, 2024
b4eff9a
docs: fix slugs
freelerobot Mar 14, 2024
ab73941
janhq/jan: Update README.md with nightly build artifact URL
jan-service-account Mar 14, 2024
1fe3dff
docs: update slugs again
freelerobot Mar 14, 2024
70fc24f
docs: nits
freelerobot Mar 14, 2024
4b6f218
docs: nits
freelerobot Mar 14, 2024
7686377
Merge branch 'dev' into fix2345
dan-menlo Mar 14, 2024
441af9d
Merge pull request #2353 from janhq/fix2345
dan-menlo Mar 14, 2024
f3ca508
Merge branch 'dev' into docs
dan-menlo Mar 14, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,16 @@ package-lock.json
core/lib/**

# Nitro binary files
extensions/inference-nitro-extension/bin/*/nitro
extensions/inference-nitro-extension/bin/*/*.metal
extensions/inference-nitro-extension/bin/*/*.exe
extensions/inference-nitro-extension/bin/*/*.dll
extensions/inference-nitro-extension/bin/*/*.exp
extensions/inference-nitro-extension/bin/*/*.lib
extensions/inference-nitro-extension/bin/saved-*
extensions/inference-nitro-extension/bin/*.tar.gz
extensions/inference-nitro-extension/bin/vulkaninfoSDK.exe
extensions/inference-nitro-extension/bin/vulkaninfo
extensions/*-extension/bin/*/nitro
extensions/*-extension/bin/*/*.metal
extensions/*-extension/bin/*/*.exe
extensions/*-extension/bin/*/*.dll
extensions/*-extension/bin/*/*.exp
extensions/*-extension/bin/*/*.lib
extensions/*-extension/bin/saved-*
extensions/*-extension/bin/*.tar.gz
extensions/*-extension/bin/vulkaninfoSDK.exe
extensions/*-extension/bin/vulkaninfo


# Turborepo
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,31 +76,31 @@ Jan is an open-source ChatGPT alternative that runs 100% offline on your compute
<tr style="text-align:center">
<td style="text-align:center"><b>Experimental (Nightly Build)</b></td>
<td style="text-align:center">
<a href='https://delta.jan.ai/latest/jan-win-x64-0.4.8-310.exe'>
<a href='https://delta.jan.ai/latest/jan-win-x64-0.4.8-322.exe'>
<img src='./docs/static/img/windows.png' style="height:14px; width: 14px" />
<b>jan.exe</b>
</a>
</td>
<td style="text-align:center">
<a href='https://delta.jan.ai/latest/jan-mac-x64-0.4.8-310.dmg'>
<a href='https://delta.jan.ai/latest/jan-mac-x64-0.4.8-322.dmg'>
<img src='./docs/static/img/mac.png' style="height:15px; width: 15px" />
<b>Intel</b>
</a>
</td>
<td style="text-align:center">
<a href='https://delta.jan.ai/latest/jan-mac-arm64-0.4.8-310.dmg'>
<a href='https://delta.jan.ai/latest/jan-mac-arm64-0.4.8-322.dmg'>
<img src='./docs/static/img/mac.png' style="height:15px; width: 15px" />
<b>M1/M2</b>
</a>
</td>
<td style="text-align:center">
<a href='https://delta.jan.ai/latest/jan-linux-amd64-0.4.8-310.deb'>
<a href='https://delta.jan.ai/latest/jan-linux-amd64-0.4.8-322.deb'>
<img src='./docs/static/img/linux.png' style="height:14px; width: 14px" />
<b>jan.deb</b>
</a>
</td>
<td style="text-align:center">
<a href='https://delta.jan.ai/latest/jan-linux-x86_64-0.4.8-310.AppImage'>
<a href='https://delta.jan.ai/latest/jan-linux-x86_64-0.4.8-322.AppImage'>
<img src='./docs/static/img/linux.png' style="height:14px; width: 14px" />
<b>jan.AppImage</b>
</a>
Expand Down
12 changes: 8 additions & 4 deletions core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,12 @@
"start": "rollup -c rollup.config.ts -w"
},
"devDependencies": {
"jest": "^29.7.0",
"@types/jest": "^29.5.12",
"@types/node": "^12.0.2",
"eslint-plugin-jest": "^27.9.0",
"eslint": "8.57.0",
"eslint-plugin-jest": "^27.9.0",
"jest": "^29.7.0",
"rimraf": "^3.0.2",
"rollup": "^2.38.5",
"rollup-plugin-commonjs": "^9.1.8",
"rollup-plugin-json": "^3.1.0",
Expand All @@ -58,7 +59,10 @@
"rollup-plugin-typescript2": "^0.36.0",
"ts-jest": "^29.1.2",
"tslib": "^2.6.2",
"typescript": "^5.3.3",
"rimraf": "^3.0.2"
"typescript": "^5.3.3"
},
"dependencies": {
"rxjs": "^7.8.1",
"ulid": "^2.3.0"
}
}
2 changes: 1 addition & 1 deletion core/rollup.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ export default [
// Allow json resolution
json(),
// Compile TypeScript files
typescript({ useTsconfigDeclarationDir: true }),
typescript({ useTsconfigDeclarationDir: true, exclude: ['src/*.ts', 'src/extensions/**'] }),
// Allow bundling cjs modules (unlike webpack, rollup doesn't understand cjs)
commonjs(),
// Allow node_modules resolution, so you can use 'external' to control
Expand Down
3 changes: 3 additions & 0 deletions core/src/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ export enum AppRoute {
stopServer = 'stopServer',
log = 'log',
logServer = 'logServer',
systemInformations = 'systemInformations',
showToast = 'showToast',
}

export enum AppEvent {
Expand All @@ -56,6 +58,7 @@ export enum DownloadEvent {
onFileDownloadUpdate = 'onFileDownloadUpdate',
onFileDownloadError = 'onFileDownloadError',
onFileDownloadSuccess = 'onFileDownloadSuccess',
onFileUnzipSuccess = 'onFileUnzipSuccess',
}

export enum LocalImportModelEvent {
Expand Down
36 changes: 25 additions & 11 deletions core/src/core.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { FileStat } from './types'
import { DownloadRequest, FileStat, NetworkConfig } from './types'

/**
* Execute a extension module function in main process
Expand All @@ -17,18 +17,16 @@ const executeOnMain: (extension: string, method: string, ...args: any[]) => Prom

/**
* Downloads a file from a URL and saves it to the local file system.
* @param {string} url - The URL of the file to download.
* @param {string} fileName - The name to use for the downloaded file.
* @param {object} network - Optional object to specify proxy/whether to ignore SSL certificates.
*
* @param {DownloadRequest} downloadRequest - The request to download the file.
* @param {NetworkConfig} network - Optional object to specify proxy/whether to ignore SSL certificates.
*
* @returns {Promise<any>} A promise that resolves when the file is downloaded.
*/
const downloadFile: (
url: string,
fileName: string,
network?: { proxy?: string; ignoreSSL?: boolean }
) => Promise<any> = (url, fileName, network) => {
return global.core?.api?.downloadFile(url, fileName, network)
}
const downloadFile: (downloadRequest: DownloadRequest, network?: NetworkConfig) => Promise<any> = (
downloadRequest,
network
) => global.core?.api?.downloadFile(downloadRequest, network)

/**
* Aborts the download of a specific file.
Expand Down Expand Up @@ -108,6 +106,20 @@ const log: (message: string, fileName?: string) => void = (message, fileName) =>
const isSubdirectory: (from: string, to: string) => Promise<boolean> = (from: string, to: string) =>
global.core.api?.isSubdirectory(from, to)

/**
* Get system information
* @returns {Promise<any>} - A promise that resolves with the system information.
*/
const systemInformations: () => Promise<any> = () => global.core.api?.systemInformations()

/**
* Show toast message from browser processes.
* @param title
* @param message
* @returns
*/
const showToast: (title: string, message: string) => void = (title, message) =>
global.core.api?.showToast(title, message)
/**
* Register extension point function type definition
*/
Expand All @@ -134,5 +146,7 @@ export {
log,
isSubdirectory,
getUserHomePath,
systemInformations,
showToast,
FileStat,
}
44 changes: 44 additions & 0 deletions core/src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,22 @@ export enum ExtensionTypeEnum {
export interface ExtensionType {
type(): ExtensionTypeEnum | undefined
}

export interface Compatibility {
platform: string[]
version: string
}

const ALL_INSTALLATION_STATE = [
'NotRequired', // not required.
'Installed', // require and installed. Good to go.
'NotInstalled', // require to be installed.
'Corrupted', // require but corrupted. Need to redownload.
] as const

export type InstallationStateTuple = typeof ALL_INSTALLATION_STATE
export type InstallationState = InstallationStateTuple[number]

/**
* Represents a base extension.
* This class should be extended by any class that represents an extension.
Expand All @@ -33,4 +49,32 @@ export abstract class BaseExtension implements ExtensionType {
* Any cleanup logic for the extension should be put here.
*/
abstract onUnload(): void

/**
* The compatibility of the extension.
* This is used to check if the extension is compatible with the current environment.
* @property {Array} platform
*/
compatibility(): Compatibility | undefined {
return undefined
}

/**
* Determine if the prerequisites for the extension are installed.
*
* @returns {boolean} true if the prerequisites are installed, false otherwise.
*/
async installationState(): Promise<InstallationState> {
return 'NotRequired'
}

/**
* Install the prerequisites for the extension.
*
* @returns {Promise<void>}
*/
// @ts-ignore
async install(...args): Promise<void> {
return
}
}
60 changes: 60 additions & 0 deletions core/src/extensions/ai-engines/AIEngine.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import { getJanDataFolderPath, joinPath } from '../../core'
import { events } from '../../events'
import { BaseExtension } from '../../extension'
import { fs } from '../../fs'
import { Model, ModelEvent } from '../../types'

/**
* Base AIEngine
* Applicable to all AI Engines
*/
export abstract class AIEngine extends BaseExtension {
// The inference engine
abstract provider: string
// The model folder
modelFolder: string = 'models'

abstract models(): Promise<Model[]>

/**
* On extension load, subscribe to events.
*/
onLoad() {
this.prePopulateModels()
}

/**
* Pre-populate models to App Data Folder
*/
prePopulateModels(): Promise<void> {
return this.models().then((models) => {
const prePoluateOperations = models.map((model) =>
getJanDataFolderPath()
.then((janDataFolder) =>
// Attempt to create the model folder
joinPath([janDataFolder, this.modelFolder, model.id]).then((path) =>
fs
.mkdirSync(path)
.catch()
.then(() => path)
)
)
.then((path) => joinPath([path, 'model.json']))
.then((path) => {
// Do not overwite existing model.json
return fs.existsSync(path).then((exist: any) => {
if (!exist) return fs.writeFileSync(path, JSON.stringify(model, null, 2))
})
})
.catch((e: Error) => {
console.error('Error', e)
})
)
Promise.all(prePoluateOperations).then(() =>
// Emit event to update models
// So the UI can update the models list
events.emit(ModelEvent.OnModelsUpdate, {})
)
})
}
}
63 changes: 63 additions & 0 deletions core/src/extensions/ai-engines/LocalOAIEngine.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { executeOnMain, getJanDataFolderPath, joinPath } from '../../core'
import { events } from '../../events'
import { Model, ModelEvent } from '../../types'
import { OAIEngine } from './OAIEngine'

/**
* Base OAI Local Inference Provider
* Added the implementation of loading and unloading model (applicable to local inference providers)
*/
export abstract class LocalOAIEngine extends OAIEngine {
// The inference engine
loadModelFunctionName: string = 'loadModel'
unloadModelFunctionName: string = 'unloadModel'
isRunning: boolean = false

/**
* On extension load, subscribe to events.
*/
onLoad() {
super.onLoad()
// These events are applicable to local inference providers
events.on(ModelEvent.OnModelInit, (model: Model) => this.onModelInit(model))
events.on(ModelEvent.OnModelStop, (model: Model) => this.onModelStop(model))
}

/**
* Load the model.
*/
async onModelInit(model: Model) {
if (model.engine.toString() !== this.provider) return

const modelFolder = await joinPath([await getJanDataFolderPath(), this.modelFolder, model.id])

const res = await executeOnMain(this.nodeModule, this.loadModelFunctionName, {
modelFolder,
model,
})

if (res?.error) {
events.emit(ModelEvent.OnModelFail, {
...model,
error: res.error,
})
return
} else {
this.loadedModel = model
events.emit(ModelEvent.OnModelReady, model)
this.isRunning = true
}
}
/**
* Stops the model.
*/
onModelStop(model: Model) {
if (model.engine?.toString() !== this.provider) return

this.isRunning = false

executeOnMain(this.nodeModule, this.unloadModelFunctionName).then(() => {
events.emit(ModelEvent.OnModelStopped, {})
})
}
}
Loading
Loading