Skip to content
Open

desc #623

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 5 additions & 36 deletions aworld/config/conf.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# coding: utf-8
# Copyright (c) 2025 inclusionAI.
import copy
import os
import traceback
import uuid
Expand Down Expand Up @@ -82,12 +81,6 @@ class ClientType(Enum):
HTTP = "http"


class HistoryWriteStrategy(Enum):
"""History write strategy for memory operations."""
EVENT_DRIVEN = "event_driven" # Write through message system (default)
DIRECT = "direct" # Direct call to memory handler


class ConfigDict(dict):
"""Object mode operates dict, can read non-existent attributes through `get` method."""
__setattr__ = dict.__setitem__
Expand Down Expand Up @@ -160,10 +153,10 @@ class OptimizationConfig(BaseConfig):
class SummaryPromptConfig(BaseConfig):
"""Configuration for summary prompt templates."""

template: str = Field(description="Base template, such as AWORLD_MEMORY_EXTRACT_NEW_SUMMARY")
summary_rule: str = Field(description="Summary rule, used to guide how to generate summaries")
summary_schema: str = Field(description="Summary schema, defines output format and structure")
memory_type: str = Field(default="summary", description="Memory type, used to distinguish different types of summaries")
template: str = Field(description="基础模板,如 AWORLD_MEMORY_EXTRACT_NEW_SUMMARY")
summary_rule: str = Field(description="摘要规则,用于指导如何生成摘要")
summary_schema: str = Field(description="摘要模式,定义输出格式和结构")
memory_type: str = Field(default="summary", description="记忆类型,用于区分不同类型的摘要")


class ContextRuleConfig(BaseConfig):
Expand All @@ -186,9 +179,6 @@ class AgentMemoryConfig(BaseConfig):
# short-term config
history_rounds: int = Field(default=100,
description="rounds of message msg; when the number of messages is greater than the history_rounds, the memory will be trimmed")
history_write_strategy: HistoryWriteStrategy = Field(default=HistoryWriteStrategy.EVENT_DRIVEN,
description="History write strategy: event_driven (through message system) or direct (direct call to handler)")

enable_summary: bool = Field(default=False,
description="enable_summary use llm to create summary short-term memory")
summary_model: Optional[str] = Field(default=None, description="short-term summary model")
Expand All @@ -197,34 +187,14 @@ class AgentMemoryConfig(BaseConfig):
summary_context_length: Optional[int] = Field(default=40960,
description=" when the content length is greater than the summary_context_length, the summary will be created")
summary_prompts: Optional[List[SummaryPromptConfig]] = Field(default=[])
summary_summaried: Optional[bool] = Field(default=True, description="to summary summary message when summary triggered")
summary_role: Optional[str] = Field(default="assistant", description="role for summary memory items")
summary_summaried: Optional[bool] = Field(default=True, description="whether to summarize historical summary messages when summary is triggered")

# Long-term memory config
enable_long_term: bool = Field(default=False, description="enable_long_term use to store long-term memory")
long_term_model: Optional[str] = Field(default=None, description="long-term extract model")
# LongTermConfig
long_term_config: Optional[BaseModel] = Field(default=None, description="long_term_config")

def __deepcopy__(self, memo=None):
"""Support copy.deepcopy for AgentMemoryConfig."""
if memo is None:
memo = {}

# Check if already copied (avoid circular references)
if id(self) in memo:
return memo[id(self)]

# Create a new instance using model_dump and model_validate to avoid recursion
# Use mode='python' to get plain Python objects
data = self.model_dump(mode='python')
# Deep copy the data dict to handle nested objects
copied_data = copy.deepcopy(data, memo)
# Create new instance from copied data
new_instance = self.__class__.model_validate(copied_data)
memo[id(self)] = new_instance
return new_instance


