Merge commit '2369025842b828ac38f4427fd1ebab8d03b1fe7f'

This commit is contained in:
Laisky.Cai
2024-04-20 01:07:29 +00:00
139 changed files with 2642 additions and 2625 deletions

View File

@@ -5,7 +5,7 @@ permissions:
on: on:
push: push:
tags: tags:
- '*' - 'v*.*.*'
- '!*-alpha*' - '!*-alpha*'
workflow_dispatch: workflow_dispatch:
inputs: inputs:
@@ -44,7 +44,7 @@ jobs:
- name: Build Backend (amd64) - name: Build Backend (amd64)
run: | run: |
go mod download go mod download
go build -ldflags "-s -w -X 'github.com/songquanpeng/one-api/common.Version=$(git describe --tags)' -extldflags '-static'" -o one-api go build -ldflags "-s -w -X 'github.com/Laisky/one-api/common.Version=$(git describe --tags)' -extldflags '-static'" -o one-api
- name: Build Backend (arm64) - name: Build Backend (arm64)
run: | run: |

View File

@@ -5,7 +5,7 @@ permissions:
on: on:
push: push:
tags: tags:
- '*' - 'v*.*.*'
- '!*-alpha*' - '!*-alpha*'
workflow_dispatch: workflow_dispatch:
inputs: inputs:
@@ -44,7 +44,7 @@ jobs:
- name: Build Backend - name: Build Backend
run: | run: |
go mod download go mod download
go build -ldflags "-X 'github.com/songquanpeng/one-api/common.Version=$(git describe --tags)'" -o one-api-macos go build -ldflags "-X 'github.com/Laisky/one-api/common.Version=$(git describe --tags)'" -o one-api-macos
- name: Release - name: Release
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/') if: startsWith(github.ref, 'refs/tags/')

View File

@@ -5,7 +5,7 @@ permissions:
on: on:
push: push:
tags: tags:
- '*' - 'v*.*.*'
- '!*-alpha*' - '!*-alpha*'
workflow_dispatch: workflow_dispatch:
inputs: inputs:
@@ -47,7 +47,7 @@ jobs:
- name: Build Backend - name: Build Backend
run: | run: |
go mod download go mod download
go build -ldflags "-s -w -X 'github.com/songquanpeng/one-api/common.Version=$(git describe --tags)'" -o one-api.exe go build -ldflags "-s -w -X 'github.com/Laisky/one-api/common.Version=$(git describe --tags)'" -o one-api.exe
- name: Release - name: Release
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/') if: startsWith(github.ref, 'refs/tags/')

View File

@@ -23,7 +23,7 @@ ADD go.mod go.sum ./
RUN go mod download RUN go mod download
COPY . . COPY . .
COPY --from=builder /web/build ./web/build COPY --from=builder /web/build ./web/build
RUN go build -ldflags "-s -w -X 'github.com/songquanpeng/one-api/common.Version=$(cat VERSION)' -extldflags '-static'" -o one-api RUN go build -ldflags "-s -w -X 'github.com/Laisky/one-api/common.Version=$(cat VERSION)' -extldflags '-static'" -o one-api
FROM debian:bullseye FROM debian:bullseye

View File

