1- import {
2- getJanDataFolderPath ,
3- fs ,
4- joinPath ,
5- events ,
6- } from '@janhq/core'
1+ import { getJanDataFolderPath , fs , joinPath , events } from '@janhq/core'
72import { invoke } from '@tauri-apps/api/core'
3+ import { getProxyConfig } from './util'
84
95// folder structure
106// <Jan's data folder>/llamacpp/backends/<backend_version>/<backend_type>
117
128// what should be available to the user for selection?
13- export async function listSupportedBackends ( ) : Promise < { version : string , backend : string } [ ] > {
9+ export async function listSupportedBackends ( ) : Promise <
10+ { version : string ; backend : string } [ ]
11+ > {
1412 const sysInfo = await window . core . api . getSystemInfo ( )
1513 const os_type = sysInfo . os_type
1614 const arch = sysInfo . cpu . arch
@@ -35,8 +33,7 @@ export async function listSupportedBackends(): Promise<{ version: string, backen
3533 // not available yet, placeholder for future
3634 else if ( sysType == 'windows-aarch64' ) {
3735 supportedBackends . push ( 'win-arm64' )
38- }
39- else if ( sysType == 'linux-x86_64' ) {
36+ } else if ( sysType == 'linux-x86_64' ) {
4037 supportedBackends . push ( 'linux-noavx-x64' )
4138 if ( features . avx ) supportedBackends . push ( 'linux-avx-x64' )
4239 if ( features . avx2 ) supportedBackends . push ( 'linux-avx2-x64' )
@@ -48,11 +45,9 @@ export async function listSupportedBackends(): Promise<{ version: string, backen
4845 // not available yet, placeholder for future
4946 else if ( sysType === 'linux-aarch64' ) {
5047 supportedBackends . push ( 'linux-arm64' )
51- }
52- else if ( sysType === 'macos-x86_64' ) {
48+ } else if ( sysType === 'macos-x86_64' ) {
5349 supportedBackends . push ( 'macos-x64' )
54- }
55- else if ( sysType === 'macos-aarch64' ) {
50+ } else if ( sysType === 'macos-aarch64' ) {
5651 supportedBackends . push ( 'macos-arm64' )
5752 }
5853
@@ -82,58 +77,89 @@ export async function listSupportedBackends(): Promise<{ version: string, backen
8277 return backendVersions
8378}
8479
85- export async function getBackendDir ( backend : string , version : string ) : Promise < string > {
80+ export async function getBackendDir (
81+ backend : string ,
82+ version : string
83+ ) : Promise < string > {
8684 const janDataFolderPath = await getJanDataFolderPath ( )
87- const backendDir = await joinPath ( [ janDataFolderPath , 'llamacpp' , 'backends' , version , backend ] )
85+ const backendDir = await joinPath ( [
86+ janDataFolderPath ,
87+ 'llamacpp' ,
88+ 'backends' ,
89+ version ,
90+ backend ,
91+ ] )
8892 return backendDir
8993}
9094
91- export async function getBackendExePath ( backend : string , version : string ) : Promise < string > {
95+ export async function getBackendExePath (
96+ backend : string ,
97+ version : string
98+ ) : Promise < string > {
9299 const sysInfo = await window . core . api . getSystemInfo ( )
93- const exe_name = sysInfo . os_type === 'windows' ? 'llama-server.exe' : 'llama-server'
100+ const exe_name =
101+ sysInfo . os_type === 'windows' ? 'llama-server.exe' : 'llama-server'
94102 const backendDir = await getBackendDir ( backend , version )
95103 const exePath = await joinPath ( [ backendDir , 'build' , 'bin' , exe_name ] )
96104 return exePath
97105}
98106
99- export async function isBackendInstalled ( backend : string , version : string ) : Promise < boolean > {
107+ export async function isBackendInstalled (
108+ backend : string ,
109+ version : string
110+ ) : Promise < boolean > {
100111 const exePath = await getBackendExePath ( backend , version )
101112 const result = await fs . existsSync ( exePath )
102113 return result
103114}
104115
105- export async function downloadBackend ( backend : string , version : string ) : Promise < void > {
116+ export async function downloadBackend (
117+ backend : string ,
118+ version : string
119+ ) : Promise < void > {
106120 const janDataFolderPath = await getJanDataFolderPath ( )
107121 const llamacppPath = await joinPath ( [ janDataFolderPath , 'llamacpp' ] )
108122 const backendDir = await getBackendDir ( backend , version )
109123 const libDir = await joinPath ( [ llamacppPath , 'lib' ] )
110124
111- const downloadManager = window . core . extensionManager . getByName ( '@janhq/download-extension' )
125+ const downloadManager = window . core . extensionManager . getByName (
126+ '@janhq/download-extension'
127+ )
128+
129+ // Get proxy configuration from localStorage
130+ const proxyConfig = getProxyConfig ( )
112131
113132 const downloadItems = [
114133 {
115134 url : `https://github.com/menloresearch/llama.cpp/releases/download/${ version } /llama-${ version } -bin-${ backend } .tar.gz` ,
116135 save_path : await joinPath ( [ backendDir , 'backend.tar.gz' ] ) ,
117- }
136+ proxy : proxyConfig ,
137+ } ,
118138 ]
119139
120140 // also download CUDA runtime + cuBLAS + cuBLASLt if needed
121141 if ( backend . includes ( 'cu11.7' ) && ! ( await _isCudaInstalled ( '11.7' ) ) ) {
122142 downloadItems . push ( {
123143 url : `https://github.com/menloresearch/llama.cpp/releases/download/${ version } /cudart-llama-bin-linux-cu11.7-x64.tar.gz` ,
124144 save_path : await joinPath ( [ libDir , 'cuda11.tar.gz' ] ) ,
145+ proxy : proxyConfig ,
125146 } )
126147 } else if ( backend . includes ( 'cu12.0' ) && ! ( await _isCudaInstalled ( '12.0' ) ) ) {
127148 downloadItems . push ( {
128149 url : `https://github.com/menloresearch/llama.cpp/releases/download/${ version } /cudart-llama-bin-linux-cu12.0-x64.tar.gz` ,
129150 save_path : await joinPath ( [ libDir , 'cuda12.tar.gz' ] ) ,
151+ proxy : proxyConfig ,
130152 } )
131153 }
132154
133155 const taskId = `llamacpp-${ version } -${ backend } ` . replace ( / \. / g, '-' )
134156 const downloadType = 'Engine'
135157
136- console . log ( `Downloading backend ${ backend } version ${ version } : ${ JSON . stringify ( downloadItems ) } ` )
158+ console . log (
159+ `Downloading backend ${ backend } version ${ version } : ${ JSON . stringify (
160+ downloadItems
161+ ) } `
162+ )
137163 let downloadCompleted = false
138164 try {
139165 const onProgress = ( transferred : number , total : number ) => {
@@ -212,13 +238,15 @@ async function _getSupportedFeatures() {
212238
213239async function _fetchGithubReleases (
214240 owner : string ,
215- repo : string ,
241+ repo : string
216242) : Promise < any [ ] > {
217243 // by default, it's per_page=30 and page=1 -> the latest 30 releases
218244 const url = `https://api.github.com/repos/${ owner } /${ repo } /releases`
219245 const response = await fetch ( url )
220246 if ( ! response . ok ) {
221- throw new Error ( `Failed to fetch releases from ${ url } : ${ response . statusText } ` )
247+ throw new Error (
248+ `Failed to fetch releases from ${ url } : ${ response . statusText } `
249+ )
222250 }
223251 return response . json ( )
224252}
@@ -257,21 +285,25 @@ async function _isCudaInstalled(version: string): Promise<boolean> {
257285
258286 // check for libraries shipped with Jan's llama.cpp extension
259287 const janDataFolderPath = await getJanDataFolderPath ( )
260- const cudartPath = await joinPath ( [ janDataFolderPath , 'llamacpp' , 'lib' , libname ] )
288+ const cudartPath = await joinPath ( [
289+ janDataFolderPath ,
290+ 'llamacpp' ,
291+ 'lib' ,
292+ libname ,
293+ ] )
261294 return await fs . existsSync ( cudartPath )
262295}
263296
264297function compareVersions ( a : string , b : string ) : number {
265- const aParts = a . split ( '.' ) . map ( Number ) ;
266- const bParts = b . split ( '.' ) . map ( Number ) ;
267- const len = Math . max ( aParts . length , bParts . length ) ;
298+ const aParts = a . split ( '.' ) . map ( Number )
299+ const bParts = b . split ( '.' ) . map ( Number )
300+ const len = Math . max ( aParts . length , bParts . length )
268301
269302 for ( let i = 0 ; i < len ; i ++ ) {
270- const x = aParts [ i ] || 0 ;
271- const y = bParts [ i ] || 0 ;
272- if ( x > y ) return 1 ;
273- if ( x < y ) return - 1 ;
303+ const x = aParts [ i ] || 0
304+ const y = bParts [ i ] || 0
305+ if ( x > y ) return 1
306+ if ( x < y ) return - 1
274307 }
275- return 0 ;
308+ return 0
276309}
277-
0 commit comments