Skip to content
Open
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
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,14 +143,14 @@ When working over SSH or from a remote browser, the browser's `localhost` may no

Each channel declares exactly which protocols and capabilities it can execute. GPT-Load converts between supported capabilities, but it is not a general-purpose any-protocol, any-JSON translator.

Embeddings initially uses the native OpenAI-compatible wire only on the OpenAI, OpenRouter, and OpenAI Compatible API-key channels; subscription channels and protocol conversion are not supported. An AccessKey without a protocol filter keeps its existing “all enabled protocols” behavior and therefore gains Embeddings access after upgrade. Least-privilege deployments should configure an explicit protocol filter.
Embeddings initially uses the native OpenAI-compatible wire only on the OpenAI, OpenRouter, Requesty, and OpenAI Compatible API-key channels; subscription channels and protocol conversion are not supported. An AccessKey without a protocol filter keeps its existing “all enabled protocols” behavior and therefore gains Embeddings access after upgrade. Least-privilege deployments should configure an explicit protocol filter.

Rerank uses the independent `rerank` protocol through `POST /v1/rerank` on the OpenAI Compatible, New API, and GPT-Load API-key channels. Requests contain `model`, `query`, and a text-only `documents` array, with optional upstream parameters such as `top_n` and `return_documents`. Streaming, subscription channels, and protocol conversion are not supported. OpenAI Compatible takes a complete API prefix (for example, `https://host/v1`); New API / GPT-Load take the gateway root. The upstream must implement a compatible Rerank endpoint. AccessKeys without a protocol filter also gain Rerank access. Responses containing only non-token units such as `search_units` remain unpriced; these units are not treated as tokens or free requests.

### Built-in channels

- **Official and cloud** — OpenAI, Anthropic, Gemini, xAI, Azure OpenAI, AWS Bedrock, Google Vertex AI
- **Model services** — DeepSeek, Moonshot AI, SiliconFlow, Zhipu AI, Alibaba, Volcengine, OpenRouter, Groq
- **Model services** — DeepSeek, Moonshot AI, SiliconFlow, Zhipu AI, Alibaba, Volcengine, OpenRouter, Requesty, Groq
- **Subscription** — Codex, Claude, Antigravity, Grok
- **Custom** — OpenAI Compatible (any compatible relay)

Expand Down
4 changes: 2 additions & 2 deletions README_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,14 +143,14 @@ Codex、Claude、Antigravity 的 OAuth 客户端使用固定回调端口。Compo

每个渠道会明确声明自己可执行的协议与能力。GPT-Load 在受支持的能力之间做转换,但不是任意协议、任意 JSON 的通用转换器。

Embeddings 首期只在 OpenAI、OpenRouter 和 OpenAI Compatible API Key 渠道提供原生 OpenAI-compatible Wire,不支持订阅渠道或协议互转。未设置协议过滤器的 AccessKey 会按既有语义允许全部已启用协议,升级后也会获得 Embeddings 访问能力;最小权限部署请显式配置协议过滤器。
Embeddings 首期只在 OpenAI、OpenRouter、Requesty 和 OpenAI Compatible API Key 渠道提供原生 OpenAI-compatible Wire,不支持订阅渠道或协议互转。未设置协议过滤器的 AccessKey 会按既有语义允许全部已启用协议,升级后也会获得 Embeddings 访问能力;最小权限部署请显式配置协议过滤器。

Rerank 使用独立的 `rerank` 协议,在 OpenAI Compatible、New API、GPT-Load API Key 渠道支持 `POST /v1/rerank`。请求使用 `model`、`query` 和纯文本 `documents` 数组,可传 `top_n`、`return_documents` 等上游参数;不支持流式、订阅渠道或协议互转。OpenAI Compatible 的 Base URL 是完整 API 前缀(如 `https://host/v1`),New API / GPT-Load 使用网关根地址;上游必须提供兼容 Rerank 接口。未设置协议过滤器的 AccessKey 也会获得 Rerank 访问能力。仅有 `search_units` 等非 Token 计量时保持未计价,不将其视为 Token 或免费请求。

### 内置渠道

- **官方与云平台**:OpenAI、Anthropic、Gemini、xAI、Azure OpenAI、AWS Bedrock、Google Vertex AI
- **常用模型服务**:DeepSeek、Moonshot AI、SiliconFlow、Zhipu AI、Alibaba、Volcengine、OpenRouter、Groq
- **常用模型服务**:DeepSeek、Moonshot AI、SiliconFlow、Zhipu AI、Alibaba、Volcengine、OpenRouter、Requesty、Groq
- **订阅渠道**:Codex、Claude、Antigravity、Grok
- **自定义**:OpenAI Compatible(任意兼容中转)