@@ -3,7 +3,7 @@
</p> </p>
<p align="center"> <p align="center">
<a href="https://github.com/songquanpeng/one-api"><img src="https://raw.githubusercontent.com/songquanpeng/one-api/main/web/default/public/logo.png" width="150" height="150" alt="one-api logo"></a> <a href="https://github.com/Laisky/one-api"><img src="https://raw.githubusercontent.com/songquanpeng/one-api/main/web/default/public/logo.png" width="150" height="150" alt="one-api logo"></a>
</p> </p>
<div align="center"> <div align="center">
@@ -18,17 +18,17 @@ _✨ Access all LLM through the standard OpenAI API format, easy to deploy & use
<a href="https://raw.githubusercontent.com/songquanpeng/one-api/main/LICENSE"> <a href="https://raw.githubusercontent.com/songquanpeng/one-api/main/LICENSE">
<img src="https://img.shields.io/github/license/songquanpeng/one-api?color=brightgreen" alt="license"> <img src="https://img.shields.io/github/license/songquanpeng/one-api?color=brightgreen" alt="license">
</a> </a>
<a href="https://github.com/songquanpeng/one-api/releases/latest"> <a href="https://github.com/Laisky/one-api/releases/latest">
<img src="https://img.shields.io/github/v/release/songquanpeng/one-api?color=brightgreen&include_prereleases" alt="release"> <img src="https://img.shields.io/github/v/release/songquanpeng/one-api?color=brightgreen&include_prereleases" alt="release">
</a> </a>
<a href="https://hub.docker.com/repository/docker/justsong/one-api"> <a href="https://hub.docker.com/repository/docker/justsong/one-api">
<img src="https://img.shields.io/docker/pulls/justsong/one-api?color=brightgreen" alt="docker pull"> <img src="https://img.shields.io/docker/pulls/justsong/one-api?color=brightgreen" alt="docker pull">
</a> </a>
<a href="https://github.com/songquanpeng/one-api/releases/latest"> <a href="https://github.com/Laisky/one-api/releases/latest">
<img src="https://img.shields.io/github/downloads/songquanpeng/one-api/total?color=brightgreen&include_prereleases" alt="release"> <img src="https://img.shields.io/github/downloads/songquanpeng/one-api/total?color=brightgreen&include_prereleases" alt="release">
</a> </a>
<a href="https://goreportcard.com/report/github.com/songquanpeng/one-api"> <a href="https://goreportcard.com/report/github.com/Laisky/one-api">
<img src="https://goreportcard.com/badge/github.com/songquanpeng/one-api" alt="GoReportCard"> <img src="https://goreportcard.com/badge/github.com/Laisky/one-api" alt="GoReportCard">
</a> </a>
</p> </p>
@@ -37,7 +37,7 @@ _✨ Access all LLM through the standard OpenAI API format, easy to deploy & use
· ·
<a href="#usage">Usage</a> <a href="#usage">Usage</a>
· ·
<a href="https://github.com/songquanpeng/one-api/issues">Feedback</a> <a href="https://github.com/Laisky/one-api/issues">Feedback</a>
· ·
<a href="#screenshots">Screenshots</a> <a href="#screenshots">Screenshots</a>
· ·
@@ -129,9 +129,9 @@ sudo service nginx restart
The initial account username is `root` and password is `123456`. The initial account username is `root` and password is `123456`.
### Manual Deployment ### Manual Deployment
1. Download the executable file from [GitHub Releases](https://github.com/songquanpeng/one-api/releases/latest) or compile from source: 1. Download the executable file from [GitHub Releases](https://github.com/Laisky/one-api/releases/latest) or compile from source:
```shell ```shell
git clone https://github.com/songquanpeng/one-api.git git clone https://github.com/Laisky/one-api.git
# Build the frontend # Build the frontend
cd one-api/web/default cd one-api/web/default
@@ -164,9 +164,9 @@ For more detailed deployment tutorials, please refer to [this page](https://iama
Please refer to the [environment variables](#environment-variables) section for details on using environment variables. Please refer to the [environment variables](#environment-variables) section for details on using environment variables.
### Deployment on Control Panels (e.g., Baota) ### Deployment on Control Panels (e.g., Baota)
Refer to [#175](https://github.com/songquanpeng/one-api/issues/175) for detailed instructions. Refer to [#175](https://github.com/Laisky/one-api/issues/175) for detailed instructions.
If you encounter a blank page after deployment, refer to [#97](https://github.com/songquanpeng/one-api/issues/97) for possible solutions. If you encounter a blank page after deployment, refer to [#97](https://github.com/Laisky/one-api/issues/97) for possible solutions.
### Deployment on Third-Party Platforms ### Deployment on Third-Party Platforms
<details> <details>

View File

@@ -3,7 +3,7 @@
</p> </p>
<p align="center"> <p align="center">
<a href="https://github.com/songquanpeng/one-api"><img src="https://raw.githubusercontent.com/songquanpeng/one-api/main/web/default/public/logo.png" width="150" height="150" alt="one-api logo"></a> <a href="https://github.com/Laisky/one-api"><img src="https://raw.githubusercontent.com/songquanpeng/one-api/main/web/default/public/logo.png" width="150" height="150" alt="one-api logo"></a>
</p> </p>
<div align="center"> <div align="center">
@@ -18,17 +18,17 @@ _✨ 標準的な OpenAI API フォーマットを通じてすべての LLM に
<a href="https://raw.githubusercontent.com/songquanpeng/one-api/main/LICENSE"> <a href="https://raw.githubusercontent.com/songquanpeng/one-api/main/LICENSE">
<img src="https://img.shields.io/github/license/songquanpeng/one-api?color=brightgreen" alt="license"> <img src="https://img.shields.io/github/license/songquanpeng/one-api?color=brightgreen" alt="license">
</a> </a>
<a href="https://github.com/songquanpeng/one-api/releases/latest"> <a href="https://github.com/Laisky/one-api/releases/latest">
<img src="https://img.shields.io/github/v/release/songquanpeng/one-api?color=brightgreen&include_prereleases" alt="release"> <img src="https://img.shields.io/github/v/release/songquanpeng/one-api?color=brightgreen&include_prereleases" alt="release">
</a> </a>
<a href="https://hub.docker.com/repository/docker/justsong/one-api"> <a href="https://hub.docker.com/repository/docker/justsong/one-api">
<img src="https://img.shields.io/docker/pulls/justsong/one-api?color=brightgreen" alt="docker pull"> <img src="https://img.shields.io/docker/pulls/justsong/one-api?color=brightgreen" alt="docker pull">
</a> </a>
<a href="https://github.com/songquanpeng/one-api/releases/latest"> <a href="https://github.com/Laisky/one-api/releases/latest">
<img src="https://img.shields.io/github/downloads/songquanpeng/one-api/total?color=brightgreen&include_prereleases" alt="release"> <img src="https://img.shields.io/github/downloads/songquanpeng/one-api/total?color=brightgreen&include_prereleases" alt="release">
</a> </a>
<a href="https://goreportcard.com/report/github.com/songquanpeng/one-api"> <a href="https://goreportcard.com/report/github.com/Laisky/one-api">
<img src="https://goreportcard.com/badge/github.com/songquanpeng/one-api" alt="GoReportCard"> <img src="https://goreportcard.com/badge/github.com/Laisky/one-api" alt="GoReportCard">
</a> </a>
</p> </p>
@@ -37,7 +37,7 @@ _✨ 標準的な OpenAI API フォーマットを通じてすべての LLM に
· ·
<a href="#usage">使用方法</a> <a href="#usage">使用方法</a>
· ·
<a href="https://github.com/songquanpeng/one-api/issues">フィードバック</a> <a href="https://github.com/Laisky/one-api/issues">フィードバック</a>
· ·
<a href="#screenshots">スクリーンショット</a> <a href="#screenshots">スクリーンショット</a>
· ·
@@ -130,9 +130,9 @@ sudo service nginx restart
初期アカウントのユーザー名は `root` で、パスワードは `123456` です。 初期アカウントのユーザー名は `root` で、パスワードは `123456` です。
### マニュアルデプロイ ### マニュアルデプロイ
1. [GitHub Releases](https://github.com/songquanpeng/one-api/releases/latest) から実行ファイルをダウンロードする、もしくはソースからコンパイルする: 1. [GitHub Releases](https://github.com/Laisky/one-api/releases/latest) から実行ファイルをダウンロードする、もしくはソースからコンパイルする:
```shell ```shell
git clone https://github.com/songquanpeng/one-api.git git clone https://github.com/Laisky/one-api.git
# フロントエンドのビルド # フロントエンドのビルド
cd one-api/web/default cd one-api/web/default
@@ -165,9 +165,9 @@ sudo service nginx restart
Please refer to the [environment variables](#environment-variables) section for details on using environment variables. Please refer to the [environment variables](#environment-variables) section for details on using environment variables.
### コントロールパネル(例: Baotaへの展開 ### コントロールパネル(例: Baotaへの展開
詳しい手順は [#175](https://github.com/songquanpeng/one-api/issues/175) を参照してください。 詳しい手順は [#175](https://github.com/Laisky/one-api/issues/175) を参照してください。
配置後に空白のページが表示される場合は、[#97](https://github.com/songquanpeng/one-api/issues/97) を参照してください。 配置後に空白のページが表示される場合は、[#97](https://github.com/Laisky/one-api/issues/97) を参照してください。
### サードパーティプラットフォームへのデプロイ ### サードパーティプラットフォームへのデプロイ
<details> <details>

View File

@@ -7,3 +7,4 @@ docker image: `ppcelery/one-api:latest`
- update token usage by API - update token usage by API
- support gpt-vision - support gpt-vision
- support update user's remained quota - support update user's remained quota
- support aws claude

View File

@@ -10,7 +10,7 @@ import (
"sync" "sync"
"time" "time"
"github.com/songquanpeng/one-api/common/env" "github.com/Laisky/one-api/common/env"
) )
func init() { func init() {

View File

@@ -6,4 +6,7 @@ const (
KeyAPIVersion = KeyPrefix + "api_version" KeyAPIVersion = KeyPrefix + "api_version"
KeyLibraryID = KeyPrefix + "library_id" KeyLibraryID = KeyPrefix + "library_id"
KeyPlugin = KeyPrefix + "plugin" KeyPlugin = KeyPrefix + "plugin"
KeySK = KeyPrefix + "sk"
KeyAK = KeyPrefix + "ak"
KeyRegion = KeyPrefix + "region"
) )

7
common/ctxkey/key.go Normal file
View File

@@ -0,0 +1,7 @@
package ctxkey
var (
RequestModel = "request_model"
ConvertedRequest = "converted_request"
OriginalModel = "original_model"
)

View File

@@ -1,7 +1,7 @@
package common package common
import ( import (
"github.com/songquanpeng/one-api/common/env" "github.com/Laisky/one-api/common/env"
) )
var UsingSQLite = false var UsingSQLite = false

View File

@@ -10,7 +10,7 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/songquanpeng/one-api/common/random" "github.com/Laisky/one-api/common/random"
) )
func OpenBrowser(url string) { func OpenBrowser(url string) {

View File

@@ -12,7 +12,7 @@ import (
"strings" "strings"
"testing" "testing"
img "github.com/songquanpeng/one-api/common/image" img "github.com/Laisky/one-api/common/image"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
_ "golang.org/x/image/webp" _ "golang.org/x/image/webp"

View File

@@ -3,8 +3,8 @@ package common
import ( import (
"flag" "flag"
"fmt" "fmt"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/logger" "github.com/Laisky/one-api/common/logger"
"log" "log"
"os" "os"
"path/filepath" "path/filepath"
@@ -20,7 +20,7 @@ var (
func printHelp() { func printHelp() {
fmt.Println("One API " + Version + " - All in one API service for OpenAI API.") fmt.Println("One API " + Version + " - All in one API service for OpenAI API.")
fmt.Println("Copyright (C) 2023 JustSong. All rights reserved.") fmt.Println("Copyright (C) 2023 JustSong. All rights reserved.")
fmt.Println("GitHub: https://github.com/songquanpeng/one-api") fmt.Println("GitHub: https://github.com/Laisky/one-api")
fmt.Println("Usage: one-api [--port <port>] [--log-dir <log directory>] [--version] [--help]") fmt.Println("Usage: one-api [--port <port>] [--log-dir <log directory>] [--version] [--help]")
} }

View File

@@ -3,9 +3,9 @@ package logger
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/common/helper"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/helper"
"io" "io"
"log" "log"
"os" "os"

View File

@@ -10,7 +10,7 @@ import (
"time" "time"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
) )
func SendEmail(subject string, receiver string, content string) error { func SendEmail(subject string, receiver string, content string) error {

View File

@@ -2,7 +2,7 @@ package message
import ( import (
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
) )
const ( const (

View File

@@ -4,7 +4,7 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"net/http" "net/http"
) )

View File

@@ -3,7 +3,7 @@ package network
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/songquanpeng/one-api/common/logger" "github.com/Laisky/one-api/common/logger"
"net" "net"
"strings" "strings"
) )

View File

@@ -2,8 +2,8 @@ package common
import ( import (
"context" "context"
"github.com/Laisky/one-api/common/logger"
"github.com/go-redis/redis/v8" "github.com/go-redis/redis/v8"
"github.com/songquanpeng/one-api/common/logger"
"os" "os"
"time" "time"
) )

View File

@@ -2,7 +2,7 @@ package common
import ( import (
"fmt" "fmt"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
) )
func LogQuota(quota int64) string { func LogQuota(quota int64) string {

View File

@@ -5,13 +5,13 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/common/random"
"github.com/Laisky/one-api/controller"
"github.com/Laisky/one-api/model"
"github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/logger"
"github.com/songquanpeng/one-api/common/random"
"github.com/songquanpeng/one-api/controller"
"github.com/songquanpeng/one-api/model"
"net/http" "net/http"
"strconv" "strconv"
"time" "time"

View File

@@ -9,12 +9,12 @@ import (
"time" "time"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/controller"
"github.com/Laisky/one-api/model"
"github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/logger"
"github.com/songquanpeng/one-api/controller"
"github.com/songquanpeng/one-api/model"
) )
type LarkOAuthResponse struct { type LarkOAuthResponse struct {

View File

@@ -4,10 +4,10 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/controller"
"github.com/Laisky/one-api/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/controller"
"github.com/songquanpeng/one-api/model"
"net/http" "net/http"
"strconv" "strconv"
"time" "time"

View File

@@ -1,10 +1,10 @@
package controller package controller
import ( import (
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/model"
relaymodel "github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/model"
relaymodel "github.com/songquanpeng/one-api/relay/model"
) )
func GetSubscription(c *gin.Context) { func GetSubscription(c *gin.Context) {

View File

@@ -9,17 +9,17 @@ import (
"time" "time"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/logger" "github.com/Laisky/one-api/common/logger"
"github.com/songquanpeng/one-api/model" "github.com/Laisky/one-api/model"
"github.com/songquanpeng/one-api/monitor" "github.com/Laisky/one-api/monitor"
"github.com/songquanpeng/one-api/relay/channeltype" "github.com/Laisky/one-api/relay/channeltype"
"github.com/songquanpeng/one-api/relay/client" "github.com/Laisky/one-api/relay/client"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
// https://github.com/songquanpeng/one-api/issues/79 // https://github.com/Laisky/one-api/issues/79
type OpenAISubscriptionResponse struct { type OpenAISubscriptionResponse struct {
Object string `json:"object"` Object string `json:"object"`

View File

@@ -14,18 +14,18 @@ import (
"time" "time"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/logger" "github.com/Laisky/one-api/common/logger"
"github.com/songquanpeng/one-api/common/message" "github.com/Laisky/one-api/common/message"
"github.com/songquanpeng/one-api/middleware" "github.com/Laisky/one-api/middleware"
"github.com/songquanpeng/one-api/model" "github.com/Laisky/one-api/model"
"github.com/songquanpeng/one-api/monitor" "github.com/Laisky/one-api/monitor"
relay "github.com/songquanpeng/one-api/relay" relay "github.com/Laisky/one-api/relay"
"github.com/songquanpeng/one-api/relay/channeltype" "github.com/Laisky/one-api/relay/channeltype"
"github.com/songquanpeng/one-api/relay/controller" "github.com/Laisky/one-api/relay/controller"
"github.com/songquanpeng/one-api/relay/meta" "github.com/Laisky/one-api/relay/meta"
relaymodel "github.com/songquanpeng/one-api/relay/model" relaymodel "github.com/Laisky/one-api/relay/model"
"github.com/songquanpeng/one-api/relay/relaymode" "github.com/Laisky/one-api/relay/relaymode"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -89,7 +89,7 @@ func testChannel(channel *model.Channel) (err error, openaiErr *relaymodel.Error
if err != nil { if err != nil {
return err, nil return err, nil
} }
if resp.StatusCode != http.StatusOK { if resp != nil && resp.StatusCode != http.StatusOK {
err := controller.RelayErrorHandler(resp) err := controller.RelayErrorHandler(resp)
return fmt.Errorf("status code %d: %s", resp.StatusCode, err.Error.Message), &err.Error return fmt.Errorf("status code %d: %s", resp.StatusCode, err.Error.Message), &err.Error
} }

View File

@@ -1,10 +1,10 @@
package controller package controller
import ( import (
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/common/helper"
"github.com/Laisky/one-api/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/helper"
"github.com/songquanpeng/one-api/model"
"net/http" "net/http"
"strconv" "strconv"
"strings" "strings"

View File

@@ -1,8 +1,8 @@
package controller package controller
import ( import (
billingratio "github.com/Laisky/one-api/relay/billing/ratio"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
billingratio "github.com/songquanpeng/one-api/relay/billing/ratio"
"net/http" "net/http"
) )

View File

@@ -1,9 +1,9 @@
package controller package controller
import ( import (
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/model"
"net/http" "net/http"
"strconv" "strconv"
) )

View File

@@ -3,10 +3,10 @@ package controller
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/songquanpeng/one-api/common" "github.com/Laisky/one-api/common"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/message" "github.com/Laisky/one-api/common/message"
"github.com/songquanpeng/one-api/model" "github.com/Laisky/one-api/model"
"net/http" "net/http"
"strings" "strings"

View File

@@ -2,14 +2,14 @@ package controller
import ( import (
"fmt" "fmt"
"github.com/Laisky/one-api/model"
relay "github.com/Laisky/one-api/relay"
"github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/Laisky/one-api/relay/apitype"
"github.com/Laisky/one-api/relay/channeltype"
"github.com/Laisky/one-api/relay/meta"
relaymodel "github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/model"
relay "github.com/songquanpeng/one-api/relay"
"github.com/songquanpeng/one-api/relay/adaptor/openai"
"github.com/songquanpeng/one-api/relay/apitype"
"github.com/songquanpeng/one-api/relay/channeltype"
"github.com/songquanpeng/one-api/relay/meta"
relaymodel "github.com/songquanpeng/one-api/relay/model"
"net/http" "net/http"
"strings" "strings"
) )

View File

@@ -2,9 +2,9 @@ package controller
import ( import (
"encoding/json" "encoding/json"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/helper" "github.com/Laisky/one-api/common/helper"
"github.com/songquanpeng/one-api/model" "github.com/Laisky/one-api/model"
"net/http" "net/http"
"strings" "strings"

View File

@@ -1,11 +1,11 @@
package controller package controller
import ( import (
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/common/helper"
"github.com/Laisky/one-api/common/random"
"github.com/Laisky/one-api/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/helper"
"github.com/songquanpeng/one-api/common/random"
"github.com/songquanpeng/one-api/model"
"net/http" "net/http"
"strconv" "strconv"
) )

View File

@@ -4,20 +4,22 @@ import (
"bytes" "bytes"
"context" "context"
"fmt" "fmt"
"github.com/gin-gonic/gin"
"github.com/pkg/errors"
"github.com/songquanpeng/one-api/common"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/helper"
"github.com/songquanpeng/one-api/common/logger"
"github.com/songquanpeng/one-api/middleware"
dbmodel "github.com/songquanpeng/one-api/model"
"github.com/songquanpeng/one-api/monitor"
"github.com/songquanpeng/one-api/relay/controller"
"github.com/songquanpeng/one-api/relay/model"
"github.com/songquanpeng/one-api/relay/relaymode"
"io" "io"
"net/http" "net/http"
"github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/common/ctxkey"
"github.com/Laisky/one-api/common/helper"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/middleware"
dbmodel "github.com/Laisky/one-api/model"
"github.com/Laisky/one-api/monitor"
"github.com/Laisky/one-api/relay/controller"
"github.com/Laisky/one-api/relay/model"
"github.com/Laisky/one-api/relay/relaymode"
"github.com/gin-gonic/gin"
"github.com/pkg/errors"
) )
// https://platform.openai.com/docs/api-reference/chat // https://platform.openai.com/docs/api-reference/chat
@@ -55,7 +57,7 @@ func Relay(c *gin.Context) {
lastFailedChannelId := channelId lastFailedChannelId := channelId
channelName := c.GetString("channel_name") channelName := c.GetString("channel_name")
group := c.GetString("group") group := c.GetString("group")
originalModel := c.GetString(common.CtxKeyOriginModel) originalModel := c.GetString(ctxkey.OriginalModel)
go processChannelRelayError(ctx, channelId, channelName, bizErr) go processChannelRelayError(ctx, channelId, channelName, bizErr)
requestId := c.GetString(logger.RequestIdKey) requestId := c.GetString(logger.RequestIdKey)
retryTimes := config.RetryTimes retryTimes := config.RetryTimes

View File

@@ -5,14 +5,14 @@ import (
"net/http" "net/http"
"strconv" "strconv"
"github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/common/helper"
"github.com/Laisky/one-api/common/network"
"github.com/Laisky/one-api/common/random"
"github.com/Laisky/one-api/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/jinzhu/copier" "github.com/jinzhu/copier"
"github.com/songquanpeng/one-api/common"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/helper"
"github.com/songquanpeng/one-api/common/network"
"github.com/songquanpeng/one-api/common/random"
"github.com/songquanpeng/one-api/model"
) )
func GetAllTokens(c *gin.Context) { func GetAllTokens(c *gin.Context) {

View File

@@ -3,10 +3,10 @@ package controller
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/songquanpeng/one-api/common" "github.com/Laisky/one-api/common"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/random" "github.com/Laisky/one-api/common/random"
"github.com/songquanpeng/one-api/model" "github.com/Laisky/one-api/model"
"net/http" "net/http"
"strconv" "strconv"
"time" "time"

42
go.mod
View File

@@ -1,32 +1,37 @@
module github.com/songquanpeng/one-api module github.com/Laisky/one-api
// +heroku goVersion go1.18
go 1.21 go 1.21
toolchain go1.22.0
require ( require (
github.com/Laisky/errors/v2 v2.0.1 github.com/Laisky/errors/v2 v2.0.1
github.com/Laisky/go-utils/v4 v4.9.1 github.com/Laisky/go-utils/v4 v4.9.1
github.com/aws/aws-sdk-go-v2 v1.26.1 github.com/aws/aws-sdk-go-v2 v1.26.1
github.com/aws/aws-sdk-go-v2/credentials v1.17.11 github.com/aws/aws-sdk-go-v2/credentials v1.17.11
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.7.4 github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.7.4
github.com/gin-contrib/cors v1.7.0 github.com/gin-contrib/cors v1.7.1
github.com/gin-contrib/gzip v0.0.6 github.com/gin-contrib/gzip v1.0.0
github.com/gin-contrib/sessions v0.0.5 github.com/gin-contrib/sessions v1.0.0
github.com/gin-contrib/static v1.1.0 github.com/gin-contrib/static v1.1.1
github.com/gin-gonic/gin v1.9.1 github.com/gin-gonic/gin v1.9.1
github.com/go-playground/validator/v10 v10.19.0 github.com/go-playground/validator/v10 v10.19.0
github.com/go-redis/redis/v8 v8.11.5 github.com/go-redis/redis/v8 v8.11.5
github.com/golang-jwt/jwt v3.2.2+incompatible
github.com/google/uuid v1.6.0 github.com/google/uuid v1.6.0
github.com/gorilla/websocket v1.5.1
github.com/jinzhu/copier v0.4.0 github.com/jinzhu/copier v0.4.0
github.com/pkg/errors v0.9.1 github.com/pkg/errors v0.9.1
github.com/pkoukk/tiktoken-go v0.1.6 github.com/pkoukk/tiktoken-go v0.1.6
github.com/smartystreets/goconvey v1.8.1 github.com/smartystreets/goconvey v1.8.1
github.com/stretchr/testify v1.8.4 github.com/stretchr/testify v1.9.0
golang.org/x/crypto v0.21.0 golang.org/x/crypto v0.22.0
golang.org/x/image v0.15.0 golang.org/x/image v0.15.0
gorm.io/driver/mysql v1.5.5 gorm.io/driver/mysql v1.5.6
gorm.io/driver/postgres v1.5.7 gorm.io/driver/postgres v1.5.7
gorm.io/driver/sqlite v1.5.5 gorm.io/driver/sqlite v1.5.5
gorm.io/gorm v1.25.8 gorm.io/gorm v1.25.9
) )
require ( require (
@@ -40,7 +45,7 @@ require (
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect
github.com/aws/smithy-go v1.20.2 // indirect github.com/aws/smithy-go v1.20.2 // indirect
github.com/bytedance/sonic v1.11.2 // indirect github.com/bytedance/sonic v1.11.3 // indirect
github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
@@ -58,13 +63,12 @@ require (
github.com/goccy/go-json v0.10.2 // indirect github.com/goccy/go-json v0.10.2 // indirect
github.com/google/go-cpy v0.0.0-20211218193943-a9c933c06932 // indirect github.com/google/go-cpy v0.0.0-20211218193943-a9c933c06932 // indirect
github.com/gopherjs/gopherjs v1.17.2 // indirect github.com/gopherjs/gopherjs v1.17.2 // indirect
github.com/gorilla/context v1.1.1 // indirect github.com/gorilla/context v1.1.2 // indirect
github.com/gorilla/securecookie v1.1.1 // indirect github.com/gorilla/securecookie v1.1.2 // indirect
github.com/gorilla/sessions v1.2.1 // indirect github.com/gorilla/sessions v1.2.2 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
github.com/jackc/pgx/v5 v5.5.4 // indirect github.com/jackc/pgx/v5 v5.4.3 // indirect
github.com/jackc/puddle/v2 v2.2.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect github.com/jinzhu/now v1.1.5 // indirect
github.com/json-iterator/go v1.1.12 // indirect github.com/json-iterator/go v1.1.12 // indirect
@@ -72,10 +76,10 @@ require (
github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect
github.com/leodido/go-urn v1.4.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-sqlite3 v2.0.3+incompatible // indirect github.com/mattn/go-sqlite3 v1.14.17 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.1.1 // indirect github.com/pelletier/go-toml/v2 v2.2.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/smarty/assertions v1.15.0 // indirect github.com/smarty/assertions v1.15.0 // indirect
github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a // indirect github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a // indirect
@@ -87,8 +91,8 @@ require (
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect
golang.org/x/net v0.22.0 // indirect golang.org/x/net v0.22.0 // indirect
golang.org/x/sync v0.6.0 // indirect golang.org/x/sync v0.6.0 // indirect
golang.org/x/sys v0.18.0 // indirect golang.org/x/sys v0.19.0 // indirect
golang.org/x/term v0.18.0 // indirect golang.org/x/term v0.19.0 // indirect
golang.org/x/text v0.14.0 // indirect golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.7.0 // indirect golang.org/x/tools v0.7.0 // indirect
google.golang.org/protobuf v1.33.0 // indirect google.golang.org/protobuf v1.33.0 // indirect

112
go.sum
View File

@@ -34,8 +34,8 @@ github.com/brianvoe/gofakeit/v6 v6.23.2 h1:lVde18uhad5wII/f5RMVFLtdQNE0HaGFuBUXm
github.com/brianvoe/gofakeit/v6 v6.23.2/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8= github.com/brianvoe/gofakeit/v6 v6.23.2/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=
github.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A= github.com/bytedance/sonic v1.11.3 h1:jRN+yEjakWh8aK5FzrciUHG8OFXK+4/KrAX/ysEtHAA=
github.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/bytedance/sonic v1.11.3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
@@ -47,7 +47,6 @@ github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpV
github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=
github.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0= github.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=
github.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= github.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -63,17 +62,16 @@ github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uq
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/gammazero/deque v0.2.1 h1:qSdsbG6pgp6nL7A0+K/B7s12mcCY/5l5SIUpMOl+dC0= github.com/gammazero/deque v0.2.1 h1:qSdsbG6pgp6nL7A0+K/B7s12mcCY/5l5SIUpMOl+dC0=
github.com/gammazero/deque v0.2.1/go.mod h1:LFroj8x4cMYCukHJDbxFCkT+r9AndaJnFMuZDV34tuU= github.com/gammazero/deque v0.2.1/go.mod h1:LFroj8x4cMYCukHJDbxFCkT+r9AndaJnFMuZDV34tuU=
github.com/gin-contrib/cors v1.7.0 h1:wZX2wuZ0o7rV2/1i7gb4Jn+gW7HBqaP91fizJkBUJOA= github.com/gin-contrib/cors v1.7.1 h1:s9SIppU/rk8enVvkzwiC2VK3UZ/0NNGsWfUKvV55rqs=
github.com/gin-contrib/cors v1.7.0/go.mod h1:cI+h6iOAyxKRtUtC6iF/Si1KSFvGm/gK+kshxlCi8ro= github.com/gin-contrib/cors v1.7.1/go.mod h1:n/Zj7B4xyrgk/cX1WCX2dkzFfaNm/xJb6oIUk7WTtps=
github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= github.com/gin-contrib/gzip v1.0.0 h1:UKN586Po/92IDX6ie5CWLgMI81obiIp5nSP85T3wlTk=
github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= github.com/gin-contrib/gzip v1.0.0/go.mod h1:CtG7tQrPB3vIBo6Gat9FVUsis+1emjvQqd66ME5TdnE=
github.com/gin-contrib/sessions v0.0.5 h1:CATtfHmLMQrMNpJRgzjWXD7worTh7g7ritsQfmF+0jE= github.com/gin-contrib/sessions v1.0.0 h1:r5GLta4Oy5xo9rAwMHx8B4wLpeRGHMdz9NafzJAdP8Y=
github.com/gin-contrib/sessions v0.0.5/go.mod h1:vYAuaUPqie3WUSsft6HUlCjlwwoJQs97miaG2+7neKY= github.com/gin-contrib/sessions v1.0.0/go.mod h1:DN0f4bvpqMQElDdi+gNGScrP2QEI04IErRyMFyorUOI=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-contrib/static v1.1.0 h1:MMVoe+sAwMbt1rqH91C48LAmmBn9tuVJInaT5b/64OI= github.com/gin-contrib/static v1.1.1 h1:XEvBd4DDLG1HBlyPBQU1XO8NlTpw6mgdqcPteetYA5k=
github.com/gin-contrib/static v1.1.0/go.mod h1:41ymO4uaFIGCy1kco0PBunNbvXeesKsyPR9TnVKR1BQ= github.com/gin-contrib/static v1.1.1/go.mod h1:yRGmar7+JYvbMLRPIi4H5TVVSBwULfT9vetnVD0IO74=
github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
github.com/go-json-experiment/json v0.0.0-20231011163920-8aa127fd5801 h1:PRieymvnGuBZUnWVQPBOemqlIhRznqtSxs/1LqlWe20= github.com/go-json-experiment/json v0.0.0-20231011163920-8aa127fd5801 h1:PRieymvnGuBZUnWVQPBOemqlIhRznqtSxs/1LqlWe20=
@@ -81,52 +79,49 @@ github.com/go-json-experiment/json v0.0.0-20231011163920-8aa127fd5801/go.mod h1:
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4=
github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cpy v0.0.0-20211218193943-a9c933c06932 h1:5/4TSDzpDnHQ8rKEEQBjRlYx77mHOvXu08oGchxej7o= github.com/google/go-cpy v0.0.0-20211218193943-a9c933c06932 h1:5/4TSDzpDnHQ8rKEEQBjRlYx77mHOvXu08oGchxej7o=
github.com/google/go-cpy v0.0.0-20211218193943-a9c933c06932/go.mod h1:cC6EdPbj/17GFCPDK39NRarlMI+kt+O60S12cNB5J9Y= github.com/google/go-cpy v0.0.0-20211218193943-a9c933c06932/go.mod h1:cC6EdPbj/17GFCPDK39NRarlMI+kt+O60S12cNB5J9Y=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=
github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=
github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=
github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY=
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ=
github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY=
github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA=
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8=
github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
@@ -141,22 +136,16 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02
github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM=
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -169,10 +158,8 @@ github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042
github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= github.com/pelletier/go-toml/v2 v2.2.0 h1:QLgLl2yMN7N+ruc31VynXs1vhMZa7CeHHejIeBAsoHo=
github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= github.com/pelletier/go-toml/v2 v2.2.0/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkoukk/tiktoken-go v0.1.6 h1:JF0TlJzhTbrI30wCvFuiw6FzP2+/bR+FIxUdgEAcUsw= github.com/pkoukk/tiktoken-go v0.1.6 h1:JF0TlJzhTbrI30wCvFuiw6FzP2+/bR+FIxUdgEAcUsw=
@@ -181,7 +168,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY= github.com/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY=
@@ -193,20 +179,19 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a h1:SJy1Pu0eH1C29XwJucQo73FrleVK6t4kYz4NVhp34Yw= github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a h1:SJy1Pu0eH1C29XwJucQo73FrleVK6t4kYz4NVhp34Yw=
github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a/go.mod h1:DFSS3NAGHthKo1gTlmEcSBiZrRJXi28rLNd/1udP1c8= github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a/go.mod h1:DFSS3NAGHthKo1gTlmEcSBiZrRJXi28rLNd/1udP1c8=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI=
@@ -222,9 +207,8 @@ golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc=
golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8=
golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
@@ -234,7 +218,6 @@ golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=
golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -242,55 +225,42 @@ golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q=
golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=
golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/mysql v1.5.5 h1:WxklwX6FozMs1gk9yVadxGfjGiJjrBKPvIIvYZOMyws= gorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=
gorm.io/driver/mysql v1.5.5/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= gorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=
gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM= gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM=
gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA= gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA=
gorm.io/driver/sqlite v1.5.5 h1:7MDMtUZhV065SilG62E0MquljeArQZNfJnjd9i9gx3E= gorm.io/driver/sqlite v1.5.5 h1:7MDMtUZhV065SilG62E0MquljeArQZNfJnjd9i9gx3E=
gorm.io/driver/sqlite v1.5.5/go.mod h1:6NgQ7sQWAIFsPrJJl1lSNSu2TABh0ZZ/zm5fosATavE= gorm.io/driver/sqlite v1.5.5/go.mod h1:6NgQ7sQWAIFsPrJJl1lSNSu2TABh0ZZ/zm5fosATavE=
gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.25.8 h1:WAGEZ/aEcznN4D03laj8DKnehe1e9gYQAjW8xyPRdeo= gorm.io/gorm v1.25.9 h1:wct0gxZIELDk8+ZqF/MVnHLkA1rvYlBWUMv2EdsK1g8=
gorm.io/gorm v1.25.8/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= gorm.io/gorm v1.25.9/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

16
main.go
View File

@@ -7,17 +7,17 @@ import (
"os" "os"
"strconv" "strconv"
"github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/controller"
"github.com/Laisky/one-api/middleware"
"github.com/Laisky/one-api/model"
"github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/Laisky/one-api/router"
"github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie" "github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/logger"
"github.com/songquanpeng/one-api/controller"
"github.com/songquanpeng/one-api/middleware"
"github.com/songquanpeng/one-api/model"
"github.com/songquanpeng/one-api/relay/adaptor/openai"
"github.com/songquanpeng/one-api/router"
) )
//go:embed web/build/* //go:embed web/build/*

View File

@@ -2,12 +2,12 @@ package middleware
import ( import (
"fmt" "fmt"
"github.com/Laisky/one-api/common/blacklist"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/common/network"
"github.com/Laisky/one-api/model"
"github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/blacklist"
"github.com/songquanpeng/one-api/common/logger"
"github.com/songquanpeng/one-api/common/network"
"github.com/songquanpeng/one-api/model"
"net/http" "net/http"
"strings" "strings"
) )

View File

@@ -6,13 +6,14 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/common/ctxkey"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/model"
"github.com/Laisky/one-api/relay/billing/ratio"
"github.com/Laisky/one-api/relay/channeltype"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/logger"
"github.com/songquanpeng/one-api/model"
"github.com/songquanpeng/one-api/relay/billing/ratio"
"github.com/songquanpeng/one-api/relay/channeltype"
) )
type ModelRequest struct { type ModelRequest struct {
@@ -79,7 +80,7 @@ func SetupContextForSelectedChannel(c *gin.Context, channel *model.Channel, mode
c.Set("channel_id", channel.Id) c.Set("channel_id", channel.Id)
c.Set("channel_name", channel.Name) c.Set("channel_name", channel.Name)
c.Set("model_mapping", channel.GetModelMapping()) c.Set("model_mapping", channel.GetModelMapping())
c.Set(common.CtxKeyOriginModel, modelName) // for retry c.Set(ctxkey.OriginalModel, modelName) // for retry
c.Request.Header.Set("Authorization", fmt.Sprintf("Bearer %s", channel.Key)) c.Request.Header.Set("Authorization", fmt.Sprintf("Bearer %s", channel.Key))
c.Set("base_url", channel.GetBaseURL()) c.Set("base_url", channel.GetBaseURL())
// this is for backward compatibility // this is for backward compatibility

View File

@@ -2,8 +2,8 @@ package middleware
import ( import (
"fmt" "fmt"
"github.com/Laisky/one-api/common/logger"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/logger"
) )
func SetUpLogger(server *gin.Engine) { func SetUpLogger(server *gin.Engine) {

View File

@@ -3,9 +3,9 @@ package middleware
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/config"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common"
"github.com/songquanpeng/one-api/common/config"
"net/http" "net/http"
"time" "time"
) )

View File

@@ -2,9 +2,9 @@ package middleware
import ( import (
"fmt" "fmt"
"github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/logger"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common"
"github.com/songquanpeng/one-api/common/logger"
"net/http" "net/http"
"runtime/debug" "runtime/debug"
) )
@@ -21,7 +21,7 @@ func RelayPanicRecover() gin.HandlerFunc {
logger.Errorf(ctx, fmt.Sprintf("request body: %s", string(body))) logger.Errorf(ctx, fmt.Sprintf("request body: %s", string(body)))
c.JSON(http.StatusInternalServerError, gin.H{ c.JSON(http.StatusInternalServerError, gin.H{
"error": gin.H{ "error": gin.H{
"message": fmt.Sprintf("Panic detected, error: %v. Please submit an issue with the related log here: https://github.com/songquanpeng/one-api", err), "message": fmt.Sprintf("Panic detected, error: %v. Please submit an issue with the related log here: https://github.com/Laisky/one-api", err),
"type": "one_api_panic", "type": "one_api_panic",
}, },
}) })

View File

@@ -2,9 +2,9 @@ package middleware
import ( import (
"context" "context"
"github.com/Laisky/one-api/common/helper"
"github.com/Laisky/one-api/common/logger"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/helper"
"github.com/songquanpeng/one-api/common/logger"
) )
func RequestId() func(c *gin.Context) { func RequestId() func(c *gin.Context) {

View File

@@ -2,10 +2,10 @@ package middleware
import ( import (
"encoding/json" "encoding/json"
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/common/logger"
"github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/logger"
"net/http" "net/http"
"net/url" "net/url"
) )

View File

@@ -2,10 +2,10 @@ package middleware
import ( import (
"fmt" "fmt"
"github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/helper"
"github.com/Laisky/one-api/common/logger"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common"
"github.com/songquanpeng/one-api/common/helper"
"github.com/songquanpeng/one-api/common/logger"
"strings" "strings"
) )

View File

@@ -2,7 +2,7 @@ package model
import ( import (
"context" "context"
"github.com/songquanpeng/one-api/common" "github.com/Laisky/one-api/common"
"gorm.io/gorm" "gorm.io/gorm"
"sort" "sort"
"strings" "strings"

View File

@@ -5,10 +5,10 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/songquanpeng/one-api/common" "github.com/Laisky/one-api/common"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/logger" "github.com/Laisky/one-api/common/logger"
"github.com/songquanpeng/one-api/common/random" "github.com/Laisky/one-api/common/random"
"math/rand" "math/rand"
"sort" "sort"
"strconv" "strconv"

View File

@@ -3,9 +3,9 @@ package model
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/helper" "github.com/Laisky/one-api/common/helper"
"github.com/songquanpeng/one-api/common/logger" "github.com/Laisky/one-api/common/logger"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -3,10 +3,10 @@ package model
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/songquanpeng/one-api/common" "github.com/Laisky/one-api/common"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/helper" "github.com/Laisky/one-api/common/helper"
"github.com/songquanpeng/one-api/common/logger" "github.com/Laisky/one-api/common/logger"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -6,13 +6,13 @@ import (
"strings" "strings"
"time" "time"
"github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/common/env"
"github.com/Laisky/one-api/common/helper"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/common/random"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/songquanpeng/one-api/common"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/env"
"github.com/songquanpeng/one-api/common/helper"
"github.com/songquanpeng/one-api/common/logger"
"github.com/songquanpeng/one-api/common/random"
"gorm.io/driver/mysql" "gorm.io/driver/mysql"
"gorm.io/driver/postgres" "gorm.io/driver/postgres"
"gorm.io/driver/sqlite" "gorm.io/driver/sqlite"

View File

@@ -1,9 +1,9 @@
package model package model
import ( import (
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/logger" "github.com/Laisky/one-api/common/logger"
billingratio "github.com/songquanpeng/one-api/relay/billing/ratio" billingratio "github.com/Laisky/one-api/relay/billing/ratio"
"strconv" "strconv"
"strings" "strings"
"time" "time"

View File

@@ -3,8 +3,8 @@ package model
import ( import (
"fmt" "fmt"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/songquanpeng/one-api/common" "github.com/Laisky/one-api/common"
"github.com/songquanpeng/one-api/common/helper" "github.com/Laisky/one-api/common/helper"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -4,11 +4,11 @@ import (
"fmt" "fmt"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/songquanpeng/one-api/common" "github.com/Laisky/one-api/common"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/helper" "github.com/Laisky/one-api/common/helper"
"github.com/songquanpeng/one-api/common/logger" "github.com/Laisky/one-api/common/logger"
"github.com/songquanpeng/one-api/common/message" "github.com/Laisky/one-api/common/message"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -5,11 +5,11 @@ import (
"strings" "strings"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/songquanpeng/one-api/common" "github.com/Laisky/one-api/common"
"github.com/songquanpeng/one-api/common/blacklist" "github.com/Laisky/one-api/common/blacklist"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/logger" "github.com/Laisky/one-api/common/logger"
"github.com/songquanpeng/one-api/common/random" "github.com/Laisky/one-api/common/random"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -1,8 +1,8 @@
package model package model
import ( import (
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/logger" "github.com/Laisky/one-api/common/logger"
"sync" "sync"
"time" "time"
) )

View File

@@ -2,10 +2,10 @@ package monitor
import ( import (
"fmt" "fmt"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/logger" "github.com/Laisky/one-api/common/logger"
"github.com/songquanpeng/one-api/common/message" "github.com/Laisky/one-api/common/message"
"github.com/songquanpeng/one-api/model" "github.com/Laisky/one-api/model"
) )
func notifyRootUser(subject string, content string) { func notifyRootUser(subject string, content string) {

View File

@@ -1,8 +1,8 @@
package monitor package monitor
import ( import (
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/relay/model" "github.com/Laisky/one-api/relay/model"
"net/http" "net/http"
"strings" "strings"
) )

View File

@@ -1,7 +1,7 @@
package monitor package monitor
import ( import (
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
) )
var store = make(map[int][]bool) var store = make(map[int][]bool)

View File

@@ -1,41 +1,46 @@
package relay package relay
import ( import (
"github.com/songquanpeng/one-api/relay/adaptor" "github.com/Laisky/one-api/relay/adaptor"
"github.com/songquanpeng/one-api/relay/adaptor/aiproxy" "github.com/Laisky/one-api/relay/adaptor/aiproxy"
"github.com/songquanpeng/one-api/relay/adaptor/anthropic" "github.com/Laisky/one-api/relay/adaptor/ali"
"github.com/songquanpeng/one-api/relay/adaptor/aws" "github.com/Laisky/one-api/relay/adaptor/anthropic"
"github.com/songquanpeng/one-api/relay/adaptor/gemini" "github.com/Laisky/one-api/relay/adaptor/aws"
"github.com/songquanpeng/one-api/relay/adaptor/ollama" "github.com/Laisky/one-api/relay/adaptor/baidu"
"github.com/songquanpeng/one-api/relay/adaptor/openai" "github.com/Laisky/one-api/relay/adaptor/gemini"
"github.com/songquanpeng/one-api/relay/adaptor/palm" "github.com/Laisky/one-api/relay/adaptor/ollama"
"github.com/songquanpeng/one-api/relay/apitype" "github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/Laisky/one-api/relay/adaptor/palm"
"github.com/Laisky/one-api/relay/adaptor/tencent"
"github.com/Laisky/one-api/relay/adaptor/xunfei"
"github.com/Laisky/one-api/relay/adaptor/zhipu"
"github.com/Laisky/one-api/relay/apitype"
) )
func GetAdaptor(apiType int) adaptor.Adaptor { func GetAdaptor(apiType int) adaptor.Adaptor {
switch apiType { switch apiType {
case apitype.AIProxyLibrary: case apitype.AIProxyLibrary:
return &aiproxy.Adaptor{} return &aiproxy.Adaptor{}
// case apitype.Ali: case apitype.Ali:
// return &ali.Adaptor{} return &ali.Adaptor{}
case apitype.Anthropic: case apitype.Anthropic:
return &anthropic.Adaptor{} return &anthropic.Adaptor{}
case apitype.AwsClaude: case apitype.AwsClaude:
return &aws.Adaptor{} return &aws.Adaptor{}
// case apitype.Baidu: case apitype.Baidu:
// return &baidu.Adaptor{} return &baidu.Adaptor{}
case apitype.Gemini: case apitype.Gemini:
return &gemini.Adaptor{} return &gemini.Adaptor{}
case apitype.OpenAI: case apitype.OpenAI:
return &openai.Adaptor{} return &openai.Adaptor{}
case apitype.PaLM: case apitype.PaLM:
return &palm.Adaptor{} return &palm.Adaptor{}
// case apitype.Tencent: case apitype.Tencent:
// return &tencent.Adaptor{} return &tencent.Adaptor{}
// case apitype.Xunfei: case apitype.Xunfei:
// return &xunfei.Adaptor{} return &xunfei.Adaptor{}
// case apitype.Zhipu: case apitype.Zhipu:
// return &zhipu.Adaptor{} return &zhipu.Adaptor{}
case apitype.Ollama: case apitype.Ollama:
return &ollama.Adaptor{} return &ollama.Adaptor{}
} }

View File

@@ -3,11 +3,11 @@ package aiproxy
import ( import (
"fmt" "fmt"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/relay/adaptor"
"github.com/Laisky/one-api/relay/meta"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/relay/adaptor"
"github.com/songquanpeng/one-api/relay/meta"
"github.com/songquanpeng/one-api/relay/model"
"io" "io"
"net/http" "net/http"
) )

View File

@@ -1,6 +1,6 @@
package aiproxy package aiproxy
import "github.com/songquanpeng/one-api/relay/adaptor/openai" import "github.com/Laisky/one-api/relay/adaptor/openai"
var ModelList = []string{""} var ModelList = []string{""}

View File

@@ -9,14 +9,14 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/helper"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/common/random"
"github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/Laisky/one-api/relay/constant"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common"
"github.com/songquanpeng/one-api/common/helper"
"github.com/songquanpeng/one-api/common/logger"
"github.com/songquanpeng/one-api/common/random"
"github.com/songquanpeng/one-api/relay/adaptor/openai"
"github.com/songquanpeng/one-api/relay/constant"
"github.com/songquanpeng/one-api/relay/model"
) )
// https://docs.aiproxy.io/dev/library#使用已经定制好的知识库进行对话问答 // https://docs.aiproxy.io/dev/library#使用已经定制好的知识库进行对话问答

View File

@@ -1,105 +1,106 @@
package ali package ali
// import ( import (
// "github.com/Laisky/errors/v2" "errors"
// "fmt" "fmt"
// "github.com/gin-gonic/gin" "io"
// "github.com/songquanpeng/one-api/common/config" "net/http"
// "github.com/songquanpeng/one-api/relay/adaptor"
// "github.com/songquanpeng/one-api/relay/meta"
// "github.com/songquanpeng/one-api/relay/model"
// "github.com/songquanpeng/one-api/relay/relaymode"
// "io"
// "net/http"
// )
// // https://help.aliyun.com/zh/dashscope/developer-reference/api-details "github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/relay/adaptor"
"github.com/Laisky/one-api/relay/meta"
"github.com/Laisky/one-api/relay/model"
"github.com/Laisky/one-api/relay/relaymode"
"github.com/gin-gonic/gin"
)
// type Adaptor struct { // https://help.aliyun.com/zh/dashscope/developer-reference/api-details
// }
// func (a *Adaptor) Init(meta *meta.Meta) { type Adaptor struct {
}
// } func (a *Adaptor) Init(meta *meta.Meta) {
// func (a *Adaptor) GetRequestURL(meta *meta.Meta) (string, error) { }
// fullRequestURL := ""
// switch meta.Mode {
// case relaymode.Embeddings:
// fullRequestURL = fmt.Sprintf("%s/api/v1/services/embeddings/text-embedding/text-embedding", meta.BaseURL)
// case relaymode.ImagesGenerations:
// fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/text2image/image-synthesis", meta.BaseURL)
// default:
// fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/text-generation/generation", meta.BaseURL)
// }
// return fullRequestURL, nil func (a *Adaptor) GetRequestURL(meta *meta.Meta) (string, error) {
// } fullRequestURL := ""
switch meta.Mode {
case relaymode.Embeddings:
fullRequestURL = fmt.Sprintf("%s/api/v1/services/embeddings/text-embedding/text-embedding", meta.BaseURL)
case relaymode.ImagesGenerations:
fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/text2image/image-synthesis", meta.BaseURL)
default:
fullRequestURL = fmt.Sprintf("%s/api/v1/services/aigc/text-generation/generation", meta.BaseURL)
}
// func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Request, meta *meta.Meta) error { return fullRequestURL, nil
// adaptor.SetupCommonRequestHeader(c, req, meta) }
// if meta.IsStream {
// req.Header.Set("Accept", "text/event-stream")
// req.Header.Set("X-DashScope-SSE", "enable")
// }
// req.Header.Set("Authorization", "Bearer "+meta.APIKey)
// if meta.Mode == relaymode.ImagesGenerations { func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Request, meta *meta.Meta) error {
// req.Header.Set("X-DashScope-Async", "enable") adaptor.SetupCommonRequestHeader(c, req, meta)
// } if meta.IsStream {
// if c.GetString(config.KeyPlugin) != "" { req.Header.Set("Accept", "text/event-stream")
// req.Header.Set("X-DashScope-Plugin", c.GetString(config.KeyPlugin)) req.Header.Set("X-DashScope-SSE", "enable")
// } }
// return nil req.Header.Set("Authorization", "Bearer "+meta.APIKey)
// }
// func (a *Adaptor) ConvertRequest(c *gin.Context, relayMode int, request *model.GeneralOpenAIRequest) (any, error) { if meta.Mode == relaymode.ImagesGenerations {
// if request == nil { req.Header.Set("X-DashScope-Async", "enable")
// return nil, errors.New("request is nil") }
// } if c.GetString(config.KeyPlugin) != "" {
// switch relayMode { req.Header.Set("X-DashScope-Plugin", c.GetString(config.KeyPlugin))
// case relaymode.Embeddings: }
// aliEmbeddingRequest := ConvertEmbeddingRequest(*request) return nil
// return aliEmbeddingRequest, nil }
// default:
// aliRequest := ConvertRequest(*request)
// return aliRequest, nil
// }
// }
// func (a *Adaptor) ConvertImageRequest(request *model.ImageRequest) (any, error) { func (a *Adaptor) ConvertRequest(c *gin.Context, relayMode int, request *model.GeneralOpenAIRequest) (any, error) {
// if request == nil { if request == nil {
// return nil, errors.New("request is nil") return nil, errors.New("request is nil")
// } }
switch relayMode {
case relaymode.Embeddings:
aliEmbeddingRequest := ConvertEmbeddingRequest(*request)
return aliEmbeddingRequest, nil
default:
aliRequest := ConvertRequest(*request)
return aliRequest, nil
}
}
// aliRequest := ConvertImageRequest(*request) func (a *Adaptor) ConvertImageRequest(request *model.ImageRequest) (any, error) {
// return aliRequest, nil if request == nil {
// } return nil, errors.New("request is nil")
}
// func (a *Adaptor) DoRequest(c *gin.Context, meta *meta.Meta, requestBody io.Reader) (*http.Response, error) { aliRequest := ConvertImageRequest(*request)
// return adaptor.DoRequestHelper(a, c, meta, requestBody) return aliRequest, nil
// } }
// func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, meta *meta.Meta) (usage *model.Usage, err *model.ErrorWithStatusCode) { func (a *Adaptor) DoRequest(c *gin.Context, meta *meta.Meta, requestBody io.Reader) (*http.Response, error) {
// if meta.IsStream { return adaptor.DoRequestHelper(a, c, meta, requestBody)
// err, usage = StreamHandler(c, resp) }
// } else {
// switch meta.Mode {
// case relaymode.Embeddings:
// err, usage = EmbeddingHandler(c, resp)
// case relaymode.ImagesGenerations:
// err, usage = ImageHandler(c, resp)
// default:
// err, usage = Handler(c, resp)
// }
// }
// return
// }
// func (a *Adaptor) GetModelList() []string { func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, meta *meta.Meta) (usage *model.Usage, err *model.ErrorWithStatusCode) {
// return ModelList if meta.IsStream {
// } err, usage = StreamHandler(c, resp)
} else {
switch meta.Mode {
case relaymode.Embeddings:
err, usage = EmbeddingHandler(c, resp)
case relaymode.ImagesGenerations:
err, usage = ImageHandler(c, resp)
default:
err, usage = Handler(c, resp)
}
}
return
}
// func (a *Adaptor) GetChannelName() string { func (a *Adaptor) GetModelList() []string {
// return "ali" return ModelList
// } }
func (a *Adaptor) GetChannelName() string {
return "ali"
}

View File

@@ -3,17 +3,18 @@ package ali
import ( import (
"encoding/base64" "encoding/base64"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"github.com/Laisky/errors/v2"
"github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/helper"
"github.com/songquanpeng/one-api/common/logger"
"github.com/songquanpeng/one-api/relay/adaptor/openai"
"github.com/songquanpeng/one-api/relay/model"
"io" "io"
"net/http" "net/http"
"strings" "strings"
"time" "time"
"github.com/Laisky/one-api/common/helper"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin"
) )
func ImageHandler(c *gin.Context, resp *http.Response) (*model.ErrorWithStatusCode, *model.Usage) { func ImageHandler(c *gin.Context, resp *http.Response) (*model.ErrorWithStatusCode, *model.Usage) {

View File

@@ -1,323 +1,279 @@
package ali package ali
// import ( import (
// "github.com/songquanpeng/one-api/common" "bufio"
// ) "encoding/json"
"io"
"net/http"
"strings"
// // https://help.aliyun.com/document_detail/613695.html?spm=a2c4g.2399480.0.0.1adb778fAdzP9w#341800c0f8w0r "github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/helper"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin"
)
// type AliMessage struct { // https://help.aliyun.com/document_detail/613695.html?spm=a2c4g.2399480.0.0.1adb778fAdzP9w#341800c0f8w0r
// Content string `json:"content"`
// Role string `json:"role"`
// }
// type AliInput struct { const EnableSearchModelSuffix = "-internet"
// //Prompt string `json:"prompt"`
// Messages []AliMessage `json:"messages"`
// }
// type AliParameters struct { func ConvertRequest(request model.GeneralOpenAIRequest) *ChatRequest {
// TopP float64 `json:"top_p,omitempty"` messages := make([]Message, 0, len(request.Messages))
// TopK int `json:"top_k,omitempty"` for i := 0; i < len(request.Messages); i++ {
// Seed uint64 `json:"seed,omitempty"` message := request.Messages[i]
// EnableSearch bool `json:"enable_search,omitempty"` messages = append(messages, Message{
// } Content: message.StringContent(),
Role: strings.ToLower(message.Role),
})
}
enableSearch := false
aliModel := request.Model
if strings.HasSuffix(aliModel, EnableSearchModelSuffix) {
enableSearch = true
aliModel = strings.TrimSuffix(aliModel, EnableSearchModelSuffix)
}
if request.TopP >= 1 {
request.TopP = 0.9999
}
return &ChatRequest{
Model: aliModel,
Input: Input{
Messages: messages,
},
Parameters: Parameters{
EnableSearch: enableSearch,
IncrementalOutput: request.Stream,
Seed: uint64(request.Seed),
MaxTokens: request.MaxTokens,
Temperature: request.Temperature,
TopP: request.TopP,
TopK: request.TopK,
ResultFormat: "message",
Tools: request.Tools,
},
}
}
// type AliChatRequest struct { func ConvertEmbeddingRequest(request model.GeneralOpenAIRequest) *EmbeddingRequest {
// Model string `json:"model"` return &EmbeddingRequest{
// Input AliInput `json:"input"` Model: "text-embedding-v1",
// Parameters AliParameters `json:"parameters,omitempty"` Input: struct {
// } Texts []string `json:"texts"`
}{
Texts: request.ParseInput(),
},
}
}
// type AliEmbeddingRequest struct { func ConvertImageRequest(request model.ImageRequest) *ImageRequest {
// Model string `json:"model"` var imageRequest ImageRequest
// Input struct { imageRequest.Input.Prompt = request.Prompt
// Texts []string `json:"texts"` imageRequest.Model = request.Model
// } `json:"input"` imageRequest.Parameters.Size = strings.Replace(request.Size, "x", "*", -1)
// Parameters *struct { imageRequest.Parameters.N = request.N
// TextType string `json:"text_type,omitempty"` imageRequest.ResponseFormat = request.ResponseFormat
// } `json:"parameters,omitempty"`
// }
// type AliEmbedding struct { return &imageRequest
// Embedding []float64 `json:"embedding"` }
// TextIndex int `json:"text_index"`
// }
// type AliEmbeddingResponse struct { func EmbeddingHandler(c *gin.Context, resp *http.Response) (*model.ErrorWithStatusCode, *model.Usage) {
// Output struct { var aliResponse EmbeddingResponse
// Embeddings []AliEmbedding `json:"embeddings"` err := json.NewDecoder(resp.Body).Decode(&aliResponse)
// } `json:"output"` if err != nil {
// Usage AliUsage `json:"usage"` return openai.ErrorWrapper(err, "unmarshal_response_body_failed", http.StatusInternalServerError), nil
// AliError }
// }
// type AliError struct { err = resp.Body.Close()
// Code string `json:"code"` if err != nil {
// Message string `json:"message"` return openai.ErrorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil
// RequestId string `json:"request_id"` }
// }
// type AliUsage struct { if aliResponse.Code != "" {
// InputTokens int `json:"input_tokens"` return &model.ErrorWithStatusCode{
// OutputTokens int `json:"output_tokens"` Error: model.Error{
// TotalTokens int `json:"total_tokens"` Message: aliResponse.Message,
// } Type: aliResponse.Code,
Param: aliResponse.RequestId,
Code: aliResponse.Code,
},
StatusCode: resp.StatusCode,
}, nil
}
// type AliOutput struct { fullTextResponse := embeddingResponseAli2OpenAI(&aliResponse)
// Text string `json:"text"` jsonResponse, err := json.Marshal(fullTextResponse)
// FinishReason string `json:"finish_reason"` if err != nil {
// } return openai.ErrorWrapper(err, "marshal_response_body_failed", http.StatusInternalServerError), nil
}
c.Writer.Header().Set("Content-Type", "application/json")
c.Writer.WriteHeader(resp.StatusCode)
_, err = c.Writer.Write(jsonResponse)
return nil, &fullTextResponse.Usage
}
// type AliChatResponse struct { func embeddingResponseAli2OpenAI(response *EmbeddingResponse) *openai.EmbeddingResponse {
// Output AliOutput `json:"output"` openAIEmbeddingResponse := openai.EmbeddingResponse{
// Usage AliUsage `json:"usage"` Object: "list",
// AliError Data: make([]openai.EmbeddingResponseItem, 0, len(response.Output.Embeddings)),
// } Model: "text-embedding-v1",
Usage: model.Usage{TotalTokens: response.Usage.TotalTokens},
}
// func requestOpenAI2Ali(request GeneralOpenAIRequest) *AliChatRequest { for _, item := range response.Output.Embeddings {
// messages := make([]AliMessage, 0, len(request.Messages)) openAIEmbeddingResponse.Data = append(openAIEmbeddingResponse.Data, openai.EmbeddingResponseItem{
// prompt := "" Object: `embedding`,
// for i := 0; i < len(request.Messages); i++ { Index: item.TextIndex,
// message := request.Messages[i] Embedding: item.Embedding,
// if message.Role == "system" { })
// messages = append(messages, AliMessage{ }
// User: message.Content, return &openAIEmbeddingResponse
// Bot: "Okay", }
// })
// continue
// } else {
// if i == len(request.Messages)-1 {
// prompt = message.Content
// break
// }
// messages = append(messages, AliMessage{
// User: message.Content,
// Bot: request.Messages[i+1].Content,
// })
// i++
// }
// }
// return &AliChatRequest{
// Model: request.Model,
// Input: AliInput{
// Prompt: prompt,
// History: messages,
// },
// //Parameters: AliParameters{ // ChatGPT's parameters are not compatible with Ali's
// // TopP: request.TopP,
// // TopK: 50,
// // //Seed: 0,
// // //EnableSearch: false,
// //},
// }
// }
// func embeddingRequestOpenAI2Ali(request GeneralOpenAIRequest) *AliEmbeddingRequest { func responseAli2OpenAI(response *ChatResponse) *openai.TextResponse {
// return &AliEmbeddingRequest{ fullTextResponse := openai.TextResponse{
// Model: "text-embedding-v1", Id: response.RequestId,
// Input: struct { Object: "chat.completion",
// Texts []string `json:"texts"` Created: helper.GetTimestamp(),
// }{ Choices: response.Output.Choices,
// Texts: request.ParseInput(), Usage: model.Usage{
// }, PromptTokens: response.Usage.InputTokens,
// } CompletionTokens: response.Usage.OutputTokens,
// } TotalTokens: response.Usage.InputTokens + response.Usage.OutputTokens,
},
}
return &fullTextResponse
}
// func aliEmbeddingHandler(c *gin.Context, resp *http.Response) (*OpenAIErrorWithStatusCode, *Usage) { func streamResponseAli2OpenAI(aliResponse *ChatResponse) *openai.ChatCompletionsStreamResponse {
// var aliResponse AliEmbeddingResponse if len(aliResponse.Output.Choices) == 0 {
// err := json.NewDecoder(resp.Body).Decode(&aliResponse) return nil
// if err != nil { }
// return errorWrapper(err, "unmarshal_response_body_failed", http.StatusInternalServerError), nil aliChoice := aliResponse.Output.Choices[0]
// } var choice openai.ChatCompletionsStreamResponseChoice
choice.Delta = aliChoice.Message
if aliChoice.FinishReason != "null" {
finishReason := aliChoice.FinishReason
choice.FinishReason = &finishReason
}
response := openai.ChatCompletionsStreamResponse{
Id: aliResponse.RequestId,
Object: "chat.completion.chunk",
Created: helper.GetTimestamp(),
Model: "qwen",
Choices: []openai.ChatCompletionsStreamResponseChoice{choice},
}
return &response
}
// err = resp.Body.Close() func StreamHandler(c *gin.Context, resp *http.Response) (*model.ErrorWithStatusCode, *model.Usage) {
// if err != nil { var usage model.Usage
// return errorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil scanner := bufio.NewScanner(resp.Body)
// } scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) {
if atEOF && len(data) == 0 {
// if aliResponse.Code != "" { return 0, nil, nil
// return &OpenAIErrorWithStatusCode{ }
// OpenAIError: OpenAIError{ if i := strings.Index(string(data), "\n"); i >= 0 {
// Message: aliResponse.Message, return i + 1, data[0:i], nil
// Type: aliResponse.Code, }
// Param: aliResponse.RequestId, if atEOF {
// Code: aliResponse.Code, return len(data), data, nil
// }, }
// StatusCode: resp.StatusCode, return 0, nil, nil
// }, nil })
// } dataChan := make(chan string)
stopChan := make(chan bool)
// fullTextResponse := embeddingResponseAli2OpenAI(&aliResponse) go func() {
// jsonResponse, err := json.Marshal(fullTextResponse) for scanner.Scan() {
// if err != nil { data := scanner.Text()
// return errorWrapper(err, "marshal_response_body_failed", http.StatusInternalServerError), nil if len(data) < 5 { // ignore blank line or wrong format
// } continue
// c.Writer.Header().Set("Content-Type", "application/json") }
// c.Writer.WriteHeader(resp.StatusCode) if data[:5] != "data:" {
// _, err = c.Writer.Write(jsonResponse) continue
// return nil, &fullTextResponse.Usage }
// } data = data[5:]
dataChan <- data
// func embeddingResponseAli2OpenAI(response *AliEmbeddingResponse) *OpenAIEmbeddingResponse { }
// openAIEmbeddingResponse := OpenAIEmbeddingResponse{ stopChan <- true
// Object: "list", }()
// Data: make([]OpenAIEmbeddingResponseItem, 0, len(response.Output.Embeddings)), common.SetEventStreamHeaders(c)
// Model: "text-embedding-v1",
// Usage: Usage{TotalTokens: response.Usage.TotalTokens},
// }
// for _, item := range response.Output.Embeddings {
// openAIEmbeddingResponse.Data = append(openAIEmbeddingResponse.Data, OpenAIEmbeddingResponseItem{
// Object: `embedding`,
// Index: item.TextIndex,
// Embedding: item.Embedding,
// })
// }
// return &openAIEmbeddingResponse
// }
// func responseAli2OpenAI(response *AliChatResponse) *OpenAITextResponse {
// choice := OpenAITextResponseChoice{
// Index: 0,
// Message: Message{
// Role: "assistant",
// Content: response.Output.Text,
// },
// FinishReason: response.Output.FinishReason,
// }
// fullTextResponse := OpenAITextResponse{
// Id: response.RequestId,
// Object: "chat.completion",
// Created: common.GetTimestamp(),
// Choices: []OpenAITextResponseChoice{choice},
// Usage: Usage{
// PromptTokens: response.Usage.InputTokens,
// CompletionTokens: response.Usage.OutputTokens,
// TotalTokens: response.Usage.InputTokens + response.Usage.OutputTokens,
// },
// }
// return &fullTextResponse
// }
// func streamResponseAli2OpenAI(aliResponse *AliChatResponse) *ChatCompletionsStreamResponse {
// var choice ChatCompletionsStreamResponseChoice
// choice.Delta.Content = aliResponse.Output.Text
// if aliResponse.Output.FinishReason != "null" {
// finishReason := aliResponse.Output.FinishReason
// choice.FinishReason = &finishReason
// }
// response := ChatCompletionsStreamResponse{
// Id: aliResponse.RequestId,
// Object: "chat.completion.chunk",
// Created: common.GetTimestamp(),
// Model: "ernie-bot",
// Choices: []ChatCompletionsStreamResponseChoice{choice},
// }
// return &response
// }
// func aliStreamHandler(c *gin.Context, resp *http.Response) (*OpenAIErrorWithStatusCode, *Usage) {
// var usage Usage
// scanner := bufio.NewScanner(resp.Body)
// scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) {
// if atEOF && len(data) == 0 {
// return 0, nil, nil
// }
// if i := strings.Index(string(data), "\n"); i >= 0 {
// return i + 1, data[0:i], nil
// }
// if atEOF {
// return len(data), data, nil
// }
// return 0, nil, nil
// })
// dataChan := make(chan string)
// stopChan := make(chan bool)
// go func() {
// for scanner.Scan() {
// data := scanner.Text()
// if len(data) < 5 { // ignore blank line or wrong format
// continue
// }
// if data[:5] != "data:" {
// continue
// }
// data = data[5:]
// dataChan <- data
// }
// stopChan <- true
// }()
// setEventStreamHeaders(c)
//lastResponseText := "" //lastResponseText := ""
// c.Stream(func(w io.Writer) bool { c.Stream(func(w io.Writer) bool {
// select { select {
// case data := <-dataChan: case data := <-dataChan:
// var aliResponse AliChatResponse var aliResponse ChatResponse
// err := json.Unmarshal([]byte(data), &aliResponse) err := json.Unmarshal([]byte(data), &aliResponse)
// if err != nil { if err != nil {
// common.SysError("error unmarshalling stream response: " + err.Error()) logger.SysError("error unmarshalling stream response: " + err.Error())
// return true return true
// } }
// if aliResponse.Usage.OutputTokens != 0 { if aliResponse.Usage.OutputTokens != 0 {
// usage.PromptTokens = aliResponse.Usage.InputTokens usage.PromptTokens = aliResponse.Usage.InputTokens
// usage.CompletionTokens = aliResponse.Usage.OutputTokens usage.CompletionTokens = aliResponse.Usage.OutputTokens
// usage.TotalTokens = aliResponse.Usage.InputTokens + aliResponse.Usage.OutputTokens usage.TotalTokens = aliResponse.Usage.InputTokens + aliResponse.Usage.OutputTokens
// } }
// response := streamResponseAli2OpenAI(&aliResponse) response := streamResponseAli2OpenAI(&aliResponse)
if response == nil {
return true
}
//response.Choices[0].Delta.Content = strings.TrimPrefix(response.Choices[0].Delta.Content, lastResponseText) //response.Choices[0].Delta.Content = strings.TrimPrefix(response.Choices[0].Delta.Content, lastResponseText)
//lastResponseText = aliResponse.Output.Text //lastResponseText = aliResponse.Output.Text
// jsonResponse, err := json.Marshal(response) jsonResponse, err := json.Marshal(response)
// if err != nil { if err != nil {
// common.SysError("error marshalling stream response: " + err.Error()) logger.SysError("error marshalling stream response: " + err.Error())
// return true return true
// } }
// c.Render(-1, common.CustomEvent{Data: "data: " + string(jsonResponse)}) c.Render(-1, common.CustomEvent{Data: "data: " + string(jsonResponse)})
// return true return true
// case <-stopChan: case <-stopChan:
// c.Render(-1, common.CustomEvent{Data: "data: [DONE]"}) c.Render(-1, common.CustomEvent{Data: "data: [DONE]"})
// return false return false
// } }
// }) })
// err := resp.Body.Close() err := resp.Body.Close()
// if err != nil { if err != nil {
// return errorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil return openai.ErrorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil
// } }
// return nil, &usage return nil, &usage
// } }
// func aliHandler(c *gin.Context, resp *http.Response) (*OpenAIErrorWithStatusCode, *Usage) { func Handler(c *gin.Context, resp *http.Response) (*model.ErrorWithStatusCode, *model.Usage) {
// var aliResponse AliChatResponse ctx := c.Request.Context()
// responseBody, err := io.ReadAll(resp.Body) var aliResponse ChatResponse
// if err != nil { responseBody, err := io.ReadAll(resp.Body)
// return errorWrapper(err, "read_response_body_failed", http.StatusInternalServerError), nil if err != nil {
// } return openai.ErrorWrapper(err, "read_response_body_failed", http.StatusInternalServerError), nil
// err = resp.Body.Close() }
// if err != nil { err = resp.Body.Close()
// return errorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil if err != nil {
// } return openai.ErrorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil
// err = json.Unmarshal(responseBody, &aliResponse) }
// if err != nil { logger.Debugf(ctx, "response body: %s\n", responseBody)
// return errorWrapper(err, "unmarshal_response_body_failed", http.StatusInternalServerError), nil err = json.Unmarshal(responseBody, &aliResponse)
// } if err != nil {
// if aliResponse.Code != "" { return openai.ErrorWrapper(err, "unmarshal_response_body_failed", http.StatusInternalServerError), nil
// return &OpenAIErrorWithStatusCode{ }
// OpenAIError: OpenAIError{ if aliResponse.Code != "" {
// Message: aliResponse.Message, return &model.ErrorWithStatusCode{
// Type: aliResponse.Code, Error: model.Error{
// Param: aliResponse.RequestId, Message: aliResponse.Message,
// Code: aliResponse.Code, Type: aliResponse.Code,
// }, Param: aliResponse.RequestId,
// StatusCode: resp.StatusCode, Code: aliResponse.Code,
// }, nil },
// } StatusCode: resp.StatusCode,
// fullTextResponse := responseAli2OpenAI(&aliResponse) }, nil
// jsonResponse, err := json.Marshal(fullTextResponse) }
// if err != nil { fullTextResponse := responseAli2OpenAI(&aliResponse)
// return errorWrapper(err, "marshal_response_body_failed", http.StatusInternalServerError), nil fullTextResponse.Model = "qwen"
// } jsonResponse, err := json.Marshal(fullTextResponse)
// c.Writer.Header().Set("Content-Type", "application/json") if err != nil {
// c.Writer.WriteHeader(resp.StatusCode) return openai.ErrorWrapper(err, "marshal_response_body_failed", http.StatusInternalServerError), nil
// _, err = c.Writer.Write(jsonResponse) }
// return nil, &fullTextResponse.Usage c.Writer.Header().Set("Content-Type", "application/json")
// } c.Writer.WriteHeader(resp.StatusCode)
_, err = c.Writer.Write(jsonResponse)
return nil, &fullTextResponse.Usage
}

View File

@@ -1,8 +1,8 @@
package ali package ali
import ( import (
"github.com/songquanpeng/one-api/relay/adaptor/openai" "github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/songquanpeng/one-api/relay/model" "github.com/Laisky/one-api/relay/model"
) )
type Message struct { type Message struct {

View File

@@ -6,10 +6,10 @@ import (
"net/http" "net/http"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/Laisky/one-api/relay/adaptor"
"github.com/Laisky/one-api/relay/meta"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/relay/adaptor"
"github.com/songquanpeng/one-api/relay/meta"
"github.com/songquanpeng/one-api/relay/model"
) )
type Adaptor struct { type Adaptor struct {

View File

@@ -8,13 +8,13 @@ import (
"net/http" "net/http"
"strings" "strings"
"github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/helper"
"github.com/Laisky/one-api/common/image"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common"
"github.com/songquanpeng/one-api/common/helper"
"github.com/songquanpeng/one-api/common/image"
"github.com/songquanpeng/one-api/common/logger"
"github.com/songquanpeng/one-api/relay/adaptor/openai"
"github.com/songquanpeng/one-api/relay/model"
) )
func stopReasonClaude2OpenAI(reason *string) string { func stopReasonClaude2OpenAI(reason *string) string {

View File

@@ -4,13 +4,13 @@ import (
"io" "io"
"net/http" "net/http"
"github.com/Laisky/errors/v2" "github.com/Laisky/one-api/common/ctxkey"
"github.com/Laisky/one-api/relay/adaptor"
"github.com/Laisky/one-api/relay/adaptor/anthropic"
"github.com/Laisky/one-api/relay/meta"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common" "github.com/pkg/errors"
"github.com/songquanpeng/one-api/relay/adaptor"
"github.com/songquanpeng/one-api/relay/adaptor/anthropic"
"github.com/songquanpeng/one-api/relay/meta"
"github.com/songquanpeng/one-api/relay/model"
) )
var _ adaptor.Adaptor = new(Adaptor) var _ adaptor.Adaptor = new(Adaptor)
@@ -36,9 +36,8 @@ func (a *Adaptor) ConvertRequest(c *gin.Context, relayMode int, request *model.G
} }
claudeReq := anthropic.ConvertRequest(*request) claudeReq := anthropic.ConvertRequest(*request)
c.Set(common.CtxKeyRequestModel, request.Model) c.Set(ctxkey.RequestModel, request.Model)
c.Set(common.CtxKeyRawRequest, request) c.Set(ctxkey.ConvertedRequest, claudeReq)
c.Set(common.CtxKeyConvertedRequest, claudeReq)
return claudeReq, nil return claudeReq, nil
} }

View File

@@ -7,8 +7,14 @@ import (
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
"strings"
"github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/common/ctxkey"
"github.com/Laisky/one-api/common/helper"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/relay/adaptor/anthropic"
relaymodel "github.com/Laisky/one-api/relay/model"
"github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/credentials" "github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/service/bedrockruntime" "github.com/aws/aws-sdk-go-v2/service/bedrockruntime"
@@ -16,23 +22,14 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/jinzhu/copier" "github.com/jinzhu/copier"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/songquanpeng/one-api/common"
"github.com/songquanpeng/one-api/common/helper"
"github.com/songquanpeng/one-api/common/logger"
"github.com/songquanpeng/one-api/model"
"github.com/songquanpeng/one-api/relay/adaptor/anthropic"
relaymodel "github.com/songquanpeng/one-api/relay/model"
) )
func newAwsClient(channel *model.Channel) (*bedrockruntime.Client, error) { func newAwsClient(c *gin.Context) (*bedrockruntime.Client, error) {
ks := strings.Split(channel.Key, "\n") ak := c.GetString(config.KeyAK)
if len(ks) != 2 { sk := c.GetString(config.KeySK)
return nil, errors.New("invalid key") region := c.GetString(config.KeyRegion)
}
ak, sk := ks[0], ks[1]
client := bedrockruntime.New(bedrockruntime.Options{ client := bedrockruntime.New(bedrockruntime.Options{
Region: *channel.BaseURL, Region: region,
Credentials: aws.NewCredentialsCache(credentials.NewStaticCredentialsProvider(ak, sk, "")), Credentials: aws.NewCredentialsCache(credentials.NewStaticCredentialsProvider(ak, sk, "")),
}) })
@@ -43,7 +40,7 @@ func wrapErr(err error) *relaymodel.ErrorWithStatusCode {
return &relaymodel.ErrorWithStatusCode{ return &relaymodel.ErrorWithStatusCode{
StatusCode: http.StatusInternalServerError, StatusCode: http.StatusInternalServerError,
Error: relaymodel.Error{ Error: relaymodel.Error{
Message: fmt.Sprintf("%+v", err), Message: fmt.Sprintf("%s", err.Error()),
}, },
} }
} }
@@ -67,19 +64,12 @@ func awsModelID(requestModel string) (string, error) {
} }
func Handler(c *gin.Context, resp *http.Response, promptTokens int, modelName string) (*relaymodel.ErrorWithStatusCode, *relaymodel.Usage) { func Handler(c *gin.Context, resp *http.Response, promptTokens int, modelName string) (*relaymodel.ErrorWithStatusCode, *relaymodel.Usage) {
var channel *model.Channel awsCli, err := newAwsClient(c)
if channeli, ok := c.Get(common.CtxKeyChannel); !ok {
return wrapErr(errors.New("channel not found")), nil
} else {
channel = channeli.(*model.Channel)
}
awsCli, err := newAwsClient(channel)
if err != nil { if err != nil {
return wrapErr(errors.Wrap(err, "newAwsClient")), nil return wrapErr(errors.Wrap(err, "newAwsClient")), nil
} }
awsModelId, err := awsModelID(c.GetString(common.CtxKeyRequestModel)) awsModelId, err := awsModelID(c.GetString(ctxkey.RequestModel))
if err != nil { if err != nil {
return wrapErr(errors.Wrap(err, "awsModelID")), nil return wrapErr(errors.Wrap(err, "awsModelID")), nil
} }
@@ -90,11 +80,11 @@ func Handler(c *gin.Context, resp *http.Response, promptTokens int, modelName st
ContentType: aws.String("application/json"), ContentType: aws.String("application/json"),
} }
claudeReqi, ok := c.Get(common.CtxKeyConvertedRequest) claudeReq_, ok := c.Get(ctxkey.ConvertedRequest)
if !ok { if !ok {
return wrapErr(errors.New("request not found")), nil return wrapErr(errors.New("request not found")), nil
} }
claudeReq := claudeReqi.(*anthropic.Request) claudeReq := claudeReq_.(*anthropic.Request)
awsClaudeReq := &Request{ awsClaudeReq := &Request{
AnthropicVersion: "bedrock-2023-05-31", AnthropicVersion: "bedrock-2023-05-31",
} }
@@ -133,20 +123,12 @@ func Handler(c *gin.Context, resp *http.Response, promptTokens int, modelName st
func StreamHandler(c *gin.Context, resp *http.Response) (*relaymodel.ErrorWithStatusCode, *relaymodel.Usage) { func StreamHandler(c *gin.Context, resp *http.Response) (*relaymodel.ErrorWithStatusCode, *relaymodel.Usage) {
createdTime := helper.GetTimestamp() createdTime := helper.GetTimestamp()
awsCli, err := newAwsClient(c)
var channel *model.Channel
if channeli, ok := c.Get(common.CtxKeyChannel); !ok {
return wrapErr(errors.New("channel not found")), nil
} else {
channel = channeli.(*model.Channel)
}
awsCli, err := newAwsClient(channel)
if err != nil { if err != nil {
return wrapErr(errors.Wrap(err, "newAwsClient")), nil return wrapErr(errors.Wrap(err, "newAwsClient")), nil
} }
awsModelId, err := awsModelID(c.GetString(common.CtxKeyRequestModel)) awsModelId, err := awsModelID(c.GetString(ctxkey.RequestModel))
if err != nil { if err != nil {
return wrapErr(errors.Wrap(err, "awsModelID")), nil return wrapErr(errors.Wrap(err, "awsModelID")), nil
} }
@@ -157,11 +139,11 @@ func StreamHandler(c *gin.Context, resp *http.Response) (*relaymodel.ErrorWithSt
ContentType: aws.String("application/json"), ContentType: aws.String("application/json"),
} }
claudeReqi, ok := c.Get(common.CtxKeyConvertedRequest) claudeReq_, ok := c.Get(ctxkey.ConvertedRequest)
if !ok { if !ok {
return wrapErr(errors.New("request not found")), nil return wrapErr(errors.New("request not found")), nil
} }
claudeReq := claudeReqi.(*anthropic.Request) claudeReq := claudeReq_.(*anthropic.Request)
awsClaudeReq := &Request{ awsClaudeReq := &Request{
AnthropicVersion: "bedrock-2023-05-31", AnthropicVersion: "bedrock-2023-05-31",
@@ -211,7 +193,7 @@ func StreamHandler(c *gin.Context, resp *http.Response) (*relaymodel.ErrorWithSt
return true return true
} }
response.Id = id response.Id = id
response.Model = c.GetString(common.CtxKeyOriginModel) response.Model = c.GetString(ctxkey.OriginalModel)
response.Created = createdTime response.Created = createdTime
jsonStr, err := json.Marshal(response) jsonStr, err := json.Marshal(response)
if err != nil { if err != nil {

View File

@@ -1,6 +1,6 @@
package aws package aws
import "github.com/songquanpeng/one-api/relay/adaptor/anthropic" import "github.com/Laisky/one-api/relay/adaptor/anthropic"
// Request is the request to AWS Claude // Request is the request to AWS Claude
// //

View File

@@ -1,8 +1,8 @@
package azure package azure
import ( import (
"github.com/Laisky/one-api/common/config"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/config"
) )
func GetAPIVersion(c *gin.Context) string { func GetAPIVersion(c *gin.Context) string {

View File

@@ -1,93 +1,143 @@
package baidu package baidu
// import ( import (
// "github.com/Laisky/errors/v2" "errors"
// "github.com/gin-gonic/gin" "fmt"
// "github.com/songquanpeng/one-api/relay/channel" "io"
// "github.com/songquanpeng/one-api/relay/constant" "net/http"
// "github.com/songquanpeng/one-api/relay/model" "strings"
// "github.com/songquanpeng/one-api/relay/util"
// "io"
// "net/http"
// )
// // type Adaptor struct { "github.com/Laisky/one-api/relay/adaptor"
// // } "github.com/Laisky/one-api/relay/meta"
"github.com/Laisky/one-api/relay/model"
"github.com/Laisky/one-api/relay/relaymode"
"github.com/gin-gonic/gin"
)
// func (a *Adaptor) Init(meta *util.RelayMeta) { type Adaptor struct {
}
// } func (a *Adaptor) Init(meta *meta.Meta) {
// func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { }
// // https://cloud.baidu.com/doc/WENXINWORKSHOP/s/clntwmv7t
// var fullRequestURL string
// switch meta.ActualModelName {
// case "ERNIE-Bot-4":
// fullRequestURL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro"
// case "ERNIE-Bot-8K":
// fullRequestURL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie_bot_8k"
// case "ERNIE-Bot":
// fullRequestURL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions"
// case "ERNIE-Speed":
// fullRequestURL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie_speed"
// case "ERNIE-Bot-turbo":
// fullRequestURL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant"
// case "BLOOMZ-7B":
// fullRequestURL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/bloomz_7b1"
// case "Embedding-V1":
// fullRequestURL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/embeddings/embedding-v1"
// }
// var accessToken string
// var err error
// if accessToken, err = GetAccessToken(meta.APIKey); err != nil {
// return "", err
// }
// fullRequestURL += "?access_token=" + accessToken
// return fullRequestURL, nil
// }
// func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Request, meta *util.RelayMeta) error { func (a *Adaptor) GetRequestURL(meta *meta.Meta) (string, error) {
// channel.SetupCommonRequestHeader(c, req, meta) // https://cloud.baidu.com/doc/WENXINWORKSHOP/s/clntwmv7t
// req.Header.Set("Authorization", "Bearer "+meta.APIKey) suffix := "chat/"
// return nil if strings.HasPrefix(meta.ActualModelName, "Embedding") {
// } suffix = "embeddings/"
}
if strings.HasPrefix(meta.ActualModelName, "bge-large") {
suffix = "embeddings/"
}
if strings.HasPrefix(meta.ActualModelName, "tao-8k") {
suffix = "embeddings/"
}
switch meta.ActualModelName {
case "ERNIE-4.0":
suffix += "completions_pro"
case "ERNIE-Bot-4":
suffix += "completions_pro"
case "ERNIE-Bot":
suffix += "completions"
case "ERNIE-Bot-turbo":
suffix += "eb-instant"
case "ERNIE-Speed":
suffix += "ernie_speed"
case "ERNIE-4.0-8K":
suffix += "completions_pro"
case "ERNIE-3.5-8K":
suffix += "completions"
case "ERNIE-3.5-8K-0205":
suffix += "ernie-3.5-8k-0205"
case "ERNIE-3.5-8K-1222":
suffix += "ernie-3.5-8k-1222"
case "ERNIE-Bot-8K":
suffix += "ernie_bot_8k"
case "ERNIE-3.5-4K-0205":
suffix += "ernie-3.5-4k-0205"
case "ERNIE-Speed-8K":
suffix += "ernie_speed"
case "ERNIE-Speed-128K":
suffix += "ernie-speed-128k"
case "ERNIE-Lite-8K-0922":
suffix += "eb-instant"
case "ERNIE-Lite-8K-0308":
suffix += "ernie-lite-8k"
case "ERNIE-Tiny-8K":
suffix += "ernie-tiny-8k"
case "BLOOMZ-7B":
suffix += "bloomz_7b1"
case "Embedding-V1":
suffix += "embedding-v1"
case "bge-large-zh":
suffix += "bge_large_zh"
case "bge-large-en":
suffix += "bge_large_en"
case "tao-8k":
suffix += "tao_8k"
default:
suffix += strings.ToLower(meta.ActualModelName)
}
fullRequestURL := fmt.Sprintf("%s/rpc/2.0/ai_custom/v1/wenxinworkshop/%s", meta.BaseURL, suffix)
var accessToken string
var err error
if accessToken, err = GetAccessToken(meta.APIKey); err != nil {
return "", err
}
fullRequestURL += "?access_token=" + accessToken
return fullRequestURL, nil
}
// func (a *Adaptor) ConvertRequest(c *gin.Context, relayMode int, request *model.GeneralOpenAIRequest) (any, error) { func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Request, meta *meta.Meta) error {
// if request == nil { adaptor.SetupCommonRequestHeader(c, req, meta)
// return nil, errors.New("request is nil") req.Header.Set("Authorization", "Bearer "+meta.APIKey)
// } return nil
// switch relayMode { }
// case constant.RelayModeEmbeddings:
// baiduEmbeddingRequest := ConvertEmbeddingRequest(*request)
// return baiduEmbeddingRequest, nil
// default:
// baiduRequest := ConvertRequest(*request)
// return baiduRequest, nil
// }
// }
// func (a *Adaptor) DoRequest(c *gin.Context, meta *util.RelayMeta, requestBody io.Reader) (*http.Response, error) { func (a *Adaptor) ConvertRequest(c *gin.Context, relayMode int, request *model.GeneralOpenAIRequest) (any, error) {
// return channel.DoRequestHelper(a, c, meta, requestBody) if request == nil {
// } return nil, errors.New("request is nil")
}
switch relayMode {
case relaymode.Embeddings:
baiduEmbeddingRequest := ConvertEmbeddingRequest(*request)
return baiduEmbeddingRequest, nil
default:
baiduRequest := ConvertRequest(*request)
return baiduRequest, nil
}
}
// func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, meta *util.RelayMeta) (usage *model.Usage, err *model.ErrorWithStatusCode) { func (a *Adaptor) ConvertImageRequest(request *model.ImageRequest) (any, error) {
// if meta.IsStream { if request == nil {
// err, usage = StreamHandler(c, resp) return nil, errors.New("request is nil")
// } else { }
// switch meta.Mode { return request, nil
// case constant.RelayModeEmbeddings: }
// err, usage = EmbeddingHandler(c, resp)
// default:
// err, usage = Handler(c, resp)
// }
// }
// return
// }
// func (a *Adaptor) GetModelList() []string { func (a *Adaptor) DoRequest(c *gin.Context, meta *meta.Meta, requestBody io.Reader) (*http.Response, error) {
// return ModelList return adaptor.DoRequestHelper(a, c, meta, requestBody)
// } }
// func (a *Adaptor) GetChannelName() string { func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, meta *meta.Meta) (usage *model.Usage, err *model.ErrorWithStatusCode) {
// return "baidu" if meta.IsStream {
// } err, usage = StreamHandler(c, resp)
} else {
switch meta.Mode {
case relaymode.Embeddings:
err, usage = EmbeddingHandler(c, resp)
default:
err, usage = Handler(c, resp)
}
}
return
}
func (a *Adaptor) GetModelList() []string {
return ModelList
}
func (a *Adaptor) GetChannelName() string {
return "baidu"
}

View File

@@ -1,359 +1,329 @@
package baidu package baidu
// import ( import (
// "bufio" "bufio"
// "encoding/json" "encoding/json"
// "github.com/Laisky/errors/v2" "errors"
// "fmt" "fmt"
// "github.com/gin-gonic/gin" "io"
// "io" "net/http"
// "net/http" "strings"
// "one-api/common" "sync"
// "strings" "time"
// "sync"
// "time"
// )
// // https://cloud.baidu.com/doc/WENXINWORKSHOP/s/flfmc9do2 "github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/Laisky/one-api/relay/client"
"github.com/Laisky/one-api/relay/constant"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin"
)
// type BaiduTokenResponse struct { // https://cloud.baidu.com/doc/WENXINWORKSHOP/s/flfmc9do2
// ExpiresIn int `json:"expires_in"`
// AccessToken string `json:"access_token"`
// }
// type BaiduMessage struct { type TokenResponse struct {
// Role string `json:"role"` ExpiresIn int `json:"expires_in"`
// Content string `json:"content"` AccessToken string `json:"access_token"`
// } }
// type BaiduChatRequest struct { type Message struct {
// Messages []BaiduMessage `json:"messages"` Role string `json:"role"`
// Stream bool `json:"stream"` Content string `json:"content"`
// UserId string `json:"user_id,omitempty"` }
// }
// type BaiduError struct { type ChatRequest struct {
// ErrorCode int `json:"error_code"` Messages []Message `json:"messages"`
// ErrorMsg string `json:"error_msg"` Temperature float64 `json:"temperature,omitempty"`
// } TopP float64 `json:"top_p,omitempty"`
PenaltyScore float64 `json:"penalty_score,omitempty"`
Stream bool `json:"stream,omitempty"`
System string `json:"system,omitempty"`
DisableSearch bool `json:"disable_search,omitempty"`
EnableCitation bool `json:"enable_citation,omitempty"`
MaxOutputTokens int `json:"max_output_tokens,omitempty"`
UserId string `json:"user_id,omitempty"`
}
// type BaiduChatResponse struct { type Error struct {
// Id string `json:"id"` ErrorCode int `json:"error_code"`
// Object string `json:"object"` ErrorMsg string `json:"error_msg"`
// Created int64 `json:"created"` }
// Result string `json:"result"`
// IsTruncated bool `json:"is_truncated"`
// NeedClearHistory bool `json:"need_clear_history"`
// Usage Usage `json:"usage"`
// BaiduError
// }
// type BaiduChatStreamResponse struct { var baiduTokenStore sync.Map
// BaiduChatResponse
// SentenceId int `json:"sentence_id"`
// IsEnd bool `json:"is_end"`
// }
// type BaiduEmbeddingRequest struct { func ConvertRequest(request model.GeneralOpenAIRequest) *ChatRequest {
// Input []string `json:"input"` baiduRequest := ChatRequest{
// } Messages: make([]Message, 0, len(request.Messages)),
Temperature: request.Temperature,
TopP: request.TopP,
PenaltyScore: request.FrequencyPenalty,
Stream: request.Stream,
DisableSearch: false,
EnableCitation: false,
MaxOutputTokens: request.MaxTokens,
UserId: request.User,
}
for _, message := range request.Messages {
if message.Role == "system" {
baiduRequest.System = message.StringContent()
} else {
baiduRequest.Messages = append(baiduRequest.Messages, Message{
Role: message.Role,
Content: message.StringContent(),
})
}
}
return &baiduRequest
}
// type BaiduEmbeddingData struct { func responseBaidu2OpenAI(response *ChatResponse) *openai.TextResponse {
// Object string `json:"object"` choice := openai.TextResponseChoice{
// Embedding []float64 `json:"embedding"` Index: 0,
// Index int `json:"index"` Message: model.Message{
// } Role: "assistant",
Content: response.Result,
},
FinishReason: "stop",
}
fullTextResponse := openai.TextResponse{
Id: response.Id,
Object: "chat.completion",
Created: response.Created,
Choices: []openai.TextResponseChoice{choice},
Usage: response.Usage,
}
return &fullTextResponse
}
// type BaiduEmbeddingResponse struct { func streamResponseBaidu2OpenAI(baiduResponse *ChatStreamResponse) *openai.ChatCompletionsStreamResponse {
// Id string `json:"id"` var choice openai.ChatCompletionsStreamResponseChoice
// Object string `json:"object"` choice.Delta.Content = baiduResponse.Result
// Created int64 `json:"created"` if baiduResponse.IsEnd {
// Data []BaiduEmbeddingData `json:"data"` choice.FinishReason = &constant.StopFinishReason
// Usage Usage `json:"usage"` }
// BaiduError response := openai.ChatCompletionsStreamResponse{
// } Id: baiduResponse.Id,
Object: "chat.completion.chunk",
Created: baiduResponse.Created,
Model: "ernie-bot",
Choices: []openai.ChatCompletionsStreamResponseChoice{choice},
}
return &response
}
// type BaiduAccessToken struct { func ConvertEmbeddingRequest(request model.GeneralOpenAIRequest) *EmbeddingRequest {
// AccessToken string `json:"access_token"` return &EmbeddingRequest{
// Error string `json:"error,omitempty"` Input: request.ParseInput(),
// ErrorDescription string `json:"error_description,omitempty"` }
// ExpiresIn int64 `json:"expires_in,omitempty"` }
// ExpiresAt time.Time `json:"-"`
// }
// var baiduTokenStore sync.Map func embeddingResponseBaidu2OpenAI(response *EmbeddingResponse) *openai.EmbeddingResponse {
openAIEmbeddingResponse := openai.EmbeddingResponse{
Object: "list",
Data: make([]openai.EmbeddingResponseItem, 0, len(response.Data)),
Model: "baidu-embedding",
Usage: response.Usage,
}
for _, item := range response.Data {
openAIEmbeddingResponse.Data = append(openAIEmbeddingResponse.Data, openai.EmbeddingResponseItem{
Object: item.Object,
Index: item.Index,
Embedding: item.Embedding,
})
}
return &openAIEmbeddingResponse
}
// func requestOpenAI2Baidu(request GeneralOpenAIRequest) *BaiduChatRequest { func StreamHandler(c *gin.Context, resp *http.Response) (*model.ErrorWithStatusCode, *model.Usage) {
// messages := make([]BaiduMessage, 0, len(request.Messages)) var usage model.Usage
// for _, message := range request.Messages { scanner := bufio.NewScanner(resp.Body)
// if message.Role == "system" { scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) {
// messages = append(messages, BaiduMessage{ if atEOF && len(data) == 0 {
// Role: "user", return 0, nil, nil
// Content: message.Content, }
// }) if i := strings.Index(string(data), "\n"); i >= 0 {
// messages = append(messages, BaiduMessage{ return i + 1, data[0:i], nil
// Role: "assistant", }
// Content: "Okay", if atEOF {
// }) return len(data), data, nil
// } else { }
// messages = append(messages, BaiduMessage{ return 0, nil, nil
// Role: message.Role, })
// Content: message.Content, dataChan := make(chan string)
// }) stopChan := make(chan bool)
// } go func() {
// } for scanner.Scan() {
// return &BaiduChatRequest{ data := scanner.Text()
// Messages: messages, if len(data) < 6 { // ignore blank line or wrong format
// Stream: request.Stream, continue
// } }
// } data = data[6:]
dataChan <- data
}
stopChan <- true
}()
common.SetEventStreamHeaders(c)
c.Stream(func(w io.Writer) bool {
select {
case data := <-dataChan:
var baiduResponse ChatStreamResponse
err := json.Unmarshal([]byte(data), &baiduResponse)
if err != nil {
logger.SysError("error unmarshalling stream response: " + err.Error())
return true
}
if baiduResponse.Usage.TotalTokens != 0 {
usage.TotalTokens = baiduResponse.Usage.TotalTokens
usage.PromptTokens = baiduResponse.Usage.PromptTokens
usage.CompletionTokens = baiduResponse.Usage.TotalTokens - baiduResponse.Usage.PromptTokens
}
response := streamResponseBaidu2OpenAI(&baiduResponse)
jsonResponse, err := json.Marshal(response)
if err != nil {
logger.SysError("error marshalling stream response: " + err.Error())
return true
}
c.Render(-1, common.CustomEvent{Data: "data: " + string(jsonResponse)})
return true
case <-stopChan:
c.Render(-1, common.CustomEvent{Data: "data: [DONE]"})
return false
}
})
err := resp.Body.Close()
if err != nil {
return openai.ErrorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil
}
return nil, &usage
}
// func responseBaidu2OpenAI(response *BaiduChatResponse) *OpenAITextResponse { func Handler(c *gin.Context, resp *http.Response) (*model.ErrorWithStatusCode, *model.Usage) {
// choice := OpenAITextResponseChoice{ var baiduResponse ChatResponse
// Index: 0, responseBody, err := io.ReadAll(resp.Body)
// Message: Message{ if err != nil {
// Role: "assistant", return openai.ErrorWrapper(err, "read_response_body_failed", http.StatusInternalServerError), nil
// Content: response.Result, }
// }, err = resp.Body.Close()
// FinishReason: "stop", if err != nil {
// } return openai.ErrorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil
// fullTextResponse := OpenAITextResponse{ }
// Id: response.Id, err = json.Unmarshal(responseBody, &baiduResponse)
// Object: "chat.completion", if err != nil {
// Created: response.Created, return openai.ErrorWrapper(err, "unmarshal_response_body_failed", http.StatusInternalServerError), nil
// Choices: []OpenAITextResponseChoice{choice}, }
// Usage: response.Usage, if baiduResponse.ErrorMsg != "" {
// } return &model.ErrorWithStatusCode{
// return &fullTextResponse Error: model.Error{
// } Message: baiduResponse.ErrorMsg,
Type: "baidu_error",
Param: "",
Code: baiduResponse.ErrorCode,
},
StatusCode: resp.StatusCode,
}, nil
}
fullTextResponse := responseBaidu2OpenAI(&baiduResponse)
fullTextResponse.Model = "ernie-bot"
jsonResponse, err := json.Marshal(fullTextResponse)
if err != nil {
return openai.ErrorWrapper(err, "marshal_response_body_failed", http.StatusInternalServerError), nil
}
c.Writer.Header().Set("Content-Type", "application/json")
c.Writer.WriteHeader(resp.StatusCode)
_, err = c.Writer.Write(jsonResponse)
return nil, &fullTextResponse.Usage
}
// func streamResponseBaidu2OpenAI(baiduResponse *BaiduChatStreamResponse) *ChatCompletionsStreamResponse { func EmbeddingHandler(c *gin.Context, resp *http.Response) (*model.ErrorWithStatusCode, *model.Usage) {
// var choice ChatCompletionsStreamResponseChoice var baiduResponse EmbeddingResponse
// choice.Delta.Content = baiduResponse.Result responseBody, err := io.ReadAll(resp.Body)
// if baiduResponse.IsEnd { if err != nil {
// choice.FinishReason = &stopFinishReason return openai.ErrorWrapper(err, "read_response_body_failed", http.StatusInternalServerError), nil
// } }
// response := ChatCompletionsStreamResponse{ err = resp.Body.Close()
// Id: baiduResponse.Id, if err != nil {
// Object: "chat.completion.chunk", return openai.ErrorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil
// Created: baiduResponse.Created, }
// Model: "ernie-bot", err = json.Unmarshal(responseBody, &baiduResponse)
// Choices: []ChatCompletionsStreamResponseChoice{choice}, if err != nil {
// } return openai.ErrorWrapper(err, "unmarshal_response_body_failed", http.StatusInternalServerError), nil
// return &response }
// } if baiduResponse.ErrorMsg != "" {
return &model.ErrorWithStatusCode{
Error: model.Error{
Message: baiduResponse.ErrorMsg,
Type: "baidu_error",
Param: "",
Code: baiduResponse.ErrorCode,
},
StatusCode: resp.StatusCode,
}, nil
}
fullTextResponse := embeddingResponseBaidu2OpenAI(&baiduResponse)
jsonResponse, err := json.Marshal(fullTextResponse)
if err != nil {
return openai.ErrorWrapper(err, "marshal_response_body_failed", http.StatusInternalServerError), nil
}
c.Writer.Header().Set("Content-Type", "application/json")
c.Writer.WriteHeader(resp.StatusCode)
_, err = c.Writer.Write(jsonResponse)
return nil, &fullTextResponse.Usage
}
// func embeddingRequestOpenAI2Baidu(request GeneralOpenAIRequest) *BaiduEmbeddingRequest { func GetAccessToken(apiKey string) (string, error) {
// return &BaiduEmbeddingRequest{ if val, ok := baiduTokenStore.Load(apiKey); ok {
// Input: request.ParseInput(), var accessToken AccessToken
// } if accessToken, ok = val.(AccessToken); ok {
// } // soon this will expire
if time.Now().Add(time.Hour).After(accessToken.ExpiresAt) {
go func() {
_, _ = getBaiduAccessTokenHelper(apiKey)
}()
}
return accessToken.AccessToken, nil
}
}
accessToken, err := getBaiduAccessTokenHelper(apiKey)
if err != nil {
return "", err
}
if accessToken == nil {
return "", errors.New("GetAccessToken return a nil token")
}
return (*accessToken).AccessToken, nil
}
// func embeddingResponseBaidu2OpenAI(response *BaiduEmbeddingResponse) *OpenAIEmbeddingResponse { func getBaiduAccessTokenHelper(apiKey string) (*AccessToken, error) {
// openAIEmbeddingResponse := OpenAIEmbeddingResponse{ parts := strings.Split(apiKey, "|")
// Object: "list", if len(parts) != 2 {
// Data: make([]OpenAIEmbeddingResponseItem, 0, len(response.Data)), return nil, errors.New("invalid baidu apikey")
// Model: "baidu-embedding", }
// Usage: response.Usage, req, err := http.NewRequest("POST", fmt.Sprintf("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s",
// } parts[0], parts[1]), nil)
// for _, item := range response.Data { if err != nil {
// openAIEmbeddingResponse.Data = append(openAIEmbeddingResponse.Data, OpenAIEmbeddingResponseItem{ return nil, err
// Object: item.Object, }
// Index: item.Index, req.Header.Add("Content-Type", "application/json")
// Embedding: item.Embedding, req.Header.Add("Accept", "application/json")
// }) res, err := client.ImpatientHTTPClient.Do(req)
// } if err != nil {
// return &openAIEmbeddingResponse return nil, err
// } }
defer res.Body.Close()
// func baiduStreamHandler(c *gin.Context, resp *http.Response) (*OpenAIErrorWithStatusCode, *Usage) { var accessToken AccessToken
// var usage Usage err = json.NewDecoder(res.Body).Decode(&accessToken)
// scanner := bufio.NewScanner(resp.Body) if err != nil {
// scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) { return nil, err
// if atEOF && len(data) == 0 { }
// return 0, nil, nil if accessToken.Error != "" {
// } return nil, errors.New(accessToken.Error + ": " + accessToken.ErrorDescription)
// if i := strings.Index(string(data), "\n"); i >= 0 { }
// return i + 1, data[0:i], nil if accessToken.AccessToken == "" {
// } return nil, errors.New("getBaiduAccessTokenHelper get empty access token")
// if atEOF { }
// return len(data), data, nil accessToken.ExpiresAt = time.Now().Add(time.Duration(accessToken.ExpiresIn) * time.Second)
// } baiduTokenStore.Store(apiKey, accessToken)
// return 0, nil, nil return &accessToken, nil
// }) }
// dataChan := make(chan string)
// stopChan := make(chan bool)
// go func() {
// for scanner.Scan() {
// data := scanner.Text()
// if len(data) < 6 { // ignore blank line or wrong format
// continue
// }
// data = data[6:]
// dataChan <- data
// }
// stopChan <- true
// }()
// setEventStreamHeaders(c)
// c.Stream(func(w io.Writer) bool {
// select {
// case data := <-dataChan:
// var baiduResponse BaiduChatStreamResponse
// err := json.Unmarshal([]byte(data), &baiduResponse)
// if err != nil {
// common.SysError("error unmarshalling stream response: " + err.Error())
// return true
// }
// if baiduResponse.Usage.TotalTokens != 0 {
// usage.TotalTokens = baiduResponse.Usage.TotalTokens
// usage.PromptTokens = baiduResponse.Usage.PromptTokens
// usage.CompletionTokens = baiduResponse.Usage.TotalTokens - baiduResponse.Usage.PromptTokens
// }
// response := streamResponseBaidu2OpenAI(&baiduResponse)
// jsonResponse, err := json.Marshal(response)
// if err != nil {
// common.SysError("error marshalling stream response: " + err.Error())
// return true
// }
// c.Render(-1, common.CustomEvent{Data: "data: " + string(jsonResponse)})
// return true
// case <-stopChan:
// c.Render(-1, common.CustomEvent{Data: "data: [DONE]"})
// return false
// }
// })
// err := resp.Body.Close()
// if err != nil {
// return errorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil
// }
// return nil, &usage
// }
// func baiduHandler(c *gin.Context, resp *http.Response) (*OpenAIErrorWithStatusCode, *Usage) {
// var baiduResponse BaiduChatResponse
// responseBody, err := io.ReadAll(resp.Body)
// if err != nil {
// return errorWrapper(err, "read_response_body_failed", http.StatusInternalServerError), nil
// }
// err = resp.Body.Close()
// if err != nil {
// return errorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil
// }
// err = json.Unmarshal(responseBody, &baiduResponse)
// if err != nil {
// return errorWrapper(err, "unmarshal_response_body_failed", http.StatusInternalServerError), nil
// }
// if baiduResponse.ErrorMsg != "" {
// return &OpenAIErrorWithStatusCode{
// OpenAIError: OpenAIError{
// Message: baiduResponse.ErrorMsg,
// Type: "baidu_error",
// Param: "",
// Code: baiduResponse.ErrorCode,
// },
// StatusCode: resp.StatusCode,
// }, nil
// }
// fullTextResponse := responseBaidu2OpenAI(&baiduResponse)
// jsonResponse, err := json.Marshal(fullTextResponse)
// if err != nil {
// return errorWrapper(err, "marshal_response_body_failed", http.StatusInternalServerError), nil
// }
// c.Writer.Header().Set("Content-Type", "application/json")
// c.Writer.WriteHeader(resp.StatusCode)
// _, err = c.Writer.Write(jsonResponse)
// return nil, &fullTextResponse.Usage
// }
// func baiduEmbeddingHandler(c *gin.Context, resp *http.Response) (*OpenAIErrorWithStatusCode, *Usage) {
// var baiduResponse BaiduEmbeddingResponse
// responseBody, err := io.ReadAll(resp.Body)
// if err != nil {
// return errorWrapper(err, "read_response_body_failed", http.StatusInternalServerError), nil
// }
// err = resp.Body.Close()
// if err != nil {
// return errorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil
// }
// err = json.Unmarshal(responseBody, &baiduResponse)
// if err != nil {
// return errorWrapper(err, "unmarshal_response_body_failed", http.StatusInternalServerError), nil
// }
// if baiduResponse.ErrorMsg != "" {
// return &OpenAIErrorWithStatusCode{
// OpenAIError: OpenAIError{
// Message: baiduResponse.ErrorMsg,
// Type: "baidu_error",
// Param: "",
// Code: baiduResponse.ErrorCode,
// },
// StatusCode: resp.StatusCode,
// }, nil
// }
// fullTextResponse := embeddingResponseBaidu2OpenAI(&baiduResponse)
// jsonResponse, err := json.Marshal(fullTextResponse)
// if err != nil {
// return errorWrapper(err, "marshal_response_body_failed", http.StatusInternalServerError), nil
// }
// c.Writer.Header().Set("Content-Type", "application/json")
// c.Writer.WriteHeader(resp.StatusCode)
// _, err = c.Writer.Write(jsonResponse)
// return nil, &fullTextResponse.Usage
// }
// func getBaiduAccessToken(apiKey string) (string, error) {
// if val, ok := baiduTokenStore.Load(apiKey); ok {
// var accessToken BaiduAccessToken
// if accessToken, ok = val.(BaiduAccessToken); ok {
// // soon this will expire
// if time.Now().Add(time.Hour).After(accessToken.ExpiresAt) {
// go func() {
// _, _ = getBaiduAccessTokenHelper(apiKey)
// }()
// }
// return accessToken.AccessToken, nil
// }
// }
// accessToken, err := getBaiduAccessTokenHelper(apiKey)
// if err != nil {
// return "", err
// }
// if accessToken == nil {
// return "", errors.New("getBaiduAccessToken return a nil token")
// }
// return (*accessToken).AccessToken, nil
// }
// func getBaiduAccessTokenHelper(apiKey string) (*BaiduAccessToken, error) {
// parts := strings.Split(apiKey, "|")
// if len(parts) != 2 {
// return nil, errors.New("invalid baidu apikey")
// }
// req, err := http.NewRequest("POST", fmt.Sprintf("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s",
// parts[0], parts[1]), nil)
// if err != nil {
// return nil, err
// }
// req.Header.Add("Content-Type", "application/json")
// req.Header.Add("Accept", "application/json")
// res, err := impatientHTTPClient.Do(req)
// if err != nil {
// return nil, err
// }
// defer res.Body.Close()
// var accessToken BaiduAccessToken
// err = json.NewDecoder(res.Body).Decode(&accessToken)
// if err != nil {
// return nil, err
// }
// if accessToken.Error != "" {
// return nil, errors.New(accessToken.Error + ": " + accessToken.ErrorDescription)
// }
// if accessToken.AccessToken == "" {
// return nil, errors.New("getBaiduAccessTokenHelper get empty access token")
// }
// accessToken.ExpiresAt = time.Now().Add(time.Duration(accessToken.ExpiresIn) * time.Second)
// baiduTokenStore.Store(apiKey, accessToken)
// return &accessToken, nil
// }

View File

@@ -1,50 +1,51 @@
package baidu package baidu
// import ( import (
// "github.com/songquanpeng/one-api/relay/channel/openai" "time"
// "time"
// )
// type ChatResponse struct { "github.com/Laisky/one-api/relay/model"
// Id string `json:"id"` )
// Object string `json:"object"`
// Created int64 `json:"created"`
// Result string `json:"result"`
// IsTruncated bool `json:"is_truncated"`
// NeedClearHistory bool `json:"need_clear_history"`
// Usage openai.Usage `json:"usage"`
// Error
// }
// type ChatStreamResponse struct { type ChatResponse struct {
// ChatResponse Id string `json:"id"`
// SentenceId int `json:"sentence_id"` Object string `json:"object"`
// IsEnd bool `json:"is_end"` Created int64 `json:"created"`
// } Result string `json:"result"`
IsTruncated bool `json:"is_truncated"`
NeedClearHistory bool `json:"need_clear_history"`
Usage model.Usage `json:"usage"`
Error
}
// type EmbeddingRequest struct { type ChatStreamResponse struct {
// Input []string `json:"input"` ChatResponse
// } SentenceId int `json:"sentence_id"`
IsEnd bool `json:"is_end"`
}
// type EmbeddingData struct { type EmbeddingRequest struct {
// Object string `json:"object"` Input []string `json:"input"`
// Embedding []float64 `json:"embedding"` }
// Index int `json:"index"`
// }
// type EmbeddingResponse struct { type EmbeddingData struct {
// Id string `json:"id"` Object string `json:"object"`
// Object string `json:"object"` Embedding []float64 `json:"embedding"`
// Created int64 `json:"created"` Index int `json:"index"`
// Data []EmbeddingData `json:"data"` }
// Usage openai.Usage `json:"usage"`
// Error
// }
// type AccessToken struct { type EmbeddingResponse struct {
// AccessToken string `json:"access_token"` Id string `json:"id"`
// Error string `json:"error,omitempty"` Object string `json:"object"`
// ErrorDescription string `json:"error_description,omitempty"` Created int64 `json:"created"`
// ExpiresIn int64 `json:"expires_in,omitempty"` Data []EmbeddingData `json:"data"`
// ExpiresAt time.Time `json:"-"` Usage model.Usage `json:"usage"`
// } Error
}
type AccessToken struct {
AccessToken string `json:"access_token"`
Error string `json:"error,omitempty"`
ErrorDescription string `json:"error_description,omitempty"`
ExpiresIn int64 `json:"expires_in,omitempty"`
ExpiresAt time.Time `json:"-"`
}

