|
19 | 19 | from rich.console import Console |
20 | 20 | from rich.panel import Panel |
21 | 21 | from rich.table import Table |
22 | | -from rich.console import Group |
| 22 | +from rich import box |
23 | 23 |
|
24 | 24 | # 从 src 导入重构后的模块 |
25 | | -from src.utils.config import KB_CONFIG, CHAT_CONFIG, API_CONFIG |
| 25 | +from src.utils.config import settings, KB_CONFIG, API_CONFIG |
26 | 26 | from src.providers.factory import ModelProviderFactory |
27 | 27 | from src.retrieval.retriever import VectorStore # VectorStore现在从这里导入 |
28 | 28 | from src.ui.display_utils import CONSOLE_WIDTH, get_relative_path |
@@ -126,35 +126,68 @@ def process_documents(vector_store: VectorStore): |
126 | 126 | # 4. 辅助与主函数 (HELPERS & MAIN) |
127 | 127 | # ================================================================= |
128 | 128 | def display_config_and_confirm(): |
129 | | - """显示全面的配置信息并请求用户确认。""" |
| 129 | + """以美观的表格形式显示全面的配置信息,并请求用户确认。""" |
130 | 130 | console = Console() |
131 | 131 |
|
132 | 132 | def mask_api_key(key: Optional[str]) -> str: |
133 | | - if not key: return "[dim]未设置[/dim]" |
134 | | - return f"{key[:10]}..." |
135 | | - |
136 | | - kb_table = Table(title="[bold green]知识库构建配置 (KB_CONFIG)[/bold green]", show_header=False, box=None, padding=(0, 1)) |
137 | | - kb_table.add_column(style="cyan") |
138 | | - kb_table.add_column(style="bold white") |
139 | | - active_embedding = KB_CONFIG['active_embedding_configuration'] |
140 | | - embedding_model_details = KB_CONFIG['embedding_configurations'][active_embedding] |
141 | | - kb_table.add_row("激活的嵌入模型:", f"{active_embedding} ({embedding_model_details['provider']}: {embedding_model_details['model_name']})") |
142 | | - kb_table.add_row("知识库目录:", get_relative_path(KB_CONFIG['kb_dir'])) |
143 | | - kb_table.add_row("输出文件:", get_relative_path(KB_CONFIG['output_file'])) |
| 133 | + """对API密钥进行脱敏处理,使其更安全地显示。""" |
| 134 | + if not key or key == "lm-studio": |
| 135 | + return "[dim]未设置或无需设置[/dim]" |
| 136 | + if len(key) > 12: |
| 137 | + return f"[white]{key[:6]}...{key[-4:]}[/white]" |
| 138 | + return "[white]已设置[/white]" |
| 139 | + |
| 140 | + table = Table( |
| 141 | + box=box.ROUNDED, |
| 142 | + padding=(0, 2), |
| 143 | + title="[bold yellow]向量化脚本配置总览[/bold yellow]", |
| 144 | + show_header=False, |
| 145 | + width=CONSOLE_WIDTH |
| 146 | + ) |
| 147 | + # 参数名列: 蓝色 |
| 148 | + table.add_column(justify="right", style="cyan", no_wrap=True, width=28) |
| 149 | + # 参数值列: 亮白色 |
| 150 | + table.add_column(style="bright_white") |
| 151 | + |
| 152 | + # --- 知识库配置 --- |
| 153 | + table.add_row("[bold green]知识库配置[/bold green]", "") |
| 154 | + table.add_row("知识库目录", f"[bold cyan]{get_relative_path(settings.knowledge_base_path)}[/bold cyan]") |
| 155 | + table.add_row("输出文件路径", f"[bold cyan]{get_relative_path(settings.pkl_path)}[/bold cyan]") |
| 156 | + table.add_row("文本切分块大小 (Chunk Size)", f"[bold magenta]{settings.kb_chunk_size}[/bold magenta]") |
| 157 | + table.add_row("文本切分重叠量 (Overlap)", f"[bold magenta]{settings.kb_chunk_overlap}[/bold magenta]") |
| 158 | + table.add_row("切分分隔符 (Separators)", f"[bold bright_white]{settings.kb_splitter_separators}[/bold bright_white]") |
| 159 | + table.add_section() |
| 160 | + |
| 161 | + # --- 模型与API配置 --- |
| 162 | + table.add_row("[bold green]模型与API配置[/bold green]", "") |
| 163 | + active_embedding_key = settings.default_embedding_provider |
| 164 | + embedding_model_details = settings.embedding_configurations[active_embedding_key] |
| 165 | + provider = embedding_model_details.provider |
144 | 166 |
|
145 | | - api_table = Table(title="[bold green]相关API配置[/bold green]", show_header=False, box=None, padding=(0, 1)) |
146 | | - api_table.add_column(style="cyan") |
147 | | - api_table.add_column(style="bold white") |
148 | | - provider = embedding_model_details['provider'] |
149 | | - key_name = f"{provider.upper()}_API_KEY" |
150 | | - url_name = f"{provider.upper()}_BASE_URL" |
151 | | - if key_name in API_CONFIG: |
152 | | - api_table.add_row(f"{key_name}:", mask_api_key(API_CONFIG.get(key_name))) |
153 | | - if url_name in API_CONFIG and API_CONFIG.get(url_name): |
154 | | - api_table.add_row(f"{url_name}:", API_CONFIG.get(url_name)) |
155 | | - |
156 | | - console.print(Panel(Group(kb_table, api_table), title="[bold yellow]向量化脚本配置总览[/bold yellow]", border_style="blue", width=CONSOLE_WIDTH)) |
157 | | - console.print("[yellow]配置信息来源于 [bold]src/utils/config.py[/bold] 和 [bold].env[/bold] 文件。[/yellow]") |
| 167 | + table.add_row("激活的嵌入模型 (Provider)", f"[bold green]{active_embedding_key}[/bold green] ([dim]{provider}[/dim])") |
| 168 | + table.add_row("模型名称 (Model Name)", f"[bold bright_white]{embedding_model_details.model_name}[/bold bright_white]") |
| 169 | + |
| 170 | + # 动态获取API Key和Base URL的字段名 |
| 171 | + key_field_name = f"{provider.lower()}_api_key" |
| 172 | + |
| 173 | + # 处理不一致的URL字段名 |
| 174 | + url_field_name = "" |
| 175 | + if provider == "openai": |
| 176 | + url_field_name = "openai_api_base" |
| 177 | + elif hasattr(settings, f"{provider.lower()}_base_url"): |
| 178 | + url_field_name = f"{provider.lower()}_base_url" |
| 179 | + |
| 180 | + api_key_value = getattr(settings, key_field_name, None) |
| 181 | + # mask_api_key 函数已内置样式,无需额外添加 |
| 182 | + table.add_row(f"对应的 API Key ({key_field_name.upper()})", mask_api_key(api_key_value)) |
| 183 | + |
| 184 | + if url_field_name: |
| 185 | + base_url_value = getattr(settings, url_field_name, None) |
| 186 | + if base_url_value: |
| 187 | + table.add_row(f"对应的 Base URL ({url_field_name.upper()})", f"[bold cyan]{base_url_value}[/bold cyan]") |
| 188 | + |
| 189 | + console.print(table) |
| 190 | + console.print("[yellow]配置信息来源于 [bold]config.ini[/bold], [bold].env[/bold] 文件或 [bold]环境变量[/bold]。[/yellow]") |
158 | 191 |
|
159 | 192 | choice = console.input("是否使用以上配置继续处理? ([bold green]y[/bold green]/[bold red]n[/bold red]): ").lower() |
160 | 193 | if choice not in ['y', 'yes']: |
|
0 commit comments