diff --git a/.golangci.lint.yml b/.golangci.lint.yml new file mode 100644 index 00000000..bdcd00ae --- /dev/null +++ b/.golangci.lint.yml @@ -0,0 +1,581 @@ +# This file contains all available configuration options +# with their default values. +# 配置文件教程地址 https://golangci-lint.run/usage/configuration + +# options for analysis running +run: + # default concurrency is a available CPU number + concurrency: 4 + + # timeout for analysis, e.g. 30s, 5m, default is 1m + timeout: 5m + + # exit code when at least one issue was found, default is 1 + issues-exit-code: 1 + + # include test files or not, default is true + tests: false + + # list of build tags, all linters use it. Default is empty list. + build-tags: + - mytag + + # which dirs to skip: issues from them won't be reported; + # can use regexp here: generated.*, regexp is applied on full path; + # default value is empty list, but default dirs are skipped independently + # from this option's value (see skip-dirs-use-default). + # "/" will be replaced by current OS file path separator to properly work + # on Windows. + skip-dirs: + - src/external_libs + - autogenerated_by_my_lib + # - config + # - pkg + - "^_.*" + + # default is true. Enables skipping of directories: + # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ + skip-dirs-use-default: true + + # which files to skip: they will be analyzed, but issues from them + # won't be reported. Default value is empty list, but there is + # no need to include all autogenerated files, we confidently recognize + # autogenerated files. If it's not please let us know. + # "/" will be replaced by current OS file path separator to properly work + # on Windows. + skip-files: + - ".*\\.log$" + - .gitlab-ci.yml + - .golangci.lint.yml + + # by default isn't set. If set we pass it to "go list -mod={option}". From "go help modules": + # If invoked with -mod=readonly, the go command is disallowed from the implicit + # automatic updating of go.mod described above. Instead, it fails when any changes + # to go.mod are needed. This setting is most useful to check that go.mod does + # not need updates, such as in a continuous integration and testing system. + # If invoked with -mod=vendor, the go command assumes that the vendor + # directory holds the correct copies of dependencies and ignores + # the dependency descriptions in go.mod. + # modules-download-mode: readonly|release|vendor + + # Allow multiple parallel golangci-lint instances running. + # If false (default) - golangci-lint acquires file lock on start. + allow-parallel-runners: false + +# output configuration options +output: + # colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number" + format: colored-line-number + + # print lines of code with issue, default is true + print-issued-lines: true + + # print linter name in the end of issue text, default is true + print-linter-name: true + + # make issues output unique by line, default is true + uniq-by-line: true + + # add a prefix to the output file references; default is no prefix + path-prefix: "" + +# all available settings of specific linters +linters-settings: + revive: + rules: + - name: indent-error-flow + disabled: true + dogsled: + # checks assignments with too many blank identifiers; default is 2 + max-blank-identifiers: 2 + dupl: + # tokens count to trigger issue, 150 by default + threshold: 200 + errcheck: + # report about not checking of errors in type assertions: `a := b.(MyStruct)`; + # default is false: such cases aren't reported by default. + check-type-assertions: false + + # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`; + # default is false: such cases aren't reported by default. + check-blank: false + + # [deprecated] comma-separated list of pairs of the form pkg:regex + # the regex is used to ignore names within pkg. (default "fmt:.*"). + # see https://github.com/kisielk/errcheck#the-deprecated-method for details + ignore: fmt:.*,io/ioutil:^Read.* + + # path to a file containing a list of functions to exclude from checking + # see https://github.com/kisielk/errcheck#excluding-functions for details + exhaustive: + # indicates that switch statements are to be considered exhaustive if a + # 'default' case is present, even if all enum members aren't listed in the + # switch + default-signifies-exhaustive: true + funlen: + lines: 60 + statements: 40 + gci: + # put imports beginning with prefix after 3rd-party packages; + # only support one prefix + # if not set, use goimports.local-prefixes + local-prefixes: github.com/org/project + gocognit: + # minimal code complexity to report, 30 by default (but we recommend 10-20) + min-complexity: 35 + nestif: + # minimal complexity of if statements to report, 5 by default + min-complexity: 4 + goconst: + # minimal length of string constant, 3 by default + min-len: 3 + # minimal occurrences count to trigger, 3 by default + min-occurrences: 3 + gocritic: + # Which checks should be enabled; can't be combined with 'disabled-checks'; + # See https://go-critic.github.io/overview#checks-overview + # To check which checks are enabled run `GL_DEBUG=gocritic golangci-lint run` + # By default list of stable checks is used. + enabled-checks: + #- rangeValCopy + + # Which checks should be disabled; can't be combined with 'enabled-checks'; default is empty + disabled-checks: + - regexpMust + + # Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks. + # Empty list by default. See https://github.com/go-critic/go-critic#usage -> section "Tags". + enabled-tags: + - performance + disabled-tags: + - experimental + + settings: # settings passed to gocritic + captLocal: # must be valid enabled check name + paramsOnly: true + rangeValCopy: + sizeThreshold: 32 + gocyclo: + # minimal code complexity to report, 30 by default (but we recommend 10-20) + min-complexity: 10 + godot: + # check all top-level comments, not only declarations + check-all: false + godox: + # report any comments starting with keywords, this is useful for TODO or FIXME comments that + # might be left in the code accidentally and should be resolved before merging + keywords: # default keywords are TODO, BUG, and FIXME, these can be overwritten by this setting + - NOTE + - OPTIMIZE # marks code that should be optimized before merging + - HACK # marks hack-arounds that should be removed before merging + gofmt: + # simplify code: gofmt with `-s` option, true by default + simplify: true + goheader: + values: + const: + # define here const type values in format k:v, for example: + # YEAR: 2020 + # COMPANY: MY COMPANY + regexp: + # define here regexp type values, for example + # AUTHOR: .*@mycompany\.com + template: + # put here copyright header template for source code files, for example: + # {{ AUTHOR }} {{ COMPANY }} {{ YEAR }} + # SPDX-License-Identifier: Apache-2.0 + # + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at: + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + template-path: + # also as alternative of directive 'template' you may put the path to file with the template source + goimports: + # put imports beginning with prefix after 3rd-party packages; + # it's a comma-separated list of prefixes + local-prefixes: github.com/org/project + golint: + # minimal confidence for issues, default is 0.8 + min-confidence: 0.8 + gomnd: + settings: + mnd: + # the list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description. + checks: argument,case,condition,operation,return,assign + gomodguard: + allowed: + modules: # List of allowed modules + # - gopkg.in/yaml.v2 + domains: # List of allowed module domains + # - golang.org + blocked: + modules: # List of blocked modules + # - github.com/uudashr/go-module: # Blocked module + # recommendations: # Recommended modules that should be used instead (Optional) + # - golang.org/x/mod + # reason: "`mod` is the official go.mod parser library." # Reason why the recommended module should be used (Optional) + versions: # List of blocked module version constraints + # - github.com/mitchellh/go-homedir: # Blocked module with version constraint + # version: "< 1.1.0" # Version constraint, see https://github.com/Masterminds/semver#basic-comparisons + # reason: "testing if blocked version constraint works." # Reason why the version constraint exists. (Optional) + govet: + # report about shadowed variables + check-shadowing: true + + # settings per analyzer + settings: + printf: # analyzer name, run `go tool vet help` to see all analyzers + funcs: # run `go tool vet help printf` to see available settings for `printf` analyzer + - (github.com/golangci/golangci-lint/pkg/logutils.Log).Infof + - (github.com/golangci/golangci-lint/pkg/logutils.Log).Warnf + - (github.com/golangci/golangci-lint/pkg/logutils.Log).Errorf + - (github.com/golangci/golangci-lint/pkg/logutils.Log).Fatalf + + # enable or disable analyzers by name + enable: + - atomicalign + enable-all: false + disable: + - shadow + disable-all: false + depguard: + list-type: blacklist + include-go-root: false + packages: + # TODO: + # - github.com/sirupsen/logrus + packages-with-error-message: + # specify an error message to output when a blacklisted package is used + # - github.com/sirupsen/logrus: "logging is allowed only by logutils.Log" + lll: + # max line length, lines longer will be reported. Default is 120. + # '\t' is counted as 1 character by default, and can be changed with the tab-width option + line-length: 120 + # tab width in spaces. Default to 1. + tab-width: 4 + gosec: + excludes: + - G301 + - G304 + maligned: + # print struct with more effective memory layout or not, false by default + suggest-new: true + misspell: + # Correct spellings using locale preferences for US or UK. + # Default is to use a neutral variety of English. + # Setting locale to US will correct the British spelling of 'colour' to 'color'. + locale: US + ignore-words: + - gorm + + nakedret: + # make an issue if func has more lines of code than this setting and it has naked returns; default is 30 + max-func-lines: 30 + prealloc: + # XXX: we don't recommend using this linter before doing performance profiling. + # For most programs usage of prealloc will be a premature optimization. + + # Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. + # True by default. + simple: true + range-loops: true # Report preallocation suggestions on range loops, true by default + for-loops: false # Report preallocation suggestions on for loops, false by default + nolintlint: + # Enable to ensure that nolint directives are all used. Default is true. + allow-unused: false + # Disable to ensure that nolint directives don't have a leading space. Default is true. + allow-leading-space: true + # Exclude following linters from requiring an explanation. Default is []. + allow-no-explanation: [] + # Enable to require an explanation of nonzero length after each nolint directive. Default is false. + require-explanation: true + # Enable to require nolint directives to mention the specific linter being suppressed. Default is false. + require-specific: true + rowserrcheck: + packages: + - github.com/jmoiron/sqlx + testpackage: + # regexp pattern to skip files + skip-regexp: (export|internal)_test\.go + unparam: + # Inspect exported functions, default is false. Set to true if no external program/library imports your code. + # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find external interfaces. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + check-exported: false + unused: + # treat code as a program (not a library) and report unused exported identifiers; default is false. + # XXX: if you enable this setting, unused will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find funcs usages. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + check-exported: false + whitespace: + multi-if: false # Enforces newlines (or comments) after every multi-line if statement + multi-func: false # Enforces newlines (or comments) after every multi-line function signature + wsl: + # If true append is only allowed to be cuddled if appending value is + # matching variables, fields or types on line above. Default is true. + strict-append: true + # Allow calls and assignments to be cuddled as long as the lines have any + # matching variables, fields or types. Default is true. + allow-assign-and-call: true + # Allow multiline assignments to be cuddled. Default is true. + allow-multiline-assign: true + # Allow declarations (var) to be cuddled. + allow-cuddle-declarations: false + # Allow trailing comments in ending of blocks + allow-trailing-comment: false + # Force newlines in end of case at this limit (0 = never). + force-case-trailing-whitespace: 0 + # Force cuddling of err checks with err var assignment + force-err-cuddling: false + # Allow leading comments to be separated with empty liens + allow-separated-leading-comment: false + gofumpt: + # Choose whether or not to use the extra rules that are disabled + # by default + extra-rules: false + +linters: + # please, do not use `enable-all`: it's deprecated and will be removed soon. + # inverted configuration with `enable-all` and `disable` is not scalable during updates of golangci-lint + disable-all: true + enable: + - asasalint + - asciicheck + - bidichk + - bodyclose + # - containedctx # even google contains ctx in struct + - contextcheck + # - cyclop # I don't like this linter + # - deadcode # deprecated + - decorder + # - depguard + # - dogsled + - dupl + - dupword + - durationcheck + - errcheck + - errchkjson + - errname + - errorlint + - execinquery + - exhaustive + # - exhaustivestruct # deprecated + # - exhaustruct # useless, there could be some reasons to not use all fields + - exportloopref + # - forbidigo # no need + # - forcetypeassert + # - funlen + # - gci # there is no need to strictly the order of imports + - ginkgolinter + - gocheckcompilerdirectives + # - gochecknoglobals # why not? + # - gochecknoinits # why not? + - gocognit + - goconst + # - gocritic # copy in stack is much faster than heap + # - gocyclo # duplicated with gocognit + # - godot # useless + - godox + - goerr113 + - gofmt + # - gofumpt # gofmt is enough for me + - goheader + - goimports + # - golint # deprecated + # - gomnd # I think a small amount of magic numbers is acceptable + - gomoddirectives + - gomodguard + - goprintffuncname + - gosec + - gosimple + - gosmopolitan + - govet + - grouper + # - ifshort # deprecated + - importas + - ineffassign + # - interfacebloat # thereis currently no need to limit the number of interface methods + # - interfacer # deprecated + # - ireturn # return interface is normal in some cases + - lll + - loggercheck + - maintidx + - makezero + # - maligned # deprecated + - mirror + - misspell + - musttag + # - nakedret # do not limit func len + # - nestif # useless + - nilerr + - nilnil + # - nlreturn # nonsense + - noctx + # - nolintlint # It's too troublesome to write comments for every nolint, and it's not necessary. + # - nonamedreturns # why not? + # - nosnakecase # deprecated + - nosprintfhostport + - paralleltest + - prealloc + - predeclared + - promlinter + - reassign + - revive + - rowserrcheck + # - scopelint # deprecated + - sqlclosecheck + - staticcheck + # - structcheck # deprecated + - stylecheck + - tagalign + # - tagliatelle # wieird linter, I think it's harmful + - tenv + - testableexamples + - testpackage + - thelper + - tparallel + - typecheck + - unconvert + # - unparam # too many false positives + - unused + - usestdlibvars + # - varcheck # deprecated + # - varnamelen # useless, why not use short names? + - wastedassign + - whitespace + # - wrapcheck # too many false positives + # - wsl # subjective style + - zerologlint + fast: false + +issues: + # List of regexps of issue texts to exclude, empty list by default. + # But independently from this option we use default exclude patterns, + # it can be disabled by `exclude-use-default: false`. To list all + # excluded by default patterns execute `golangci-lint run --help` + exclude: + - "ineffectual assignment to `.*` (ineffassign)" #正则排除这lint 错误类型 + - 'shadow: declaration of ".*" shadows declaration' + - "^exported [^ ]* .* should have comment" + - "^comment on" + - "should be" + + # Excluding configuration per-path, per-linter, per-text and per-source + exclude-rules: + # Exclude some linters from running on tests files. + - path: mocks/.*\.go + linters: + - revive + - stylecheck + - lll + - dupl + - gosec + - path: _test\.go + linters: + - revive + - stylecheck + - gocyclo + - dupl + - gosec + - lll + - path: html_.*\.go + linters: + - lll + - path: model/.*\.go + linters: + - lll + + # Exclude known linters from partially hard-vendored code, + # which is impossible to exclude via "nolint" comments. + - linters: + - gosec + text: "G402" + - linters: + - gosec + text: "G501" + - linters: + - gosec + text: "G404" + - linters: + - gosec + text: "G401" + - linters: + - gosec + text: "G505" + # Exclude some staticcheck messages + - linters: + - staticcheck + text: "SA9003:" + + # Exclude lll issues for long lines with go:generate + - linters: + - lll + source: "^//go:generate " + + # Independently from option `exclude` we use default exclude patterns, + # it can be disabled by this option. To list all + # excluded by default patterns execute `golangci-lint run --help`. + # Default value for this option is true. + exclude-use-default: false + + # The default value is false. If set to true exclude and exclude-rules + # regular expressions become case sensitive. + exclude-case-sensitive: false + + # The list of ids of default excludes to include or disable. By default it's empty. + include: + - EXC0002 # disable excluding of issues about comments from golint + + # Maximum issues count per one linter. Set to 0 to disable. Default is 50. + max-issues-per-linter: 0 + + # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. + max-same-issues: 0 + + # Show only new issues: if there are unstaged changes or untracked files, + # only those changes are analyzed, else only changes in HEAD~ are analyzed. + # It's a super-useful option for integration of golangci-lint into existing + # large codebase. It's not practical to fix all existing issues at the moment + # of integration: much better don't allow issues in new code. + # Default is false. + new: false + + # Show only new issues created after git revision `REV` + #new-from-rev: REV + # Show only new issues created in git patch with set file path. + #new-from-patch: path/to/patch/file + +severity: + # Default value is empty string. + # Set the default severity for issues. If severity rules are defined and the issues + # do not match or no severity is provided to the rule this will be the default + # severity applied. Severities should match the supported severity names of the + # selected out format. + # - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity + # - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#severity + # - Github: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message + default-severity: error + + # The default value is false. + # If set to true severity-rules regular expressions become case sensitive. + case-sensitive: false + + # Default value is empty list. + # When a list of severity rules are provided, severity information will be added to lint + # issues. Severity rules have the same filtering capability as exclude rules except you + # are allowed to specify one matcher per severity rule. + # Only affects out formats that support setting severity information. + rules: + - linters: + - dupl + severity: info diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..f29c426a --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +.PHONY: install +install: + go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest + go install golang.org/x/tools/cmd/goimports@latest + go install golang.org/x/vuln/cmd/govulncheck@latest + # go install go.uber.org/nilaway/cmd/nilaway@latest + # go install github.com/mitranim/gow@latest + # go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28 + # go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2 + +.PHONY: lint +lint: + # goimports -local module github.com/songquanpeng/one-api -w . + go mod tidy + gofmt -s -w . + go vet + # nilaway ./... + golangci-lint run -c .golangci.lint.yml + govulncheck ./... diff --git a/common/ctxkey/key.go b/common/ctxkey/key.go index 949d558a..ce93e061 100644 --- a/common/ctxkey/key.go +++ b/common/ctxkey/key.go @@ -1,5 +1,7 @@ package ctxkey +import "github.com/gin-gonic/gin" + const ( Config = "config" Id = "id" @@ -25,7 +27,7 @@ const ( TokenQuotaUnlimited = "token_quota_unlimited" BaseURL = "base_url" AvailableModels = "available_models" - KeyRequestBody = "key_request_body" + KeyRequestBody = gin.BodyBytesKey SystemPrompt = "system_prompt" Meta = "meta" ) diff --git a/common/helper/audio.go b/common/helper/audio.go index 146d9412..a63ea024 100644 --- a/common/helper/audio.go +++ b/common/helper/audio.go @@ -33,7 +33,7 @@ func SaveTmpFile(filename string, data io.Reader) (string, error) { } // GetAudioTokens returns the number of tokens in an audio file. -func GetAudioTokens(ctx context.Context, audio io.Reader, tokensPerSecond int) (int, error) { +func GetAudioTokens(ctx context.Context, audio io.Reader, tokensPerSecond float64) (int, error) { filename, err := SaveTmpFile("audio", audio) if err != nil { return 0, errors.Wrap(err, "failed to save audio to temporary file") @@ -45,7 +45,7 @@ func GetAudioTokens(ctx context.Context, audio io.Reader, tokensPerSecond int) ( return 0, errors.Wrap(err, "failed to get audio tokens") } - return int(math.Ceil(duration)) * tokensPerSecond, nil + return int(math.Ceil(duration * tokensPerSecond)), nil } // GetAudioDuration returns the duration of an audio file in seconds. diff --git a/controller/channel-test.go b/controller/channel-test.go index ed755d28..6a5d4eef 100644 --- a/controller/channel-test.go +++ b/controller/channel-test.go @@ -49,7 +49,7 @@ func testChannel(channel *model.Channel, request *relaymodel.GeneralOpenAIReques w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) c.Request = &http.Request{ - Method: "POST", + Method: http.MethodPost, URL: &url.URL{Path: "/v1/chat/completions"}, Body: nil, Header: make(http.Header), diff --git a/relay/billing/ratio/model.go b/relay/billing/ratio/model.go index a72348c9..c9394162 100644 --- a/relay/billing/ratio/model.go +++ b/relay/billing/ratio/model.go @@ -3,7 +3,6 @@ package ratio import ( "encoding/json" "fmt" - "math" "strings" "github.com/songquanpeng/one-api/common/logger" @@ -396,7 +395,7 @@ var AudioPromptTokensPerSecond = map[string]float64{ // GetAudioPromptTokensPerSecond returns the number of audio tokens per second // for the given model. -func GetAudioPromptTokensPerSecond(actualModelName string) int { +func GetAudioPromptTokensPerSecond(actualModelName string) float64 { var v float64 if tokensPerSecond, ok := AudioPromptTokensPerSecond[actualModelName]; ok { v = tokensPerSecond @@ -404,7 +403,7 @@ func GetAudioPromptTokensPerSecond(actualModelName string) int { v = 10 } - return int(math.Ceil(v)) + return v } var CompletionRatio = map[string]float64{ diff --git a/web/default/src/components/ChannelsTable.js b/web/default/src/components/ChannelsTable.js index 38a180d5..f738ef52 100644 --- a/web/default/src/components/ChannelsTable.js +++ b/web/default/src/components/ChannelsTable.js @@ -380,14 +380,14 @@ const ChannelsTable = () => { setShowPrompt(false); setPromptShown(promptID); }}> - OpenAI Channel已经不再支持通过 key 获取Balance,因此Balance显示为 0。对于支持的ChannelType,请点击Balance进行Refresh。 + OpenAI Channel no longer supports getting Balance via key, so Balance is shown as 0. For supported ChannelTypes, please click Balance to Refresh.
- ChannelTest仅支持 chat Model,优先使用 gpt-3.5-turbo,如果该Model不可用则使用你所配置的Model列表中的第一个Model。 + ChannelTest only supports chat Models, preferring gpt-3.5-turbo. If this Model is not available, it will use the first Model in your configured Model list.
- 点击下方Details按钮可以显示Balance以及Settings额外的TestModel。 + Click the Details button below to display Balance and additional TestModel Settings. - ) - } + ) + } @@ -454,7 +454,7 @@ const ChannelsTable = () => { sortChannel('priority'); }} > - 优先级 + Priority Operation @@ -491,7 +491,7 @@ const ChannelsTable = () => { }} style={{ cursor: 'pointer' }}> {renderBalance(channel.type, channel.balance)} } - content='点击更新' + content='Click to refresh' basic /> @@ -507,8 +507,7 @@ const ChannelsTable = () => { }}> } - content='Channel选择优先级,越高越优先' - basic + content='Channel priority - higher value means higher priority' />