View File

@@ -5,9 +5,9 @@ import (
"net/http" "net/http"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/Laisky/one-api/relay/client"
"github.com/Laisky/one-api/relay/meta"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/relay/client"
"github.com/songquanpeng/one-api/relay/meta"
) )
func SetupCommonRequestHeader(c *gin.Context, req *http.Request, meta *meta.Meta) { func SetupCommonRequestHeader(c *gin.Context, req *http.Request, meta *meta.Meta) {

View File

@@ -6,13 +6,13 @@ import (
"net/http" "net/http"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/common/helper"
channelhelper "github.com/Laisky/one-api/relay/adaptor"
"github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/Laisky/one-api/relay/meta"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/helper"
channelhelper "github.com/songquanpeng/one-api/relay/adaptor"
"github.com/songquanpeng/one-api/relay/adaptor/openai"
"github.com/songquanpeng/one-api/relay/meta"
"github.com/songquanpeng/one-api/relay/model"
) )
type Adaptor struct { type Adaptor struct {

View File

@@ -8,15 +8,15 @@ import (
"net/http" "net/http"
"strings" "strings"
"github.com/songquanpeng/one-api/common" "github.com/Laisky/one-api/common"
"github.com/songquanpeng/one-api/common/config" "github.com/Laisky/one-api/common/config"
"github.com/songquanpeng/one-api/common/helper" "github.com/Laisky/one-api/common/helper"
"github.com/songquanpeng/one-api/common/image" "github.com/Laisky/one-api/common/image"
"github.com/songquanpeng/one-api/common/logger" "github.com/Laisky/one-api/common/logger"
"github.com/songquanpeng/one-api/common/random" "github.com/Laisky/one-api/common/random"
"github.com/songquanpeng/one-api/relay/adaptor/openai" "github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/songquanpeng/one-api/relay/constant" "github.com/Laisky/one-api/relay/constant"
"github.com/songquanpeng/one-api/relay/model" "github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )

View File

@@ -1,9 +1,9 @@
package adaptor package adaptor
import ( import (
"github.com/Laisky/one-api/relay/meta"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/relay/meta"
"github.com/songquanpeng/one-api/relay/model"
"io" "io"
"net/http" "net/http"
) )

View File

@@ -2,8 +2,8 @@ package minimax
import ( import (
"fmt" "fmt"
"github.com/songquanpeng/one-api/relay/meta" "github.com/Laisky/one-api/relay/meta"
"github.com/songquanpeng/one-api/relay/relaymode" "github.com/Laisky/one-api/relay/relaymode"
) )
func GetRequestURL(meta *meta.Meta) (string, error) { func GetRequestURL(meta *meta.Meta) (string, error) {

View File

@@ -6,11 +6,11 @@ import (
"net/http" "net/http"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/Laisky/one-api/relay/adaptor"
"github.com/Laisky/one-api/relay/meta"
"github.com/Laisky/one-api/relay/model"
"github.com/Laisky/one-api/relay/relaymode"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/relay/adaptor"
"github.com/songquanpeng/one-api/relay/meta"
"github.com/songquanpeng/one-api/relay/model"
"github.com/songquanpeng/one-api/relay/relaymode"
) )
type Adaptor struct { type Adaptor struct {

View File

@@ -5,18 +5,18 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/songquanpeng/one-api/common/helper" "github.com/Laisky/one-api/common/helper"
"github.com/songquanpeng/one-api/common/random" "github.com/Laisky/one-api/common/random"
"io" "io"
"net/http" "net/http"
"strings" "strings"
"github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/Laisky/one-api/relay/constant"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common"
"github.com/songquanpeng/one-api/common/logger"
"github.com/songquanpeng/one-api/relay/adaptor/openai"
"github.com/songquanpeng/one-api/relay/constant"
"github.com/songquanpeng/one-api/relay/model"
) )
func ConvertRequest(request model.GeneralOpenAIRequest) *ChatRequest { func ConvertRequest(request model.GeneralOpenAIRequest) *ChatRequest {

View File

@@ -3,13 +3,13 @@ package openai
import ( import (
"fmt" "fmt"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/Laisky/one-api/relay/adaptor"
"github.com/Laisky/one-api/relay/adaptor/minimax"
"github.com/Laisky/one-api/relay/channeltype"
"github.com/Laisky/one-api/relay/meta"
"github.com/Laisky/one-api/relay/model"
"github.com/Laisky/one-api/relay/relaymode"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/relay/adaptor"
"github.com/songquanpeng/one-api/relay/adaptor/minimax"
"github.com/songquanpeng/one-api/relay/channeltype"
"github.com/songquanpeng/one-api/relay/meta"
"github.com/songquanpeng/one-api/relay/model"
"github.com/songquanpeng/one-api/relay/relaymode"
"io" "io"
"net/http" "net/http"
"strings" "strings"
@@ -39,7 +39,7 @@ func (a *Adaptor) GetRequestURL(meta *meta.Meta) (string, error) {
task := strings.TrimPrefix(requestURL, "/v1/") task := strings.TrimPrefix(requestURL, "/v1/")
model_ := meta.ActualModelName model_ := meta.ActualModelName
model_ = strings.Replace(model_, ".", "", -1) model_ = strings.Replace(model_, ".", "", -1)
//https://github.com/songquanpeng/one-api/issues/1191 //https://github.com/Laisky/one-api/issues/1191
// {your endpoint}/openai/deployments/{your azure_model}/chat/completions?api-version={api_version} // {your endpoint}/openai/deployments/{your azure_model}/chat/completions?api-version={api_version}
requestURL = fmt.Sprintf("/openai/deployments/%s/%s", model_, task) requestURL = fmt.Sprintf("/openai/deployments/%s/%s", model_, task)
return GetFullRequestURL(meta.BaseURL, requestURL, meta.ChannelType), nil return GetFullRequestURL(meta.BaseURL, requestURL, meta.ChannelType), nil
@@ -58,7 +58,7 @@ func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Request, meta *me
} }
req.Header.Set("Authorization", "Bearer "+meta.APIKey) req.Header.Set("Authorization", "Bearer "+meta.APIKey)
if meta.ChannelType == channeltype.OpenRouter { if meta.ChannelType == channeltype.OpenRouter {
req.Header.Set("HTTP-Referer", "https://github.com/songquanpeng/one-api") req.Header.Set("HTTP-Referer", "https://github.com/Laisky/one-api")
req.Header.Set("X-Title", "One API") req.Header.Set("X-Title", "One API")
} }
return nil return nil

View File

@@ -1,15 +1,15 @@
package openai package openai
import ( import (
"github.com/songquanpeng/one-api/relay/adaptor/ai360" "github.com/Laisky/one-api/relay/adaptor/ai360"
"github.com/songquanpeng/one-api/relay/adaptor/baichuan" "github.com/Laisky/one-api/relay/adaptor/baichuan"
"github.com/songquanpeng/one-api/relay/adaptor/groq" "github.com/Laisky/one-api/relay/adaptor/groq"
"github.com/songquanpeng/one-api/relay/adaptor/lingyiwanwu" "github.com/Laisky/one-api/relay/adaptor/lingyiwanwu"
"github.com/songquanpeng/one-api/relay/adaptor/minimax" "github.com/Laisky/one-api/relay/adaptor/minimax"
"github.com/songquanpeng/one-api/relay/adaptor/mistral" "github.com/Laisky/one-api/relay/adaptor/mistral"
"github.com/songquanpeng/one-api/relay/adaptor/moonshot" "github.com/Laisky/one-api/relay/adaptor/moonshot"
"github.com/songquanpeng/one-api/relay/adaptor/stepfun" "github.com/Laisky/one-api/relay/adaptor/stepfun"
"github.com/songquanpeng/one-api/relay/channeltype" "github.com/Laisky/one-api/relay/channeltype"
) )
var CompatibleChannels = []int{ var CompatibleChannels = []int{

View File

@@ -2,8 +2,8 @@ package openai
import ( import (
"fmt" "fmt"
"github.com/songquanpeng/one-api/relay/channeltype" "github.com/Laisky/one-api/relay/channeltype"
"github.com/songquanpeng/one-api/relay/model" "github.com/Laisky/one-api/relay/model"
"strings" "strings"
) )

View File

@@ -3,8 +3,8 @@ package openai
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/relay/model"
"io" "io"
"net/http" "net/http"
) )

View File

@@ -4,15 +4,16 @@ import (
"bufio" "bufio"
"bytes" "bytes"
"encoding/json" "encoding/json"
"github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common"
"github.com/songquanpeng/one-api/common/conv"
"github.com/songquanpeng/one-api/common/logger"
"github.com/songquanpeng/one-api/relay/model"
"github.com/songquanpeng/one-api/relay/relaymode"
"io" "io"
"net/http" "net/http"
"strings" "strings"
"github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/conv"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/relay/model"
"github.com/Laisky/one-api/relay/relaymode"
"github.com/gin-gonic/gin"
) )
func StreamHandler(c *gin.Context, resp *http.Response, relayMode int) (*model.ErrorWithStatusCode, string, *model.Usage) { func StreamHandler(c *gin.Context, resp *http.Response, relayMode int) (*model.ErrorWithStatusCode, string, *model.Usage) {

View File

@@ -1,6 +1,6 @@
package openai package openai
import "github.com/songquanpeng/one-api/relay/model" import "github.com/Laisky/one-api/relay/model"
type TextContent struct { type TextContent struct {
Type string `json:"type,omitempty"` Type string `json:"type,omitempty"`

View File

@@ -3,12 +3,12 @@ package openai
import ( import (
"fmt" "fmt"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/Laisky/one-api/common/config"
"github.com/Laisky/one-api/common/image"
"github.com/Laisky/one-api/common/logger"
billingratio "github.com/Laisky/one-api/relay/billing/ratio"
"github.com/Laisky/one-api/relay/model"
"github.com/pkoukk/tiktoken-go" "github.com/pkoukk/tiktoken-go"
"github.com/songquanpeng/one-api/common/config"
"github.com/songquanpeng/one-api/common/image"
"github.com/songquanpeng/one-api/common/logger"
billingratio "github.com/songquanpeng/one-api/relay/billing/ratio"
"github.com/songquanpeng/one-api/relay/model"
"math" "math"
"strings" "strings"
) )

View File

@@ -1,6 +1,6 @@
package openai package openai
import "github.com/songquanpeng/one-api/relay/model" import "github.com/Laisky/one-api/relay/model"
func ErrorWrapper(err error, code string, statusCode int) *model.ErrorWithStatusCode { func ErrorWrapper(err error, code string, statusCode int) *model.ErrorWithStatusCode {
Error := model.Error{ Error := model.Error{

View File

@@ -3,11 +3,11 @@ package palm
import ( import (
"fmt" "fmt"
"github.com/Laisky/errors/v2" "github.com/Laisky/errors/v2"
"github.com/Laisky/one-api/relay/adaptor"
"github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/Laisky/one-api/relay/meta"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/relay/adaptor"
"github.com/songquanpeng/one-api/relay/adaptor/openai"
"github.com/songquanpeng/one-api/relay/meta"
"github.com/songquanpeng/one-api/relay/model"
"io" "io"
"net/http" "net/http"
) )

View File

@@ -1,7 +1,7 @@
package palm package palm
import ( import (
"github.com/songquanpeng/one-api/relay/model" "github.com/Laisky/one-api/relay/model"
) )
type ChatMessage struct { type ChatMessage struct {

View File

@@ -3,14 +3,14 @@ package palm
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/helper"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/common/random"
"github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/Laisky/one-api/relay/constant"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/songquanpeng/one-api/common"
"github.com/songquanpeng/one-api/common/helper"
"github.com/songquanpeng/one-api/common/logger"
"github.com/songquanpeng/one-api/common/random"
"github.com/songquanpeng/one-api/relay/adaptor/openai"
"github.com/songquanpeng/one-api/relay/constant"
"github.com/songquanpeng/one-api/relay/model"
"io" "io"
"net/http" "net/http"
) )

View File

@@ -1,76 +1,84 @@
package tencent package tencent
// import ( import (
// "github.com/Laisky/errors/v2" "errors"
// "fmt" "fmt"
// "github.com/gin-gonic/gin" "io"
// "github.com/songquanpeng/one-api/relay/channel" "net/http"
// "github.com/songquanpeng/one-api/relay/channel/openai" "strings"
// "github.com/songquanpeng/one-api/relay/model"
// "github.com/songquanpeng/one-api/relay/util"
// "io"
// "net/http"
// "strings"
// )
// // https://cloud.tencent.com/document/api/1729/101837 "github.com/Laisky/one-api/relay/adaptor"
"github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/Laisky/one-api/relay/meta"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin"
)
// type Adaptor struct { // https://cloud.tencent.com/document/api/1729/101837
// Sign string
// }
// func (a *Adaptor) Init(meta *util.RelayMeta) { type Adaptor struct {
Sign string
}
// } func (a *Adaptor) Init(meta *meta.Meta) {
// func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { }
// return fmt.Sprintf("%s/hyllm/v1/chat/completions", meta.BaseURL), nil
// }
// func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Request, meta *util.RelayMeta) error { func (a *Adaptor) GetRequestURL(meta *meta.Meta) (string, error) {
// channel.SetupCommonRequestHeader(c, req, meta) return fmt.Sprintf("%s/hyllm/v1/chat/completions", meta.BaseURL), nil
// req.Header.Set("Authorization", a.Sign) }
// req.Header.Set("X-TC-Action", meta.ActualModelName)
// return nil
// }
// func (a *Adaptor) ConvertRequest(c *gin.Context, relayMode int, request *model.GeneralOpenAIRequest) (any, error) { func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Request, meta *meta.Meta) error {
// if request == nil { adaptor.SetupCommonRequestHeader(c, req, meta)
// return nil, errors.New("request is nil") req.Header.Set("Authorization", a.Sign)
// } req.Header.Set("X-TC-Action", meta.ActualModelName)
// apiKey := c.Request.Header.Get("Authorization") return nil
// apiKey = strings.TrimPrefix(apiKey, "Bearer ") }
// appId, secretId, secretKey, err := ParseConfig(apiKey)
// if err != nil {
// return nil, err
// }
// tencentRequest := ConvertRequest(*request)
// tencentRequest.AppId = appId
// tencentRequest.SecretId = secretId
// // we have to calculate the sign here
// a.Sign = GetSign(*tencentRequest, secretKey)
// return tencentRequest, nil
// }
// func (a *Adaptor) DoRequest(c *gin.Context, meta *util.RelayMeta, requestBody io.Reader) (*http.Response, error) { func (a *Adaptor) ConvertRequest(c *gin.Context, relayMode int, request *model.GeneralOpenAIRequest) (any, error) {
// return channel.DoRequestHelper(a, c, meta, requestBody) if request == nil {
// } return nil, errors.New("request is nil")
}
apiKey := c.Request.Header.Get("Authorization")
apiKey = strings.TrimPrefix(apiKey, "Bearer ")
appId, secretId, secretKey, err := ParseConfig(apiKey)
if err != nil {
return nil, err
}
tencentRequest := ConvertRequest(*request)
tencentRequest.AppId = appId
tencentRequest.SecretId = secretId
// we have to calculate the sign here
a.Sign = GetSign(*tencentRequest, secretKey)
return tencentRequest, nil
}
// func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, meta *util.RelayMeta) (usage *model.Usage, err *model.ErrorWithStatusCode) { func (a *Adaptor) ConvertImageRequest(request *model.ImageRequest) (any, error) {
// if meta.IsStream { if request == nil {
// var responseText string return nil, errors.New("request is nil")
// err, responseText = StreamHandler(c, resp) }
// usage = openai.ResponseText2Usage(responseText, meta.ActualModelName, meta.PromptTokens) return request, nil
// } else { }
// err, usage = Handler(c, resp)
// }
// return
// }
// func (a *Adaptor) GetModelList() []string { func (a *Adaptor) DoRequest(c *gin.Context, meta *meta.Meta, requestBody io.Reader) (*http.Response, error) {
// return ModelList return adaptor.DoRequestHelper(a, c, meta, requestBody)
// } }
// func (a *Adaptor) GetChannelName() string { func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, meta *meta.Meta) (usage *model.Usage, err *model.ErrorWithStatusCode) {
// return "tencent" if meta.IsStream {
// } var responseText string
err, responseText = StreamHandler(c, resp)
usage = openai.ResponseText2Usage(responseText, meta.ActualModelName, meta.PromptTokens)
} else {
err, usage = Handler(c, resp)
}
return
}
func (a *Adaptor) GetModelList() []string {
return ModelList
}
func (a *Adaptor) GetChannelName() string {
return "tencent"
}

View File

@@ -1,238 +1,231 @@
package tencent package tencent
// import ( import (
// "bufio" "bufio"
// "crypto/hmac" "crypto/hmac"
// "crypto/sha1" "crypto/sha1"
// "encoding/base64" "encoding/base64"
// "encoding/json" "encoding/json"
// "github.com/Laisky/errors/v2" "errors"
// "fmt" "fmt"
// "github.com/gin-gonic/gin" "io"
// "github.com/songquanpeng/one-api/common" "net/http"
// "github.com/songquanpeng/one-api/common/helper" "sort"
// "github.com/songquanpeng/one-api/common/logger" "strconv"
// "github.com/songquanpeng/one-api/relay/channel/openai" "strings"
// "github.com/songquanpeng/one-api/relay/constant"
// "github.com/songquanpeng/one-api/relay/model"
// "io"
// "net/http"
// "sort"
// "strconv"
// "strings"
// )
// // https://cloud.tencent.com/document/product/1729/97732 "github.com/Laisky/one-api/common"
"github.com/Laisky/one-api/common/conv"
"github.com/Laisky/one-api/common/helper"
"github.com/Laisky/one-api/common/logger"
"github.com/Laisky/one-api/common/random"
"github.com/Laisky/one-api/relay/adaptor/openai"
"github.com/Laisky/one-api/relay/constant"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin"
)
// func ConvertRequest(request model.GeneralOpenAIRequest) *ChatRequest { // https://cloud.tencent.com/document/product/1729/97732
// messages := make([]Message, 0, len(request.Messages))
// for i := 0; i < len(request.Messages); i++ {
// message := request.Messages[i]
// if message.Role == "system" {
// messages = append(messages, Message{
// Role: "user",
// Content: message.StringContent(),
// })
// messages = append(messages, Message{
// Role: "assistant",
// Content: "Okay",
// })
// continue
// }
// messages = append(messages, Message{
// Content: message.StringContent(),
// Role: message.Role,
// })
// }
// stream := 0
// if request.Stream {
// stream = 1
// }
// return &ChatRequest{
// Timestamp: helper.GetTimestamp(),
// Expired: helper.GetTimestamp() + 24*60*60,
// QueryID: helper.GetUUID(),
// Temperature: request.Temperature,
// TopP: request.TopP,
// Stream: stream,
// Messages: messages,
// }
// }
// func responseTencent2OpenAI(response *ChatResponse) *openai.TextResponse { func ConvertRequest(request model.GeneralOpenAIRequest) *ChatRequest {
// fullTextResponse := openai.TextResponse{ messages := make([]Message, 0, len(request.Messages))
// Object: "chat.completion", for i := 0; i < len(request.Messages); i++ {
// Created: helper.GetTimestamp(), message := request.Messages[i]
// Usage: response.Usage, messages = append(messages, Message{
// } Content: message.StringContent(),
// if len(response.Choices) > 0 { Role: message.Role,
// choice := openai.TextResponseChoice{ })
// Index: 0, }
// Message: model.Message{ stream := 0
// Role: "assistant", if request.Stream {
// Content: response.Choices[0].Messages.Content, stream = 1
// }, }
// FinishReason: response.Choices[0].FinishReason, return &ChatRequest{
// } Timestamp: helper.GetTimestamp(),
// fullTextResponse.Choices = append(fullTextResponse.Choices, choice) Expired: helper.GetTimestamp() + 24*60*60,
// } QueryID: random.GetUUID(),
// return &fullTextResponse Temperature: request.Temperature,
// } TopP: request.TopP,
Stream: stream,
Messages: messages,
}
}
// func streamResponseTencent2OpenAI(TencentResponse *ChatResponse) *openai.ChatCompletionsStreamResponse { func responseTencent2OpenAI(response *ChatResponse) *openai.TextResponse {
// response := openai.ChatCompletionsStreamResponse{ fullTextResponse := openai.TextResponse{
// Object: "chat.completion.chunk", Object: "chat.completion",
// Created: helper.GetTimestamp(), Created: helper.GetTimestamp(),
// Model: "tencent-hunyuan", Usage: response.Usage,
// } }
// if len(TencentResponse.Choices) > 0 { if len(response.Choices) > 0 {
// var choice openai.ChatCompletionsStreamResponseChoice choice := openai.TextResponseChoice{
// choice.Delta.Content = TencentResponse.Choices[0].Delta.Content Index: 0,
// if TencentResponse.Choices[0].FinishReason == "stop" { Message: model.Message{
// choice.FinishReason = &constant.StopFinishReason Role: "assistant",
// } Content: response.Choices[0].Messages.Content,
// response.Choices = append(response.Choices, choice) },
// } FinishReason: response.Choices[0].FinishReason,
// return &response }
// } fullTextResponse.Choices = append(fullTextResponse.Choices, choice)
}
return &fullTextResponse
}
// func StreamHandler(c *gin.Context, resp *http.Response) (*model.ErrorWithStatusCode, string) { func streamResponseTencent2OpenAI(TencentResponse *ChatResponse) *openai.ChatCompletionsStreamResponse {
// var responseText string response := openai.ChatCompletionsStreamResponse{
// scanner := bufio.NewScanner(resp.Body) Id: fmt.Sprintf("chatcmpl-%s", random.GetUUID()),
// scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) { Object: "chat.completion.chunk",
// if atEOF && len(data) == 0 { Created: helper.GetTimestamp(),
// return 0, nil, nil Model: "tencent-hunyuan",
// } }
// if i := strings.Index(string(data), "\n"); i >= 0 { if len(TencentResponse.Choices) > 0 {
// return i + 1, data[0:i], nil var choice openai.ChatCompletionsStreamResponseChoice
// } choice.Delta.Content = TencentResponse.Choices[0].Delta.Content
// if atEOF { if TencentResponse.Choices[0].FinishReason == "stop" {
// return len(data), data, nil choice.FinishReason = &constant.StopFinishReason
// } }
// return 0, nil, nil response.Choices = append(response.Choices, choice)
// }) }
// dataChan := make(chan string) return &response
// stopChan := make(chan bool) }
// go func() {
// for scanner.Scan() {
// data := scanner.Text()
// if len(data) < 5 { // ignore blank line or wrong format
// continue
// }
// if data[:5] != "data:" {
// continue
// }
// data = data[5:]
// dataChan <- data
// }
// stopChan <- true
// }()
// common.SetEventStreamHeaders(c)
// c.Stream(func(w io.Writer) bool {
// select {
// case data := <-dataChan:
// var TencentResponse ChatResponse
// err := json.Unmarshal([]byte(data), &TencentResponse)
// if err != nil {
// logger.SysError("error unmarshalling stream response: " + err.Error())
// return true
// }
// response := streamResponseTencent2OpenAI(&TencentResponse)
// if len(response.Choices) != 0 {
// responseText += response.Choices[0].Delta.Content
// }
// jsonResponse, err := json.Marshal(response)
// if err != nil {
// logger.SysError("error marshalling stream response: " + err.Error())
// return true
// }
// c.Render(-1, common.CustomEvent{Data: "data: " + string(jsonResponse)})
// return true
// case <-stopChan:
// c.Render(-1, common.CustomEvent{Data: "data: [DONE]"})
// return false
// }
// })
// err := resp.Body.Close()
// if err != nil {
// return openai.ErrorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), ""
// }
// return nil, responseText
// }
// func Handler(c *gin.Context, resp *http.Response) (*model.ErrorWithStatusCode, *model.Usage) { func StreamHandler(c *gin.Context, resp *http.Response) (*model.ErrorWithStatusCode, string) {
// var TencentResponse ChatResponse var responseText string
// responseBody, err := io.ReadAll(resp.Body) scanner := bufio.NewScanner(resp.Body)
// if err != nil { scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) {
// return openai.ErrorWrapper(err, "read_response_body_failed", http.StatusInternalServerError), nil if atEOF && len(data) == 0 {
// } return 0, nil, nil
// err = resp.Body.Close() }
// if err != nil { if i := strings.Index(string(data), "\n"); i >= 0 {
// return openai.ErrorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil return i + 1, data[0:i], nil
// } }
// err = json.Unmarshal(responseBody, &TencentResponse) if atEOF {
// if err != nil { return len(data), data, nil
// return openai.ErrorWrapper(err, "unmarshal_response_body_failed", http.StatusInternalServerError), nil }
// } return 0, nil, nil
// if TencentResponse.Error.Code != 0 { })
// return &model.ErrorWithStatusCode{ dataChan := make(chan string)
// Error: model.Error{ stopChan := make(chan bool)
// Message: TencentResponse.Error.Message, go func() {
// Code: TencentResponse.Error.Code, for scanner.Scan() {
// }, data := scanner.Text()
// StatusCode: resp.StatusCode, if len(data) < 5 { // ignore blank line or wrong format
// }, nil continue
// } }
// fullTextResponse := responseTencent2OpenAI(&TencentResponse) if data[:5] != "data:" {
// fullTextResponse.Model = "hunyuan" continue
// jsonResponse, err := json.Marshal(fullTextResponse) }
// if err != nil { data = data[5:]
// return openai.ErrorWrapper(err, "marshal_response_body_failed", http.StatusInternalServerError), nil dataChan <- data
// } }
// c.Writer.Header().Set("Content-Type", "application/json") stopChan <- true
// c.Writer.WriteHeader(resp.StatusCode) }()
// _, err = c.Writer.Write(jsonResponse) common.SetEventStreamHeaders(c)
// if err != nil { c.Stream(func(w io.Writer) bool {
// return openai.ErrorWrapper(err, "write_response_body_failed", http.StatusInternalServerError), nil select {
// } case data := <-dataChan:
// return nil, &fullTextResponse.Usage var TencentResponse ChatResponse
// } err := json.Unmarshal([]byte(data), &TencentResponse)
if err != nil {
logger.SysError("error unmarshalling stream response: " + err.Error())
return true
}
response := streamResponseTencent2OpenAI(&TencentResponse)
if len(response.Choices) != 0 {
responseText += conv.AsString(response.Choices[0].Delta.Content)
}
jsonResponse, err := json.Marshal(response)
if err != nil {
logger.SysError("error marshalling stream response: " + err.Error())
return true
}
c.Render(-1, common.CustomEvent{Data: "data: " + string(jsonResponse)})
return true
case <-stopChan:
c.Render(-1, common.CustomEvent{Data: "data: [DONE]"})
return false
}
})
err := resp.Body.Close()
if err != nil {
return openai.ErrorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), ""
}
return nil, responseText
}
// func ParseConfig(config string) (appId int64, secretId string, secretKey string, err error) { func Handler(c *gin.Context, resp *http.Response) (*model.ErrorWithStatusCode, *model.Usage) {
// parts := strings.Split(config, "|") var TencentResponse ChatResponse
// if len(parts) != 3 { responseBody, err := io.ReadAll(resp.Body)
// err = errors.New("invalid tencent config") if err != nil {
// return return openai.ErrorWrapper(err, "read_response_body_failed", http.StatusInternalServerError), nil
// } }
// appId, err = strconv.ParseInt(parts[0], 10, 64) err = resp.Body.Close()
// secretId = parts[1] if err != nil {
// secretKey = parts[2] return openai.ErrorWrapper(err, "close_response_body_failed", http.StatusInternalServerError), nil
// return }
// } err = json.Unmarshal(responseBody, &TencentResponse)
if err != nil {
return openai.ErrorWrapper(err, "unmarshal_response_body_failed", http.StatusInternalServerError), nil
}
if TencentResponse.Error.Code != 0 {
return &model.ErrorWithStatusCode{
Error: model.Error{
Message: TencentResponse.Error.Message,
Code: TencentResponse.Error.Code,
},
StatusCode: resp.StatusCode,
}, nil
}
fullTextResponse := responseTencent2OpenAI(&TencentResponse)
fullTextResponse.Model = "hunyuan"
jsonResponse, err := json.Marshal(fullTextResponse)
if err != nil {
return openai.ErrorWrapper(err, "marshal_response_body_failed", http.StatusInternalServerError), nil
}
c.Writer.Header().Set("Content-Type", "application/json")
c.Writer.WriteHeader(resp.StatusCode)
_, err = c.Writer.Write(jsonResponse)
if err != nil {
return openai.ErrorWrapper(err, "write_response_body_failed", http.StatusInternalServerError), nil
}
return nil, &fullTextResponse.Usage
}
// func GetSign(req ChatRequest, secretKey string) string { func ParseConfig(config string) (appId int64, secretId string, secretKey string, err error) {
// params := make([]string, 0) parts := strings.Split(config, "|")
// params = append(params, "app_id="+strconv.FormatInt(req.AppId, 10)) if len(parts) != 3 {
// params = append(params, "secret_id="+req.SecretId) err = errors.New("invalid tencent config")
// params = append(params, "timestamp="+strconv.FormatInt(req.Timestamp, 10)) return
// params = append(params, "query_id="+req.QueryID) }
// params = append(params, "temperature="+strconv.FormatFloat(req.Temperature, 'f', -1, 64)) appId, err = strconv.ParseInt(parts[0], 10, 64)
// params = append(params, "top_p="+strconv.FormatFloat(req.TopP, 'f', -1, 64)) secretId = parts[1]
// params = append(params, "stream="+strconv.Itoa(req.Stream)) secretKey = parts[2]
// params = append(params, "expired="+strconv.FormatInt(req.Expired, 10)) return
}
// var messageStr string func GetSign(req ChatRequest, secretKey string) string {
// for _, msg := range req.Messages { params := make([]string, 0)
// messageStr += fmt.Sprintf(`{"role":"%s","content":"%s"},`, msg.Role, msg.Content) params = append(params, "app_id="+strconv.FormatInt(req.AppId, 10))
// } params = append(params, "secret_id="+req.SecretId)
// messageStr = strings.TrimSuffix(messageStr, ",") params = append(params, "timestamp="+strconv.FormatInt(req.Timestamp, 10))
// params = append(params, "messages=["+messageStr+"]") params = append(params, "query_id="+req.QueryID)
params = append(params, "temperature="+strconv.FormatFloat(req.Temperature, 'f', -1, 64))
params = append(params, "top_p="+strconv.FormatFloat(req.TopP, 'f', -1, 64))
params = append(params, "stream="+strconv.Itoa(req.Stream))
params = append(params, "expired="+strconv.FormatInt(req.Expired, 10))
// sort.Strings(params) var messageStr string
// url := "hunyuan.cloud.tencent.com/hyllm/v1/chat/completions?" + strings.Join(params, "&") for _, msg := range req.Messages {
// mac := hmac.New(sha1.New, []byte(secretKey)) messageStr += fmt.Sprintf(`{"role":"%s","content":"%s"},`, msg.Role, msg.Content)
// signURL := url }
// mac.Write([]byte(signURL)) messageStr = strings.TrimSuffix(messageStr, ",")
// sign := mac.Sum([]byte(nil)) params = append(params, "messages=["+messageStr+"]")
// return base64.StdEncoding.EncodeToString(sign)
// } sort.Strings(params)
url := "hunyuan.cloud.tencent.com/hyllm/v1/chat/completions?" + strings.Join(params, "&")
mac := hmac.New(sha1.New, []byte(secretKey))
signURL := url
mac.Write([]byte(signURL))
sign := mac.Sum([]byte(nil))
return base64.StdEncoding.EncodeToString(sign)
}

