2025-04-17 11:34:42 +08:00
|
|
|
# Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
|
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
|
|
2025-04-07 16:25:55 +08:00
|
|
|
import os
|
|
|
|
|
from dataclasses import dataclass, fields
|
|
|
|
|
from typing import Any, Optional
|
|
|
|
|
|
|
|
|
|
from langchain_core.runnables import RunnableConfig
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass(kw_only=True)
|
|
|
|
|
class Configuration:
|
|
|
|
|
"""The configurable fields."""
|
|
|
|
|
|
2025-04-23 16:19:50 +08:00
|
|
|
max_plan_iterations: int = 1 # Maximum number of plan iterations
|
|
|
|
|
max_step_num: int = 3 # Maximum number of steps in a plan
|
2025-05-17 22:23:52 -07:00
|
|
|
max_search_results: int = 3 # Maximum number of search results
|
2025-04-23 16:19:50 +08:00
|
|
|
mcp_settings: dict = None # MCP settings, including dynamic loaded tools
|
2025-04-07 16:25:55 +08:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def from_runnable_config(
|
|
|
|
|
cls, config: Optional[RunnableConfig] = None
|
|
|
|
|
) -> "Configuration":
|
|
|
|
|
"""Create a Configuration instance from a RunnableConfig."""
|
|
|
|
|
configurable = (
|
|
|
|
|
config["configurable"] if config and "configurable" in config else {}
|
|
|
|
|
)
|
|
|
|
|
values: dict[str, Any] = {
|
|
|
|
|
f.name: os.environ.get(f.name.upper(), configurable.get(f.name))
|
|
|
|
|
for f in fields(cls)
|
|
|
|
|
if f.init
|
|
|
|
|
}
|
|
|
|
|
return cls(**{k: v for k, v in values.items() if v})
|