Switch to fastify + add model CRUD impl

This commit is contained in:
Linh Tran 2023-12-01 23:02:35 +07:00
parent 1bf75cfd05
commit f5c19bccc5
11 changed files with 154 additions and 63 deletions

View File

View File

View File

@ -1,28 +1,17 @@
import express from 'express'
import bodyParser from 'body-parser'
import fs from 'fs'
import fastify from 'fastify'
import v1API from './v1'
const JAN_API_PORT = 1337;
const server = express()
server.use(bodyParser.urlencoded())
server.use(bodyParser.json())
const server = fastify()
const USER_ROOT_DIR = '.data'
server.use("/v1", v1API)
server.register(v1API, {prefix: "/api/v1"})
// server.post("fs", (req, res) => {
// let op = req.body.op;
// switch(op){
// case 'readFile':
// fs.readFile(req.body.path, ()=>{})
// case 'writeFile':
// fs.writeFile(req.body.path, Buffer.from(req.body.data, "base64"), ()=>{})
// }
// })
server.listen(JAN_API_PORT, () => {
console.log(`JAN API listening at: http://localhost:${JAN_API_PORT}`);
server.listen({
port: JAN_API_PORT,
host: "0.0.0.0"
}).then(()=>{
console.log(`JAN API listening at: http://0.0.0.0:${JAN_API_PORT}`);
})

View File

@ -75,6 +75,7 @@
"@typescript-eslint/eslint-plugin": "^6.7.3",
"@typescript-eslint/parser": "^6.7.3",
"eslint-plugin-react": "^7.33.2",
"fastify": "^4.24.3",
"nodemon": "^3.0.1",
"run-script-os": "^1.1.6"
},

View File

@ -1,5 +1,8 @@
import { Request, Response } from 'express'
import { FastifyInstance, FastifyPluginAsync, FastifyPluginOptions } from 'fastify'
export default function route(req: Request, res: Response){
}
const router: FastifyPluginAsync = async (app: FastifyInstance, opts: FastifyPluginOptions) => {
//TODO: Add controllers for assistants here
// app.get("/", controller)
// app.post("/", controller)
}
export default router;

View File

@ -1,5 +1,11 @@
import { Request, Response } from 'express'
import { FastifyInstance, FastifyPluginAsync, FastifyPluginOptions } from 'fastify'
export default function route(req: Request, res: Response){
}
const router: FastifyPluginAsync = async (app: FastifyInstance, opts: FastifyPluginOptions) => {
//TODO: Add controllers for here
// app.get("/", controller)
app.post("/", (req, res) => {
req.body
})
}
export default router;

View File

@ -1,20 +1,37 @@
import { Request, Response } from 'express'
import assistantsAPI from './assistants'
import chatCompletionAPI from './chat'
import modelsAPI from './models'
import threadsAPI from './threads'
export default function route(req: Request, res: Response){
console.log(req.path.split("/")[1])
switch (req.path.split("/")[1]){
case 'assistants':
assistantsAPI(req, res)
case 'chat':
chatCompletionAPI(req, res)
case 'models':
modelsAPI(req, res)
case 'threads':
threadsAPI(req, res)
}
}
import { FastifyInstance, FastifyPluginAsync } from 'fastify'
const router: FastifyPluginAsync = async (app: FastifyInstance, opts) => {
app.register(
assistantsAPI,
{
prefix: "/assisstants"
}
)
app.register(
chatCompletionAPI,
{
prefix: "/chat/completion"
}
)
app.register(
modelsAPI,
{
prefix: "/models"
}
)
app.register(
threadsAPI,
{
prefix: "/threads"
}
)
}
export default router;

View File

@ -1,5 +1,23 @@
import { Request, Response } from 'express'
import { RouteHandlerMethod, FastifyRequest, FastifyReply } from 'fastify'
import { MODEL_FOLDER_PATH } from "./index"
import fs from 'fs/promises'
export default function controller(req: Request, res: Response){
const controller: RouteHandlerMethod = async (req: FastifyRequest, res: FastifyReply) => {
//TODO: download models impl
//Mirror logic from JanModelExtension.downloadModel?
let model = req.body.model;
}
// Fetching logic
// const directoryPath = join(MODEL_FOLDER_PATH, model.id)
// await fs.mkdir(directoryPath)
// const path = join(directoryPath, model.id)
// downloadFile(model.source_url, path)
// TODO: Different model downloader from different model vendor
res.status(200).send({
status: "Ok"
})
}
export default controller;

View File

@ -1,18 +1,61 @@
import { Request, Response } from 'express'
import downloadModelController from './downloadModel'
export const MODEL_FOLDER_PATH = "./data/models"
export const _modelMetadataFileName = 'model.json'
function getModelController(req: Request, res: Response){
}
import fs from 'fs/promises'
import { Model } from '@janhq/core'
import { join } from 'path'
export default function route(req: Request, res: Response){
switch(req.method){
case 'get':
getModelController(req, res)
break;
case 'post':
downloadModelController(req, res)
break;
// map string => model object
let modelIndex = new Map<String, Model>();
async function buildModelIndex(){
let modelIds = await fs.readdir(MODEL_FOLDER_PATH);
// TODO: read modelFolders to get model info, mirror JanModelExtension?
try{
for(let modelId in modelIds){
let path = join(MODEL_FOLDER_PATH, modelId)
let fileData = await fs.readFile(join(path, _modelMetadataFileName))
modelIndex.set(modelId, JSON.parse(fileData.toString("utf-8")) as Model)
}
}
}
catch(err){
console.error("build model index failed. ", err);
}
}
buildModelIndex()
import { FastifyInstance, FastifyPluginAsync, FastifyPluginOptions } from 'fastify'
import downloadModelController from './downloadModel'
import { startModel, stopModel } from './modelOp'
const router: FastifyPluginAsync = async (app: FastifyInstance, opts: FastifyPluginOptions) => {
//TODO: Add controllers declaration here
///////////// CRUD ////////////////
// Model listing
app.get("/", async (req, res) => {
res.status(200).send(
modelIndex.values()
)
})
// Retrieve model info
app.get("/:id", (req, res) => {
res.status(200).send(
modelIndex.get(req.params.id)
)
})
// Delete model
app.delete("/:id", (req, res) => {
modelIndex.delete(req.params)
// TODO: delete on disk
})
///////////// Other ops ////////////////
app.post("/", downloadModelController)
app.put("/start", startModel)
app.put("/stop", stopModel)
}
export default router;

View File

@ -0,0 +1,11 @@
import {FastifyRequest, FastifyReply} from 'fastify'
export async function startModel(req: FastifyRequest, res: FastifyReply): Promise<void> {
}
export async function stopModel(req: FastifyRequest, res: FastifyReply): Promise<void> {
}

View File

@ -1,5 +1,8 @@
import { Request, Response } from 'express'
import { FastifyInstance, FastifyPluginAsync, FastifyPluginOptions } from 'fastify'
export default function route(req: Request, res: Response){
const router: FastifyPluginAsync = async (app: FastifyInstance, opts: FastifyPluginOptions) => {
//TODO: Add controllers declaration here
}
// app.get()
}
export default router;