如何使用 cc-switch 让 claude 访问 openai
CC Switch 会自动修改配置文件 ~/.claude/settings.json(Windows 为 %APPDATA%.claude\settings.json)。添加一个 openai 格式的模型地址:http://172.16.1.12:32788/v1。开启代理后可以使用 anthropic 协议连接。然后点击“测试模型”,会报如下错误。
·
文章目录
-
下载安装
https://www.runoob.com/ai-agent/cc-switch.html
源码地址
https://github.com/farion1231/cc-switch -
问题复现
添加一个 openai 格式的模型地址:http://172.16.1.12:32788/v1
然后点击“测试模型”,会报如下错误。(参考价值不大)提示:
Kimi k2.5(openai) 检查失败: Connection failed: error sending request for url (http://172.16.1.12:32788/v1/messages?beta=true)

使用终端访问
- 解决方案
打开全局代理
CC Switch 会自动修改配置文件 ~/.claude/settings.json(Windows 为 %APPDATA%.claude\settings.json)。
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "PROXY_MANAGED",
"ANTHROPIC_BASE_URL": "http://127.0.0.1:15721",
"CLAUDE_CODE_LANGUAGE": "zh-CN"
}
}
整个文件
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "PROXY_MANAGED",
"ANTHROPIC_BASE_URL": "http://127.0.0.1:15721"
},
"model": "opus[1m]",
"claudeCode.environmentVariables": [
{
"name": "ANTHROPIC_BASE_URL",
"value": "http://172.16.1.12:32788"
},
{
"name": "ANTHROPIC_AUTH_TOKEN",
"value": "c0vkhp0fElaHYyiUA391496**********9265999038AeE047"
},
{
"name": "ANTHROPIC_MODEL",
"value": "kimi-k2.5"
}
],
"claudeCode.preferredLocation": "panel",
"workbench.colorTheme": "Light 2026"
}
在开启个终端,可以正常对话。
- Anthropic 客户端
开启代理后 python Anthropic 客户端,可以使用 anthropic 协议连接。
class Anthropic(SyncAPIClient):
# client options
api_key: str | None
auth_token: str | None
# constants
HUMAN_PROMPT = _constants.HUMAN_PROMPT
AI_PROMPT = _constants.AI_PROMPT
def __init__(
self,
*,
api_key: str | None = None,
auth_token: str | None = None,
base_url: str | httpx.URL | None = None,
timeout: float | Timeout | None | NotGiven = not_given,
max_retries: int = DEFAULT_MAX_RETRIES,
default_headers: Mapping[str, str] | None = None,
default_query: Mapping[str, object] | None = None,
# Configure a custom httpx client.
# We provide a `DefaultHttpxClient` class that you can pass to retain the default values we use for `limits`, `timeout` & `follow_redirects`.
# See the [httpx documentation](https://www.python-httpx.org/api/#client) for more details.
http_client: httpx.Client | None = None,
# Enable or disable schema validation for data returned by the API.
# When enabled an error APIResponseValidationError is raised
# if the API responds with invalid data for the expected schema.
#
# This parameter may be removed or changed in the future.
# If you rely on this feature, please open a GitHub issue
# outlining your use-case to help us decide if it should be
# part of our public interface in the future.
_strict_response_validation: bool = False,
) -> None:
"""Construct a new synchronous Anthropic client instance.
This automatically infers the following arguments from their corresponding environment variables if they are not provided:
- `api_key` from `ANTHROPIC_API_KEY`
- `auth_token` from `ANTHROPIC_AUTH_TOKEN`
"""
if api_key is None:
api_key = os.environ.get("ANTHROPIC_API_KEY")
self.api_key = api_key
if auth_token is None:
auth_token = os.environ.get("ANTHROPIC_AUTH_TOKEN")
self.auth_token = auth_token
if base_url is None:
base_url = os.environ.get("ANTHROPIC_BASE_URL")
if base_url is None:
base_url = f"https://api.anthropic.com"
super().__init__(
version=__version__,
base_url=base_url,
max_retries=max_retries,
timeout=timeout,
http_client=http_client,
custom_headers=default_headers,
custom_query=default_query,
_strict_response_validation=_strict_response_validation,
)
self._default_stream_cls = Stream
@cached_property
def completions(self) -> Completions:
from .resources.completions import Completions
return Completions(self)
@cached_property
def messages(self) -> Messages:
from .resources.messages import Messages
return Messages(self)
@cached_property
def models(self) -> Models:
from .resources.models import Models
return Models(self)
@cached_property
def beta(self) -> Beta:
from .resources.beta import Beta
return Beta(self)
@cached_property
def with_raw_response(self) -> AnthropicWithRawResponse:
return AnthropicWithRawResponse(self)
@cached_property
def with_streaming_response(self) -> AnthropicWithStreamedResponse:
return AnthropicWithStreamedResponse(self)
@property
@override
def qs(self) -> Querystring:
return Querystring(array_format="comma")
@property
@override
def auth_headers(self) -> dict[str, str]:
return {**self._api_key_auth, **self._bearer_auth}
@property
def _api_key_auth(self) -> dict[str, str]:
api_key = self.api_key
if api_key is None:
return {}
return {"X-Api-Key": api_key}
@property
def _bearer_auth(self) -> dict[str, str]:
auth_token = self.auth_token
if auth_token is None:
return {}
return {"Authorization": f"Bearer {auth_token}"}
@property
@override
def default_headers(self) -> dict[str, str | Omit]:
return {
**super().default_headers,
"X-Stainless-Async": "false",
"anthropic-version": "2023-06-01",
**self._custom_headers,
}
@override
def _validate_headers(self, headers: Headers, custom_headers: Headers) -> None:
if headers.get("Authorization") or headers.get("X-Api-Key"):
# valid
return
if headers.get("X-Api-Key") or isinstance(custom_headers.get("X-Api-Key"), Omit):
return
if headers.get("Authorization") or isinstance(custom_headers.get("Authorization"), Omit):
return
raise TypeError(
'"Could not resolve authentication method. Expected either api_key or auth_token to be set. Or for one of the `X-Api-Key` or `Authorization` headers to be explicitly omitted"'
)
def copy(
self,
*,
api_key: str | None = None,
auth_token: str | None = None,
base_url: str | httpx.URL | None = None,
timeout: float | Timeout | None | NotGiven = not_given,
http_client: httpx.Client | None = None,
max_retries: int | NotGiven = not_given,
default_headers: Mapping[str, str] | None = None,
set_default_headers: Mapping[str, str] | None = None,
default_query: Mapping[str, object] | None = None,
set_default_query: Mapping[str, object] | None = None,
_extra_kwargs: Mapping[str, Any] = {},
) -> Self:
"""
Create a new client instance re-using the same options given to the current client with optional overriding.
"""
if default_headers is not None and set_default_headers is not None:
raise ValueError("The `default_headers` and `set_default_headers` arguments are mutually exclusive")
if default_query is not None and set_default_query is not None:
raise ValueError("The `default_query` and `set_default_query` arguments are mutually exclusive")
headers = self._custom_headers
if default_headers is not None:
headers = {**headers, **default_headers}
elif set_default_headers is not None:
headers = set_default_headers
params = self._custom_query
if default_query is not None:
params = {**params, **default_query}
elif set_default_query is not None:
params = set_default_query
http_client = http_client or self._client
return self.__class__(
api_key=api_key or self.api_key,
auth_token=auth_token or self.auth_token,
base_url=base_url or self.base_url,
timeout=self.timeout if isinstance(timeout, NotGiven) else timeout,
http_client=http_client,
max_retries=max_retries if is_given(max_retries) else self.max_retries,
default_headers=headers,
default_query=params,
**_extra_kwargs,
)
# Alias for `copy` for nicer inline usage, e.g.
# client.with_options(timeout=10).foo.create(...)
with_options = copy
@override
def _make_status_error(
self,
err_msg: str,
*,
body: object,
response: httpx.Response,
) -> APIStatusError:
if response.status_code == 400:
return _exceptions.BadRequestError(err_msg, response=response, body=body)
if response.status_code == 401:
return _exceptions.AuthenticationError(err_msg, response=response, body=body)
if response.status_code == 403:
return _exceptions.PermissionDeniedError(err_msg, response=response, body=body)
if response.status_code == 404:
return _exceptions.NotFoundError(err_msg, response=response, body=body)
if response.status_code == 409:
return _exceptions.ConflictError(err_msg, response=response, body=body)
if response.status_code == 413:
return _exceptions.RequestTooLargeError(err_msg, response=response, body=body)
if response.status_code == 422:
return _exceptions.UnprocessableEntityError(err_msg, response=response, body=body)
if response.status_code == 429:
return _exceptions.RateLimitError(err_msg, response=response, body=body)
if response.status_code == 529:
return _exceptions.OverloadedError(err_msg, response=response, body=body)
if response.status_code >= 500:
return _exceptions.InternalServerError(err_msg, response=response, body=body)
return APIStatusError(err_msg, response=response, body=body)
配置信息如下:
# Anthropic API Key (必选,可以是PROXY_MANAGED1111)
ANTHROPIC_AUTH_TOKEN=PROXY_MANAGED
# Anthropic Base URL(必选)
ANTHROPIC_BASE_URL=http://127.0.0.1:15721
# Anthropic Model(可选,默认为 claude-3-sonnet-20240229)
# ANTHROPIC_MODEL=kimi-k2.5
更多推荐




所有评论(0)