Compare commits

...

12 Commits

Author SHA1 Message Date
Luis Pater
fa762e69a4 Merge branch 'dev' of github.com:luispater/CLIProxyAPI into dev 2025-09-14 22:55:18 +08:00
Luis Pater
7e0fd1e260 Add Keep-Alive header 2025-09-14 22:54:36 +08:00
hkfires
d6037e5549 Refine .gitignore and .dockerignore files 2025-09-14 16:29:06 +08:00
Luis Pater
9fce13fe03 Update internal module imports to use v5 package path
- Updated all `github.com/luispater/CLIProxyAPI/internal/...` imports to point to `github.com/luispater/CLIProxyAPI/v5/internal/...`.
- Adjusted `go.mod` to specify `module github.com/luispater/CLIProxyAPI/v5`.
2025-09-13 23:34:32 +08:00
Luis Pater
4375822cbb Resolve logsDir path relative to configuration directory in FileRequestLogger 2025-09-12 15:28:07 +08:00
Luis Pater
e0d13148ef Merge branch 'main' into dev 2025-09-12 13:12:02 +08:00
Luis Pater
bd68472d3c Merge pull request #41 from kaixxx/main
Codex CLI - setting 'store = false' to prevent the request being rejected by OpenAI
2025-09-12 13:10:22 +08:00
kaixxx
b3c534bae5 Build instructions reformatting 2025-09-12 01:16:54 +02:00
kaixxx
b7d6ae1b48 Windows build instructions 2025-09-12 01:12:51 +02:00
kaixxx
aacfcae382 Codex CLI - setting 'store = false'
store = true leads to:
BadRequestError("Error code: 400 - {'detail': 'Store must be set to false'}")
2025-09-12 00:59:49 +02:00
Luis Pater
1c92034191 Implement IP-based rate limiting and ban mechanism for management API
- Introduced a new `attemptInfo` structure to track failed login attempts per IP.
- Added logic to temporarily ban IPs exceeding the allowed number of failures.
- Enhanced middleware to reset failed attempt counters on successful authentication.
- Updated `Handler` to include a `failedAttempts` map with thread-safe access.
2025-09-12 03:00:37 +08:00
Luis Pater
ef8820e4e4 Default tokenType to an empty string instead of "gemini" in watcher.go and run.go. 2025-09-11 21:09:27 +08:00
82 changed files with 366 additions and 299 deletions

View File

@@ -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
View File

@@ -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

View File

@@ -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

View File

@@ -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
View File

@@ -1,4 +1,4 @@
module github.com/luispater/CLIProxyAPI module github.com/luispater/CLIProxyAPI/v5
go 1.24 go 1.24

View File

@@ -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"
) )

View File

@@ -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"
) )

View File

@@ -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"
) )

View File

@@ -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"
) )

View File

@@ -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"

View File

@@ -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]

View File

@@ -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()

View File

@@ -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"

View File

@@ -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"
) )

View File

@@ -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.

View File

@@ -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.

View File

@@ -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())

View File

@@ -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"
) )

View File

@@ -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"
) )

View File

@@ -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"

View File

@@ -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"
) )

View File

@@ -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"

View File

@@ -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.

View File

@@ -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

View File

@@ -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"

View File

@@ -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"
) )

View File

@@ -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"
) )

View File

@@ -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"

View File

@@ -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"
) )

View File

@@ -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"
) )

View File

@@ -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"
) )

View File

@@ -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"
) )

View File

@@ -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()

View File

@@ -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{

View File

@@ -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"
) )

View File

@@ -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"
) )

View File

@@ -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() {

View File

@@ -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"
) )

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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"
) )

View File

@@ -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() {

View File

@@ -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"
) )

View File

@@ -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"
) )

View File

@@ -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() {

View File

@@ -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"
) )

View File

@@ -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() {

View File

@@ -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)

View File

@@ -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() {

View File

@@ -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"
) )

View File

@@ -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"
) )

View File

@@ -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() {

View File

@@ -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"
) )

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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"

View File

@@ -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"
) )

View File

@@ -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() {

View File

@@ -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 {

View File

@@ -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"
) )

View File

@@ -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() {

View File

@@ -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"
) )

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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.

View File

@@ -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"

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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"
) )

View File

@@ -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() {

View File

@@ -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"
) )

View File

@@ -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() {

View File

@@ -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"
) )

View File

@@ -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"
) )

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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"
) )

View File

@@ -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.

View File

@@ -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"
) )

View File

@@ -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"
) )

View File

@@ -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()