Skip to content

Commit 77d2d8f

Browse files
committed
feat: use gox mod
1 parent 32df2f1 commit 77d2d8f

27 files changed

Lines changed: 437 additions & 751 deletions

File tree

cmd/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ package main
22

33
import (
44
"devtools/internal"
5-
"github.com/rs/zerolog/log"
5+
"log"
66
)
77

88
func main() {
99
if err := internal.NewApp().Run(); err != nil {
10-
log.Panic().Err(err).Send()
10+
log.Fatal(err)
1111
}
1212
}

go.mod

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,16 @@
11
module devtools
22

3-
go 1.24.2
3+
go 1.25.5
44

55
require (
66
github.com/caarlos0/env/v11 v11.3.1
7-
github.com/labstack/echo/v4 v4.13.4
8-
github.com/rs/zerolog v1.34.0
9-
github.com/tidwall/gjson v1.18.0
7+
github.com/labstack/echo/v5 v5.0.0-20260106091252-d6cb58b5c24e
8+
github.com/sunls24/gox v0.0.0-20260106134450-97efb021117e
109
)
1110

1211
require (
13-
github.com/labstack/gommon v0.4.2 // indirect
14-
github.com/mattn/go-colorable v0.1.14 // indirect
15-
github.com/mattn/go-isatty v0.0.20 // indirect
16-
github.com/tidwall/match v1.1.1 // indirect
12+
github.com/tidwall/gjson v1.18.0 // indirect
13+
github.com/tidwall/match v1.2.0 // indirect
1714
github.com/tidwall/pretty v1.2.1 // indirect
18-
github.com/valyala/bytebufferpool v1.0.0 // indirect
19-
github.com/valyala/fasttemplate v1.2.2 // indirect
20-
golang.org/x/crypto v0.39.0 // indirect
21-
golang.org/x/net v0.41.0 // indirect
22-
golang.org/x/sys v0.33.0 // indirect
23-
golang.org/x/text v0.26.0 // indirect
24-
golang.org/x/time v0.12.0 // indirect
15+
golang.org/x/time v0.14.0 // indirect
2516
)

go.sum

Lines changed: 14 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,28 @@
11
github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5mCA=
22
github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U=
3-
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
43
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
54
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6-
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
7-
github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY=
8-
github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g=
9-
github.com/labstack/echo/v4 v4.13.4 h1:oTZZW+T3s9gAu5L8vmzihV7/lkXGZuITzTQkTEhcXEA=
10-
github.com/labstack/echo/v4 v4.13.4/go.mod h1:g63b33BZ5vZzcIUF8AtRH40DrTlXnx4UMC8rBdndmjQ=
11-
github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=
12-
github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU=
13-
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
14-
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
15-
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
16-
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
17-
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
18-
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
19-
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
20-
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
5+
github.com/labstack/echo/v5 v5.0.0-20260106091252-d6cb58b5c24e h1:QFu8S1iZijCXEUcP8u/h+JtZYlekbt0VIndrKbT/VAo=
6+
github.com/labstack/echo/v5 v5.0.0-20260106091252-d6cb58b5c24e/go.mod h1:5La3y+CVfH4IzVRlQA2LmK+clJEniclmzbqSyZIhsP4=
217
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
228
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
23-
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
24-
github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY=
25-
github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ=
26-
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
27-
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
9+
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
10+
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
11+
github.com/sunls24/gox v0.0.0-20260106134450-97efb021117e h1:zBW4ortGTSCrWF5EmwwHjRZxYRCYQ94Ca6xjSp/TE20=
12+
github.com/sunls24/gox v0.0.0-20260106134450-97efb021117e/go.mod h1:IWnNRydHKz1iaPecvzOyWBPDyKLrC4NDtEvhBlUgzhw=
2813
github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
2914
github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
30-
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
3115
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
16+
github.com/tidwall/match v1.2.0 h1:0pt8FlkOwjN2fPt4bIl4BoNxb98gGHN2ObFEDkrfZnM=
17+
github.com/tidwall/match v1.2.0/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
3218
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
3319
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
3420
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
35-
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
36-
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
37-
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
38-
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
39-
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
40-
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
41-
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
42-
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
43-
golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
44-
golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
45-
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
46-
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
47-
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
48-
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
49-
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
50-
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
51-
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
52-
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
53-
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
54-
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
55-
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
56-
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
57-
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
58-
golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
59-
golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
60-
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
61-
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
21+
golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
22+
golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
23+
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
24+
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
25+
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
26+
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
6227
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
6328
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

internal/api/api.go

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,33 @@
11
package api
22