Expand Down
4 changes: 2 additions & 2 deletions README_JP.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,14 +143,14 @@ SSH やリモートブラウザ経由で操作する場合、ブラウザの `lo

各チャネルは実行可能なプロトコルと機能を明示的に宣言します。GPT-Load はサポート対象の機能間で変換を行いますが、任意のプロトコル・任意の JSON を扱う汎用コンバーターではありません。

Embeddings は初期段階では OpenAI、OpenRouter、OpenAI Compatible の API Key チャネルでのみネイティブな OpenAI 互換ワイヤーを提供し、サブスクリプションチャネルとプロトコル変換には対応していません。プロトコルフィルターを設定していない AccessKey は既存の「有効なプロトコルをすべて許可する」動作を維持するため、アップグレード後に Embeddings へのアクセス権も得ます。最小権限で運用する場合は、プロトコルフィルターを明示的に設定してください。
Embeddings は初期段階では OpenAI、OpenRouter、Requesty、OpenAI Compatible の API Key チャネルでのみネイティブな OpenAI 互換ワイヤーを提供し、サブスクリプションチャネルとプロトコル変換には対応していません。プロトコルフィルターを設定していない AccessKey は既存の「有効なプロトコルをすべて許可する」動作を維持するため、アップグレード後に Embeddings へのアクセス権も得ます。最小権限で運用する場合は、プロトコルフィルターを明示的に設定してください。

Rerank は独立した `rerank` プロトコルを使用し、OpenAI Compatible、New API、GPT-Load の API Key チャネルで `POST /v1/rerank` に対応します。リクエストには `model`、`query`、テキストのみの `documents` 配列を指定し、`top_n` や `return_documents` などの上流パラメーターも利用できます。ストリーミング、サブスクリプション、プロトコル変換には対応しません。OpenAI Compatible には完全な API プレフィックス(例:`https://host/v1`)、New API / GPT-Load にはゲートウェイのルートを設定します。上流は互換 Rerank API を提供する必要があります。プロトコルフィルターのない AccessKey は Rerank へのアクセス権も得ます。`search_units` など Token 以外の単位のみが返る場合は未計価とし、Token 数や無料リクエストとして扱いません。

### 組み込みチャネル

- **公式・クラウド**:OpenAI、Anthropic、Gemini、xAI、Azure OpenAI、AWS Bedrock、Google Vertex AI
- **モデルサービス**:DeepSeek、Moonshot AI、SiliconFlow、Zhipu AI、Alibaba、Volcengine、OpenRouter、Groq
- **モデルサービス**:DeepSeek、Moonshot AI、SiliconFlow、Zhipu AI、Alibaba、Volcengine、OpenRouter、Requesty、Groq
- **サブスクリプション**:Codex、Claude、Antigravity、Grok
- **カスタム**:OpenAI Compatible(任意の互換中継)

