Skip to content

Commit

Permalink
Merge branch 'dev' into resolve-sync-conflict
Browse files Browse the repository at this point in the history
  • Loading branch information
louis-jan authored Apr 15, 2024
2 parents 26ce5eb + 81e8889 commit 409de93
Show file tree
Hide file tree
Showing 35 changed files with 130 additions and 45 deletions.
24 changes: 23 additions & 1 deletion .github/workflows/jan-electron-linter-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ jobs:
- name: "Cleanup cache"
continue-on-error: true
run: |
rm -rf ~/jan
make clean
- name: Get Commit Message for PR
Expand Down Expand Up @@ -98,6 +99,7 @@ jobs:
- name: "Cleanup cache"
continue-on-error: true
run: |
rm -rf ~/jan
make clean
- name: Linter and test
Expand All @@ -109,7 +111,7 @@ jobs:
CSC_IDENTITY_AUTO_DISCOVERY: "false"

test-on-windows:
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
if: github.event_name == 'push'
strategy:
fail-fast: false
matrix:
Expand All @@ -131,6 +133,12 @@ jobs:
shell: powershell
continue-on-error: true
run: |
$path = "$Env:APPDATA\jan"
if (Test-Path $path) {
Remove-Item "\\?\$path" -Recurse -Force
} else {
Write-Output "Folder does not exist."
}
make clean
- name: Get Commit Message for push event
Expand Down Expand Up @@ -173,6 +181,12 @@ jobs:
shell: powershell
continue-on-error: true
run: |
$path = "$Env:APPDATA\jan"
if (Test-Path $path) {
Remove-Item "\\?\$path" -Recurse -Force
} else {
Write-Output "Folder does not exist."
}
make clean
- name: Get Commit Message for PR
Expand Down Expand Up @@ -216,6 +230,12 @@ jobs:
shell: powershell
continue-on-error: true
run: |
$path = "$Env:APPDATA\jan"
if (Test-Path $path) {
Remove-Item "\\?\$path" -Recurse -Force
} else {
Write-Output "Folder does not exist."
}
make clean
- name: Linter and test
Expand Down Expand Up @@ -243,6 +263,7 @@ jobs:
- name: "Cleanup cache"
continue-on-error: true
run: |
rm -rf ~/jan
make clean
- name: Get Commit Message for PR
Expand Down Expand Up @@ -289,6 +310,7 @@ jobs:
- name: "Cleanup cache"
continue-on-error: true
run: |
rm -rf ~/jan
make clean
- name: Linter and test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,11 @@ jobs:
with:
args: |
Jan App ${{ inputs.build_reason }} build artifact version {{ VERSION }}:
- Windows: https://app.jan.ai/download/nightly/win-x64
- macOS Intel: https://app.jan.ai/download/nightly/mac-x64
- macOS Apple Silicon: https://app.jan.ai/download/nightly/mac-arm64
- Linux Deb: https://app.jan.ai/download/nightly/linux-amd64-deb
- Linux AppImage: https://app.jan.ai/download/nightly/linux-amd64-appimage
- Windows: https://delta.jan.ai/latest/jan-win-x64-{{ VERSION }}.exe
- macOS Intel: https://delta.jan.ai/latest/jan-mac-x64-{{ VERSION }}.dmg
- macOS Apple Silicon: https://delta.jan.ai/latest/jan-mac-arm64-{{ VERSION }}.dmg
- Linux Deb: https://delta.jan.ai/latest/jan-linux-amd64-{{ VERSION }}.deb
- Linux AppImage: https://delta.jan.ai/latest/jan-linux-x86_64-{{ VERSION }}.AppImage
- Github action run: https://github.com/janhq/jan/actions/runs/{{ GITHUB_RUN_ID }}
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
4 changes: 2 additions & 2 deletions charts/server/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ common:
securityContext: {}

service:
extenalLabel: {}
externalLabel: {}
type: ClusterIP
port: 1337
targetPort: 1337
Expand Down Expand Up @@ -193,7 +193,7 @@ common:
securityContext: {}

