diff options
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | bot.go | 12 | ||||
-rw-r--r-- | main.go | 7 | ||||
-rw-r--r-- | server.go | 38 |
4 files changed, 48 insertions, 12 deletions
@@ -3,6 +3,9 @@ run: setconfig go build -o elefant && ./elefant +server: setconfig + go build -o elefant && ./elefant -port 3333 + setconfig: find config.toml &>/dev/null || cp config.example.toml config.toml @@ -46,25 +46,25 @@ var ( } ) -func fetchModelName() { +func fetchModelName() *models.LLMModels { api := "http://localhost:8080/v1/models" resp, err := httpClient.Get(api) if err != nil { logger.Warn("failed to get model", "link", api, "error", err) - return + return nil } defer resp.Body.Close() llmModel := models.LLMModels{} if err := json.NewDecoder(resp.Body).Decode(&llmModel); err != nil { logger.Warn("failed to decode resp", "link", api, "error", err) - return + return nil } if resp.StatusCode != 200 { currentModel = "none" - return + return nil } currentModel = path.Base(llmModel.Data[0].ID) - updateStatusLine() + return &llmModel } // func fetchProps() { @@ -88,7 +88,7 @@ func fetchModelName() { // updateStatusLine() // } -// func sendMsgToLLM(body io.Reader) (*models.LLMRespChunk, error) { +// TODO: should be a part of server? func sendMsgToLLM(body io.Reader) { // nolint resp, err := httpClient.Post(cfg.CurrentAPI, "application/json", body) @@ -3,7 +3,6 @@ package main import ( "flag" "fmt" - "net/http" "unicode" "github.com/rivo/tview" @@ -30,10 +29,8 @@ func main() { apiPort := flag.Int("port", 0, "port to host api") flag.Parse() if apiPort != nil && *apiPort > 3000 { - // start api server - http.HandleFunc("POST /completion", completion) - http.ListenAndServe(fmt.Sprintf(":%d", *apiPort), nil) - // no tui + srv := Server{} + srv.ListenToRequests(fmt.Sprintf("%d", *apiPort)) return } pages.AddPage("main", flex, true, true) @@ -1,14 +1,40 @@ package main import ( + "elefant/config" + "encoding/json" "fmt" "net/http" + "time" ) +type Server struct { + config config.Config +} + +func (srv *Server) ListenToRequests(port string) { + // h := srv.actions + mux := http.NewServeMux() + server := &http.Server{ + Addr: "localhost:" + port, + Handler: mux, + ReadTimeout: time.Second * 5, + WriteTimeout: time.Second * 5, + } + mux.HandleFunc("GET /ping", pingHandler) + mux.HandleFunc("GET /model", modelHandler) + mux.HandleFunc("POST /completion", completionHandler) + fmt.Println("Listening", "addr", server.Addr) + server.ListenAndServe() +} + // create server // listen to the completion endpoint handler +func pingHandler(w http.ResponseWriter, req *http.Request) { + w.Write([]byte("pong")) +} -func completion(w http.ResponseWriter, req *http.Request) { +func completionHandler(w http.ResponseWriter, req *http.Request) { // post request body := req.Body // get body as io.reader @@ -19,9 +45,19 @@ out: select { case chunk := <-chunkChan: fmt.Println(chunk) + w.Write([]byte(chunk)) case <-streamDone: break out } } return } + +func modelHandler(w http.ResponseWriter, req *http.Request) { + llmModel := fetchModelName() + payload, err := json.Marshal(llmModel) + if err != nil { + // return err + } + w.Write(payload) +} |