pycityagent 2.0.0a6__py3-none-any.whl → 2.0.0a8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pycityagent/agent.py +29 -5
 - pycityagent/environment/interact/interact.py +86 -29
 - pycityagent/environment/sence/static.py +3 -2
 - pycityagent/environment/sim/aoi_service.py +1 -1
 - pycityagent/environment/sim/economy_services.py +1 -1
 - pycityagent/environment/sim/road_service.py +1 -1
 - pycityagent/environment/sim/social_service.py +1 -1
 - pycityagent/environment/simulator.py +6 -4
 - pycityagent/environment/utils/__init__.py +5 -1
 - pycityagent/llm/__init__.py +1 -1
 - pycityagent/llm/embedding.py +36 -35
 - pycityagent/llm/llm.py +197 -161
 - pycityagent/llm/llmconfig.py +7 -9
 - pycityagent/llm/utils.py +2 -2
 - pycityagent/memory/memory.py +1 -2
 - pycityagent/memory/memory_base.py +1 -2
 - pycityagent/memory/profile.py +1 -2
 - pycityagent/memory/self_define.py +1 -2
 - pycityagent/memory/state.py +1 -2
 - pycityagent/message/__init__.py +1 -1
 - pycityagent/message/messager.py +11 -4
 - pycityagent/simulation/__init__.py +1 -1
 - pycityagent/simulation/agentgroup.py +39 -11
 - pycityagent/simulation/interview.py +9 -5
 - pycityagent/simulation/simulation.py +181 -61
 - pycityagent/simulation/survey/__init__.py +1 -6
 - pycityagent/simulation/survey/manager.py +22 -21
 - pycityagent/simulation/survey/models.py +8 -5
 - pycityagent/utils/decorators.py +14 -4
 - pycityagent/utils/parsers/__init__.py +2 -1
 - pycityagent/workflow/block.py +4 -3
 - pycityagent/workflow/prompt.py +16 -9
 - pycityagent/workflow/tool.py +1 -2
 - pycityagent/workflow/trigger.py +36 -23
 - {pycityagent-2.0.0a6.dist-info → pycityagent-2.0.0a8.dist-info}/METADATA +1 -1
 - pycityagent-2.0.0a8.dist-info/RECORD +70 -0
 - pycityagent-2.0.0a6.dist-info/RECORD +0 -70
 - {pycityagent-2.0.0a6.dist-info → pycityagent-2.0.0a8.dist-info}/WHEEL +0 -0
 
| 
         @@ -4,6 +4,7 @@ from datetime import datetime 
     | 
|
| 
       4 
4 
     | 
    
         
             
            from enum import Enum
         
     | 
| 
       5 
5 
     | 
    
         
             
            import uuid
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
       7 
8 
     | 
    
         
             
            class QuestionType(Enum):
         
     | 
| 
       8 
9 
     | 
    
         
             
                TEXT = "文本"
         
     | 
| 
       9 
10 
     | 
    
         
             
                SINGLE_CHOICE = "单选"
         
     | 
| 
         @@ -11,6 +12,7 @@ class QuestionType(Enum): 
     | 
|
| 
       11 
12 
     | 
    
         
             
                RATING = "评分"
         
     | 
| 
       12 
13 
     | 
    
         
             
                LIKERT = "李克特量表"
         
     | 
| 
       13 
14 
     | 
    
         | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
       14 
16 
     | 
    
         
             
            @dataclass
         
     | 
| 
       15 
17 
     | 
    
         
             
            class Question:
         
     | 
| 
       16 
18 
     | 
    
         
             
                content: str
         
     | 
| 
         @@ -19,7 +21,7 @@ class Question: 
     | 
|
| 
       19 
21 
     | 
    
         
             
                options: List[str] = field(default_factory=list)
         
     | 
| 
       20 
22 
     | 
    
         
             
                min_rating: int = 1
         
     | 
| 
       21 
23 
     | 
    
         
             
                max_rating: int = 5
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
       23 
25 
     | 
    
         
             
                def to_dict(self) -> dict:
         
     | 
| 
       24 
26 
     | 
    
         
             
                    return {
         
     | 
| 
       25 
27 
     | 
    
         
             
                        "content": self.content,
         
     | 
| 
         @@ -27,9 +29,10 @@ class Question: 
     | 
|
| 
       27 
29 
     | 
    
         
             
                        "required": self.required,
         
     | 
| 
       28 
30 
     | 
    
         
             
                        "options": self.options,
         
     | 
| 
       29 
31 
     | 
    
         
             
                        "min_rating": self.min_rating,
         
     | 
| 
       30 
     | 
    
         
            -
                        "max_rating": self.max_rating
         
     | 
| 
      
 32 
     | 
    
         
            +
                        "max_rating": self.max_rating,
         
     | 
| 
       31 
33 
     | 
    
         
             
                    }
         
     | 
| 
       32 
34 
     | 
    
         | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
       33 
36 
     | 
    
         
             
            @dataclass
         
     | 
| 
       34 
37 
     | 
    
         
             
            class Survey:
         
     | 
| 
       35 
38 
     | 
    
         
             
                id: str
         
     | 
| 
         @@ -38,12 +41,12 @@ class Survey: 
     | 
|
| 
       38 
41 
     | 
    
         
             
                questions: List[Question]
         
     | 
| 
       39 
42 
     | 
    
         
             
                responses: Dict[str, dict] = field(default_factory=dict)
         
     | 
| 
       40 
43 
     | 
    
         
             
                created_at: datetime = field(default_factory=datetime.now)
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
       42 
45 
     | 
    
         
             
                def to_dict(self) -> dict:
         
     | 
| 
       43 
46 
     | 
    
         
             
                    return {
         
     | 
| 
       44 
47 
     | 
    
         
             
                        "id": self.id,
         
     | 
| 
       45 
48 
     | 
    
         
             
                        "title": self.title,
         
     | 
| 
       46 
49 
     | 
    
         
             
                        "description": self.description,
         
     | 
| 
       47 
50 
     | 
    
         
             
                        "questions": [q.to_dict() for q in self.questions],
         
     | 
| 
       48 
     | 
    
         
            -
                        "response_count": len(self.responses)
         
     | 
| 
       49 
     | 
    
         
            -
                    } 
     | 
| 
      
 51 
     | 
    
         
            +
                        "response_count": len(self.responses),
         
     | 
| 
      
 52 
     | 
    
         
            +
                    }
         
     | 
    
        pycityagent/utils/decorators.py
    CHANGED
    
    | 
         @@ -2,18 +2,21 @@ import time 
     | 
|
| 
       2 
2 
     | 
    
         
             
            import functools
         
     | 
| 
       3 
3 
     | 
    
         
             
            import inspect
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
            CALLING_STRING =  
     | 
