Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .github/workflows/auto-merge.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Auto Merge Gate

on:
pull_request_target:
types:
- opened
- reopened
- ready_for_review
- synchronize
- labeled
pull_request_review:
types:
- submitted

permissions:
contents: read
pull-requests: write

jobs:
enable-automerge:
if: |
(github.event_name != 'pull_request_review') ||
(github.event.review.state == 'APPROVED')
runs-on: ubuntu-latest
steps:
- name: Enable auto-merge for labeled PRs
if: |
contains(github.event.pull_request.labels.*.name, 'automerge') &&
!contains(github.event.pull_request.labels.*.name, 'do-not-merge')
uses: peter-evans/enable-pull-request-automerge@v3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
merge-method: squash
Original file line number Diff line number Diff line change
@@ -1,43 +1,8 @@
// Package config provides configuration types for CLI Proxy API.
// This file contains SDK-specific config types that are used by internal/* packages.
// Package config provides configuration types for the llmproxy server.
package config

// SDKConfig represents the SDK-level configuration embedded in Config.
type SDKConfig struct {
// ProxyURL is the URL of an optional proxy server to use for outbound requests.
ProxyURL string `yaml:"proxy-url" json:"proxy-url"`
import sdkconfig "github.com/router-for-me/CLIProxyAPI/v6/sdk/config"

// ForceModelPrefix requires explicit model prefixes (e.g., "teamA/gemini-3-pro-preview")
// to target prefixed credentials. When false, unprefixed model requests may use prefixed
// credentials as well.
ForceModelPrefix bool `yaml:"force-model-prefix" json:"force-model-prefix"`

// RequestLog enables or disables detailed request logging functionality.
RequestLog bool `yaml:"request-log" json:"request-log"`

// APIKeys is a list of keys for authenticating clients to this proxy server.
APIKeys []string `yaml:"api-keys" json:"api-keys"`

// PassthroughHeaders controls whether upstream response headers are forwarded to downstream clients.
// Default is false (disabled).
PassthroughHeaders bool `yaml:"passthrough-headers" json:"passthrough-headers"`

// Streaming configures server-side streaming behavior (keep-alives and safe bootstrap retries).
Streaming StreamingConfig `yaml:"streaming" json:"streaming"`

// NonStreamKeepAliveInterval controls how often blank lines are emitted for non-streaming responses.
// <= 0 disables keep-alives. Value is in seconds.
NonStreamKeepAliveInterval int `yaml:"nonstream-keepalive-interval,omitempty" json:"nonstream-keepalive-interval,omitempty"`
}

// StreamingConfig holds server streaming behavior configuration.
type StreamingConfig struct {
// KeepAliveSeconds controls how often the server emits SSE heartbeats (": keep-alive\n\n").
// <= 0 disables keep-alives. Default is 0.
KeepAliveSeconds int `yaml:"keepalive-seconds,omitempty" json:"keepalive-seconds,omitempty"`

// BootstrapRetries controls how many times the server may retry a streaming request before any bytes are sent,
// to allow auth rotation / transient recovery.
// <= 0 disables bootstrap retries. Default is 0.
BootstrapRetries int `yaml:"bootstrap-retries,omitempty" json:"bootstrap-retries,omitempty"`
}
// Keep SDK types aligned with public SDK config to avoid split-type regressions.
type SDKConfig = sdkconfig.SDKConfig
type StreamingConfig = sdkconfig.StreamingConfig
12 changes: 11 additions & 1 deletion pkg/llmproxy/access/reconcile.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
configaccess "github.com/router-for-me/CLIProxyAPI/v6/pkg/llmproxy/access/config_access"
"github.com/router-for-me/CLIProxyAPI/v6/internal/config"
sdkaccess "github.com/router-for-me/CLIProxyAPI/v6/sdk/access"
sdkconfig "github.com/router-for-me/CLIProxyAPI/v6/sdk/config"
log "github.com/sirupsen/logrus"
)

Expand Down Expand Up @@ -85,7 +86,16 @@ func ApplyAccessProviders(manager *sdkaccess.Manager, oldCfg, newCfg *config.Con
}

existing := manager.Providers()
configaccess.Register((*config.SDKConfig)(&newCfg.SDKConfig))
sdkCfg := sdkconfig.SDKConfig{
ProxyURL: newCfg.SDKConfig.ProxyURL,
ForceModelPrefix: newCfg.SDKConfig.ForceModelPrefix,
RequestLog: newCfg.SDKConfig.RequestLog,
APIKeys: newCfg.SDKConfig.APIKeys,
PassthroughHeaders: newCfg.SDKConfig.PassthroughHeaders,
Streaming: sdkconfig.StreamingConfig(newCfg.SDKConfig.Streaming),
NonStreamKeepAliveInterval: newCfg.SDKConfig.NonStreamKeepAliveInterval,
}
configaccess.Register(&sdkCfg)
providers, added, updated, removed, err := ReconcileProviders(oldCfg, newCfg, existing)
if err != nil {
log.Errorf("failed to reconcile request auth providers: %v", err)
Expand Down
3 changes: 1 addition & 2 deletions pkg/llmproxy/api/handlers/management/config_basic.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import (
"github.com/gin-gonic/gin"
"github.com/router-for-me/CLIProxyAPI/v6/internal/config"
"github.com/router-for-me/CLIProxyAPI/v6/pkg/llmproxy/util"
sdkconfig "github.com/router-for-me/CLIProxyAPI/v6/sdk/config"
log "github.com/sirupsen/logrus"
"gopkg.in/yaml.v3"
)
Expand Down Expand Up @@ -45,7 +44,7 @@ func (h *Handler) GetLatestVersion(c *gin.Context) {
proxyURL = strings.TrimSpace(h.cfg.ProxyURL)
}
if proxyURL != "" {
sdkCfg := &sdkconfig.SDKConfig{ProxyURL: proxyURL}
sdkCfg := &config.SDKConfig{ProxyURL: proxyURL}
util.SetProxy(sdkCfg, client)
}

Expand Down
8 changes: 4 additions & 4 deletions sdk/auth/codex.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ import (
"strings"
"time"

"github.com/router-for-me/CLIProxyAPI/v6/pkg/llmproxy/auth/codex"
"github.com/router-for-me/CLIProxyAPI/v6/pkg/llmproxy/browser"
"github.com/router-for-me/CLIProxyAPI/v6/internal/auth/codex"
"github.com/router-for-me/CLIProxyAPI/v6/internal/browser"
// legacy client removed
"github.com/router-for-me/CLIProxyAPI/v6/internal/config"
"github.com/router-for-me/CLIProxyAPI/v6/pkg/llmproxy/misc"
"github.com/router-for-me/CLIProxyAPI/v6/pkg/llmproxy/util"
"github.com/router-for-me/CLIProxyAPI/v6/internal/misc"
"github.com/router-for-me/CLIProxyAPI/v6/internal/util"
coreauth "github.com/router-for-me/CLIProxyAPI/v6/sdk/cliproxy/auth"
log "github.com/sirupsen/logrus"
)
Expand Down
Loading