Skip to content
Open
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
10 changes: 3 additions & 7 deletions backend/app/agent/factory/browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
# limitations under the License.
# ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========

import platform
import threading
import uuid

Expand All @@ -21,7 +20,7 @@

from app.agent.agent_model import agent_model
from app.agent.listen_chat_agent import logger
from app.agent.prompt import BROWSER_SYS_PROMPT
from app.agent.prompt import BROWSER_SYS_PROMPT, format_prompt
from app.agent.toolkit.human_toolkit import HumanToolkit
from app.agent.toolkit.hybrid_browser_toolkit import HybridBrowserToolkit

Expand All @@ -31,7 +30,6 @@
from app.agent.toolkit.search_toolkit import SearchToolkit
from app.agent.toolkit.skill_toolkit import SkillToolkit
from app.agent.toolkit.terminal_toolkit import TerminalToolkit
from app.agent.utils import NOW_STR
from app.component.environment import env
from app.model.chat import Chat
from app.service.task import Agents
Expand Down Expand Up @@ -291,11 +289,9 @@ def browser_agent(options: Chat):
"</external_browser_connection>\n"
)

system_message = BROWSER_SYS_PROMPT.format(
platform_system=platform.system(),
platform_machine=platform.machine(),
system_message = format_prompt(
BROWSER_SYS_PROMPT,
working_directory=working_directory,
now_str=NOW_STR,
external_browser_notice=external_browser_notice,
)

Expand Down
10 changes: 3 additions & 7 deletions backend/app/agent/factory/developer.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,12 @@
# limitations under the License.
# ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========

import platform

from camel.messages import BaseMessage
from camel.toolkits import ToolkitMessageIntegration

from app.agent.agent_model import agent_model
from app.agent.listen_chat_agent import logger
from app.agent.prompt import DEVELOPER_SYS_PROMPT
from app.agent.prompt import DEVELOPER_SYS_PROMPT, format_prompt
from app.agent.toolkit.human_toolkit import HumanToolkit

# TODO: Remove NoteTakingToolkit and use TerminalToolkit instead
Expand Down Expand Up @@ -103,11 +101,9 @@ async def developer_agent(options: Chat):
*skill_toolkit.get_tools(),
*search_tools,
]
system_message = DEVELOPER_SYS_PROMPT.format(
platform_system=platform.system(),
platform_machine=platform.machine(),
system_message = format_prompt(
DEVELOPER_SYS_PROMPT,
working_directory=working_directory,
now_str=NOW_STR,
)

return agent_model(
Expand Down
11 changes: 3 additions & 8 deletions backend/app/agent/factory/document.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,12 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========
import platform

from camel.messages import BaseMessage
from camel.toolkits import ToolkitMessageIntegration

from app.agent.agent_model import agent_model
from app.agent.listen_chat_agent import logger
from app.agent.prompt import DOCUMENT_SYS_PROMPT
from app.agent.prompt import DOCUMENT_SYS_PROMPT, format_prompt
from app.agent.toolkit.excel_toolkit import ExcelToolkit
from app.agent.toolkit.file_write_toolkit import FileToolkit
from app.agent.toolkit.google_drive_mcp_toolkit import GoogleDriveMCPToolkit
Expand All @@ -32,7 +30,6 @@
from app.agent.toolkit.search_toolkit import SearchToolkit
from app.agent.toolkit.skill_toolkit import SkillToolkit
from app.agent.toolkit.terminal_toolkit import TerminalToolkit
from app.agent.utils import NOW_STR
from app.model.chat import Chat
from app.service.task import Agents
from app.utils.file_utils import get_working_directory
Expand Down Expand Up @@ -126,11 +123,9 @@ async def document_agent(options: Chat):
*skill_toolkit.get_tools(),
*search_tools,
]
system_message = DOCUMENT_SYS_PROMPT.format(
platform_system=platform.system(),
platform_machine=platform.machine(),
system_message = format_prompt(
DOCUMENT_SYS_PROMPT,
working_directory=working_directory,
now_str=NOW_STR,
)

return agent_model(
Expand Down
65 changes: 65 additions & 0 deletions backend/app/agent/prompt.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,71 @@
# ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========
# flake8: noqa

import datetime
from functools import lru_cache

from app.agent.utils import get_platform_info

# Cache for formatted prompts (key: (prompt_name, working_directory))
_prompt_cache: dict[tuple[str, str], str] = {}


def _get_now_str() -> str:
"""Get current time string (formatted per request since it changes)."""
return datetime.datetime.now().strftime("%Y-%m-%d %H:00:00")


def format_prompt(
template: str,
working_directory: str,
include_platform: bool = True,
**kwargs,
) -> str:
"""Format a prompt template with cached platform info and dynamic fields.

Uses caching to avoid repeated formatting of static parts.

Args:
template: The prompt template string
working_directory: The working directory (dynamic, not cached)
include_platform: Whether to include platform info in formatting
**kwargs: Additional format arguments (e.g., external_browser_notice)

Returns:
Formatted prompt string
"""
# Create cache key including additional kwargs
cache_key = (template[:50], working_directory, tuple(sorted(kwargs.items())))

if cache_key in _prompt_cache:
return _prompt_cache[cache_key]

# Build format kwargs
format_kwargs = {
"working_directory": working_directory,
"now_str": _get_now_str(),
**kwargs,
}

# Get cached platform info
if include_platform:
platform_system, platform_machine = get_platform_info()
format_kwargs["platform_system"] = platform_system
format_kwargs["platform_machine"] = platform_machine

# Format the prompt
result = template.format(**format_kwargs)

_prompt_cache[cache_key] = result
return result


def clear_prompt_cache():
"""Clear the prompt format cache."""
global _prompt_cache
_prompt_cache = {}


SOCIAL_MEDIA_SYS_PROMPT = """\
You are a Social Media Management Assistant with comprehensive capabilities
across multiple platforms. You MUST use the `send_message_to_user` tool to
Expand Down
Loading