1 line
5.8 KiB
JSON
1 line
5.8 KiB
JSON
{"repo": "bingcha-2/gfa", "files": {"apps/app/internal/local/modelprovider/wireapi.go": {"7cb3ca8a15551264fc6983cd828d2827468c373e": {"t": 1785596143.850697, "n": 2344, "h": "03ba6c21e17ac570", "c": "package modelprovider\n\nimport (\n\t\"net/url\"\n\t\"strings\"\n)\n\n// chatCompletionsHosts 是已知的 OpenAI /chat/completions 兼容厂商域名片段,\n// 逐字移植自 cockpit normalize_model_provider_wire_api。命中即判为 chat_completions。\nvar chatCompletionsHosts = []string{\n\t\"/chat/completions\",\n\t\"api.deepseek.com\",\n\t\"api.moonshot.cn\",\n\t\"api.siliconflow.cn\",\n\t\"api.siliconflow.com\",\n\t\"open.bigmodel.cn\",\n\t\"api.z.ai\",\n\t\"volces.com\",\n\t\"bytepluses.com\",\n\t\"qianfan.baidubce.com\",\n\t\"dashscope.aliyuncs.com\",\n\t\"api.stepfun.com\",\n\t\"api.stepfun.ai\",\n\t\"modelscope.cn\",\n\t\"api.longcat.chat\",\n\t\"api.minimax.io\",\n\t\"api.mini-max.chat\",\n\t\"api.minimaxi.com\",\n\t\"api.mimo.dev\",\n\t\"token-plan-cn.xiaomimimo.com\",\n\t\"api.novita.ai\",\n\t\"integrate.api.nvidia.com\",\n\t\"runapi.co\",\n\t\"relaxycode.com\",\n\t\"compshare.cn\",\n\t\"api.lemondata.cc\",\n\t\"e-flowcode.cc\",\n\t\"cc-api.pipellm.ai\",\n\t\"openrouter.ai\",\n\t\"api.therouter.ai\",\n}\n\n// NormalizeWireAPI 把外部 wireApi 值(可能空/别名)归一到合法协议。\n// 显式 responses / chat_completions(含 openai 别名)优先;否则按 baseURL 域名启发式。\n// 移植自 cockpit normalize_model_provider_wire_api(默认回退 responses)。\nfunc NormalizeWireAPI(value, baseURL string) WireAPI {\n\tswitch strings.ToLower(strings.TrimSpace(value)) {\n\tcase \"chat_completions\", \"chat-completions\", \"chatcompletions\", \"openai\":\n\t\treturn WireChatCompletions\n\tcase \"responses\":\n\t\treturn WireResponses\n\t}\n\tlower := strings.ToLower(strings.TrimSpace(baseURL))\n\tfor _, frag := range chatCompletionsHosts {\n\t\tif strings.Contains(lower, frag) {\n\t\t\treturn WireChatCompletions\n\t\t}\n\t}\n\treturn WireResponses\n}\n\n// modelsURL 由 baseURL 推出 /models 端点(对齐 cockpit codex_model_provider_models_url)。\n// 保留 baseURL 既有路径(如 /v1),仅追加 /models;清掉 query;校验 http(s) scheme。\nfunc modelsURL(baseURL string) (string, error) {\n\ttrimmed := strings.TrimRight(strings.TrimSpace(baseURL), \"/\")\n\tif trimmed == \"\" {\n\t\treturn \"\", errInvalidBaseURL\n\t}\n\tu, err := url.Parse(trimmed)\n\tif err != nil {\n\t\treturn \"\", errInvalidBaseURL\n\t}\n\tswitch u.Scheme {\n\tcase \"http\", \"https\":\n\tdefault:\n\t\treturn \"\", errInvalidBaseURL\n\t}\n\tif u.Host == \"\" {\n\t\treturn \"\", errInvalidBaseURL\n\t}\n\tif u.Path == \"\" || u.Path == \"/\" {\n\t\tu.Path = \"/models\"\n\t} else {\n\t\tu.Path = strings.TrimRight(u.Path, \"/\") + \"/models\"\n\t}\n\tu.RawQuery = \"\"\n\treturn u.String(), nil\n}\n\ntype sentinelErr string\n\nfunc (e sentinelErr) Error() string { return string(e) }\n\nconst errInvalidBaseURL = sentinelErr(\"PROVIDER_BASE_URL_INVALID\")\n"}, "a2d0ab3c0877ef29638a7fd59b87fb52e3bf9f71": {"t": 1785759523.9861102, "n": 2344, "h": "03ba6c21e17ac570", "c": "package modelprovider\n\nimport (\n\t\"net/url\"\n\t\"strings\"\n)\n\n// chatCompletionsHosts 是已知的 OpenAI /chat/completions 兼容厂商域名片段,\n// 逐字移植自 cockpit normalize_model_provider_wire_api。命中即判为 chat_completions。\nvar chatCompletionsHosts = []string{\n\t\"/chat/completions\",\n\t\"api.deepseek.com\",\n\t\"api.moonshot.cn\",\n\t\"api.siliconflow.cn\",\n\t\"api.siliconflow.com\",\n\t\"open.bigmodel.cn\",\n\t\"api.z.ai\",\n\t\"volces.com\",\n\t\"bytepluses.com\",\n\t\"qianfan.baidubce.com\",\n\t\"dashscope.aliyuncs.com\",\n\t\"api.stepfun.com\",\n\t\"api.stepfun.ai\",\n\t\"modelscope.cn\",\n\t\"api.longcat.chat\",\n\t\"api.minimax.io\",\n\t\"api.mini-max.chat\",\n\t\"api.minimaxi.com\",\n\t\"api.mimo.dev\",\n\t\"token-plan-cn.xiaomimimo.com\",\n\t\"api.novita.ai\",\n\t\"integrate.api.nvidia.com\",\n\t\"runapi.co\",\n\t\"relaxycode.com\",\n\t\"compshare.cn\",\n\t\"api.lemondata.cc\",\n\t\"e-flowcode.cc\",\n\t\"cc-api.pipellm.ai\",\n\t\"openrouter.ai\",\n\t\"api.therouter.ai\",\n}\n\n// NormalizeWireAPI 把外部 wireApi 值(可能空/别名)归一到合法协议。\n// 显式 responses / chat_completions(含 openai 别名)优先;否则按 baseURL 域名启发式。\n// 移植自 cockpit normalize_model_provider_wire_api(默认回退 responses)。\nfunc NormalizeWireAPI(value, baseURL string) WireAPI {\n\tswitch strings.ToLower(strings.TrimSpace(value)) {\n\tcase \"chat_completions\", \"chat-completions\", \"chatcompletions\", \"openai\":\n\t\treturn WireChatCompletions\n\tcase \"responses\":\n\t\treturn WireResponses\n\t}\n\tlower := strings.ToLower(strings.TrimSpace(baseURL))\n\tfor _, frag := range chatCompletionsHosts {\n\t\tif strings.Contains(lower, frag) {\n\t\t\treturn WireChatCompletions\n\t\t}\n\t}\n\treturn WireResponses\n}\n\n// modelsURL 由 baseURL 推出 /models 端点(对齐 cockpit codex_model_provider_models_url)。\n// 保留 baseURL 既有路径(如 /v1),仅追加 /models;清掉 query;校验 http(s) scheme。\nfunc modelsURL(baseURL string) (string, error) {\n\ttrimmed := strings.TrimRight(strings.TrimSpace(baseURL), \"/\")\n\tif trimmed == \"\" {\n\t\treturn \"\", errInvalidBaseURL\n\t}\n\tu, err := url.Parse(trimmed)\n\tif err != nil {\n\t\treturn \"\", errInvalidBaseURL\n\t}\n\tswitch u.Scheme {\n\tcase \"http\", \"https\":\n\tdefault:\n\t\treturn \"\", errInvalidBaseURL\n\t}\n\tif u.Host == \"\" {\n\t\treturn \"\", errInvalidBaseURL\n\t}\n\tif u.Path == \"\" || u.Path == \"/\" {\n\t\tu.Path = \"/models\"\n\t} else {\n\t\tu.Path = strings.TrimRight(u.Path, \"/\") + \"/models\"\n\t}\n\tu.RawQuery = \"\"\n\treturn u.String(), nil\n}\n\ntype sentinelErr string\n\nfunc (e sentinelErr) Error() string { return string(e) }\n\nconst errInvalidBaseURL = sentinelErr(\"PROVIDER_BASE_URL_INVALID\")\n"}}}} |