{"repo": "bingreeky/agentracer", "files": {"MetaGPT/metagpt/configs/llm_config.py": {"bc6bcd94c2e18f62d6712ca70ba268f6684b894f": {"t": 1785674193.8446422, "n": 4433, "h": "5ec341f351c8e643", "c": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\"\"\"\n@Time : 2024/1/4 16:33\n@Author : alexanderwu\n@File : llm_config.py\n\"\"\"\n\nfrom enum import Enum\nfrom typing import Optional\n\nfrom pydantic import field_validator\n\nfrom metagpt.configs.compress_msg_config import CompressType\nfrom metagpt.const import CONFIG_ROOT, LLM_API_TIMEOUT, METAGPT_ROOT\nfrom metagpt.utils.yaml_model import YamlModel\n\n\nclass LLMType(Enum):\n OPENAI = \"openai\"\n ANTHROPIC = \"anthropic\"\n CLAUDE = \"claude\" # alias name of anthropic\n SPARK = \"spark\"\n ZHIPUAI = \"zhipuai\"\n FIREWORKS = \"fireworks\"\n OPEN_LLM = \"open_llm\"\n GEMINI = \"gemini\"\n METAGPT = \"metagpt\"\n AZURE = \"azure\"\n OLLAMA = \"ollama\" # /chat at ollama api\n OLLAMA_GENERATE = \"ollama.generate\" # /generate at ollama api\n OLLAMA_EMBEDDINGS = \"ollama.embeddings\" # /embeddings at ollama api\n OLLAMA_EMBED = \"ollama.embed\" # /embed at ollama api\n QIANFAN = \"qianfan\" # Baidu BCE\n DASHSCOPE = \"dashscope\" # Aliyun LingJi DashScope\n MOONSHOT = \"moonshot\"\n MISTRAL = \"mistral\"\n YI = \"yi\" # lingyiwanwu\n OPEN_ROUTER = \"open_router\"\n DEEPSEEK = \"deepseek\"\n SILICONFLOW = \"siliconflow\"\n OPENROUTER = \"openrouter\"\n OPENROUTER_REASONING = \"openrouter_reasoning\"\n BEDROCK = \"bedrock\"\n ARK = \"ark\" # https://www.volcengine.com/docs/82379/1263482#python-sdk\n SQUIRREL = \"squirrel\"\n\n def __missing__(self, key):\n return self.OPENAI\n\n\nclass LLMConfig(YamlModel):\n \"\"\"Config for LLM\n\n OpenAI: https://github.com/openai/openai-python/blob/main/src/openai/resources/chat/completions.py#L681\n Optional Fields in pydantic: https://docs.pydantic.dev/latest/migration/#required-optional-and-nullable-fields\n \"\"\"\n\n api_key: str = \"sk-\"\n api_type: LLMType = LLMType.OPENAI\n base_url: str = \"https://api.openai.com/v1\"\n api_version: Optional[str] = None\n\n model: Optional[str] = None # also stands for DEPLOYMENT_NAME\n pricing_plan: Optional[str] = None # Cost Settlement Plan Parameters.\n\n # For Cloud Service Provider like Baidu/ Alibaba\n access_key: Optional[str] = None\n secret_key: Optional[str] = None\n session_token: Optional[str] = None\n endpoint: Optional[str] = None # for self-deployed model on the cloud\n\n # For Spark(Xunfei), maybe remove later\n app_id: Optional[str] = None\n api_secret: Optional[str] = None\n domain: Optional[str] = None\n\n # For Chat Completion\n max_token: int = 4096\n temperature: float = 0.0\n top_p: float = 1.0\n top_k: int = 0\n repetition_penalty: float = 1.0\n stop: Optional[str] = None\n presence_penalty: float = 0.0\n frequency_penalty: float = 0.0\n best_of: Optional[int] = None\n n: Optional[int] = None\n stream: bool = True\n seed: Optional[int] = None\n # https://cookbook.openai.com/examples/using_logprobs\n logprobs: Optional[bool] = None\n top_logprobs: Optional[int] = None\n timeout: int = 600\n context_length: Optional[int] = None # Max input tokens\n\n # For Amazon Bedrock\n region_name: str = None\n\n # For Network\n proxy: Optional[str] = None\n\n # Cost Control\n calc_usage: bool = True\n\n # Compress request messages under token limit\n compress_type: CompressType = CompressType.NO_COMPRESS\n\n # For Messages Control\n use_system_prompt: bool = True\n\n # reasoning / thinking switch\n reasoning: bool = False\n reasoning_max_token: int = 4000 # reasoning budget tokens to generate, usually smaller than max_token\n\n @field_validator(\"api_key\")\n @classmethod\n def check_llm_key(cls, v):\n if v in [\"\", None, \"YOUR_API_KEY\"]:\n repo_config_path = METAGPT_ROOT / \"config/config2.yaml\"\n root_config_path = CONFIG_ROOT / \"config2.yaml\"\n if root_config_path.exists():\n raise ValueError(\n f\"Please set your API key in {root_config_path}. If you also set your config in {repo_config_path}, \\n\"\n f\"the former will overwrite the latter. This may cause unexpected result.\\n\"\n )\n elif repo_config_path.exists():\n raise ValueError(f\"Please set your API key in {repo_config_path}\")\n else:\n raise ValueError(\"Please set your API key in config2.yaml\")\n return v\n\n @field_validator(\"timeout\")\n @classmethod\n def check_timeout(cls, v):\n return v or LLM_API_TIMEOUT\n"}, "30544fd08ce3d046f234d456466e39a5f5a6b12e": {"t": 1785764944.2979, "n": 4433, "h": "5ec341f351c8e643", "c": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\"\"\"\n@Time : 2024/1/4 16:33\n@Author : alexanderwu\n@File : llm_config.py\n\"\"\"\n\nfrom enum import Enum\nfrom typing import Optional\n\nfrom pydantic import field_validator\n\nfrom metagpt.configs.compress_msg_config import CompressType\nfrom metagpt.const import CONFIG_ROOT, LLM_API_TIMEOUT, METAGPT_ROOT\nfrom metagpt.utils.yaml_model import YamlModel\n\n\nclass LLMType(Enum):\n OPENAI = \"openai\"\n ANTHROPIC = \"anthropic\"\n CLAUDE = \"claude\" # alias name of anthropic\n SPARK = \"spark\"\n ZHIPUAI = \"zhipuai\"\n FIREWORKS = \"fireworks\"\n OPEN_LLM = \"open_llm\"\n GEMINI = \"gemini\"\n METAGPT = \"metagpt\"\n AZURE = \"azure\"\n OLLAMA = \"ollama\" # /chat at ollama api\n OLLAMA_GENERATE = \"ollama.generate\" # /generate at ollama api\n OLLAMA_EMBEDDINGS = \"ollama.embeddings\" # /embeddings at ollama api\n OLLAMA_EMBED = \"ollama.embed\" # /embed at ollama api\n QIANFAN = \"qianfan\" # Baidu BCE\n DASHSCOPE = \"dashscope\" # Aliyun LingJi DashScope\n MOONSHOT = \"moonshot\"\n MISTRAL = \"mistral\"\n YI = \"yi\" # lingyiwanwu\n OPEN_ROUTER = \"open_router\"\n DEEPSEEK = \"deepseek\"\n SILICONFLOW = \"siliconflow\"\n OPENROUTER = \"openrouter\"\n OPENROUTER_REASONING = \"openrouter_reasoning\"\n BEDROCK = \"bedrock\"\n ARK = \"ark\" # https://www.volcengine.com/docs/82379/1263482#python-sdk\n SQUIRREL = \"squirrel\"\n\n def __missing__(self, key):\n return self.OPENAI\n\n\nclass LLMConfig(YamlModel):\n \"\"\"Config for LLM\n\n OpenAI: https://github.com/openai/openai-python/blob/main/src/openai/resources/chat/completions.py#L681\n Optional Fields in pydantic: https://docs.pydantic.dev/latest/migration/#required-optional-and-nullable-fields\n \"\"\"\n\n api_key: str = \"sk-\"\n api_type: LLMType = LLMType.OPENAI\n base_url: str = \"https://api.openai.com/v1\"\n api_version: Optional[str] = None\n\n model: Optional[str] = None # also stands for DEPLOYMENT_NAME\n pricing_plan: Optional[str] = None # Cost Settlement Plan Parameters.\n\n # For Cloud Service Provider like Baidu/ Alibaba\n access_key: Optional[str] = None\n secret_key: Optional[str] = None\n session_token: Optional[str] = None\n endpoint: Optional[str] = None # for self-deployed model on the cloud\n\n # For Spark(Xunfei), maybe remove later\n app_id: Optional[str] = None\n api_secret: Optional[str] = None\n domain: Optional[str] = None\n\n # For Chat Completion\n max_token: int = 4096\n temperature: float = 0.0\n top_p: float = 1.0\n top_k: int = 0\n repetition_penalty: float = 1.0\n stop: Optional[str] = None\n presence_penalty: float = 0.0\n frequency_penalty: float = 0.0\n best_of: Optional[int] = None\n n: Optional[int] = None\n stream: bool = True\n seed: Optional[int] = None\n # https://cookbook.openai.com/examples/using_logprobs\n logprobs: Optional[bool] = None\n top_logprobs: Optional[int] = None\n timeout: int = 600\n context_length: Optional[int] = None # Max input tokens\n\n # For Amazon Bedrock\n region_name: str = None\n\n # For Network\n proxy: Optional[str] = None\n\n # Cost Control\n calc_usage: bool = True\n\n # Compress request messages under token limit\n compress_type: CompressType = CompressType.NO_COMPRESS\n\n # For Messages Control\n use_system_prompt: bool = True\n\n # reasoning / thinking switch\n reasoning: bool = False\n reasoning_max_token: int = 4000 # reasoning budget tokens to generate, usually smaller than max_token\n\n @field_validator(\"api_key\")\n @classmethod\n def check_llm_key(cls, v):\n if v in [\"\", None, \"YOUR_API_KEY\"]:\n repo_config_path = METAGPT_ROOT / \"config/config2.yaml\"\n root_config_path = CONFIG_ROOT / \"config2.yaml\"\n if root_config_path.exists():\n raise ValueError(\n f\"Please set your API key in {root_config_path}. If you also set your config in {repo_config_path}, \\n\"\n f\"the former will overwrite the latter. This may cause unexpected result.\\n\"\n )\n elif repo_config_path.exists():\n raise ValueError(f\"Please set your API key in {repo_config_path}\")\n else:\n raise ValueError(\"Please set your API key in config2.yaml\")\n return v\n\n @field_validator(\"timeout\")\n @classmethod\n def check_timeout(cls, v):\n return v or LLM_API_TIMEOUT\n"}}, "MetaGPT/metagpt/provider/ark_api.py": {"bc6bcd94c2e18f62d6712ca70ba268f6684b894f": {"t": 1785674278.4388635, "n": 3975, "h": "685378880c9c6117", "c": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\"\"\"\nProvider for volcengine.\nSee Also: https://console.volcengine.com/ark/region:ark+cn-beijing/model\n\nconfig2.yaml example:\n```yaml\nllm:\n base_url: \"https://ark.cn-beijing.volces.com/api/v3\"\n api_type: \"ark\"\n endpoint: \"ep-2024080514****-d****\"\n api_key: \"d47****b-****-****-****-d6e****0fd77\"\n pricing_plan: \"doubao-lite\"\n```\n\"\"\"\nfrom typing import Optional, Union\n\nfrom pydantic import BaseModel\nfrom volcenginesdkarkruntime import AsyncArk\nfrom volcenginesdkarkruntime._base_client import AsyncHttpxClientWrapper\nfrom volcenginesdkarkruntime._streaming import AsyncStream\nfrom volcenginesdkarkruntime.types.chat import ChatCompletion, ChatCompletionChunk\n\nfrom metagpt.configs.llm_config import LLMType\nfrom metagpt.const import USE_CONFIG_TIMEOUT\nfrom metagpt.logs import log_llm_stream\nfrom metagpt.provider.llm_provider_registry import register_provider\nfrom metagpt.provider.openai_api import OpenAILLM\nfrom metagpt.utils.token_counter import DOUBAO_TOKEN_COSTS\n\n\n@register_provider(LLMType.ARK)\nclass ArkLLM(OpenAILLM):\n \"\"\"\n 用于火山方舟的API\n 见:https://www.volcengine.com/docs/82379/1263482\n \"\"\"\n\n aclient: Optional[AsyncArk] = None\n\n def _init_client(self):\n \"\"\"SDK: https://github.com/openai/openai-python#async-usage\"\"\"\n self.model = (\n self.config.endpoint or self.config.model\n ) # endpoint name, See more: https://console.volcengine.com/ark/region:ark+cn-beijing/endpoint\n self.pricing_plan = self.config.pricing_plan or self.model\n kwargs = self._make_client_kwargs()\n self.aclient = AsyncArk(**kwargs)\n\n def _make_client_kwargs(self) -> dict:\n kvs = {\n \"ak\": self.config.access_key,\n \"sk\": self.config.secret_key,\n \"api_key\": self.config.api_key,\n \"base_url\": self.config.base_url,\n }\n kwargs = {k: v for k, v in kvs.items() if v}\n\n # to use proxy, openai v1 needs http_client\n if proxy_params := self._get_proxy_params():\n kwargs[\"http_client\"] = AsyncHttpxClientWrapper(**proxy_params)\n\n return kwargs\n\n def _update_costs(self, usage: Union[dict, BaseModel], model: str = None, local_calc_usage: bool = True):\n if next(iter(DOUBAO_TOKEN_COSTS)) not in self.cost_manager.token_costs:\n self.cost_manager.token_costs.update(DOUBAO_TOKEN_COSTS)\n if model in self.cost_manager.token_costs:\n self.pricing_plan = model\n if self.pricing_plan in self.cost_manager.token_costs:\n super()._update_costs(usage, self.pricing_plan, local_calc_usage)\n\n async def _achat_completion_stream(self, messages: list[dict], timeout=USE_CONFIG_TIMEOUT) -> str:\n response: AsyncStream[ChatCompletionChunk] = await self.aclient.chat.completions.create(\n **self._cons_kwargs(messages, timeout=self.get_timeout(timeout)),\n stream=True,\n extra_body={\"stream_options\": {\"include_usage\": True}}, # 只有增加这个参数才会在流式时最后返回usage\n )\n usage = None\n collected_messages = []\n async for chunk in response:\n chunk_message = chunk.choices[0].delta.content or \"\" if chunk.choices else \"\" # extract the message\n log_llm_stream(chunk_message)\n collected_messages.append(chunk_message)\n if chunk.usage:\n # 火山方舟的流式调用会在最后一个chunk中返回usage,最后一个chunk的choices为[]\n usage = chunk.usage\n\n log_llm_stream(\"\\n\")\n full_reply_content = \"\".join(collected_messages)\n self._update_costs(usage, chunk.model)\n return full_reply_content\n\n async def _achat_completion(self, messages: list[dict], timeout=USE_CONFIG_TIMEOUT) -> ChatCompletion:\n kwargs = self._cons_kwargs(messages, timeout=self.get_timeout(timeout))\n rsp: ChatCompletion = await self.aclient.chat.completions.create(**kwargs)\n self._update_costs(rsp.usage, rsp.model)\n return rsp\n"}}, "MetaGPT/metagpt/tools/iflytek_tts.py": {"bc6bcd94c2e18f62d6712ca70ba268f6684b894f": {"t": 1785674320.4317844, "n": 5404, "h": "9085edbcfa8d653a", "c": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\"\"\"\n@Time : 2023/8/17\n@Author : mashenquan\n@File : iflytek_tts.py\n@Desc : iFLYTEK TTS OAS3 api, which provides text-to-speech functionality\n\"\"\"\nimport base64\nimport hashlib\nimport hmac\nimport json\nimport uuid\nfrom datetime import datetime\nfrom enum import Enum\nfrom pathlib import Path\nfrom time import mktime\nfrom typing import Optional\nfrom urllib.parse import urlencode\nfrom wsgiref.handlers import format_date_time\n\nimport aiofiles\nimport websockets as websockets\nfrom pydantic import BaseModel\n\nfrom metagpt.logs import logger\n\n\nclass IFlyTekTTSStatus(Enum):\n STATUS_FIRST_FRAME = 0 # The first frame\n STATUS_CONTINUE_FRAME = 1 # The intermediate frame\n STATUS_LAST_FRAME = 2 # The last frame\n\n\nclass AudioData(BaseModel):\n audio: str\n status: int\n ced: str\n\n\nclass IFlyTekTTSResponse(BaseModel):\n code: int\n message: str\n data: Optional[AudioData] = None\n sid: str\n\n\nDEFAULT_IFLYTEK_VOICE = \"xiaoyan\"\n\n\nclass IFlyTekTTS(object):\n def __init__(self, app_id: str, api_key: str, api_secret: str):\n \"\"\"\n :param app_id: Application ID is used to access your iFlyTek service API, see: `https://console.xfyun.cn/services/tts`\n :param api_key: WebAPI argument, see: `https://console.xfyun.cn/services/tts`\n :param api_secret: WebAPI argument, see: `https://console.xfyun.cn/services/tts`\n \"\"\"\n self.app_id = app_id\n self.api_key = api_key\n self.api_secret = api_secret\n\n async def synthesize_speech(self, text, output_file: str, voice=DEFAULT_IFLYTEK_VOICE):\n url = self._create_url()\n data = {\n \"common\": {\"app_id\": self.app_id},\n \"business\": {\"aue\": \"lame\", \"sfl\": 1, \"auf\": \"audio/L16;rate=16000\", \"vcn\": voice, \"tte\": \"utf8\"},\n \"data\": {\"status\": 2, \"text\": str(base64.b64encode(text.encode(\"utf-8\")), \"UTF8\")},\n }\n req = json.dumps(data)\n async with websockets.connect(url) as websocket:\n # send request\n await websocket.send(req)\n\n # receive frames\n async with aiofiles.open(str(output_file), \"wb\") as writer:\n while True:\n v = await websocket.recv()\n rsp = IFlyTekTTSResponse(**json.loads(v))\n if rsp.data:\n binary_data = base64.b64decode(rsp.data.audio)\n await writer.write(binary_data)\n if rsp.data.status != IFlyTekTTSStatus.STATUS_LAST_FRAME.value:\n continue\n break\n\n def _create_url(self):\n \"\"\"Create request url\"\"\"\n url = \"wss://tts-api.xfyun.cn/v2/tts\"\n # Generate a timestamp in RFC1123 format\n now = datetime.now()\n date = format_date_time(mktime(now.timetuple()))\n\n signature_origin = \"host: \" + \"ws-api.xfyun.cn\" + \"\\n\"\n signature_origin += \"date: \" + date + \"\\n\"\n signature_origin += \"GET \" + \"/v2/tts \" + \"HTTP/1.1\"\n # Perform HMAC-SHA256 encryption\n signature_sha = hmac.new(\n self.api_secret.encode(\"utf-8\"), signature_origin.encode(\"utf-8\"), digestmod=hashlib.sha256\n ).digest()\n signature_sha = base64.b64encode(signature_sha).decode(encoding=\"utf-8\")\n\n authorization_origin = 'api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"' % (\n self.api_key,\n \"hmac-sha256\",\n \"host date request-line\",\n signature_sha,\n )\n authorization = base64.b64encode(authorization_origin.encode(\"utf-8\")).decode(encoding=\"utf-8\")\n # Combine the authentication parameters of the request into a dictionary.\n v = {\"authorization\": authorization, \"date\": date, \"host\": \"ws-api.xfyun.cn\"}\n # Concatenate the authentication parameters to generate the URL.\n url = url + \"?\" + urlencode(v)\n return url\n\n\n# Export\nasync def oas3_iflytek_tts(text: str, voice: str = \"\", app_id: str = \"\", api_key: str = \"\", api_secret: str = \"\"):\n \"\"\"Text to speech\n For more details, check out:`https://www.xfyun.cn/doc/tts/online_tts/API.html`\n\n :param voice: Default `xiaoyan`. For more details, checkout: `https://www.xfyun.cn/doc/tts/online_tts/API.html#%E6%8E%A5%E5%8F%A3%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B`\n :param text: The text used for voice conversion.\n :param app_id: Application ID is used to access your iFlyTek service API, see: `https://console.xfyun.cn/services/tts`\n :param api_key: WebAPI argument, see: `https://console.xfyun.cn/services/tts`\n :param api_secret: WebAPI argument, see: `https://console.xfyun.cn/services/tts`\n :return: Returns the Base64-encoded .mp3 file data if successful, otherwise an empty string.\n\n \"\"\"\n\n filename = Path(__file__).parent / (uuid.uuid4().hex + \".mp3\")\n try:\n tts = IFlyTekTTS(app_id=app_id, api_key=api_key, api_secret=api_secret)\n await tts.synthesize_speech(text=text, output_file=str(filename), voice=voice)\n async with aiofiles.open(str(filename), mode=\"rb\") as reader:\n data = await reader.read()\n base64_string = base64.b64encode(data).decode(\"utf-8\")\n except Exception as e:\n logger.error(f\"text:{text}, error:{e}\")\n base64_string = \"\"\n finally:\n filename.unlink(missing_ok=True)\n\n return base64_string\n"}}, "MetaGPT/metagpt/learn/text_to_speech.py": {"bc6bcd94c2e18f62d6712ca70ba268f6684b894f": {"t": 1785674326.196102, "n": 3798, "h": "d24ba069c2a05992", "c": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\"\"\"\n@Time : 2023/8/17\n@Author : mashenquan\n@File : text_to_speech.py\n@Desc : Text-to-Speech skill, which provides text-to-speech functionality\n\"\"\"\nfrom typing import Optional\n\nfrom metagpt.config2 import Config\nfrom metagpt.const import BASE64_FORMAT\nfrom metagpt.tools.azure_tts import oas3_azsure_tts\nfrom metagpt.tools.iflytek_tts import oas3_iflytek_tts\nfrom metagpt.utils.s3 import S3\n\n\nasync def text_to_speech(\n text,\n lang=\"zh-CN\",\n voice=\"zh-CN-XiaomoNeural\",\n style=\"affectionate\",\n role=\"Girl\",\n config: Optional[Config] = None,\n):\n \"\"\"Text to speech\n For more details, check out:`https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=tts`\n\n :param lang: The value can contain a language code such as en (English), or a locale such as en-US (English - United States). For more details, checkout: `https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=tts`\n :param voice: For more details, checkout: `https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=tts`, `https://speech.microsoft.com/portal/voicegallery`\n :param style: Speaking style to express different emotions like cheerfulness, empathy, and calm. For more details, checkout: `https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=tts`\n :param role: With roles, the same voice can act as a different age and gender. For more details, checkout: `https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=tts`\n :param text: The text used for voice conversion.\n :param subscription_key: key is used to access your Azure AI service API, see: `https://portal.azure.com/` > `Resource Management` > `Keys and Endpoint`\n :param region: This is the location (or region) of your resource. You may need to use this field when making calls to this API.\n :param iflytek_app_id: Application ID is used to access your iFlyTek service API, see: `https://console.xfyun.cn/services/tts`\n :param iflytek_api_key: WebAPI argument, see: `https://console.xfyun.cn/services/tts`\n :param iflytek_api_secret: WebAPI argument, see: `https://console.xfyun.cn/services/tts`\n :return: Returns the Base64-encoded .wav/.mp3 file data if successful, otherwise an empty string.\n\n \"\"\"\n config = config if config else Config.default()\n subscription_key = config.azure_tts_subscription_key\n region = config.azure_tts_region\n if subscription_key and region:\n audio_declaration = \"data:audio/wav;base64,\"\n base64_data = await oas3_azsure_tts(text, lang, voice, style, role, subscription_key, region)\n s3 = S3(config.s3)\n url = await s3.cache(data=base64_data, file_ext=\".wav\", format=BASE64_FORMAT)\n if url:\n return f\"[{text}]({url})\"\n return audio_declaration + base64_data if base64_data else base64_data\n\n iflytek_app_id = config.iflytek_app_id\n iflytek_api_key = config.iflytek_api_key\n iflytek_api_secret = config.iflytek_api_secret\n if iflytek_app_id and iflytek_api_key and iflytek_api_secret:\n audio_declaration = \"data:audio/mp3;base64,\"\n base64_data = await oas3_iflytek_tts(\n text=text, app_id=iflytek_app_id, api_key=iflytek_api_key, api_secret=iflytek_api_secret\n )\n s3 = S3(config.s3)\n url = await s3.cache(data=base64_data, file_ext=\".mp3\", format=BASE64_FORMAT)\n if url:\n return f\"[{text}]({url})\"\n return audio_declaration + base64_data if base64_data else base64_data\n\n raise ValueError(\n \"azure_tts_subscription_key, azure_tts_region, iflytek_app_id, iflytek_api_key, iflytek_api_secret error\"\n )\n"}}, "MetaGPT/metagpt/utils/token_counter.py": {"bc6bcd94c2e18f62d6712ca70ba268f6684b894f": {"t": 1785746494.97452, "n": 27691, "h": "5688f3a21f816255", "c": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\"\"\"\n@Time : 2023/5/18 00:40\n@Author : alexanderwu\n@File : token_counter.py\nref1: https://openai.com/pricing\nref2: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb\nref3: https://github.com/Significant-Gravitas/Auto-GPT/blob/master/autogpt/llm/token_counter.py\nref4: https://github.com/hwchase17/langchain/blob/master/langchain/chat_models/openai.py\nref5: https://ai.google.dev/models/gemini\n\"\"\"\nimport anthropic\nimport tiktoken\n\nfrom metagpt.logs import logger\n\nTOKEN_COSTS = {\n \"anthropic/claude-3.5-sonnet\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"gpt-3.5-turbo\": {\"prompt\": 0.0015, \"completion\": 0.002},\n \"gpt-3.5-turbo-0301\": {\"prompt\": 0.0015, \"completion\": 0.002},\n \"gpt-3.5-turbo-0613\": {\"prompt\": 0.0015, \"completion\": 0.002},\n \"gpt-3.5-turbo-16k\": {\"prompt\": 0.003, \"completion\": 0.004},\n \"gpt-3.5-turbo-16k-0613\": {\"prompt\": 0.003, \"completion\": 0.004},\n \"gpt-35-turbo\": {\"prompt\": 0.0015, \"completion\": 0.002},\n \"gpt-35-turbo-16k\": {\"prompt\": 0.003, \"completion\": 0.004},\n \"gpt-3.5-turbo-1106\": {\"prompt\": 0.001, \"completion\": 0.002},\n \"gpt-3.5-turbo-0125\": {\"prompt\": 0.001, \"completion\": 0.002},\n \"gpt-4-0314\": {\"prompt\": 0.03, \"completion\": 0.06},\n \"gpt-4\": {\"prompt\": 0.03, \"completion\": 0.06},\n \"gpt-4-32k\": {\"prompt\": 0.06, \"completion\": 0.12},\n \"gpt-4-32k-0314\": {\"prompt\": 0.06, \"completion\": 0.12},\n \"gpt-4-0613\": {\"prompt\": 0.06, \"completion\": 0.12},\n \"gpt-4-turbo-preview\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"gpt-4-1106-preview\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"gpt-4-0125-preview\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"gpt-4-turbo\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"gpt-4-turbo-2024-04-09\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"gpt-4-vision-preview\": {\"prompt\": 0.01, \"completion\": 0.03}, # TODO add extra image price calculator\n \"gpt-4-1106-vision-preview\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"gpt-4o\": {\"prompt\": 0.005, \"completion\": 0.015},\n \"gpt-4o-mini\": {\"prompt\": 0.00015, \"completion\": 0.0006},\n \"gpt-4o-mini-2024-07-18\": {\"prompt\": 0.00015, \"completion\": 0.0006},\n \"gpt-4o-2024-05-13\": {\"prompt\": 0.005, \"completion\": 0.015},\n \"gpt-4o-2024-08-06\": {\"prompt\": 0.0025, \"completion\": 0.01},\n \"o1-preview\": {\"prompt\": 0.015, \"completion\": 0.06},\n \"o1-preview-2024-09-12\": {\"prompt\": 0.015, \"completion\": 0.06},\n \"o1-mini\": {\"prompt\": 0.003, \"completion\": 0.012},\n \"o1-mini-2024-09-12\": {\"prompt\": 0.003, \"completion\": 0.012},\n \"text-embedding-ada-002\": {\"prompt\": 0.0004, \"completion\": 0.0},\n \"glm-3-turbo\": {\"prompt\": 0.0007, \"completion\": 0.0007}, # 128k version, prompt + completion tokens=0.005¥/k-tokens\n \"glm-4\": {\"prompt\": 0.014, \"completion\": 0.014}, # 128k version, prompt + completion tokens=0.1¥/k-tokens\n \"glm-4-flash\": {\"prompt\": 0, \"completion\": 0},\n \"glm-4-plus\": {\"prompt\": 0.007, \"completion\": 0.007},\n \"gemini-1.5-flash\": {\"prompt\": 0.000075, \"completion\": 0.0003},\n \"gemini-1.5-pro\": {\"prompt\": 0.0035, \"completion\": 0.0105},\n \"gemini-1.0-pro\": {\"prompt\": 0.0005, \"completion\": 0.0015},\n \"moonshot-v1-8k\": {\"prompt\": 0.012, \"completion\": 0.012}, # prompt + completion tokens=0.012¥/k-tokens\n \"moonshot-v1-32k\": {\"prompt\": 0.024, \"completion\": 0.024},\n \"moonshot-v1-128k\": {\"prompt\": 0.06, \"completion\": 0.06},\n \"open-mistral-7b\": {\"prompt\": 0.00025, \"completion\": 0.00025},\n \"open-mixtral-8x7b\": {\"prompt\": 0.0007, \"completion\": 0.0007},\n \"mistral-small-latest\": {\"prompt\": 0.002, \"completion\": 0.006},\n \"mistral-medium-latest\": {\"prompt\": 0.0027, \"completion\": 0.0081},\n \"mistral-large-latest\": {\"prompt\": 0.008, \"completion\": 0.024},\n \"claude-instant-1.2\": {\"prompt\": 0.0008, \"completion\": 0.0024},\n \"claude-2.0\": {\"prompt\": 0.008, \"completion\": 0.024},\n \"claude-2.1\": {\"prompt\": 0.008, \"completion\": 0.024},\n \"claude-3-sonnet-20240229\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"claude-3-5-sonnet\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"claude-3-5-sonnet-v2\": {\"prompt\": 0.003, \"completion\": 0.015}, # alias of newer 3.5 sonnet\n \"claude-3-5-sonnet-20240620\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"claude-3-opus-20240229\": {\"prompt\": 0.015, \"completion\": 0.075},\n \"claude-3-haiku-20240307\": {\"prompt\": 0.00025, \"completion\": 0.00125},\n \"claude-3-7-sonnet-20250219\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"yi-34b-chat-0205\": {\"prompt\": 0.0003, \"completion\": 0.0003},\n \"yi-34b-chat-200k\": {\"prompt\": 0.0017, \"completion\": 0.0017},\n \"openai/gpt-4\": {\"prompt\": 0.03, \"completion\": 0.06}, # start, for openrouter\n \"openai/gpt-4-turbo\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"openai/gpt-4o\": {\"prompt\": 0.005, \"completion\": 0.015},\n \"openai/gpt-4o-2024-05-13\": {\"prompt\": 0.005, \"completion\": 0.015},\n \"openai/gpt-4o-mini\": {\"prompt\": 0.00015, \"completion\": 0.0006},\n \"openai/gpt-4o-mini-2024-07-18\": {\"prompt\": 0.00015, \"completion\": 0.0006},\n \"google/gemini-flash-1.5\": {\"prompt\": 0.00025, \"completion\": 0.00075},\n \"deepseek/deepseek-coder\": {\"prompt\": 0.00014, \"completion\": 0.00028},\n \"deepseek/deepseek-chat\": {\"prompt\": 0.00014, \"completion\": 0.00028}, # end, for openrouter\n \"yi-large\": {\"prompt\": 0.0028, \"completion\": 0.0028},\n \"microsoft/wizardlm-2-8x22b\": {\"prompt\": 0.00108, \"completion\": 0.00108}, # for openrouter, start\n \"meta-llama/llama-3-70b-instruct\": {\"prompt\": 0.008, \"completion\": 0.008},\n \"llama3-70b-8192\": {\"prompt\": 0.0059, \"completion\": 0.0079},\n \"openai/gpt-3.5-turbo-0125\": {\"prompt\": 0.0005, \"completion\": 0.0015},\n \"openai/gpt-4-turbo-preview\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"openai/o1-preview\": {\"prompt\": 0.015, \"completion\": 0.06},\n \"openai/o1-mini\": {\"prompt\": 0.003, \"completion\": 0.012},\n \"anthropic/claude-3-opus\": {\"prompt\": 0.015, \"completion\": 0.075},\n \"anthropic.claude-3-5-sonnet-20241022-v2:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"us.anthropic.claude-3-5-sonnet-20241022-v2:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic/claude-3.7-sonnet\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic/claude-3.7-sonnet:beta\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic/claude-3.7-sonnet:thinking\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic.claude-3-7-sonnet-20250219-v1:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"us.anthropic.claude-3-7-sonnet-20250219-v1:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"google/gemini-pro-1.5\": {\"prompt\": 0.0025, \"completion\": 0.0075}, # for openrouter, end\n \"deepseek-chat\": {\"prompt\": 0.00027, \"completion\": 0.0011},\n \"deepseek-coder\": {\"prompt\": 0.00027, \"completion\": 0.0011},\n \"deepseek-reasoner\": {\"prompt\": 0.00055, \"completion\": 0.0022},\n # For ark model https://www.volcengine.com/docs/82379/1099320\n \"doubao-lite-4k-240515\": {\"prompt\": 0.000043, \"completion\": 0.000086},\n \"doubao-lite-32k-240515\": {\"prompt\": 0.000043, \"completion\": 0.000086},\n \"doubao-lite-128k-240515\": {\"prompt\": 0.00011, \"completion\": 0.00014},\n \"doubao-pro-4k-240515\": {\"prompt\": 0.00011, \"completion\": 0.00029},\n \"doubao-pro-32k-240515\": {\"prompt\": 0.00011, \"completion\": 0.00029},\n \"doubao-pro-128k-240515\": {\"prompt\": 0.0007, \"completion\": 0.0013},\n \"llama3-70b-llama3-70b-instruct\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"llama3-8b-llama3-8b-instruct\": {\"prompt\": 0.0, \"completion\": 0.0},\n}\n\n\n\"\"\"\nQianFan Token Price https://cloud.baidu.com/doc/WENXINWORKSHOP/s/hlrk4akp7#tokens%E5%90%8E%E4%BB%98%E8%B4%B9\nDue to QianFan has multi price strategies, we unify `Tokens post-payment` as a statistical method.\n\"\"\"\nQIANFAN_MODEL_TOKEN_COSTS = {\n \"ERNIE-Bot-4\": {\"prompt\": 0.017, \"completion\": 0.017},\n \"ERNIE-Bot-8k\": {\"prompt\": 0.0034, \"completion\": 0.0067},\n \"ERNIE-Bot\": {\"prompt\": 0.0017, \"completion\": 0.0017},\n \"ERNIE-Bot-turbo\": {\"prompt\": 0.0011, \"completion\": 0.0011},\n \"EB-turbo-AppBuilder\": {\"prompt\": 0.0011, \"completion\": 0.0011},\n \"ERNIE-Speed\": {\"prompt\": 0.00056, \"completion\": 0.0011},\n \"BLOOMZ-7B\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"Llama-2-7B-Chat\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"Llama-2-13B-Chat\": {\"prompt\": 0.00084, \"completion\": 0.00084},\n \"Llama-2-70B-Chat\": {\"prompt\": 0.0049, \"completion\": 0.0049},\n \"ChatGLM2-6B-32K\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"AquilaChat-7B\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"Mixtral-8x7B-Instruct\": {\"prompt\": 0.0049, \"completion\": 0.0049},\n \"SQLCoder-7B\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"CodeLlama-7B-Instruct\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"XuanYuan-70B-Chat-4bit\": {\"prompt\": 0.0049, \"completion\": 0.0049},\n \"Qianfan-BLOOMZ-7B-compressed\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"Qianfan-Chinese-Llama-2-7B\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"Qianfan-Chinese-Llama-2-13B\": {\"prompt\": 0.00084, \"completion\": 0.00084},\n \"ChatLaw\": {\"prompt\": 0.0011, \"completion\": 0.0011},\n \"Yi-34B-Chat\": {\"prompt\": 0.0, \"completion\": 0.0},\n}\n\nQIANFAN_ENDPOINT_TOKEN_COSTS = {\n \"completions_pro\": QIANFAN_MODEL_TOKEN_COSTS[\"ERNIE-Bot-4\"],\n \"ernie_bot_8k\": QIANFAN_MODEL_TOKEN_COSTS[\"ERNIE-Bot-8k\"],\n \"completions\": QIANFAN_MODEL_TOKEN_COSTS[\"ERNIE-Bot\"],\n \"eb-instant\": QIANFAN_MODEL_TOKEN_COSTS[\"ERNIE-Bot-turbo\"],\n \"ai_apaas\": QIANFAN_MODEL_TOKEN_COSTS[\"EB-turbo-AppBuilder\"],\n \"ernie_speed\": QIANFAN_MODEL_TOKEN_COSTS[\"ERNIE-Speed\"],\n \"bloomz_7b1\": QIANFAN_MODEL_TOKEN_COSTS[\"BLOOMZ-7B\"],\n \"llama_2_7b\": QIANFAN_MODEL_TOKEN_COSTS[\"Llama-2-7B-Chat\"],\n \"llama_2_13b\": QIANFAN_MODEL_TOKEN_COSTS[\"Llama-2-13B-Chat\"],\n \"llama_2_70b\": QIANFAN_MODEL_TOKEN_COSTS[\"Llama-2-70B-Chat\"],\n \"chatglm2_6b_32k\": QIANFAN_MODEL_TOKEN_COSTS[\"ChatGLM2-6B-32K\"],\n \"aquilachat_7b\": QIANFAN_MODEL_TOKEN_COSTS[\"AquilaChat-7B\"],\n \"mixtral_8x7b_instruct\": QIANFAN_MODEL_TOKEN_COSTS[\"Mixtral-8x7B-Instruct\"],\n \"sqlcoder_7b\": QIANFAN_MODEL_TOKEN_COSTS[\"SQLCoder-7B\"],\n \"codellama_7b_instruct\": QIANFAN_MODEL_TOKEN_COSTS[\"CodeLlama-7B-Instruct\"],\n \"xuanyuan_70b_chat\": QIANFAN_MODEL_TOKEN_COSTS[\"XuanYuan-70B-Chat-4bit\"],\n \"qianfan_bloomz_7b_compressed\": QIANFAN_MODEL_TOKEN_COSTS[\"Qianfan-BLOOMZ-7B-compressed\"],\n \"qianfan_chinese_llama_2_7b\": QIANFAN_MODEL_TOKEN_COSTS[\"Qianfan-Chinese-Llama-2-7B\"],\n \"qianfan_chinese_llama_2_13b\": QIANFAN_MODEL_TOKEN_COSTS[\"Qianfan-Chinese-Llama-2-13B\"],\n \"chatlaw\": QIANFAN_MODEL_TOKEN_COSTS[\"ChatLaw\"],\n \"yi_34b_chat\": QIANFAN_MODEL_TOKEN_COSTS[\"Yi-34B-Chat\"],\n}\n\n\"\"\"\nDashScope Token price https://help.aliyun.com/zh/dashscope/developer-reference/tongyi-thousand-questions-metering-and-billing\nDifferent model has different detail page. Attention, some model are free for a limited time.\nSome new model published by Alibaba will be prioritized to be released on the Model Studio instead of the Dashscope.\nToken price on Model Studio shows on https://help.aliyun.com/zh/model-studio/getting-started/models#ced16cb6cdfsy\n\"\"\"\nDASHSCOPE_TOKEN_COSTS = {\n \"qwen2.5-72b-instruct\": {\"prompt\": 0.00057, \"completion\": 0.0017}, # per 1k tokens\n \"qwen2.5-32b-instruct\": {\"prompt\": 0.0005, \"completion\": 0.001},\n \"qwen2.5-14b-instruct\": {\"prompt\": 0.00029, \"completion\": 0.00086},\n \"qwen2.5-7b-instruct\": {\"prompt\": 0.00014, \"completion\": 0.00029},\n \"qwen2.5-3b-instruct\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"qwen2.5-1.5b-instruct\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"qwen2.5-0.5b-instruct\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"qwen2-72b-instruct\": {\"prompt\": 0.000714, \"completion\": 0.001428},\n \"qwen2-57b-a14b-instruct\": {\"prompt\": 0.0005, \"completion\": 0.001},\n \"qwen2-7b-instruct\": {\"prompt\": 0.000143, \"completion\": 0.000286},\n \"qwen2-1.5b-instruct\": {\"prompt\": 0, \"completion\": 0},\n \"qwen2-0.5b-instruct\": {\"prompt\": 0, \"completion\": 0},\n \"qwen1.5-110b-chat\": {\"prompt\": 0.001, \"completion\": 0.002},\n \"qwen1.5-72b-chat\": {\"prompt\": 0.000714, \"completion\": 0.001428},\n \"qwen1.5-32b-chat\": {\"prompt\": 0.0005, \"completion\": 0.001},\n \"qwen1.5-14b-chat\": {\"prompt\": 0.000286, \"completion\": 0.000571},\n \"qwen1.5-7b-chat\": {\"prompt\": 0.000143, \"completion\": 0.000286},\n \"qwen1.5-1.8b-chat\": {\"prompt\": 0, \"completion\": 0},\n \"qwen1.5-0.5b-chat\": {\"prompt\": 0, \"completion\": 0},\n \"qwen-turbo\": {\"prompt\": 0.00028, \"completion\": 0.00083},\n \"qwen-long\": {\"prompt\": 0.00007, \"completion\": 0.00028},\n \"qwen-plus\": {\"prompt\": 0.00055, \"completion\": 0.00166},\n \"qwen-max\": {\"prompt\": 0.0055, \"completion\": 0.0166},\n \"qwen-max-0428\": {\"prompt\": 0.0055, \"completion\": 0.0166},\n \"qwen-max-0403\": {\"prompt\": 0.0055, \"completion\": 0.0166},\n \"qwen-max-0107\": {\"prompt\": 0.0055, \"completion\": 0.0166},\n \"qwen-max-1201\": {\"prompt\": 0.0166, \"completion\": 0.0166},\n \"qwen-max-longcontext\": {\"prompt\": 0.0055, \"completion\": 0.0166},\n \"llama2-7b-chat-v2\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"llama2-13b-chat-v2\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"qwen-72b-chat\": {\"prompt\": 0.0028, \"completion\": 0.0028},\n \"qwen-14b-chat\": {\"prompt\": 0.0011, \"completion\": 0.0011},\n \"qwen-7b-chat\": {\"prompt\": 0.00084, \"completion\": 0.00084},\n \"qwen-1.8b-chat\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"baichuan2-13b-chat-v1\": {\"prompt\": 0.0011, \"completion\": 0.0011},\n \"baichuan2-7b-chat-v1\": {\"prompt\": 0.00084, \"completion\": 0.00084},\n \"baichuan-7b-v1\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"chatglm-6b-v2\": {\"prompt\": 0.0011, \"completion\": 0.0011},\n \"chatglm3-6b\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"ziya-llama-13b-v1\": {\"prompt\": 0.0, \"completion\": 0.0}, # no price page, judge it as free\n \"dolly-12b-v2\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"belle-llama-13b-2m-v1\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"moss-moon-003-sft-v1\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"chatyuan-large-v2\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"billa-7b-sft-v1\": {\"prompt\": 0.0, \"completion\": 0.0},\n}\n\n\nFIREWORKS_GRADE_TOKEN_COSTS = {\n \"-1\": {\"prompt\": 0.0, \"completion\": 0.0}, # abnormal condition\n \"16\": {\"prompt\": 0.2, \"completion\": 0.8}, # 16 means model size <= 16B; 0.2 means $0.2/1M tokens\n \"80\": {\"prompt\": 0.7, \"completion\": 2.8}, # 80 means 16B < model size <= 80B\n \"mixtral-8x7b\": {\"prompt\": 0.4, \"completion\": 1.6},\n}\n\n# https://console.volcengine.com/ark/region:ark+cn-beijing/model\nDOUBAO_TOKEN_COSTS = {\n \"doubao-lite\": {\"prompt\": 0.000043, \"completion\": 0.000086},\n \"doubao-lite-128k\": {\"prompt\": 0.00011, \"completion\": 0.00014},\n \"doubao-pro\": {\"prompt\": 0.00011, \"completion\": 0.00029},\n \"doubao-pro-128k\": {\"prompt\": 0.00071, \"completion\": 0.0013},\n \"doubao-pro-256k\": {\"prompt\": 0.00071, \"completion\": 0.0013},\n}\n\n# https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo\nTOKEN_MAX = {\n \"o1-preview\": 128000,\n \"o1-preview-2024-09-12\": 128000,\n \"o1-mini\": 128000,\n \"o1-mini-2024-09-12\": 128000,\n \"gpt-4o\": 128000,\n \"gpt-4o-2024-05-13\": 128000,\n \"gpt-4o-2024-08-06\": 128000,\n \"gpt-4o-mini-2024-07-18\": 128000,\n \"gpt-4o-mini\": 128000,\n \"gpt-4-turbo-2024-04-09\": 128000,\n \"gpt-4-0125-preview\": 128000,\n \"gpt-4-turbo-preview\": 128000,\n \"gpt-4-1106-preview\": 128000,\n \"gpt-4-turbo\": 128000,\n \"gpt-4-vision-preview\": 128000,\n \"gpt-4-1106-vision-preview\": 128000,\n \"gpt-4\": 8192,\n \"gpt-4-0613\": 8192,\n \"gpt-4-32k\": 32768,\n \"gpt-4-32k-0613\": 32768,\n \"gpt-3.5-turbo-0125\": 16385,\n \"gpt-3.5-turbo\": 16385,\n \"gpt-3.5-turbo-1106\": 16385,\n \"gpt-3.5-turbo-instruct\": 4096,\n \"gpt-3.5-turbo-16k\": 16385,\n \"gpt-3.5-turbo-0613\": 4096,\n \"gpt-3.5-turbo-16k-0613\": 16385,\n \"text-embedding-ada-002\": 8192,\n \"glm-3-turbo\": 128000,\n \"glm-4\": 128000,\n \"gemini-1.5-flash\": 1000000,\n \"gemini-1.5-pro\": 2000000,\n \"gemini-1.0-pro\": 32000,\n \"moonshot-v1-8k\": 8192,\n \"moonshot-v1-32k\": 32768,\n \"moonshot-v1-128k\": 128000,\n \"open-mistral-7b\": 8192,\n \"open-mixtral-8x7b\": 32768,\n \"mistral-small-latest\": 32768,\n \"mistral-medium-latest\": 32768,\n \"mistral-large-latest\": 32768,\n \"claude-instant-1.2\": 100000,\n \"claude-2.0\": 100000,\n \"claude-2.1\": 200000,\n \"claude-3-sonnet-20240229\": 200000,\n \"claude-3-opus-20240229\": 200000,\n \"claude-3-5-sonnet-20240620\": 200000,\n \"claude-3-haiku-20240307\": 200000,\n \"yi-34b-chat-0205\": 4000,\n \"yi-34b-chat-200k\": 200000,\n \"openai/gpt-4\": 8192, # start, for openrouter\n \"openai/gpt-4-turbo\": 128000,\n \"openai/gpt-4o\": 128000,\n \"openai/gpt-4o-2024-05-13\": 128000,\n \"openai/gpt-4o-mini\": 128000,\n \"openai/gpt-4o-mini-2024-07-18\": 128000,\n \"google/gemini-flash-1.5\": 2800000,\n \"deepseek/deepseek-coder\": 128000,\n \"deepseek/deepseek-chat\": 128000, # end, for openrouter\n \"deepseek-chat\": 128000,\n \"deepseek-coder\": 128000,\n \"deepseek-ai/DeepSeek-Coder-V2-Instruct\": 32000, # siliconflow\n \"yi-large\": 16385,\n \"microsoft/wizardlm-2-8x22b\": 65536,\n \"meta-llama/llama-3-70b-instruct\": 8192,\n \"llama3-70b-8192\": 8192,\n \"openai/gpt-3.5-turbo-0125\": 16385,\n \"openai/gpt-4-turbo-preview\": 128000,\n \"openai/o1-preview\": 128000,\n \"openai/o1-mini\": 128000,\n \"anthropic/claude-3-opus\": 200000,\n \"anthropic/claude-3.5-sonnet\": 200000,\n \"google/gemini-pro-1.5\": 4000000,\n \"doubao-lite-4k-240515\": 4000,\n \"doubao-lite-32k-240515\": 32000,\n \"doubao-lite-128k-240515\": 128000,\n \"doubao-pro-4k-240515\": 4000,\n \"doubao-pro-32k-240515\": 32000,\n \"doubao-pro-128k-240515\": 128000,\n # Qwen https://help.aliyun.com/zh/dashscope/developer-reference/tongyi-qianwen-7b-14b-72b-api-detailes?spm=a2c4g.11186623.0.i20\n \"qwen2.5-72b-instruct\": 131072,\n \"qwen2.5-32b-instruct\": 131072,\n \"qwen2.5-14b-instruct\": 131072,\n \"qwen2.5-7b-instruct\": 131072,\n \"qwen2.5-3b-instruct\": 32768,\n \"qwen2.5-1.5b-instruct\": 32768,\n \"qwen2.5-0.5b-instruct\": 32768,\n \"qwen2-57b-a14b-instruct\": 32768,\n \"qwen2-72b-instruct\": 131072,\n \"qwen2-7b-instruct\": 32768,\n \"qwen2-1.5b-instruct\": 32768,\n \"qwen2-0.5b-instruct\": 32768,\n \"qwen1.5-110b-chat\": 32000,\n \"qwen1.5-72b-chat\": 32000,\n \"qwen1.5-32b-chat\": 32000,\n \"qwen1.5-14b-chat\": 8000,\n \"qwen1.5-7b-chat\": 32000,\n \"qwen1.5-1.8b-chat\": 32000,\n \"qwen1.5-0.5b-chat\": 32000,\n \"codeqwen1.5-7b-chat\": 64000,\n \"qwen-72b-chat\": 32000,\n \"qwen-14b-chat\": 8000,\n \"qwen-7b-chat\": 32000,\n \"qwen-1.8b-longcontext-chat\": 32000,\n \"qwen-1.8b-chat\": 8000,\n}\n\n# For Amazon Bedrock US region\n# See https://aws.amazon.com/cn/bedrock/pricing/\n\nBEDROCK_TOKEN_COSTS = {\n \"amazon.titan-tg1-large\": {\"prompt\": 0.0008, \"completion\": 0.0008},\n \"amazon.titan-text-express-v1\": {\"prompt\": 0.0008, \"completion\": 0.0008},\n \"amazon.titan-text-express-v1:0:8k\": {\"prompt\": 0.0008, \"completion\": 0.0008},\n \"amazon.titan-text-lite-v1:0:4k\": {\"prompt\": 0.0003, \"completion\": 0.0004},\n \"amazon.titan-text-lite-v1\": {\"prompt\": 0.0003, \"completion\": 0.0004},\n \"anthropic.claude-instant-v1\": {\"prompt\": 0.0008, \"completion\": 0.00024},\n \"anthropic.claude-instant-v1:2:100k\": {\"prompt\": 0.0008, \"completion\": 0.00024},\n \"anthropic.claude-v1\": {\"prompt\": 0.008, \"completion\": 0.0024},\n \"anthropic.claude-v2\": {\"prompt\": 0.008, \"completion\": 0.0024},\n \"anthropic.claude-v2:1\": {\"prompt\": 0.008, \"completion\": 0.0024},\n \"anthropic.claude-v2:0:18k\": {\"prompt\": 0.008, \"completion\": 0.0024},\n \"anthropic.claude-v2:1:200k\": {\"prompt\": 0.008, \"completion\": 0.0024},\n \"anthropic.claude-3-sonnet-20240229-v1:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic.claude-3-sonnet-20240229-v1:0:28k\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic.claude-3-sonnet-20240229-v1:0:200k\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic.claude-3-5-sonnet-20240620-v1:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic.claude-3-haiku-20240307-v1:0\": {\"prompt\": 0.00025, \"completion\": 0.00125},\n \"anthropic.claude-3-haiku-20240307-v1:0:48k\": {\"prompt\": 0.00025, \"completion\": 0.00125},\n \"anthropic.claude-3-haiku-20240307-v1:0:200k\": {\"prompt\": 0.00025, \"completion\": 0.00125},\n # currently (2024-4-29) only available at US West (Oregon) AWS Region.\n \"anthropic.claude-3-opus-20240229-v1:0\": {\"prompt\": 0.015, \"completion\": 0.075},\n \"anthropic.claude-3-5-sonnet-20241022-v2:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"us.anthropic.claude-3-5-sonnet-20241022-v2:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic.claude-3-7-sonnet-20250219-v1:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"us.anthropic.claude-3-7-sonnet-20250219-v1:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"cohere.command-text-v14\": {\"prompt\": 0.0015, \"completion\": 0.0015},\n \"cohere.command-text-v14:7:4k\": {\"prompt\": 0.0015, \"completion\": 0.0015},\n \"cohere.command-light-text-v14\": {\"prompt\": 0.0003, \"completion\": 0.0003},\n \"cohere.command-light-text-v14:7:4k\": {\"prompt\": 0.0003, \"completion\": 0.0003},\n \"meta.llama2-13b-chat-v1:0:4k\": {\"prompt\": 0.00075, \"completion\": 0.001},\n \"meta.llama2-13b-chat-v1\": {\"prompt\": 0.00075, \"completion\": 0.001},\n \"meta.llama2-70b-v1\": {\"prompt\": 0.00195, \"completion\": 0.00256},\n \"meta.llama2-70b-v1:0:4k\": {\"prompt\": 0.00195, \"completion\": 0.00256},\n \"meta.llama2-70b-chat-v1\": {\"prompt\": 0.00195, \"completion\": 0.00256},\n \"meta.llama2-70b-chat-v1:0:4k\": {\"prompt\": 0.00195, \"completion\": 0.00256},\n \"meta.llama3-8b-instruct-v1:0\": {\"prompt\": 0.0004, \"completion\": 0.0006},\n \"meta.llama3-70b-instruct-v1:0\": {\"prompt\": 0.00265, \"completion\": 0.0035},\n \"mistral.mistral-7b-instruct-v0:2\": {\"prompt\": 0.00015, \"completion\": 0.0002},\n \"mistral.mixtral-8x7b-instruct-v0:1\": {\"prompt\": 0.00045, \"completion\": 0.0007},\n \"mistral.mistral-large-2402-v1:0\": {\"prompt\": 0.008, \"completion\": 0.024},\n \"ai21.j2-grande-instruct\": {\"prompt\": 0.0125, \"completion\": 0.0125},\n \"ai21.j2-jumbo-instruct\": {\"prompt\": 0.0188, \"completion\": 0.0188},\n \"ai21.j2-mid\": {\"prompt\": 0.0125, \"completion\": 0.0125},\n \"ai21.j2-mid-v1\": {\"prompt\": 0.0125, \"completion\": 0.0125},\n \"ai21.j2-ultra\": {\"prompt\": 0.0188, \"completion\": 0.0188},\n \"ai21.j2-ultra-v1\": {\"prompt\": 0.0188, \"completion\": 0.0188},\n}\n\n# https://xinghuo.xfyun.cn/sparkapi?scr=price\nSPARK_TOKENS = {\n \"general\": {\"prompt\": 0.0, \"completion\": 0.0}, # Spark-Lite\n \"generalv2\": {\"prompt\": 0.0188, \"completion\": 0.0188}, # Spark V2.0\n \"generalv3\": {\"prompt\": 0.0035, \"completion\": 0.0035}, # Spark Pro\n \"generalv3.5\": {\"prompt\": 0.0035, \"completion\": 0.0035}, # Spark3.5 Max\n}\n\n\ndef count_claude_message_tokens(messages: list[dict], model: str) -> int:\n # rough estimation for models newer than claude-2.1, needs api_key or auth_token\n ac = anthropic.Client()\n system_prompt = \"\"\n new_messages = []\n for msg in messages:\n if msg.get(\"role\") == \"system\":\n system_prompt = msg.get(\"content\")\n else:\n new_messages.append(msg)\n num_tokens = ac.beta.messages.count_tokens(messages=new_messages, model=model, system=system_prompt)\n return num_tokens.input_tokens\n\n\ndef count_message_tokens(messages, model=\"gpt-3.5-turbo-0125\"):\n \"\"\"Return the number of tokens used by a list of messages.\"\"\"\n if \"claude\" in model:\n num_tokens = count_claude_message_tokens(messages, model)\n return num_tokens\n try:\n encoding = tiktoken.encoding_for_model(model)\n except KeyError:\n logger.info(f\"Warning: model {model} not found in tiktoken. Using cl100k_base encoding.\")\n encoding = tiktoken.get_encoding(\"cl100k_base\")\n if model in {\n \"gpt-3.5-turbo-0613\",\n \"gpt-3.5-turbo-16k-0613\",\n \"gpt-35-turbo\",\n \"gpt-35-turbo-16k\",\n \"gpt-3.5-turbo-16k\",\n \"gpt-3.5-turbo-1106\",\n \"gpt-3.5-turbo-0125\",\n \"gpt-4-0314\",\n \"gpt-4-32k-0314\",\n \"gpt-4-0613\",\n \"gpt-4-32k-0613\",\n \"gpt-4-turbo\",\n \"gpt-4-turbo-preview\",\n \"gpt-4-0125-preview\",\n \"gpt-4-1106-preview\",\n \"gpt-4-turbo\",\n \"gpt-4-vision-preview\",\n \"gpt-4-1106-vision-preview\",\n \"gpt-4o\",\n \"gpt-4o-2024-05-13\",\n \"gpt-4o-2024-08-06\",\n \"gpt-4o-mini\",\n \"gpt-4o-mini-2024-07-18\",\n \"o1-preview\",\n \"o1-preview-2024-09-12\",\n \"o1-mini\",\n \"o1-mini-2024-09-12\",\n }:\n tokens_per_message = 3 # # every reply is primed with <|start|>assistant<|message|>\n tokens_per_name = 1\n elif model == \"gpt-3.5-turbo-0301\":\n tokens_per_message = 4 # every message follows <|start|>{role/name}\\n{content}<|end|>\\n\n tokens_per_name = -1 # if there's a name, the role is omitted\n elif \"gpt-3.5-turbo\" == model:\n logger.info(\"Warning: gpt-3.5-turbo may update over time. Returning num tokens assuming gpt-3.5-turbo-0125.\")\n return count_message_tokens(messages, model=\"gpt-3.5-turbo-0125\")\n elif \"gpt-4\" == model:\n logger.info(\"Warning: gpt-4 may update over time. Returning num tokens assuming gpt-4-0613.\")\n return count_message_tokens(messages, model=\"gpt-4-0613\")\n elif \"open-llm-model\" == model:\n \"\"\"\n For self-hosted open_llm api, they include lots of different models. The message tokens calculation is\n inaccurate. It's a reference result.\n \"\"\"\n tokens_per_message = 0 # ignore conversation message template prefix\n tokens_per_name = 0\n else:\n raise NotImplementedError(\n f\"num_tokens_from_messages() is not implemented for model {model}. \"\n f\"See https://cookbook.openai.com/examples/how_to_count_tokens_with_tiktoken \"\n f\"for information on how messages are converted to tokens.\"\n )\n num_tokens = 0\n for message in messages:\n num_tokens += tokens_per_message\n for key, value in message.items():\n content = value\n if isinstance(value, list):\n # for gpt-4v\n for item in value:\n if isinstance(item, dict) and item.get(\"type\") in [\"text\"]:\n content = item.get(\"text\", \"\")\n num_tokens += len(encoding.encode(content))\n if key == \"name\":\n num_tokens += tokens_per_name\n num_tokens += 3 # every reply is primed with <|start|>assistant<|message|>\n return num_tokens\n\n\ndef count_output_tokens(string: str, model: str) -> int:\n \"\"\"\n Returns the number of tokens in a text string.\n\n Args:\n string (str): The text string.\n model (str): The name of the encoding to use. (e.g., \"gpt-3.5-turbo\")\n\n Returns:\n int: The number of tokens in the text string.\n \"\"\"\n if \"claude\" in model:\n messages = [{\"role\": \"assistant\", \"content\": string}]\n num_tokens = count_claude_message_tokens(messages, model)\n return num_tokens\n try:\n encoding = tiktoken.encoding_for_model(model)\n except KeyError:\n logger.info(f\"Warning: model {model} not found in tiktoken. Using cl100k_base encoding.\")\n encoding = tiktoken.get_encoding(\"cl100k_base\")\n return len(encoding.encode(string))\n\n\ndef get_max_completion_tokens(messages: list[dict], model: str, default: int) -> int:\n \"\"\"Calculate the maximum number of completion tokens for a given model and list of messages.\n\n Args:\n messages: A list of messages.\n model: The model name.\n\n Returns:\n The maximum number of completion tokens.\n \"\"\"\n if model not in TOKEN_MAX:\n return default\n return TOKEN_MAX[model] - count_message_tokens(messages, model) - 1\n"}, "30544fd08ce3d046f234d456466e39a5f5a6b12e": {"t": 1785764945.6835196, "n": 27691, "h": "5688f3a21f816255", "c": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\"\"\"\n@Time : 2023/5/18 00:40\n@Author : alexanderwu\n@File : token_counter.py\nref1: https://openai.com/pricing\nref2: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb\nref3: https://github.com/Significant-Gravitas/Auto-GPT/blob/master/autogpt/llm/token_counter.py\nref4: https://github.com/hwchase17/langchain/blob/master/langchain/chat_models/openai.py\nref5: https://ai.google.dev/models/gemini\n\"\"\"\nimport anthropic\nimport tiktoken\n\nfrom metagpt.logs import logger\n\nTOKEN_COSTS = {\n \"anthropic/claude-3.5-sonnet\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"gpt-3.5-turbo\": {\"prompt\": 0.0015, \"completion\": 0.002},\n \"gpt-3.5-turbo-0301\": {\"prompt\": 0.0015, \"completion\": 0.002},\n \"gpt-3.5-turbo-0613\": {\"prompt\": 0.0015, \"completion\": 0.002},\n \"gpt-3.5-turbo-16k\": {\"prompt\": 0.003, \"completion\": 0.004},\n \"gpt-3.5-turbo-16k-0613\": {\"prompt\": 0.003, \"completion\": 0.004},\n \"gpt-35-turbo\": {\"prompt\": 0.0015, \"completion\": 0.002},\n \"gpt-35-turbo-16k\": {\"prompt\": 0.003, \"completion\": 0.004},\n \"gpt-3.5-turbo-1106\": {\"prompt\": 0.001, \"completion\": 0.002},\n \"gpt-3.5-turbo-0125\": {\"prompt\": 0.001, \"completion\": 0.002},\n \"gpt-4-0314\": {\"prompt\": 0.03, \"completion\": 0.06},\n \"gpt-4\": {\"prompt\": 0.03, \"completion\": 0.06},\n \"gpt-4-32k\": {\"prompt\": 0.06, \"completion\": 0.12},\n \"gpt-4-32k-0314\": {\"prompt\": 0.06, \"completion\": 0.12},\n \"gpt-4-0613\": {\"prompt\": 0.06, \"completion\": 0.12},\n \"gpt-4-turbo-preview\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"gpt-4-1106-preview\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"gpt-4-0125-preview\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"gpt-4-turbo\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"gpt-4-turbo-2024-04-09\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"gpt-4-vision-preview\": {\"prompt\": 0.01, \"completion\": 0.03}, # TODO add extra image price calculator\n \"gpt-4-1106-vision-preview\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"gpt-4o\": {\"prompt\": 0.005, \"completion\": 0.015},\n \"gpt-4o-mini\": {\"prompt\": 0.00015, \"completion\": 0.0006},\n \"gpt-4o-mini-2024-07-18\": {\"prompt\": 0.00015, \"completion\": 0.0006},\n \"gpt-4o-2024-05-13\": {\"prompt\": 0.005, \"completion\": 0.015},\n \"gpt-4o-2024-08-06\": {\"prompt\": 0.0025, \"completion\": 0.01},\n \"o1-preview\": {\"prompt\": 0.015, \"completion\": 0.06},\n \"o1-preview-2024-09-12\": {\"prompt\": 0.015, \"completion\": 0.06},\n \"o1-mini\": {\"prompt\": 0.003, \"completion\": 0.012},\n \"o1-mini-2024-09-12\": {\"prompt\": 0.003, \"completion\": 0.012},\n \"text-embedding-ada-002\": {\"prompt\": 0.0004, \"completion\": 0.0},\n \"glm-3-turbo\": {\"prompt\": 0.0007, \"completion\": 0.0007}, # 128k version, prompt + completion tokens=0.005¥/k-tokens\n \"glm-4\": {\"prompt\": 0.014, \"completion\": 0.014}, # 128k version, prompt + completion tokens=0.1¥/k-tokens\n \"glm-4-flash\": {\"prompt\": 0, \"completion\": 0},\n \"glm-4-plus\": {\"prompt\": 0.007, \"completion\": 0.007},\n \"gemini-1.5-flash\": {\"prompt\": 0.000075, \"completion\": 0.0003},\n \"gemini-1.5-pro\": {\"prompt\": 0.0035, \"completion\": 0.0105},\n \"gemini-1.0-pro\": {\"prompt\": 0.0005, \"completion\": 0.0015},\n \"moonshot-v1-8k\": {\"prompt\": 0.012, \"completion\": 0.012}, # prompt + completion tokens=0.012¥/k-tokens\n \"moonshot-v1-32k\": {\"prompt\": 0.024, \"completion\": 0.024},\n \"moonshot-v1-128k\": {\"prompt\": 0.06, \"completion\": 0.06},\n \"open-mistral-7b\": {\"prompt\": 0.00025, \"completion\": 0.00025},\n \"open-mixtral-8x7b\": {\"prompt\": 0.0007, \"completion\": 0.0007},\n \"mistral-small-latest\": {\"prompt\": 0.002, \"completion\": 0.006},\n \"mistral-medium-latest\": {\"prompt\": 0.0027, \"completion\": 0.0081},\n \"mistral-large-latest\": {\"prompt\": 0.008, \"completion\": 0.024},\n \"claude-instant-1.2\": {\"prompt\": 0.0008, \"completion\": 0.0024},\n \"claude-2.0\": {\"prompt\": 0.008, \"completion\": 0.024},\n \"claude-2.1\": {\"prompt\": 0.008, \"completion\": 0.024},\n \"claude-3-sonnet-20240229\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"claude-3-5-sonnet\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"claude-3-5-sonnet-v2\": {\"prompt\": 0.003, \"completion\": 0.015}, # alias of newer 3.5 sonnet\n \"claude-3-5-sonnet-20240620\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"claude-3-opus-20240229\": {\"prompt\": 0.015, \"completion\": 0.075},\n \"claude-3-haiku-20240307\": {\"prompt\": 0.00025, \"completion\": 0.00125},\n \"claude-3-7-sonnet-20250219\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"yi-34b-chat-0205\": {\"prompt\": 0.0003, \"completion\": 0.0003},\n \"yi-34b-chat-200k\": {\"prompt\": 0.0017, \"completion\": 0.0017},\n \"openai/gpt-4\": {\"prompt\": 0.03, \"completion\": 0.06}, # start, for openrouter\n \"openai/gpt-4-turbo\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"openai/gpt-4o\": {\"prompt\": 0.005, \"completion\": 0.015},\n \"openai/gpt-4o-2024-05-13\": {\"prompt\": 0.005, \"completion\": 0.015},\n \"openai/gpt-4o-mini\": {\"prompt\": 0.00015, \"completion\": 0.0006},\n \"openai/gpt-4o-mini-2024-07-18\": {\"prompt\": 0.00015, \"completion\": 0.0006},\n \"google/gemini-flash-1.5\": {\"prompt\": 0.00025, \"completion\": 0.00075},\n \"deepseek/deepseek-coder\": {\"prompt\": 0.00014, \"completion\": 0.00028},\n \"deepseek/deepseek-chat\": {\"prompt\": 0.00014, \"completion\": 0.00028}, # end, for openrouter\n \"yi-large\": {\"prompt\": 0.0028, \"completion\": 0.0028},\n \"microsoft/wizardlm-2-8x22b\": {\"prompt\": 0.00108, \"completion\": 0.00108}, # for openrouter, start\n \"meta-llama/llama-3-70b-instruct\": {\"prompt\": 0.008, \"completion\": 0.008},\n \"llama3-70b-8192\": {\"prompt\": 0.0059, \"completion\": 0.0079},\n \"openai/gpt-3.5-turbo-0125\": {\"prompt\": 0.0005, \"completion\": 0.0015},\n \"openai/gpt-4-turbo-preview\": {\"prompt\": 0.01, \"completion\": 0.03},\n \"openai/o1-preview\": {\"prompt\": 0.015, \"completion\": 0.06},\n \"openai/o1-mini\": {\"prompt\": 0.003, \"completion\": 0.012},\n \"anthropic/claude-3-opus\": {\"prompt\": 0.015, \"completion\": 0.075},\n \"anthropic.claude-3-5-sonnet-20241022-v2:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"us.anthropic.claude-3-5-sonnet-20241022-v2:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic/claude-3.7-sonnet\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic/claude-3.7-sonnet:beta\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic/claude-3.7-sonnet:thinking\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic.claude-3-7-sonnet-20250219-v1:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"us.anthropic.claude-3-7-sonnet-20250219-v1:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"google/gemini-pro-1.5\": {\"prompt\": 0.0025, \"completion\": 0.0075}, # for openrouter, end\n \"deepseek-chat\": {\"prompt\": 0.00027, \"completion\": 0.0011},\n \"deepseek-coder\": {\"prompt\": 0.00027, \"completion\": 0.0011},\n \"deepseek-reasoner\": {\"prompt\": 0.00055, \"completion\": 0.0022},\n # For ark model https://www.volcengine.com/docs/82379/1099320\n \"doubao-lite-4k-240515\": {\"prompt\": 0.000043, \"completion\": 0.000086},\n \"doubao-lite-32k-240515\": {\"prompt\": 0.000043, \"completion\": 0.000086},\n \"doubao-lite-128k-240515\": {\"prompt\": 0.00011, \"completion\": 0.00014},\n \"doubao-pro-4k-240515\": {\"prompt\": 0.00011, \"completion\": 0.00029},\n \"doubao-pro-32k-240515\": {\"prompt\": 0.00011, \"completion\": 0.00029},\n \"doubao-pro-128k-240515\": {\"prompt\": 0.0007, \"completion\": 0.0013},\n \"llama3-70b-llama3-70b-instruct\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"llama3-8b-llama3-8b-instruct\": {\"prompt\": 0.0, \"completion\": 0.0},\n}\n\n\n\"\"\"\nQianFan Token Price https://cloud.baidu.com/doc/WENXINWORKSHOP/s/hlrk4akp7#tokens%E5%90%8E%E4%BB%98%E8%B4%B9\nDue to QianFan has multi price strategies, we unify `Tokens post-payment` as a statistical method.\n\"\"\"\nQIANFAN_MODEL_TOKEN_COSTS = {\n \"ERNIE-Bot-4\": {\"prompt\": 0.017, \"completion\": 0.017},\n \"ERNIE-Bot-8k\": {\"prompt\": 0.0034, \"completion\": 0.0067},\n \"ERNIE-Bot\": {\"prompt\": 0.0017, \"completion\": 0.0017},\n \"ERNIE-Bot-turbo\": {\"prompt\": 0.0011, \"completion\": 0.0011},\n \"EB-turbo-AppBuilder\": {\"prompt\": 0.0011, \"completion\": 0.0011},\n \"ERNIE-Speed\": {\"prompt\": 0.00056, \"completion\": 0.0011},\n \"BLOOMZ-7B\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"Llama-2-7B-Chat\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"Llama-2-13B-Chat\": {\"prompt\": 0.00084, \"completion\": 0.00084},\n \"Llama-2-70B-Chat\": {\"prompt\": 0.0049, \"completion\": 0.0049},\n \"ChatGLM2-6B-32K\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"AquilaChat-7B\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"Mixtral-8x7B-Instruct\": {\"prompt\": 0.0049, \"completion\": 0.0049},\n \"SQLCoder-7B\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"CodeLlama-7B-Instruct\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"XuanYuan-70B-Chat-4bit\": {\"prompt\": 0.0049, \"completion\": 0.0049},\n \"Qianfan-BLOOMZ-7B-compressed\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"Qianfan-Chinese-Llama-2-7B\": {\"prompt\": 0.00056, \"completion\": 0.00056},\n \"Qianfan-Chinese-Llama-2-13B\": {\"prompt\": 0.00084, \"completion\": 0.00084},\n \"ChatLaw\": {\"prompt\": 0.0011, \"completion\": 0.0011},\n \"Yi-34B-Chat\": {\"prompt\": 0.0, \"completion\": 0.0},\n}\n\nQIANFAN_ENDPOINT_TOKEN_COSTS = {\n \"completions_pro\": QIANFAN_MODEL_TOKEN_COSTS[\"ERNIE-Bot-4\"],\n \"ernie_bot_8k\": QIANFAN_MODEL_TOKEN_COSTS[\"ERNIE-Bot-8k\"],\n \"completions\": QIANFAN_MODEL_TOKEN_COSTS[\"ERNIE-Bot\"],\n \"eb-instant\": QIANFAN_MODEL_TOKEN_COSTS[\"ERNIE-Bot-turbo\"],\n \"ai_apaas\": QIANFAN_MODEL_TOKEN_COSTS[\"EB-turbo-AppBuilder\"],\n \"ernie_speed\": QIANFAN_MODEL_TOKEN_COSTS[\"ERNIE-Speed\"],\n \"bloomz_7b1\": QIANFAN_MODEL_TOKEN_COSTS[\"BLOOMZ-7B\"],\n \"llama_2_7b\": QIANFAN_MODEL_TOKEN_COSTS[\"Llama-2-7B-Chat\"],\n \"llama_2_13b\": QIANFAN_MODEL_TOKEN_COSTS[\"Llama-2-13B-Chat\"],\n \"llama_2_70b\": QIANFAN_MODEL_TOKEN_COSTS[\"Llama-2-70B-Chat\"],\n \"chatglm2_6b_32k\": QIANFAN_MODEL_TOKEN_COSTS[\"ChatGLM2-6B-32K\"],\n \"aquilachat_7b\": QIANFAN_MODEL_TOKEN_COSTS[\"AquilaChat-7B\"],\n \"mixtral_8x7b_instruct\": QIANFAN_MODEL_TOKEN_COSTS[\"Mixtral-8x7B-Instruct\"],\n \"sqlcoder_7b\": QIANFAN_MODEL_TOKEN_COSTS[\"SQLCoder-7B\"],\n \"codellama_7b_instruct\": QIANFAN_MODEL_TOKEN_COSTS[\"CodeLlama-7B-Instruct\"],\n \"xuanyuan_70b_chat\": QIANFAN_MODEL_TOKEN_COSTS[\"XuanYuan-70B-Chat-4bit\"],\n \"qianfan_bloomz_7b_compressed\": QIANFAN_MODEL_TOKEN_COSTS[\"Qianfan-BLOOMZ-7B-compressed\"],\n \"qianfan_chinese_llama_2_7b\": QIANFAN_MODEL_TOKEN_COSTS[\"Qianfan-Chinese-Llama-2-7B\"],\n \"qianfan_chinese_llama_2_13b\": QIANFAN_MODEL_TOKEN_COSTS[\"Qianfan-Chinese-Llama-2-13B\"],\n \"chatlaw\": QIANFAN_MODEL_TOKEN_COSTS[\"ChatLaw\"],\n \"yi_34b_chat\": QIANFAN_MODEL_TOKEN_COSTS[\"Yi-34B-Chat\"],\n}\n\n\"\"\"\nDashScope Token price https://help.aliyun.com/zh/dashscope/developer-reference/tongyi-thousand-questions-metering-and-billing\nDifferent model has different detail page. Attention, some model are free for a limited time.\nSome new model published by Alibaba will be prioritized to be released on the Model Studio instead of the Dashscope.\nToken price on Model Studio shows on https://help.aliyun.com/zh/model-studio/getting-started/models#ced16cb6cdfsy\n\"\"\"\nDASHSCOPE_TOKEN_COSTS = {\n \"qwen2.5-72b-instruct\": {\"prompt\": 0.00057, \"completion\": 0.0017}, # per 1k tokens\n \"qwen2.5-32b-instruct\": {\"prompt\": 0.0005, \"completion\": 0.001},\n \"qwen2.5-14b-instruct\": {\"prompt\": 0.00029, \"completion\": 0.00086},\n \"qwen2.5-7b-instruct\": {\"prompt\": 0.00014, \"completion\": 0.00029},\n \"qwen2.5-3b-instruct\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"qwen2.5-1.5b-instruct\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"qwen2.5-0.5b-instruct\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"qwen2-72b-instruct\": {\"prompt\": 0.000714, \"completion\": 0.001428},\n \"qwen2-57b-a14b-instruct\": {\"prompt\": 0.0005, \"completion\": 0.001},\n \"qwen2-7b-instruct\": {\"prompt\": 0.000143, \"completion\": 0.000286},\n \"qwen2-1.5b-instruct\": {\"prompt\": 0, \"completion\": 0},\n \"qwen2-0.5b-instruct\": {\"prompt\": 0, \"completion\": 0},\n \"qwen1.5-110b-chat\": {\"prompt\": 0.001, \"completion\": 0.002},\n \"qwen1.5-72b-chat\": {\"prompt\": 0.000714, \"completion\": 0.001428},\n \"qwen1.5-32b-chat\": {\"prompt\": 0.0005, \"completion\": 0.001},\n \"qwen1.5-14b-chat\": {\"prompt\": 0.000286, \"completion\": 0.000571},\n \"qwen1.5-7b-chat\": {\"prompt\": 0.000143, \"completion\": 0.000286},\n \"qwen1.5-1.8b-chat\": {\"prompt\": 0, \"completion\": 0},\n \"qwen1.5-0.5b-chat\": {\"prompt\": 0, \"completion\": 0},\n \"qwen-turbo\": {\"prompt\": 0.00028, \"completion\": 0.00083},\n \"qwen-long\": {\"prompt\": 0.00007, \"completion\": 0.00028},\n \"qwen-plus\": {\"prompt\": 0.00055, \"completion\": 0.00166},\n \"qwen-max\": {\"prompt\": 0.0055, \"completion\": 0.0166},\n \"qwen-max-0428\": {\"prompt\": 0.0055, \"completion\": 0.0166},\n \"qwen-max-0403\": {\"prompt\": 0.0055, \"completion\": 0.0166},\n \"qwen-max-0107\": {\"prompt\": 0.0055, \"completion\": 0.0166},\n \"qwen-max-1201\": {\"prompt\": 0.0166, \"completion\": 0.0166},\n \"qwen-max-longcontext\": {\"prompt\": 0.0055, \"completion\": 0.0166},\n \"llama2-7b-chat-v2\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"llama2-13b-chat-v2\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"qwen-72b-chat\": {\"prompt\": 0.0028, \"completion\": 0.0028},\n \"qwen-14b-chat\": {\"prompt\": 0.0011, \"completion\": 0.0011},\n \"qwen-7b-chat\": {\"prompt\": 0.00084, \"completion\": 0.00084},\n \"qwen-1.8b-chat\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"baichuan2-13b-chat-v1\": {\"prompt\": 0.0011, \"completion\": 0.0011},\n \"baichuan2-7b-chat-v1\": {\"prompt\": 0.00084, \"completion\": 0.00084},\n \"baichuan-7b-v1\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"chatglm-6b-v2\": {\"prompt\": 0.0011, \"completion\": 0.0011},\n \"chatglm3-6b\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"ziya-llama-13b-v1\": {\"prompt\": 0.0, \"completion\": 0.0}, # no price page, judge it as free\n \"dolly-12b-v2\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"belle-llama-13b-2m-v1\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"moss-moon-003-sft-v1\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"chatyuan-large-v2\": {\"prompt\": 0.0, \"completion\": 0.0},\n \"billa-7b-sft-v1\": {\"prompt\": 0.0, \"completion\": 0.0},\n}\n\n\nFIREWORKS_GRADE_TOKEN_COSTS = {\n \"-1\": {\"prompt\": 0.0, \"completion\": 0.0}, # abnormal condition\n \"16\": {\"prompt\": 0.2, \"completion\": 0.8}, # 16 means model size <= 16B; 0.2 means $0.2/1M tokens\n \"80\": {\"prompt\": 0.7, \"completion\": 2.8}, # 80 means 16B < model size <= 80B\n \"mixtral-8x7b\": {\"prompt\": 0.4, \"completion\": 1.6},\n}\n\n# https://console.volcengine.com/ark/region:ark+cn-beijing/model\nDOUBAO_TOKEN_COSTS = {\n \"doubao-lite\": {\"prompt\": 0.000043, \"completion\": 0.000086},\n \"doubao-lite-128k\": {\"prompt\": 0.00011, \"completion\": 0.00014},\n \"doubao-pro\": {\"prompt\": 0.00011, \"completion\": 0.00029},\n \"doubao-pro-128k\": {\"prompt\": 0.00071, \"completion\": 0.0013},\n \"doubao-pro-256k\": {\"prompt\": 0.00071, \"completion\": 0.0013},\n}\n\n# https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo\nTOKEN_MAX = {\n \"o1-preview\": 128000,\n \"o1-preview-2024-09-12\": 128000,\n \"o1-mini\": 128000,\n \"o1-mini-2024-09-12\": 128000,\n \"gpt-4o\": 128000,\n \"gpt-4o-2024-05-13\": 128000,\n \"gpt-4o-2024-08-06\": 128000,\n \"gpt-4o-mini-2024-07-18\": 128000,\n \"gpt-4o-mini\": 128000,\n \"gpt-4-turbo-2024-04-09\": 128000,\n \"gpt-4-0125-preview\": 128000,\n \"gpt-4-turbo-preview\": 128000,\n \"gpt-4-1106-preview\": 128000,\n \"gpt-4-turbo\": 128000,\n \"gpt-4-vision-preview\": 128000,\n \"gpt-4-1106-vision-preview\": 128000,\n \"gpt-4\": 8192,\n \"gpt-4-0613\": 8192,\n \"gpt-4-32k\": 32768,\n \"gpt-4-32k-0613\": 32768,\n \"gpt-3.5-turbo-0125\": 16385,\n \"gpt-3.5-turbo\": 16385,\n \"gpt-3.5-turbo-1106\": 16385,\n \"gpt-3.5-turbo-instruct\": 4096,\n \"gpt-3.5-turbo-16k\": 16385,\n \"gpt-3.5-turbo-0613\": 4096,\n \"gpt-3.5-turbo-16k-0613\": 16385,\n \"text-embedding-ada-002\": 8192,\n \"glm-3-turbo\": 128000,\n \"glm-4\": 128000,\n \"gemini-1.5-flash\": 1000000,\n \"gemini-1.5-pro\": 2000000,\n \"gemini-1.0-pro\": 32000,\n \"moonshot-v1-8k\": 8192,\n \"moonshot-v1-32k\": 32768,\n \"moonshot-v1-128k\": 128000,\n \"open-mistral-7b\": 8192,\n \"open-mixtral-8x7b\": 32768,\n \"mistral-small-latest\": 32768,\n \"mistral-medium-latest\": 32768,\n \"mistral-large-latest\": 32768,\n \"claude-instant-1.2\": 100000,\n \"claude-2.0\": 100000,\n \"claude-2.1\": 200000,\n \"claude-3-sonnet-20240229\": 200000,\n \"claude-3-opus-20240229\": 200000,\n \"claude-3-5-sonnet-20240620\": 200000,\n \"claude-3-haiku-20240307\": 200000,\n \"yi-34b-chat-0205\": 4000,\n \"yi-34b-chat-200k\": 200000,\n \"openai/gpt-4\": 8192, # start, for openrouter\n \"openai/gpt-4-turbo\": 128000,\n \"openai/gpt-4o\": 128000,\n \"openai/gpt-4o-2024-05-13\": 128000,\n \"openai/gpt-4o-mini\": 128000,\n \"openai/gpt-4o-mini-2024-07-18\": 128000,\n \"google/gemini-flash-1.5\": 2800000,\n \"deepseek/deepseek-coder\": 128000,\n \"deepseek/deepseek-chat\": 128000, # end, for openrouter\n \"deepseek-chat\": 128000,\n \"deepseek-coder\": 128000,\n \"deepseek-ai/DeepSeek-Coder-V2-Instruct\": 32000, # siliconflow\n \"yi-large\": 16385,\n \"microsoft/wizardlm-2-8x22b\": 65536,\n \"meta-llama/llama-3-70b-instruct\": 8192,\n \"llama3-70b-8192\": 8192,\n \"openai/gpt-3.5-turbo-0125\": 16385,\n \"openai/gpt-4-turbo-preview\": 128000,\n \"openai/o1-preview\": 128000,\n \"openai/o1-mini\": 128000,\n \"anthropic/claude-3-opus\": 200000,\n \"anthropic/claude-3.5-sonnet\": 200000,\n \"google/gemini-pro-1.5\": 4000000,\n \"doubao-lite-4k-240515\": 4000,\n \"doubao-lite-32k-240515\": 32000,\n \"doubao-lite-128k-240515\": 128000,\n \"doubao-pro-4k-240515\": 4000,\n \"doubao-pro-32k-240515\": 32000,\n \"doubao-pro-128k-240515\": 128000,\n # Qwen https://help.aliyun.com/zh/dashscope/developer-reference/tongyi-qianwen-7b-14b-72b-api-detailes?spm=a2c4g.11186623.0.i20\n \"qwen2.5-72b-instruct\": 131072,\n \"qwen2.5-32b-instruct\": 131072,\n \"qwen2.5-14b-instruct\": 131072,\n \"qwen2.5-7b-instruct\": 131072,\n \"qwen2.5-3b-instruct\": 32768,\n \"qwen2.5-1.5b-instruct\": 32768,\n \"qwen2.5-0.5b-instruct\": 32768,\n \"qwen2-57b-a14b-instruct\": 32768,\n \"qwen2-72b-instruct\": 131072,\n \"qwen2-7b-instruct\": 32768,\n \"qwen2-1.5b-instruct\": 32768,\n \"qwen2-0.5b-instruct\": 32768,\n \"qwen1.5-110b-chat\": 32000,\n \"qwen1.5-72b-chat\": 32000,\n \"qwen1.5-32b-chat\": 32000,\n \"qwen1.5-14b-chat\": 8000,\n \"qwen1.5-7b-chat\": 32000,\n \"qwen1.5-1.8b-chat\": 32000,\n \"qwen1.5-0.5b-chat\": 32000,\n \"codeqwen1.5-7b-chat\": 64000,\n \"qwen-72b-chat\": 32000,\n \"qwen-14b-chat\": 8000,\n \"qwen-7b-chat\": 32000,\n \"qwen-1.8b-longcontext-chat\": 32000,\n \"qwen-1.8b-chat\": 8000,\n}\n\n# For Amazon Bedrock US region\n# See https://aws.amazon.com/cn/bedrock/pricing/\n\nBEDROCK_TOKEN_COSTS = {\n \"amazon.titan-tg1-large\": {\"prompt\": 0.0008, \"completion\": 0.0008},\n \"amazon.titan-text-express-v1\": {\"prompt\": 0.0008, \"completion\": 0.0008},\n \"amazon.titan-text-express-v1:0:8k\": {\"prompt\": 0.0008, \"completion\": 0.0008},\n \"amazon.titan-text-lite-v1:0:4k\": {\"prompt\": 0.0003, \"completion\": 0.0004},\n \"amazon.titan-text-lite-v1\": {\"prompt\": 0.0003, \"completion\": 0.0004},\n \"anthropic.claude-instant-v1\": {\"prompt\": 0.0008, \"completion\": 0.00024},\n \"anthropic.claude-instant-v1:2:100k\": {\"prompt\": 0.0008, \"completion\": 0.00024},\n \"anthropic.claude-v1\": {\"prompt\": 0.008, \"completion\": 0.0024},\n \"anthropic.claude-v2\": {\"prompt\": 0.008, \"completion\": 0.0024},\n \"anthropic.claude-v2:1\": {\"prompt\": 0.008, \"completion\": 0.0024},\n \"anthropic.claude-v2:0:18k\": {\"prompt\": 0.008, \"completion\": 0.0024},\n \"anthropic.claude-v2:1:200k\": {\"prompt\": 0.008, \"completion\": 0.0024},\n \"anthropic.claude-3-sonnet-20240229-v1:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic.claude-3-sonnet-20240229-v1:0:28k\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic.claude-3-sonnet-20240229-v1:0:200k\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic.claude-3-5-sonnet-20240620-v1:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic.claude-3-haiku-20240307-v1:0\": {\"prompt\": 0.00025, \"completion\": 0.00125},\n \"anthropic.claude-3-haiku-20240307-v1:0:48k\": {\"prompt\": 0.00025, \"completion\": 0.00125},\n \"anthropic.claude-3-haiku-20240307-v1:0:200k\": {\"prompt\": 0.00025, \"completion\": 0.00125},\n # currently (2024-4-29) only available at US West (Oregon) AWS Region.\n \"anthropic.claude-3-opus-20240229-v1:0\": {\"prompt\": 0.015, \"completion\": 0.075},\n \"anthropic.claude-3-5-sonnet-20241022-v2:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"us.anthropic.claude-3-5-sonnet-20241022-v2:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"anthropic.claude-3-7-sonnet-20250219-v1:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"us.anthropic.claude-3-7-sonnet-20250219-v1:0\": {\"prompt\": 0.003, \"completion\": 0.015},\n \"cohere.command-text-v14\": {\"prompt\": 0.0015, \"completion\": 0.0015},\n \"cohere.command-text-v14:7:4k\": {\"prompt\": 0.0015, \"completion\": 0.0015},\n \"cohere.command-light-text-v14\": {\"prompt\": 0.0003, \"completion\": 0.0003},\n \"cohere.command-light-text-v14:7:4k\": {\"prompt\": 0.0003, \"completion\": 0.0003},\n \"meta.llama2-13b-chat-v1:0:4k\": {\"prompt\": 0.00075, \"completion\": 0.001},\n \"meta.llama2-13b-chat-v1\": {\"prompt\": 0.00075, \"completion\": 0.001},\n \"meta.llama2-70b-v1\": {\"prompt\": 0.00195, \"completion\": 0.00256},\n \"meta.llama2-70b-v1:0:4k\": {\"prompt\": 0.00195, \"completion\": 0.00256},\n \"meta.llama2-70b-chat-v1\": {\"prompt\": 0.00195, \"completion\": 0.00256},\n \"meta.llama2-70b-chat-v1:0:4k\": {\"prompt\": 0.00195, \"completion\": 0.00256},\n \"meta.llama3-8b-instruct-v1:0\": {\"prompt\": 0.0004, \"completion\": 0.0006},\n \"meta.llama3-70b-instruct-v1:0\": {\"prompt\": 0.00265, \"completion\": 0.0035},\n \"mistral.mistral-7b-instruct-v0:2\": {\"prompt\": 0.00015, \"completion\": 0.0002},\n \"mistral.mixtral-8x7b-instruct-v0:1\": {\"prompt\": 0.00045, \"completion\": 0.0007},\n \"mistral.mistral-large-2402-v1:0\": {\"prompt\": 0.008, \"completion\": 0.024},\n \"ai21.j2-grande-instruct\": {\"prompt\": 0.0125, \"completion\": 0.0125},\n \"ai21.j2-jumbo-instruct\": {\"prompt\": 0.0188, \"completion\": 0.0188},\n \"ai21.j2-mid\": {\"prompt\": 0.0125, \"completion\": 0.0125},\n \"ai21.j2-mid-v1\": {\"prompt\": 0.0125, \"completion\": 0.0125},\n \"ai21.j2-ultra\": {\"prompt\": 0.0188, \"completion\": 0.0188},\n \"ai21.j2-ultra-v1\": {\"prompt\": 0.0188, \"completion\": 0.0188},\n}\n\n# https://xinghuo.xfyun.cn/sparkapi?scr=price\nSPARK_TOKENS = {\n \"general\": {\"prompt\": 0.0, \"completion\": 0.0}, # Spark-Lite\n \"generalv2\": {\"prompt\": 0.0188, \"completion\": 0.0188}, # Spark V2.0\n \"generalv3\": {\"prompt\": 0.0035, \"completion\": 0.0035}, # Spark Pro\n \"generalv3.5\": {\"prompt\": 0.0035, \"completion\": 0.0035}, # Spark3.5 Max\n}\n\n\ndef count_claude_message_tokens(messages: list[dict], model: str) -> int:\n # rough estimation for models newer than claude-2.1, needs api_key or auth_token\n ac = anthropic.Client()\n system_prompt = \"\"\n new_messages = []\n for msg in messages:\n if msg.get(\"role\") == \"system\":\n system_prompt = msg.get(\"content\")\n else:\n new_messages.append(msg)\n num_tokens = ac.beta.messages.count_tokens(messages=new_messages, model=model, system=system_prompt)\n return num_tokens.input_tokens\n\n\ndef count_message_tokens(messages, model=\"gpt-3.5-turbo-0125\"):\n \"\"\"Return the number of tokens used by a list of messages.\"\"\"\n if \"claude\" in model:\n num_tokens = count_claude_message_tokens(messages, model)\n return num_tokens\n try:\n encoding = tiktoken.encoding_for_model(model)\n except KeyError:\n logger.info(f\"Warning: model {model} not found in tiktoken. Using cl100k_base encoding.\")\n encoding = tiktoken.get_encoding(\"cl100k_base\")\n if model in {\n \"gpt-3.5-turbo-0613\",\n \"gpt-3.5-turbo-16k-0613\",\n \"gpt-35-turbo\",\n \"gpt-35-turbo-16k\",\n \"gpt-3.5-turbo-16k\",\n \"gpt-3.5-turbo-1106\",\n \"gpt-3.5-turbo-0125\",\n \"gpt-4-0314\",\n \"gpt-4-32k-0314\",\n \"gpt-4-0613\",\n \"gpt-4-32k-0613\",\n \"gpt-4-turbo\",\n \"gpt-4-turbo-preview\",\n \"gpt-4-0125-preview\",\n \"gpt-4-1106-preview\",\n \"gpt-4-turbo\",\n \"gpt-4-vision-preview\",\n \"gpt-4-1106-vision-preview\",\n \"gpt-4o\",\n \"gpt-4o-2024-05-13\",\n \"gpt-4o-2024-08-06\",\n \"gpt-4o-mini\",\n \"gpt-4o-mini-2024-07-18\",\n \"o1-preview\",\n \"o1-preview-2024-09-12\",\n \"o1-mini\",\n \"o1-mini-2024-09-12\",\n }:\n tokens_per_message = 3 # # every reply is primed with <|start|>assistant<|message|>\n tokens_per_name = 1\n elif model == \"gpt-3.5-turbo-0301\":\n tokens_per_message = 4 # every message follows <|start|>{role/name}\\n{content}<|end|>\\n\n tokens_per_name = -1 # if there's a name, the role is omitted\n elif \"gpt-3.5-turbo\" == model:\n logger.info(\"Warning: gpt-3.5-turbo may update over time. Returning num tokens assuming gpt-3.5-turbo-0125.\")\n return count_message_tokens(messages, model=\"gpt-3.5-turbo-0125\")\n elif \"gpt-4\" == model:\n logger.info(\"Warning: gpt-4 may update over time. Returning num tokens assuming gpt-4-0613.\")\n return count_message_tokens(messages, model=\"gpt-4-0613\")\n elif \"open-llm-model\" == model:\n \"\"\"\n For self-hosted open_llm api, they include lots of different models. The message tokens calculation is\n inaccurate. It's a reference result.\n \"\"\"\n tokens_per_message = 0 # ignore conversation message template prefix\n tokens_per_name = 0\n else:\n raise NotImplementedError(\n f\"num_tokens_from_messages() is not implemented for model {model}. \"\n f\"See https://cookbook.openai.com/examples/how_to_count_tokens_with_tiktoken \"\n f\"for information on how messages are converted to tokens.\"\n )\n num_tokens = 0\n for message in messages:\n num_tokens += tokens_per_message\n for key, value in message.items():\n content = value\n if isinstance(value, list):\n # for gpt-4v\n for item in value:\n if isinstance(item, dict) and item.get(\"type\") in [\"text\"]:\n content = item.get(\"text\", \"\")\n num_tokens += len(encoding.encode(content))\n if key == \"name\":\n num_tokens += tokens_per_name\n num_tokens += 3 # every reply is primed with <|start|>assistant<|message|>\n return num_tokens\n\n\ndef count_output_tokens(string: str, model: str) -> int:\n \"\"\"\n Returns the number of tokens in a text string.\n\n Args:\n string (str): The text string.\n model (str): The name of the encoding to use. (e.g., \"gpt-3.5-turbo\")\n\n Returns:\n int: The number of tokens in the text string.\n \"\"\"\n if \"claude\" in model:\n messages = [{\"role\": \"assistant\", \"content\": string}]\n num_tokens = count_claude_message_tokens(messages, model)\n return num_tokens\n try:\n encoding = tiktoken.encoding_for_model(model)\n except KeyError:\n logger.info(f\"Warning: model {model} not found in tiktoken. Using cl100k_base encoding.\")\n encoding = tiktoken.get_encoding(\"cl100k_base\")\n return len(encoding.encode(string))\n\n\ndef get_max_completion_tokens(messages: list[dict], model: str, default: int) -> int:\n \"\"\"Calculate the maximum number of completion tokens for a given model and list of messages.\n\n Args:\n messages: A list of messages.\n model: The model name.\n\n Returns:\n The maximum number of completion tokens.\n \"\"\"\n if model not in TOKEN_MAX:\n return default\n return TOKEN_MAX[model] - count_message_tokens(messages, model) - 1\n"}}}}