jarvis-ai-assistant 0.4.0__tar.gz → 0.4.1__tar.gz
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.
- {jarvis_ai_assistant-0.4.0/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.4.1}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/pyproject.toml +1 -1
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/setup.py +1 -1
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/__init__.py +36 -7
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/agent_manager.py +6 -4
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/config.py +2 -1
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/edit_file_handler.py +2 -2
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/jarvis.py +40 -9
- jarvis_ai_assistant-0.4.1/src/jarvis/jarvis_agent/rewrite_file_handler.py +143 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/run_loop.py +5 -4
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/utils.py +5 -1
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/web_server.py +332 -234
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_agent/code_agent.py +10 -7
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/code_review.py +0 -1
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_data/config_schema.json +5 -0
- jarvis_ai_assistant-0.4.1/src/jarvis/jarvis_multi_agent/__init__.py +389 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_multi_agent/main.py +10 -1
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/base.py +15 -6
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/sub_agent.py +11 -35
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/sub_code_agent.py +3 -1
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/config.py +10 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +1 -2
- jarvis_ai_assistant-0.4.0/src/jarvis/jarvis_multi_agent/__init__.py +0 -209
- jarvis_ai_assistant-0.4.0/src/jarvis/jarvis_tools/edit_file.py +0 -208
- jarvis_ai_assistant-0.4.0/src/jarvis/jarvis_tools/rewrite_file.py +0 -191
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/LICENSE +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/README.md +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/config_editor.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/event_bus.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/events.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/file_context_handler.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/file_methodology_manager.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/main.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/memory_manager.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/methodology_share_manager.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/output_handler.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/prompt_builder.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/prompt_manager.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/prompts.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/protocols.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/session_manager.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/share_manager.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/stdio_redirect.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/task_analyzer.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/task_manager.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/tool_executor.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/tool_share_manager.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/user_interaction.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/web_bridge.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/web_output_sink.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_agent/lint.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_git_squash/main.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_mcp/__init__.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_memory_organizer/__init__.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_memory_organizer/memory_organizer.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_methodology/main.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/__init__.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/ai8.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/human.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/kimi.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/openai.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/registry.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/tongyi.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform_manager/main.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform_manager/service.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/__init__.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/cache.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/cli.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/embedding_manager.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/llm_interface.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/query_rewriter.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/rag_pipeline.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/reranker.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/retriever.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_smart_shell/main.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_stats/__init__.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_stats/cli.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_stats/stats.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_stats/storage.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_stats/visualizer.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/ask_user.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/base.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/clear_memory.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/cli/main.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/execute_script.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/methodology.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/read_code.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/registry.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/retrieve_memory.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/save_memory.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/search_web.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/__init__.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/clipboard.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/embedding.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/file_processors.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/fzf.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/git_utils.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/globals.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/http.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/input.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/methodology.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/output.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/tag.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/utils.py +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
- {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "jarvis-ai-assistant"
|
7
|
-
version = "0.4.
|
7
|
+
version = "0.4.1"
|
8
8
|
description = "Jarvis: An AI assistant that uses tools to interact with the system"
|
9
9
|
readme = "README.md"
|
10
10
|
authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
|
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages # type: ignore
|
|
3
3
|
|
4
4
|
setup(
|
5
5
|
name="jarvis-ai-assistant",
|
6
|
-
version="0.4.
|
6
|
+
version="0.4.1",
|
7
7
|
author="skyfire",
|
8
8
|
author_email="skyfireitdiy@hotmail.com",
|
9
9
|
description="An AI assistant that uses various tools to interact with the system",
|
@@ -31,6 +31,8 @@ from jarvis.jarvis_agent.prompts import (
|
|
31
31
|
TASK_ANALYSIS_PROMPT,
|
32
32
|
)
|
33
33
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
34
|
+
from jarvis.jarvis_agent.edit_file_handler import EditFileHandler
|
35
|
+
from jarvis.jarvis_agent.rewrite_file_handler import RewriteFileHandler
|
34
36
|
from jarvis.jarvis_agent.prompt_manager import PromptManager
|
35
37
|
from jarvis.jarvis_agent.event_bus import EventBus
|
36
38
|
from jarvis.jarvis_agent.config import AgentConfig
|
@@ -74,6 +76,7 @@ from jarvis.jarvis_utils.config import (
|
|
74
76
|
is_use_methodology,
|
75
77
|
get_tool_filter_threshold,
|
76
78
|
get_after_tool_call_cb_dirs,
|
79
|
+
set_config,
|
77
80
|
)
|
78
81
|
from jarvis.jarvis_utils.embedding import get_context_token_count
|
79
82
|
from jarvis.jarvis_utils.globals import (
|
@@ -285,6 +288,8 @@ class Agent:
|
|
285
288
|
force_save_memory: Optional[bool] = None,
|
286
289
|
files: Optional[List[str]] = None,
|
287
290
|
confirm_callback: Optional[Callable[[str, bool], bool]] = None,
|
291
|
+
non_interactive: Optional[bool] = None,
|
292
|
+
**kwargs,
|
288
293
|
):
|
289
294
|
"""初始化Jarvis Agent实例
|
290
295
|
|
@@ -295,7 +300,6 @@ class Agent:
|
|
295
300
|
|
296
301
|
summary_prompt: 任务总结提示模板
|
297
302
|
auto_complete: 是否自动完成任务
|
298
|
-
output_handler: 输出处理器列表
|
299
303
|
execute_tool_confirm: 执行工具前是否需要确认
|
300
304
|
need_summary: 是否需要生成总结
|
301
305
|
multiline_inputer: 多行输入处理器
|
@@ -303,6 +307,7 @@ class Agent:
|
|
303
307
|
use_analysis: 是否使用任务分析
|
304
308
|
force_save_memory: 是否强制保存记忆
|
305
309
|
confirm_callback: 用户确认回调函数,签名为 (tip: str, default: bool) -> bool;默认使用CLI的user_confirm
|
310
|
+
non_interactive: 是否以非交互模式运行(优先级最高,覆盖环境变量与配置)
|
306
311
|
"""
|
307
312
|
# 基础属性初始化
|
308
313
|
self.files = files or []
|
@@ -327,14 +332,33 @@ class Agent:
|
|
327
332
|
|
328
333
|
# 初始化处理器
|
329
334
|
self._init_handlers(
|
330
|
-
output_handler or [],
|
331
335
|
multiline_inputer,
|
336
|
+
output_handler,
|
332
337
|
use_tools or [],
|
333
338
|
)
|
334
339
|
# 初始化用户交互封装,保持向后兼容
|
335
340
|
self.user_interaction = UserInteractionHandler(self.multiline_inputer, self.user_confirm)
|
336
341
|
# 将确认函数指向封装后的 confirm,保持既有调用不变
|
337
342
|
self.user_confirm = self.user_interaction.confirm # type: ignore[assignment]
|
343
|
+
# 非交互模式参数支持:允许通过构造参数显式控制,便于其他Agent调用时设置
|
344
|
+
try:
|
345
|
+
# 优先使用构造参数,其次回退到环境变量
|
346
|
+
self.non_interactive = (
|
347
|
+
bool(non_interactive)
|
348
|
+
if non_interactive is not None
|
349
|
+
else str(os.environ.get("JARVIS_NON_INTERACTIVE", "")).lower() in ("1", "true", "yes")
|
350
|
+
)
|
351
|
+
# 如果构造参数显式提供,则同步到环境变量与全局配置,供下游组件读取
|
352
|
+
if non_interactive is not None:
|
353
|
+
os.environ["JARVIS_NON_INTERACTIVE"] = "true" if self.non_interactive else "false"
|
354
|
+
try:
|
355
|
+
set_config("JARVIS_NON_INTERACTIVE", self.non_interactive)
|
356
|
+
except Exception:
|
357
|
+
# 配置同步失败不影响主流程
|
358
|
+
pass
|
359
|
+
except Exception:
|
360
|
+
# 防御式回退
|
361
|
+
self.non_interactive = False
|
338
362
|
|
339
363
|
# 初始化配置
|
340
364
|
self._init_config(
|
@@ -394,12 +418,12 @@ class Agent:
|
|
394
418
|
|
395
419
|
def _init_handlers(
|
396
420
|
self,
|
397
|
-
output_handler: List[OutputHandlerProtocol],
|
398
421
|
multiline_inputer: Optional[Callable[[str], str]],
|
422
|
+
output_handler: Optional[List[OutputHandlerProtocol]],
|
399
423
|
use_tools: List[str],
|
400
424
|
):
|
401
425
|
"""初始化各种处理器"""
|
402
|
-
self.output_handler = output_handler or [ToolRegistry()]
|
426
|
+
self.output_handler = output_handler or [ToolRegistry(), EditFileHandler(), RewriteFileHandler()]
|
403
427
|
self.set_use_tools(use_tools)
|
404
428
|
self.input_handler = [
|
405
429
|
builtin_input_handler,
|
@@ -900,13 +924,17 @@ class Agent:
|
|
900
924
|
|
901
925
|
if self.need_summary:
|
902
926
|
|
903
|
-
|
927
|
+
# 确保总结提示词非空:若为None或仅空白,则回退到默认提示词
|
928
|
+
safe_summary_prompt = self.summary_prompt or ""
|
929
|
+
if isinstance(safe_summary_prompt, str) and safe_summary_prompt.strip() == "":
|
930
|
+
safe_summary_prompt = DEFAULT_SUMMARY_PROMPT
|
931
|
+
# 注意:不要写回 session.prompt,避免 BEFORE_SUMMARY 事件回调修改/清空后导致使用空prompt
|
904
932
|
# 广播将要生成总结事件
|
905
933
|
try:
|
906
934
|
self.event_bus.emit(
|
907
935
|
BEFORE_SUMMARY,
|
908
936
|
agent=self,
|
909
|
-
prompt=
|
937
|
+
prompt=safe_summary_prompt,
|
910
938
|
auto_completed=auto_completed,
|
911
939
|
need_summary=self.need_summary,
|
912
940
|
)
|
@@ -915,7 +943,8 @@ class Agent:
|
|
915
943
|
|
916
944
|
if not self.model:
|
917
945
|
raise RuntimeError("Model not initialized")
|
918
|
-
|
946
|
+
# 直接使用本地变量,避免受事件回调影响
|
947
|
+
ret = self.model.chat_until_success(safe_summary_prompt) # type: ignore
|
919
948
|
# 防御: 总结阶段模型可能返回空响应(None或空字符串),统一为空字符串并告警
|
920
949
|
if not ret:
|
921
950
|
try:
|
{jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/agent_manager.py
RENAMED
@@ -16,7 +16,7 @@ from jarvis.jarvis_agent.file_context_handler import file_context_handler
|
|
16
16
|
from jarvis.jarvis_agent.shell_input_handler import shell_input_handler
|
17
17
|
from jarvis.jarvis_agent.task_manager import TaskManager
|
18
18
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
19
|
-
from jarvis.jarvis_utils.config import is_non_interactive
|
19
|
+
from jarvis.jarvis_utils.config import is_non_interactive, is_skip_predefined_tasks
|
20
20
|
|
21
21
|
|
22
22
|
class AgentManager:
|
@@ -31,6 +31,7 @@ class AgentManager:
|
|
31
31
|
use_analysis: Optional[bool] = None,
|
32
32
|
multiline_inputer: Optional[Callable[[str], str]] = None,
|
33
33
|
confirm_callback: Optional[Callable[[str, bool], bool]] = None,
|
34
|
+
non_interactive: Optional[bool] = None,
|
34
35
|
):
|
35
36
|
self.model_group = model_group
|
36
37
|
self.tool_group = tool_group
|
@@ -41,6 +42,7 @@ class AgentManager:
|
|
41
42
|
# 可选:注入输入与确认回调,用于Web模式等前端替代交互
|
42
43
|
self.multiline_inputer = multiline_inputer
|
43
44
|
self.confirm_callback = confirm_callback
|
45
|
+
self.non_interactive = non_interactive
|
44
46
|
|
45
47
|
def initialize(self) -> Agent:
|
46
48
|
"""初始化Agent"""
|
@@ -53,12 +55,12 @@ class AgentManager:
|
|
53
55
|
self.agent = Agent(
|
54
56
|
system_prompt=origin_agent_system_prompt,
|
55
57
|
model_group=self.model_group,
|
56
|
-
output_handler=[ToolRegistry()], # type: ignore
|
57
58
|
need_summary=False,
|
58
59
|
use_methodology=self.use_methodology,
|
59
60
|
use_analysis=self.use_analysis,
|
60
61
|
multiline_inputer=self.multiline_inputer,
|
61
62
|
confirm_callback=self.confirm_callback,
|
63
|
+
non_interactive=self.non_interactive,
|
62
64
|
)
|
63
65
|
|
64
66
|
# 尝试恢复会话
|
@@ -80,8 +82,8 @@ class AgentManager:
|
|
80
82
|
self.agent.run(task_content)
|
81
83
|
raise typer.Exit(code=0)
|
82
84
|
|
83
|
-
#
|
84
|
-
if not is_non_interactive() and self.agent.first:
|
85
|
+
# 处理预定义任务(非交互模式下跳过;支持配置跳过加载)
|
86
|
+
if not is_non_interactive() and not is_skip_predefined_tasks() and self.agent.first:
|
85
87
|
task_manager = TaskManager()
|
86
88
|
tasks = task_manager.load_tasks()
|
87
89
|
if tasks and (selected_task := task_manager.select_task(tasks)):
|
@@ -81,7 +81,8 @@ class AgentConfig:
|
|
81
81
|
cfg.execute_tool_confirm = is_execute_tool_confirm()
|
82
82
|
|
83
83
|
# summary_prompt
|
84
|
-
|
84
|
+
# Treat None or whitespace-only string as unset, fallback to default
|
85
|
+
if cfg.summary_prompt is None or (isinstance(cfg.summary_prompt, str) and cfg.summary_prompt.strip() == ""):
|
85
86
|
cfg.summary_prompt = DEFAULT_SUMMARY_PROMPT
|
86
87
|
|
87
88
|
# max_token_count
|
{jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/edit_file_handler.py
RENAMED
@@ -92,10 +92,10 @@ class EditFileHandler(OutputHandler):
|
|
92
92
|
if not patches:
|
93
93
|
return False, "未找到有效的文件编辑指令"
|
94
94
|
|
95
|
-
# 记录
|
95
|
+
# 记录 PATCH 操作调用统计
|
96
96
|
from jarvis.jarvis_stats.stats import StatsManager
|
97
97
|
|
98
|
-
StatsManager.increment("
|
98
|
+
StatsManager.increment("patch", group="tool")
|
99
99
|
|
100
100
|
results = []
|
101
101
|
|
@@ -595,7 +595,10 @@ def handle_builtin_config_selector(
|
|
595
595
|
|
596
596
|
elif sel["category"] == "multi_agent":
|
597
597
|
# jarvis-multi-agent 需要 -c/--config,用户输入通过 -i/--input 传递
|
598
|
+
# 同时传递 -g/--llm-group 以继承 jvs 的模型组选择
|
598
599
|
args = [str(sel["cmd"]), "-c", str(sel["file"])]
|
600
|
+
if model_group:
|
601
|
+
args += ["-g", str(model_group)]
|
599
602
|
if task:
|
600
603
|
args += ["-i", str(task)]
|
601
604
|
|
@@ -967,14 +970,14 @@ def run_cli(
|
|
967
970
|
return
|
968
971
|
|
969
972
|
# 在初始化环境前检测Git仓库,并可选择自动切换到代码开发模式(jca)
|
970
|
-
if not non_interactive
|
973
|
+
if not non_interactive:
|
971
974
|
try_switch_to_jca_if_git_repo(
|
972
975
|
model_group, tool_group, config_file, restore_session, task
|
973
976
|
)
|
974
977
|
|
975
978
|
# 在进入默认通用代理前,列出内置配置供选择(agent/multi_agent/roles)
|
976
979
|
# 非交互模式下跳过内置角色/配置选择
|
977
|
-
if not non_interactive
|
980
|
+
if not non_interactive:
|
978
981
|
handle_builtin_config_selector(model_group, tool_group, config_file, task)
|
979
982
|
|
980
983
|
# 初始化环境
|
@@ -1005,13 +1008,9 @@ def run_cli(
|
|
1005
1008
|
# 在 Web 模式下注入基于 WebSocket 的输入/确认回调
|
1006
1009
|
extra_kwargs = {}
|
1007
1010
|
if web:
|
1008
|
-
|
1009
|
-
|
1010
|
-
|
1011
|
-
extra_kwargs["confirm_callback"] = web_user_confirm
|
1012
|
-
except Exception as e:
|
1013
|
-
PrettyOutput.print(f"Web 模式初始化失败(加载 Web 桥接模块): {e}", OutputType.ERROR)
|
1014
|
-
raise typer.Exit(code=1)
|
1011
|
+
# 纯 xterm 交互模式:不注入 WebBridge 的输入/确认回调,避免阻塞等待浏览器响应
|
1012
|
+
#(交互由 /terminal PTY 会话中的 jvs 进程处理)
|
1013
|
+
pass
|
1015
1014
|
|
1016
1015
|
agent_manager = AgentManager(
|
1017
1016
|
model_group=model_group,
|
@@ -1019,6 +1018,7 @@ def run_cli(
|
|
1019
1018
|
restore_session=restore_session,
|
1020
1019
|
use_methodology=False if disable_methodology_analysis else None,
|
1021
1020
|
use_analysis=False if disable_methodology_analysis else None,
|
1021
|
+
non_interactive=non_interactive,
|
1022
1022
|
**extra_kwargs,
|
1023
1023
|
)
|
1024
1024
|
agent = agent_manager.initialize()
|
@@ -1051,6 +1051,37 @@ def run_cli(
|
|
1051
1051
|
enable_web_stdin_redirect()
|
1052
1052
|
except Exception:
|
1053
1053
|
pass
|
1054
|
+
# 记录用于交互式终端(PTY)重启的 jvs 启动命令(移除 web 相关参数)
|
1055
|
+
try:
|
1056
|
+
import sys as _sys, os as _os, json as _json
|
1057
|
+
_argv = list(_sys.argv)
|
1058
|
+
# 去掉程序名(argv[0]),并过滤 --web 相关参数
|
1059
|
+
filtered = []
|
1060
|
+
i = 1
|
1061
|
+
while i < len(_argv):
|
1062
|
+
a = _argv[i]
|
1063
|
+
if a == "--web" or a.startswith("--web="):
|
1064
|
+
i += 1
|
1065
|
+
continue
|
1066
|
+
if a == "--web-host":
|
1067
|
+
i += 2
|
1068
|
+
continue
|
1069
|
+
if a.startswith("--web-host="):
|
1070
|
+
i += 1
|
1071
|
+
continue
|
1072
|
+
if a == "--web-port":
|
1073
|
+
i += 2
|
1074
|
+
continue
|
1075
|
+
if a.startswith("--web-port="):
|
1076
|
+
i += 1
|
1077
|
+
continue
|
1078
|
+
filtered.append(a)
|
1079
|
+
i += 1
|
1080
|
+
# 使用 jvs 命令作为可执行文件,保留其余业务参数
|
1081
|
+
cmd = ["jvs"] + filtered
|
1082
|
+
_os.environ["JARVIS_WEB_LAUNCH_JSON"] = _json.dumps(cmd, ensure_ascii=False)
|
1083
|
+
except Exception:
|
1084
|
+
pass
|
1054
1085
|
PrettyOutput.print("以 Web 模式启动,请在浏览器中打开提供的地址进行交互。", OutputType.INFO)
|
1055
1086
|
# 启动 Web 服务(阻塞调用)
|
1056
1087
|
start_web_server(agent_manager, host=web_host, port=web_port)
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
import os
|
3
|
+
import re
|
4
|
+
from typing import Any, Dict, List, Tuple
|
5
|
+
|
6
|
+
from jarvis.jarvis_agent.output_handler import OutputHandler
|
7
|
+
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
8
|
+
from jarvis.jarvis_utils.tag import ct, ot
|
9
|
+
|
10
|
+
|
11
|
+
class RewriteFileHandler(OutputHandler):
|
12
|
+
"""
|
13
|
+
处理整文件重写指令的输出处理器。
|
14
|
+
|
15
|
+
指令格式:
|
16
|
+
<REWRITE file=文件路径>
|
17
|
+
新的文件完整内容
|
18
|
+
</REWRITE>
|
19
|
+
|
20
|
+
等价支持以下写法:
|
21
|
+
<REWRITE file=文件路径>
|
22
|
+
新的文件完整内容
|
23
|
+
</REWRITE>
|
24
|
+
|
25
|
+
说明:
|
26
|
+
- 该处理器用于完全重写文件内容,适用于新增文件或大范围改写
|
27
|
+
- 内部直接执行写入,提供失败回滚能力
|
28
|
+
- 支持同一响应中包含多个 REWRITE/REWRITE 块
|
29
|
+
"""
|
30
|
+
|
31
|
+
def __init__(self) -> None:
|
32
|
+
# 允许 file 参数为单引号、双引号或无引号
|
33
|
+
self.rewrite_pattern_file = re.compile(
|
34
|
+
ot("REWRITE file=(?:'([^']+)'|\"([^\"]+)\"|([^>]+))")
|
35
|
+
+ r"\s*"
|
36
|
+
+ r"(.*?)"
|
37
|
+
+ r"\s*"
|
38
|
+
+ r"^"
|
39
|
+
+ ct("REWRITE"),
|
40
|
+
re.DOTALL | re.MULTILINE,
|
41
|
+
)
|
42
|
+
|
43
|
+
def name(self) -> str:
|
44
|
+
"""获取处理器名称,用于操作列表展示"""
|
45
|
+
return "REWRITE"
|
46
|
+
|
47
|
+
def prompt(self) -> str:
|
48
|
+
"""返回用户提示,描述使用方法与格式"""
|
49
|
+
return f"""文件重写指令格式:
|
50
|
+
{ot("REWRITE file=文件路径")}
|
51
|
+
新的文件完整内容
|
52
|
+
{ct("REWRITE")}
|
53
|
+
|
54
|
+
注意:
|
55
|
+
- {ot("REWRITE")}、{ct("REWRITE")} 必须出现在行首,否则不生效(会被忽略)
|
56
|
+
- 整文件重写会完全替换文件内容,如需局部修改请使用 PATCH 操作
|
57
|
+
- 该操作由处理器直接执行,具备失败回滚能力"""
|
58
|
+
|
59
|
+
def can_handle(self, response: str) -> bool:
|
60
|
+
"""判断响应中是否包含 REWRITE/REWRITE 指令"""
|
61
|
+
return bool(self.rewrite_pattern_file.search(response))
|
62
|
+
|
63
|
+
def handle(self, response: str, agent: Any) -> Tuple[bool, str]:
|
64
|
+
"""解析并执行整文件重写指令"""
|
65
|
+
rewrites = self._parse_rewrites(response)
|
66
|
+
if not rewrites:
|
67
|
+
return False, "未找到有效的文件重写指令"
|
68
|
+
|
69
|
+
# 记录 REWRITE 操作调用统计
|
70
|
+
try:
|
71
|
+
from jarvis.jarvis_stats.stats import StatsManager
|
72
|
+
|
73
|
+
StatsManager.increment("rewrite_file", group="tool")
|
74
|
+
except Exception:
|
75
|
+
# 统计失败不影响主流程
|
76
|
+
pass
|
77
|
+
|
78
|
+
results: List[str] = []
|
79
|
+
overall_success = True
|
80
|
+
|
81
|
+
for file_path, content in rewrites:
|
82
|
+
abs_path = os.path.abspath(file_path)
|
83
|
+
original_content = None
|
84
|
+
processed = False
|
85
|
+
try:
|
86
|
+
file_exists = os.path.exists(abs_path)
|
87
|
+
if file_exists:
|
88
|
+
with open(abs_path, "r", encoding="utf-8") as rf:
|
89
|
+
original_content = rf.read()
|
90
|
+
os.makedirs(os.path.dirname(abs_path), exist_ok=True)
|
91
|
+
with open(abs_path, "w", encoding="utf-8") as wf:
|
92
|
+
wf.write(content)
|
93
|
+
processed = True
|
94
|
+
results.append(f"✅ 文件 {abs_path} 重写成功")
|
95
|
+
# 记录成功处理的文件(使用绝对路径)
|
96
|
+
if agent:
|
97
|
+
files = agent.get_user_data("files")
|
98
|
+
if files:
|
99
|
+
if abs_path not in files:
|
100
|
+
files.append(abs_path)
|
101
|
+
else:
|
102
|
+
files = [abs_path]
|
103
|
+
agent.set_user_data("files", files)
|
104
|
+
except Exception as e:
|
105
|
+
overall_success = False
|
106
|
+
# 回滚已修改内容
|
107
|
+
try:
|
108
|
+
if processed:
|
109
|
+
if original_content is None:
|
110
|
+
if os.path.exists(abs_path):
|
111
|
+
os.remove(abs_path)
|
112
|
+
else:
|
113
|
+
with open(abs_path, "w", encoding="utf-8") as wf:
|
114
|
+
wf.write(original_content)
|
115
|
+
except Exception:
|
116
|
+
pass
|
117
|
+
PrettyOutput.print(f"文件重写失败: {str(e)}", OutputType.ERROR)
|
118
|
+
results.append(f"❌ 文件 {abs_path} 重写失败: {str(e)}")
|
119
|
+
|
120
|
+
summary = "\n".join(results)
|
121
|
+
# 按现有 EditFileHandler 约定,始终返回 (False, summary) 以继续主循环
|
122
|
+
return False, summary
|
123
|
+
|
124
|
+
def _parse_rewrites(self, response: str) -> List[Tuple[str, str]]:
|
125
|
+
"""
|
126
|
+
解析响应中的 REWRITE/REWRITE 指令块。
|
127
|
+
返回列表 [(file_path, content), ...],按在响应中的出现顺序排序
|
128
|
+
"""
|
129
|
+
items: List[Tuple[str, str]] = []
|
130
|
+
matches: List[Tuple[int, Any]] = []
|
131
|
+
for m in self.rewrite_pattern_file.finditer(response):
|
132
|
+
matches.append((m.start(), m))
|
133
|
+
|
134
|
+
# 按出现顺序排序
|
135
|
+
matches.sort(key=lambda x: x[0])
|
136
|
+
|
137
|
+
for _, m in matches:
|
138
|
+
file_path = m.group(1) or m.group(2) or m.group(3) or ""
|
139
|
+
file_path = file_path.strip()
|
140
|
+
content = m.group(4)
|
141
|
+
if file_path:
|
142
|
+
items.append((file_path, content))
|
143
|
+
return items
|
@@ -81,12 +81,13 @@ class AgentRunLoop:
|
|
81
81
|
pass
|
82
82
|
need_return, tool_prompt = ag._call_tools(current_response)
|
83
83
|
|
84
|
-
#
|
85
|
-
ag.session.prompt = join_prompts([ag.session.prompt, tool_prompt])
|
86
|
-
|
84
|
+
# 如果工具要求立即返回结果(例如 SEND_MESSAGE 需要将字典返回给上层),直接返回该结果
|
87
85
|
if need_return:
|
88
|
-
return
|
86
|
+
return tool_prompt
|
89
87
|
|
88
|
+
# 将上一个提示和工具提示安全地拼接起来(仅当工具结果为字符串时)
|
89
|
+
safe_tool_prompt = tool_prompt if isinstance(tool_prompt, str) else ""
|
90
|
+
ag.session.prompt = join_prompts([ag.session.prompt, safe_tool_prompt])
|
90
91
|
|
91
92
|
# 广播工具调用后的事件(不影响主流程)
|
92
93
|
try:
|
@@ -16,7 +16,11 @@ def join_prompts(parts: Iterable[str]) -> str:
|
|
16
16
|
- 使用两个换行分隔
|
17
17
|
- 不进行额外 strip,保持调用方原样语义
|
18
18
|
"""
|
19
|
-
|
19
|
+
try:
|
20
|
+
non_empty: List[str] = [p for p in parts if isinstance(p, str) and p]
|
21
|
+
except Exception:
|
22
|
+
# 防御性处理:若 parts 不可迭代或出现异常,直接返回空字符串
|
23
|
+
return ""
|
20
24
|
return "\n\n".join(non_empty)
|
21
25
|
|
22
26
|
def is_auto_complete(response: str) -> bool:
|