View File

@@ -1,63 +1,63 @@
package tencent package tencent
// import ( import (
// "github.com/songquanpeng/one-api/relay/model" "github.com/Laisky/one-api/relay/model"
// ) )
// type Message struct { type Message struct {
// Role string `json:"role"` Role string `json:"role"`
// Content string `json:"content"` Content string `json:"content"`
// } }
// type ChatRequest struct { type ChatRequest struct {
// AppId int64 `json:"app_id"` // 腾讯云账号的 APPID AppId int64 `json:"app_id"` // 腾讯云账号的 APPID
// SecretId string `json:"secret_id"` // 官网 SecretId SecretId string `json:"secret_id"` // 官网 SecretId
// // Timestamp当前 UNIX 时间戳,单位为秒,可记录发起 API 请求的时间。 // Timestamp当前 UNIX 时间戳,单位为秒,可记录发起 API 请求的时间。
// // 例如1529223702如果与当前时间相差过大会引起签名过期错误 // 例如1529223702如果与当前时间相差过大会引起签名过期错误
// Timestamp int64 `json:"timestamp"` Timestamp int64 `json:"timestamp"`
// // Expired 签名的有效期,是一个符合 UNIX Epoch 时间戳规范的数值, // Expired 签名的有效期,是一个符合 UNIX Epoch 时间戳规范的数值,
// // 单位为秒Expired 必须大于 Timestamp 且 Expired-Timestamp 小于90天 // 单位为秒Expired 必须大于 Timestamp 且 Expired-Timestamp 小于90天
// Expired int64 `json:"expired"` Expired int64 `json:"expired"`
// QueryID string `json:"query_id"` //请求 Id用于问题排查 QueryID string `json:"query_id"` //请求 Id用于问题排查
// // Temperature 较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定 // Temperature 较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定
// // 默认 1.0,取值区间为[0.0,2.0],非必要不建议使用,不合理的取值会影响效果 // 默认 1.0,取值区间为[0.0,2.0],非必要不建议使用,不合理的取值会影响效果
// // 建议该参数和 top_p 只设置1个不要同时更改 top_p // 建议该参数和 top_p 只设置1个不要同时更改 top_p
// Temperature float64 `json:"temperature"` Temperature float64 `json:"temperature"`
// // TopP 影响输出文本的多样性,取值越大,生成文本的多样性越强 // TopP 影响输出文本的多样性,取值越大,生成文本的多样性越强
// // 默认1.0,取值区间为[0.0, 1.0],非必要不建议使用, 不合理的取值会影响效果 // 默认1.0,取值区间为[0.0, 1.0],非必要不建议使用, 不合理的取值会影响效果
// // 建议该参数和 temperature 只设置1个不要同时更改 // 建议该参数和 temperature 只设置1个不要同时更改
// TopP float64 `json:"top_p"` TopP float64 `json:"top_p"`
// // Stream 0同步1流式 默认协议SSE) // Stream 0同步1流式 默认协议SSE)
// // 同步请求超时60s如果内容较长建议使用流式 // 同步请求超时60s如果内容较长建议使用流式
// Stream int `json:"stream"` Stream int `json:"stream"`
// // Messages 会话内容, 长度最多为40, 按对话时间从旧到新在数组中排列 // Messages 会话内容, 长度最多为40, 按对话时间从旧到新在数组中排列
// // 输入 content 总数最大支持 3000 token。 // 输入 content 总数最大支持 3000 token。
// Messages []Message `json:"messages"` Messages []Message `json:"messages"`
// } }
// type Error struct { type Error struct {
// Code int `json:"code"` Code int `json:"code"`
// Message string `json:"message"` Message string `json:"message"`
// } }
// type Usage struct { type Usage struct {
// InputTokens int `json:"input_tokens"` InputTokens int `json:"input_tokens"`
// OutputTokens int `json:"output_tokens"` OutputTokens int `json:"output_tokens"`
// TotalTokens int `json:"total_tokens"` TotalTokens int `json:"total_tokens"`
// } }
// type ResponseChoices struct { type ResponseChoices struct {
// FinishReason string `json:"finish_reason,omitempty"` // 流式结束标志位,为 stop 则表示尾包 FinishReason string `json:"finish_reason,omitempty"` // 流式结束标志位,为 stop 则表示尾包
// Messages Message `json:"messages,omitempty"` // 内容,同步模式返回内容,流模式为 null 输出 content 内容总数最多支持 1024token。 Messages Message `json:"messages,omitempty"` // 内容,同步模式返回内容,流模式为 null 输出 content 内容总数最多支持 1024token。
// Delta Message `json:"delta,omitempty"` // 内容,流模式返回内容,同步模式为 null 输出 content 内容总数最多支持 1024token。 Delta Message `json:"delta,omitempty"` // 内容,流模式返回内容,同步模式为 null 输出 content 内容总数最多支持 1024token。
// } }
// type ChatResponse struct { type ChatResponse struct {
// Choices []ResponseChoices `json:"choices,omitempty"` // 结果 Choices []ResponseChoices `json:"choices,omitempty"` // 结果
// Created string `json:"created,omitempty"` // unix 时间戳的字符串 Created string `json:"created,omitempty"` // unix 时间戳的字符串
// Id string `json:"id,omitempty"` // 会话 id Id string `json:"id,omitempty"` // 会话 id
// Usage model.Usage `json:"usage,omitempty"` // token 数量 Usage model.Usage `json:"usage,omitempty"` // token 数量
// Error Error `json:"error,omitempty"` // 错误信息 注意:此字段可能返回 null表示取不到有效值 Error Error `json:"error,omitempty"` // 错误信息 注意:此字段可能返回 null表示取不到有效值
// Note string `json:"note,omitempty"` // 注释 Note string `json:"note,omitempty"` // 注释
// ReqID string `json:"req_id,omitempty"` // 唯一请求 Id每次请求都会返回。用于反馈接口入参 ReqID string `json:"req_id,omitempty"` // 唯一请求 Id每次请求都会返回。用于反馈接口入参
// } }

