Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/allwefantasy_auto-coder.json
T

1 line
93 KiB
JSON

{"repo": "allwefantasy/auto-coder", "files": {"src/autocoder/utils/model_provider_selector.py": {"bf7af36ab69a6458f298fdec694cff999082f1b1": {"t": 1785674277.3809829, "n": 8102, "h": "9f215805e6d5f8fe", "c": "from prompt_toolkit.shortcuts import radiolist_dialog, input_dialog\nfrom prompt_toolkit.validation import Validator, ValidationError\nfrom prompt_toolkit.styles import Style\nfrom rich.console import Console\nfrom typing import Optional, Dict, Any, List\nfrom autocoder.common.printer import Printer\nimport re\nfrom pydantic import BaseModel\n\nfrom autocoder.models import process_api_key_path\n\nclass ProviderInfo(BaseModel):\n name: str\n endpoint: str\n r1_model: str\n v3_model: str\n api_key: str\n r1_input_price: float\n r1_output_price: float\n v3_input_price: float\n v3_output_price: float \n\n\nPROVIDER_INFO_LIST = [\n ProviderInfo(\n name=\"volcano\",\n endpoint=\"https://ark.cn-beijing.volces.com/api/v3\", \n r1_model=\"deepseek-r1-250120\",\n v3_model=\"deepseek-v3-250324\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=8.0,\n v3_input_price=1.0,\n v3_output_price=4.0,\n ), \n ProviderInfo(\n name=\"siliconflow\",\n endpoint=\"https://api.siliconflow.cn/v1\", \n r1_model=\"Pro/deepseek-ai/DeepSeek-R1\",\n v3_model=\"Pro/deepseek-ai/DeepSeek-V3\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=4.0,\n v3_input_price=4.0,\n v3_output_price=16.0,\n ),\n ProviderInfo(\n name=\"deepseek\",\n endpoint=\"https://api.deepseek.com/v1\",\n r1_model=\"deepseek-reasoner\",\n v3_model=\"deepseek-chat\",\n api_key=\"\",\n r1_input_price=4.0,\n r1_output_price=16.0,\n v3_input_price=2.0,\n v3_output_price=8.0,\n ),\n ProviderInfo(\n name=\"openrouter\",\n endpoint=\"https://openrouter.ai/api/v1\",\n r1_model=\"deepseek/deepseek-r1\",\n v3_model=\"deepseek/deepseek-chat-v3-0324\",\n api_key=\"\",\n r1_input_price=0.0,\n r1_output_price=0.0,\n v3_input_price=0.0,\n v3_output_price=0.0,\n )\n]\n\ndialog_style = Style.from_dict({\n 'dialog': 'bg:#2b2b2b',\n 'dialog frame.label': 'bg:#2b2b2b #ffffff',\n 'dialog.body': 'bg:#2b2b2b #ffffff',\n 'dialog shadow': 'bg:#1f1f1f',\n 'button': 'bg:#2b2b2b #808080',\n 'button.focused': 'bg:#1e1e1e #ffd700 bold',\n 'checkbox': '#e6e6e6',\n 'checkbox-selected': '#0078d4',\n 'radio-selected': 'bg:#0078d4 #ffffff',\n 'dialog frame.border': '#0078d4',\n 'radio': 'bg:#2b2b2b #808080',\n 'radio.focused': 'bg:#1e1e1e #ffd700 bold'\n })\n\nclass VolcanoEndpointValidator(Validator):\n def validate(self, document):\n text = document.text\n pattern = r'^ep-\\d{14}-[a-z0-9]{5}$'\n if not re.match(pattern, text):\n raise ValidationError(\n message='Invalid endpoint format. Should be like: ep-20250204215011-vzbsg',\n cursor_position=len(text)\n )\n\nclass ModelProviderSelector:\n def __init__(self):\n self.printer = Printer()\n self.console = Console()\n\n def to_models_json(self, provider_info: ProviderInfo) -> List[Dict[str, Any]]:\n \"\"\"\n Convert provider info to models.json format.\n Returns a list of model configurations matching the format in models.py default_models_list.\n \n Args:\n provider_info: ProviderInfo object containing provider details\n \n Returns:\n List[Dict[str, Any]]: List of model configurations\n \"\"\"\n models = []\n \n # Add R1 model (for reasoning/design/review)\n if provider_info.r1_model:\n models.append({\n \"name\": f\"r1_chat\",\n \"description\": f\"{provider_info.name} R1 is for design/review\",\n \"model_name\": provider_info.r1_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"r1_chat\",\n \"is_reasoning\": True,\n \"input_price\": provider_info.r1_input_price,\n \"output_price\": provider_info.r1_output_price,\n \"average_speed\": 0.0\n })\n \n # Add V3 model (for coding)\n if provider_info.v3_model:\n models.append({\n \"name\": f\"v3_chat\",\n \"description\": f\"{provider_info.name} Chat is for coding\",\n \"model_name\": provider_info.v3_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"v3_chat\",\n \"is_reasoning\": False,\n \"input_price\": provider_info.v3_input_price,\n \"output_price\": provider_info.v3_output_price,\n \"average_speed\": 0.0\n })\n \n return models\n \n def select_provider(self) -> Optional[Dict[str, Any]]:\n \"\"\"\n Let user select a model provider and input necessary credentials.\n Returns a dictionary with provider info or None if cancelled.\n \"\"\"\n \n\n result = radiolist_dialog(\n title=self.printer.get_message_from_key(\"model_provider_select_title\"),\n text=self.printer.get_message_from_key(\"model_provider_select_text\"),\n values=[\n (\"volcano\", self.printer.get_message_from_key(\"model_provider_volcano\")),\n (\"siliconflow\", self.printer.get_message_from_key(\"model_provider_siliconflow\")),\n (\"deepseek\", self.printer.get_message_from_key(\"model_provider_deepseek\")),\n (\"openrouter\", self.printer.get_message_from_key(\"model_provider_openrouter\"))\n ],\n style=dialog_style\n ).run()\n \n if result is None:\n return None\n\n \n provider_info = None\n for provider in PROVIDER_INFO_LIST:\n if provider.name == result:\n provider_info = provider\n break\n \n # if result == \"volcano\":\n # # Get R1 endpoint\n # r1_endpoint = input_dialog(\n # title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n # text=self.printer.get_message_from_key(\"model_provider_volcano_r1_text\"),\n # validator=VolcanoEndpointValidator(),\n # style=dialog_style\n # ).run()\n \n # if r1_endpoint is None:\n # return None\n \n # provider_info.r1_model = r1_endpoint\n \n # # Get V3 endpoint\n # v3_endpoint = input_dialog(\n # title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n # text=self.printer.get_message_from_key(\"model_provider_volcano_v3_text\"),\n # validator=VolcanoEndpointValidator(),\n # style=dialog_style\n # ).run()\n \n # if v3_endpoint is None:\n # return None\n \n # provider_info.v3_model = v3_endpoint\n \n # Get API key for all providers\n api_key = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(f\"model_provider_{result}_api_key_text\"),\n password=True,\n style=dialog_style\n ).run()\n \n if api_key is None:\n return None\n \n provider_info.api_key = api_key\n \n self.printer.print_panel(\n self.printer.get_message_from_key(\"model_provider_selected\"),\n text_options={\"justify\": \"left\"},\n panel_options={\n \"title\": self.printer.get_message_from_key(\"model_provider_success_title\"),\n \"border_style\": \"green\"\n }\n )\n \n return provider_info"}, "122e039562b29c3b44e3519418f2d9f9fca1f23c": {"t": 1785758529.1993392, "n": 8102, "h": "9f215805e6d5f8fe", "c": "from prompt_toolkit.shortcuts import radiolist_dialog, input_dialog\nfrom prompt_toolkit.validation import Validator, ValidationError\nfrom prompt_toolkit.styles import Style\nfrom rich.console import Console\nfrom typing import Optional, Dict, Any, List\nfrom autocoder.common.printer import Printer\nimport re\nfrom pydantic import BaseModel\n\nfrom autocoder.models import process_api_key_path\n\nclass ProviderInfo(BaseModel):\n name: str\n endpoint: str\n r1_model: str\n v3_model: str\n api_key: str\n r1_input_price: float\n r1_output_price: float\n v3_input_price: float\n v3_output_price: float \n\n\nPROVIDER_INFO_LIST = [\n ProviderInfo(\n name=\"volcano\",\n endpoint=\"https://ark.cn-beijing.volces.com/api/v3\", \n r1_model=\"deepseek-r1-250120\",\n v3_model=\"deepseek-v3-250324\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=8.0,\n v3_input_price=1.0,\n v3_output_price=4.0,\n ), \n ProviderInfo(\n name=\"siliconflow\",\n endpoint=\"https://api.siliconflow.cn/v1\", \n r1_model=\"Pro/deepseek-ai/DeepSeek-R1\",\n v3_model=\"Pro/deepseek-ai/DeepSeek-V3\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=4.0,\n v3_input_price=4.0,\n v3_output_price=16.0,\n ),\n ProviderInfo(\n name=\"deepseek\",\n endpoint=\"https://api.deepseek.com/v1\",\n r1_model=\"deepseek-reasoner\",\n v3_model=\"deepseek-chat\",\n api_key=\"\",\n r1_input_price=4.0,\n r1_output_price=16.0,\n v3_input_price=2.0,\n v3_output_price=8.0,\n ),\n ProviderInfo(\n name=\"openrouter\",\n endpoint=\"https://openrouter.ai/api/v1\",\n r1_model=\"deepseek/deepseek-r1\",\n v3_model=\"deepseek/deepseek-chat-v3-0324\",\n api_key=\"\",\n r1_input_price=0.0,\n r1_output_price=0.0,\n v3_input_price=0.0,\n v3_output_price=0.0,\n )\n]\n\ndialog_style = Style.from_dict({\n 'dialog': 'bg:#2b2b2b',\n 'dialog frame.label': 'bg:#2b2b2b #ffffff',\n 'dialog.body': 'bg:#2b2b2b #ffffff',\n 'dialog shadow': 'bg:#1f1f1f',\n 'button': 'bg:#2b2b2b #808080',\n 'button.focused': 'bg:#1e1e1e #ffd700 bold',\n 'checkbox': '#e6e6e6',\n 'checkbox-selected': '#0078d4',\n 'radio-selected': 'bg:#0078d4 #ffffff',\n 'dialog frame.border': '#0078d4',\n 'radio': 'bg:#2b2b2b #808080',\n 'radio.focused': 'bg:#1e1e1e #ffd700 bold'\n })\n\nclass VolcanoEndpointValidator(Validator):\n def validate(self, document):\n text = document.text\n pattern = r'^ep-\\d{14}-[a-z0-9]{5}$'\n if not re.match(pattern, text):\n raise ValidationError(\n message='Invalid endpoint format. Should be like: ep-20250204215011-vzbsg',\n cursor_position=len(text)\n )\n\nclass ModelProviderSelector:\n def __init__(self):\n self.printer = Printer()\n self.console = Console()\n\n def to_models_json(self, provider_info: ProviderInfo) -> List[Dict[str, Any]]:\n \"\"\"\n Convert provider info to models.json format.\n Returns a list of model configurations matching the format in models.py default_models_list.\n \n Args:\n provider_info: ProviderInfo object containing provider details\n \n Returns:\n List[Dict[str, Any]]: List of model configurations\n \"\"\"\n models = []\n \n # Add R1 model (for reasoning/design/review)\n if provider_info.r1_model:\n models.append({\n \"name\": f\"r1_chat\",\n \"description\": f\"{provider_info.name} R1 is for design/review\",\n \"model_name\": provider_info.r1_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"r1_chat\",\n \"is_reasoning\": True,\n \"input_price\": provider_info.r1_input_price,\n \"output_price\": provider_info.r1_output_price,\n \"average_speed\": 0.0\n })\n \n # Add V3 model (for coding)\n if provider_info.v3_model:\n models.append({\n \"name\": f\"v3_chat\",\n \"description\": f\"{provider_info.name} Chat is for coding\",\n \"model_name\": provider_info.v3_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"v3_chat\",\n \"is_reasoning\": False,\n \"input_price\": provider_info.v3_input_price,\n \"output_price\": provider_info.v3_output_price,\n \"average_speed\": 0.0\n })\n \n return models\n \n def select_provider(self) -> Optional[Dict[str, Any]]:\n \"\"\"\n Let user select a model provider and input necessary credentials.\n Returns a dictionary with provider info or None if cancelled.\n \"\"\"\n \n\n result = radiolist_dialog(\n title=self.printer.get_message_from_key(\"model_provider_select_title\"),\n text=self.printer.get_message_from_key(\"model_provider_select_text\"),\n values=[\n (\"volcano\", self.printer.get_message_from_key(\"model_provider_volcano\")),\n (\"siliconflow\", self.printer.get_message_from_key(\"model_provider_siliconflow\")),\n (\"deepseek\", self.printer.get_message_from_key(\"model_provider_deepseek\")),\n (\"openrouter\", self.printer.get_message_from_key(\"model_provider_openrouter\"))\n ],\n style=dialog_style\n ).run()\n \n if result is None:\n return None\n\n \n provider_info = None\n for provider in PROVIDER_INFO_LIST:\n if provider.name == result:\n provider_info = provider\n break\n \n # if result == \"volcano\":\n # # Get R1 endpoint\n # r1_endpoint = input_dialog(\n # title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n # text=self.printer.get_message_from_key(\"model_provider_volcano_r1_text\"),\n # validator=VolcanoEndpointValidator(),\n # style=dialog_style\n # ).run()\n \n # if r1_endpoint is None:\n # return None\n \n # provider_info.r1_model = r1_endpoint\n \n # # Get V3 endpoint\n # v3_endpoint = input_dialog(\n # title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n # text=self.printer.get_message_from_key(\"model_provider_volcano_v3_text\"),\n # validator=VolcanoEndpointValidator(),\n # style=dialog_style\n # ).run()\n \n # if v3_endpoint is None:\n # return None\n \n # provider_info.v3_model = v3_endpoint\n \n # Get API key for all providers\n api_key = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(f\"model_provider_{result}_api_key_text\"),\n password=True,\n style=dialog_style\n ).run()\n \n if api_key is None:\n return None\n \n provider_info.api_key = api_key\n \n self.printer.print_panel(\n self.printer.get_message_from_key(\"model_provider_selected\"),\n text_options={\"justify\": \"left\"},\n panel_options={\n \"title\": self.printer.get_message_from_key(\"model_provider_success_title\"),\n \"border_style\": \"green\"\n }\n )\n \n return provider_info"}, "182d492533634864625ccbf6821ca642cd320e9b": {"t": 1785758530.7672393, "n": 7680, "h": "254392435bd9d998", "c": "from prompt_toolkit.shortcuts import radiolist_dialog, input_dialog\nfrom prompt_toolkit.validation import Validator, ValidationError\nfrom prompt_toolkit.styles import Style\nfrom rich.console import Console\nfrom typing import Optional, Dict, Any, List\nfrom autocoder.common.printer import Printer\nimport re\nfrom pydantic import BaseModel\n\nfrom autocoder.models import process_api_key_path\n\nclass ProviderInfo(BaseModel):\n name: str\n endpoint: str\n r1_model: str\n v3_model: str\n api_key: str\n r1_input_price: float\n r1_output_price: float\n v3_input_price: float\n v3_output_price: float \n\n\nPROVIDER_INFO_LIST = [\n ProviderInfo(\n name=\"volcano\",\n endpoint=\"https://ark.cn-beijing.volces.com/api/v3\", \n r1_model=\"deepseek-r1-250120\",\n v3_model=\"deepseek-v3-241226\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=8.0,\n v3_input_price=1.0,\n v3_output_price=4.0,\n ), \n ProviderInfo(\n name=\"siliconflow\",\n endpoint=\"https://api.siliconflow.cn/v1\", \n r1_model=\"Pro/deepseek-ai/DeepSeek-R1\",\n v3_model=\"Pro/deepseek-ai/DeepSeek-V3\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=4.0,\n v3_input_price=4.0,\n v3_output_price=16.0,\n ),\n ProviderInfo(\n name=\"deepseek\",\n endpoint=\"https://api.deepseek.com/v1\",\n r1_model=\"deepseek-reasoner\",\n v3_model=\"deepseek-chat\",\n api_key=\"\",\n r1_input_price=4.0,\n r1_output_price=16.0,\n v3_input_price=2.0,\n v3_output_price=8.0,\n ),\n]\n\ndialog_style = Style.from_dict({\n 'dialog': 'bg:#2b2b2b',\n 'dialog frame.label': 'bg:#2b2b2b #ffffff',\n 'dialog.body': 'bg:#2b2b2b #ffffff',\n 'dialog shadow': 'bg:#1f1f1f',\n 'button': 'bg:#2b2b2b #808080',\n 'button.focused': 'bg:#1e1e1e #ffd700 bold',\n 'checkbox': '#e6e6e6',\n 'checkbox-selected': '#0078d4',\n 'radio-selected': 'bg:#0078d4 #ffffff',\n 'dialog frame.border': '#0078d4',\n 'radio': 'bg:#2b2b2b #808080',\n 'radio.focused': 'bg:#1e1e1e #ffd700 bold'\n })\n\nclass VolcanoEndpointValidator(Validator):\n def validate(self, document):\n text = document.text\n pattern = r'^ep-\\d{14}-[a-z0-9]{5}$'\n if not re.match(pattern, text):\n raise ValidationError(\n message='Invalid endpoint format. Should be like: ep-20250204215011-vzbsg',\n cursor_position=len(text)\n )\n\nclass ModelProviderSelector:\n def __init__(self):\n self.printer = Printer()\n self.console = Console()\n\n def to_models_json(self, provider_info: ProviderInfo) -> List[Dict[str, Any]]:\n \"\"\"\n Convert provider info to models.json format.\n Returns a list of model configurations matching the format in models.py default_models_list.\n \n Args:\n provider_info: ProviderInfo object containing provider details\n \n Returns:\n List[Dict[str, Any]]: List of model configurations\n \"\"\"\n models = []\n \n # Add R1 model (for reasoning/design/review)\n if provider_info.r1_model:\n models.append({\n \"name\": f\"r1_chat\",\n \"description\": f\"{provider_info.name} R1 is for design/review\",\n \"model_name\": provider_info.r1_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"r1_chat\",\n \"is_reasoning\": True,\n \"input_price\": provider_info.r1_input_price,\n \"output_price\": provider_info.r1_output_price,\n \"average_speed\": 0.0\n })\n \n # Add V3 model (for coding)\n if provider_info.v3_model:\n models.append({\n \"name\": f\"v3_chat\",\n \"description\": f\"{provider_info.name} Chat is for coding\",\n \"model_name\": provider_info.v3_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"v3_chat\",\n \"is_reasoning\": False,\n \"input_price\": provider_info.v3_input_price,\n \"output_price\": provider_info.v3_output_price,\n \"average_speed\": 0.0\n })\n \n return models\n \n def select_provider(self) -> Optional[Dict[str, Any]]:\n \"\"\"\n Let user select a model provider and input necessary credentials.\n Returns a dictionary with provider info or None if cancelled.\n \"\"\"\n \n\n result = radiolist_dialog(\n title=self.printer.get_message_from_key(\"model_provider_select_title\"),\n text=self.printer.get_message_from_key(\"model_provider_select_text\"),\n values=[\n (\"volcano\", self.printer.get_message_from_key(\"model_provider_volcano\")),\n (\"siliconflow\", self.printer.get_message_from_key(\"model_provider_siliconflow\")),\n (\"deepseek\", self.printer.get_message_from_key(\"model_provider_deepseek\"))\n ],\n style=dialog_style\n ).run()\n \n if result is None:\n return None\n\n \n provider_info = None\n for provider in PROVIDER_INFO_LIST:\n if provider.name == result:\n provider_info = provider\n break\n \n # if result == \"volcano\":\n # # Get R1 endpoint\n # r1_endpoint = input_dialog(\n # title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n # text=self.printer.get_message_from_key(\"model_provider_volcano_r1_text\"),\n # validator=VolcanoEndpointValidator(),\n # style=dialog_style\n # ).run()\n \n # if r1_endpoint is None:\n # return None\n \n # provider_info.r1_model = r1_endpoint\n \n # # Get V3 endpoint\n # v3_endpoint = input_dialog(\n # title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n # text=self.printer.get_message_from_key(\"model_provider_volcano_v3_text\"),\n # validator=VolcanoEndpointValidator(),\n # style=dialog_style\n # ).run()\n \n # if v3_endpoint is None:\n # return None\n \n # provider_info.v3_model = v3_endpoint\n \n # Get API key for all providers\n api_key = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(f\"model_provider_{result}_api_key_text\"),\n password=True,\n style=dialog_style\n ).run()\n \n if api_key is None:\n return None\n \n provider_info.api_key = api_key\n \n self.printer.print_panel(\n self.printer.get_message_from_key(\"model_provider_selected\"),\n text_options={\"justify\": \"left\"},\n panel_options={\n \"title\": self.printer.get_message_from_key(\"model_provider_success_title\"),\n \"border_style\": \"green\"\n }\n )\n \n return provider_info"}, "24751fbe20555e4b327ea025f321801f9b7833ce": {"t": 1785758532.237397, "n": 7602, "h": "bfa5e94d9f045b63", "c": "from prompt_toolkit.shortcuts import radiolist_dialog, input_dialog\nfrom prompt_toolkit.validation import Validator, ValidationError\nfrom prompt_toolkit.styles import Style\nfrom rich.console import Console\nfrom typing import Optional, Dict, Any, List\nfrom autocoder.common.printer import Printer\nimport re\nfrom pydantic import BaseModel\n\nfrom autocoder.models import process_api_key_path\n\nclass ProviderInfo(BaseModel):\n name: str\n endpoint: str\n r1_model: str\n v3_model: str\n api_key: str\n r1_input_price: float\n r1_output_price: float\n v3_input_price: float\n v3_output_price: float \n\n\nPROVIDER_INFO_LIST = [\n ProviderInfo(\n name=\"volcano\",\n endpoint=\"https://ark.cn-beijing.volces.com/api/v3\", \n r1_model=\"\",\n v3_model=\"\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=8.0,\n v3_input_price=1.0,\n v3_output_price=4.0,\n ), \n ProviderInfo(\n name=\"siliconflow\",\n endpoint=\"https://api.siliconflow.cn/v1\", \n r1_model=\"Pro/deepseek-ai/DeepSeek-R1\",\n v3_model=\"Pro/deepseek-ai/DeepSeek-V3\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=4.0,\n v3_input_price=4.0,\n v3_output_price=16.0,\n ),\n ProviderInfo(\n name=\"deepseek\",\n endpoint=\"https://api.deepseek.com/v1\",\n r1_model=\"deepseek-reasoner\",\n v3_model=\"deepseek-chat\",\n api_key=\"\",\n r1_input_price=4.0,\n r1_output_price=16.0,\n v3_input_price=2.0,\n v3_output_price=8.0,\n ),\n]\n\ndialog_style = Style.from_dict({\n 'dialog': 'bg:#2b2b2b',\n 'dialog frame.label': 'bg:#2b2b2b #ffffff',\n 'dialog.body': 'bg:#2b2b2b #ffffff',\n 'dialog shadow': 'bg:#1f1f1f',\n 'button': 'bg:#2b2b2b #808080',\n 'button.focused': 'bg:#1e1e1e #ffd700 bold',\n 'checkbox': '#e6e6e6',\n 'checkbox-selected': '#0078d4',\n 'radio-selected': 'bg:#0078d4 #ffffff',\n 'dialog frame.border': '#0078d4',\n 'radio': 'bg:#2b2b2b #808080',\n 'radio.focused': 'bg:#1e1e1e #ffd700 bold'\n })\n\nclass VolcanoEndpointValidator(Validator):\n def validate(self, document):\n text = document.text\n pattern = r'^ep-\\d{14}-[a-z0-9]{5}$'\n if not re.match(pattern, text):\n raise ValidationError(\n message='Invalid endpoint format. Should be like: ep-20250204215011-vzbsg',\n cursor_position=len(text)\n )\n\nclass ModelProviderSelector:\n def __init__(self):\n self.printer = Printer()\n self.console = Console()\n\n def to_models_json(self, provider_info: ProviderInfo) -> List[Dict[str, Any]]:\n \"\"\"\n Convert provider info to models.json format.\n Returns a list of model configurations matching the format in models.py default_models_list.\n \n Args:\n provider_info: ProviderInfo object containing provider details\n \n Returns:\n List[Dict[str, Any]]: List of model configurations\n \"\"\"\n models = []\n \n # Add R1 model (for reasoning/design/review)\n if provider_info.r1_model:\n models.append({\n \"name\": f\"r1_chat\",\n \"description\": f\"{provider_info.name} R1 is for design/review\",\n \"model_name\": provider_info.r1_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"r1_chat\",\n \"is_reasoning\": True,\n \"input_price\": provider_info.r1_input_price,\n \"output_price\": provider_info.r1_output_price,\n \"average_speed\": 0.0\n })\n \n # Add V3 model (for coding)\n if provider_info.v3_model:\n models.append({\n \"name\": f\"v3_chat\",\n \"description\": f\"{provider_info.name} Chat is for coding\",\n \"model_name\": provider_info.v3_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"v3_chat\",\n \"is_reasoning\": False,\n \"input_price\": provider_info.v3_input_price,\n \"output_price\": provider_info.v3_output_price,\n \"average_speed\": 0.0\n })\n \n return models\n \n def select_provider(self) -> Optional[Dict[str, Any]]:\n \"\"\"\n Let user select a model provider and input necessary credentials.\n Returns a dictionary with provider info or None if cancelled.\n \"\"\"\n \n\n result = radiolist_dialog(\n title=self.printer.get_message_from_key(\"model_provider_select_title\"),\n text=self.printer.get_message_from_key(\"model_provider_select_text\"),\n values=[\n (\"volcano\", self.printer.get_message_from_key(\"model_provider_volcano\")),\n (\"siliconflow\", self.printer.get_message_from_key(\"model_provider_siliconflow\")),\n (\"deepseek\", self.printer.get_message_from_key(\"model_provider_deepseek\"))\n ],\n style=dialog_style\n ).run()\n \n if result is None:\n return None\n\n \n provider_info = None\n for provider in PROVIDER_INFO_LIST:\n if provider.name == result:\n provider_info = provider\n break\n \n if result == \"volcano\":\n # Get R1 endpoint\n r1_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_r1_text\"),\n validator=VolcanoEndpointValidator(),\n style=dialog_style\n ).run()\n \n if r1_endpoint is None:\n return None\n \n provider_info.r1_model = r1_endpoint\n \n # Get V3 endpoint\n v3_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_v3_text\"),\n validator=VolcanoEndpointValidator(),\n style=dialog_style\n ).run()\n \n if v3_endpoint is None:\n return None\n \n provider_info.v3_model = v3_endpoint\n \n # Get API key for all providers\n api_key = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(f\"model_provider_{result}_api_key_text\"),\n password=True,\n style=dialog_style\n ).run()\n \n if api_key is None:\n return None\n \n provider_info.api_key = api_key\n \n self.printer.print_panel(\n self.printer.get_message_from_key(\"model_provider_selected\"),\n text_options={\"justify\": \"left\"},\n panel_options={\n \"title\": self.printer.get_message_from_key(\"model_provider_success_title\"),\n \"border_style\": \"green\"\n }\n )\n \n return provider_info"}, "308b35d4c6bd627b51e9f4155591f71118f8eb8e": {"t": 1785758536.8475912, "n": 7536, "h": "0d4af148cf44a56a", "c": "from prompt_toolkit.shortcuts import radiolist_dialog, input_dialog\nfrom prompt_toolkit.validation import Validator, ValidationError\nfrom prompt_toolkit.styles import Style\nfrom rich.console import Console\nfrom typing import Optional, Dict, Any, List\nfrom autocoder.common.printer import Printer\nimport re\nfrom pydantic import BaseModel\n\nfrom autocoder.models import process_api_key_path\n\nclass ProviderInfo(BaseModel):\n name: str\n endpoint: str\n r1_model: str\n v3_model: str\n api_key: str\n r1_input_price: float\n r1_output_price: float\n v3_input_price: float\n v3_output_price: float \n\n\nPROVIDER_INFO_LIST = [\n ProviderInfo(\n name=\"volcano\",\n endpoint=\"https://ark.cn-beijing.volces.com/api/v3\", \n r1_model=\"\",\n v3_model=\"\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=8.0,\n v3_input_price=1.0,\n v3_output_price=4.0,\n ), \n ProviderInfo(\n name=\"siliconflow\",\n endpoint=\"https://api.siliconflow.cn/v1\", \n r1_model=\"Pro/deepseek-ai/DeepSeek-R1\",\n v3_model=\"Pro/deepseek-ai/DeepSeek-V3\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=4.0,\n v3_input_price=4.0,\n v3_output_price=16.0,\n ),\n ProviderInfo(\n name=\"deepseek\",\n endpoint=\"https://api.deepseek.com/v1\",\n r1_model=\"deepseek-reasoner\",\n v3_model=\"deepseek-chat\",\n api_key=\"\",\n r1_input_price=4.0,\n r1_output_price=16.0,\n v3_input_price=2.0,\n v3_output_price=8.0,\n ),\n]\n\ndialog_style = Style.from_dict({\n 'dialog': 'bg:#2b2b2b',\n 'dialog frame.label': 'bg:#2b2b2b #ffffff',\n 'dialog.body': 'bg:#2b2b2b #ffffff',\n 'dialog shadow': 'bg:#1f1f1f',\n 'button': 'bg:#005fb8 #ffffff',\n 'button.focused': 'bg:#0078d4 #ffffff',\n 'checkbox': '#e6e6e6',\n 'checkbox-selected': '#0078d4',\n 'radio-selected': 'bg:#0078d4 #ffffff',\n 'dialog frame.border': '#0078d4',\n 'radio': 'bg:ansiblack #ffffff'\n })\n\nclass VolcanoEndpointValidator(Validator):\n def validate(self, document):\n text = document.text\n pattern = r'^ep-\\d{14}-[a-z0-9]{5}$'\n if not re.match(pattern, text):\n raise ValidationError(\n message='Invalid endpoint format. Should be like: ep-20250204215011-vzbsg',\n cursor_position=len(text)\n )\n\nclass ModelProviderSelector:\n def __init__(self):\n self.printer = Printer()\n self.console = Console()\n\n def to_models_json(self, provider_info: ProviderInfo) -> List[Dict[str, Any]]:\n \"\"\"\n Convert provider info to models.json format.\n Returns a list of model configurations matching the format in models.py default_models_list.\n \n Args:\n provider_info: ProviderInfo object containing provider details\n \n Returns:\n List[Dict[str, Any]]: List of model configurations\n \"\"\"\n models = []\n \n # Add R1 model (for reasoning/design/review)\n if provider_info.r1_model:\n models.append({\n \"name\": f\"r1_chat\",\n \"description\": f\"{provider_info.name} R1 is for design/review\",\n \"model_name\": provider_info.r1_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"r1_chat\",\n \"is_reasoning\": True,\n \"input_price\": provider_info.r1_input_price,\n \"output_price\": provider_info.r1_output_price,\n \"average_speed\": 0.0\n })\n \n # Add V3 model (for coding)\n if provider_info.v3_model:\n models.append({\n \"name\": f\"v3_chat\",\n \"description\": f\"{provider_info.name} Chat is for coding\",\n \"model_name\": provider_info.v3_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"v3_chat\",\n \"is_reasoning\": False,\n \"input_price\": provider_info.v3_input_price,\n \"output_price\": provider_info.v3_output_price,\n \"average_speed\": 0.0\n })\n \n return models\n \n def select_provider(self) -> Optional[Dict[str, Any]]:\n \"\"\"\n Let user select a model provider and input necessary credentials.\n Returns a dictionary with provider info or None if cancelled.\n \"\"\"\n \n\n result = radiolist_dialog(\n title=self.printer.get_message_from_key(\"model_provider_select_title\"),\n text=self.printer.get_message_from_key(\"model_provider_select_text\"),\n values=[\n (\"volcano\", self.printer.get_message_from_key(\"model_provider_volcano\")),\n (\"siliconflow\", self.printer.get_message_from_key(\"model_provider_siliconflow\")),\n (\"deepseek\", self.printer.get_message_from_key(\"model_provider_deepseek\"))\n ],\n style=dialog_style\n ).run()\n \n if result is None:\n return None\n\n \n provider_info = None\n for provider in PROVIDER_INFO_LIST:\n if provider.name == result:\n provider_info = provider\n break\n \n if result == \"volcano\":\n # Get R1 endpoint\n r1_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_r1_text\"),\n validator=VolcanoEndpointValidator(),\n style=dialog_style\n ).run()\n \n if r1_endpoint is None:\n return None\n \n provider_info.r1_model = r1_endpoint\n \n # Get V3 endpoint\n v3_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_v3_text\"),\n validator=VolcanoEndpointValidator(),\n style=dialog_style\n ).run()\n \n if v3_endpoint is None:\n return None\n \n provider_info.v3_model = v3_endpoint\n \n # Get API key for all providers\n api_key = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(f\"model_provider_{result}_api_key_text\"),\n password=True,\n style=dialog_style\n ).run()\n \n if api_key is None:\n return None\n \n provider_info.api_key = api_key\n \n self.printer.print_panel(\n self.printer.get_message_from_key(\"model_provider_selected\"),\n text_options={\"justify\": \"left\"},\n panel_options={\n \"title\": self.printer.get_message_from_key(\"model_provider_success_title\"),\n \"border_style\": \"green\"\n }\n )\n \n return provider_info"}, "e7d347c720a275a19f2261170cd8be00dd969e72": {"t": 1785758538.530707, "n": 7512, "h": "3ebf7677f5f3c54c", "c": "from prompt_toolkit.shortcuts import radiolist_dialog, input_dialog\nfrom prompt_toolkit.validation import Validator, ValidationError\nfrom prompt_toolkit.styles import Style\nfrom rich.console import Console\nfrom typing import Optional, Dict, Any, List\nfrom autocoder.common.printer import Printer\nimport re\nfrom pydantic import BaseModel\n\nfrom autocoder.models import process_api_key_path\n\nclass ProviderInfo(BaseModel):\n name: str\n endpoint: str\n r1_model: str\n v3_model: str\n api_key: str\n r1_input_price: float\n r1_output_price: float\n v3_input_price: float\n v3_output_price: float \n\n\nPROVIDER_INFO_LIST = [\n ProviderInfo(\n name=\"volcano\",\n endpoint=\"https://ark.cn-beijing.volces.com/api/v3\", \n r1_model=\"\",\n v3_model=\"\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=8.0,\n v3_input_price=1.0,\n v3_output_price=4.0,\n ), \n ProviderInfo(\n name=\"siliconflow\",\n endpoint=\"https://api.siliconflow.cn/v1\", \n r1_model=\"Pro/deepseek-ai/DeepSeek-R1\",\n v3_model=\"Pro/deepseek-ai/DeepSeek-V3\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=4.0,\n v3_input_price=4.0,\n v3_output_price=16.0,\n ),\n ProviderInfo(\n name=\"deepseek\",\n endpoint=\"https://api.deepseek.com/v1\",\n r1_model=\"deepseek-reasoner\",\n v3_model=\"deepseek-chat\",\n api_key=\"\",\n r1_input_price=4.0,\n r1_output_price=16.0,\n v3_input_price=2.0,\n v3_output_price=8.0,\n ),\n]\n\ndialog_style = Style.from_dict({\n 'dialog': 'bg:#2b2b2b',\n 'dialog frame.label': 'bg:#2b2b2b #ffffff',\n 'dialog.body': 'bg:#2b2b2b #ffffff',\n 'dialog shadow': 'bg:#1f1f1f',\n 'button': 'bg:#005fb8 #ffffff',\n 'button.focused': 'bg:#0078d4 #ffffff',\n 'checkbox': '#e6e6e6',\n 'checkbox-selected': '#0078d4',\n 'radio-selected': '#0078d4',\n 'dialog frame.border': '#0078d4',\n 'radio': '#e6e6e6'\n })\n\nclass VolcanoEndpointValidator(Validator):\n def validate(self, document):\n text = document.text\n pattern = r'^ep-\\d{14}-[a-z0-9]{5}$'\n if not re.match(pattern, text):\n raise ValidationError(\n message='Invalid endpoint format. Should be like: ep-20250204215011-vzbsg',\n cursor_position=len(text)\n )\n\nclass ModelProviderSelector:\n def __init__(self):\n self.printer = Printer()\n self.console = Console()\n\n def to_models_json(self, provider_info: ProviderInfo) -> List[Dict[str, Any]]:\n \"\"\"\n Convert provider info to models.json format.\n Returns a list of model configurations matching the format in models.py default_models_list.\n \n Args:\n provider_info: ProviderInfo object containing provider details\n \n Returns:\n List[Dict[str, Any]]: List of model configurations\n \"\"\"\n models = []\n \n # Add R1 model (for reasoning/design/review)\n if provider_info.r1_model:\n models.append({\n \"name\": f\"r1_chat\",\n \"description\": f\"{provider_info.name} R1 is for design/review\",\n \"model_name\": provider_info.r1_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"r1_chat\",\n \"is_reasoning\": True,\n \"input_price\": provider_info.r1_input_price,\n \"output_price\": provider_info.r1_output_price,\n \"average_speed\": 0.0\n })\n \n # Add V3 model (for coding)\n if provider_info.v3_model:\n models.append({\n \"name\": f\"v3_chat\",\n \"description\": f\"{provider_info.name} Chat is for coding\",\n \"model_name\": provider_info.v3_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"v3_chat\",\n \"is_reasoning\": False,\n \"input_price\": provider_info.v3_input_price,\n \"output_price\": provider_info.v3_output_price,\n \"average_speed\": 0.0\n })\n \n return models\n \n def select_provider(self) -> Optional[Dict[str, Any]]:\n \"\"\"\n Let user select a model provider and input necessary credentials.\n Returns a dictionary with provider info or None if cancelled.\n \"\"\"\n \n\n result = radiolist_dialog(\n title=self.printer.get_message_from_key(\"model_provider_select_title\"),\n text=self.printer.get_message_from_key(\"model_provider_select_text\"),\n values=[\n (\"volcano\", self.printer.get_message_from_key(\"model_provider_volcano\")),\n (\"siliconflow\", self.printer.get_message_from_key(\"model_provider_siliconflow\")),\n (\"deepseek\", self.printer.get_message_from_key(\"model_provider_deepseek\"))\n ],\n style=dialog_style\n ).run()\n \n if result is None:\n return None\n\n \n provider_info = None\n for provider in PROVIDER_INFO_LIST:\n if provider.name == result:\n provider_info = provider\n break\n \n if result == \"volcano\":\n # Get R1 endpoint\n r1_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_r1_text\"),\n validator=VolcanoEndpointValidator(),\n style=dialog_style\n ).run()\n \n if r1_endpoint is None:\n return None\n \n provider_info.r1_model = r1_endpoint\n \n # Get V3 endpoint\n v3_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_v3_text\"),\n validator=VolcanoEndpointValidator(),\n style=dialog_style\n ).run()\n \n if v3_endpoint is None:\n return None\n \n provider_info.v3_model = v3_endpoint\n \n # Get API key for all providers\n api_key = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(f\"model_provider_{result}_api_key_text\"),\n password=True,\n style=dialog_style\n ).run()\n \n if api_key is None:\n return None\n \n provider_info.api_key = api_key\n \n self.printer.print_panel(\n self.printer.get_message_from_key(\"model_provider_selected\"),\n text_options={\"justify\": \"left\"},\n panel_options={\n \"title\": self.printer.get_message_from_key(\"model_provider_success_title\"),\n \"border_style\": \"green\"\n }\n )\n \n return provider_info"}, "43382868e10cb89ce0f7833642c905946064cb67": {"t": 1785758539.7298055, "n": 7406, "h": "441622053a7b357d", "c": "from prompt_toolkit.shortcuts import radiolist_dialog, input_dialog\nfrom prompt_toolkit.validation import Validator, ValidationError\nfrom prompt_toolkit.styles import Style\nfrom rich.console import Console\nfrom typing import Optional, Dict, Any, List\nfrom autocoder.common.printer import Printer\nimport re\nfrom pydantic import BaseModel\n\nfrom autocoder.models import process_api_key_path\n\nclass ProviderInfo(BaseModel):\n name: str\n endpoint: str\n r1_model: str\n v3_model: str\n api_key: str\n r1_input_price: float\n r1_output_price: float\n v3_input_price: float\n v3_output_price: float \n\n\nPROVIDER_INFO_LIST = [\n ProviderInfo(\n name=\"volcano\",\n endpoint=\"https://ark.cn-beijing.volces.com/api/v3\", \n r1_model=\"\",\n v3_model=\"\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=8.0,\n v3_input_price=1.0,\n v3_output_price=4.0,\n ), \n ProviderInfo(\n name=\"siliconflow\",\n endpoint=\"https://api.siliconflow.cn/v1\", \n r1_model=\"Pro/deepseek-ai/DeepSeek-R1\",\n v3_model=\"Pro/deepseek-ai/DeepSeek-V3\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=4.0,\n v3_input_price=4.0,\n v3_output_price=16.0,\n ),\n ProviderInfo(\n name=\"deepseek\",\n endpoint=\"https://api.deepseek.com/v1\",\n r1_model=\"deepseek-reasoner\",\n v3_model=\"deepseek-chat\",\n api_key=\"\",\n r1_input_price=4.0,\n r1_output_price=16.0,\n v3_input_price=2.0,\n v3_output_price=8.0,\n ),\n]\n\nclass VolcanoEndpointValidator(Validator):\n def validate(self, document):\n text = document.text\n pattern = r'^ep-\\d{14}-[a-z0-9]{5}$'\n if not re.match(pattern, text):\n raise ValidationError(\n message='Invalid endpoint format. Should be like: ep-20250204215011-vzbsg',\n cursor_position=len(text)\n )\n\nclass ModelProviderSelector:\n def __init__(self):\n self.printer = Printer()\n self.console = Console()\n\n def to_models_json(self, provider_info: ProviderInfo) -> List[Dict[str, Any]]:\n \"\"\"\n Convert provider info to models.json format.\n Returns a list of model configurations matching the format in models.py default_models_list.\n \n Args:\n provider_info: ProviderInfo object containing provider details\n \n Returns:\n List[Dict[str, Any]]: List of model configurations\n \"\"\"\n models = []\n \n # Add R1 model (for reasoning/design/review)\n if provider_info.r1_model:\n models.append({\n \"name\": f\"r1_chat\",\n \"description\": f\"{provider_info.name} R1 is for design/review\",\n \"model_name\": provider_info.r1_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"r1_chat\",\n \"is_reasoning\": True,\n \"input_price\": provider_info.r1_input_price,\n \"output_price\": provider_info.r1_output_price,\n \"average_speed\": 0.0\n })\n \n # Add V3 model (for coding)\n if provider_info.v3_model:\n models.append({\n \"name\": f\"v3_chat\",\n \"description\": f\"{provider_info.name} Chat is for coding\",\n \"model_name\": provider_info.v3_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"v3_chat\",\n \"is_reasoning\": False,\n \"input_price\": provider_info.v3_input_price,\n \"output_price\": provider_info.v3_output_price,\n \"average_speed\": 0.0\n })\n \n return models\n \n def select_provider(self) -> Optional[Dict[str, Any]]:\n \"\"\"\n Let user select a model provider and input necessary credentials.\n Returns a dictionary with provider info or None if cancelled.\n \"\"\"\n dialog_style = Style.from_dict({\n 'dialog': 'bg:#2b2b2b',\n 'dialog frame.label': 'bg:#2b2b2b #ffffff',\n 'dialog.body': 'bg:#2b2b2b #ffffff',\n 'dialog shadow': 'bg:#1f1f1f',\n 'button': 'bg:#005fb8 #ffffff',\n 'button.focused': 'bg:#0078d4 #ffffff',\n 'checkbox': '#e6e6e6',\n 'checkbox-selected': '#0078d4',\n 'radio-selected': '#0078d4',\n 'dialog frame.border': '#0078d4',\n 'radio': '#e6e6e6'\n })\n\n result = radiolist_dialog(\n title=self.printer.get_message_from_key(\"model_provider_select_title\"),\n text=self.printer.get_message_from_key(\"model_provider_select_text\"),\n values=[\n (\"volcano\", self.printer.get_message_from_key(\"model_provider_volcano\")),\n (\"siliconflow\", self.printer.get_message_from_key(\"model_provider_siliconflow\")),\n (\"deepseek\", self.printer.get_message_from_key(\"model_provider_deepseek\"))\n ],\n style=dialog_style\n ).run()\n \n if result is None:\n return None\n\n \n provider_info = None\n for provider in PROVIDER_INFO_LIST:\n if provider.name == result:\n provider_info = provider\n break\n \n if result == \"volcano\":\n # Get R1 endpoint\n r1_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_r1_text\"),\n validator=VolcanoEndpointValidator()\n ).run()\n \n if r1_endpoint is None:\n return None\n \n provider_info.r1_model = r1_endpoint\n \n # Get V3 endpoint\n v3_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_v3_text\"),\n validator=VolcanoEndpointValidator()\n ).run()\n \n if v3_endpoint is None:\n return None\n \n provider_info.v3_model = v3_endpoint\n \n # Get API key for all providers\n api_key = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(f\"model_provider_{result}_api_key_text\"),\n password=True\n ).run()\n \n if api_key is None:\n return None\n \n provider_info.api_key = api_key\n \n self.printer.print_panel(\n self.printer.get_message_from_key(\"model_provider_selected\"),\n text_options={\"justify\": \"left\"},\n panel_options={\n \"title\": self.printer.get_message_from_key(\"model_provider_success_title\"),\n \"border_style\": \"green\"\n }\n )\n \n return provider_info"}, "4dda5fd75a7a977cf05916c9dff230fad1a25cf6": {"t": 1785758540.940159, "n": 6713, "h": "b367684f3bd27cf0", "c": "from prompt_toolkit.shortcuts import radiolist_dialog, input_dialog\nfrom prompt_toolkit.validation import Validator, ValidationError\nfrom rich.console import Console\nfrom typing import Optional, Dict, Any, List\nfrom autocoder.common.printer import Printer\nimport re\nfrom pydantic import BaseModel\n\nfrom autocoder.models import process_api_key_path\n\nclass ProviderInfo(BaseModel):\n name: str\n endpoint: str\n r1_model: str\n v3_model: str\n api_key: str\n r1_input_price: float\n r1_output_price: float\n v3_input_price: float\n v3_output_price: float \n\n\nPROVIDER_INFO_LIST = [\n ProviderInfo(\n name=\"volcano\",\n endpoint=\"https://ark.cn-beijing.volces.com/api/v3\", \n r1_model=\"\",\n v3_model=\"\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=8.0,\n v3_input_price=1.0,\n v3_output_price=4.0,\n ), \n ProviderInfo(\n name=\"siliconflow\",\n endpoint=\"https://api.siliconflow.cn/v1\", \n r1_model=\"Pro/deepseek-ai/DeepSeek-R1\",\n v3_model=\"Pro/deepseek-ai/DeepSeek-V3\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=4.0,\n v3_input_price=4.0,\n v3_output_price=16.0,\n ),\n ProviderInfo(\n name=\"deepseek\",\n endpoint=\"https://api.deepseek.com/v1\",\n r1_model=\"deepseek-reasoner\",\n v3_model=\"deepseek-chat\",\n api_key=\"\",\n r1_input_price=4.0,\n r1_output_price=16.0,\n v3_input_price=2.0,\n v3_output_price=8.0,\n ),\n]\n\nclass VolcanoEndpointValidator(Validator):\n def validate(self, document):\n text = document.text\n pattern = r'^ep-\\d{14}-[a-z0-9]{5}$'\n if not re.match(pattern, text):\n raise ValidationError(\n message='Invalid endpoint format. Should be like: ep-20250204215011-vzbsg',\n cursor_position=len(text)\n )\n\nclass ModelProviderSelector:\n def __init__(self):\n self.printer = Printer()\n self.console = Console()\n\n def to_models_json(self, provider_info: ProviderInfo) -> List[Dict[str, Any]]:\n \"\"\"\n Convert provider info to models.json format.\n Returns a list of model configurations matching the format in models.py default_models_list.\n \n Args:\n provider_info: ProviderInfo object containing provider details\n \n Returns:\n List[Dict[str, Any]]: List of model configurations\n \"\"\"\n models = []\n \n # Add R1 model (for reasoning/design/review)\n if provider_info.r1_model:\n models.append({\n \"name\": f\"r1_chat\",\n \"description\": f\"{provider_info.name} R1 is for design/review\",\n \"model_name\": provider_info.r1_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"r1_chat\",\n \"is_reasoning\": True,\n \"input_price\": provider_info.r1_input_price,\n \"output_price\": provider_info.r1_output_price,\n \"average_speed\": 0.0\n })\n \n # Add V3 model (for coding)\n if provider_info.v3_model:\n models.append({\n \"name\": f\"v3_chat\",\n \"description\": f\"{provider_info.name} Chat is for coding\",\n \"model_name\": provider_info.v3_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"v3_chat\",\n \"is_reasoning\": False,\n \"input_price\": provider_info.v3_input_price,\n \"output_price\": provider_info.v3_output_price,\n \"average_speed\": 0.0\n })\n \n return models\n \n def select_provider(self) -> Optional[Dict[str, Any]]:\n \"\"\"\n Let user select a model provider and input necessary credentials.\n Returns a dictionary with provider info or None if cancelled.\n \"\"\"\n result = radiolist_dialog(\n title=self.printer.get_message_from_key(\"model_provider_select_title\"),\n text=self.printer.get_message_from_key(\"model_provider_select_text\"),\n values=[\n (\"volcano\", self.printer.get_message_from_key(\"model_provider_volcano\")),\n (\"siliconflow\", self.printer.get_message_from_key(\"model_provider_siliconflow\")),\n (\"deepseek\", self.printer.get_message_from_key(\"model_provider_deepseek\"))\n ]\n ).run()\n \n if result is None:\n return None\n\n \n provider_info = None\n for provider in PROVIDER_INFO_LIST:\n if provider.name == result:\n provider_info = provider\n break\n \n if result == \"volcano\":\n # Get R1 endpoint\n r1_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_r1_text\"),\n validator=VolcanoEndpointValidator()\n ).run()\n \n if r1_endpoint is None:\n return None\n \n provider_info.r1_model = r1_endpoint\n \n # Get V3 endpoint\n v3_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_v3_text\"),\n validator=VolcanoEndpointValidator()\n ).run()\n \n if v3_endpoint is None:\n return None\n \n provider_info.v3_model = v3_endpoint\n \n # Get API key for all providers\n api_key = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(f\"model_provider_{result}_api_key_text\"),\n password=True\n ).run()\n \n if api_key is None:\n return None\n \n provider_info.api_key = api_key\n \n self.printer.print_panel(\n self.printer.get_message_from_key(\"model_provider_selected\"),\n text_options={\"justify\": \"left\"},\n panel_options={\n \"title\": self.printer.get_message_from_key(\"model_provider_success_title\"),\n \"border_style\": \"green\"\n }\n )\n \n return provider_info"}, "8a139a5490176e2639310d96e32b9a5173700a5f": {"t": 1785758542.3764946, "n": 6707, "h": "230868c044910463", "c": "from prompt_toolkit.shortcuts import radiolist_dialog, input_dialog\nfrom prompt_toolkit.validation import Validator, ValidationError\nfrom rich.console import Console\nfrom typing import Optional, Dict, Any, List\nfrom autocoder.common.printer import Printer\nimport re\nfrom pydantic import BaseModel\n\nfrom autocoder.models import process_api_key_path\n\nclass ProviderInfo(BaseModel):\n name: str\n endpoint: str\n r1_model: str\n v3_model: str\n api_key: str\n r1_input_price: float\n r1_output_price: float\n v3_input_price: float\n v3_output_price: float \n\n\nPROVIDER_INFO_LIST = [\n ProviderInfo(\n name=\"volcano\",\n endpoint=\"https://ark.cn-beijing.volces.com/api/v3\", \n r1_model=\"\",\n v3_model=\"\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=8.0,\n v3_input_price=1.0,\n v3_output_price=4.0,\n ), \n ProviderInfo(\n name=\"siliconFlow\",\n endpoint=\"https://api.siliconflow.cn/v1\", \n r1_model=\"Pro/deepseek-ai/DeepSeek-R1\",\n v3_model=\"Pro/deepseek-ai/DeepSeek-V3\",\n api_key=\"\",\n r1_input_price=2.0,\n r1_output_price=4.0,\n v3_input_price=4.0,\n v3_output_price=16.0,\n ),\n ProviderInfo(\n name=\"deepseek\",\n endpoint=\"https://api.deepseek.com/v1\",\n r1_model=\"deepseek-reasoner\",\n v3_model=\"deepseek-chat\",\n api_key=\"\",\n r1_input_price=4.0,\n r1_output_price=16.0,\n v3_input_price=2.0,\n v3_output_price=8.0,\n ),\n]\n\nclass VolcanoEndpointValidator(Validator):\n def validate(self, document):\n text = document.text\n pattern = r'^ep-\\d{14}-[a-z0-9]{5}$'\n if not re.match(pattern, text):\n raise ValidationError(\n message='Invalid endpoint format. Should be like: ep-20250204215011-vzbsg',\n cursor_position=len(text)\n )\n\nclass ModelProviderSelector:\n def __init__(self):\n self.printer = Printer()\n self.console = Console()\n\n def to_models_json(self, provider_info: ProviderInfo) -> List[Dict[str, Any]]:\n \"\"\"\n Convert provider info to models.json format.\n Returns a list of model configurations matching the format in models.py default_models_list.\n \n Args:\n provider_info: ProviderInfo object containing provider details\n \n Returns:\n List[Dict[str, Any]]: List of model configurations\n \"\"\"\n models = []\n \n # Add R1 model (for reasoning/design/review)\n if provider_info.r1_model:\n models.append({\n \"name\": f\"r1_chat\",\n \"description\": f\"{provider_info.name} R1 is for design/review\",\n \"model_name\": provider_info.r1_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"r1_chat\",\n \"is_reasoning\": True,\n \"input_price\": provider_info.r1_input_price,\n \"output_price\": provider_info.r1_output_price,\n \"average_speed\": 0.0\n })\n \n # Add V3 model (for coding)\n if provider_info.v3_model:\n models.append({\n \"name\": f\"v3_chat\",\n \"description\": f\"{provider_info.name} Chat is for coding\",\n \"model_name\": provider_info.v3_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key\": provider_info.api_key,\n \"api_key_path\": f\"v3_chat\",\n \"is_reasoning\": False,\n \"input_price\": provider_info.v3_input_price,\n \"output_price\": provider_info.v3_output_price,\n \"average_speed\": 0.0\n })\n \n return models\n \n def select_provider(self) -> Optional[Dict[str, Any]]:\n \"\"\"\n Let user select a model provider and input necessary credentials.\n Returns a dictionary with provider info or None if cancelled.\n \"\"\"\n result = radiolist_dialog(\n title=self.printer.get_message_from_key(\"model_provider_select_title\"),\n text=self.printer.get_message_from_key(\"model_provider_select_text\"),\n values=[\n (\"volcano\", self.printer.get_message_from_key(\"model_provider_volcano\")),\n (\"siliconflow\", self.printer.get_message_from_key(\"model_provider_guiji\")),\n (\"deepseek\", self.printer.get_message_from_key(\"model_provider_deepseek\"))\n ]\n ).run()\n \n if result is None:\n return None\n\n \n provider_info = None\n for provider in PROVIDER_INFO_LIST:\n if provider.name == result:\n provider_info = provider\n break\n \n if result == \"volcano\":\n # Get R1 endpoint\n r1_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_r1_text\"),\n validator=VolcanoEndpointValidator()\n ).run()\n \n if r1_endpoint is None:\n return None\n \n provider_info.r1_model = r1_endpoint\n \n # Get V3 endpoint\n v3_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_v3_text\"),\n validator=VolcanoEndpointValidator()\n ).run()\n \n if v3_endpoint is None:\n return None\n \n provider_info.v3_model = v3_endpoint\n \n # Get API key for all providers\n api_key = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(f\"model_provider_{result}_api_key_text\"),\n password=True\n ).run()\n \n if api_key is None:\n return None\n \n provider_info.api_key = api_key\n \n self.printer.print_panel(\n self.printer.get_message_from_key(\"model_provider_selected\"),\n text_options={\"justify\": \"left\"},\n panel_options={\n \"title\": self.printer.get_message_from_key(\"model_provider_success_title\"),\n \"border_style\": \"green\"\n }\n )\n \n return provider_info"}, "70db8689e3499f2dde3f24620739b1425a03cc51": {"t": 1785758543.6393614, "n": 6009, "h": "b1fc7ac77b921989", "c": "from prompt_toolkit.shortcuts import radiolist_dialog, input_dialog\nfrom prompt_toolkit.validation import Validator, ValidationError\nfrom rich.console import Console\nfrom typing import Optional, Dict, Any, List\nfrom autocoder.common.printer import Printer\nimport re\nfrom pydantic import BaseModel\n\nclass ProviderInfo(BaseModel):\n name: str\n endpoint: str\n r1_model: str\n v3_model: str\n api_key: str\n\n\nPROVIDER_INFO_LIST = [\n ProviderInfo(\n name=\"Volcano\",\n endpoint=\"https://ark.cn-beijing.volces.com/api/v3\", \n r1_model=\"\",\n v3_model=\"\",\n api_key=\"\",\n ), \n ProviderInfo(\n name=\"SiliconFlow\",\n endpoint=\"https://api.siliconflow.cn/v1\", \n r1_model=\"Pro/deepseek-ai/DeepSeek-R1\",\n v3_model=\"Pro/deepseek-ai/DeepSeek-V3\",\n api_key=\"\",\n ),\n ProviderInfo(\n name=\"DeepSeek\",\n endpoint=\"https://api.deepseek.com/v1\",\n r1_model=\"deepseek-reasoner\",\n v3_model=\"deepseek-chat\",\n api_key=\"\",\n ),\n]\n\nclass VolcanoEndpointValidator(Validator):\n def validate(self, document):\n text = document.text\n pattern = r'^ep-\\d{14}-[a-z0-9]{5}$'\n if not re.match(pattern, text):\n raise ValidationError(\n message='Invalid endpoint format. Should be like: ep-20250204215011-vzbsg',\n cursor_position=len(text)\n )\n\nclass ModelProviderSelector:\n def __init__(self):\n self.printer = Printer()\n self.console = Console()\n\n def to_models_json(self, provider_info: ProviderInfo) -> List[Dict[str, Any]]:\n \"\"\"\n Convert provider info to models.json format.\n Returns a list of model configurations matching the format in models.py default_models_list.\n \n Args:\n provider_info: ProviderInfo object containing provider details\n \n Returns:\n List[Dict[str, Any]]: List of model configurations\n \"\"\"\n models = []\n \n # Add R1 model (for reasoning/design/review)\n if provider_info.r1_model:\n models.append({\n \"name\": f\"{provider_info.name.lower()}_r1_chat\",\n \"description\": f\"{provider_info.name} R1 is for design/review\",\n \"model_name\": provider_info.r1_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key_path\": process_api_key_path(provider_info.endpoint),\n \"is_reasoning\": True,\n \"input_price\": 0.0,\n \"output_price\": 0.0,\n \"average_speed\": 0.0\n })\n \n # Add V3 model (for coding)\n if provider_info.v3_model:\n models.append({\n \"name\": f\"{provider_info.name.lower()}_chat\",\n \"description\": f\"{provider_info.name} Chat is for coding\",\n \"model_name\": provider_info.v3_model,\n \"model_type\": \"saas/openai\",\n \"base_url\": provider_info.endpoint,\n \"api_key_path\": process_api_key_path(provider_info.endpoint),\n \"is_reasoning\": False,\n \"input_price\": 0.0,\n \"output_price\": 0.0,\n \"average_speed\": 0.0\n })\n \n return models\n \n def select_provider(self) -> Optional[Dict[str, Any]]:\n \"\"\"\n Let user select a model provider and input necessary credentials.\n Returns a dictionary with provider info or None if cancelled.\n \"\"\"\n result = radiolist_dialog(\n title=self.printer.get_message_from_key(\"model_provider_select_title\"),\n text=self.printer.get_message_from_key(\"model_provider_select_text\"),\n values=[\n (\"volcano\", self.printer.get_message_from_key(\"model_provider_volcano\")),\n (\"siliconflow\", self.printer.get_message_from_key(\"model_provider_guiji\")),\n (\"deepseek\", self.printer.get_message_from_key(\"model_provider_deepseek\"))\n ]\n ).run()\n \n if result is None:\n return None\n \n provider_info = PROVIDER_INFO_LIST[result] \n \n if result == \"volcano\":\n # Get R1 endpoint\n r1_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_r1_text\"),\n validator=VolcanoEndpointValidator()\n ).run()\n \n if r1_endpoint is None:\n return None\n \n provider_info.r1_model = r1_endpoint\n \n # Get V3 endpoint\n v3_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_v3_text\"),\n validator=VolcanoEndpointValidator()\n ).run()\n \n if v3_endpoint is None:\n return None\n \n provider_info.v3_model = v3_endpoint\n \n # Get API key for all providers\n api_key = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(f\"model_provider_{result}_api_key_text\"),\n password=True\n ).run()\n \n if api_key is None:\n return None\n \n provider_info.api_key = api_key\n \n self.printer.print_panel(\n self.printer.get_message_from_key(\"model_provider_selected\"),\n text_options={\"justify\": \"left\"},\n panel_options={\n \"title\": self.printer.get_message_from_key(\"model_provider_success_title\"),\n \"border_style\": \"green\"\n }\n )\n \n return provider_info"}, "20fcb3567d042820d3c736d7ca3d79bb84d46cf5": {"t": 1785758546.0340772, "n": 4398, "h": "13abf40cec8040b4", "c": "from prompt_toolkit.shortcuts import radiolist_dialog, input_dialog\nfrom prompt_toolkit.validation import Validator, ValidationError\nfrom rich.console import Console\nfrom typing import Optional, Dict, Any, List\nfrom autocoder.common.printer import Printer\nimport re\nfrom pydantic import BaseModel\n\nclass ProviderInfo(BaseModel):\n name: str\n endpoint: str\n r1_model: str\n v3_model: str\n api_key: str\n\n\nPROVIDER_INFO_LIST = [\n ProviderInfo(\n name=\"Volcano\",\n endpoint=\"https://ark.cn-beijing.volces.com/api/v3\", \n r1_model=\"\",\n v3_model=\"\",\n api_key=\"\",\n ), \n ProviderInfo(\n name=\"SiliconFlow\",\n endpoint=\"https://api.siliconflow.cn/v1\", \n r1_model=\"Pro/deepseek-ai/DeepSeek-R1\",\n v3_model=\"Pro/deepseek-ai/DeepSeek-V3\",\n api_key=\"\",\n ),\n ProviderInfo(\n name=\"DeepSeek\",\n endpoint=\"https://api.deepseek.com/v1\",\n r1_model=\"deepseek-reasoner\",\n v3_model=\"deepseek-chat\",\n api_key=\"\",\n ),\n]\n\nclass VolcanoEndpointValidator(Validator):\n def validate(self, document):\n text = document.text\n pattern = r'^ep-\\d{14}-[a-z0-9]{5}$'\n if not re.match(pattern, text):\n raise ValidationError(\n message='Invalid endpoint format. Should be like: ep-20250204215011-vzbsg',\n cursor_position=len(text)\n )\n\nclass ModelProviderSelector:\n def __init__(self):\n self.printer = Printer()\n self.console = Console()\n\n def to_models_json(self, provider_info: ProviderInfo) -> List[Dict[str, Any]]:\n \"\"\"\n Convert provider info to models.json format.\n \"\"\"\n return {\n \n }\n \n def select_provider(self) -> Optional[Dict[str, Any]]:\n \"\"\"\n Let user select a model provider and input necessary credentials.\n Returns a dictionary with provider info or None if cancelled.\n \"\"\"\n result = radiolist_dialog(\n title=self.printer.get_message_from_key(\"model_provider_select_title\"),\n text=self.printer.get_message_from_key(\"model_provider_select_text\"),\n values=[\n (\"volcano\", self.printer.get_message_from_key(\"model_provider_volcano\")),\n (\"siliconflow\", self.printer.get_message_from_key(\"model_provider_guiji\")),\n (\"deepseek\", self.printer.get_message_from_key(\"model_provider_deepseek\"))\n ]\n ).run()\n \n if result is None:\n return None\n \n provider_info = PROVIDER_INFO_LIST[result] \n \n if result == \"volcano\":\n # Get R1 endpoint\n r1_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_r1_text\"),\n validator=VolcanoEndpointValidator()\n ).run()\n \n if r1_endpoint is None:\n return None\n \n provider_info.r1_model = r1_endpoint\n \n # Get V3 endpoint\n v3_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_v3_text\"),\n validator=VolcanoEndpointValidator()\n ).run()\n \n if v3_endpoint is None:\n return None\n \n provider_info.v3_model = v3_endpoint\n \n # Get API key for all providers\n api_key = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(f\"model_provider_{result}_api_key_text\"),\n password=True\n ).run()\n \n if api_key is None:\n return None\n \n provider_info.api_key = api_key\n \n self.printer.print_panel(\n self.printer.get_message_from_key(\"model_provider_selected\"),\n text_options={\"justify\": \"left\"},\n panel_options={\n \"title\": self.printer.get_message_from_key(\"model_provider_success_title\"),\n \"border_style\": \"green\"\n }\n )\n \n return provider_info"}, "d3b1e65a04ba13d20ac7e72f802491837a787cff": {"t": 1785758548.1722963, "n": 4247, "h": "22d0c5d63e6a974c", "c": "from prompt_toolkit.shortcuts import radiolist_dialog, input_dialog\nfrom prompt_toolkit.validation import Validator, ValidationError\nfrom rich.console import Console\nfrom rich.panel import Panel\nfrom rich.text import Text\nfrom typing import Optional, Dict, Any\nfrom autocoder.common.printer import Printer\nimport re\nfrom pydantic import BaseModel\n\nclass ProviderInfo(BaseModel):\n name: str\n endpoint: str\n r1_model: str\n v3_model: str\n api_key: str\n\n\nPROVIDER_INFO_LIST = [\n ProviderInfo(\n name=\"Volcano\",\n endpoint=\"https://ark.cn-beijing.volces.com/api/v3\", \n r1_model=\"\",\n v3_model=\"\",\n api_key=\"\",\n ), \n ProviderInfo(\n name=\"SiliconFlow\",\n endpoint=\"https://api.siliconflow.cn/v1\", \n r1_model=\"Pro/deepseek-ai/DeepSeek-R1\",\n v3_model=\"Pro/deepseek-ai/DeepSeek-V3\",\n api_key=\"\",\n ),\n ProviderInfo(\n name=\"DeepSeek\",\n endpoint=\"https://api.deepseek.com/v1\",\n r1_model=\"deepseek-reasoner\",\n v3_model=\"deepseek-chat\",\n api_key=\"\",\n ),\n]\n\nclass VolcanoEndpointValidator(Validator):\n def validate(self, document):\n text = document.text\n pattern = r'^ep-\\d{14}-[a-z0-9]{5}$'\n if not re.match(pattern, text):\n raise ValidationError(\n message='Invalid endpoint format. Should be like: ep-20250204215011-vzbsg',\n cursor_position=len(text)\n )\n\nclass ModelProviderSelector:\n def __init__(self):\n self.printer = Printer()\n self.console = Console()\n \n def select_provider(self) -> Optional[Dict[str, Any]]:\n \"\"\"\n Let user select a model provider and input necessary credentials.\n Returns a dictionary with provider info or None if cancelled.\n \"\"\"\n result = radiolist_dialog(\n title=self.printer.get_message_from_key(\"model_provider_select_title\"),\n text=self.printer.get_message_from_key(\"model_provider_select_text\"),\n values=[\n (\"volcano\", self.printer.get_message_from_key(\"model_provider_volcano\")),\n (\"siliconflow\", self.printer.get_message_from_key(\"model_provider_guiji\")),\n (\"deepseek\", self.printer.get_message_from_key(\"model_provider_deepseek\"))\n ]\n ).run()\n \n if result is None:\n return None\n \n provider_info = PROVIDER_INFO_LIST[result] \n \n if result == \"volcano\":\n # Get R1 endpoint\n r1_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_r1_text\"),\n validator=VolcanoEndpointValidator()\n ).run()\n \n if r1_endpoint is None:\n return None\n \n provider_info.r1_model = r1_endpoint\n \n # Get V3 endpoint\n v3_endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_v3_text\"),\n validator=VolcanoEndpointValidator()\n ).run()\n \n if v3_endpoint is None:\n return None\n \n provider_info.v3_model = v3_endpoint\n \n # Get API key for all providers\n api_key = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(f\"model_provider_{result}_api_key_text\"),\n password=True\n ).run()\n \n if api_key is None:\n return None\n \n provider_info.api_key = api_key\n \n self.printer.print_panel(\n self.printer.get_message_from_key(\"model_provider_selected\"),\n text_options={\"justify\": \"left\"},\n panel_options={\n \"title\": self.printer.get_message_from_key(\"model_provider_success_title\"),\n \"border_style\": \"green\"\n }\n )\n \n return provider_info"}, "c6df2a6b5b4e4b8e3eef0083ed1059a0aaf40bec": {"t": 1785758550.0102804, "n": 3377, "h": "cd718f4615669661", "c": "from prompt_toolkit.shortcuts import radiolist_dialog, input_dialog\nfrom prompt_toolkit.validation import Validator, ValidationError\nfrom rich.console import Console\nfrom rich.panel import Panel\nfrom rich.text import Text\nfrom typing import Optional, Dict, Any\nfrom autocoder.common.printer import Printer\nimport re\nfrom pydantic import BaseModel\n\nclass ProviderInfo(BaseModel):\n name: str\n endpoint: str\n r1_model: str\n v3_model: str\n api_key: str\n\n\nPROVIDER_INFO_LIST = [\n ProviderInfo(\n name=\"Volcano\",\n endpoint=\"https://ark.cn-beijing.volces.com/api/v3\", \n r1_model=\"\",\n v3_model=\"\",\n api_key=\"\",\n ), \n ProviderInfo(\n name=\"SiliconFlow\",\n endpoint=\"https://api.siliconflow.cn/v1\", \n r1_model=\"Pro/deepseek-ai/DeepSeek-R1\",\n v3_model=\"Pro/deepseek-ai/DeepSeek-V3\",\n api_key=\"\",\n ),\n ProviderInfo(\n name=\"DeepSeek\",\n endpoint=\"https://api.deepseek.com/v1\",\n r1_model=\"deepseek-reasoner\",\n v3_model=\"deepseek-chat\",\n api_key=\"\",\n ),\n]\n\nclass VolcanoEndpointValidator(Validator):\n def validate(self, document):\n text = document.text\n pattern = r'^ep-\\d{14}-[a-z0-9]{5}$'\n if not re.match(pattern, text):\n raise ValidationError(\n message='Invalid endpoint format. Should be like: ep-20250204215011-vzbsg',\n cursor_position=len(text)\n )\n\nclass ModelProviderSelector:\n def __init__(self):\n self.printer = Printer()\n self.console = Console()\n \n def select_provider(self) -> Optional[Dict[str, Any]]:\n \"\"\"\n Let user select a model provider and input necessary credentials.\n Returns a dictionary with provider info or None if cancelled.\n \"\"\"\n result = radiolist_dialog(\n title=self.printer.get_message_from_key(\"model_provider_select_title\"),\n text=self.printer.get_message_from_key(\"model_provider_select_text\"),\n values=[\n (\"volcano\", self.printer.get_message_from_key(\"model_provider_volcano\")),\n (\"siliconflow\", self.printer.get_message_from_key(\"model_provider_guiji\")),\n (\"deepseek\", self.printer.get_message_from_key(\"model_provider_deepseek\"))\n ]\n ).run()\n \n if result is None:\n return None\n \n provider_info = PROVIDER_INFO_LIST[result] \n \n if result == \"volcano\":\n ## 这里新增 R1/V3 推理点收集\n pass \n \n # Get API key for all providers\n api_key = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(f\"model_provider_{result}_api_key_text\"),\n password=True\n ).run()\n \n if api_key is None:\n return None\n \n provider_info.api_key = api_key\n \n self.printer.print_panel(\n self.printer.get_message_from_key(\"model_provider_selected\"),\n text_options={\"justify\": \"left\"},\n panel_options={\n \"title\": self.printer.get_message_from_key(\"model_provider_success_title\"),\n \"border_style\": \"green\"\n }\n )\n \n return provider_info"}, "3f873401f3cf181b39703246db9c7248ddff5c5f": {"t": 1785758551.3920004, "n": 3393, "h": "6cfe7d32a294a8d0", "c": "from prompt_toolkit.shortcuts import radiolist_dialog, input_dialog\nfrom prompt_toolkit.validation import Validator, ValidationError\nfrom rich.console import Console\nfrom rich.panel import Panel\nfrom rich.text import Text\nfrom typing import Optional, Dict, Any\nfrom autocoder.common.printer import Printer\nimport re\n\nclass VolcanoEndpointValidator(Validator):\n def validate(self, document):\n text = document.text\n pattern = r'^ep-\\d{14}-[a-z0-9]{5}$'\n if not re.match(pattern, text):\n raise ValidationError(\n message='Invalid endpoint format. Should be like: ep-20250204215011-vzbsg',\n cursor_position=len(text)\n )\n\nclass ModelProviderSelector:\n def __init__(self):\n self.printer = Printer()\n self.console = Console()\n \n def select_provider(self) -> Optional[Dict[str, Any]]:\n \"\"\"\n Let user select a model provider and input necessary credentials.\n Returns a dictionary with provider info or None if cancelled.\n \"\"\"\n result = radiolist_dialog(\n title=self.printer.get_message_from_key(\"model_provider_select_title\"),\n text=self.printer.get_message_from_key(\"model_provider_select_text\"),\n values=[\n (\"volcano\", self.printer.get_message_from_key(\"model_provider_volcano\")),\n (\"guiji\", self.printer.get_message_from_key(\"model_provider_guiji\")),\n (\"deepseek\", self.printer.get_message_from_key(\"model_provider_deepseek\"))\n ]\n ).run()\n \n if result is None:\n return None\n \n provider_info = {\n \"provider\": result,\n \"base_url\": \"\",\n \"api_key\": \"\"\n }\n \n if result == \"volcano\":\n # Get Volcano endpoint\n endpoint = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_volcano_endpoint_title\"),\n text=self.printer.get_message_from_key(\"model_provider_volcano_endpoint_text\"),\n validator=VolcanoEndpointValidator()\n ).run()\n \n if endpoint is None:\n return None\n \n provider_info[\"endpoint\"] = endpoint\n provider_info[\"base_url\"] = f\"https://{endpoint}.volcengineapi.com\"\n \n elif result == \"guiji\":\n provider_info[\"base_url\"] = \"https://api.guiji.ai\"\n \n elif result == \"deepseek\":\n provider_info[\"base_url\"] = \"https://api.deepseek.com/v1\"\n \n # Get API key for all providers\n api_key = input_dialog(\n title=self.printer.get_message_from_key(\"model_provider_api_key_title\"),\n text=self.printer.get_message_from_key(f\"model_provider_{result}_api_key_text\"),\n password=True\n ).run()\n \n if api_key is None:\n return None\n \n provider_info[\"api_key\"] = api_key\n \n self.printer.print_panel(\n self.printer.get_message_from_key(\"model_provider_selected\"),\n text_options={\"justify\": \"left\"},\n panel_options={\n \"title\": self.printer.get_message_from_key(\"model_provider_success_title\"),\n \"border_style\": \"green\"\n }\n )\n \n return provider_info"}}}}