Skip to content

Commit 8ca507c

Browse files
authored
feat: proxy support for the new downloader (#5795)
* feat: proxy support for the new downloader * test: remove outdated test * ci: clean up
1 parent 92703bc commit 8ca507c

File tree

11 files changed

+1145
-171
lines changed

11 files changed

+1145
-171
lines changed

.github/workflows/jan-linter-and-test.yml

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,6 @@ jobs:
114114
with:
115115
node-version: 20
116116

117-
- name: Install tauri-driver dependencies
118-
run: |
119-
cargo install tauri-driver --locked
120-
121117
# Clean cache, continue on error
122118
- name: 'Cleanup cache'
123119
shell: powershell
@@ -154,10 +150,6 @@ jobs:
154150
with:
155151
node-version: 20
156152

157-
- name: Install tauri-driver dependencies
158-
run: |
159-
cargo install tauri-driver --locked
160-
161153
- name: 'Cleanup cache'
162154
shell: powershell
163155
continue-on-error: true
@@ -202,10 +194,6 @@ jobs:
202194
sudo apt update
203195
sudo apt install -y libglib2.0-dev libatk1.0-dev libpango1.0-dev libgtk-3-dev libsoup-3.0-dev libwebkit2gtk-4.1-dev librsvg2-dev libfuse2 webkit2gtk-driver
204196
205-
- name: Install tauri-driver dependencies
206-
run: |
207-
cargo install tauri-driver --locked
208-
209197
- name: 'Cleanup cache'
210198
continue-on-error: true
211199
run: |

extensions/download-extension/src/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export enum Settings {
99
interface DownloadItem {
1010
url: string
1111
save_path: string
12+
proxy?: Record<string, string | string[] | boolean>
1213
}
1314

1415
type DownloadEvent = {
@@ -30,10 +31,11 @@ export default class DownloadManager extends BaseExtension {
3031
url: string,
3132
savePath: string,
3233
taskId: string,
34+
proxyConfig: Record<string, string | string[] | boolean> = {},
3335
onProgress?: (transferred: number, total: number) => void
3436
) {
3537
return await this.downloadFiles(
36-
[{ url, save_path: savePath }],
38+
[{ url, save_path: savePath, proxy: proxyConfig }],
3739
taskId,
3840
onProgress
3941
)

extensions/llamacpp-extension/src/backend.ts

Lines changed: 66 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
1-
import {
2-
getJanDataFolderPath,
3-
fs,
4-
joinPath,
5-
events,
6-
} from '@janhq/core'
1+
import { getJanDataFolderPath, fs, joinPath, events } from '@janhq/core'
72
import { 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

213239
async 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

264297
function 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-

extensions/llamacpp-extension/src/index.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
getBackendExePath,
2828
} from './backend'
2929
import { invoke } from '@tauri-apps/api/core'
30+
import { getProxyConfig } from './util'
3031

3132
type LlamacppConfig = {
3233
version_backend: string
@@ -61,6 +62,7 @@ type LlamacppConfig = {
6162
interface DownloadItem {
6263
url: string
6364
save_path: string
65+
proxy?: Record<string, string | string[] | boolean>
6466
}
6567

6668
interface ModelConfig {
@@ -607,7 +609,11 @@ export default class llamacpp_extension extends AIEngine {
607609
// if URL, add to downloadItems, and return local path
608610
if (path.startsWith('https://')) {
609611
const localPath = `${modelDir}/${saveName}`
610-
downloadItems.push({ url: path, save_path: localPath })
612+
downloadItems.push({
613+
url: path,
614+
save_path: localPath,
615+
proxy: getProxyConfig(),
616+
})
611617
return localPath
612618
}
613619

0 commit comments

Comments
 (0)