| 
      
 5 
     | 
    
         
            +
            CALLING_STRING = 'function: `{func_name}` in "{file_path}", line {line_number}, arguments: `{arguments}` start time: `{start_time}` end time: `{end_time}` output: `{output}`'
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
            __all__ =[
         
     | 
| 
      
 7 
     | 
    
         
            +
            __all__ = [
         
     | 
| 
       8 
8 
     | 
    
         
             
                "record_call_aio",
         
     | 
| 
       9 
9 
     | 
    
         
             
                "record_call",
         
     | 
| 
       10 
10 
     | 
    
         
             
                "lock_decorator",
         
     | 
| 
       11 
11 
     | 
    
         
             
            ]
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
       12 
14 
     | 
    
         
             
            def record_call_aio(record_function_calling: bool = True):
         
     | 
| 
       13 
15 
     | 
    
         
             
                """
         
     | 
| 
       14 
16 
     | 
    
         
             
                Decorator to log the async function call details if `record_function_calling` is True.
         
     | 
| 
       15 
17 
     | 
    
         
             
                """
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                def decorator(func):
         
     | 
| 
       17 
20 
     | 
    
         
             
                    async def wrapper(*args, **kwargs):
         
     | 
| 
       18 
21 
     | 
    
         
             
                        cur_frame = inspect.currentframe()
         
     | 
| 
       19 
22 
     | 
    
         
             
                        assert cur_frame is not None
         
     | 
| 
         @@ -40,14 +43,18 @@ def record_call_aio(record_function_calling: bool = True): 
     | 
|
| 
       40 
43 
     | 
    
         
             
                                )
         
     | 
| 
       41 
44 
     | 
    
         
             
                            )
         
     | 
| 
       42 
45 
     | 
    
         
             
                        return result
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
       43 
47 
     | 
    
         
             
                    return wrapper
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
       44 
49 
     | 
    
         
             
                return decorator
         
     | 
| 
       45 
50 
     | 
    
         | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
       46 
52 
     | 
    
         
             
            def record_call(record_function_calling: bool = True):
         
     | 
| 
       47 
53 
     | 
    
         
             
                """
         
     | 
| 
       48 
54 
     | 
    
         
             
                Decorator to log the function call details if `record_function_calling` is True.
         
     | 
| 
       49 
55 
     | 
    
         
             
                """
         
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                def decorator(func):
         
     | 
| 
       51 
58 
     | 
    
         
             
                    def wrapper(*args, **kwargs):
         
     | 
| 
       52 
59 
     | 
    
         
             
                        cur_frame = inspect.currentframe()
         
     | 
| 
       53 
60 
     | 
    
         
             
                        assert cur_frame is not None
         
     | 
| 
         @@ -74,9 +81,12 @@ def record_call(record_function_calling: bool = True): 
     | 
|
| 
       74 
81 
     | 
    
         
             
                                )
         
     | 
| 
       75 
82 
     | 
    
         
             
                            )
         
     | 
| 
       76 
83 
     | 
    
         
             
                        return result
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
       77 
85 
     | 
    
         
             
                    return wrapper
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
       78 
87 
     | 
    
         
             
                return decorator
         
     | 
| 
       79 
88 
     | 
    
         | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
       80 
90 
     | 
    
         
             
            def lock_decorator(func):
         
     | 
| 
       81 
91 
     | 
    
         
             
                async def wrapper(self, *args, **kwargs):
         
     | 
| 
       82 
