mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-02 20:40:52 +08:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa762e69a4 | ||
|
|
7e0fd1e260 | ||
|
|
d6037e5549 | ||
|
|
9fce13fe03 | ||
|
|
4375822cbb | ||
|
|
e0d13148ef | ||
|
|
bd68472d3c | ||
|
|
b3c534bae5 | ||
|
|
b7d6ae1b48 | ||
|
|
aacfcae382 | ||
|
|
1c92034191 | ||
|
|
ef8820e4e4 |
@@ -1,6 +1,6 @@
|
|||||||
# Git and GitHub folders
|
# Git and GitHub folders
|
||||||
.git
|
.git/*
|
||||||
.github
|
.github/*
|
||||||
|
|
||||||
# Docker and CI/CD related files
|
# Docker and CI/CD related files
|
||||||
docker-compose.yml
|
docker-compose.yml
|
||||||
@@ -10,6 +10,7 @@ docker-compose.yml
|
|||||||
Dockerfile
|
Dockerfile
|
||||||
|
|
||||||
# Documentation and license
|
# Documentation and license
|
||||||
|
docs/*
|
||||||
README.md
|
README.md
|
||||||
README_CN.md
|
README_CN.md
|
||||||
MANAGEMENT_API.md
|
MANAGEMENT_API.md
|
||||||
@@ -20,6 +21,11 @@ LICENSE
|
|||||||
config.example.yaml
|
config.example.yaml
|
||||||
|
|
||||||
# Runtime data folders (should be mounted as volumes)
|
# Runtime data folders (should be mounted as volumes)
|
||||||
auths
|
auths/*
|
||||||
logs
|
logs/*
|
||||||
|
conv/*
|
||||||
config.yaml
|
config.yaml
|
||||||
|
|
||||||
|
# Development/editor
|
||||||
|
.claude/*
|
||||||
|
.vscode/*
|
||||||
|
|||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,6 +1,10 @@
|
|||||||
config.yaml
|
config.yaml
|
||||||
docs/*
|
docs/*
|
||||||
logs/*
|
logs/*
|
||||||
|
conv/*
|
||||||
auths/*
|
auths/*
|
||||||
!auths/.gitkeep
|
!auths/.gitkeep
|
||||||
|
.vscode/*
|
||||||
|
.claude/*
|
||||||
AGENTS.md
|
AGENTS.md
|
||||||
|
CLAUDE.md
|
||||||
@@ -47,9 +47,16 @@ The first Chinese provider has now been added: [Qwen Code](https://github.com/Qw
|
|||||||
```
|
```
|
||||||
|
|
||||||
2. Build the application:
|
2. Build the application:
|
||||||
|
|
||||||
|
Linux, macOS:
|
||||||
```bash
|
```bash
|
||||||
go build -o cli-proxy-api ./cmd/server
|
go build -o cli-proxy-api ./cmd/server
|
||||||
```
|
```
|
||||||
|
Windows:
|
||||||
|
```bash
|
||||||
|
go build -o cli-proxy-api.exe ./cmd/server
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/cmd"
|
"github.com/luispater/CLIProxyAPI/v5/internal/cmd"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
2
go.mod
2
go.mod
@@ -1,4 +1,4 @@
|
|||||||
module github.com/luispater/CLIProxyAPI
|
module github.com/luispater/CLIProxyAPI/v5
|
||||||
|
|
||||||
go 1.24
|
go 1.24
|
||||||
|
|
||||||
|
|||||||
@@ -13,11 +13,11 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/api/handlers"
|
"github.com/luispater/CLIProxyAPI/v5/internal/api/handlers"
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/registry"
|
"github.com/luispater/CLIProxyAPI/v5/internal/registry"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -14,10 +14,10 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/api/handlers"
|
"github.com/luispater/CLIProxyAPI/v5/internal/api/handlers"
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -13,11 +13,11 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/api/handlers"
|
"github.com/luispater/CLIProxyAPI/v5/internal/api/handlers"
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/registry"
|
"github.com/luispater/CLIProxyAPI/v5/internal/registry"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/client"
|
"github.com/luispater/CLIProxyAPI/v5/internal/client"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -13,13 +13,13 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/claude"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/claude"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/codex"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/codex"
|
||||||
geminiAuth "github.com/luispater/CLIProxyAPI/internal/auth/gemini"
|
geminiAuth "github.com/luispater/CLIProxyAPI/v5/internal/auth/gemini"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/qwen"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/qwen"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/client"
|
"github.com/luispater/CLIProxyAPI/v5/internal/client"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/misc"
|
"github.com/luispater/CLIProxyAPI/v5/internal/misc"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Generic helpers for list[string]
|
// Generic helpers for list[string]
|
||||||
|
|||||||
@@ -7,22 +7,31 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
"golang.org/x/crypto/bcrypt"
|
"golang.org/x/crypto/bcrypt"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type attemptInfo struct {
|
||||||
|
count int
|
||||||
|
blockedUntil time.Time
|
||||||
|
}
|
||||||
|
|
||||||
// Handler aggregates config reference, persistence path and helpers.
|
// Handler aggregates config reference, persistence path and helpers.
|
||||||
type Handler struct {
|
type Handler struct {
|
||||||
cfg *config.Config
|
cfg *config.Config
|
||||||
configFilePath string
|
configFilePath string
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
|
|
||||||
|
attemptsMu sync.Mutex
|
||||||
|
failedAttempts map[string]*attemptInfo // keyed by client IP
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewHandler creates a new management handler instance.
|
// NewHandler creates a new management handler instance.
|
||||||
func NewHandler(cfg *config.Config, configFilePath string) *Handler {
|
func NewHandler(cfg *config.Config, configFilePath string) *Handler {
|
||||||
return &Handler{cfg: cfg, configFilePath: configFilePath}
|
return &Handler{cfg: cfg, configFilePath: configFilePath, failedAttempts: make(map[string]*attemptInfo)}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetConfig updates the in-memory config reference when the server hot-reloads.
|
// SetConfig updates the in-memory config reference when the server hot-reloads.
|
||||||
@@ -32,11 +41,32 @@ func (h *Handler) SetConfig(cfg *config.Config) { h.cfg = cfg }
|
|||||||
// All requests (local and remote) require a valid management key.
|
// All requests (local and remote) require a valid management key.
|
||||||
// Additionally, remote access requires allow-remote-management=true.
|
// Additionally, remote access requires allow-remote-management=true.
|
||||||
func (h *Handler) Middleware() gin.HandlerFunc {
|
func (h *Handler) Middleware() gin.HandlerFunc {
|
||||||
|
const maxFailures = 5
|
||||||
|
const banDuration = 30 * time.Minute
|
||||||
|
|
||||||
return func(c *gin.Context) {
|
return func(c *gin.Context) {
|
||||||
clientIP := c.ClientIP()
|
clientIP := c.ClientIP()
|
||||||
|
|
||||||
// Remote access control: when not loopback, must be enabled
|
// For remote IPs, enforce allow-remote-management and ban checks
|
||||||
if !(clientIP == "127.0.0.1" || clientIP == "::1") {
|
if !(clientIP == "127.0.0.1" || clientIP == "::1") {
|
||||||
|
// Check if IP is currently blocked
|
||||||
|
h.attemptsMu.Lock()
|
||||||
|
ai := h.failedAttempts[clientIP]
|
||||||
|
if ai != nil {
|
||||||
|
if !ai.blockedUntil.IsZero() {
|
||||||
|
if time.Now().Before(ai.blockedUntil) {
|
||||||
|
remaining := time.Until(ai.blockedUntil).Round(time.Second)
|
||||||
|
h.attemptsMu.Unlock()
|
||||||
|
c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": fmt.Sprintf("IP banned due to too many failed attempts. Try again in %s", remaining)})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// Ban expired, reset state
|
||||||
|
ai.blockedUntil = time.Time{}
|
||||||
|
ai.count = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
h.attemptsMu.Unlock()
|
||||||
|
|
||||||
allowRemote := h.cfg.RemoteManagement.AllowRemote
|
allowRemote := h.cfg.RemoteManagement.AllowRemote
|
||||||
if !allowRemote {
|
if !allowRemote {
|
||||||
allowRemote = true
|
allowRemote = true
|
||||||
@@ -67,15 +97,41 @@ func (h *Handler) Middleware() gin.HandlerFunc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !(clientIP == "127.0.0.1" || clientIP == "::1") {
|
if !(clientIP == "127.0.0.1" || clientIP == "::1") {
|
||||||
|
// For remote IPs, enforce key and track failures
|
||||||
|
fail := func() {
|
||||||
|
h.attemptsMu.Lock()
|
||||||
|
ai := h.failedAttempts[clientIP]
|
||||||
|
if ai == nil {
|
||||||
|
ai = &attemptInfo{}
|
||||||
|
h.failedAttempts[clientIP] = ai
|
||||||
|
}
|
||||||
|
ai.count++
|
||||||
|
if ai.count >= maxFailures {
|
||||||
|
ai.blockedUntil = time.Now().Add(banDuration)
|
||||||
|
ai.count = 0
|
||||||
|
}
|
||||||
|
h.attemptsMu.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
if provided == "" {
|
if provided == "" {
|
||||||
|
fail()
|
||||||
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "missing management key"})
|
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "missing management key"})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := bcrypt.CompareHashAndPassword([]byte(secret), []byte(provided)); err != nil {
|
if err := bcrypt.CompareHashAndPassword([]byte(secret), []byte(provided)); err != nil {
|
||||||
|
fail()
|
||||||
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid management key"})
|
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid management key"})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Success: reset failed count for this IP
|
||||||
|
h.attemptsMu.Lock()
|
||||||
|
if ai := h.failedAttempts[clientIP]; ai != nil {
|
||||||
|
ai.count = 0
|
||||||
|
ai.blockedUntil = time.Time{}
|
||||||
|
}
|
||||||
|
h.attemptsMu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Next()
|
c.Next()
|
||||||
|
|||||||
@@ -14,11 +14,11 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/api/handlers"
|
"github.com/luispater/CLIProxyAPI/v5/internal/api/handlers"
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/registry"
|
"github.com/luispater/CLIProxyAPI/v5/internal/registry"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
|
|||||||
@@ -13,11 +13,11 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/api/handlers"
|
"github.com/luispater/CLIProxyAPI/v5/internal/api/handlers"
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/registry"
|
"github.com/luispater/CLIProxyAPI/v5/internal/registry"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/logging"
|
"github.com/luispater/CLIProxyAPI/v5/internal/logging"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RequestLoggingMiddleware creates a Gin middleware that logs HTTP requests and responses.
|
// RequestLoggingMiddleware creates a Gin middleware that logs HTTP requests and responses.
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/logging"
|
"github.com/luispater/CLIProxyAPI/v5/internal/logging"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RequestInfo holds essential details of an incoming HTTP request for logging purposes.
|
// RequestInfo holds essential details of an incoming HTTP request for logging purposes.
|
||||||
|
|||||||
@@ -10,20 +10,21 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/api/handlers"
|
"github.com/luispater/CLIProxyAPI/v5/internal/api/handlers"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/api/handlers/claude"
|
"github.com/luispater/CLIProxyAPI/v5/internal/api/handlers/claude"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/api/handlers/gemini"
|
"github.com/luispater/CLIProxyAPI/v5/internal/api/handlers/gemini"
|
||||||
managementHandlers "github.com/luispater/CLIProxyAPI/internal/api/handlers/management"
|
managementHandlers "github.com/luispater/CLIProxyAPI/v5/internal/api/handlers/management"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/api/handlers/openai"
|
"github.com/luispater/CLIProxyAPI/v5/internal/api/handlers/openai"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/api/middleware"
|
"github.com/luispater/CLIProxyAPI/v5/internal/api/middleware"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/client"
|
"github.com/luispater/CLIProxyAPI/v5/internal/client"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/logging"
|
"github.com/luispater/CLIProxyAPI/v5/internal/logging"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -75,7 +76,8 @@ func NewServer(cfg *config.Config, cliClients []interfaces.Client, configFilePat
|
|||||||
engine.Use(gin.Recovery())
|
engine.Use(gin.Recovery())
|
||||||
|
|
||||||
// Add request logging middleware (positioned after recovery, before auth)
|
// Add request logging middleware (positioned after recovery, before auth)
|
||||||
requestLogger := logging.NewFileRequestLogger(cfg.RequestLog, "logs")
|
// Resolve logs directory relative to the configuration file directory.
|
||||||
|
requestLogger := logging.NewFileRequestLogger(cfg.RequestLog, "logs", filepath.Dir(configFilePath))
|
||||||
engine.Use(middleware.RequestLoggingMiddleware(requestLogger))
|
engine.Use(middleware.RequestLoggingMiddleware(requestLogger))
|
||||||
|
|
||||||
engine.Use(corsMiddleware())
|
engine.Use(corsMiddleware())
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -15,10 +15,10 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/codex"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/codex"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/browser"
|
"github.com/luispater/CLIProxyAPI/v5/internal/browser"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"golang.org/x/net/proxy"
|
"golang.org/x/net/proxy"
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -16,16 +16,16 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/claude"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/claude"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/empty"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/empty"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/misc"
|
"github.com/luispater/CLIProxyAPI/v5/internal/misc"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/registry"
|
"github.com/luispater/CLIProxyAPI/v5/internal/registry"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/registry"
|
"github.com/luispater/CLIProxyAPI/v5/internal/registry"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ClientBase provides a common base structure for all AI API clients.
|
// ClientBase provides a common base structure for all AI API clients.
|
||||||
|
|||||||
@@ -17,15 +17,15 @@ import (
|
|||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/codex"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/codex"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/empty"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/empty"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/registry"
|
"github.com/luispater/CLIProxyAPI/v5/internal/registry"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
@@ -447,6 +447,7 @@ func (c *CodexClient) APIRequest(ctx context.Context, modelName, endpoint string
|
|||||||
req.Header.Set("Openai-Beta", "responses=experimental")
|
req.Header.Set("Openai-Beta", "responses=experimental")
|
||||||
req.Header.Set("Session_id", sessionID)
|
req.Header.Set("Session_id", sessionID)
|
||||||
req.Header.Set("Accept", "text/event-stream")
|
req.Header.Set("Accept", "text/event-stream")
|
||||||
|
req.Header.Set("Connection", "Keep-Alive")
|
||||||
|
|
||||||
if c.apiKeyIndex != -1 {
|
if c.apiKeyIndex != -1 {
|
||||||
// Using API key authentication
|
// Using API key authentication
|
||||||
|
|||||||
@@ -18,13 +18,13 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
geminiAuth "github.com/luispater/CLIProxyAPI/internal/auth/gemini"
|
geminiAuth "github.com/luispater/CLIProxyAPI/v5/internal/auth/gemini"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/registry"
|
"github.com/luispater/CLIProxyAPI/v5/internal/registry"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
|
|||||||
@@ -15,12 +15,12 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/registry"
|
"github.com/luispater/CLIProxyAPI/v5/internal/registry"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -15,13 +15,13 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/registry"
|
"github.com/luispater/CLIProxyAPI/v5/internal/registry"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -17,14 +17,14 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/qwen"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/qwen"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/registry"
|
"github.com/luispater/CLIProxyAPI/v5/internal/registry"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/claude"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/claude"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/browser"
|
"github.com/luispater/CLIProxyAPI/v5/internal/browser"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/client"
|
"github.com/luispater/CLIProxyAPI/v5/internal/client"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/misc"
|
"github.com/luispater/CLIProxyAPI/v5/internal/misc"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/gemini"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/gemini"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/client"
|
"github.com/luispater/CLIProxyAPI/v5/internal/client"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/codex"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/codex"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/browser"
|
"github.com/luispater/CLIProxyAPI/v5/internal/browser"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/client"
|
"github.com/luispater/CLIProxyAPI/v5/internal/client"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/misc"
|
"github.com/luispater/CLIProxyAPI/v5/internal/misc"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/qwen"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/qwen"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/browser"
|
"github.com/luispater/CLIProxyAPI/v5/internal/browser"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/client"
|
"github.com/luispater/CLIProxyAPI/v5/internal/client"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -18,16 +18,16 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/api"
|
"github.com/luispater/CLIProxyAPI/v5/internal/api"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/claude"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/claude"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/codex"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/codex"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/gemini"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/gemini"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/qwen"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/qwen"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/client"
|
"github.com/luispater/CLIProxyAPI/v5/internal/client"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/watcher"
|
"github.com/luispater/CLIProxyAPI/v5/internal/watcher"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
)
|
)
|
||||||
@@ -79,7 +79,7 @@ func StartService(cfg *config.Config, configPath string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Determine token type from JSON data, defaulting to "gemini" if not specified.
|
// Determine token type from JSON data, defaulting to "gemini" if not specified.
|
||||||
tokenType := "gemini"
|
tokenType := ""
|
||||||
typeResult := gjson.GetBytes(data, "type")
|
typeResult := gjson.GetBytes(data, "type")
|
||||||
if typeResult.Exists() {
|
if typeResult.Exists() {
|
||||||
tokenType = typeResult.String()
|
tokenType = typeResult.String()
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RequestLogger defines the interface for logging HTTP requests and responses.
|
// RequestLogger defines the interface for logging HTTP requests and responses.
|
||||||
@@ -98,20 +98,18 @@ type FileRequestLogger struct {
|
|||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// - enabled: Whether request logging should be enabled
|
// - enabled: Whether request logging should be enabled
|
||||||
// - logsDir: The directory where log files should be stored
|
// - logsDir: The directory where log files should be stored (can be relative)
|
||||||
|
// - configDir: The directory of the configuration file; when logsDir is
|
||||||
|
// relative, it will be resolved relative to this directory
|
||||||
//
|
//
|
||||||
// Returns:
|
// Returns:
|
||||||
// - *FileRequestLogger: A new file-based request logger instance
|
// - *FileRequestLogger: A new file-based request logger instance
|
||||||
func NewFileRequestLogger(enabled bool, logsDir string) *FileRequestLogger {
|
func NewFileRequestLogger(enabled bool, logsDir string, configDir string) *FileRequestLogger {
|
||||||
// Resolve logsDir relative to the executable directory when it's not absolute.
|
// Resolve logsDir relative to the configuration file directory when it's not absolute.
|
||||||
if !filepath.IsAbs(logsDir) {
|
if !filepath.IsAbs(logsDir) {
|
||||||
if exePath, err := os.Executable(); err == nil {
|
// If configDir is provided, resolve logsDir relative to it.
|
||||||
// Resolve symlinks to get the real executable path
|
if configDir != "" {
|
||||||
if realExe, errEvalSymlinks := filepath.EvalSymlinks(exePath); errEvalSymlinks == nil {
|
logsDir = filepath.Join(configDir, logsDir)
|
||||||
exePath = realExe
|
|
||||||
}
|
|
||||||
execDir := filepath.Dir(exePath)
|
|
||||||
logsDir = filepath.Join(execDir, logsDir)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return &FileRequestLogger{
|
return &FileRequestLogger{
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ package geminiCLI
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/translator/claude/gemini"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/translator/claude/gemini"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ package geminiCLI
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/translator/claude/gemini"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/translator/claude/gemini"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package geminiCLI
|
package geminiCLI
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package gemini
|
package gemini
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package chat_completions
|
package chat_completions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package responses
|
package responses
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/misc"
|
"github.com/luispater/CLIProxyAPI/v5/internal/misc"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package claude
|
package claude
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ package geminiCLI
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/translator/codex/gemini"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/translator/codex/gemini"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ package geminiCLI
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/translator/codex/gemini"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/translator/codex/gemini"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package geminiCLI
|
package geminiCLI
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/misc"
|
"github.com/luispater/CLIProxyAPI/v5/internal/misc"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package gemini
|
package gemini
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/misc"
|
"github.com/luispater/CLIProxyAPI/v5/internal/misc"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
@@ -259,9 +259,6 @@ func ConvertOpenAIRequestToCodex(modelName string, inputRawJSON []byte, stream b
|
|||||||
out, _ = sjson.Set(out, "text.verbosity", v.Value())
|
out, _ = sjson.Set(out, "text.verbosity", v.Value())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The examples include store: true when response_format is provided
|
|
||||||
store = true
|
|
||||||
} else if text.Exists() {
|
} else if text.Exists() {
|
||||||
// If only text.verbosity present (no response_format), map verbosity
|
// If only text.verbosity present (no response_format), map verbosity
|
||||||
if v := text.Get("verbosity"); v.Exists() {
|
if v := text.Get("verbosity"); v.Exists() {
|
||||||
@@ -306,10 +303,6 @@ func ConvertOpenAIRequestToCodex(modelName string, inputRawJSON []byte, stream b
|
|||||||
out, _ = sjson.SetRaw(out, "tools.-1", item)
|
out, _ = sjson.SetRaw(out, "tools.-1", item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// The examples include store: true when tools and formatting are used; be conservative
|
|
||||||
if rf.Exists() {
|
|
||||||
store = true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
out, _ = sjson.Set(out, "store", store)
|
out, _ = sjson.Set(out, "store", store)
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package chat_completions
|
package chat_completions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package responses
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/misc"
|
"github.com/luispater/CLIProxyAPI/v5/internal/misc"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/misc"
|
"github.com/luispater/CLIProxyAPI/v5/internal/misc"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package responses
|
package responses
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
client "github.com/luispater/CLIProxyAPI/internal/interfaces"
|
client "github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package claude
|
package claude
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package gemini
|
package gemini
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/misc"
|
"github.com/luispater/CLIProxyAPI/v5/internal/misc"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/translator/gemini/openai/chat-completions"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/translator/gemini/openai/chat-completions"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package chat_completions
|
package chat_completions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ package responses
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/translator/gemini-cli/gemini"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/translator/gemini-cli/gemini"
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/translator/gemini/openai/responses"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/translator/gemini/openai/responses"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ConvertOpenAIResponsesRequestToGeminiCLI(modelName string, inputRawJSON []byte, stream bool) []byte {
|
func ConvertOpenAIResponsesRequestToGeminiCLI(modelName string, inputRawJSON []byte, stream bool) []byte {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package responses
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/translator/gemini/openai/responses"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/translator/gemini/openai/responses"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package responses
|
package responses
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
client "github.com/luispater/CLIProxyAPI/internal/interfaces"
|
client "github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package claude
|
package claude
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package geminiCLI
|
package geminiCLI
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package gemini
|
package gemini
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Register a no-op response translator and a request normalizer for Gemini→Gemini.
|
// Register a no-op response translator and a request normalizer for Gemini→Gemini.
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/misc"
|
"github.com/luispater/CLIProxyAPI/v5/internal/misc"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package chat_completions
|
package chat_completions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package responses
|
package responses
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -1,30 +1,30 @@
|
|||||||
package translator
|
package translator
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/claude/gemini"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/claude/gemini"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/claude/gemini-cli"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/claude/gemini-cli"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/claude/openai/chat-completions"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/claude/openai/chat-completions"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/claude/openai/responses"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/claude/openai/responses"
|
||||||
|
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/codex/claude"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/codex/claude"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/codex/gemini"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/codex/gemini"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/codex/gemini-cli"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/codex/gemini-cli"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/codex/openai/chat-completions"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/codex/openai/chat-completions"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/codex/openai/responses"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/codex/openai/responses"
|
||||||
|
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/gemini-cli/claude"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/gemini-cli/claude"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/gemini-cli/gemini"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/gemini-cli/gemini"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/gemini-cli/openai/chat-completions"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/gemini-cli/openai/chat-completions"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/gemini-cli/openai/responses"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/gemini-cli/openai/responses"
|
||||||
|
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/gemini/claude"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/gemini/claude"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/gemini/gemini"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/gemini/gemini"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/gemini/gemini-cli"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/gemini/gemini-cli"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/gemini/openai/chat-completions"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/gemini/openai/chat-completions"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/gemini/openai/responses"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/gemini/openai/responses"
|
||||||
|
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/openai/claude"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/openai/claude"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/openai/gemini"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/openai/gemini"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/openai/gemini-cli"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/openai/gemini-cli"
|
||||||
_ "github.com/luispater/CLIProxyAPI/internal/translator/openai/openai/responses"
|
_ "github.com/luispater/CLIProxyAPI/v5/internal/translator/openai/openai/responses"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package claude
|
package claude
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package geminiCLI
|
package geminiCLI
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ package geminiCLI
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/translator/openai/gemini"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/translator/openai/gemini"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ package geminiCLI
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/translator/openai/gemini"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/translator/openai/gemini"
|
||||||
"github.com/tidwall/sjson"
|
"github.com/tidwall/sjson"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package gemini
|
package gemini
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package responses
|
package responses
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/luispater/CLIProxyAPI/internal/constant"
|
. "github.com/luispater/CLIProxyAPI/v5/internal/constant"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/translator/translator"
|
"github.com/luispater/CLIProxyAPI/v5/internal/translator/translator"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package translator
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ package util
|
|||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetProviderName determines the AI service provider based on the model name.
|
// GetProviderName determines the AI service provider based on the model name.
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/proxy"
|
"golang.org/x/net/proxy"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package util
|
package util
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -18,14 +18,14 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/fsnotify/fsnotify"
|
"github.com/fsnotify/fsnotify"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/claude"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/claude"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/codex"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/codex"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/gemini"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/gemini"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/auth/qwen"
|
"github.com/luispater/CLIProxyAPI/v5/internal/auth/qwen"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/client"
|
"github.com/luispater/CLIProxyAPI/v5/internal/client"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/config"
|
"github.com/luispater/CLIProxyAPI/v5/internal/config"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/interfaces"
|
"github.com/luispater/CLIProxyAPI/v5/internal/interfaces"
|
||||||
"github.com/luispater/CLIProxyAPI/internal/util"
|
"github.com/luispater/CLIProxyAPI/v5/internal/util"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
)
|
)
|
||||||
@@ -335,7 +335,7 @@ func (w *Watcher) createClientFromFile(path string, cfg *config.Config) (interfa
|
|||||||
return nil, nil // Not an error, just nothing to process yet.
|
return nil, nil // Not an error, just nothing to process yet.
|
||||||
}
|
}
|
||||||
|
|
||||||
tokenType := "gemini"
|
tokenType := ""
|
||||||
typeResult := gjson.GetBytes(data, "type")
|
typeResult := gjson.GetBytes(data, "type")
|
||||||
if typeResult.Exists() {
|
if typeResult.Exists() {
|
||||||
tokenType = typeResult.String()
|
tokenType = typeResult.String()
|
||||||
|
|||||||
Reference in New Issue
Block a user