service:
extenalLabel: {}
externalLabel: {}
type: ClusterIP
port: 3000
targetPort: 3000
Expand Down
2 changes: 1 addition & 1 deletion core/src/browser/core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ const joinPath: (paths: string[]) => Promise<string> = (paths) =>
globalThis.core.api?.joinPath(paths)

/**
* Retrive the basename from an url.
* Retrieve the basename from an url.
* @param path - The path to retrieve.
* @returns {Promise<string>} A promise that resolves with the basename.
*/
Expand Down
2 changes: 1 addition & 1 deletion core/src/node/helper/resource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { log } from './logger'

export const getSystemResourceInfo = async (): Promise<SystemResourceInfo> => {
const cpu = await physicalCpuCount()
log(`[NITRO]::CPU informations - ${cpu}`)
log(`[NITRO]::CPU information - ${cpu}`)

return {
numCpuPhysicalCore: cpu,
Expand Down
1 change: 1 addition & 0 deletions core/src/types/setting/settingComponent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export type InputComponentProps = {
placeholder: string
value: string
type?: InputType
textAlign?: 'left' | 'right'
}

export type SliderComponentProps = {
Expand Down
7 changes: 6 additions & 1 deletion electron/tests/e2e/hub.e2e.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { test, appInfo } from '../config/fixtures'
import { test, appInfo, page, TIMEOUT } from '../config/fixtures'
import { expect } from '@playwright/test'

test.beforeAll(async () => {
Expand All @@ -16,4 +16,9 @@ test.beforeAll(async () => {
test('explores hub', async ({ hubPage }) => {
await hubPage.navigateByMenu()
await hubPage.verifyContainerVisible()
const useModelBtn= page.getByTestId(/^use-model-btn-.*/).first()

await expect(useModelBtn).toBeVisible({
timeout: TIMEOUT,
})
})
35 changes: 35 additions & 0 deletions electron/tests/e2e/thread.e2e.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { expect } from '@playwright/test'
import { page, test, TIMEOUT } from '../config/fixtures'

test('Select GPT model from Hub and Chat with Invalid API Key', async ({ hubPage }) => {
await hubPage.navigateByMenu()
await hubPage.verifyContainerVisible()

// Select the first GPT model
await page
.locator('[data-testid^="use-model-btn"][data-testid*="gpt"]')
.first().click()

// Attempt to create thread and chat in Thread page
await page
.getByTestId('btn-create-thread')
.click()

await page
.getByTestId('txt-input-chat')
.fill('dummy value')

await page
.getByTestId('btn-send-chat')
.click()

await page.waitForFunction(() => {
const loaders = document.querySelectorAll('[data-testid$="loader"]');
return !loaders.length;
}, { timeout: TIMEOUT });

const APIKeyError = page.getByTestId('invalid-API-key-error')
await expect(APIKeyError).toBeVisible({
timeout: TIMEOUT,
})
})
13 changes: 9 additions & 4 deletions electron/tests/pages/basePage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ export class BasePage {
constructor(
protected readonly page: Page,
readonly action: CommonActions,
protected containerId: string
) {}
protected containerId: string,
) {
}

public getValue(key: string) {
return this.action.getValue(key)
Expand All @@ -24,7 +25,11 @@ export class BasePage {
}

async navigateByMenu() {
await this.page.getByTestId(this.menuId).first().click()
await this.clickFirstElement(this.menuId)
}

async clickFirstElement(testId: string) {
await this.page.getByTestId(testId).first().click()
}

async verifyContainerVisible() {
Expand All @@ -36,7 +41,7 @@ export class BasePage {
await this.isElementVisible('img[alt="Jan - Logo"]')
}

//wait and find a specific element with it's selector and return Visible
//wait and find a specific element with its selector and return Visible
async isElementVisible(selector: any) {
let isVisible = true
await this.page
Expand Down
2 changes: 1 addition & 1 deletion electron/utils/selectedText.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export const getSelectedText = async () => {

/**
* Registers a global shortcut of `accelerator`. The `callback` is called
* with the selected text when the registered shorcut is pressed by the user
* with the selected text when the registered shortcut is pressed by the user
*
* Returns `true` if the shortcut was registered successfully
*/
Expand Down
2 changes: 1 addition & 1 deletion electron/utils/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { app } from 'electron'
export const setupCore = async () => {
// Setup core api for main process
global.core = {
// Define appPath function for app to retrieve app path globaly
// Define appPath function for app to retrieve app path globally
appPath: () => app.getPath('userData'),
}
}
12 changes: 6 additions & 6 deletions extensions/inference-nitro-extension/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export default class JanInferenceNitroExtension extends LocalOAIEngine {
/**
* The interval id for the health check. Used to stop the health check.
*/
private getNitroProcesHealthIntervalId: NodeJS.Timeout | undefined = undefined
private getNitroProcessHealthIntervalId: NodeJS.Timeout | undefined = undefined

/**
* Tracking the current state of nitro process.
Expand All @@ -65,7 +65,7 @@ export default class JanInferenceNitroExtension extends LocalOAIEngine {
this.inferenceUrl = `${window.core?.api?.baseApiUrl}/v1/chat/completions`
}

this.getNitroProcesHealthIntervalId = setInterval(
this.getNitroProcessHealthIntervalId = setInterval(
() => this.periodicallyGetNitroHealth(),
JanInferenceNitroExtension._intervalHealthCheck
)
Expand Down Expand Up @@ -95,7 +95,7 @@ export default class JanInferenceNitroExtension extends LocalOAIEngine {

override loadModel(model: Model): Promise<void> {
if (model.engine !== this.provider) return Promise.resolve()
this.getNitroProcesHealthIntervalId = setInterval(
this.getNitroProcessHealthIntervalId = setInterval(
() => this.periodicallyGetNitroHealth(),
JanInferenceNitroExtension._intervalHealthCheck
)
Expand All @@ -106,9 +106,9 @@ export default class JanInferenceNitroExtension extends LocalOAIEngine {
if (model?.engine && model.engine !== this.provider) return

// stop the periocally health check
if (this.getNitroProcesHealthIntervalId) {
clearInterval(this.getNitroProcesHealthIntervalId)
this.getNitroProcesHealthIntervalId = undefined
if (this.getNitroProcessHealthIntervalId) {
clearInterval(this.getNitroProcessHealthIntervalId)
this.getNitroProcessHealthIntervalId = undefined
}
return super.unloadModel(model)
}
Expand Down
3 changes: 2 additions & 1 deletion extensions/monitoring-extension/resources/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
"controllerType": "input",
"controllerProps": {
"value": "120000",
"placeholder": "Interval in milliseconds. E.g. 120000"
"placeholder": "Interval in milliseconds. E.g. 120000",
"textAlign": "right"
}
}
]
2 changes: 1 addition & 1 deletion extensions/monitoring-extension/src/node/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ export const getCurrentLoad = () =>
})

/**
* This will retrive GPU informations and persist settings.json
* This will retrieve GPU information and persist settings.json
* Will be called when the extension is loaded to turn on GPU acceleration if supported
*/
export const updateNvidiaInfo = async () => {
Expand Down
2 changes: 1 addition & 1 deletion extensions/monitoring-extension/src/node/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ export class FileLogger extends Logger {
daysToKeep?: number | undefined
): void {
// clear existing timeout
// incase we rerun it with different values
// in case we rerun it with different values
if (this.timeout) clearTimeout(this.timeout)
this.timeout = undefined

Expand Down
2 changes: 1 addition & 1 deletion server/helpers/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export async function setup() {
if (!existsSync(appDir)) mkdirSync(appDir)
//@ts-ignore
global.core = {
// Define appPath function for app to retrieve app path globaly
// Define appPath function for app to retrieve app path globally
appPath: () => appDir,
}
init({
Expand Down
2 changes: 1 addition & 1 deletion specs/adrs/adr-001-jan-deployable-cloud-native.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

* This ADR aims to outline design decisions for deploying Jan in cloud native environments such as: Runpod, AWS, Azure, GCP in a fast and simple way.
* The current code-base should not change too much.
* The current plugins must be reusable across enviroments (Desktop, Cloud-native).
* The current plugins must be reusable across environments (Desktop, Cloud-native).


### Key Design Decisions
Expand Down
4 changes: 2 additions & 2 deletions specs/adrs/adr-003-jan-plugins.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ Modular Architecture w/ Plugins:

- Jan will have an architecture similar to VSCode or k8Lens
- "Desktop Application" whose functionality can be extended thru plugins
- Jan's architecture will need to accomodate plugins for (a) Persistence(b) IAM(c) Teams and RBAC(d) Policy engines(e) "Apps" (i.e. higher-order business logic)(f) Themes (UI)
- Nitro's architecture will need to accomodate plugins for different "model backends"(a) llama.cpp(b) rkwk (and others)(c) 3rd-party AIs
- Jan's architecture will need to accommodate plugins for (a) Persistence(b) IAM(c) Teams and RBAC(d) Policy engines(e) "Apps" (i.e. higher-order business logic)(f) Themes (UI)
- Nitro's architecture will need to accommodate plugins for different "model backends"(a) llama.cpp(b) rkwk (and others)(c) 3rd-party AIs

## Decision

Expand Down
2 changes: 1 addition & 1 deletion specs/adrs/adr-008-Extensible-Jan-with-Docker.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Proposed
## Context

What is the issue that we're seeing that is motivating this decision or change?
- The A.I world is moving fast with multiple runtime/ prebaked environment. We or the builder cannot cover just everything but rather we should adopt it and facillitate it as much as possible within Jan.
- The A.I world is moving fast with multiple runtime/ prebaked environment. We or the builder cannot cover just everything but rather we should adopt it and facilitate it as much as possible within Jan.
- For `Run your own A.I`: Builder can build app on Jan (NodeJS env) and connect to external endpoint which serves the real A.I
- e.g 1: Nitro acting as proxy to `triton-inference-server` running within a Docker container controlled by Jan app
- e.g 2: Original models can be in many formats (pytorch, paddlepaddle). In order to run it with the most optimized version locally, there must be a step to transpile the model ([Ollama import model](https://github.com/jmorganca/ollama/blob/main/docs/import.md), Tensorrt). Btw Jan can prebuilt it and let user pull but later
Expand Down
12 changes: 9 additions & 3 deletions uikit/src/input/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,20 @@ import { forwardRef } from 'react'
import { twMerge } from 'tailwind-merge'

export interface InputProps
extends React.InputHTMLAttributes<HTMLInputElement> {}
extends React.InputHTMLAttributes<HTMLInputElement> {
textAlign?: 'left' | 'right'
}

const Input = forwardRef<HTMLInputElement, InputProps>(
({ className, type, ...props }, ref) => {
({ className, type, textAlign, ...props }, ref) => {
return (
<input
type={type}
className={twMerge('input', className)}
className={twMerge(
'input',
className,
textAlign === 'right' && 'text-right'
)}
ref={ref}
{...props}
/>
Expand Down
3 changes: 3 additions & 0 deletions uikit/src/input/styles.scss
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,7 @@
@apply disabled:text-muted-foreground disabled:cursor-not-allowed disabled:bg-zinc-100 disabled:dark:bg-zinc-800 disabled:dark:text-zinc-600;
@apply focus-within:outline-none focus-visible:outline-0 focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-1;
@apply file:border-0 file:bg-transparent file:font-medium;
&.text-right {
text-align: right;
}
}
2 changes: 1 addition & 1 deletion uikit/src/modal/styles.scss
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
}

&-content {
@apply bg-background border-border fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-4 shadow-lg duration-200 sm:rounded-lg md:w-full;
@apply bg-background border-border fixed left-[50%] top-[50%] z-50 grid max-h-[calc(100%-48px)] w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 overflow-y-auto border p-4 shadow-lg duration-200 sm:rounded-lg md:w-full;
}

&-close {
Expand Down
Loading

0 comments on commit 409de93

Please sign in to comment.