class AgentConfig(BaseConfig):
llm_config: ModelConfig = ModelConfig()
Expand All @@ -246,7 +216,6 @@ class AgentConfig(BaseConfig):
exit_on_failure: bool = False
human_tools: List[str] = []
skill_configs: Dict[str, Any] = None
ext: dict = {}

def __init__(self, **kwargs):
super().__init__(**kwargs)
Expand Down
89 changes: 26 additions & 63 deletions aworld/core/context/amni/config.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
# coding: utf-8
# Copyright (c) 2025 inclusionAI.
import logging
import os
import queue
import threading
from enum import Enum
from typing import Optional, List, Union, Dict
from logging.handlers import TimedRotatingFileHandler
from typing import Optional, List, Union, Dict, Any

from pydantic import BaseModel, Field

from aworld.config import ModelConfig
from aworld.config.conf import AgentMemoryConfig, SummaryPromptConfig, HistoryWriteStrategy
from aworld.core.memory import MemoryConfig
from aworld.config.conf import AgentMemoryConfig, SummaryPromptConfig
from aworld.core.memory import MemoryConfig, MemoryLLMConfig, EmbeddingsConfig
from aworld.memory.db.sqlite import SQLiteMemoryStore
# from aworld.memory.db import SQLiteMemoryStore # Temporarily commented out to avoid import errors
from aworld.memory.main import MemoryFactory
from .retrieval.base import RetrieverFactory
from .retrieval.graph.base import GraphDBConfig
from ...event.base import TopicType


Expand Down Expand Up @@ -88,8 +93,6 @@ class AgentContextConfig(BaseConfig):
# Context Reduce - Purge
history_rounds: int = Field(default=100,
description="rounds of message msg; when the number of messages is greater than the history_rounds, the memory will be trimmed")
history_write_strategy: HistoryWriteStrategy = Field(default=HistoryWriteStrategy.EVENT_DRIVEN,
description="History write strategy: event_driven (through message system) or direct (direct call to handler)")