33
import (
4-
"devtools/internal/openai"
5-
"strings"
4+
"context"
5+
"devtools/config"
6+
7+
"github.com/labstack/echo/v5"
8+
"github.com/sunls24/gox/openai"
69
)
710

8-
func Crontab(ctx *Context) error {
9-
desc := ctx.QueryParam("desc")
10-
if strings.TrimSpace(desc) == "" {
11-
return nil
12-
}
13-
resp, err := ctx.oai.Chat(ctx.Request().Context(), openai.ReqChat{
14-
Stream: false,
15-
Model: ctx.cfg.OpenAI.Model,
16-
Messages: buildPrompt(desc),
17-
Temperature: 0,
18-
})
19-
if err != nil {
20-
return ctx.ErrMsg(err, "调用 AI 生成异常")
11+
type configKey struct{}
12+
type oaiKey struct{}
13+
14+
func Middleware(cfg *config.Config) echo.MiddlewareFunc {
15+
oai := openai.New(cfg.OpenAI.BaseURL, cfg.OpenAI.APIKey)
16+
return func(next echo.HandlerFunc) echo.HandlerFunc {
17+
return func(c *echo.Context) error {
18+
ctx := c.Request().Context()
19+
ctx = context.WithValue(ctx, configKey{}, cfg)
20+
ctx = context.WithValue(ctx, oaiKey{}, oai)
21+
c.SetRequest(c.Request().WithContext(ctx))
22+
return next(c)
23+
}
2124
}
22-
return ctx.Data(resp.Message.Content)
2325
}
2426

25-
func buildPrompt(desc string) []openai.Message {
26-
return []openai.Message{
27-
{
28-
Role: openai.RSystem,
29-
Content: "You are a professional Crontab generator. Don't do any interpretation, just reply to the expression. If the user sends a crontab, it is returned as is.",
30-
},
31-
{
32-
Role: openai.RUser,
33-
Content: desc,
34-
},
35-
}
27+
func Config(ctx context.Context) *config.Config {
28+
return ctx.Value(configKey{}).(*config.Config)
29+
}
30+
31+
func OAI(ctx context.Context) *openai.OpenAI {
32+
return ctx.Value(oaiKey{}).(*openai.OpenAI)
3633
}

internal/api/context.go

Lines changed: 0 additions & 73 deletions
This file was deleted.

internal/app.go

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@ import (
66
"devtools/internal/route"
77
"devtools/web"
88
"fmt"
9-
"github.com/labstack/echo/v4"
10-
"github.com/labstack/echo/v4/middleware"
11-
"github.com/rs/zerolog"
12-
"github.com/rs/zerolog/log"
13-
"os"
9+
"log/slog"
10+
11+
"github.com/labstack/echo/v5"
12+
"github.com/sunls24/gox/server"
1413
)
1514

1615
type App struct {
@@ -20,28 +19,12 @@ func NewApp() App {
2019
return App{}
2120
}
2221

23-
func (App) init() {
24-
log.Logger = log.Logger.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: "06-01-02 15:04:05"})
25-
}
26-
2722
func (app App) Run() error {
28-
app.init()
2923
cfg := config.MustNew()
30-
31-
e := echo.New()
32-
e.Use(api.Middleware(cfg))
33-
e.Use(middleware.RecoverWithConfig(middleware.RecoverConfig{
34-
DisablePrintStack: true,
35-
}))
36-
e.HTTPErrorHandler = func(err error, c echo.Context) {
37-
e.DefaultHTTPErrorHandler(err, c)
38-
//goland:noinspection GoTypeAssertionOnErrors
39-
if _, ok := err.(*echo.HTTPError); !ok {
40-
log.Err(err).Send()
41-
}
42-
}
43-
44-
route.Register(e)
45-
e.StaticFS("/", echo.MustSubFS(web.FS, "dist"))
46-
return e.Start(fmt.Sprintf("%s:%s", cfg.Host, cfg.Port))
24+
return server.Start(fmt.Sprintf("%s:%s", cfg.Host, cfg.Port), func(e *echo.Echo) {
25+
e.Logger = slog.Default()
26+
e.StaticFS("/", echo.MustSubFS(web.FS, "dist"))
27+
e.Use(api.Middleware(cfg))
28+
route.Register(e)
29+
})
4730
}

internal/client/client.go

Lines changed: 0 additions & 67 deletions
This file was deleted.

internal/constant/constant.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1 @@
11
package constant
2-
3-
const (
4-
ThinkStart = "<think>"
5-
ThinkEnd = "</think>"
6-
)

0 commit comments

Comments
 (0)