diff --git a/misc/test/curl.sh b/misc/test/curl.sh index 22cfa81..e00549c 100755 --- a/misc/test/curl.sh +++ b/misc/test/curl.sh @@ -1,6 +1,6 @@ #!/bin/bash -curl http://localhost:21035/v1/engines/text-embedding-ada-002/embeddings \ +curl http://localhost:22035/v1/engines/text-embedding-ada-002/embeddings \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OPENAI_API_KEY" \ - -d '{"input": ["\u80fd\u91cf\u793c\u7269\u662f\u600e\u4e48\u56de\u4e8b\uff1f\u7528\u4e2d\u6587"], "encoding_format": "base64"}' + -d '{"input":["\u80fd\u91cf\u793c\u7269\u662f\u600e\u4e48\u56de\u4e8b\uff1f\u7528\u4e2d\u6587"], "encoding_format": "base64"}' diff --git a/server/src/config/config.go b/server/src/config/config.go index d38da25..3a2ff67 100644 --- a/server/src/config/config.go +++ b/server/src/config/config.go @@ -10,7 +10,7 @@ var ( WebAddr = `localhost:22035` - RemoteAPI = `https://api.openai.com` + OpenAIBase = `https://api.openai.com` OpenAIKey = `` ) diff --git a/server/src/config/init.go b/server/src/config/init.go index f70df87..94e6ec7 100644 --- a/server/src/config/init.go +++ b/server/src/config/init.go @@ -1,6 +1,8 @@ package config import ( + "fmt" + "net/url" "os" "path/filepath" ) @@ -22,4 +24,10 @@ func init() { *v = s } } + + _, err := url.Parse(OpenAIBase) + if err != nil { + fmt.Println(`OpenAI base URL is invalid.`) + panic(err) + } } diff --git a/server/src/core/fetch.go b/server/src/core/fetch.go index f3bd03c..2d6ba85 100644 --- a/server/src/core/fetch.go +++ b/server/src/core/fetch.go @@ -2,22 +2,22 @@ package core import ( "bytes" + "fmt" "io" "net/http" "net/url" "project/config" - "project/pb" - "project/zj" + "project/util" "time" ) -func fetchRemote(r *pb.Req) (ab []byte, err error) { +func (pr *row) fetchRemote() (ab []byte, ok bool, err error) { - u, err := url.Parse(config.RemoteAPI) - if err != nil { - zj.W(`url fail`, config.RemoteAPI, err) - return - } + r := pr.req + var b bytes.Buffer + pr.failLog = &b + + u, _ := url.Parse(config.OpenAIBase) u.Path = r.Path req, err := http.NewRequest(r.Method, u.String(), bytes.NewReader(r.Body)) @@ -25,6 +25,17 @@ func fetchRemote(r *pb.Req) (ab []byte, err error) { return } + b.WriteString(pr.hr.URL.String()) + b.WriteString("\n\nreq header:\n\n") + for k, v := range pr.hr.Header { + fmt.Fprintf(&b, "\t%s: %v\n", k, v) + } + b.WriteString("\n") + fmt.Fprintf(&b, "req body: %d\n\n", len(r.Body)) + if len(r.Body) > 0 { + fmt.Fprintf(&b, "%s\n\n", r.Body) + } + req.Header.Set(`Content-Type`, `application/json`) req.Header.Set(`Authorization`, `Bearer `+config.OpenAIKey) @@ -33,14 +44,35 @@ func fetchRemote(r *pb.Req) (ab []byte, err error) { } rsp, err := client.Do(req) if err != nil { + fmt.Fprintf(&b, "client.Do fail: %s\n", err.Error()) return } - for k, v := range rsp.Header { - zj.J(k, v) + if rsp.StatusCode >= 200 || rsp.StatusCode < 300 { + // ok = true + } else { + err = fmt.Errorf(`status code fail: %d`, rsp.StatusCode) + b.WriteString(err.Error()) } + b.WriteString("req header:\n\n") + for k, v := range rsp.Header { + fmt.Fprintf(&b, "\t%s: %v\n", k, v) + } + b.WriteString("\n") + ab, err = io.ReadAll(rsp.Body) + if err != nil { + fmt.Fprintf(&b, "rsp body: %d %v\n\n", len(ab), err) + b.Write(ab) + } + rsp.Body.Close() return } + +func writeFailLog(hash [16]byte, ab []byte) { + date := time.Now().Format(`0102-150405`) + file := fmt.Sprintf(`fail/%s-%x.txt`, date, hash) + util.WriteFile(file, ab) +} diff --git a/server/src/core/row.go b/server/src/core/row.go index 2283cc2..a804313 100644 --- a/server/src/core/row.go +++ b/server/src/core/row.go @@ -1,6 +1,7 @@ package core import ( + "bytes" "fmt" "net/http" "project/pb" @@ -11,14 +12,15 @@ import ( ) type row struct { - hash [16]byte - hr *http.Request - req *pb.Req - rsp []byte - err error - done bool - t time.Time - mux sync.RWMutex + hash [16]byte + hr *http.Request + req *pb.Req + rsp []byte + err error + done bool + t time.Time + mux sync.RWMutex + failLog *bytes.Buffer } func (pr *row) run() { @@ -28,10 +30,16 @@ func (pr *row) run() { s := fmt.Sprintf(`%x, %s`, pr.hash, pr.t.Format(`2006-01-02 15:04:05`)) zj.J(`new`, s) - pr.rsp, pr.err = fetchRemote(pr.req) + var ok bool + pr.rsp, ok, pr.err = pr.fetchRemote() + if pr.err == nil && ok { + pr.failLog.Reset() + } else { + go writeFailLog(pr.hash, pr.failLog.Bytes()) + } go pr.saveFile() - go pr.metrics() + // go pr.metrics() pr.done = true pr.mux.Unlock() @@ -48,6 +56,3 @@ func (pr *row) saveFile() { rspFile := rspCacheFile(pr.req) util.WriteFile(rspFile, pr.rsp) } - -func (pr *row) metrics() { -} diff --git a/server/src/project.go b/server/src/project.go index d98d091..cc8f201 100644 --- a/server/src/project.go +++ b/server/src/project.go @@ -3,6 +3,7 @@ package project import ( "project/build" "project/config" + "project/tmptest" "project/web" "project/zj" @@ -16,6 +17,8 @@ func Start() { zj.Init() + tmptest.Test() + go web.Server() life.Wait() diff --git a/server/src/tmptest/t.go b/server/src/tmptest/t.go new file mode 100644 index 0000000..2b772aa --- /dev/null +++ b/server/src/tmptest/t.go @@ -0,0 +1,35 @@ +package tmptest + +import ( + "fmt" + "io" + "log" + "net/http" + "project/zj" +) + +// Test ... +func Test() { + fetch() +} + +func fetch() { + + client := &http.Client{} + req, err := http.NewRequest("GET", "http://10.0.84.49/e500", nil) + if err != nil { + log.Fatal(err) + } + resp, err := client.Do(req) + if err != nil { + log.Fatal(err) + } + defer resp.Body.Close() + bodyText, err := io.ReadAll(resp.Body) + if err != nil { + log.Fatal(err) + } + zj.J(`StatusCode`, resp.StatusCode) + fmt.Printf("%s\n", bodyText) + +}