View File

@@ -1,70 +1,78 @@
package xunfei package xunfei
// import ( import (
// "github.com/Laisky/errors/v2" "errors"
// "github.com/gin-gonic/gin" "io"
// "github.com/songquanpeng/one-api/relay/channel" "net/http"
// "github.com/songquanpeng/one-api/relay/channel/openai" "strings"
// "github.com/songquanpeng/one-api/relay/model"
// "github.com/songquanpeng/one-api/relay/util"
// "io"
// "net/http"
// "strings"
// )
// type Adaptor struct { "github.com/Laisky/one-api/relay/adaptor"
// request *model.GeneralOpenAIRequest "github.com/Laisky/one-api/relay/adaptor/openai"
// } "github.com/Laisky/one-api/relay/meta"
"github.com/Laisky/one-api/relay/model"
"github.com/gin-gonic/gin"
)
// func (a *Adaptor) Init(meta *util.RelayMeta) { type Adaptor struct {
request *model.GeneralOpenAIRequest
}
// } func (a *Adaptor) Init(meta *meta.Meta) {
// func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { }
// return "", nil
// }
// func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Request, meta *util.RelayMeta) error { func (a *Adaptor) GetRequestURL(meta *meta.Meta) (string, error) {
// channel.SetupCommonRequestHeader(c, req, meta) return "", nil
// // check DoResponse for auth part }
// return nil
// }
// func (a *Adaptor) ConvertRequest(c *gin.Context, relayMode int, request *model.GeneralOpenAIRequest) (any, error) { func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Request, meta *meta.Meta) error {
// if request == nil { adaptor.SetupCommonRequestHeader(c, req, meta)
// return nil, errors.New("request is nil") // check DoResponse for auth part
// } return nil
// a.request = request }
// return nil, nil
// }
// func (a *Adaptor) DoRequest(c *gin.Context, meta *util.RelayMeta, requestBody io.Reader) (*http.Response, error) { func (a *Adaptor) ConvertRequest(c *gin.Context, relayMode int, request *model.GeneralOpenAIRequest) (any, error) {
// // xunfei's request is not http request, so we don't need to do anything here if request == nil {
// dummyResp := &http.Response{} return nil, errors.New("request is nil")
// dummyResp.StatusCode = http.StatusOK }
// return dummyResp, nil a.request = request
// } return nil, nil
}
// func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, meta *util.RelayMeta) (usage *model.Usage, err *model.ErrorWithStatusCode) { func (a *Adaptor) ConvertImageRequest(request *model.ImageRequest) (any, error) {
// splits := strings.Split(meta.APIKey, "|") if request == nil {
// if len(splits) != 3 { return nil, errors.New("request is nil")
// return nil, openai.ErrorWrapper(errors.New("invalid auth"), "invalid_auth", http.StatusBadRequest) }
// } return request, nil
// if a.request == nil { }
// return nil, openai.ErrorWrapper(errors.New("request is nil"), "request_is_nil", http.StatusBadRequest)
// }
// if meta.IsStream {
// err, usage = StreamHandler(c, *a.request, splits[0], splits[1], splits[2])
// } else {
// err, usage = Handler(c, *a.request, splits[0], splits[1], splits[2])
// }
// return
// }
// func (a *Adaptor) GetModelList() []string { func (a *Adaptor) DoRequest(c *gin.Context, meta *meta.Meta, requestBody io.Reader) (*http.Response, error) {
// return ModelList // xunfei's request is not http request, so we don't need to do anything here
// } dummyResp := &http.Response{}
dummyResp.StatusCode = http.StatusOK
return dummyResp, nil
}
// func (a *Adaptor) GetChannelName() string { func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, meta *meta.Meta) (usage *model.Usage, err *model.ErrorWithStatusCode) {
// return "xunfei" splits := strings.Split(meta.APIKey, "|")
// } if len(splits) != 3 {
return nil, openai.ErrorWrapper(errors.New("invalid auth"), "invalid_auth", http.StatusBadRequest)
}
if a.request == nil {
return nil, openai.ErrorWrapper(errors.New("request is nil"), "request_is_nil", http.StatusBadRequest)
}
if meta.IsStream {
err, usage = StreamHandler(c, *a.request, splits[0], splits[1], splits[2])
} else {
err, usage = Handler(c, *a.request, splits[0], splits[1], splits[2])
}
return
}
func (a *Adaptor) GetModelList() []string {
return ModelList
}
func (a *Adaptor) GetChannelName() string {
return "xunfei"
}

Some files were not shown because too many files have changed in this diff Show More