From cafd0a0327f74e98cad521bc4bd2f48094e4cfe9 Mon Sep 17 00:00:00 2001 From: JustSong Date: Sun, 16 Feb 2025 17:38:06 +0800 Subject: [PATCH 1/5] feat: add OpenAI compatible channel (close #2091) --- relay/adaptor/openai/helper.go | 3 + relay/channeltype/define.go | 1 + relay/channeltype/url.go | 1 + .../src/constants/channel.constants.js | 113 ++++++++++-------- web/default/src/locales/en/translation.json | 6 +- web/default/src/locales/zh/translation.json | 6 +- web/default/src/pages/Channel/EditChannel.js | 21 +++- 7 files changed, 94 insertions(+), 57 deletions(-) diff --git a/relay/adaptor/openai/helper.go b/relay/adaptor/openai/helper.go index 47c2a882..c6d5bd7f 100644 --- a/relay/adaptor/openai/helper.go +++ b/relay/adaptor/openai/helper.go @@ -17,6 +17,9 @@ func ResponseText2Usage(responseText string, modelName string, promptTokens int) } func GetFullRequestURL(baseURL string, requestURL string, channelType int) string { + if channelType == channeltype.OpenAICompatible { + return fmt.Sprintf("%s%s", strings.TrimSuffix(baseURL, "/"), strings.TrimPrefix(requestURL, "/v1")) + } fullRequestURL := fmt.Sprintf("%s%s", baseURL, requestURL) if strings.HasPrefix(baseURL, "https://gateway.ai.cloudflare.com") { diff --git a/relay/channeltype/define.go b/relay/channeltype/define.go index 76b549e1..87a3cbb8 100644 --- a/relay/channeltype/define.go +++ b/relay/channeltype/define.go @@ -51,5 +51,6 @@ const ( BaiduV2 XunfeiV2 AliBailian + OpenAICompatible Dummy ) diff --git a/relay/channeltype/url.go b/relay/channeltype/url.go index a8acd967..f2e41602 100644 --- a/relay/channeltype/url.go +++ b/relay/channeltype/url.go @@ -51,6 +51,7 @@ var ChannelBaseURLs = []string{ "https://qianfan.baidubce.com", // 47 "https://spark-api-open.xf-yun.com", // 48 "https://dashscope.aliyuncs.com", // 49 + "", // 50 } func init() { diff --git a/web/default/src/constants/channel.constants.js b/web/default/src/constants/channel.constants.js index 26ffd0c4..d40273ed 100644 --- a/web/default/src/constants/channel.constants.js +++ b/web/default/src/constants/channel.constants.js @@ -1,12 +1,19 @@ export const CHANNEL_OPTIONS = [ - {key: 1, text: 'OpenAI', value: 1, color: 'green'}, - {key: 14, text: 'Anthropic Claude', value: 14, color: 'black'}, - {key: 33, text: 'AWS', value: 33, color: 'black'}, - {key: 3, text: 'Azure OpenAI', value: 3, color: 'olive'}, - {key: 11, text: 'Google PaLM2', value: 11, color: 'orange'}, - {key: 24, text: 'Google Gemini', value: 24, color: 'orange'}, - {key: 28, text: 'Mistral AI', value: 28, color: 'orange'}, - {key: 41, text: 'Novita', value: 41, color: 'purple'}, + {key: 1, text: 'OpenAI', value: 1, color: 'green'}, + { + key: 50, + text: 'OpenAI 兼容', + value: 50, + color: 'olive', + description: 'OpenAI 兼容渠道,支持设置 Base URL', + }, + {key: 14, text: 'Anthropic Claude', value: 14, color: 'black'}, + {key: 33, text: 'AWS', value: 33, color: 'black'}, + {key: 3, text: 'Azure OpenAI', value: 3, color: 'olive'}, + {key: 11, text: 'Google PaLM2', value: 11, color: 'orange'}, + {key: 24, text: 'Google Gemini', value: 24, color: 'orange'}, + {key: 28, text: 'Mistral AI', value: 28, color: 'orange'}, + {key: 41, text: 'Novita', value: 41, color: 'purple'}, { key: 40, text: '字节火山引擎', @@ -28,14 +35,14 @@ export const CHANNEL_OPTIONS = [ color: 'blue', tip: '请前往此处获取 API Key,注意本渠道仅支持推理服务 V2相关模型', }, - { - key: 17, - text: '阿里通义千问', - value: 17, - color: 'orange', - tip: '如需使用阿里云百炼,请使用阿里云百炼渠道', - }, - {key: 49, text: '阿里云百炼', value: 49, color: 'orange'}, + { + key: 17, + text: '阿里通义千问', + value: 17, + color: 'orange', + tip: '如需使用阿里云百炼,请使用阿里云百炼渠道', + }, + {key: 49, text: '阿里云百炼', value: 49, color: 'orange'}, { key: 18, text: '讯飞星火认知', @@ -50,38 +57,44 @@ export const CHANNEL_OPTIONS = [ color: 'blue', tip: 'HTTP 版本的讯飞接口,前往此处获取 HTTP 服务接口认证密钥', }, - {key: 16, text: '智谱 ChatGLM', value: 16, color: 'violet'}, - {key: 19, text: '360 智脑', value: 19, color: 'blue'}, - {key: 25, text: 'Moonshot AI', value: 25, color: 'black'}, - {key: 23, text: '腾讯混元', value: 23, color: 'teal'}, - {key: 26, text: '百川大模型', value: 26, color: 'orange'}, - {key: 27, text: 'MiniMax', value: 27, color: 'red'}, - {key: 29, text: 'Groq', value: 29, color: 'orange'}, - {key: 30, text: 'Ollama', value: 30, color: 'black'}, - {key: 31, text: '零一万物', value: 31, color: 'green'}, - {key: 32, text: '阶跃星辰', value: 32, color: 'blue'}, - {key: 34, text: 'Coze', value: 34, color: 'blue'}, - {key: 35, text: 'Cohere', value: 35, color: 'blue'}, - {key: 36, text: 'DeepSeek', value: 36, color: 'black'}, - {key: 37, text: 'Cloudflare', value: 37, color: 'orange'}, - {key: 38, text: 'DeepL', value: 38, color: 'black'}, - {key: 39, text: 'together.ai', value: 39, color: 'blue'}, - {key: 42, text: 'VertexAI', value: 42, color: 'blue'}, - {key: 43, text: 'Proxy', value: 43, color: 'blue'}, - {key: 44, text: 'SiliconFlow', value: 44, color: 'blue'}, - {key: 45, text: 'xAI', value: 45, color: 'blue'}, - {key: 46, text: 'Replicate', value: 46, color: 'blue'}, - {key: 8, text: '自定义渠道', value: 8, color: 'pink'}, - {key: 22, text: '知识库:FastGPT', value: 22, color: 'blue'}, - {key: 21, text: '知识库:AI Proxy', value: 21, color: 'purple'}, - {key: 20, text: 'OpenRouter', value: 20, color: 'black'}, - {key: 2, text: '代理:API2D', value: 2, color: 'blue'}, - {key: 5, text: '代理:OpenAI-SB', value: 5, color: 'brown'}, - {key: 7, text: '代理:OhMyGPT', value: 7, color: 'purple'}, - {key: 10, text: '代理:AI Proxy', value: 10, color: 'purple'}, - {key: 4, text: '代理:CloseAI', value: 4, color: 'teal'}, - {key: 6, text: '代理:OpenAI Max', value: 6, color: 'violet'}, - {key: 9, text: '代理:AI.LS', value: 9, color: 'yellow'}, - {key: 12, text: '代理:API2GPT', value: 12, color: 'blue'}, - {key: 13, text: '代理:AIGC2D', value: 13, color: 'purple'}, + {key: 16, text: '智谱 ChatGLM', value: 16, color: 'violet'}, + {key: 19, text: '360 智脑', value: 19, color: 'blue'}, + {key: 25, text: 'Moonshot AI', value: 25, color: 'black'}, + {key: 23, text: '腾讯混元', value: 23, color: 'teal'}, + {key: 26, text: '百川大模型', value: 26, color: 'orange'}, + {key: 27, text: 'MiniMax', value: 27, color: 'red'}, + {key: 29, text: 'Groq', value: 29, color: 'orange'}, + {key: 30, text: 'Ollama', value: 30, color: 'black'}, + {key: 31, text: '零一万物', value: 31, color: 'green'}, + {key: 32, text: '阶跃星辰', value: 32, color: 'blue'}, + {key: 34, text: 'Coze', value: 34, color: 'blue'}, + {key: 35, text: 'Cohere', value: 35, color: 'blue'}, + {key: 36, text: 'DeepSeek', value: 36, color: 'black'}, + {key: 37, text: 'Cloudflare', value: 37, color: 'orange'}, + {key: 38, text: 'DeepL', value: 38, color: 'black'}, + {key: 39, text: 'together.ai', value: 39, color: 'blue'}, + {key: 42, text: 'VertexAI', value: 42, color: 'blue'}, + {key: 43, text: 'Proxy', value: 43, color: 'blue'}, + {key: 44, text: 'SiliconFlow', value: 44, color: 'blue'}, + {key: 45, text: 'xAI', value: 45, color: 'blue'}, + {key: 46, text: 'Replicate', value: 46, color: 'blue'}, + { + key: 8, + text: '自定义渠道', + value: 8, + color: 'pink', + tip: '注意,这里所需要填入的代理地址仅会在实际请求时替换域名部分,如果你想填入 OpenAI SDK 中所要求的 Base URL,请使用 OpenAI 兼容渠道类型', + }, + {key: 22, text: '知识库:FastGPT', value: 22, color: 'blue'}, + {key: 21, text: '知识库:AI Proxy', value: 21, color: 'purple'}, + {key: 20, text: 'OpenRouter', value: 20, color: 'black'}, + {key: 2, text: '代理:API2D', value: 2, color: 'blue'}, + {key: 5, text: '代理:OpenAI-SB', value: 5, color: 'brown'}, + {key: 7, text: '代理:OhMyGPT', value: 7, color: 'purple'}, + {key: 10, text: '代理:AI Proxy', value: 10, color: 'purple'}, + {key: 4, text: '代理:CloseAI', value: 4, color: 'teal'}, + {key: 6, text: '代理:OpenAI Max', value: 6, color: 'violet'}, + {key: 9, text: '代理:AI.LS', value: 9, color: 'yellow'}, + {key: 12, text: '代理:API2GPT', value: 12, color: 'blue'}, + {key: 13, text: '代理:AIGC2D', value: 13, color: 'purple'}, ]; diff --git a/web/default/src/locales/en/translation.json b/web/default/src/locales/en/translation.json index 76d51f80..47f3400f 100644 --- a/web/default/src/locales/en/translation.json +++ b/web/default/src/locales/en/translation.json @@ -104,8 +104,10 @@ "model_mapping_placeholder": "Optional, used to modify model names in request body. A JSON string where keys are request model names and values are target model names", "system_prompt": "System Prompt", "system_prompt_placeholder": "Optional, used to force set system prompt. Use with custom model & model mapping. First create a unique custom model name above, then map it to a natively supported model", - "base_url": "Proxy", - "base_url_placeholder": "Optional, used for API calls through proxy. Enter proxy address in format: https://domain.com", + "proxy_url": "Proxy", + "proxy_url_placeholder": "This is optional and used for API calls via a proxy. Please enter the proxy URL, formatted as: https://domain.com", + "base_url": "Base URL", + "base_url_placeholder": "The Base URL required by the OpenAPI SDK", "key": "Key", "key_placeholder": "Please enter key", "batch": "Batch Create", diff --git a/web/default/src/locales/zh/translation.json b/web/default/src/locales/zh/translation.json index 40e4ee5f..7cbf686d 100644 --- a/web/default/src/locales/zh/translation.json +++ b/web/default/src/locales/zh/translation.json @@ -104,8 +104,10 @@ "model_mapping_placeholder": "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称", "system_prompt": "系统提示词", "system_prompt_placeholder": "此项可选,用于强制设置给定的系统提示词,请配合自定义模型 & 模型重定向使用,首先创建一个唯一的自定义模型名称并在上面填入,之后将该自定义模型重定向映射到该渠道一个原生支持的模型", - "base_url": "代理", - "base_url_placeholder": "此项可选,用于通过代理站来进行 API 调用,请输入代理站地址,格式为:https://domain.com", + "proxy_url": "代理", + "proxy_url_placeholder": "此项可选,用于通过代理站来进行 API 调用,请输入代理站地址,格式为:https://domain.com。注意,这里所需要填入的代理地址仅会在实际请求时替换域名部分,如果你想填入 OpenAI SDK 中所要求的 Base URL,请使用 OpenAI 兼容渠道类型", + "base_url": "Base URL", + "base_url_placeholder": "OpenAPI SDK 中所要求的 Base URL", "key": "密钥", "key_placeholder": "请输入密钥", "batch": "批量创建", diff --git a/web/default/src/pages/Channel/EditChannel.js b/web/default/src/pages/Channel/EditChannel.js index 799e1d16..243db3d3 100644 --- a/web/default/src/pages/Channel/EditChannel.js +++ b/web/default/src/pages/Channel/EditChannel.js @@ -1,6 +1,6 @@ import React, {useEffect, useState} from 'react'; import {useTranslation} from 'react-i18next'; -import {Button, Card, Form, Input, Message,} from 'semantic-ui-react'; +import {Button, Card, Form, Input, Message} from 'semantic-ui-react'; import {useNavigate, useParams} from 'react-router-dom'; import {API, copy, getChannelModels, showError, showInfo, showSuccess, verifyJSON,} from '../../helpers'; import {CHANNEL_OPTIONS} from '../../constants'; @@ -339,6 +339,20 @@ const EditChannel = () => { {inputs.type === 8 && ( + + )} + {inputs.type === 50 && ( + + { {inputs.type !== 3 && inputs.type !== 33 && inputs.type !== 8 && + inputs.type !== 50 && inputs.type !== 22 && ( Date: Sun, 16 Feb 2025 17:42:20 +0800 Subject: [PATCH 2/5] chore: update prompt --- .../src/constants/channel.constants.js | 87 ++++++++++--------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/web/default/src/constants/channel.constants.js b/web/default/src/constants/channel.constants.js index d40273ed..feb914a8 100644 --- a/web/default/src/constants/channel.constants.js +++ b/web/default/src/constants/channel.constants.js @@ -1,5 +1,5 @@ export const CHANNEL_OPTIONS = [ - {key: 1, text: 'OpenAI', value: 1, color: 'green'}, + { key: 1, text: 'OpenAI', value: 1, color: 'green' }, { key: 50, text: 'OpenAI 兼容', @@ -7,13 +7,13 @@ export const CHANNEL_OPTIONS = [ color: 'olive', description: 'OpenAI 兼容渠道,支持设置 Base URL', }, - {key: 14, text: 'Anthropic Claude', value: 14, color: 'black'}, - {key: 33, text: 'AWS', value: 33, color: 'black'}, - {key: 3, text: 'Azure OpenAI', value: 3, color: 'olive'}, - {key: 11, text: 'Google PaLM2', value: 11, color: 'orange'}, - {key: 24, text: 'Google Gemini', value: 24, color: 'orange'}, - {key: 28, text: 'Mistral AI', value: 28, color: 'orange'}, - {key: 41, text: 'Novita', value: 41, color: 'purple'}, + { key: 14, text: 'Anthropic Claude', value: 14, color: 'black' }, + { key: 33, text: 'AWS', value: 33, color: 'black' }, + { key: 3, text: 'Azure OpenAI', value: 3, color: 'olive' }, + { key: 11, text: 'Google PaLM2', value: 11, color: 'orange' }, + { key: 24, text: 'Google Gemini', value: 24, color: 'orange' }, + { key: 28, text: 'Mistral AI', value: 28, color: 'orange' }, + { key: 41, text: 'Novita', value: 41, color: 'purple' }, { key: 40, text: '字节火山引擎', @@ -42,7 +42,7 @@ export const CHANNEL_OPTIONS = [ color: 'orange', tip: '如需使用阿里云百炼,请使用阿里云百炼渠道', }, - {key: 49, text: '阿里云百炼', value: 49, color: 'orange'}, + { key: 49, text: '阿里云百炼', value: 49, color: 'orange' }, { key: 18, text: '讯飞星火认知', @@ -57,44 +57,45 @@ export const CHANNEL_OPTIONS = [ color: 'blue', tip: 'HTTP 版本的讯飞接口,前往此处获取 HTTP 服务接口认证密钥', }, - {key: 16, text: '智谱 ChatGLM', value: 16, color: 'violet'}, - {key: 19, text: '360 智脑', value: 19, color: 'blue'}, - {key: 25, text: 'Moonshot AI', value: 25, color: 'black'}, - {key: 23, text: '腾讯混元', value: 23, color: 'teal'}, - {key: 26, text: '百川大模型', value: 26, color: 'orange'}, - {key: 27, text: 'MiniMax', value: 27, color: 'red'}, - {key: 29, text: 'Groq', value: 29, color: 'orange'}, - {key: 30, text: 'Ollama', value: 30, color: 'black'}, - {key: 31, text: '零一万物', value: 31, color: 'green'}, - {key: 32, text: '阶跃星辰', value: 32, color: 'blue'}, - {key: 34, text: 'Coze', value: 34, color: 'blue'}, - {key: 35, text: 'Cohere', value: 35, color: 'blue'}, - {key: 36, text: 'DeepSeek', value: 36, color: 'black'}, - {key: 37, text: 'Cloudflare', value: 37, color: 'orange'}, - {key: 38, text: 'DeepL', value: 38, color: 'black'}, - {key: 39, text: 'together.ai', value: 39, color: 'blue'}, - {key: 42, text: 'VertexAI', value: 42, color: 'blue'}, - {key: 43, text: 'Proxy', value: 43, color: 'blue'}, - {key: 44, text: 'SiliconFlow', value: 44, color: 'blue'}, - {key: 45, text: 'xAI', value: 45, color: 'blue'}, - {key: 46, text: 'Replicate', value: 46, color: 'blue'}, + { key: 16, text: '智谱 ChatGLM', value: 16, color: 'violet' }, + { key: 19, text: '360 智脑', value: 19, color: 'blue' }, + { key: 25, text: 'Moonshot AI', value: 25, color: 'black' }, + { key: 23, text: '腾讯混元', value: 23, color: 'teal' }, + { key: 26, text: '百川大模型', value: 26, color: 'orange' }, + { key: 27, text: 'MiniMax', value: 27, color: 'red' }, + { key: 29, text: 'Groq', value: 29, color: 'orange' }, + { key: 30, text: 'Ollama', value: 30, color: 'black' }, + { key: 31, text: '零一万物', value: 31, color: 'green' }, + { key: 32, text: '阶跃星辰', value: 32, color: 'blue' }, + { key: 34, text: 'Coze', value: 34, color: 'blue' }, + { key: 35, text: 'Cohere', value: 35, color: 'blue' }, + { key: 36, text: 'DeepSeek', value: 36, color: 'black' }, + { key: 37, text: 'Cloudflare', value: 37, color: 'orange' }, + { key: 38, text: 'DeepL', value: 38, color: 'black' }, + { key: 39, text: 'together.ai', value: 39, color: 'blue' }, + { key: 42, text: 'VertexAI', value: 42, color: 'blue' }, + { key: 43, text: 'Proxy', value: 43, color: 'blue' }, + { key: 44, text: 'SiliconFlow', value: 44, color: 'blue' }, + { key: 45, text: 'xAI', value: 45, color: 'blue' }, + { key: 46, text: 'Replicate', value: 46, color: 'blue' }, { key: 8, text: '自定义渠道', value: 8, color: 'pink', - tip: '注意,这里所需要填入的代理地址仅会在实际请求时替换域名部分,如果你想填入 OpenAI SDK 中所要求的 Base URL,请使用 OpenAI 兼容渠道类型', + tip: '不推荐使用,请使用 OpenAI 兼容渠道类型。注意,这里所需要填入的代理地址仅会在实际请求时替换域名部分,如果你想填入 OpenAI SDK 中所要求的 Base URL,请使用 OpenAI 兼容渠道类型', + description: '不推荐使用,请使用 OpenAI 兼容渠道类型', }, - {key: 22, text: '知识库:FastGPT', value: 22, color: 'blue'}, - {key: 21, text: '知识库:AI Proxy', value: 21, color: 'purple'}, - {key: 20, text: 'OpenRouter', value: 20, color: 'black'}, - {key: 2, text: '代理:API2D', value: 2, color: 'blue'}, - {key: 5, text: '代理:OpenAI-SB', value: 5, color: 'brown'}, - {key: 7, text: '代理:OhMyGPT', value: 7, color: 'purple'}, - {key: 10, text: '代理:AI Proxy', value: 10, color: 'purple'}, - {key: 4, text: '代理:CloseAI', value: 4, color: 'teal'}, - {key: 6, text: '代理:OpenAI Max', value: 6, color: 'violet'}, - {key: 9, text: '代理:AI.LS', value: 9, color: 'yellow'}, - {key: 12, text: '代理:API2GPT', value: 12, color: 'blue'}, - {key: 13, text: '代理:AIGC2D', value: 13, color: 'purple'}, + { key: 22, text: '知识库:FastGPT', value: 22, color: 'blue' }, + { key: 21, text: '知识库:AI Proxy', value: 21, color: 'purple' }, + { key: 20, text: 'OpenRouter', value: 20, color: 'black' }, + { key: 2, text: '代理:API2D', value: 2, color: 'blue' }, + { key: 5, text: '代理:OpenAI-SB', value: 5, color: 'brown' }, + { key: 7, text: '代理:OhMyGPT', value: 7, color: 'purple' }, + { key: 10, text: '代理:AI Proxy', value: 10, color: 'purple' }, + { key: 4, text: '代理:CloseAI', value: 4, color: 'teal' }, + { key: 6, text: '代理:OpenAI Max', value: 6, color: 'violet' }, + { key: 9, text: '代理:AI.LS', value: 9, color: 'yellow' }, + { key: 12, text: '代理:API2GPT', value: 12, color: 'blue' }, + { key: 13, text: '代理:AIGC2D', value: 13, color: 'purple' }, ]; From 3f421c4f04c9a63b26f5e0be4055989beb16b0b6 Mon Sep 17 00:00:00 2001 From: JustSong Date: Sun, 16 Feb 2025 17:59:39 +0800 Subject: [PATCH 3/5] feat: support Gemini openai compatible api --- relay/adaptor/gemini/constants.go | 16 +++++----------- relay/adaptor/geminiv2/constants.go | 15 +++++++++++++++ relay/adaptor/geminiv2/main.go | 14 ++++++++++++++ relay/adaptor/openai/adaptor.go | 3 +++ relay/adaptor/openai/compatible.go | 3 +++ relay/channeltype/define.go | 1 + relay/channeltype/url.go | 2 ++ web/default/src/constants/channel.constants.js | 15 +++++++++++---- 8 files changed, 54 insertions(+), 15 deletions(-) create mode 100644 relay/adaptor/geminiv2/constants.go create mode 100644 relay/adaptor/geminiv2/main.go diff --git a/relay/adaptor/gemini/constants.go b/relay/adaptor/gemini/constants.go index cbc2c82c..d220b25f 100644 --- a/relay/adaptor/gemini/constants.go +++ b/relay/adaptor/gemini/constants.go @@ -1,18 +1,12 @@ package gemini +import ( + "github.com/songquanpeng/one-api/relay/adaptor/geminiv2" +) + // https://ai.google.dev/models/gemini -var ModelList = []string{ - "gemini-pro", "gemini-1.0-pro", - // "gemma-2-2b-it", "gemma-2-9b-it", "gemma-2-27b-it", - "gemini-1.5-flash", "gemini-1.5-flash-8b", - "gemini-1.5-pro", "gemini-1.5-pro-experimental", - "text-embedding-004", "aqa", - "gemini-2.0-flash", "gemini-2.0-flash-exp", - "gemini-2.0-flash-lite-preview-02-05", - "gemini-2.0-flash-thinking-exp-01-21", - "gemini-2.0-pro-exp-02-05", -} +var ModelList = geminiv2.ModelList // ModelsSupportSystemInstruction is the list of models that support system instruction. // diff --git a/relay/adaptor/geminiv2/constants.go b/relay/adaptor/geminiv2/constants.go new file mode 100644 index 00000000..73e7ad7d --- /dev/null +++ b/relay/adaptor/geminiv2/constants.go @@ -0,0 +1,15 @@ +package geminiv2 + +// https://ai.google.dev/models/gemini + +var ModelList = []string{ + "gemini-pro", "gemini-1.0-pro", + // "gemma-2-2b-it", "gemma-2-9b-it", "gemma-2-27b-it", + "gemini-1.5-flash", "gemini-1.5-flash-8b", + "gemini-1.5-pro", "gemini-1.5-pro-experimental", + "text-embedding-004", "aqa", + "gemini-2.0-flash", "gemini-2.0-flash-exp", + "gemini-2.0-flash-lite-preview-02-05", + "gemini-2.0-flash-thinking-exp-01-21", + "gemini-2.0-pro-exp-02-05", +} diff --git a/relay/adaptor/geminiv2/main.go b/relay/adaptor/geminiv2/main.go new file mode 100644 index 00000000..fed7f3be --- /dev/null +++ b/relay/adaptor/geminiv2/main.go @@ -0,0 +1,14 @@ +package geminiv2 + +import ( + "fmt" + "strings" + + "github.com/songquanpeng/one-api/relay/meta" +) + +func GetRequestURL(meta *meta.Meta) (string, error) { + baseURL := strings.TrimSuffix(meta.BaseURL, "/") + requestPath := strings.TrimPrefix(meta.RequestURLPath, "/v1") + return fmt.Sprintf("%s%s", baseURL, requestPath), nil +} diff --git a/relay/adaptor/openai/adaptor.go b/relay/adaptor/openai/adaptor.go index 4eea25d4..8faf90a5 100644 --- a/relay/adaptor/openai/adaptor.go +++ b/relay/adaptor/openai/adaptor.go @@ -13,6 +13,7 @@ import ( "github.com/songquanpeng/one-api/relay/adaptor/alibailian" "github.com/songquanpeng/one-api/relay/adaptor/baiduv2" "github.com/songquanpeng/one-api/relay/adaptor/doubao" + "github.com/songquanpeng/one-api/relay/adaptor/geminiv2" "github.com/songquanpeng/one-api/relay/adaptor/minimax" "github.com/songquanpeng/one-api/relay/adaptor/novita" "github.com/songquanpeng/one-api/relay/channeltype" @@ -59,6 +60,8 @@ func (a *Adaptor) GetRequestURL(meta *meta.Meta) (string, error) { return baiduv2.GetRequestURL(meta) case channeltype.AliBailian: return alibailian.GetRequestURL(meta) + case channeltype.GeminiOpenAICompatible: + return geminiv2.GetRequestURL(meta) default: return GetFullRequestURL(meta.BaseURL, meta.RequestURLPath, meta.ChannelType), nil } diff --git a/relay/adaptor/openai/compatible.go b/relay/adaptor/openai/compatible.go index 36c22a74..955cb090 100644 --- a/relay/adaptor/openai/compatible.go +++ b/relay/adaptor/openai/compatible.go @@ -7,6 +7,7 @@ import ( "github.com/songquanpeng/one-api/relay/adaptor/baiduv2" "github.com/songquanpeng/one-api/relay/adaptor/deepseek" "github.com/songquanpeng/one-api/relay/adaptor/doubao" + "github.com/songquanpeng/one-api/relay/adaptor/geminiv2" "github.com/songquanpeng/one-api/relay/adaptor/groq" "github.com/songquanpeng/one-api/relay/adaptor/lingyiwanwu" "github.com/songquanpeng/one-api/relay/adaptor/minimax" @@ -82,6 +83,8 @@ func GetCompatibleChannelMeta(channelType int) (string, []string) { return "openrouter", openrouter.ModelList case channeltype.AliBailian: return "alibailian", alibailian.ModelList + case channeltype.GeminiOpenAICompatible: + return "geminiv2", geminiv2.ModelList default: return "openai", ModelList } diff --git a/relay/channeltype/define.go b/relay/channeltype/define.go index 87a3cbb8..f557d6c6 100644 --- a/relay/channeltype/define.go +++ b/relay/channeltype/define.go @@ -52,5 +52,6 @@ const ( XunfeiV2 AliBailian OpenAICompatible + GeminiOpenAICompatible Dummy ) diff --git a/relay/channeltype/url.go b/relay/channeltype/url.go index f2e41602..5a47a64e 100644 --- a/relay/channeltype/url.go +++ b/relay/channeltype/url.go @@ -52,6 +52,8 @@ var ChannelBaseURLs = []string{ "https://spark-api-open.xf-yun.com", // 48 "https://dashscope.aliyuncs.com", // 49 "", // 50 + + "https://generativelanguage.googleapis.com/v1beta/openai/", // 51 } func init() { diff --git a/web/default/src/constants/channel.constants.js b/web/default/src/constants/channel.constants.js index feb914a8..e1dd3b53 100644 --- a/web/default/src/constants/channel.constants.js +++ b/web/default/src/constants/channel.constants.js @@ -7,11 +7,18 @@ export const CHANNEL_OPTIONS = [ color: 'olive', description: 'OpenAI 兼容渠道,支持设置 Base URL', }, - { key: 14, text: 'Anthropic Claude', value: 14, color: 'black' }, + {key: 14, text: 'Anthropic', value: 14, color: 'black'}, { key: 33, text: 'AWS', value: 33, color: 'black' }, - { key: 3, text: 'Azure OpenAI', value: 3, color: 'olive' }, - { key: 11, text: 'Google PaLM2', value: 11, color: 'orange' }, - { key: 24, text: 'Google Gemini', value: 24, color: 'orange' }, + {key: 3, text: 'Azure', value: 3, color: 'olive'}, + {key: 11, text: 'PaLM2', value: 11, color: 'orange'}, + {key: 24, text: 'Gemini', value: 24, color: 'orange'}, + { + key: 51, + text: 'Gemini (OpenAI)', + value: 51, + color: 'orange', + description: 'Gemini OpenAI 兼容格式', + }, { key: 28, text: 'Mistral AI', value: 28, color: 'orange' }, { key: 41, text: 'Novita', value: 41, color: 'purple' }, { From a5c517c27a831ba5553802125fa6350486502216 Mon Sep 17 00:00:00 2001 From: longkeyy Date: Sun, 16 Feb 2025 18:01:24 +0800 Subject: [PATCH 4/5] feat: update ali models and price 20250213 (#2086) --- relay/adaptor/ali/constants.go | 4 + relay/billing/ratio/model.go | 184 ++++++++++++++++++--------------- 2 files changed, 103 insertions(+), 85 deletions(-) diff --git a/relay/adaptor/ali/constants.go b/relay/adaptor/ali/constants.go index f3d99520..7c253250 100644 --- a/relay/adaptor/ali/constants.go +++ b/relay/adaptor/ali/constants.go @@ -14,10 +14,14 @@ var ModelList = []string{ "qwen2-72b-instruct", "qwen2-57b-a14b-instruct", "qwen2-7b-instruct", "qwen2-1.5b-instruct", "qwen2-0.5b-instruct", "qwen1.5-110b-chat", "qwen1.5-72b-chat", "qwen1.5-32b-chat", "qwen1.5-14b-chat", "qwen1.5-7b-chat", "qwen1.5-1.8b-chat", "qwen1.5-0.5b-chat", "qwen-72b-chat", "qwen-14b-chat", "qwen-7b-chat", "qwen-1.8b-chat", "qwen-1.8b-longcontext-chat", + "qvq-72b-preview", + "qwen2.5-vl-72b-instruct", "qwen2.5-vl-7b-instruct", "qwen2.5-vl-2b-instruct", "qwen2.5-vl-1b-instruct", "qwen2.5-vl-0.5b-instruct", "qwen2-vl-7b-instruct", "qwen2-vl-2b-instruct", "qwen-vl-v1", "qwen-vl-chat-v1", "qwen2-audio-instruct", "qwen-audio-chat", "qwen2.5-math-72b-instruct", "qwen2.5-math-7b-instruct", "qwen2.5-math-1.5b-instruct", "qwen2-math-72b-instruct", "qwen2-math-7b-instruct", "qwen2-math-1.5b-instruct", "qwen2.5-coder-32b-instruct", "qwen2.5-coder-14b-instruct", "qwen2.5-coder-7b-instruct", "qwen2.5-coder-3b-instruct", "qwen2.5-coder-1.5b-instruct", "qwen2.5-coder-0.5b-instruct", "text-embedding-v1", "text-embedding-v3", "text-embedding-v2", "text-embedding-async-v2", "text-embedding-async-v1", "ali-stable-diffusion-xl", "ali-stable-diffusion-v1.5", "wanx-v1", + "qwen-mt-plus", "qwen-mt-turbo", + "deepseek-r1", "deepseek-v3", "deepseek-r1-distill-qwen-1.5b", "deepseek-r1-distill-qwen-7b", "deepseek-r1-distill-qwen-14b", "deepseek-r1-distill-qwen-32b", "deepseek-r1-distill-llama-8b", "deepseek-r1-distill-llama-70b", } diff --git a/relay/billing/ratio/model.go b/relay/billing/ratio/model.go index 25e4629d..4a4bbdb0 100644 --- a/relay/billing/ratio/model.go +++ b/relay/billing/ratio/model.go @@ -159,91 +159,105 @@ var ModelRatio = map[string]float64{ "embedding-2": 0.0005 * RMB, "embedding-3": 0.0005 * RMB, // https://help.aliyun.com/zh/dashscope/developer-reference/tongyi-thousand-questions-metering-and-billing - "qwen-turbo": 1.4286, // ¥0.02 / 1k tokens - "qwen-turbo-latest": 1.4286, - "qwen-plus": 1.4286, - "qwen-plus-latest": 1.4286, - "qwen-max": 1.4286, - "qwen-max-latest": 1.4286, - "qwen-max-longcontext": 1.4286, - "qwen-vl-max": 1.4286, - "qwen-vl-max-latest": 1.4286, - "qwen-vl-plus": 1.4286, - "qwen-vl-plus-latest": 1.4286, - "qwen-vl-ocr": 1.4286, - "qwen-vl-ocr-latest": 1.4286, - "qwen-audio-turbo": 1.4286, - "qwen-math-plus": 1.4286, - "qwen-math-plus-latest": 1.4286, - "qwen-math-turbo": 1.4286, - "qwen-math-turbo-latest": 1.4286, - "qwen-coder-plus": 1.4286, - "qwen-coder-plus-latest": 1.4286, - "qwen-coder-turbo": 1.4286, - "qwen-coder-turbo-latest": 1.4286, - "qwq-32b-preview": 1.4286, - "qwen2.5-72b-instruct": 1.4286, - "qwen2.5-32b-instruct": 1.4286, - "qwen2.5-14b-instruct": 1.4286, - "qwen2.5-7b-instruct": 1.4286, - "qwen2.5-3b-instruct": 1.4286, - "qwen2.5-1.5b-instruct": 1.4286, - "qwen2.5-0.5b-instruct": 1.4286, - "qwen2-72b-instruct": 1.4286, - "qwen2-57b-a14b-instruct": 1.4286, - "qwen2-7b-instruct": 1.4286, - "qwen2-1.5b-instruct": 1.4286, - "qwen2-0.5b-instruct": 1.4286, - "qwen1.5-110b-chat": 1.4286, - "qwen1.5-72b-chat": 1.4286, - "qwen1.5-32b-chat": 1.4286, - "qwen1.5-14b-chat": 1.4286, - "qwen1.5-7b-chat": 1.4286, - "qwen1.5-1.8b-chat": 1.4286, - "qwen1.5-0.5b-chat": 1.4286, - "qwen-72b-chat": 1.4286, - "qwen-14b-chat": 1.4286, - "qwen-7b-chat": 1.4286, - "qwen-1.8b-chat": 1.4286, - "qwen-1.8b-longcontext-chat": 1.4286, - "qwen2-vl-7b-instruct": 1.4286, - "qwen2-vl-2b-instruct": 1.4286, - "qwen-vl-v1": 1.4286, - "qwen-vl-chat-v1": 1.4286, - "qwen2-audio-instruct": 1.4286, - "qwen-audio-chat": 1.4286, - "qwen2.5-math-72b-instruct": 1.4286, - "qwen2.5-math-7b-instruct": 1.4286, - "qwen2.5-math-1.5b-instruct": 1.4286, - "qwen2-math-72b-instruct": 1.4286, - "qwen2-math-7b-instruct": 1.4286, - "qwen2-math-1.5b-instruct": 1.4286, - "qwen2.5-coder-32b-instruct": 1.4286, - "qwen2.5-coder-14b-instruct": 1.4286, - "qwen2.5-coder-7b-instruct": 1.4286, - "qwen2.5-coder-3b-instruct": 1.4286, - "qwen2.5-coder-1.5b-instruct": 1.4286, - "qwen2.5-coder-0.5b-instruct": 1.4286, - "text-embedding-v1": 0.05, // ¥0.0007 / 1k tokens - "text-embedding-v3": 0.05, - "text-embedding-v2": 0.05, - "text-embedding-async-v2": 0.05, - "text-embedding-async-v1": 0.05, - "ali-stable-diffusion-xl": 8.00, - "ali-stable-diffusion-v1.5": 8.00, - "wanx-v1": 8.00, - "SparkDesk": 1.2858, // ¥0.018 / 1k tokens - "SparkDesk-v1.1": 1.2858, // ¥0.018 / 1k tokens - "SparkDesk-v2.1": 1.2858, // ¥0.018 / 1k tokens - "SparkDesk-v3.1": 1.2858, // ¥0.018 / 1k tokens - "SparkDesk-v3.1-128K": 1.2858, // ¥0.018 / 1k tokens - "SparkDesk-v3.5": 1.2858, // ¥0.018 / 1k tokens - "SparkDesk-v3.5-32K": 1.2858, // ¥0.018 / 1k tokens - "SparkDesk-v4.0": 1.2858, // ¥0.018 / 1k tokens - "360GPT_S2_V9": 0.8572, // ¥0.012 / 1k tokens - "embedding-bert-512-v1": 0.0715, // ¥0.001 / 1k tokens - "embedding_s1_v1": 0.0715, // ¥0.001 / 1k tokens - "semantic_similarity_s1_v1": 0.0715, // ¥0.001 / 1k tokens + "qwen-turbo": 0.0003 * RMB, + "qwen-turbo-latest": 0.0003 * RMB, + "qwen-plus": 0.0008 * RMB, + "qwen-plus-latest": 0.0008 * RMB, + "qwen-max": 0.0024 * RMB, + "qwen-max-latest": 0.0024 * RMB, + "qwen-max-longcontext": 0.0005 * RMB, + "qwen-vl-max": 0.003 * RMB, + "qwen-vl-max-latest": 0.003 * RMB, + "qwen-vl-plus": 0.0015 * RMB, + "qwen-vl-plus-latest": 0.0015 * RMB, + "qwen-vl-ocr": 0.005 * RMB, + "qwen-vl-ocr-latest": 0.005 * RMB, + "qwen-audio-turbo": 1.4286, + "qwen-math-plus": 0.004 * RMB, + "qwen-math-plus-latest": 0.004 * RMB, + "qwen-math-turbo": 0.002 * RMB, + "qwen-math-turbo-latest": 0.002 * RMB, + "qwen-coder-plus": 0.0035 * RMB, + "qwen-coder-plus-latest": 0.0035 * RMB, + "qwen-coder-turbo": 0.002 * RMB, + "qwen-coder-turbo-latest": 0.002 * RMB, + "qwen-mt-plus": 0.015 * RMB, + "qwen-mt-turbo": 0.001 * RMB, + "qwq-32b-preview": 0.002 * RMB, + "qwen2.5-72b-instruct": 0.004 * RMB, + "qwen2.5-32b-instruct": 0.03 * RMB, + "qwen2.5-14b-instruct": 0.001 * RMB, + "qwen2.5-7b-instruct": 0.0005 * RMB, + "qwen2.5-3b-instruct": 0.006 * RMB, + "qwen2.5-1.5b-instruct": 0.0003 * RMB, + "qwen2.5-0.5b-instruct": 0.0003 * RMB, + "qwen2-72b-instruct": 0.004 * RMB, + "qwen2-57b-a14b-instruct": 0.0035 * RMB, + "qwen2-7b-instruct": 0.001 * RMB, + "qwen2-1.5b-instruct": 0.001 * RMB, + "qwen2-0.5b-instruct": 0.001 * RMB, + "qwen1.5-110b-chat": 0.007 * RMB, + "qwen1.5-72b-chat": 0.005 * RMB, + "qwen1.5-32b-chat": 0.0035 * RMB, + "qwen1.5-14b-chat": 0.002 * RMB, + "qwen1.5-7b-chat": 0.001 * RMB, + "qwen1.5-1.8b-chat": 0.001 * RMB, + "qwen1.5-0.5b-chat": 0.001 * RMB, + "qwen-72b-chat": 0.02 * RMB, + "qwen-14b-chat": 0.008 * RMB, + "qwen-7b-chat": 0.006 * RMB, + "qwen-1.8b-chat": 0.006 * RMB, + "qwen-1.8b-longcontext-chat": 0.006 * RMB, + "qvq-72b-preview": 0.012 * RMB, + "qwen2.5-vl-72b-instruct": 0.016 * RMB, + "qwen2.5-vl-7b-instruct": 0.002 * RMB, + "qwen2.5-vl-3b-instruct": 0.0012 * RMB, + "qwen2-vl-7b-instruct": 0.016 * RMB, + "qwen2-vl-2b-instruct": 0.002 * RMB, + "qwen-vl-v1": 0.002 * RMB, + "qwen-vl-chat-v1": 0.002 * RMB, + "qwen2-audio-instruct": 0.002 * RMB, + "qwen-audio-chat": 0.002 * RMB, + "qwen2.5-math-72b-instruct": 0.004 * RMB, + "qwen2.5-math-7b-instruct": 0.001 * RMB, + "qwen2.5-math-1.5b-instruct": 0.001 * RMB, + "qwen2-math-72b-instruct": 0.004 * RMB, + "qwen2-math-7b-instruct": 0.001 * RMB, + "qwen2-math-1.5b-instruct": 0.001 * RMB, + "qwen2.5-coder-32b-instruct": 0.002 * RMB, + "qwen2.5-coder-14b-instruct": 0.002 * RMB, + "qwen2.5-coder-7b-instruct": 0.001 * RMB, + "qwen2.5-coder-3b-instruct": 0.001 * RMB, + "qwen2.5-coder-1.5b-instruct": 0.001 * RMB, + "qwen2.5-coder-0.5b-instruct": 0.001 * RMB, + "text-embedding-v1": 0.0007 * RMB, // ¥0.0007 / 1k tokens + "text-embedding-v3": 0.0007 * RMB, + "text-embedding-v2": 0.0007 * RMB, + "text-embedding-async-v2": 0.0007 * RMB, + "text-embedding-async-v1": 0.0007 * RMB, + "ali-stable-diffusion-xl": 8.00, + "ali-stable-diffusion-v1.5": 8.00, + "wanx-v1": 8.00, + "deepseek-r1": 0.002 * RMB, + "deepseek-v3": 0.001 * RMB, + "deepseek-r1-distill-qwen-1.5b": 0.001 * RMB, + "deepseek-r1-distill-qwen-7b": 0.0005 * RMB, + "deepseek-r1-distill-qwen-14b": 0.001 * RMB, + "deepseek-r1-distill-qwen-32b": 0.002 * RMB, + "deepseek-r1-distill-llama-8b": 0.0005 * RMB, + "deepseek-r1-distill-llama-70b": 0.004 * RMB, + "SparkDesk": 1.2858, // ¥0.018 / 1k tokens + "SparkDesk-v1.1": 1.2858, // ¥0.018 / 1k tokens + "SparkDesk-v2.1": 1.2858, // ¥0.018 / 1k tokens + "SparkDesk-v3.1": 1.2858, // ¥0.018 / 1k tokens + "SparkDesk-v3.1-128K": 1.2858, // ¥0.018 / 1k tokens + "SparkDesk-v3.5": 1.2858, // ¥0.018 / 1k tokens + "SparkDesk-v3.5-32K": 1.2858, // ¥0.018 / 1k tokens + "SparkDesk-v4.0": 1.2858, // ¥0.018 / 1k tokens + "360GPT_S2_V9": 0.8572, // ¥0.012 / 1k tokens + "embedding-bert-512-v1": 0.0715, // ¥0.001 / 1k tokens + "embedding_s1_v1": 0.0715, // ¥0.001 / 1k tokens + "semantic_similarity_s1_v1": 0.0715, // ¥0.001 / 1k tokens // https://cloud.tencent.com/document/product/1729/97731#e0e6be58-60c8-469f-bdeb-6c264ce3b4d0 "hunyuan-turbo": 0.015 * RMB, "hunyuan-large": 0.004 * RMB, From 7ac553541b6b5fd4fda63663bb3dd304f57a1d6c Mon Sep 17 00:00:00 2001 From: longkeyy Date: Sun, 16 Feb 2025 18:01:59 +0800 Subject: [PATCH 5/5] feat: update openrouter models and price 20250213 (#2084) --- relay/adaptor/openrouter/constants.go | 241 ++++++++++++++++++++++++-- relay/billing/ratio/model.go | 234 +++++++++++++++++++++++++ 2 files changed, 462 insertions(+), 13 deletions(-) diff --git a/relay/adaptor/openrouter/constants.go b/relay/adaptor/openrouter/constants.go index 3ad8ed55..b12fa65c 100644 --- a/relay/adaptor/openrouter/constants.go +++ b/relay/adaptor/openrouter/constants.go @@ -1,20 +1,235 @@ package openrouter var ModelList = []string{ - "openai/gpt-3.5-turbo", - "openai/chatgpt-4o-latest", - "openai/o1", - "openai/o1-preview", - "openai/o1-mini", - "openai/o3-mini", - "google/gemini-2.0-flash-001", - "google/gemini-2.0-flash-thinking-exp:free", - "google/gemini-2.0-flash-lite-preview-02-05:free", - "google/gemini-2.0-pro-exp-02-05:free", - "google/gemini-flash-1.5-8b", - "anthropic/claude-3.5-sonnet", + "01-ai/yi-large", + "aetherwiing/mn-starcannon-12b", + "ai21/jamba-1-5-large", + "ai21/jamba-1-5-mini", + "ai21/jamba-instruct", + "aion-labs/aion-1.0", + "aion-labs/aion-1.0-mini", + "aion-labs/aion-rp-llama-3.1-8b", + "allenai/llama-3.1-tulu-3-405b", + "alpindale/goliath-120b", + "alpindale/magnum-72b", + "amazon/nova-lite-v1", + "amazon/nova-micro-v1", + "amazon/nova-pro-v1", + "anthracite-org/magnum-v2-72b", + "anthracite-org/magnum-v4-72b", + "anthropic/claude-2", + "anthropic/claude-2.0", + "anthropic/claude-2.0:beta", + "anthropic/claude-2.1", + "anthropic/claude-2.1:beta", + "anthropic/claude-2:beta", + "anthropic/claude-3-haiku", + "anthropic/claude-3-haiku:beta", + "anthropic/claude-3-opus", + "anthropic/claude-3-opus:beta", + "anthropic/claude-3-sonnet", + "anthropic/claude-3-sonnet:beta", "anthropic/claude-3.5-haiku", - "deepseek/deepseek-r1:free", + "anthropic/claude-3.5-haiku-20241022", + "anthropic/claude-3.5-haiku-20241022:beta", + "anthropic/claude-3.5-haiku:beta", + "anthropic/claude-3.5-sonnet", + "anthropic/claude-3.5-sonnet-20240620", + "anthropic/claude-3.5-sonnet-20240620:beta", + "anthropic/claude-3.5-sonnet:beta", + "cognitivecomputations/dolphin-mixtral-8x22b", + "cognitivecomputations/dolphin-mixtral-8x7b", + "cohere/command", + "cohere/command-r", + "cohere/command-r-03-2024", + "cohere/command-r-08-2024", + "cohere/command-r-plus", + "cohere/command-r-plus-04-2024", + "cohere/command-r-plus-08-2024", + "cohere/command-r7b-12-2024", + "databricks/dbrx-instruct", + "deepseek/deepseek-chat", + "deepseek/deepseek-chat-v2.5", + "deepseek/deepseek-chat:free", "deepseek/deepseek-r1", + "deepseek/deepseek-r1-distill-llama-70b", + "deepseek/deepseek-r1-distill-llama-70b:free", + "deepseek/deepseek-r1-distill-llama-8b", + "deepseek/deepseek-r1-distill-qwen-1.5b", + "deepseek/deepseek-r1-distill-qwen-14b", + "deepseek/deepseek-r1-distill-qwen-32b", + "deepseek/deepseek-r1:free", + "eva-unit-01/eva-llama-3.33-70b", + "eva-unit-01/eva-qwen-2.5-32b", + "eva-unit-01/eva-qwen-2.5-72b", + "google/gemini-2.0-flash-001", + "google/gemini-2.0-flash-exp:free", + "google/gemini-2.0-flash-lite-preview-02-05:free", + "google/gemini-2.0-flash-thinking-exp-1219:free", + "google/gemini-2.0-flash-thinking-exp:free", + "google/gemini-2.0-pro-exp-02-05:free", + "google/gemini-exp-1206:free", + "google/gemini-flash-1.5", + "google/gemini-flash-1.5-8b", + "google/gemini-flash-1.5-8b-exp", + "google/gemini-pro", + "google/gemini-pro-1.5", + "google/gemini-pro-vision", + "google/gemma-2-27b-it", + "google/gemma-2-9b-it", + "google/gemma-2-9b-it:free", + "google/gemma-7b-it", + "google/learnlm-1.5-pro-experimental:free", + "google/palm-2-chat-bison", + "google/palm-2-chat-bison-32k", + "google/palm-2-codechat-bison", + "google/palm-2-codechat-bison-32k", + "gryphe/mythomax-l2-13b", + "gryphe/mythomax-l2-13b:free", + "huggingfaceh4/zephyr-7b-beta:free", + "infermatic/mn-inferor-12b", + "inflection/inflection-3-pi", + "inflection/inflection-3-productivity", + "jondurbin/airoboros-l2-70b", + "liquid/lfm-3b", + "liquid/lfm-40b", + "liquid/lfm-7b", + "mancer/weaver", + "meta-llama/llama-2-13b-chat", + "meta-llama/llama-2-70b-chat", + "meta-llama/llama-3-70b-instruct", + "meta-llama/llama-3-8b-instruct", + "meta-llama/llama-3-8b-instruct:free", + "meta-llama/llama-3.1-405b", + "meta-llama/llama-3.1-405b-instruct", + "meta-llama/llama-3.1-70b-instruct", + "meta-llama/llama-3.1-8b-instruct", + "meta-llama/llama-3.2-11b-vision-instruct", + "meta-llama/llama-3.2-11b-vision-instruct:free", + "meta-llama/llama-3.2-1b-instruct", + "meta-llama/llama-3.2-3b-instruct", + "meta-llama/llama-3.2-90b-vision-instruct", + "meta-llama/llama-3.3-70b-instruct", + "meta-llama/llama-3.3-70b-instruct:free", + "meta-llama/llama-guard-2-8b", + "microsoft/phi-3-medium-128k-instruct", + "microsoft/phi-3-medium-128k-instruct:free", + "microsoft/phi-3-mini-128k-instruct", + "microsoft/phi-3-mini-128k-instruct:free", + "microsoft/phi-3.5-mini-128k-instruct", + "microsoft/phi-4", + "microsoft/wizardlm-2-7b", + "microsoft/wizardlm-2-8x22b", + "minimax/minimax-01", + "mistralai/codestral-2501", + "mistralai/codestral-mamba", + "mistralai/ministral-3b", + "mistralai/ministral-8b", + "mistralai/mistral-7b-instruct", + "mistralai/mistral-7b-instruct-v0.1", + "mistralai/mistral-7b-instruct-v0.3", + "mistralai/mistral-7b-instruct:free", + "mistralai/mistral-large", + "mistralai/mistral-large-2407", + "mistralai/mistral-large-2411", + "mistralai/mistral-medium", + "mistralai/mistral-nemo", + "mistralai/mistral-nemo:free", + "mistralai/mistral-small", + "mistralai/mistral-small-24b-instruct-2501", + "mistralai/mistral-small-24b-instruct-2501:free", + "mistralai/mistral-tiny", + "mistralai/mixtral-8x22b-instruct", + "mistralai/mixtral-8x7b", + "mistralai/mixtral-8x7b-instruct", + "mistralai/pixtral-12b", + "mistralai/pixtral-large-2411", + "neversleep/llama-3-lumimaid-70b", + "neversleep/llama-3-lumimaid-8b", + "neversleep/llama-3-lumimaid-8b:extended", + "neversleep/llama-3.1-lumimaid-70b", + "neversleep/llama-3.1-lumimaid-8b", + "neversleep/noromaid-20b", + "nothingiisreal/mn-celeste-12b", + "nousresearch/hermes-2-pro-llama-3-8b", + "nousresearch/hermes-3-llama-3.1-405b", + "nousresearch/hermes-3-llama-3.1-70b", + "nousresearch/nous-hermes-2-mixtral-8x7b-dpo", + "nousresearch/nous-hermes-llama2-13b", + "nvidia/llama-3.1-nemotron-70b-instruct", + "nvidia/llama-3.1-nemotron-70b-instruct:free", + "openai/chatgpt-4o-latest", + "openai/gpt-3.5-turbo", + "openai/gpt-3.5-turbo-0125", + "openai/gpt-3.5-turbo-0613", + "openai/gpt-3.5-turbo-1106", + "openai/gpt-3.5-turbo-16k", + "openai/gpt-3.5-turbo-instruct", + "openai/gpt-4", + "openai/gpt-4-0314", + "openai/gpt-4-1106-preview", + "openai/gpt-4-32k", + "openai/gpt-4-32k-0314", + "openai/gpt-4-turbo", + "openai/gpt-4-turbo-preview", + "openai/gpt-4o", + "openai/gpt-4o-2024-05-13", + "openai/gpt-4o-2024-08-06", + "openai/gpt-4o-2024-11-20", + "openai/gpt-4o-mini", + "openai/gpt-4o-mini-2024-07-18", + "openai/gpt-4o:extended", + "openai/o1", + "openai/o1-mini", + "openai/o1-mini-2024-09-12", + "openai/o1-preview", + "openai/o1-preview-2024-09-12", + "openai/o3-mini", + "openai/o3-mini-high", + "openchat/openchat-7b", + "openchat/openchat-7b:free", + "openrouter/auto", + "perplexity/llama-3.1-sonar-huge-128k-online", + "perplexity/llama-3.1-sonar-large-128k-chat", + "perplexity/llama-3.1-sonar-large-128k-online", + "perplexity/llama-3.1-sonar-small-128k-chat", + "perplexity/llama-3.1-sonar-small-128k-online", + "perplexity/sonar", + "perplexity/sonar-reasoning", + "pygmalionai/mythalion-13b", + "qwen/qvq-72b-preview", + "qwen/qwen-2-72b-instruct", + "qwen/qwen-2-7b-instruct", + "qwen/qwen-2-7b-instruct:free", + "qwen/qwen-2-vl-72b-instruct", + "qwen/qwen-2-vl-7b-instruct", + "qwen/qwen-2.5-72b-instruct", + "qwen/qwen-2.5-7b-instruct", + "qwen/qwen-2.5-coder-32b-instruct", + "qwen/qwen-max", + "qwen/qwen-plus", + "qwen/qwen-turbo", "qwen/qwen-vl-plus:free", + "qwen/qwen2.5-vl-72b-instruct:free", + "qwen/qwq-32b-preview", + "raifle/sorcererlm-8x22b", + "sao10k/fimbulvetr-11b-v2", + "sao10k/l3-euryale-70b", + "sao10k/l3-lunaris-8b", + "sao10k/l3.1-70b-hanami-x1", + "sao10k/l3.1-euryale-70b", + "sao10k/l3.3-euryale-70b", + "sophosympatheia/midnight-rose-70b", + "sophosympatheia/rogue-rose-103b-v0.2:free", + "teknium/openhermes-2.5-mistral-7b", + "thedrummer/rocinante-12b", + "thedrummer/unslopnemo-12b", + "undi95/remm-slerp-l2-13b", + "undi95/toppy-m-7b", + "undi95/toppy-m-7b:free", + "x-ai/grok-2-1212", + "x-ai/grok-2-vision-1212", + "x-ai/grok-beta", + "x-ai/grok-vision-beta", + "xwin-lm/xwin-lm-70b", } diff --git a/relay/billing/ratio/model.go b/relay/billing/ratio/model.go index 4a4bbdb0..e8b3b615 100644 --- a/relay/billing/ratio/model.go +++ b/relay/billing/ratio/model.go @@ -59,6 +59,8 @@ var ModelRatio = map[string]float64{ "o1-preview-2024-09-12": 7.5, "o1-mini": 1.5, // $3.00 / 1M input tokens "o1-mini-2024-09-12": 1.5, + "o3-mini": 1.5, // $3.00 / 1M input tokens + "o3-mini-2025-01-31": 1.5, "davinci-002": 1, // $0.002 / 1K tokens "babbage-002": 0.2, // $0.0004 / 1K tokens "text-ada-001": 0.2, @@ -385,6 +387,238 @@ var ModelRatio = map[string]float64{ "mistralai/mistral-7b-instruct-v0.2": 0.050 * USD, "mistralai/mistral-7b-v0.1": 0.050 * USD, "mistralai/mixtral-8x7b-instruct-v0.1": 0.300 * USD, + //https://openrouter.ai/models + "01-ai/yi-large": 1.5, + "aetherwiing/mn-starcannon-12b": 0.6, + "ai21/jamba-1-5-large": 4.0, + "ai21/jamba-1-5-mini": 0.2, + "ai21/jamba-instruct": 0.35, + "aion-labs/aion-1.0": 6.0, + "aion-labs/aion-1.0-mini": 1.2, + "aion-labs/aion-rp-llama-3.1-8b": 0.1, + "allenai/llama-3.1-tulu-3-405b": 5.0, + "alpindale/goliath-120b": 4.6875, + "alpindale/magnum-72b": 1.125, + "amazon/nova-lite-v1": 0.12, + "amazon/nova-micro-v1": 0.07, + "amazon/nova-pro-v1": 1.6, + "anthracite-org/magnum-v2-72b": 1.5, + "anthracite-org/magnum-v4-72b": 1.125, + "anthropic/claude-2": 12.0, + "anthropic/claude-2.0": 12.0, + "anthropic/claude-2.0:beta": 12.0, + "anthropic/claude-2.1": 12.0, + "anthropic/claude-2.1:beta": 12.0, + "anthropic/claude-2:beta": 12.0, + "anthropic/claude-3-haiku": 0.625, + "anthropic/claude-3-haiku:beta": 0.625, + "anthropic/claude-3-opus": 37.5, + "anthropic/claude-3-opus:beta": 37.5, + "anthropic/claude-3-sonnet": 7.5, + "anthropic/claude-3-sonnet:beta": 7.5, + "anthropic/claude-3.5-haiku": 2.0, + "anthropic/claude-3.5-haiku-20241022": 2.0, + "anthropic/claude-3.5-haiku-20241022:beta": 2.0, + "anthropic/claude-3.5-haiku:beta": 2.0, + "anthropic/claude-3.5-sonnet": 7.5, + "anthropic/claude-3.5-sonnet-20240620": 7.5, + "anthropic/claude-3.5-sonnet-20240620:beta": 7.5, + "anthropic/claude-3.5-sonnet:beta": 7.5, + "cognitivecomputations/dolphin-mixtral-8x22b": 0.45, + "cognitivecomputations/dolphin-mixtral-8x7b": 0.25, + "cohere/command": 0.95, + "cohere/command-r": 0.7125, + "cohere/command-r-03-2024": 0.7125, + "cohere/command-r-08-2024": 0.285, + "cohere/command-r-plus": 7.125, + "cohere/command-r-plus-04-2024": 7.125, + "cohere/command-r-plus-08-2024": 4.75, + "cohere/command-r7b-12-2024": 0.075, + "databricks/dbrx-instruct": 0.6, + "deepseek/deepseek-chat": 0.445, + "deepseek/deepseek-chat-v2.5": 1.0, + "deepseek/deepseek-chat:free": 0.0, + "deepseek/deepseek-r1": 1.2, + "deepseek/deepseek-r1-distill-llama-70b": 0.345, + "deepseek/deepseek-r1-distill-llama-70b:free": 0.0, + "deepseek/deepseek-r1-distill-llama-8b": 0.02, + "deepseek/deepseek-r1-distill-qwen-1.5b": 0.09, + "deepseek/deepseek-r1-distill-qwen-14b": 0.075, + "deepseek/deepseek-r1-distill-qwen-32b": 0.09, + "deepseek/deepseek-r1:free": 0.0, + "eva-unit-01/eva-llama-3.33-70b": 3.0, + "eva-unit-01/eva-qwen-2.5-32b": 1.7, + "eva-unit-01/eva-qwen-2.5-72b": 3.0, + "google/gemini-2.0-flash-001": 0.2, + "google/gemini-2.0-flash-exp:free": 0.0, + "google/gemini-2.0-flash-lite-preview-02-05:free": 0.0, + "google/gemini-2.0-flash-thinking-exp-1219:free": 0.0, + "google/gemini-2.0-flash-thinking-exp:free": 0.0, + "google/gemini-2.0-pro-exp-02-05:free": 0.0, + "google/gemini-exp-1206:free": 0.0, + "google/gemini-flash-1.5": 0.15, + "google/gemini-flash-1.5-8b": 0.075, + "google/gemini-flash-1.5-8b-exp": 0.0, + "google/gemini-pro": 0.75, + "google/gemini-pro-1.5": 2.5, + "google/gemini-pro-vision": 0.75, + "google/gemma-2-27b-it": 0.135, + "google/gemma-2-9b-it": 0.03, + "google/gemma-2-9b-it:free": 0.0, + "google/gemma-7b-it": 0.075, + "google/learnlm-1.5-pro-experimental:free": 0.0, + "google/palm-2-chat-bison": 1.0, + "google/palm-2-chat-bison-32k": 1.0, + "google/palm-2-codechat-bison": 1.0, + "google/palm-2-codechat-bison-32k": 1.0, + "gryphe/mythomax-l2-13b": 0.0325, + "gryphe/mythomax-l2-13b:free": 0.0, + "huggingfaceh4/zephyr-7b-beta:free": 0.0, + "infermatic/mn-inferor-12b": 0.6, + "inflection/inflection-3-pi": 5.0, + "inflection/inflection-3-productivity": 5.0, + "jondurbin/airoboros-l2-70b": 0.25, + "liquid/lfm-3b": 0.01, + "liquid/lfm-40b": 0.075, + "liquid/lfm-7b": 0.005, + "mancer/weaver": 1.125, + "meta-llama/llama-2-13b-chat": 0.11, + "meta-llama/llama-2-70b-chat": 0.45, + "meta-llama/llama-3-70b-instruct": 0.2, + "meta-llama/llama-3-8b-instruct": 0.03, + "meta-llama/llama-3-8b-instruct:free": 0.0, + "meta-llama/llama-3.1-405b": 1.0, + "meta-llama/llama-3.1-405b-instruct": 0.4, + "meta-llama/llama-3.1-70b-instruct": 0.15, + "meta-llama/llama-3.1-8b-instruct": 0.025, + "meta-llama/llama-3.2-11b-vision-instruct": 0.0275, + "meta-llama/llama-3.2-11b-vision-instruct:free": 0.0, + "meta-llama/llama-3.2-1b-instruct": 0.005, + "meta-llama/llama-3.2-3b-instruct": 0.0125, + "meta-llama/llama-3.2-90b-vision-instruct": 0.8, + "meta-llama/llama-3.3-70b-instruct": 0.15, + "meta-llama/llama-3.3-70b-instruct:free": 0.0, + "meta-llama/llama-guard-2-8b": 0.1, + "microsoft/phi-3-medium-128k-instruct": 0.5, + "microsoft/phi-3-medium-128k-instruct:free": 0.0, + "microsoft/phi-3-mini-128k-instruct": 0.05, + "microsoft/phi-3-mini-128k-instruct:free": 0.0, + "microsoft/phi-3.5-mini-128k-instruct": 0.05, + "microsoft/phi-4": 0.07, + "microsoft/wizardlm-2-7b": 0.035, + "microsoft/wizardlm-2-8x22b": 0.25, + "minimax/minimax-01": 0.55, + "mistralai/codestral-2501": 0.45, + "mistralai/codestral-mamba": 0.125, + "mistralai/ministral-3b": 0.02, + "mistralai/ministral-8b": 0.05, + "mistralai/mistral-7b-instruct": 0.0275, + "mistralai/mistral-7b-instruct-v0.1": 0.1, + "mistralai/mistral-7b-instruct-v0.3": 0.0275, + "mistralai/mistral-7b-instruct:free": 0.0, + "mistralai/mistral-large": 3.0, + "mistralai/mistral-large-2407": 3.0, + "mistralai/mistral-large-2411": 3.0, + "mistralai/mistral-medium": 4.05, + "mistralai/mistral-nemo": 0.04, + "mistralai/mistral-nemo:free": 0.0, + "mistralai/mistral-small": 0.3, + "mistralai/mistral-small-24b-instruct-2501": 0.07, + "mistralai/mistral-small-24b-instruct-2501:free": 0.0, + "mistralai/mistral-tiny": 0.125, + "mistralai/mixtral-8x22b-instruct": 0.45, + "mistralai/mixtral-8x7b": 0.3, + "mistralai/mixtral-8x7b-instruct": 0.12, + "mistralai/pixtral-12b": 0.05, + "mistralai/pixtral-large-2411": 3.0, + "neversleep/llama-3-lumimaid-70b": 2.25, + "neversleep/llama-3-lumimaid-8b": 0.5625, + "neversleep/llama-3-lumimaid-8b:extended": 0.5625, + "neversleep/llama-3.1-lumimaid-70b": 2.25, + "neversleep/llama-3.1-lumimaid-8b": 0.5625, + "neversleep/noromaid-20b": 1.125, + "nothingiisreal/mn-celeste-12b": 0.6, + "nousresearch/hermes-2-pro-llama-3-8b": 0.02, + "nousresearch/hermes-3-llama-3.1-405b": 0.4, + "nousresearch/hermes-3-llama-3.1-70b": 0.15, + "nousresearch/nous-hermes-2-mixtral-8x7b-dpo": 0.3, + "nousresearch/nous-hermes-llama2-13b": 0.085, + "nvidia/llama-3.1-nemotron-70b-instruct": 0.15, + "nvidia/llama-3.1-nemotron-70b-instruct:free": 0.0, + "openai/chatgpt-4o-latest": 7.5, + "openai/gpt-3.5-turbo": 0.75, + "openai/gpt-3.5-turbo-0125": 0.75, + "openai/gpt-3.5-turbo-0613": 1.0, + "openai/gpt-3.5-turbo-1106": 1.0, + "openai/gpt-3.5-turbo-16k": 2.0, + "openai/gpt-3.5-turbo-instruct": 1.0, + "openai/gpt-4": 30.0, + "openai/gpt-4-0314": 30.0, + "openai/gpt-4-1106-preview": 15.0, + "openai/gpt-4-32k": 60.0, + "openai/gpt-4-32k-0314": 60.0, + "openai/gpt-4-turbo": 15.0, + "openai/gpt-4-turbo-preview": 15.0, + "openai/gpt-4o": 5.0, + "openai/gpt-4o-2024-05-13": 7.5, + "openai/gpt-4o-2024-08-06": 5.0, + "openai/gpt-4o-2024-11-20": 5.0, + "openai/gpt-4o-mini": 0.3, + "openai/gpt-4o-mini-2024-07-18": 0.3, + "openai/gpt-4o:extended": 9.0, + "openai/o1": 30.0, + "openai/o1-mini": 2.2, + "openai/o1-mini-2024-09-12": 2.2, + "openai/o1-preview": 30.0, + "openai/o1-preview-2024-09-12": 30.0, + "openai/o3-mini": 2.2, + "openai/o3-mini-high": 2.2, + "openchat/openchat-7b": 0.0275, + "openchat/openchat-7b:free": 0.0, + "openrouter/auto": -500000.0, + "perplexity/llama-3.1-sonar-huge-128k-online": 2.5, + "perplexity/llama-3.1-sonar-large-128k-chat": 0.5, + "perplexity/llama-3.1-sonar-large-128k-online": 0.5, + "perplexity/llama-3.1-sonar-small-128k-chat": 0.1, + "perplexity/llama-3.1-sonar-small-128k-online": 0.1, + "perplexity/sonar": 0.5, + "perplexity/sonar-reasoning": 2.5, + "pygmalionai/mythalion-13b": 0.6, + "qwen/qvq-72b-preview": 0.25, + "qwen/qwen-2-72b-instruct": 0.45, + "qwen/qwen-2-7b-instruct": 0.027, + "qwen/qwen-2-7b-instruct:free": 0.0, + "qwen/qwen-2-vl-72b-instruct": 0.2, + "qwen/qwen-2-vl-7b-instruct": 0.05, + "qwen/qwen-2.5-72b-instruct": 0.2, + "qwen/qwen-2.5-7b-instruct": 0.025, + "qwen/qwen-2.5-coder-32b-instruct": 0.08, + "qwen/qwen-max": 3.2, + "qwen/qwen-plus": 0.6, + "qwen/qwen-turbo": 0.1, + "qwen/qwen-vl-plus:free": 0.0, + "qwen/qwen2.5-vl-72b-instruct:free": 0.0, + "qwen/qwq-32b-preview": 0.09, + "raifle/sorcererlm-8x22b": 2.25, + "sao10k/fimbulvetr-11b-v2": 0.6, + "sao10k/l3-euryale-70b": 0.4, + "sao10k/l3-lunaris-8b": 0.03, + "sao10k/l3.1-70b-hanami-x1": 1.5, + "sao10k/l3.1-euryale-70b": 0.4, + "sao10k/l3.3-euryale-70b": 0.4, + "sophosympatheia/midnight-rose-70b": 0.4, + "sophosympatheia/rogue-rose-103b-v0.2:free": 0.0, + "teknium/openhermes-2.5-mistral-7b": 0.085, + "thedrummer/rocinante-12b": 0.25, + "thedrummer/unslopnemo-12b": 0.25, + "undi95/remm-slerp-l2-13b": 0.6, + "undi95/toppy-m-7b": 0.035, + "undi95/toppy-m-7b:free": 0.0, + "x-ai/grok-2-1212": 5.0, + "x-ai/grok-2-vision-1212": 5.0, + "x-ai/grok-beta": 7.5, + "x-ai/grok-vision-beta": 7.5, + "xwin-lm/xwin-lm-70b": 1.875, } var CompletionRatio = map[string]float64{