Expand Down
1 change: 1 addition & 0 deletions internal/channel/builtins.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ func builtInModules() []spec.Module {
modules.Alibaba(),
modules.Volcengine(),
modules.OpenRouter(),
modules.Requesty(),
modules.Groq(),
modules.XAI(),
modules.GPTLoad(),
Expand Down
1 change: 1 addition & 0 deletions internal/channel/channel.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ const (
Alibaba = spec.Alibaba
Volcengine = spec.Volcengine
OpenRouter = spec.OpenRouter
Requesty = spec.Requesty
Groq = spec.Groq
XAI = spec.XAI
)
Expand Down
2 changes: 1 addition & 1 deletion internal/channel/embeddings_module_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ func TestOpenAIEmbeddingsNativeRouteIsLimitedToSupportedAPIKeyChannels(t *testin

registry := NewRegistry()
supported := map[ID]struct{}{
OpenAI: {}, OpenRouter: {}, GPTLoad: {}, NewAPI: {}, OpenAICompatible: {},
OpenAI: {}, OpenRouter: {}, Requesty: {}, GPTLoad: {}, NewAPI: {}, OpenAICompatible: {},
}
for _, descriptor := range registry.List() {
definition, ok := registry.lookup(descriptor.ID)
Expand Down
1 change: 1 addition & 0 deletions internal/channel/final_provider_contract_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ func TestFinalRegistryContainsOnlyApprovedChannels(t *testing.T) {
Alibaba,
Volcengine,
OpenRouter,
Requesty,
Groq,
XAI,
GPTLoad,
Expand Down
64 changes: 64 additions & 0 deletions internal/channel/modules/requesty.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package modules

import (
"gpt-load/internal/channel/spec"
"gpt-load/internal/execution"
"gpt-load/internal/protocol"
)

// RequestyDefaultBaseURL is the global Requesty router. Regional routers
// (EU, US, AP) accept the same API key and are exposed as URL hints so a
// group can pin a region through the Base URL override.
const RequestyDefaultBaseURL = "https://router.requesty.ai/v1"

func Requesty() spec.Module {
return spec.Module{
Definition: spec.Definition{
ID: spec.Requesty,
Name: "Requesty",
Mark: "RQ",
Icon: "requesty",
SearchTerms: []string{"router", "requesty ai"},
Description: "Managed API preset",
Connection: spec.Connection{
Type: spec.ConnectionAPIKey,
CredentialInput: "batch_text",
},
Params: []spec.Field{{
Key: "base_url", Label: "Base URL", InputKind: spec.InputURL,
Normalizer: spec.NormalizeBaseURL,
}},
Credentials: []spec.Field{{
Key: "api_key", Label: "API Key", InputKind: spec.InputSecret,
Required: true, Sensitive: true, Normalizer: spec.NormalizeNonEmpty,
}},
Provider: spec.ProviderBinding{
ProviderKind: spec.ProviderOpenAICompatible,
CatalogProviderID: "requesty",
EndpointPolicy: spec.EndpointFixedWithOverride,
Comment thread
coderabbitai[bot] marked this conversation as resolved.
FixedBaseURL: RequestyDefaultBaseURL,
DefaultBaseURLs: []string{
RequestyDefaultBaseURL,
"https://router.eu.requesty.ai/v1",
"https://router.us.requesty.ai/v1",
"https://router.ap.requesty.ai/v1",
},
},
Routes: []spec.Route{
spec.NewRoute(protocol.OpenAICompletions, execution.OperationChatCompletion, execution.RouteNative),
spec.NewRoute(protocol.OpenAIEmbeddings, execution.OperationEmbeddingsCreate, execution.RouteNative),
spec.NewRoute(protocol.OpenAIEmbeddings, execution.OperationProbe, execution.RouteNative),
spec.NewRoute(protocol.OpenAICompletions, execution.OperationListModels, execution.RouteNative),
spec.NewRoute(protocol.OpenAICompletions, execution.OperationProbe, execution.RouteNative),
spec.NewResponsesCreateRoute(execution.RouteConverted, spec.ResponsesStoreHandlingStateless),
spec.NewRoute(protocol.OpenAIResponses, execution.OperationProbe, execution.RouteConverted),
spec.NewRoute(protocol.Anthropic, execution.OperationChatCompletion, execution.RouteConverted),
spec.NewRoute(protocol.Anthropic, execution.OperationListModels, execution.RouteConverted),
spec.NewRoute(protocol.Anthropic, execution.OperationProbe, execution.RouteConverted),
spec.NewRoute(protocol.Gemini, execution.OperationChatCompletion, execution.RouteConverted),
spec.NewRoute(protocol.Gemini, execution.OperationListModels, execution.RouteConverted),
spec.NewRoute(protocol.Gemini, execution.OperationProbe, execution.RouteConverted),
},
},
}
}
2 changes: 2 additions & 0 deletions internal/channel/registry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ func TestRegistryHasStableBuiltInOrderAndSearch(t *testing.T) {
Alibaba,
Volcengine,
OpenRouter,
Requesty,
Groq,
XAI,
GPTLoad,
Expand Down Expand Up @@ -846,6 +847,7 @@ func TestEveryResponsesCreateChannelDeclaresStoreHandling(t *testing.T) {
Alibaba: ResponsesStoreHandlingStateless,
Volcengine: ResponsesStoreHandlingStateless,
OpenRouter: ResponsesStoreHandlingStateless,
Requesty: ResponsesStoreHandlingStateless,
Groq: ResponsesStoreHandlingStateless,
XAI: ResponsesStoreHandlingUpstreamManaged,
GPTLoad: ResponsesStoreHandlingUpstreamManaged,
Expand Down
2 changes: 1 addition & 1 deletion internal/channel/route_golden_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func TestBuiltInRouteGolden(t *testing.T) {
}

digest := fmt.Sprintf("%x", sha256.Sum256([]byte(strings.Join(got, "\n"))))
const wantDigest = "70566b49763604e52ef7abc92670564289e9413b272cc7fb4d28aa0183c2ccd0"
const wantDigest = "8e353a5e08d049c3ac123a072f8b9510d091b0cad80dd51f8759691c02e426a2"
if digest != wantDigest {
t.Fatalf("built-in routes changed: digest = %s, want %s\n%s", digest, wantDigest, strings.Join(got, "\n"))
}
Expand Down
1 change: 1 addition & 0 deletions internal/channel/spec/definition.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ const (
Alibaba ID = "alibaba"
Volcengine ID = "volcengine"
OpenRouter ID = "openrouter"
Requesty ID = "requesty"
Groq ID = "groq"
XAI ID = "xai"
)
Expand Down
1 change: 1 addition & 0 deletions internal/execution/bifrost/sdk_defaults_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ func TestSDKDefaultBaseURLReportsOnlyUniqueSDKDefaults(t *testing.T) {
channel.ZhipuAI,
channel.Alibaba,
channel.Volcengine,
channel.Requesty,
} {
t.Run(string(channelID), func(t *testing.T) {
got, unique, err := manager.DefaultBaseURL(channelID)
Expand Down
Binary file added web/src/assets/channels/requesty.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.