同步官方v0.9.0-alpha.8,保留自定义Footer和Claude穿透功能
- 更新到官方最新版本 (c826d06d)
- 保留自定义页脚品牌信息 (听泉claude提供)
- 保留Claude渠道请求穿透功能,支持PassThroughRequestEnabled设置
- 添加补丁文件便于后续维护
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
45
patches/claude-passthrough.patch
Normal file
45
patches/claude-passthrough.patch
Normal file
@@ -0,0 +1,45 @@
|
||||
diff --git a/relay/channel/claude/adaptor.go b/relay/channel/claude/adaptor.go
|
||||
index 540742d6..c715c0c9 100644
|
||||
--- a/relay/channel/claude/adaptor.go
|
||||
+++ b/relay/channel/claude/adaptor.go
|
||||
@@ -55,14 +55,34 @@ func (a *Adaptor) GetRequestURL(info *relaycommon.RelayInfo) (string, error) {
|
||||
}
|
||||
|
||||
func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Header, info *relaycommon.RelayInfo) error {
|
||||
- channel.SetupApiRequestHeader(info, c, req)
|
||||
+ if model_setting.GetGlobalSettings().PassThroughRequestEnabled {
|
||||
+ // 穿透模式:直接复制原始请求头,但跳过系统级头信息
|
||||
+ for key, values := range c.Request.Header {
|
||||
+ keyLower := strings.ToLower(key)
|
||||
+ if keyLower == "host" || keyLower == "content-length" || keyLower == "connection" {
|
||||
+ continue
|
||||
+ }
|
||||
+ for _, value := range values {
|
||||
+ req.Add(key, value)
|
||||
+ }
|
||||
+ }
|
||||
+ } else {
|
||||
+ // 非穿透模式:使用通用设置
|
||||
+ channel.SetupApiRequestHeader(info, c, req)
|
||||
+ }
|
||||
+
|
||||
+ // 无论哪种模式都需要设置正确的API密钥
|
||||
req.Set("x-api-key", info.ApiKey)
|
||||
- anthropicVersion := c.Request.Header.Get("anthropic-version")
|
||||
- if anthropicVersion == "" {
|
||||
- anthropicVersion = "2023-06-01"
|
||||
+
|
||||
+ if !model_setting.GetGlobalSettings().PassThroughRequestEnabled {
|
||||
+ // 非穿透模式才强制设置这些头
|
||||
+ anthropicVersion := c.Request.Header.Get("anthropic-version")
|
||||
+ if anthropicVersion == "" {
|
||||
+ anthropicVersion = "2023-06-01"
|
||||
+ }
|
||||
+ req.Set("anthropic-version", anthropicVersion)
|
||||
+ model_setting.GetClaudeSettings().WriteHeaders(info.OriginModelName, req)
|
||||
}
|
||||
- req.Set("anthropic-version", anthropicVersion)
|
||||
- model_setting.GetClaudeSettings().WriteHeaders(info.OriginModelName, req)
|
||||
return nil
|
||||
}
|
||||
|
||||
17
patches/footer-custom.patch
Normal file
17
patches/footer-custom.patch
Normal file
@@ -0,0 +1,17 @@
|
||||
diff --git a/web/src/components/layout/Footer.js b/web/src/components/layout/Footer.js
|
||||
index d380e574..d20e6328 100644
|
||||
--- a/web/src/components/layout/Footer.js
|
||||
+++ b/web/src/components/layout/Footer.js
|
||||
@@ -82,10 +82,8 @@ const FooterBar = () => {
|
||||
</div>
|
||||
|
||||
<div className="text-sm">
|
||||
- <span className="!text-semi-color-text-1">{t('设计与开发由')} </span>
|
||||
- <a href="https://github.com/QuantumNous/new-api" target="_blank" rel="noopener noreferrer" className="!text-semi-color-primary font-medium">New API</a>
|
||||
- <span className="!text-semi-color-text-1"> & </span>
|
||||
- <a href="https://github.com/songquanpeng/one-api" target="_blank" rel="noopener noreferrer" className="!text-semi-color-primary font-medium">One API</a>
|
||||
+ <span className="!text-semi-color-text-1">全栈服务提供商 </span>
|
||||
+ <a href="https://hk.claude.cursorpro.com.cn" title="代理开设分销站" target="_blank" rel="noopener noreferrer" className="!text-semi-color-primary font-medium">听泉claude提供</a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
@@ -55,14 +55,34 @@ func (a *Adaptor) GetRequestURL(info *relaycommon.RelayInfo) (string, error) {
|
||||
}
|
||||
|
||||
func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Header, info *relaycommon.RelayInfo) error {
|
||||
channel.SetupApiRequestHeader(info, c, req)
|
||||
req.Set("x-api-key", info.ApiKey)
|
||||
anthropicVersion := c.Request.Header.Get("anthropic-version")
|
||||
if anthropicVersion == "" {
|
||||
anthropicVersion = "2023-06-01"
|
||||
if model_setting.GetGlobalSettings().PassThroughRequestEnabled {
|
||||
// 穿透模式:直接复制原始请求头,但跳过系统级头信息
|
||||
for key, values := range c.Request.Header {
|
||||
keyLower := strings.ToLower(key)
|
||||
if keyLower == "host" || keyLower == "content-length" || keyLower == "connection" {
|
||||
continue
|
||||
}
|
||||
for _, value := range values {
|
||||
req.Add(key, value)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 非穿透模式:使用通用设置
|
||||
channel.SetupApiRequestHeader(info, c, req)
|
||||
}
|
||||
|
||||
// 无论哪种模式都需要设置正确的API密钥
|
||||
req.Set("x-api-key", info.ApiKey)
|
||||
|
||||
if !model_setting.GetGlobalSettings().PassThroughRequestEnabled {
|
||||
// 非穿透模式才强制设置这些头
|
||||
anthropicVersion := c.Request.Header.Get("anthropic-version")
|
||||
if anthropicVersion == "" {
|
||||
anthropicVersion = "2023-06-01"
|
||||
}
|
||||
req.Set("anthropic-version", anthropicVersion)
|
||||
model_setting.GetClaudeSettings().WriteHeaders(info.OriginModelName, req)
|
||||
}
|
||||
req.Set("anthropic-version", anthropicVersion)
|
||||
model_setting.GetClaudeSettings().WriteHeaders(info.OriginModelName, req)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -82,10 +82,8 @@ const FooterBar = () => {
|
||||
</div>
|
||||
|
||||
<div className="text-sm">
|
||||
<span className="!text-semi-color-text-1">{t('设计与开发由')} </span>
|
||||
<a href="https://github.com/QuantumNous/new-api" target="_blank" rel="noopener noreferrer" className="!text-semi-color-primary font-medium">New API</a>
|
||||
<span className="!text-semi-color-text-1"> & </span>
|
||||
<a href="https://github.com/songquanpeng/one-api" target="_blank" rel="noopener noreferrer" className="!text-semi-color-primary font-medium">One API</a>
|
||||
<span className="!text-semi-color-text-1">全栈服务提供商 </span>
|
||||
<a href="https://hk.claude.cursorpro.com.cn" title="代理开设分销站" target="_blank" rel="noopener noreferrer" className="!text-semi-color-primary font-medium">听泉claude提供</a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
Reference in New Issue
Block a user