From 0c580c73eff38320448922060281a609b3175063 Mon Sep 17 00:00:00 2001 From: Mola-maker <2249464964@qq.com> Date: Sun, 20 Sep 2026 02:22:00 -0700 Subject: [PATCH 1/2] feat(provider): add StepFun and Step Plan presets --- astrbot/core/config/default.py | 24 ++++++ dashboard/src/utils/providerUtils.js | 4 + docs/en/providers/start.md | 17 ++++ docs/public/stepfun-provider-presets.png | Bin 0 -> 41499 bytes docs/zh/providers/start.md | 17 ++++ tests/test_stepfun_presets.py | 102 +++++++++++++++++++++++ 6 files changed, 164 insertions(+) create mode 100644 docs/public/stepfun-provider-presets.png create mode 100644 tests/test_stepfun_presets.py diff --git a/astrbot/core/config/default.py b/astrbot/core/config/default.py index f166ac9179..3870e94b64 100644 --- a/astrbot/core/config/default.py +++ b/astrbot/core/config/default.py @@ -1401,6 +1401,30 @@ def get_local_permission_defaults(system: str | None = None) -> dict: "proxy": "", "custom_headers": {}, }, + "StepFun": { + "id": "stepfun", + "provider": "stepfun", + "type": "openai_chat_completion", + "provider_type": "chat_completion", + "enable": True, + "key": [], + "api_base": "https://api.stepfun.com/v1", + "timeout": 120, + "proxy": "", + "custom_headers": {}, + }, + "StepFun Step Plan": { + "id": "stepfun-step-plan", + "provider": "stepfun-step-plan", + "type": "openai_chat_completion", + "provider_type": "chat_completion", + "enable": True, + "key": [], + "api_base": "https://api.stepfun.com/step_plan/v1", + "timeout": 120, + "proxy": "", + "custom_headers": {}, + }, "MiniMax": { "id": "minimax", "provider": "minimax", diff --git a/dashboard/src/utils/providerUtils.js b/dashboard/src/utils/providerUtils.js index 31406973da..e344463f24 100644 --- a/dashboard/src/utils/providerUtils.js +++ b/dashboard/src/utils/providerUtils.js @@ -26,6 +26,8 @@ export function getProviderIcon(type) { 'moonshot': 'https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@latest/icons/kimi.svg', 'kimi': 'https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@latest/icons/kimi.svg', 'kimi-code': 'https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@latest/icons/kimi.svg', + 'stepfun': 'https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@latest/icons/stepfun.svg', + 'stepfun-step-plan': 'https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@latest/icons/stepfun.svg', 'longcat': 'https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@latest/icons/longcat-color.svg', 'ppio': 'https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@latest/icons/ppio.svg', 'dify': 'https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@latest/icons/dify-color.svg', @@ -80,6 +82,8 @@ export function isMonochromeProviderIcon(type) { 'moonshot', 'kimi', 'kimi-code', + 'stepfun', + 'stepfun-step-plan', 'ppio', 'lm_studio', 'minimax', diff --git a/docs/en/providers/start.md b/docs/en/providers/start.md index c62b644edb..39b33a6106 100644 --- a/docs/en/providers/start.md +++ b/docs/en/providers/start.md @@ -34,6 +34,23 @@ Using DeepSeek as an example, assuming you have registered and logged in to a De 6. Click **Save and Fetch Models**, find the desired model, click `+`, and make sure it is enabled. If the model list cannot be fetched, click **Save Configuration**, then **Custom Model** and enter the model ID. Use **Test Model** beside the model to check connectivity. 7. Open **Config**, select the profile to use, and go to **AI → Model**. Set **Chat Model** to the model you just added, then click **Save Configuration** at the bottom right. This setting is for AstrBot built-in AI. +## Connecting StepFun and Step Plan + +Open **Providers → Chat Completion → Add** and select `StepFun` for the standard API or `StepFun Step Plan` for your Step Plan subscription. Enter your StepFun API key; the presets use separate API Base URLs: + +![StepFun and StepFun Step Plan in the provider selector (Chinese UI)](/stepfun-provider-presets.png) + +| Preset | Default API Base URL | +| --- | --- | +| StepFun | `https://api.stepfun.com/v1` | +| StepFun Step Plan | `https://api.stepfun.com/step_plan/v1` | + +The API Base URL remains editable. Use the endpoint that matches your account's region and billing plan; see the [StepFun API documentation](https://platform.stepfun.com/docs/zh/api-reference/chat/chat-completion-create). + +Click **Save and Fetch Models** and add a model available to your account. If fetching the list fails, use **Save Configuration → Custom Model** and enter a model ID supported by your endpoint. Then select it as the profile's **AI → Model → Chat Model**, as in the steps above. + +Both presets support the same optional settings as other OpenAI-compatible providers: timeout, proxy, and custom headers in the provider's advanced settings, plus model capabilities, context size, and custom request parameters in the model configuration. Only enable capabilities and parameters supported by the selected model. For example, `custom_extra_body` can include `{"reasoning_effort": "high", "max_tokens": 8192}` for models that support those parameters. Leave it empty to use the service defaults. + ## Using Environment Variables to Load Keys > Introduced in v4.13.0. diff --git a/docs/public/stepfun-provider-presets.png b/docs/public/stepfun-provider-presets.png new file mode 100644 index 0000000000000000000000000000000000000000..19cf7135ba60840138bdf0fec65ed15ad5b23adc GIT binary patch literal 41499 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 XFg}^(5bGXZ4l>-+)z4*}Q$iB}=n2*5 literal 0 HcmV?d00001 diff --git a/docs/zh/providers/start.md b/docs/zh/providers/start.md index 6026c5e47e..70c9dfb409 100644 --- a/docs/zh/providers/start.md +++ b/docs/zh/providers/start.md @@ -34,6 +34,23 @@ AstrBot 适配了 OpenAI、Google GenAI、Anthropic 三种原生 API 格式。 - 点击「保存并获取模型」,找到想使用的模型,点击右侧 `+` 并确认模型已启用。如果无法获取模型列表,可先「保存配置」,再点击「自定义模型」并填写模型 ID。可通过模型旁的「测试模型」检查连通性。 - 进入「配置文件」,选择要使用的配置文件,在「AI 配置」→「模型」中将「对话模型」设为刚添加的模型,点击右下角「保存配置」。此项用于 AstrBot 内置 AI。 +## 接入 StepFun 和 Step Plan + +打开「模型提供商」→「对话」→「新增」,普通 API 选择 `StepFun`,Step Plan 订阅选择 `StepFun Step Plan`,填写阶跃星辰 API Key。两个预设分别使用以下 API Base URL: + +![提供商选择器中的 StepFun 和 StepFun Step Plan 入口](/stepfun-provider-presets.png) + +| 预设 | 默认 API Base URL | +| --- | --- | +| StepFun | `https://api.stepfun.com/v1` | +| StepFun Step Plan | `https://api.stepfun.com/step_plan/v1` | + +API Base URL 仍可编辑,请使用与账号区域及计费套餐对应的地址,详见[阶跃星辰 API 文档](https://platform.stepfun.com/docs/zh/api-reference/chat/chat-completion-create)。 + +点击「保存并获取模型」,添加账号可用的模型。如果获取列表失败,可先「保存配置」,再通过「自定义模型」填写当前接口支持的模型 ID。最后按照上面的步骤,将其设为配置文件中「AI 配置」→「模型」的「对话模型」。 + +两个预设与其他 OpenAI 兼容提供商使用相同的可选配置:提供商高级配置支持超时、代理和自定义请求头,模型配置支持模型能力、上下文大小和自定义请求参数。请仅启用所选模型支持的能力和参数。例如,对支持相应参数的模型,可在 `custom_extra_body` 中填写 `{"reasoning_effort": "high", "max_tokens": 8192}`;留空则使用服务端默认值。 + ## 使用环境变量加载 Key > v4.13.0 之后引入 diff --git a/tests/test_stepfun_presets.py b/tests/test_stepfun_presets.py new file mode 100644 index 0000000000..1d76b3211e --- /dev/null +++ b/tests/test_stepfun_presets.py @@ -0,0 +1,102 @@ +import copy +import json + +import httpx +import pytest + +from astrbot.core.config.default import CONFIG_METADATA_2 +from astrbot.core.provider.sources.openai_source import ProviderOpenAIOfficial + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + ("preset", "base_url"), + [ + ("StepFun", "https://api.stepfun.com/v1"), + ("StepFun Step Plan", "https://api.stepfun.com/step_plan/v1"), + ], +) +@pytest.mark.parametrize("stream", [False, True]) +async def test_stepfun_presets_route_models_and_chat( + monkeypatch, preset, base_url, stream +): + config = copy.deepcopy( + CONFIG_METADATA_2["provider_group"]["metadata"]["provider"]["config_template"][ + preset + ] + ) + assert config["type"] == "openai_chat_completion" + assert config["provider_type"] == "chat_completion" + assert config["api_base"] == base_url + config.update( + key=["test-stepfun-key"], + model="step-3.5-flash", + timeout=45, + custom_headers={"X-Test-Header": "stepfun"}, + custom_extra_body={"reasoning_effort": "high", "max_tokens": 8192}, + ) + requests = [] + + def handle(request): + requests.append(request) + if request.method == "GET": + return httpx.Response( + 200, + json={ + "object": "list", + "data": [{"id": "step-3.5-flash", "object": "model"}], + }, + ) + message = {"role": "assistant", "content": "Hello"} + response = { + "id": "test-completion", + "object": "chat.completion.chunk" if stream else "chat.completion", + "created": 0, + "model": "step-3.5-flash", + "choices": [ + { + "index": 0, + "delta" if stream else "message": message, + "finish_reason": "stop", + } + ], + } + if stream: + return httpx.Response( + 200, + headers={"Content-Type": "text/event-stream"}, + content=f"data: {json.dumps(response)}\n\ndata: [DONE]\n\n", + ) + return httpx.Response(200, json=response) + + monkeypatch.setattr( + ProviderOpenAIOfficial, + "_create_http_client", + staticmethod( + lambda config: httpx.AsyncClient(transport=httpx.MockTransport(handle)) + ), + ) + provider = ProviderOpenAIOfficial(config, {}) + try: + assert await provider.get_models() == ["step-3.5-flash"] + if stream: + responses = [ + response async for response in provider.text_chat_stream(prompt="Hi") + ] + assert any(response.completion_text == "Hello" for response in responses) + else: + assert (await provider.text_chat(prompt="Hi")).completion_text == "Hello" + assert [str(request.url) for request in requests] == [ + f"{base_url}/models", + f"{base_url}/chat/completions", + ] + assert requests[1].headers["Authorization"] == "Bearer test-stepfun-key" + assert requests[1].headers["X-Test-Header"] == "stepfun" + payload = json.loads(requests[1].content) + assert payload["model"] == "step-3.5-flash" + assert payload["reasoning_effort"] == "high" + assert payload["max_tokens"] == 8192 + assert payload.get("stream", False) is stream + assert requests[1].extensions["timeout"]["read"] == 45 + finally: + await provider.terminate() From 1a94a799620ac6771f197f4cec7f0e8b04d320a5 Mon Sep 17 00:00:00 2001 From: Mola-maker <2249464964@qq.com> Date: Mon, 21 Sep 2026 02:20:57 -0700 Subject: [PATCH 2/2] docs: remove StepFun setup additions per review --- docs/en/providers/start.md | 17 ----------------- docs/public/stepfun-provider-presets.png | Bin 41499 -> 0 bytes docs/zh/providers/start.md | 17 ----------------- 3 files changed, 34 deletions(-) delete mode 100644 docs/public/stepfun-provider-presets.png diff --git a/docs/en/providers/start.md b/docs/en/providers/start.md index 39b33a6106..c62b644edb 100644 --- a/docs/en/providers/start.md +++ b/docs/en/providers/start.md @@ -34,23 +34,6 @@ Using DeepSeek as an example, assuming you have registered and logged in to a De 6. Click **Save and Fetch Models**, find the desired model, click `+`, and make sure it is enabled. If the model list cannot be fetched, click **Save Configuration**, then **Custom Model** and enter the model ID. Use **Test Model** beside the model to check connectivity. 7. Open **Config**, select the profile to use, and go to **AI → Model**. Set **Chat Model** to the model you just added, then click **Save Configuration** at the bottom right. This setting is for AstrBot built-in AI. -## Connecting StepFun and Step Plan - -Open **Providers → Chat Completion → Add** and select `StepFun` for the standard API or `StepFun Step Plan` for your Step Plan subscription. Enter your StepFun API key; the presets use separate API Base URLs: - -![StepFun and StepFun Step Plan in the provider selector (Chinese UI)](/stepfun-provider-presets.png) - -| Preset | Default API Base URL | -| --- | --- | -| StepFun | `https://api.stepfun.com/v1` | -| StepFun Step Plan | `https://api.stepfun.com/step_plan/v1` | - -The API Base URL remains editable. Use the endpoint that matches your account's region and billing plan; see the [StepFun API documentation](https://platform.stepfun.com/docs/zh/api-reference/chat/chat-completion-create). - -Click **Save and Fetch Models** and add a model available to your account. If fetching the list fails, use **Save Configuration → Custom Model** and enter a model ID supported by your endpoint. Then select it as the profile's **AI → Model → Chat Model**, as in the steps above. - -Both presets support the same optional settings as other OpenAI-compatible providers: timeout, proxy, and custom headers in the provider's advanced settings, plus model capabilities, context size, and custom request parameters in the model configuration. Only enable capabilities and parameters supported by the selected model. For example, `custom_extra_body` can include `{"reasoning_effort": "high", "max_tokens": 8192}` for models that support those parameters. Leave it empty to use the service defaults. - ## Using Environment Variables to Load Keys > Introduced in v4.13.0. diff --git a/docs/public/stepfun-provider-presets.png b/docs/public/stepfun-provider-presets.png deleted file mode 100644 index 19cf7135ba60840138bdf0fec65ed15ad5b23adc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41499 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 XFg}^(5bGXZ4l>-+)z4*}Q$iB}=n2*5 diff --git a/docs/zh/providers/start.md b/docs/zh/providers/start.md index 70c9dfb409..6026c5e47e 100644 --- a/docs/zh/providers/start.md +++ b/docs/zh/providers/start.md @@ -34,23 +34,6 @@ AstrBot 适配了 OpenAI、Google GenAI、Anthropic 三种原生 API 格式。 - 点击「保存并获取模型」,找到想使用的模型,点击右侧 `+` 并确认模型已启用。如果无法获取模型列表,可先「保存配置」,再点击「自定义模型」并填写模型 ID。可通过模型旁的「测试模型」检查连通性。 - 进入「配置文件」,选择要使用的配置文件,在「AI 配置」→「模型」中将「对话模型」设为刚添加的模型,点击右下角「保存配置」。此项用于 AstrBot 内置 AI。 -## 接入 StepFun 和 Step Plan - -打开「模型提供商」→「对话」→「新增」,普通 API 选择 `StepFun`,Step Plan 订阅选择 `StepFun Step Plan`,填写阶跃星辰 API Key。两个预设分别使用以下 API Base URL: - -![提供商选择器中的 StepFun 和 StepFun Step Plan 入口](/stepfun-provider-presets.png) - -| 预设 | 默认 API Base URL | -| --- | --- | -| StepFun | `https://api.stepfun.com/v1` | -| StepFun Step Plan | `https://api.stepfun.com/step_plan/v1` | - -API Base URL 仍可编辑,请使用与账号区域及计费套餐对应的地址,详见[阶跃星辰 API 文档](https://platform.stepfun.com/docs/zh/api-reference/chat/chat-completion-create)。 - -点击「保存并获取模型」,添加账号可用的模型。如果获取列表失败,可先「保存配置」,再通过「自定义模型」填写当前接口支持的模型 ID。最后按照上面的步骤,将其设为配置文件中「AI 配置」→「模型」的「对话模型」。 - -两个预设与其他 OpenAI 兼容提供商使用相同的可选配置:提供商高级配置支持超时、代理和自定义请求头,模型配置支持模型能力、上下文大小和自定义请求参数。请仅启用所选模型支持的能力和参数。例如,对支持相应参数的模型,可在 `custom_extra_body` 中填写 `{"reasoning_effort": "high", "max_tokens": 8192}`;留空则使用服务端默认值。 - ## 使用环境变量加载 Key > v4.13.0 之后引入