# Context Reduce - Compress
enable_summary: bool = Field(default=False,
Expand All @@ -100,8 +103,7 @@ class AgentContextConfig(BaseConfig):
summary_context_length: Optional[int] = Field(default=40960,
description=" when the content length is greater than the summary_context_length, the summary will be created")
summary_prompts: Optional[List[SummaryPromptConfig]] = Field(default=[])
summary_summaried: Optional[bool] = Field(default=True, description="summary_summaried use to store summary memory")
summary_role: Optional[str] = Field(default="user", description="role for summary memory items")
summary_summaried: Optional[bool] = Field(default=True, description="whether to summarize historical summary messages when summary is triggered")

# Context Offload
tool_result_offload: bool = Field(default=False, description="tool result offload")
Expand All @@ -117,61 +119,22 @@ class AgentContextConfig(BaseConfig):
def to_memory_config(self) -> AgentMemoryConfig:
return AgentMemoryConfig(
history_rounds=self.history_rounds,
history_write_strategy=self.history_write_strategy,
enable_summary=self.enable_summary,
summary_rounds=self.summary_rounds,
summary_context_length=self.summary_context_length,
summary_prompts=self.summary_prompts,
summary_summaried=self.summary_summaried,
summary_role=self.summary_role
summary_summaried=self.summary_summaried
)


DEFAULT_AGENT_CONFIG = AgentContextConfig()

class WorkingDirOssConfig(BaseModel):
"""OSS configuration for working directory."""
access_key_id: Optional[str] = Field(
default=None,
description="OSS access key ID. Priority: config > WORKING_DIR_OSS_ACCESS_KEY_ID > OSS_ACCESS_KEY_ID"
)
access_key_secret: Optional[str] = Field(
default=None,
description="OSS access key secret. Priority: config > WORKING_DIR_OSS_ACCESS_KEY_SECRET > OSS_ACCESS_KEY_SECRET"
)
endpoint: Optional[str] = Field(
default=None,
description="OSS endpoint. Priority: config > WORKING_DIR_OSS_ENDPOINT > OSS_ENDPOINT"
)
bucket_name: Optional[str] = Field(
default=None,
description="OSS bucket name. Priority: config > WORKING_DIR_OSS_BUCKET_NAME > OSS_BUCKET_NAME"
)

class ContextEnvConfig(BaseModel):
"""Represents environment configuration for an agent team."""
isolate: bool = Field(default=False, description="One Task, One Isolate Env")
env_type: str = Field(default="local", description="Env Type, local|remote")
env_mount_path: str = Field(default="~/workspace", description="Env Working directory for share")
env_config: dict = Field(default_factory=dict, description="Env Config")

# Working directory path configuration
working_dir_base_path: Optional[str] = Field(
default=None,
description="Base path for working directory. Priority: config > WORKING_DIR_BASE_PATH > WORKING_DIR_OSS_BASE_PATH > WORKSPACE_PATH"
)
working_dir_path_template: Optional[str] = Field(
default=None,
description="Template for working directory path. Supports placeholders: {base_path}, {session_id}. "
"Example: '{base_path}/custom/{session_id}/workspace' or '{base_path}/{session_id}/files'. "
"Priority: config > WORKING_DIR_PATH_TEMPLATE > default"
)

# OSS configuration for remote working directory
working_dir_oss_config: Optional[WorkingDirOssConfig] = Field(
default=None,
description="OSS configuration for working directory. Priority: config > WORKING_DIR_OSS_* > OSS_* environment variables"
)

class AmniContextConfig(BaseConfig):
"""AmniContext configs"""
Expand Down Expand Up @@ -219,6 +182,7 @@ def init_middlewares(init_memory: bool = True, init_retriever: bool = True) -> N
RetrieverFactory.init()

def build_memory_config():
from aworld.core.memory import VectorDBConfig
return MemoryConfig(
provider="aworld",
llm_config=ModelConfig(
Expand All @@ -227,19 +191,19 @@ def build_memory_config():
api_key=os.getenv("LLM_API_KEY"),
base_url=os.getenv("LLM_BASE_URL")
),
# embedding_config=EmbeddingsConfig(
# base_url=os.getenv('EMBEDDING_BASE_URL'),
# api_key=os.getenv('EMBEDDING_API_KEY'),
# model_name=os.getenv('EMBEDDING_MODEL_NAME'),
# dimensions=int(os.getenv('EMBEDDING_MODEL_DIMENSIONS', '1024'))
# ),
# vector_store_config=VectorDBConfig(
# provider="chroma",
# config={
# "chroma_data_path": os.getenv('CHROMA_PATH', "./data/chroma_db"),
# "collection_name": "aworld_memory",
# }
# )
embedding_config=EmbeddingsConfig(
base_url=os.getenv('EMBEDDING_BASE_URL'),
api_key=os.getenv('EMBEDDING_API_KEY'),
model_name=os.getenv('EMBEDDING_MODEL_NAME'),
dimensions=int(os.getenv('EMBEDDING_MODEL_DIMENSIONS', '1024'))
),
vector_store_config=VectorDBConfig(
provider="chroma",
config={
"chroma_data_path": os.getenv('CHROMA_PATH', "./data/chroma_db"),
"collection_name": "aworld_memory",
}
)
)


Expand Down Expand Up @@ -274,6 +238,7 @@ def get_default_config() -> AmniContextConfig:
priority=0
)
],
debug_mode=True
)


Expand Down Expand Up @@ -311,9 +276,7 @@ def create(level: Optional[AmniConfigLevel] = None,

if not level or level == AmniConfigLevel.PILOT or level == AmniConfigLevel.COPILOT:
config = get_default_config()
config.agent_config = AgentContextConfig(neuron_names=neuron_names)
if neuron_names:
config.agent_config.enable_system_prompt_augment = True
config.agent_config = AgentContextConfig()
config.debug_mode = debug_mode
config.env_config = env_config
return config
Expand Down