Added together auto db update
This commit is contained in:
parent
c543956495
commit
5d8ea744c7
5
Chat.go
5
Chat.go
@ -269,11 +269,14 @@ func GenerateMessageContentHTML(authCookie string, messageId string, onlyContent
|
||||
panic(err)
|
||||
}
|
||||
|
||||
_ = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": authCookie}).Execute(edgeCtx, `
|
||||
err = edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": authCookie}).Execute(edgeCtx, `
|
||||
UPDATE Message
|
||||
FILTER .id = <uuid>$0
|
||||
SET {selected := true};
|
||||
`, messageUUID)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
|
@ -4,9 +4,12 @@ import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"io"
|
||||
"math"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"fmt"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
@ -139,3 +142,162 @@ func RequestTogether(c *fiber.Ctx, llm LLM, messages []Message) string {
|
||||
|
||||
return chatCompletionResponse.Choices[0].Text
|
||||
}
|
||||
|
||||
type TogetherModel struct {
|
||||
ID string `json:"id"`
|
||||
Object string `json:"object"`
|
||||
Created int64 `json:"created"`
|
||||
Type string `json:"type"`
|
||||
DisplayName string `json:"display_name"`
|
||||
Organization string `json:"organization"`
|
||||
Link string `json:"link"`
|
||||
License string `json:"license"`
|
||||
ContextLength int `json:"context_length"`
|
||||
Pricing TogetherPricing `json:"pricing"`
|
||||
}
|
||||
|
||||
type TogetherPricing struct {
|
||||
Hourly float64 `json:"hourly"`
|
||||
Input float64 `json:"input"`
|
||||
Output float64 `json:"output"`
|
||||
Base float64 `json:"base"`
|
||||
Finetune float64 `json:"finetune"`
|
||||
}
|
||||
|
||||
// TODO: Use my key everytime, no auth needed
|
||||
func UpdateTogetherModels(c *fiber.Ctx, currentModelInfos []ModelInfo) {
|
||||
url := "https://api.together.xyz/v1/models"
|
||||
|
||||
var apiKey string
|
||||
err := edgeGlobalClient.WithGlobals(map[string]interface{}{"ext::auth::client_token": c.Cookies("jade-edgedb-auth-token")}).QuerySingle(edgeCtx, `
|
||||
with
|
||||
filtered_keys := (
|
||||
select Key {
|
||||
key
|
||||
} filter .company.name = <str>$0 AND .<keys[is Setting].<setting[is User] = global currentUser
|
||||
)
|
||||
select filtered_keys.key limit 1
|
||||
`, &apiKey, "together")
|
||||
if err != nil {
|
||||
logErrorCode.Println("08-00-0000")
|
||||
return
|
||||
}
|
||||
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
if err != nil {
|
||||
logErrorCode.Println("08-01-0001")
|
||||
return
|
||||
}
|
||||
|
||||
req.Header.Set("Accept", "application/json")
|
||||
req.Header.Set("Authorization", "Bearer "+apiKey)
|
||||
|
||||
client := &http.Client{}
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
logErrorCode.Println("08-02-0002")
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
logErrorCode.Println("08-01-0003")
|
||||
return
|
||||
}
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
logErrorCode.Println("08-03-0004 -", resp.Status, "-", string(body))
|
||||
return
|
||||
}
|
||||
|
||||
var togetherModels []TogetherModel
|
||||
err = json.Unmarshal(body, &togetherModels)
|
||||
if err != nil {
|
||||
logErrorCode.Println("08-01-0005")
|
||||
return
|
||||
}
|
||||
|
||||
var exist bool
|
||||
var savedModel ModelInfo
|
||||
var newModelFound bool = false
|
||||
const epsilon = 1e-9
|
||||
|
||||
fmt.Println("Updating Together ModelInfo:")
|
||||
for _, model := range togetherModels {
|
||||
if model.Type == "chat" {
|
||||
exist = false
|
||||
for _, currentModel := range currentModelInfos {
|
||||
if currentModel.ModelID == model.ID {
|
||||
exist = true
|
||||
savedModel = currentModel
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if exist {
|
||||
if math.Abs(model.Pricing.Input/1000000-float64(savedModel.InputPrice)) > epsilon ||
|
||||
math.Abs(model.Pricing.Output/1000000-float64(savedModel.OutputPrice)) > epsilon {
|
||||
fmt.Println("Found one existing model with changed price:", model.ID, ". Updating price from ", float64(savedModel.InputPrice), " to ", model.Pricing.Input/1000000)
|
||||
err = edgeGlobalClient.Execute(edgeCtx, `
|
||||
UPDATE ModelInfo FILTER .modelID = <str>$0 SET { inputPrice := <float32>$1, outputPrice := <float32>$2}
|
||||
`, model.ID, float32(model.Pricing.Input)/1000000, float32(model.Pricing.Output)/1000000)
|
||||
if err != nil {
|
||||
fmt.Println("Error updating price:", err.Error())
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fmt.Println("Found new model:", model.ID)
|
||||
newModelFound = true
|
||||
err = edgeGlobalClient.Execute(edgeCtx, `
|
||||
INSERT ModelInfo { name := "New model, name coming soon...", modelID := <str>$0, inputPrice := <float32>$1, outputPrice := <float32>$2, company := assert_single(( SELECT Company FILTER .name = <str>$3))}
|
||||
`, model.ID, float32(model.Pricing.Input)/1000000, float32(model.Pricing.Output)/1000000, "together")
|
||||
if err != nil {
|
||||
fmt.Println("Error creating new modelInfo:", err.Error())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if newModelFound {
|
||||
SendNoreplyEmail("adrien.bouvais.pro@gmail.com", "New Together models found", "Look like new model have been found, you should name it.")
|
||||
}
|
||||
|
||||
// Delete all unfound models
|
||||
for _, currentModel := range currentModelInfos {
|
||||
if currentModel.Company.Name != "together" {
|
||||
continue
|
||||
}
|
||||
|
||||
exist = false
|
||||
for _, model := range togetherModels {
|
||||
if model.ID == currentModel.ModelID {
|
||||
exist = true
|
||||
}
|
||||
}
|
||||
|
||||
if !exist {
|
||||
fmt.Println("A ModelInfo using this modelID:", currentModel.ModelID, ", was found using a modelID that doesn't exist anymore. Deleting it.")
|
||||
err = edgeGlobalClient.Execute(edgeCtx, `
|
||||
DELETE ModelInfo FILTER .modelID = <str>$0 AND .company.name = <str>$1
|
||||
`, currentModel.ModelID, "together")
|
||||
if err != nil {
|
||||
fmt.Println("Error deleting a ModelInfo with an unfound modelID.")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func UpdateTogetherModelsHandler(c *fiber.Ctx) error {
|
||||
if !IsUserAdmin(c) {
|
||||
return c.SendString("That's for admin, how did you manage to come here ?")
|
||||
}
|
||||
|
||||
var currentModelInfos []ModelInfo
|
||||
err := edgeGlobalClient.Query(edgeCtx, `SELECT ModelInfo { id, name, modelID, inputPrice, outputPrice, company}`, ¤tModelInfos)
|
||||
if err != nil {
|
||||
fmt.Println("Error getting all ModelInfo for updating them")
|
||||
}
|
||||
UpdateTogetherModels(c, currentModelInfos)
|
||||
return c.SendString("Models from together ai updated")
|
||||
}
|
||||
|
7
TODO.md
7
TODO.md
@ -1,12 +1,12 @@
|
||||
# Bugs
|
||||
[ ] Sometime I can redo or edit but the button is not available
|
||||
[X] Sometime I can redo or edit but the button is not available
|
||||
[X] The SSE event that sometime fails after some times. Reconnect when sending a new message.
|
||||
[X] 2 selected messages
|
||||
[X] On first response, code block width are too long
|
||||
[X] Change Terms of service to say that I use one cookie
|
||||
[X] Change the lastSelectedLLMs, 2 users can't use the same time...
|
||||
[X] CTRL + Enter not working
|
||||
[ ] Add all Together AI models
|
||||
[X] Add all Together AI models
|
||||
|
||||
# Features
|
||||
[X] SSE to WebSocket
|
||||
@ -19,7 +19,7 @@
|
||||
[ ] Add login with email and password
|
||||
[ ] Add login with AppleID
|
||||
[ ] Better temperature settings. (Anthropic from 0-1, OpenAI from 0-2, DeepSeek from -2-2, ect)
|
||||
[ ] Auto update the modelsInfos db (At least remove unavailable models and send me an email when new one arrive)
|
||||
[X] Auto update the modelsInfos db (At least remove unavailable models and send me an email when new one arrive)
|
||||
[ ] Encrypt the API keys
|
||||
|
||||
# Opti
|
||||
@ -28,7 +28,6 @@
|
||||
[ ] Look to reduce memory
|
||||
|
||||
# Other
|
||||
[ ] Remove all panic
|
||||
[ ] Change the terms of service and enter keys page to an HTML
|
||||
[X] Use the normal RequestProvider function instead of TestProvider to remove TestProvider
|
||||
[ ] Implement the JADE_IN_DEV env variable to dev locally on my laptop
|
||||
|
Loading…
x
Reference in New Issue
Block a user