92 
     | 
    
         
             
                    lock = self._lock
         
     | 
    
        pycityagent/workflow/block.py
    CHANGED
    
    | 
         @@ -87,7 +87,7 @@ def log_and_check( 
     | 
|
| 
       87 
87 
     | 
    
         
             
                A decorator that logs function calls and optionally checks a condition before executing the function.
         
     | 
| 
       88 
88 
     | 
    
         | 
| 
       89 
89 
     | 
    
         
             
                This decorator is specifically designed to be used with the `block` method.
         
     | 
| 
       90 
     | 
    
         
            -
             
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
       91 
91 
     | 
    
         
             
                Args:
         
     | 
| 
       92 
92 
     | 
    
         
             
                    condition (Callable): A condition function that must be satisfied before the decorated function is executed.
         
     | 
| 
       93 
93 
     | 
    
         
             
                                         Can be synchronous or asynchronous.
         
     | 
| 
         @@ -124,15 +124,16 @@ def log_and_check( 
     | 
|
| 
       124 
124 
     | 
    
         
             
            def trigger_class():
         
     | 
| 
       125 
125 
     | 
    
         
             
                def decorator(cls):
         
     | 
| 
       126 
126 
     | 
    
         
             
                    original_forward = cls.forward
         
     | 
| 
       127 
     | 
    
         
            -
             
     | 
| 
      
 127 
     | 
    
         
            +
             
     | 
| 
       128 
128 
     | 
    
         
             
                    @functools.wraps(original_forward)
         
     | 
| 
       129 
129 
     | 
    
         
             
                    async def wrapped_forward(self, *args, **kwargs):
         
     | 
| 
       130 
130 
     | 
    
         
             
                        if self.trigger is not None:
         
     | 
| 
       131 
131 
     | 
    
         
             
                            await self.trigger.wait_for_trigger()
         
     | 
| 
       132 
132 
     | 
    
         
             
                        return await original_forward(self, *args, **kwargs)
         
     | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
      
 133 
     | 
    
         
            +
             
     | 
| 
       134 
134 
     | 
    
         
             
                    cls.forward = wrapped_forward
         
     | 
| 
       135 
135 
     | 
    
         
             
                    return cls
         
     | 
| 
      
 136 
     | 
    
         
            +
             
     | 
| 
       136 
137 
     | 
    
         
             
                return decorator
         
     | 
| 
       137 
138 
     | 
    
         | 
| 
       138 
139 
     | 
    
         | 
    
        pycityagent/workflow/prompt.py
    CHANGED
    
    | 
         @@ -1,11 +1,12 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            from typing import Any, Callable, Dict, List, Optional, Union
         
     | 
| 
       2 
2 
     | 
    
         
             
            import re
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
       4 
5 
     | 
    
         
             
            class FormatPrompt:
         
     | 
| 
       5 
6 
     | 
    
         
             
                """
         
     | 
| 
       6 
     | 
    
         
            -
                A class to handle the formatting of prompts based on a template, 
     | 
| 
      
 7 
     | 
    
         
            +
                A class to handle the formatting of prompts based on a template,
         
     | 
| 
       7 
8 
     | 
    
         
             
                with support for system prompts and variable extraction.
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       9 
10 
     | 
    
         
             
                Attributes:
         
     | 
| 
       10 
11 
     | 
    
         
             
                    template (str): The template string containing placeholders.
         
     | 
| 
       11 
12 
     | 
    
         
             
                    system_prompt (Optional[str]): An optional system prompt to add to the dialog.
         
     | 
| 
         @@ -24,7 +25,7 @@ class FormatPrompt: 
     | 
|
| 
       24 
25 
     | 
    
         
             
                    self.template = template
         
     | 
| 
       25 
26 
     | 
    
         
             
                    self.system_prompt = system_prompt  # Store the system prompt
         
     | 
| 
       26 
27 
     | 
    
         
             
                    self.variables = self._extract_variables()
         
     | 
| 
       27 
     | 
    
         
            -
                    self.formatted_string =  
     | 
| 
      
 28 
     | 
    
         
            +
                    self.formatted_string = ""  # To store the formatted string
         
     | 
| 
       28 
29 
     | 
    
         | 
| 
       29 
30 
     | 
    
         
             
                def _extract_variables(self) -> List[str]:
         
     | 
| 
       30 
31 
     | 
    
         
             
                    """
         
     | 
| 
         @@ -33,7 +34,7 @@ class FormatPrompt: 
     | 
|
| 
       33 
34 
     | 
    
         
             
                    Returns:
         
     | 
| 
       34 
35 
     | 
    
         
             
                        List[str]: A list of variable names found within the template.
         
     | 
| 
       35 
36 
     | 
    
         
             
                    """
         
     | 
| 
       36 
     | 
    
         
            -
                    return re.findall(r 
     | 
| 
      
 37 
     | 
    
         
            +
                    return re.findall(r"\{(\w+)\}", self.template)
         
     | 
| 
       37 
38 
     | 
    
         | 
| 
       38 
39 
     | 
    
         
             
                def format(self, **kwargs) -> str:
         
     | 
| 
       39 
40 
     | 
    
         
             
                    """
         
     | 
| 
         @@ -45,7 +46,9 @@ class FormatPrompt: 
     | 
|
| 
       45 
46 
     | 
    
         
             
                    Returns:
         
     | 
| 
       46 
47 
     | 
    
         
             
                        str: The formatted string.
         
     | 
| 
       47 
48 
     | 
    
         
             
                    """
         
     | 
| 
       48 
     | 
    
         
            -
                    self.formatted_string = self.template.format( 
     | 
| 
      
 49 
     | 
    
         
            +
                    self.formatted_string = self.template.format(
         
     | 
| 
      
 50 
     | 
    
         
            +
                        **kwargs
         
     | 
| 
      
 51 
     | 
    
         
            +
                    )  # Store the formatted string
         
     | 
| 
       49 
52 
     | 
    
         
             
                    return self.formatted_string
         
     | 
| 
       50 
53 
     | 
    
         | 
| 
       51 
54 
     | 
    
         
             
                def to_dialog(self) -> List[Dict[str, str]]:
         
     | 
| 
         @@ -57,16 +60,20 @@ class FormatPrompt: 
     | 
|
| 
       57 
60 
     | 
    
         
             
                    """
         
     | 
| 
       58 
61 
     | 
    
         
             
                    dialog = []
         
     | 
| 
       59 
62 
     | 
    
         
             
                    if self.system_prompt:
         
     | 
| 
       60 
     | 
    
         
            -
                        dialog.append( 
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
      
 63 
     | 
    
         
            +
                        dialog.append(
         
     | 
| 
      
 64 
     | 
    
         
            +
                            {"role": "system", "content": self.system_prompt}
         
     | 
| 
      
 65 
     | 
    
         
            +
                        )  # Add system prompt if it exists
         
     | 
| 
      
 66 
     | 
    
         
            +
                    dialog.append(
         
     | 
| 
      
 67 
     | 
    
         
            +
                        {"role": "user", "content": self.formatted_string}
         
     | 
| 
      
 68 
     | 
    
         
            +
                    )  # Add user content
         
     | 
| 
       62 
69 
     | 
    
         
             
                    return dialog
         
     | 
| 
       63 
70 
     | 
    
         | 
| 
       64 
71 
     | 
    
         
             
                def log(self) -> None:
         
     | 
| 
       65 
72 
     | 
    
         
             
                    """
         
     | 
| 
       66 
     | 
    
         
            -
                    Logs the details of the FormatPrompt, including the template, 
     | 
| 
      
 73 
     | 
    
         
            +
                    Logs the details of the FormatPrompt, including the template,
         
     | 
| 
       67 
74 
     | 
    
         
             
                    system prompt, extracted variables, and formatted string.
         
     | 
| 
       68 
75 
     | 
    
         
             
                    """
         
     | 
| 
       69 
76 
     | 
    
         
             
                    print(f"FormatPrompt: {self.template}")
         
     | 
| 
       70 
77 
     | 
    
         
             
                    print(f"System Prompt: {self.system_prompt}")  # Log the system prompt
         
     | 
| 
       71 
78 
     | 
    
         
             
                    print(f"Variables: {self.variables}")
         
     | 
| 
       72 
     | 
    
         
            -
                    print(f"Formatted String: {self.formatted_string}")  # Log the formatted string
         
     | 
| 
      
 79 
     | 
    
         
            +
                    print(f"Formatted String: {self.formatted_string}")  # Log the formatted string
         
     | 
    
        pycityagent/workflow/tool.py
    CHANGED
    
    | 
         @@ -4,8 +4,7 @@ from copy import deepcopy 
     | 
|
| 
       4 
4 
     | 
    
         
             
            from typing import Any, Callable, Dict, List, Optional, Union
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            from ..agent import Agent
         
     | 
| 
       7 
     | 
    
         
            -
            from ..environment import  
     | 
| 
       8 
     | 
    
         
            -
                                       PersonService)
         
     | 
| 
      
 7 
     | 
    
         
            +
            from ..environment import LEVEL_ONE_PRE, POI_TYPE_DICT, AoiService, PersonService
         
     | 
| 
       9 
8 
     | 
    
         
             
            from ..workflow import Block
         
     | 
| 
       10 
9 
     | 
    
         | 
| 
       11 
10 
     | 
    
         | 
    
        pycityagent/workflow/trigger.py
    CHANGED
    
    | 
         @@ -5,47 +5,51 @@ from ..memory import Memory 
     | 
|
| 
       5 
5 
     | 
    
         
             
            from ..environment import Simulator
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            KEY_TRIGGER_COMPONENTS = [Memory, Simulator]
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       9 
10 
     | 
    
         
             
            class EventTrigger:
         
     | 
| 
       10 
11 
     | 
    
         
             
                """Base class for event triggers that wait for specific conditions to be met."""
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
       11 
13 
     | 
    
         
             
                # 定义该trigger需要的组件类型
         
     | 
| 
       12 
14 
     | 
    
         
             
                required_components: List[Type] = []
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
       14 
16 
     | 
    
         
             
                def __init__(self, block=None):
         
     | 
| 
       15 
17 
     | 
    
         
             
                    self.block = block
         
     | 
| 
       16 
18 
     | 
    
         
             
                    if block is not None:
         
     | 
| 
       17 
19 
     | 
    
         
             
                        self.initialize()
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
       19 
21 
     | 
    
         
             
                def initialize(self) -> None:
         
     | 
| 
       20 
22 
     | 
    
         
             
                    """Initialize the trigger with necessary dependencies."""
         
     | 
| 
       21 
23 
     | 
    
         
             
                    if not self.block:
         
     | 
| 
       22 
24 
     | 
    
         
             
                        raise RuntimeError("Block not set for trigger")
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
       24 
26 
     | 
    
         
             
                    # 检查所需组件是否都存在
         
     | 
| 
       25 
27 
     | 
    
         
             
                    missing_components = []
         
     | 
| 
       26 
28 
     | 
    
         
             
                    for component_type in self.required_components:
         
     | 
| 
       27 
29 
     | 
    
         
             
                        component_name = component_type.__name__.lower()
         
     | 
| 
       28 
30 
     | 
    
         
             
                        if not hasattr(self.block, component_name):
         
     | 
| 
       29 
31 
     | 
    
         
             
                            missing_components.append(component_type.__name__)
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
       31 
33 
     | 
    
         
             
                    if missing_components:
         
     | 
| 
       32 
34 
     | 
    
         
             
                        raise RuntimeError(
         
     | 
| 
       33 
35 
     | 
    
         
             
                            f"Block is missing required components for {self.__class__.__name__}: "
         
     | 
| 
       34 
36 
     | 
    
         
             
                            f"{', '.join(missing_components)}"
         
     | 
| 
       35 
37 
     | 
    
         
             
                        )
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
       37 
39 
     | 
    
         
             
                async def wait_for_trigger(self) -> None:
         
     | 
| 
       38 
40 
     | 
    
         
             
                    """Wait for the event trigger to be activated.
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
       40 
42 
     | 
    
         
             
                    Raises:
         
     | 
| 
       41 
43 
     | 
    
         
             
                        NotImplementedError: Subclasses must implement this method.
         
     | 
| 
       42 
44 
     | 
    
         
             
                    """
         
     | 
| 
       43 
45 
     | 
    
         
             
                    raise NotImplementedError
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
       45 
48 
     | 
    
         
             
            class MemoryChangeTrigger(EventTrigger):
         
     | 
| 
       46 
49 
     | 
    
         
             
                """Event trigger that activates when a specific key in memory changes."""
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
       47 
51 
     | 
    
         
             
                required_components = [Memory]
         
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
       49 
53 
     | 
    
         
             
                def __init__(self, key: str) -> None:
         
     | 
| 
       50 
54 
     | 
    
         
             
                    """Initialize the memory change trigger.
         
     | 
| 
       51 
55 
     | 
    
         | 
| 
         @@ -74,12 +78,15 @@ class MemoryChangeTrigger(EventTrigger): 
     | 
|
| 
       74 
78 
     | 
    
         | 
| 
       75 
79 
     | 
    
         
             
            class TimeTrigger(EventTrigger):
         
     | 
| 
       76 
80 
     | 
    
         
             
                """Event trigger that activates periodically based on time intervals."""
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
       77 
82 
     | 
    
         
             
                required_components = [Simulator]
         
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
                def __init__( 
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                def __init__(
         
     | 
| 
      
 85 
     | 
    
         
            +
                    self,
         
     | 
| 
      
 86 
     | 
    
         
            +
                    days: Optional[int] = None,
         
     | 
| 
      
 87 
     | 
    
         
            +
                    hours: Optional[int] = None,
         
     | 
| 
      
 88 
     | 
    
         
            +
                    minutes: Optional[int] = None,
         
     | 
| 
      
 89 
     | 
    
         
            +
                ) -> None:
         
     | 
| 
       83 
90 
     | 
    
         
             
                    """Initialize the time trigger with interval settings.
         
     | 
| 
       84 
91 
     | 
    
         | 
| 
       85 
92 
     | 
    
         
             
                    Args:
         
     | 
| 
         @@ -92,12 +99,16 @@ class TimeTrigger(EventTrigger): 
     | 
|
| 
       92 
99 
     | 
    
         
             
                    """
         
     | 
| 
       93 
100 
     | 
    
         
             
                    if all(param is None for param in (days, hours, minutes)):
         
     | 
| 
       94 
101 
     | 
    
         
             
                        raise ValueError("At least one time interval must be specified")
         
     | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
       96 
103 
     | 
    
         
             
                    # 验证参数有效性
         
     | 
| 
       97 
     | 
    
         
            -
                    for param_name, param_value in [ 
     | 
| 
      
 104 
     | 
    
         
            +
                    for param_name, param_value in [
         
     | 
| 
      
 105 
     | 
    
         
            +
                        ("days", days),
         
     | 
| 
      
 106 
     | 
    
         
            +
                        ("hours", hours),
         
     | 
| 
      
 107 
     | 
    
         
            +
                        ("minutes", minutes),
         
     | 
| 
      
 108 
     | 
    
         
            +
                    ]:
         
     | 
| 
       98 
109 
     | 
    
         
             
                        if param_value is not None and param_value < 0:
         
     | 
| 
       99 
110 
     | 
    
         
             
                            raise ValueError(f"{param_name} cannot be negative")
         
     | 
| 
       100 
     | 
    
         
            -
             
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
       101 
112 
     | 
    
         
             
                    # 将所有时间间隔转换为秒
         
     | 
| 
       102 
113 
     | 
    
         
             
                    self.interval = 0
         
     | 
| 
       103 
114 
     | 
    
         
             
                    if days is not None:
         
     | 
| 
         @@ -106,7 +117,7 @@ class TimeTrigger(EventTrigger): 
     | 
|
| 
       106 
117 
     | 
    
         
             
                        self.interval += hours * 60 * 60
         
     | 
| 
       107 
118 
     | 
    
         
             
                    if minutes is not None:
         
     | 
| 
       108 
119 
     | 
    
         
             
                        self.interval += minutes * 60
         
     | 
| 
       109 
     | 
    
         
            -
             
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
       110 
121 
     | 
    
         
             
                    self.trigger_event = asyncio.Event()
         
     | 
| 
       111 
122 
     | 
    
         
             
                    self._initialized = False
         
     | 
| 
       112 
123 
     | 
    
         
             
                    self._monitoring_task = None
         
     | 
| 
         @@ -126,17 +137,19 @@ class TimeTrigger(EventTrigger): 
     | 
|
| 
       126 
137 
     | 
    
         
             
                    """持续监控时间并在达到间隔时触发事件"""
         
     | 
| 
       127 
138 
     | 
    
         
             
                    # 第一次调用时直接触发
         
     | 
| 
       128 
139 
     | 
    
         
             
                    self.trigger_event.set()
         
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
       130 
141 
     | 
    
         
             
                    while True:
         
     | 
| 
       131 
142 
     | 
    
         
             
                        try:
         
     | 
| 
       132 
143 
     | 
    
         
             
                            current_time = await self.simulator.get_time()
         
     | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
      
 144 
     | 
    
         
            +
             
     | 
| 
       134 
145 
     | 
    
         
             
                            # 如果是第一次或者已经过了指定的时间间隔
         
     | 
| 
       135 
     | 
    
         
            -
                            if ( 
     | 
| 
       136 
     | 
    
         
            -
                                 
     | 
| 
      
 146 
     | 
    
         
            +
                            if (
         
     | 
| 
      
 147 
     | 
    
         
            +
                                self._last_trigger_time is None
         
     | 
| 
      
 148 
     | 
    
         
            +
                                or current_time - self._last_trigger_time >= self.interval
         
     | 
| 
      
 149 
     | 
    
         
            +
                            ):
         
     | 
| 
       137 
150 
     | 
    
         
             
                                self._last_trigger_time = current_time
         
     | 
| 
       138 
151 
     | 
    
         
             
                                self.trigger_event.set()
         
     | 
| 
       139 
     | 
    
         
            -
             
     | 
| 
      
 152 
     | 
    
         
            +
             
     | 
| 
       140 
153 
     | 
    
         
             
                            await asyncio.sleep(5)  # 避免过于频繁的检查
         
     | 
| 
       141 
154 
     | 
    
         
             
                        except Exception as e:
         
     | 
| 
       142 
155 
     | 
    
         
             
                            print(f"Error in time monitoring: {e}")
         
     | 
| 
         @@ -0,0 +1,70 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            pycityagent/__init__.py,sha256=n56bWkAUEcvjDsb7LcJpaGjlrriSKPnR0yBhwRfEYBA,212
         
     | 
| 
      
 2 
     | 
    
         
            +
            pycityagent/agent.py,sha256=cn8g9Sn8g3L5LaCb-zN831bW_sZWuUZbRydS3pegHdQ,12232
         
     | 
| 
      
 3 
     | 
    
         
            +
            pycityagent/economy/__init__.py,sha256=aonY4WHnx-6EGJ4WKrx4S-2jAkYNLtqUA04jp6q8B7w,75
         
     | 
| 
      
 4 
     | 
    
         
            +
            pycityagent/economy/econ_client.py,sha256=qQb_kZneEXGBRaS_y5Jdoi95I8GyjKEsDSC4s6V6R7w,10829
         
     | 
| 
      
 5 
     | 
    
         
            +
            pycityagent/environment/__init__.py,sha256=awHxlOud-btWbk0FCS4RmGJ13W84oVCkbGfcrhKqihA,240
         
     | 
| 
      
 6 
     | 
    
         
            +
            pycityagent/environment/interact/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
      
 7 
     | 
    
         
            +
            pycityagent/environment/interact/interact.py,sha256=ifxPPzuHeqLHIZ_6zvfXMoBOnBsXNIP4bYp7OJ7pnEQ,6588
         
     | 
| 
      
 8 
     | 
    
         
            +
            pycityagent/environment/message/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
      
 9 
     | 
    
         
            +
            pycityagent/environment/sence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
      
 10 
     | 
    
         
            +
            pycityagent/environment/sence/static.py,sha256=9s7jz8HitstTrk-GqpnVB26oPrjuTyNeL7hcoxjPhV4,29104
         
     | 
| 
      
 11 
     | 
    
         
            +
            pycityagent/environment/sidecar/__init__.py,sha256=RFbOf40aYBP4WwRpFkua5tlRE_OtMcMNyp1Lew_aaAU,235
         
     | 
| 
      
 12 
     | 
    
         
            +
            pycityagent/environment/sidecar/sidecarv2.py,sha256=beKlYZgt38EQbV1x6NWQo7xVXyB-5QHfbwJexyXu7Tg,3252
         
     | 
| 
      
 13 
     | 
    
         
            +
            pycityagent/environment/sim/__init__.py,sha256=JVG6sSD2Hbohl1TtKjuQi7_M7tKMrFh9vl3QV3VA5O0,724
         
     | 
| 
      
 14 
     | 
    
         
            +
            pycityagent/environment/sim/aoi_service.py,sha256=yM50xhYPLLExwjl5MDlnAuohqJpK0KbIvr_cWLZJEAk,1203
         
     | 
| 
      
 15 
     | 
    
         
            +
            pycityagent/environment/sim/client.py,sha256=MHR7Hhu-Cr7B61d3K_QDpSJh4HrUU9JQf6Cu7_8pdsE,3493
         
     | 
| 
      
 16 
     | 
    
         
            +
            pycityagent/environment/sim/clock_service.py,sha256=YG_A_IA7iJp9rOQE3bCPgppzuzzUwWMCzlxSUdOy088,1326
         
     | 
| 
      
 17 
     | 
    
         
            +
            pycityagent/environment/sim/economy_services.py,sha256=ZggCyAK4Tv5SS881lUBe0WyymKq-0PtdWpe8p_pTDiI,7085
         
     | 
| 
      
 18 
     | 
    
         
            +
            pycityagent/environment/sim/lane_service.py,sha256=6ljWiX_GbZd-a-fEcktDZncxBkraLA2LDE_pVV99uLs,3896
         
     | 
| 
      
 19 
     | 
    
         
            +
            pycityagent/environment/sim/light_service.py,sha256=ezYGcV_PkZ6I-yv48LNEjsytwwwQx-1Qp2QCWXWIhdQ,4215
         
     | 
| 
      
 20 
     | 
    
         
            +
            pycityagent/environment/sim/person_service.py,sha256=nIvOsoBoqOTDYtsiThg07-4ZBgkTUDEbb3dHyOjzyb8,10652
         
     | 
| 
      
 21 
     | 
    
         
            +
            pycityagent/environment/sim/road_service.py,sha256=phKTwTyhc_6Ht2mddEXpdENfl-lRXIVY0CHAlw1yHjI,1264
         
     | 
| 
      
 22 
     | 
    
         
            +
            pycityagent/environment/sim/sim_env.py,sha256=HI1LcS_FotDKQ6vBnx0e49prXSABOfA20aU9KM-ZkCY,4625
         
     | 
| 
      
 23 
     | 
    
         
            +
            pycityagent/environment/sim/social_service.py,sha256=6Iqvq6dz8H2jhLLdtaITc6Js9QnQw-Ylsd5AZgUj3-E,1993
         
     | 
| 
      
 24 
     | 
    
         
            +
            pycityagent/environment/simulator.py,sha256=gxmUyvR1cwlzEGcFelNqscOhpld8zongpdzMyi0Zm0Q,11902
         
     | 
| 
      
 25 
     | 
    
         
            +
            pycityagent/environment/utils/__init__.py,sha256=1m4Q1EfGvNpUsa1bgQzzCyWhfkpElnskNImjjFD3Znc,237
         
     | 
| 
      
 26 
     | 
    
         
            +
            pycityagent/environment/utils/base64.py,sha256=hoREzQo3FXMN79pqQLO2jgsDEvudciomyKii7MWljAM,374
         
     | 
| 
      
 27 
     | 
    
         
            +
            pycityagent/environment/utils/const.py,sha256=3RMNy7_bE7-23K90j9DFW_tWEzu8s7hSTgKbV-3BFl4,5327
         
     | 
| 
      
 28 
     | 
    
         
            +
            pycityagent/environment/utils/geojson.py,sha256=Ieg8Bzw63kKhJlhDIOVDoh-wQO4Sbtoe47FtIOy5wWg,686
         
     | 
| 
      
 29 
     | 
    
         
            +
            pycityagent/environment/utils/grpc.py,sha256=6EJwKXXktIWb1NcUiJzIRmfrY0S03QAXXGcCDHqAT00,1998
         
     | 
| 
      
 30 
     | 
    
         
            +
            pycityagent/environment/utils/map_utils.py,sha256=oqrRgQICC3SYw6gwjjPe_MAif7_t6dlrQpY8E32Fexs,5777
         
     | 
| 
      
 31 
     | 
    
         
            +
            pycityagent/environment/utils/port.py,sha256=3OM6kSUt3PxvDUOlgyiendBtETaWU8Mzk_8H0TzTmYg,295
         
     | 
| 
      
 32 
     | 
    
         
            +
            pycityagent/environment/utils/protobuf.py,sha256=0jBvK_s96y_n7tuMbG22TOtQmg71SGV4ONDy2IGsU9o,1148
         
     | 
| 
      
 33 
     | 
    
         
            +
            pycityagent/llm/__init__.py,sha256=7klKEmCcDWJIu-F4DoAukSuKfDbLhdczrSIhpwow-sY,145
         
     | 
| 
      
 34 
     | 
    
         
            +
            pycityagent/llm/embedding.py,sha256=Y0xhm_Ny6cawqzlendXb-mAS2QAuuEez1UtTR5-Kb2Q,4293
         
     | 
| 
      
 35 
     | 
    
         
            +
            pycityagent/llm/llm.py,sha256=wZGPUgLMmSRurQVXv-kg0T8OcYpoHhbjKxy3vQu2vhg,19682
         
     | 
| 
      
 36 
     | 
    
         
            +
            pycityagent/llm/llmconfig.py,sha256=4Ylf4OFSBEFy8jrOneeX0HvPhWEaF5jGvy1HkXK08Ro,436
         
     | 
| 
      
 37 
     | 
    
         
            +
            pycityagent/llm/utils.py,sha256=hoNPhvomb1u6lhFX0GctFipw74hVKb7bvUBDqwBzBYw,160
         
     | 
| 
      
 38 
     | 
    
         
            +
            pycityagent/memory/__init__.py,sha256=Hs2NhYpIG-lvpwPWwj4DydB1sxtjz7cuA4iDAzCXnjI,243
         
     | 
| 
      
 39 
     | 
    
         
            +
            pycityagent/memory/const.py,sha256=m9AidLs7Zu28StpvYetclqx-1qQcy3bYvwagcXB3a04,913
         
     | 
| 
      
 40 
     | 
    
         
            +
            pycityagent/memory/memory.py,sha256=sDbaqr1Koqf_9joMtG9PmmVxJZ6Rq7nAZO6EO0OdVgo,18148
         
     | 
| 
      
 41 
     | 
    
         
            +
            pycityagent/memory/memory_base.py,sha256=7YlPuDAOyDgdEvdyR2Uxcn_LynJoCbud5-RpYMhZVcs,5617
         
     | 
| 
      
 42 
     | 
    
         
            +
            pycityagent/memory/profile.py,sha256=ts05cnnmhSPeEYdxPsn5lt2lqT50YSdZOS7fPNScKCg,5195
         
     | 
| 
      
 43 
     | 
    
         
            +
            pycityagent/memory/self_define.py,sha256=P5uxGwj8UQ-z-5x_iZAPZEHa-oepVjkHRyH6UH2xMfw,5192
         
     | 
| 
      
 44 
     | 
    
         
            +
            pycityagent/memory/state.py,sha256=D8V_jKkWOYV4CjuR8F3KyKZ-eEf7kK9_cCF11pRu6X8,5126
         
     | 
| 
      
 45 
     | 
    
         
            +
            pycityagent/memory/utils.py,sha256=97lkenn-36wgt7uWb3Z39BXdJ5zlEQTQnQBFpoND1gg,879
         
     | 
| 
      
 46 
     | 
    
         
            +
            pycityagent/message/__init__.py,sha256=TCjazxqb5DVwbTu1fF0sNvaH_EPXVuj2XQ0p6W-QCLU,55
         
     | 
| 
      
 47 
     | 
    
         
            +
            pycityagent/message/messager.py,sha256=2hUIuX8Jqad2p6KM8PyfOWMFl1NjqF9B5yE-FnsYx3c,2598
         
     | 
| 
      
 48 
     | 
    
         
            +
            pycityagent/simulation/__init__.py,sha256=jYaqaNpzM5M_e_ykISS_M-mIyYdzJXJWhgpfBpA6l5k,111
         
     | 
| 
      
 49 
     | 
    
         
            +
            pycityagent/simulation/agentgroup.py,sha256=Hu5IXFYZlaZ22m0xlDPBu89rRr1bJdSDeWWJIBxv92k,5233
         
     | 
| 
      
 50 
     | 
    
         
            +
            pycityagent/simulation/interview.py,sha256=S2uv8MFCB4-u_4Q202VFoPJOIleqpKK9Piju0BDSb_0,1158
         
     | 
| 
      
 51 
     | 
    
         
            +
            pycityagent/simulation/simulation.py,sha256=7ONLou5qoA0dcVp3-mr6AFop6q3JqTyLudxfnbf9trc,16910
         
     | 
| 
      
 52 
     | 
    
         
            +
            pycityagent/simulation/survey/__init__.py,sha256=rxwou8U9KeFSP7rMzXtmtp2fVFZxK4Trzi-psx9LPIs,153
         
     | 
| 
      
 53 
     | 
    
         
            +
            pycityagent/simulation/survey/manager.py,sha256=Tqini-4-uBZDsChVVL4ezlgXatnrxAfvceAZZRP8E48,2062
         
     | 
| 
      
 54 
     | 
    
         
            +
            pycityagent/simulation/survey/models.py,sha256=sY4OrrG1h9iBnjBsyDage4T3mUFPBHHZQe-ORtwSjKc,1305
         
     | 
| 
      
 55 
     | 
    
         
            +
            pycityagent/simulation/ui/__init__.py,sha256=4aevYl09KSku2NEpFZhyFNxI1qlswbrAFwhF_YhxFTo,62
         
     | 
| 
      
 56 
     | 
    
         
            +
            pycityagent/simulation/ui/interface.py,sha256=cSQRQhuA5Gj-X7anuN9tmRpG6-I8QYOuswjIWUeSvio,21636
         
     | 
| 
      
 57 
     | 
    
         
            +
            pycityagent/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
      
 58 
     | 
    
         
            +
            pycityagent/utils/decorators.py,sha256=Gk3r41hfk6awui40tbwpq3C7wC7jHaRmLRlcJFlLQCE,3160
         
     | 
| 
      
 59 
     | 
    
         
            +
            pycityagent/utils/parsers/__init__.py,sha256=AN2xgiPxszWK4rpX7zrqRsqNwfGF3WnCA5-PFTvbaKk,281
         
     | 
| 
      
 60 
     | 
    
         
            +
            pycityagent/utils/parsers/code_block_parser.py,sha256=Cs2Z_hm9VfNCpPPll1TwteaJF-HAQPs-3RApsOekFm4,1173
         
     | 
| 
      
 61 
     | 
    
         
            +
            pycityagent/utils/parsers/json_parser.py,sha256=FZ3XN1g8z4Dr2TFraUOoah1oQcze4fPd2m01hHoX0Mo,2917
         
     | 
| 
      
 62 
     | 
    
         
            +
            pycityagent/utils/parsers/parser_base.py,sha256=k6DVqwAMK3jJdOP4IeLE-aFPm3V2F-St5qRBuRdx4aU,1742
         
     | 
| 
      
 63 
     | 
    
         
            +
            pycityagent/workflow/__init__.py,sha256=EyCcjB6LyBim-5iAOPe4m2qfvghEPqu1ZdGfy4KPeZ8,551
         
     | 
| 
      
 64 
     | 
    
         
            +
            pycityagent/workflow/block.py,sha256=6EmiRMLdOZC1wMlmLMIjfrp9TuiI7Gw4s3nnXVMbrnw,6031
         
     | 
| 
      
 65 
     | 
    
         
            +
            pycityagent/workflow/prompt.py,sha256=tY69nDO8fgYfF_dOA-iceR8pAhkYmCqoox8uRPqEuGY,2956
         
     | 
| 
      
 66 
     | 
    
         
            +
            pycityagent/workflow/tool.py,sha256=wD9WZ5rma6HCKugtHTwbShNE0f-Rjlwvn_1be3fCAsk,6682
         
     | 
| 
      
 67 
     | 
    
         
            +
            pycityagent/workflow/trigger.py,sha256=t5X_i0WtL32bipZSsq_E3UUyYYudYLxQUpvxbgClp2s,5683
         
     | 
| 
      
 68 
     | 
    
         
            +
            pycityagent-2.0.0a8.dist-info/METADATA,sha256=IR7pOLENcFN0uxU3lshslneGOmYHrRjuuyJ13x5BWSc,7614
         
     | 
| 
      
 69 
     | 
    
         
            +
            pycityagent-2.0.0a8.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
         
     | 
| 
      
 70 
     | 
    
         
            +
            pycityagent-2.0.0a8.dist-info/RECORD,,
         
     | 
| 
         @@ -1,70 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            pycityagent/__init__.py,sha256=n56bWkAUEcvjDsb7LcJpaGjlrriSKPnR0yBhwRfEYBA,212
         
     | 
| 
       2 
     | 
    
         
            -
            pycityagent/agent.py,sha256=U1cdyRl_ZURnPLC31uP8auvSa4TWupK_SZ5nuff3Ryk,11263
         
     | 
| 
       3 
     | 
    
         
            -
            pycityagent/economy/__init__.py,sha256=aonY4WHnx-6EGJ4WKrx4S-2jAkYNLtqUA04jp6q8B7w,75
         
     | 
| 
       4 
     | 
    
         
            -
            pycityagent/economy/econ_client.py,sha256=qQb_kZneEXGBRaS_y5Jdoi95I8GyjKEsDSC4s6V6R7w,10829
         
     | 
| 
       5 
     | 
    
         
            -
            pycityagent/environment/__init__.py,sha256=awHxlOud-btWbk0FCS4RmGJ13W84oVCkbGfcrhKqihA,240
         
     | 
| 
       6 
     | 
    
         
            -
            pycityagent/environment/interact/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       7 
     | 
    
         
            -
            pycityagent/environment/interact/interact.py,sha256=LNl_HlasoW5H72GiBnbQkCP51qDIp5dpk-EShA7RPWk,5946
         
     | 
| 
       8 
     | 
    
         
            -
            pycityagent/environment/message/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       9 
     | 
    
         
            -
            pycityagent/environment/sence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       10 
     | 
    
         
            -
            pycityagent/environment/sence/static.py,sha256=fdBjHKacNiDCKhvQkc9WgEYYSO0peMC5lb8CcXl9iNc,29101
         
     | 
| 
       11 
     | 
    
         
            -
            pycityagent/environment/sidecar/__init__.py,sha256=RFbOf40aYBP4WwRpFkua5tlRE_OtMcMNyp1Lew_aaAU,235
         
     | 
| 
       12 
     | 
    
         
            -
            pycityagent/environment/sidecar/sidecarv2.py,sha256=beKlYZgt38EQbV1x6NWQo7xVXyB-5QHfbwJexyXu7Tg,3252
         
     | 
| 
       13 
     | 
    
         
            -
            pycityagent/environment/sim/__init__.py,sha256=JVG6sSD2Hbohl1TtKjuQi7_M7tKMrFh9vl3QV3VA5O0,724
         
     | 
| 
       14 
     | 
    
         
            -
            pycityagent/environment/sim/aoi_service.py,sha256=pYSsqdGBpfQvp0-umNJir_7Yph75OJqhLjFQ2QWhSP8,1211
         
     | 
| 
       15 
     | 
    
         
            -
            pycityagent/environment/sim/client.py,sha256=MHR7Hhu-Cr7B61d3K_QDpSJh4HrUU9JQf6Cu7_8pdsE,3493
         
     | 
| 
       16 
     | 
    
         
            -
            pycityagent/environment/sim/clock_service.py,sha256=YG_A_IA7iJp9rOQE3bCPgppzuzzUwWMCzlxSUdOy088,1326
         
     | 
| 
       17 
     | 
    
         
            -
            pycityagent/environment/sim/economy_services.py,sha256=_WirbF-vv4U1VK5oACiEC3Bse9Pia9HWNEw21suEnAs,7093
         
     | 
| 
       18 
     | 
    
         
            -
            pycityagent/environment/sim/lane_service.py,sha256=6ljWiX_GbZd-a-fEcktDZncxBkraLA2LDE_pVV99uLs,3896
         
     | 
| 
       19 
     | 
    
         
            -
            pycityagent/environment/sim/light_service.py,sha256=ezYGcV_PkZ6I-yv48LNEjsytwwwQx-1Qp2QCWXWIhdQ,4215
         
     | 
| 
       20 
     | 
    
         
            -
            pycityagent/environment/sim/person_service.py,sha256=nIvOsoBoqOTDYtsiThg07-4ZBgkTUDEbb3dHyOjzyb8,10652
         
     | 
| 
       21 
     | 
    
         
            -
            pycityagent/environment/sim/road_service.py,sha256=Pab182YRcrjLw3UcfoD1Hdd6O8XEdi6Q2hJKzFcpSWE,1272
         
     | 
| 
       22 
     | 
    
         
            -
            pycityagent/environment/sim/sim_env.py,sha256=HI1LcS_FotDKQ6vBnx0e49prXSABOfA20aU9KM-ZkCY,4625
         
     | 
| 
       23 
     | 
    
         
            -
            pycityagent/environment/sim/social_service.py,sha256=a9mGZm95EFUIKQJUwQi9f8anmtf2SK4XqGfE2W9IXSQ,2001
         
     | 
| 
       24 
     | 
    
         
            -
            pycityagent/environment/simulator.py,sha256=bjzn5mTmsQgePZc3hDzoVS4dXAHLaI_yJWjUCTMAdi8,11872
         
     | 
| 
       25 
     | 
    
         
            -
            pycityagent/environment/utils/__init__.py,sha256=PUx8etr2p_AA7F50ZR7g27odkgv-nOqFZa61ER8-DLg,221
         
     | 
| 
       26 
     | 
    
         
            -
            pycityagent/environment/utils/base64.py,sha256=hoREzQo3FXMN79pqQLO2jgsDEvudciomyKii7MWljAM,374
         
     | 
| 
       27 
     | 
    
         
            -
            pycityagent/environment/utils/const.py,sha256=3RMNy7_bE7-23K90j9DFW_tWEzu8s7hSTgKbV-3BFl4,5327
         
     | 
| 
       28 
     | 
    
         
            -
            pycityagent/environment/utils/geojson.py,sha256=Ieg8Bzw63kKhJlhDIOVDoh-wQO4Sbtoe47FtIOy5wWg,686
         
     | 
| 
       29 
     | 
    
         
            -
            pycityagent/environment/utils/grpc.py,sha256=6EJwKXXktIWb1NcUiJzIRmfrY0S03QAXXGcCDHqAT00,1998
         
     | 
| 
       30 
     | 
    
         
            -
            pycityagent/environment/utils/map_utils.py,sha256=oqrRgQICC3SYw6gwjjPe_MAif7_t6dlrQpY8E32Fexs,5777
         
     | 
| 
       31 
     | 
    
         
            -
            pycityagent/environment/utils/port.py,sha256=3OM6kSUt3PxvDUOlgyiendBtETaWU8Mzk_8H0TzTmYg,295
         
     | 
| 
       32 
     | 
    
         
            -
            pycityagent/environment/utils/protobuf.py,sha256=0jBvK_s96y_n7tuMbG22TOtQmg71SGV4ONDy2IGsU9o,1148
         
     | 
| 
       33 
     | 
    
         
            -
            pycityagent/llm/__init__.py,sha256=0-_q-StY0g4p9mdUNve_kqzHNXwVxedNsvxGXSQYq6o,144
         
     | 
| 
       34 
     | 
    
         
            -
            pycityagent/llm/embedding.py,sha256=vtjMUuInrtn0WRPXp3cmYEhwHXJ0q6zszdXsjTsgNeQ,4499
         
     | 
| 
       35 
     | 
    
         
            -
            pycityagent/llm/llm.py,sha256=PFbGCVQOLNJEfd5KaZdXABYIoPTFOGrNXIAE2eDRCP4,19191
         
     | 
| 
       36 
     | 
    
         
            -
            pycityagent/llm/llmconfig.py,sha256=WcyyfjP6XVLCDj2aemEM6ogQCWNxbTXQBiR0WjN4E8E,457
         
     | 
| 
       37 
     | 
    
         
            -
            pycityagent/llm/utils.py,sha256=emio-WhYh6vYb5Sp7KsnW9hKKe_jStjJsGBBJfcAPgM,153
         
     | 
| 
       38 
     | 
    
         
            -
            pycityagent/memory/__init__.py,sha256=Hs2NhYpIG-lvpwPWwj4DydB1sxtjz7cuA4iDAzCXnjI,243
         
     | 
| 
       39 
     | 
    
         
            -
            pycityagent/memory/const.py,sha256=m9AidLs7Zu28StpvYetclqx-1qQcy3bYvwagcXB3a04,913
         
     | 
| 
       40 
     | 
    
         
            -
            pycityagent/memory/memory.py,sha256=I5GJ77eQZBcKcWevZQcHUBTd2XNT4CotE6mmvB5mA8I,18170
         
     | 
| 
       41 
     | 
    
         
            -
            pycityagent/memory/memory_base.py,sha256=U6odnR_5teaT3N2XF0W2McCxPyxtCpw61DjRVIO6p6I,5639
         
     | 
| 
       42 
     | 
    
         
            -
            pycityagent/memory/profile.py,sha256=dJPeZ91DZcYdR7zmsfSSQx7epvvE1mrvj4-4WAT0tkM,5217
         
     | 
| 
       43 
     | 
    
         
            -
            pycityagent/memory/self_define.py,sha256=vH2PrRSIykAOc5FebKN2JFQdx17nfR-IWv4s_ZS0YJk,5214
         
     | 
| 
       44 
     | 
    
         
            -
            pycityagent/memory/state.py,sha256=xqOxo69sZX1M9eCUMbg5BUlSFe9LdMDH3oTWDXC0y64,5148
         
     | 
| 
       45 
     | 
    
         
            -
            pycityagent/memory/utils.py,sha256=97lkenn-36wgt7uWb3Z39BXdJ5zlEQTQnQBFpoND1gg,879
         
     | 
| 
       46 
     | 
    
         
            -
            pycityagent/message/__init__.py,sha256=dEigAhYQ8e-suktavjo-Ip-nkEzf659hrFJwoFQ2ljE,54
         
     | 
| 
       47 
     | 
    
         
            -
            pycityagent/message/messager.py,sha256=Xd02IxSkVtfrC386frB5kiqlDIDhNKuh5pVM4xKIyyw,2463
         
     | 
| 
       48 
     | 
    
         
            -
            pycityagent/simulation/__init__.py,sha256=SZQzjcGR-zkTDrE81bQuEdKn7yjk4BcZ9m7o1wTc7EE,111
         
     | 
| 
       49 
     | 
    
         
            -
            pycityagent/simulation/agentgroup.py,sha256=G2aRk1d3d5Ja4QPNJagNKz8a_9_JzSmQXqmDrteYkkg,4105
         
     | 
| 
       50 
     | 
    
         
            -
            pycityagent/simulation/interview.py,sha256=mY4Vpz0vgJo4rrMy3TZnwwM-iVDL6J0LgjOxbEuV27E,1173
         
     | 
| 
       51 
     | 
    
         
            -
            pycityagent/simulation/simulation.py,sha256=98_dxWAUNhbVyDQlsGq7SB_QpXF2r8vezVk1C54P6IY,13073
         
     | 
| 
       52 
     | 
    
         
            -
            pycityagent/simulation/survey/__init__.py,sha256=hFJ0Q1yo4jwKAIXP17sznBSWwm2Lyh3F3W3Lly40wr8,172
         
     | 
| 
       53 
     | 
    
         
            -
            pycityagent/simulation/survey/manager.py,sha256=DkNrb12Ay7TiGURoyJTFFeUdV1zh6TgRpTmpZOblADw,2158
         
     | 
| 
       54 
     | 
    
         
            -
            pycityagent/simulation/survey/models.py,sha256=-3EKe-qvkUJ2TH24ow0A_Lc4teGet7pueN2T5mOR_Qc,1308
         
     | 
| 
       55 
     | 
    
         
            -
            pycityagent/simulation/ui/__init__.py,sha256=4aevYl09KSku2NEpFZhyFNxI1qlswbrAFwhF_YhxFTo,62
         
     | 
| 
       56 
     | 
    
         
            -
            pycityagent/simulation/ui/interface.py,sha256=cSQRQhuA5Gj-X7anuN9tmRpG6-I8QYOuswjIWUeSvio,21636
         
     | 
| 
       57 
     | 
    
         
            -
            pycityagent/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       58 
     | 
    
         
            -
            pycityagent/utils/decorators.py,sha256=v21QD_cKMTQ-t1UorXjgbWDFzeRehvprDalhQHIQxgg,3160
         
     | 
| 
       59 
     | 
    
         
            -
            pycityagent/utils/parsers/__init__.py,sha256=p5RZ4azJIpMgmKIU2evIp2moNzFabIR9X1LVNjT6Fq4,279
         
     | 
| 
       60 
     | 
    
         
            -
            pycityagent/utils/parsers/code_block_parser.py,sha256=Cs2Z_hm9VfNCpPPll1TwteaJF-HAQPs-3RApsOekFm4,1173
         
     | 
| 
       61 
     | 
    
         
            -
            pycityagent/utils/parsers/json_parser.py,sha256=FZ3XN1g8z4Dr2TFraUOoah1oQcze4fPd2m01hHoX0Mo,2917
         
     | 
| 
       62 
     | 
    
         
            -
            pycityagent/utils/parsers/parser_base.py,sha256=k6DVqwAMK3jJdOP4IeLE-aFPm3V2F-St5qRBuRdx4aU,1742
         
     | 
| 
       63 
     | 
    
         
            -
            pycityagent/workflow/__init__.py,sha256=EyCcjB6LyBim-5iAOPe4m2qfvghEPqu1ZdGfy4KPeZ8,551
         
     | 
| 
       64 
     | 
    
         
            -
            pycityagent/workflow/block.py,sha256=IXfarqIax6yVP_DniU6ZsPTT8QA4aIDnvZbwP_MtRaw,6054
         
     | 
| 
       65 
     | 
    
         
            -
            pycityagent/workflow/prompt.py,sha256=cmzKEmlzjdwg50uwfnTnN_6xNJA8OVjo5fdmcsaTbdU,2886
         
     | 
| 
       66 
     | 
    
         
            -
            pycityagent/workflow/tool.py,sha256=2VDzBISnx7LASdAou8Zu230j7o2SdK1oBeqHtwDHZy0,6711
         
     | 
| 
       67 
     | 
    
         
            -
            pycityagent/workflow/trigger.py,sha256=8530YfBbLsdtT1QZSqvuha64NNLVJYXVznlvknz9-xI,5737
         
     | 
| 
       68 
     | 
    
         
            -
            pycityagent-2.0.0a6.dist-info/METADATA,sha256=u-2FElVNMV8-kXaAz5V8paLzLs3REC-gP_zO5DL6jkQ,7614
         
     | 
| 
       69 
     | 
    
         
            -
            pycityagent-2.0.0a6.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
         
     | 
| 
       70 
     | 
    
         
            -
            pycityagent-2.0.0a6.dist-info/RECORD,,
         
     | 
| 
         
            File without changes
         
     |