1 line
28 KiB
JSON
1 line
28 KiB
JSON
{"repo": "aceguru-mjh/apex-ai-agent", "files": {"core/integration/src/main/java/com/apex/agent/integration/category/models/BuiltinModelProviders.kt": {"fb9ad78c8f881c24b812fb131f892232349c0ada": {"t": 1785745718.4270284, "n": 8265, "h": "ac5bf2ff368a15b2", "c": "package com.apex.agent.integration.category.models\n\nimport com.apex.agent.integration.api.IntegrationCategory\nimport com.apex.agent.integration.market.IntegrationSourceType\nimport com.apex.agent.integration.market.MarketItem\n\n/**\n * 内置 LLM Provider 配置。\n *\n * 迁移自原 Apex-agent 的 ProviderProfile,包含主流 LLM 平台的连接配置。\n * 业务侧可直接使用这些预设配置,无需手动填写 endpoint 和模型名。\n *\n * # 包含的 Provider\n * - DeepSeek(深度推理/代码生成)\n * - Claude(Anthropic,最强推理)\n * - OpenAI(GPT-4/GPT-3.5)\n * - 通义千问(阿里,国内直连)\n * - 智谱 GLM(国内开源)\n * - Moonshot(Kimi,长上下文)\n * - 月之暗面(MiniMax)\n * - 本地 Ollama(离线推理)\n */\nobject BuiltinModelProviders {\n\n /**\n * Provider 认证类型。\n */\n enum class AuthType { API_KEY, OAUTH, NONE }\n\n /**\n * Provider 类型。\n */\n enum class ProviderType { CLOUD, LOCAL, SELF_HOSTED }\n\n /**\n * LLM Provider 配置。\n */\n data class ProviderConfig(\n val name: String,\n val displayName: String,\n val baseUrl: String,\n val apiKeyEnvVar: String,\n val authType: AuthType = AuthType.API_KEY,\n val providerType: ProviderType = ProviderType.CLOUD,\n val defaultModel: String,\n val modelsUrl: String = \"\",\n val icon: String = \"\",\n val description: String,\n val supportsStreaming: Boolean = true,\n val freeQuota: String = \"\",\n val region: String = \"global\"\n )\n\n /**\n * 所有内置 Provider 配置。\n */\n val providers: List<ProviderConfig> = listOf(\n ProviderConfig(\n name = \"deepseek\",\n displayName = \"DeepSeek\",\n baseUrl = \"https://api.deepseek.com/v1\",\n apiKeyEnvVar = \"DEEPSEEK_API_KEY\",\n defaultModel = \"deepseek-chat\",\n description = \"高性价比 LLM API,深度推理能力\",\n freeQuota = \"新用户赠送\",\n icon = \"https://platform.deepseek.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"deepseek-reasoner\",\n displayName = \"DeepSeek Reasoner\",\n baseUrl = \"https://api.deepseek.com/v1\",\n apiKeyEnvVar = \"DEEPSEEK_API_KEY\",\n defaultModel = \"deepseek-reasoner\",\n description = \"深度推理模型,链式思考(CoT)\",\n freeQuota = \"新用户赠送\",\n icon = \"https://platform.deepseek.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"claude\",\n displayName = \"Claude (Anthropic)\",\n baseUrl = \"https://api.anthropic.com/v1\",\n apiKeyEnvVar = \"ANTHROPIC_API_KEY\",\n defaultModel = \"claude-sonnet-4-20250514\",\n description = \"Anthropic 最强推理模型,擅长长文本分析\",\n freeQuota = \"有限免费额度\",\n icon = \"https://anthropic.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"openai\",\n displayName = \"OpenAI\",\n baseUrl = \"https://api.openai.com/v1\",\n apiKeyEnvVar = \"OPENAI_API_KEY\",\n defaultModel = \"gpt-4o\",\n modelsUrl = \"https://api.openai.com/v1/models\",\n description = \"GPT-4o / GPT-4 Turbo / GPT-3.5\",\n freeQuota = \"无免费额度\",\n icon = \"https://openai.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"qwen\",\n displayName = \"通义千问\",\n baseUrl = \"https://dashscope.aliyuncs.com/api/v1\",\n apiKeyEnvVar = \"DASHSCOPE_API_KEY\",\n defaultModel = \"qwen-max\",\n description = \"阿里通义千问,国内直连,多模态理解\",\n freeQuota = \"10 万 tokens/月\",\n region = \"cn\",\n icon = \"https://dashscope.aliyuncs.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"glm\",\n displayName = \"智谱 GLM\",\n baseUrl = \"https://open.bigmodel.cn/api/paas/v4\",\n apiKeyEnvVar = \"ZHIPU_API_KEY\",\n defaultModel = \"glm-4\",\n description = \"智谱 AI GLM-4,支持工具调用\",\n freeQuota = \"赠送 tokens\",\n region = \"cn\",\n icon = \"https://open.bigmodel.cn/favicon.ico\"\n ),\n ProviderConfig(\n name = \"moonshot\",\n displayName = \"Moonshot (Kimi)\",\n baseUrl = \"https://api.moonshot.cn/v1\",\n apiKeyEnvVar = \"MOONSHOT_API_KEY\",\n defaultModel = \"moonshot-v1-128k\",\n description = \"Kimi 长上下文模型,128K token 窗口\",\n freeQuota = \"有限免费额度\",\n region = \"cn\",\n icon = \"https://moonshot.cn/favicon.ico\"\n ),\n ProviderConfig(\n name = \"minimax\",\n displayName = \"MiniMax\",\n baseUrl = \"https://api.minimax.chat/v1\",\n apiKeyEnvVar = \"MINIMAX_API_KEY\",\n defaultModel = \"abab6.5-chat\",\n description = \"MiniMax 对话模型\",\n freeQuota = \"赠送 tokens\",\n region = \"cn\",\n icon = null ?: \"\"\n ),\n ProviderConfig(\n name = \"baichuan\",\n displayName = \"百川大模型\",\n baseUrl = \"https://api.baichuan-ai.com/v1\",\n apiKeyEnvVar = \"BAICHUAN_API_KEY\",\n defaultModel = \"Baichuan2-Turbo\",\n description = \"百川智能,中文能力优秀\",\n freeQuota = \"赠送 tokens\",\n region = \"cn\",\n icon = null ?: \"\"\n ),\n ProviderConfig(\n name = \"ollama\",\n displayName = \"Ollama (本地)\",\n baseUrl = \"http://localhost:11434/v1\",\n apiKeyEnvVar = \"\",\n authType = AuthType.NONE,\n providerType = ProviderType.LOCAL,\n defaultModel = \"llama3.2\",\n description = \"本地推理,完全离线,无需 API Key\",\n freeQuota = \"永久免费\",\n region = \"local\",\n icon = \"https://ollama.ai/favicon.ico\"\n ),\n ProviderConfig(\n name = \"agnes\",\n displayName = \"Agnes AI\",\n baseUrl = \"https://api.agnes.ai/v1\",\n apiKeyEnvVar = \"AGNES_API_KEY\",\n authType = AuthType.NONE,\n defaultModel = \"agnes-text-pro\",\n description = \"全球全模态永久免费,无额度限制\",\n freeQuota = \"永久免费\",\n icon = null ?: \"\"\n )\n )\n\n /**\n * 转换为 [MarketItem] 列表。\n */\n fun toMarketItems(marketId: String = \"builtin_models\"): List<MarketItem> {\n return providers.map { provider ->\n MarketItem(\n id = \"$marketId:${provider.name}\",\n name = provider.displayName,\n description = provider.description,\n author = provider.name,\n version = \"1.0.0\",\n category = IntegrationCategory.MODEL_PLATFORMS,\n marketId = marketId,\n sourceType = IntegrationSourceType.OFFICIAL_MARKET,\n downloadUrl = provider.baseUrl,\n tags = buildList {\n add(provider.providerType.name.lowercase())\n if (provider.region == \"cn\") add(\"国内\")\n if (provider.freeQuota.contains(\"永久免费\")) add(\"免费\")\n if (provider.supportsStreaming) add(\"streaming\")\n },\n rating = 4.5,\n downloadCount = 0,\n verified = true,\n metadata = mapOf(\n \"baseUrl\" to provider.baseUrl,\n \"defaultModel\" to provider.defaultModel,\n \"authType\" to provider.authType.name,\n \"providerType\" to provider.providerType.name,\n \"freeQuota\" to provider.freeQuota,\n \"region\" to provider.region,\n \"apiKeyEnvVar\" to provider.apiKeyEnvVar,\n \"supportsStreaming\" to provider.supportsStreaming.toString()\n )\n )\n }\n }\n\n /**\n * 按 name 获取配置。\n */\n fun getByName(name: String): ProviderConfig? = providers.find { it.name == name }\n\n /**\n * 按区域获取(global/cn/local)。\n */\n fun getByRegion(region: String): List<ProviderConfig> {\n return providers.filter { it.region == region }\n }\n\n /**\n * 获取所有免费 Provider。\n */\n fun getFreeProviders(): List<ProviderConfig> {\n return providers.filter {\n it.freeQuota.contains(\"永久免费\") || it.freeQuota.contains(\"免费\")\n }\n }\n\n /**\n * 获取本地 Provider。\n */\n fun getLocalProviders(): List<ProviderConfig> {\n return providers.filter { it.providerType == ProviderType.LOCAL }\n }\n}\n"}, "9e576bf00337679d804cbb1eb3ba8205a3e6527f": {"t": 1785755906.7734342, "n": 8265, "h": "ac5bf2ff368a15b2", "c": "package com.apex.agent.integration.category.models\n\nimport com.apex.agent.integration.api.IntegrationCategory\nimport com.apex.agent.integration.market.IntegrationSourceType\nimport com.apex.agent.integration.market.MarketItem\n\n/**\n * 内置 LLM Provider 配置。\n *\n * 迁移自原 Apex-agent 的 ProviderProfile,包含主流 LLM 平台的连接配置。\n * 业务侧可直接使用这些预设配置,无需手动填写 endpoint 和模型名。\n *\n * # 包含的 Provider\n * - DeepSeek(深度推理/代码生成)\n * - Claude(Anthropic,最强推理)\n * - OpenAI(GPT-4/GPT-3.5)\n * - 通义千问(阿里,国内直连)\n * - 智谱 GLM(国内开源)\n * - Moonshot(Kimi,长上下文)\n * - 月之暗面(MiniMax)\n * - 本地 Ollama(离线推理)\n */\nobject BuiltinModelProviders {\n\n /**\n * Provider 认证类型。\n */\n enum class AuthType { API_KEY, OAUTH, NONE }\n\n /**\n * Provider 类型。\n */\n enum class ProviderType { CLOUD, LOCAL, SELF_HOSTED }\n\n /**\n * LLM Provider 配置。\n */\n data class ProviderConfig(\n val name: String,\n val displayName: String,\n val baseUrl: String,\n val apiKeyEnvVar: String,\n val authType: AuthType = AuthType.API_KEY,\n val providerType: ProviderType = ProviderType.CLOUD,\n val defaultModel: String,\n val modelsUrl: String = \"\",\n val icon: String = \"\",\n val description: String,\n val supportsStreaming: Boolean = true,\n val freeQuota: String = \"\",\n val region: String = \"global\"\n )\n\n /**\n * 所有内置 Provider 配置。\n */\n val providers: List<ProviderConfig> = listOf(\n ProviderConfig(\n name = \"deepseek\",\n displayName = \"DeepSeek\",\n baseUrl = \"https://api.deepseek.com/v1\",\n apiKeyEnvVar = \"DEEPSEEK_API_KEY\",\n defaultModel = \"deepseek-chat\",\n description = \"高性价比 LLM API,深度推理能力\",\n freeQuota = \"新用户赠送\",\n icon = \"https://platform.deepseek.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"deepseek-reasoner\",\n displayName = \"DeepSeek Reasoner\",\n baseUrl = \"https://api.deepseek.com/v1\",\n apiKeyEnvVar = \"DEEPSEEK_API_KEY\",\n defaultModel = \"deepseek-reasoner\",\n description = \"深度推理模型,链式思考(CoT)\",\n freeQuota = \"新用户赠送\",\n icon = \"https://platform.deepseek.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"claude\",\n displayName = \"Claude (Anthropic)\",\n baseUrl = \"https://api.anthropic.com/v1\",\n apiKeyEnvVar = \"ANTHROPIC_API_KEY\",\n defaultModel = \"claude-sonnet-4-20250514\",\n description = \"Anthropic 最强推理模型,擅长长文本分析\",\n freeQuota = \"有限免费额度\",\n icon = \"https://anthropic.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"openai\",\n displayName = \"OpenAI\",\n baseUrl = \"https://api.openai.com/v1\",\n apiKeyEnvVar = \"OPENAI_API_KEY\",\n defaultModel = \"gpt-4o\",\n modelsUrl = \"https://api.openai.com/v1/models\",\n description = \"GPT-4o / GPT-4 Turbo / GPT-3.5\",\n freeQuota = \"无免费额度\",\n icon = \"https://openai.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"qwen\",\n displayName = \"通义千问\",\n baseUrl = \"https://dashscope.aliyuncs.com/api/v1\",\n apiKeyEnvVar = \"DASHSCOPE_API_KEY\",\n defaultModel = \"qwen-max\",\n description = \"阿里通义千问,国内直连,多模态理解\",\n freeQuota = \"10 万 tokens/月\",\n region = \"cn\",\n icon = \"https://dashscope.aliyuncs.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"glm\",\n displayName = \"智谱 GLM\",\n baseUrl = \"https://open.bigmodel.cn/api/paas/v4\",\n apiKeyEnvVar = \"ZHIPU_API_KEY\",\n defaultModel = \"glm-4\",\n description = \"智谱 AI GLM-4,支持工具调用\",\n freeQuota = \"赠送 tokens\",\n region = \"cn\",\n icon = \"https://open.bigmodel.cn/favicon.ico\"\n ),\n ProviderConfig(\n name = \"moonshot\",\n displayName = \"Moonshot (Kimi)\",\n baseUrl = \"https://api.moonshot.cn/v1\",\n apiKeyEnvVar = \"MOONSHOT_API_KEY\",\n defaultModel = \"moonshot-v1-128k\",\n description = \"Kimi 长上下文模型,128K token 窗口\",\n freeQuota = \"有限免费额度\",\n region = \"cn\",\n icon = \"https://moonshot.cn/favicon.ico\"\n ),\n ProviderConfig(\n name = \"minimax\",\n displayName = \"MiniMax\",\n baseUrl = \"https://api.minimax.chat/v1\",\n apiKeyEnvVar = \"MINIMAX_API_KEY\",\n defaultModel = \"abab6.5-chat\",\n description = \"MiniMax 对话模型\",\n freeQuota = \"赠送 tokens\",\n region = \"cn\",\n icon = null ?: \"\"\n ),\n ProviderConfig(\n name = \"baichuan\",\n displayName = \"百川大模型\",\n baseUrl = \"https://api.baichuan-ai.com/v1\",\n apiKeyEnvVar = \"BAICHUAN_API_KEY\",\n defaultModel = \"Baichuan2-Turbo\",\n description = \"百川智能,中文能力优秀\",\n freeQuota = \"赠送 tokens\",\n region = \"cn\",\n icon = null ?: \"\"\n ),\n ProviderConfig(\n name = \"ollama\",\n displayName = \"Ollama (本地)\",\n baseUrl = \"http://localhost:11434/v1\",\n apiKeyEnvVar = \"\",\n authType = AuthType.NONE,\n providerType = ProviderType.LOCAL,\n defaultModel = \"llama3.2\",\n description = \"本地推理,完全离线,无需 API Key\",\n freeQuota = \"永久免费\",\n region = \"local\",\n icon = \"https://ollama.ai/favicon.ico\"\n ),\n ProviderConfig(\n name = \"agnes\",\n displayName = \"Agnes AI\",\n baseUrl = \"https://api.agnes.ai/v1\",\n apiKeyEnvVar = \"AGNES_API_KEY\",\n authType = AuthType.NONE,\n defaultModel = \"agnes-text-pro\",\n description = \"全球全模态永久免费,无额度限制\",\n freeQuota = \"永久免费\",\n icon = null ?: \"\"\n )\n )\n\n /**\n * 转换为 [MarketItem] 列表。\n */\n fun toMarketItems(marketId: String = \"builtin_models\"): List<MarketItem> {\n return providers.map { provider ->\n MarketItem(\n id = \"$marketId:${provider.name}\",\n name = provider.displayName,\n description = provider.description,\n author = provider.name,\n version = \"1.0.0\",\n category = IntegrationCategory.MODEL_PLATFORMS,\n marketId = marketId,\n sourceType = IntegrationSourceType.OFFICIAL_MARKET,\n downloadUrl = provider.baseUrl,\n tags = buildList {\n add(provider.providerType.name.lowercase())\n if (provider.region == \"cn\") add(\"国内\")\n if (provider.freeQuota.contains(\"永久免费\")) add(\"免费\")\n if (provider.supportsStreaming) add(\"streaming\")\n },\n rating = 4.5,\n downloadCount = 0,\n verified = true,\n metadata = mapOf(\n \"baseUrl\" to provider.baseUrl,\n \"defaultModel\" to provider.defaultModel,\n \"authType\" to provider.authType.name,\n \"providerType\" to provider.providerType.name,\n \"freeQuota\" to provider.freeQuota,\n \"region\" to provider.region,\n \"apiKeyEnvVar\" to provider.apiKeyEnvVar,\n \"supportsStreaming\" to provider.supportsStreaming.toString()\n )\n )\n }\n }\n\n /**\n * 按 name 获取配置。\n */\n fun getByName(name: String): ProviderConfig? = providers.find { it.name == name }\n\n /**\n * 按区域获取(global/cn/local)。\n */\n fun getByRegion(region: String): List<ProviderConfig> {\n return providers.filter { it.region == region }\n }\n\n /**\n * 获取所有免费 Provider。\n */\n fun getFreeProviders(): List<ProviderConfig> {\n return providers.filter {\n it.freeQuota.contains(\"永久免费\") || it.freeQuota.contains(\"免费\")\n }\n }\n\n /**\n * 获取本地 Provider。\n */\n fun getLocalProviders(): List<ProviderConfig> {\n return providers.filter { it.providerType == ProviderType.LOCAL }\n }\n}\n"}, "11943826f6a1de1a0d18aa9dabde93a387651483": {"t": 1785755908.1234314, "n": 8265, "h": "ac5bf2ff368a15b2", "c": "package com.apex.agent.integration.category.models\n\nimport com.apex.agent.integration.api.IntegrationCategory\nimport com.apex.agent.integration.market.IntegrationSourceType\nimport com.apex.agent.integration.market.MarketItem\n\n/**\n * 内置 LLM Provider 配置。\n *\n * 迁移自原 Apex-agent 的 ProviderProfile,包含主流 LLM 平台的连接配置。\n * 业务侧可直接使用这些预设配置,无需手动填写 endpoint 和模型名。\n *\n * # 包含的 Provider\n * - DeepSeek(深度推理/代码生成)\n * - Claude(Anthropic,最强推理)\n * - OpenAI(GPT-4/GPT-3.5)\n * - 通义千问(阿里,国内直连)\n * - 智谱 GLM(国内开源)\n * - Moonshot(Kimi,长上下文)\n * - 月之暗面(MiniMax)\n * - 本地 Ollama(离线推理)\n */\nobject BuiltinModelProviders {\n\n /**\n * Provider 认证类型。\n */\n enum class AuthType { API_KEY, OAUTH, NONE }\n\n /**\n * Provider 类型。\n */\n enum class ProviderType { CLOUD, LOCAL, SELF_HOSTED }\n\n /**\n * LLM Provider 配置。\n */\n data class ProviderConfig(\n val name: String,\n val displayName: String,\n val baseUrl: String,\n val apiKeyEnvVar: String,\n val authType: AuthType = AuthType.API_KEY,\n val providerType: ProviderType = ProviderType.CLOUD,\n val defaultModel: String,\n val modelsUrl: String = \"\",\n val icon: String = \"\",\n val description: String,\n val supportsStreaming: Boolean = true,\n val freeQuota: String = \"\",\n val region: String = \"global\"\n )\n\n /**\n * 所有内置 Provider 配置。\n */\n val providers: List<ProviderConfig> = listOf(\n ProviderConfig(\n name = \"deepseek\",\n displayName = \"DeepSeek\",\n baseUrl = \"https://api.deepseek.com/v1\",\n apiKeyEnvVar = \"DEEPSEEK_API_KEY\",\n defaultModel = \"deepseek-chat\",\n description = \"高性价比 LLM API,深度推理能力\",\n freeQuota = \"新用户赠送\",\n icon = \"https://platform.deepseek.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"deepseek-reasoner\",\n displayName = \"DeepSeek Reasoner\",\n baseUrl = \"https://api.deepseek.com/v1\",\n apiKeyEnvVar = \"DEEPSEEK_API_KEY\",\n defaultModel = \"deepseek-reasoner\",\n description = \"深度推理模型,链式思考(CoT)\",\n freeQuota = \"新用户赠送\",\n icon = \"https://platform.deepseek.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"claude\",\n displayName = \"Claude (Anthropic)\",\n baseUrl = \"https://api.anthropic.com/v1\",\n apiKeyEnvVar = \"ANTHROPIC_API_KEY\",\n defaultModel = \"claude-sonnet-4-20250514\",\n description = \"Anthropic 最强推理模型,擅长长文本分析\",\n freeQuota = \"有限免费额度\",\n icon = \"https://anthropic.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"openai\",\n displayName = \"OpenAI\",\n baseUrl = \"https://api.openai.com/v1\",\n apiKeyEnvVar = \"OPENAI_API_KEY\",\n defaultModel = \"gpt-4o\",\n modelsUrl = \"https://api.openai.com/v1/models\",\n description = \"GPT-4o / GPT-4 Turbo / GPT-3.5\",\n freeQuota = \"无免费额度\",\n icon = \"https://openai.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"qwen\",\n displayName = \"通义千问\",\n baseUrl = \"https://dashscope.aliyuncs.com/api/v1\",\n apiKeyEnvVar = \"DASHSCOPE_API_KEY\",\n defaultModel = \"qwen-max\",\n description = \"阿里通义千问,国内直连,多模态理解\",\n freeQuota = \"10 万 tokens/月\",\n region = \"cn\",\n icon = \"https://dashscope.aliyuncs.com/favicon.ico\"\n ),\n ProviderConfig(\n name = \"glm\",\n displayName = \"智谱 GLM\",\n baseUrl = \"https://open.bigmodel.cn/api/paas/v4\",\n apiKeyEnvVar = \"ZHIPU_API_KEY\",\n defaultModel = \"glm-4\",\n description = \"智谱 AI GLM-4,支持工具调用\",\n freeQuota = \"赠送 tokens\",\n region = \"cn\",\n icon = \"https://open.bigmodel.cn/favicon.ico\"\n ),\n ProviderConfig(\n name = \"moonshot\",\n displayName = \"Moonshot (Kimi)\",\n baseUrl = \"https://api.moonshot.cn/v1\",\n apiKeyEnvVar = \"MOONSHOT_API_KEY\",\n defaultModel = \"moonshot-v1-128k\",\n description = \"Kimi 长上下文模型,128K token 窗口\",\n freeQuota = \"有限免费额度\",\n region = \"cn\",\n icon = \"https://moonshot.cn/favicon.ico\"\n ),\n ProviderConfig(\n name = \"minimax\",\n displayName = \"MiniMax\",\n baseUrl = \"https://api.minimax.chat/v1\",\n apiKeyEnvVar = \"MINIMAX_API_KEY\",\n defaultModel = \"abab6.5-chat\",\n description = \"MiniMax 对话模型\",\n freeQuota = \"赠送 tokens\",\n region = \"cn\",\n icon = null ?: \"\"\n ),\n ProviderConfig(\n name = \"baichuan\",\n displayName = \"百川大模型\",\n baseUrl = \"https://api.baichuan-ai.com/v1\",\n apiKeyEnvVar = \"BAICHUAN_API_KEY\",\n defaultModel = \"Baichuan2-Turbo\",\n description = \"百川智能,中文能力优秀\",\n freeQuota = \"赠送 tokens\",\n region = \"cn\",\n icon = null ?: \"\"\n ),\n ProviderConfig(\n name = \"ollama\",\n displayName = \"Ollama (本地)\",\n baseUrl = \"http://localhost:11434/v1\",\n apiKeyEnvVar = \"\",\n authType = AuthType.NONE,\n providerType = ProviderType.LOCAL,\n defaultModel = \"llama3.2\",\n description = \"本地推理,完全离线,无需 API Key\",\n freeQuota = \"永久免费\",\n region = \"local\",\n icon = \"https://ollama.ai/favicon.ico\"\n ),\n ProviderConfig(\n name = \"agnes\",\n displayName = \"Agnes AI\",\n baseUrl = \"https://api.agnes.ai/v1\",\n apiKeyEnvVar = \"AGNES_API_KEY\",\n authType = AuthType.NONE,\n defaultModel = \"agnes-text-pro\",\n description = \"全球全模态永久免费,无额度限制\",\n freeQuota = \"永久免费\",\n icon = null ?: \"\"\n )\n )\n\n /**\n * 转换为 [MarketItem] 列表。\n */\n fun toMarketItems(marketId: String = \"builtin_models\"): List<MarketItem> {\n return providers.map { provider ->\n MarketItem(\n id = \"$marketId:${provider.name}\",\n name = provider.displayName,\n description = provider.description,\n author = provider.name,\n version = \"1.0.0\",\n category = IntegrationCategory.MODEL_PLATFORMS,\n marketId = marketId,\n sourceType = IntegrationSourceType.OFFICIAL_MARKET,\n downloadUrl = provider.baseUrl,\n tags = buildList {\n add(provider.providerType.name.lowercase())\n if (provider.region == \"cn\") add(\"国内\")\n if (provider.freeQuota.contains(\"永久免费\")) add(\"免费\")\n if (provider.supportsStreaming) add(\"streaming\")\n },\n rating = 4.5,\n downloadCount = 0,\n verified = true,\n metadata = mapOf(\n \"baseUrl\" to provider.baseUrl,\n \"defaultModel\" to provider.defaultModel,\n \"authType\" to provider.authType.name,\n \"providerType\" to provider.providerType.name,\n \"freeQuota\" to provider.freeQuota,\n \"region\" to provider.region,\n \"apiKeyEnvVar\" to provider.apiKeyEnvVar,\n \"supportsStreaming\" to provider.supportsStreaming.toString()\n )\n )\n }\n }\n\n /**\n * 按 name 获取配置。\n */\n fun getByName(name: String): ProviderConfig? = providers.find { it.name == name }\n\n /**\n * 按区域获取(global/cn/local)。\n */\n fun getByRegion(region: String): List<ProviderConfig> {\n return providers.filter { it.region == region }\n }\n\n /**\n * 获取所有免费 Provider。\n */\n fun getFreeProviders(): List<ProviderConfig> {\n return providers.filter {\n it.freeQuota.contains(\"永久免费\") || it.freeQuota.contains(\"免费\")\n }\n }\n\n /**\n * 获取本地 Provider。\n */\n fun getLocalProviders(): List<ProviderConfig> {\n return providers.filter { it.providerType == ProviderType.LOCAL }\n }\n}\n"}}}} |