Skip to content

Commit

Permalink
feat: auto pull models list when setting up remote engine (#4547)
Browse files Browse the repository at this point in the history
  • Loading branch information
louis-menlo authored Jan 30, 2025
1 parent 350c9f7 commit 33db513
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 14 deletions.
2 changes: 1 addition & 1 deletion core/src/types/model/modelEntity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export type Model = {
/**
* The model identifier, modern version of id.
*/
mode?: string
model?: string

/**
* Human-readable name that is used for UI.
Expand Down
7 changes: 7 additions & 0 deletions extensions/engine-management-extension/rolldown.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@ export default defineConfig([
CORTEX_ENGINE_VERSION: JSON.stringify('v0.1.49'),
DEFAULT_REMOTE_ENGINES: JSON.stringify(engines),
DEFAULT_REMOTE_MODELS: JSON.stringify(models),
DEFAULT_REQUEST_PAYLOAD_TRANSFORM: JSON.stringify('{{ tojson(value) }}'),
DEFAULT_RESPONSE_BODY_TRANSFORM: JSON.stringify(
'{ {% set first = true %} {% for key, value in input_request %} {% if key == "choices" or key == "created" or key == "model" or key == "service_tier" or key == "stream" or key == "object" or key == "usage" %} {% if not first %},{% endif %} "{{ key }}": {{ tojson(value) }} {% set first = false %} {% endif %} {% endfor %} }'
),
DEFAULT_REQUEST_HEADERS_TRANSFORM: JSON.stringify(
'Authorization: Bearer {{api_key}}'
),
},
},
{
Expand Down
3 changes: 3 additions & 0 deletions extensions/engine-management-extension/src/@types/global.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ declare const API_URL: string
declare const CORTEX_ENGINE_VERSION: string
declare const SOCKET_URL: string
declare const NODE: string
declare const DEFAULT_REQUEST_PAYLOAD_TRANSFORM: string
declare const DEFAULT_RESPONSE_BODY_TRANSFORM: string
declare const DEFAULT_REQUEST_HEADERS_TRANSFORM: string

declare const DEFAULT_REMOTE_ENGINES: ({
id: string
Expand Down
80 changes: 67 additions & 13 deletions extensions/engine-management-extension/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ import PQueue from 'p-queue'
import { EngineError } from './error'
import { getJanDataFolderPath } from '@janhq/core'

interface ModelList {
data: Model[]
}
/**
* JSONEngineManagementExtension is a EngineManagementExtension implementation that provides
* functionality for managing engines.
Expand Down Expand Up @@ -63,13 +66,12 @@ export default class JSONEngineManagementExtension extends EngineManagementExten
* @returns A Promise that resolves to an object of list engines.
*/
async getRemoteModels(name: string): Promise<any> {
return this.queue.add(() =>
ky
.get(`${API_URL}/v1/models/remote/${name}`)
.json<Model[]>()
.then((e) => e)
.catch(() => [])
) as Promise<Model[]>
return ky
.get(`${API_URL}/v1/models/remote/${name}`)
.json<ModelList>()
.catch(() => ({
data: [],
})) as Promise<ModelList>
}

/**
Expand Down Expand Up @@ -138,9 +140,36 @@ export default class JSONEngineManagementExtension extends EngineManagementExten
* Add a new remote engine
* @returns A Promise that resolves to intall of engine.
*/
async addRemoteEngine(engineConfig: EngineConfig) {
async addRemoteEngine(
engineConfig: EngineConfig,
persistModels: boolean = true
) {
// Populate default settings
if (
engineConfig.metadata?.transform_req?.chat_completions &&
!engineConfig.metadata.transform_req.chat_completions.template
)
engineConfig.metadata.transform_req.chat_completions.template =
DEFAULT_REQUEST_PAYLOAD_TRANSFORM

if (
engineConfig.metadata?.transform_resp?.chat_completions &&
!engineConfig.metadata.transform_resp.chat_completions?.template
)
engineConfig.metadata.transform_resp.chat_completions.template =
DEFAULT_RESPONSE_BODY_TRANSFORM

if (engineConfig.metadata && !engineConfig.metadata?.header_template)
engineConfig.metadata.header_template = DEFAULT_REQUEST_HEADERS_TRANSFORM

return this.queue.add(() =>
ky.post(`${API_URL}/v1/engines`, { json: engineConfig }).then((e) => e)
ky.post(`${API_URL}/v1/engines`, { json: engineConfig }).then((e) => {
if (persistModels && engineConfig.metadata?.get_models_url) {
// Pull /models from remote models endpoint
return this.populateRemoteModels(engineConfig).then(() => e)
}
return e
})
) as Promise<{ messages: string }>
}

Expand All @@ -161,9 +190,11 @@ export default class JSONEngineManagementExtension extends EngineManagementExten
* @param model - Remote model object.
*/
async addRemoteModel(model: Model) {
return this.queue.add(() =>
ky.post(`${API_URL}/v1/models/add`, { json: model }).then((e) => e)
)
return this.queue
.add(() =>
ky.post(`${API_URL}/v1/models/add`, { json: model }).then((e) => e)
)
.then(() => {})
}

/**
Expand Down Expand Up @@ -293,7 +324,7 @@ export default class JSONEngineManagementExtension extends EngineManagementExten
data.api_key = api_key
/// END - Migrate legacy api key settings

await this.addRemoteEngine(data).catch(console.error)
await this.addRemoteEngine(data, false).catch(console.error)
})
)
events.emit(EngineEvent.OnEngineUpdate, {})
Expand All @@ -303,4 +334,27 @@ export default class JSONEngineManagementExtension extends EngineManagementExten
events.emit(ModelEvent.OnModelsUpdate, { fetch: true })
}
}

/**
* Pulls models list from the remote provider and persist
* @param engineConfig
* @returns
*/
private populateRemoteModels = async (engineConfig: EngineConfig) => {
return this.getRemoteModels(engineConfig.engine)
.then((models: ModelList) => {
Promise.all(
models.data?.map((model) =>
this.addRemoteModel({
...model,
engine: engineConfig.engine as InferenceEngine,
model: model.model ?? model.id,
}).catch(console.info)
)
).then(() => {
events.emit(ModelEvent.OnModelsUpdate, { fetch: true })
})
})
.catch(console.info)
}
}

0 comments on commit 33db513

Please sign in to comment.