Skip to content

Commit

Permalink
Merge pull request #803 from janhq/768-fs-adapter-calling-server-api-…
Browse files Browse the repository at this point in the history
…for-handling-fs

feat: boilerplate for express server localhost 1337
  • Loading branch information
linhtran174 authored Dec 5, 2023
2 parents bd9acf0 + d0e6571 commit 2627d95
Show file tree
Hide file tree
Showing 17 changed files with 238 additions and 0 deletions.
1 change: 1 addition & 0 deletions server/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
data
Empty file added server/data/.gitkeep
Empty file.
Empty file added server/data/models/.gitkeep
Empty file.
Empty file added server/data/threads/.gitkeep
Empty file.
Binary file added server/icons/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file added server/lib/.gitkeep
Empty file.
19 changes: 19 additions & 0 deletions server/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import fastify from 'fastify'
import dotenv from 'dotenv'
import v1API from './v1'
const server = fastify()

dotenv.config()
server.register(v1API, {prefix: "/api/v1"})


const JAN_API_PORT = Number.parseInt(process.env.JAN_API_PORT || '1337')
const JAN_API_HOST = process.env.JAN_API_HOST || "0.0.0.0"

server.listen({
port: JAN_API_PORT,
host: JAN_API_HOST
}).then(() => {
console.log(`JAN API listening at: http://${JAN_API_HOST}:${JAN_API_PORT}`);
})

5 changes: 5 additions & 0 deletions server/nodemon.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"watch": ["main.ts", "v1"],
"ext": "ts, json",
"exec": "tsc && node ./build/main.js"
}
32 changes: 32 additions & 0 deletions server/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"name": "jan-server",
"version": "0.1.3",
"main": "./build/main.js",
"author": "Jan <[email protected]>",
"license": "AGPL-3.0",
"homepage": "https://jan.ai",
"description": "Use offline LLMs with your own data. Run open source models like Llama2 or Falcon on your internal computers/servers.",
"build": "",
"scripts": {
"lint": "eslint . --ext \".js,.jsx,.ts,.tsx\"",
"test:e2e": "playwright test --workers=1",
"dev": "nodemon .",
"build": "tsc"
},
"dependencies": {
},
"devDependencies": {
"@types/body-parser": "^1.19.5",
"@types/npmcli__arborist": "^5.6.4",
"@typescript-eslint/eslint-plugin": "^6.7.3",
"@typescript-eslint/parser": "^6.7.3",
"dotenv": "^16.3.1",
"eslint-plugin-react": "^7.33.2",
"fastify": "^4.24.3",
"nodemon": "^3.0.1",
"run-script-os": "^1.1.6"
},
"installConfig": {
"hoistingLimits": "workspaces"
}
}
22 changes: 22 additions & 0 deletions server/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"noImplicitAny": true,
"sourceMap": true,
"strict": true,
"outDir": "./build",
"rootDir": "./",
"noEmitOnError": true,
"esModuleInterop": true,
"baseUrl": ".",
"allowJs": true,
"skipLibCheck": true,
"paths": { "*": ["node_modules/*"] },
"typeRoots": ["node_modules/@types"]
},
// "sourceMap": true,

"include": ["./**/*.ts"],
"exclude": ["core", "build", "dist", "tests", "node_modules"]
}
8 changes: 8 additions & 0 deletions server/v1/assistants/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { FastifyInstance, FastifyPluginAsync, FastifyPluginOptions } from 'fastify'

const router: FastifyPluginAsync = async (app: FastifyInstance, opts: FastifyPluginOptions) => {
//TODO: Add controllers for assistants here
// app.get("/", controller)
// app.post("/", controller)
}
export default router;
11 changes: 11 additions & 0 deletions server/v1/chat/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { FastifyInstance, FastifyPluginAsync, FastifyPluginOptions } from 'fastify'

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;
37 changes: 37 additions & 0 deletions server/v1/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import assistantsAPI from './assistants'
import chatCompletionAPI from './chat'
import modelsAPI from './models'
import threadsAPI from './threads'

import { FastifyInstance, FastifyPluginAsync } from 'fastify'

const router: FastifyPluginAsync = async (app: FastifyInstance, opts) => {
app.register(
assistantsAPI,
{
prefix: "/assistants"
}
)

app.register(
chatCompletionAPI,
{
prefix: "/chat/completion"
}
)

app.register(
modelsAPI,
{
prefix: "/models"
}
)

app.register(
threadsAPI,
{
prefix: "/threads"
}
)
}
export default router;
23 changes: 23 additions & 0 deletions server/v1/models/downloadModel.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { RouteHandlerMethod, FastifyRequest, FastifyReply } from 'fastify'
import { MODEL_FOLDER_PATH } from "./index"
import fs from 'fs/promises'

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;
61 changes: 61 additions & 0 deletions server/v1/models/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@

export const MODEL_FOLDER_PATH = "./data/models"
export const _modelMetadataFileName = 'model.json'

import fs from 'fs/promises'
import { Model } from '@janhq/core'
import { join } from 'path'

// 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;
11 changes: 11 additions & 0 deletions server/v1/models/modelOp.ts
Original file line number Diff line number Diff line change
@@ -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> {


}
8 changes: 8 additions & 0 deletions server/v1/threads/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { FastifyInstance, FastifyPluginAsync, FastifyPluginOptions } from 'fastify'

const router: FastifyPluginAsync = async (app: FastifyInstance, opts: FastifyPluginOptions) => {
//TODO: Add controllers declaration here

// app.get()
}
export default router;

0 comments on commit 2627d95

Please sign in to comment.