AgentFrame-v2 / config.py
ljsysfurry's picture
Upload folder using huggingface_hub
c2179b0 verified
Raw
History Blame Contribute Delete
3.21 kB
"""AgentFrame 配置系统: 环境变量 + JSON 配置文件 + 默认值"""
import json
import os
from dataclasses import dataclass, field, asdict
@dataclass
class LLMConfig:
"""LLM Provider 配置"""
provider: str = "deepseek" # deepseek | openai | mock
api_key: str = "" # 从环境变量 AGENTFRAME_API_KEY 或 DEEPSEEK_API_KEY
base_url: str = "https://api.deepseek.com/v1"
model: str = "deepseek-v4-pro" # 主模型
fast_model: str = "deepseek-v4-flash" # 快速模型 (检测/摘要)
max_tokens: int = 2000
temperature: float = 0.8
timeout: int = 120
@dataclass
class MemoryConfig:
"""上下文保持核心配置"""
n_layers: int = 27 # 模型层数 (DeepSeek-V2 27 层)
quant_bits: int = 4 # 量化位宽 (4 = INT4, 35.6x)
top_k: int = 32 # 路由检索 top-k
vram_limit_mb: int = 10240 # 显存层上限
ram_limit_mb: int = 32768 # 内存层上限
seed: int = 42
reversible: bool = False # 可逆量化开关
@dataclass
class APIConfig:
"""API 服务配置"""
host: str = "0.0.0.0"
port: int = 8090
debug: bool = False
max_history_turns: int = 12 # 对话历史保留轮数
@dataclass
class AgentFrameConfig:
"""总配置"""
llm: LLMConfig = field(default_factory=LLMConfig)
memory: MemoryConfig = field(default_factory=MemoryConfig)
api: APIConfig = field(default_factory=APIConfig)
@classmethod
def from_env(cls) -> "AgentFrameConfig":
"""从环境变量加载 (最高优先级)"""
cfg = cls()
cfg.llm.api_key = (
os.environ.get("AGENTFRAME_API_KEY")
or os.environ.get("DEEPSEEK_API_KEY")
or cfg.llm.api_key
)
cfg.llm.base_url = os.environ.get("AGENTFRAME_BASE_URL", cfg.llm.base_url)
cfg.llm.model = os.environ.get("AGENTFRAME_MODEL", cfg.llm.model)
cfg.llm.fast_model = os.environ.get("AGENTFRAME_FAST_MODEL", cfg.llm.fast_model)
cfg.api.port = int(os.environ.get("AGENTFRAME_PORT", cfg.api.port))
return cfg
@classmethod
def from_file(cls, path: str) -> "AgentFrameConfig":
"""从 JSON 配置文件加载"""
with open(path) as f:
data = json.load(f)
cfg = cls.from_env()
# 覆盖: 文件 < 环境变量
if "llm" in data:
for k, v in data["llm"].items():
setattr(cfg.llm, k, v)
if "memory" in data:
for k, v in data["memory"].items():
setattr(cfg.memory, k, v)
if "api" in data:
for k, v in data["api"].items():
setattr(cfg.api, k, v)
return cfg
def to_dict(self) -> dict:
"""导出为 dict (序列化用)"""
return {
"llm": asdict(self.llm),
"memory": asdict(self.memory),
"api": asdict(self.api),
}
def save(self, path: str):
"""保存配置到 JSON"""
with open(path, "w") as f:
json.dump(self.to_dict(), f, indent=2, ensure_ascii=False)