Spaces:
Running
Running
| #!/usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| """ | |
| @Time : 2024/1/4 01:25 | |
| @Author : alexanderwu | |
| @File : config2.py | |
| """ | |
| import os | |
| from pathlib import Path | |
| from typing import Dict, Iterable, List, Literal, Optional | |
| from pydantic import BaseModel, model_validator | |
| from metagpt.configs.browser_config import BrowserConfig | |
| from metagpt.configs.embedding_config import EmbeddingConfig | |
| from metagpt.configs.file_parser_config import OmniParseConfig | |
| from metagpt.configs.llm_config import LLMConfig, LLMType | |
| from metagpt.configs.mermaid_config import MermaidConfig | |
| from metagpt.configs.redis_config import RedisConfig | |
| from metagpt.configs.s3_config import S3Config | |
| from metagpt.configs.search_config import SearchConfig | |
| from metagpt.configs.workspace_config import WorkspaceConfig | |
| from metagpt.const import CONFIG_ROOT, METAGPT_ROOT | |
| from metagpt.utils.yaml_model import YamlModel | |
| class CLIParams(BaseModel): | |
| """CLI parameters""" | |
| project_path: str = "" | |
| project_name: str = "" | |
| inc: bool = False | |
| reqa_file: str = "" | |
| max_auto_summarize_code: int = 0 | |
| git_reinit: bool = False | |
| def check_project_path(self): | |
| """Check project_path and project_name""" | |
| if self.project_path: | |
| self.inc = True | |
| self.project_name = self.project_name or Path(self.project_path).name | |
| return self | |
| class Config(CLIParams, YamlModel): | |
| """Configurations for MetaGPT""" | |
| # Key Parameters | |
| llm: LLMConfig | |
| # RAG Embedding | |
| embedding: EmbeddingConfig = EmbeddingConfig() | |
| # omniparse | |
| omniparse: OmniParseConfig = OmniParseConfig() | |
| # Global Proxy. Will be used if llm.proxy is not set | |
| proxy: str = "" | |
| # Tool Parameters | |
| search: SearchConfig = SearchConfig() | |
| browser: BrowserConfig = BrowserConfig() | |
| mermaid: MermaidConfig = MermaidConfig() | |
| # Storage Parameters | |
| s3: Optional[S3Config] = None | |
| redis: Optional[RedisConfig] = None | |
| # Misc Parameters | |
| repair_llm_output: bool = False | |
| prompt_schema: Literal["json", "markdown", "raw"] = "json" | |
| workspace: WorkspaceConfig = WorkspaceConfig() | |
| enable_longterm_memory: bool = False | |
| code_review_k_times: int = 2 | |
| agentops_api_key: str = "" | |
| # Will be removed in the future | |
| metagpt_tti_url: str = "" | |
| language: str = "English" | |
| redis_key: str = "placeholder" | |
| iflytek_app_id: str = "" | |
| iflytek_api_secret: str = "" | |
| iflytek_api_key: str = "" | |
| azure_tts_subscription_key: str = "" | |
| azure_tts_region: str = "" | |
| _extra: dict = dict() # extra config dict | |
| def from_home(cls, path): | |
| """Load config from ~/.metagpt/config2.yaml""" | |
| pathname = CONFIG_ROOT / path | |
| if not pathname.exists(): | |
| return None | |
| return Config.from_yaml_file(pathname) | |
| def default(cls): | |
| """Load default config | |
| - Priority: env < default_config_paths | |
| - Inside default_config_paths, the latter one overwrites the former one | |
| """ | |
| default_config_paths: List[Path] = [ | |
| METAGPT_ROOT / "config/config2.yaml", | |
| CONFIG_ROOT / "config2.yaml", | |
| ] | |
| dicts = [dict(os.environ)] | |
| dicts += [Config.read_yaml(path) for path in default_config_paths] | |
| final = merge_dict(dicts) | |
| return Config(**final) | |
| def from_llm_config(cls, llm_config: dict): | |
| """user config llm | |
| example: | |
| llm_config = {"api_type": "xxx", "api_key": "xxx", "model": "xxx"} | |
| gpt4 = Config.from_llm_config(llm_config) | |
| A = Role(name="A", profile="Democratic candidate", goal="Win the election", actions=[a1], watch=[a2], config=gpt4) | |
| """ | |
| llm_config = LLMConfig.model_validate(llm_config) | |
| dicts = [dict(os.environ)] | |
| dicts += [{"llm": llm_config}] | |
| final = merge_dict(dicts) | |
| return Config(**final) | |
| def update_via_cli(self, project_path, project_name, inc, reqa_file, max_auto_summarize_code): | |
| """update config via cli""" | |
| # Use in the PrepareDocuments action according to Section 2.2.3.5.1 of RFC 135. | |
| if project_path: | |
| inc = True | |
| project_name = project_name or Path(project_path).name | |
| self.project_path = project_path | |
| self.project_name = project_name | |
| self.inc = inc | |
| self.reqa_file = reqa_file | |
| self.max_auto_summarize_code = max_auto_summarize_code | |
| def extra(self): | |
| return self._extra | |
| def extra(self, value: dict): | |
| self._extra = value | |
| def get_openai_llm(self) -> Optional[LLMConfig]: | |
| """Get OpenAI LLMConfig by name. If no OpenAI, raise Exception""" | |
| if self.llm.api_type == LLMType.OPENAI: | |
| return self.llm | |
| return None | |
| def get_azure_llm(self) -> Optional[LLMConfig]: | |
| """Get Azure LLMConfig by name. If no Azure, raise Exception""" | |
| if self.llm.api_type == LLMType.AZURE: | |
| return self.llm | |
| return None | |
| def merge_dict(dicts: Iterable[Dict]) -> Dict: | |
| """Merge multiple dicts into one, with the latter dict overwriting the former""" | |
| result = {} | |
| for dictionary in dicts: | |
| result.update(dictionary) | |
| return result | |
| config = Config.default() | |