Coverage for aipyapp/aipy/wizard.py: 0%
64 statements
« prev ^ index » next coverage.py v7.10.3, created at 2025-08-11 12:02 +0200
« prev ^ index » next coverage.py v7.10.3, created at 2025-08-11 12:02 +0200
1from collections import OrderedDict
2import questionary
3import requests
5from loguru import logger
7from .. import T
8from ..config.llm import LLMConfig, PROVIDERS
9from .trustoken import TrustToken
11def get_models(providers, provider, api_key: str) -> list:
12 """获取可用的模型列表"""
13 provider_info = providers[provider]
14 headers = {
15 "Content-Type": "application/json"
16 }
18 if provider == "Claude":
19 headers["x-api-key"] = api_key
20 headers["anthropic-version"] = "2023-06-01"
21 else:
22 headers["Authorization"] = f"Bearer {api_key}"
24 try:
25 response = requests.get(
26 f"{provider_info['api_base']}{provider_info['models_endpoint']}",
27 headers=headers
28 )
29 logger.info(f"获取模型列表: {response.text}")
30 if response.status_code == 200:
31 data = response.json()
32 logger.info(f"获取模型列表成功: {data}")
33 if provider in ["OpenAI", "DeepSeek", "xAI", "Claude"]:
34 return [model["id"] for model in data["data"]]
35 elif provider == "Gemini":
36 return [model["name"] for model in data["models"]]
37 return []
38 except Exception as e:
39 logger.error(f"获取模型列表失败: {str(e)}")
40 return [] # 如果API调用失败,返回空列表
42def select_provider(llm_config, default='Trustoken'):
43 """选择提供商"""
44 while True:
45 name = questionary.select(
46 T('Select LLM Provider'),
47 choices=[
48 questionary.Choice(title=T('Trustoken is an intelligent API Key management service'), value='Trustoken', description=T('Recommended for beginners, easy to configure and feature-rich')),
49 questionary.Choice(title=T('Other'), value='other')
50 ],
51 default=default
52 ).unsafe_ask()
53 if name == default:
54 return default
56 names = [name for name in llm_config.providers.keys() if name != default]
57 names.append('<--')
58 name = questionary.select(
59 T('Select other providers'),
60 choices=names
61 ).unsafe_ask()
62 if name != '<--':
63 return name
66def config_llm(llm_config):
67 """配置 LLM 提供商"""
68 # 第一步:选择提供商
69 name = select_provider(llm_config)
70 if not name:
71 return None
72 provider = llm_config.providers[name]
73 config = {"type": provider["type"]}
75 if name == 'Trustoken':
76 def save_token(token):
77 config['api_key'] = token
79 tt = TrustToken()
80 if not tt.fetch_token(save_token):
81 return None
83 config['model'] = 'auto'
84 else:
85 api_key = questionary.text(
86 T('Enter your API key'),
87 validate=lambda x: len(x) > 8
88 ).unsafe_ask()
89 config['api_key'] = api_key
91 # 获取可用模型列表
92 available_models = get_models(llm_config.providers, name, api_key)
93 if not available_models:
94 logger.warning(T('Model list acquisition failed'))
95 return None
97 # 第三步:选择模型
98 model = questionary.select(
99 T('Available Models'),
100 choices=available_models
101 ).unsafe_ask()
102 config['model'] = model
104 # 保存配置
105 config['enable'] = True
106 current_config = llm_config.config
107 current_config[name] = config
108 llm_config.save_config(current_config)
109 return current_config