jarvis-ai-assistant 0.3.28__tar.gz → 0.3.30__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.3.28/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.3.30}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/pyproject.toml +1 -1
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/setup.py +1 -1
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/__init__.py +154 -32
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/event_bus.py +2 -2
- jarvis_ai_assistant-0.3.30/src/jarvis/jarvis_agent/events.py +157 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/file_methodology_manager.py +17 -4
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/jarvis.py +3 -3
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/memory_manager.py +4 -3
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/prompts.py +2 -2
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/protocols.py +4 -1
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/run_loop.py +10 -27
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/shell_input_handler.py +6 -1
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/task_analyzer.py +18 -13
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/task_manager.py +6 -4
- jarvis_ai_assistant-0.3.30/src/jarvis/jarvis_agent/utils.py +50 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_agent/code_agent.py +3 -2
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_data/config_schema.json +8 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_mcp/sse_mcp_client.py +1 -1
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_memory_organizer/memory_organizer.py +4 -4
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/kimi.py +1 -1
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/tongyi.py +1 -1
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/yuanbao.py +1 -1
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/retriever.py +3 -3
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/stats.py +2 -2
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/storage.py +3 -3
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/edit_file.py +3 -3
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/execute_script.py +2 -2
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/generate_new_tool.py +13 -2
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/sub_agent.py +2 -2
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/sub_code_agent.py +2 -2
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/config.py +17 -3
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/fzf.py +4 -3
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/git_utils.py +20 -16
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/input.py +5 -5
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/utils.py +109 -20
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +2 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/LICENSE +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/README.md +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/agent_manager.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/config.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/config_editor.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/edit_file_handler.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/main.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/methodology_share_manager.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/output_handler.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/prompt_builder.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/prompt_manager.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/session_manager.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/share_manager.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/tool_executor.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/tool_share_manager.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/user_interaction.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_agent/lint.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_git_squash/main.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_mcp/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_memory_organizer/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_methodology/main.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_multi_agent/main.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/ai8.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/base.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/human.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/openai.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/registry.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform_manager/main.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform_manager/service.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/cache.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/cli.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/embedding_manager.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/llm_interface.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/query_rewriter.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/rag_pipeline.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/reranker.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_smart_shell/main.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/cli.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/visualizer.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/ask_user.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/base.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/clear_memory.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/cli/main.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/methodology.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/read_code.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/registry.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/retrieve_memory.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/save_memory.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/search_web.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/clipboard.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/embedding.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/file_processors.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/globals.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/http.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/methodology.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/output.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/tag.py +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
- {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/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.3.
|
7
|
+
version = "0.3.30"
|
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.3.
|
6
|
+
version="0.3.30",
|
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",
|
{jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/__init__.py
RENAMED
@@ -4,6 +4,7 @@ import datetime
|
|
4
4
|
import os
|
5
5
|
import platform
|
6
6
|
import re
|
7
|
+
import sys
|
7
8
|
from pathlib import Path
|
8
9
|
from enum import Enum
|
9
10
|
from typing import Any, Callable, Dict, List, Optional, Protocol, Tuple, Union
|
@@ -34,7 +35,24 @@ from jarvis.jarvis_agent.prompt_manager import PromptManager
|
|
34
35
|
from jarvis.jarvis_agent.event_bus import EventBus
|
35
36
|
from jarvis.jarvis_agent.config import AgentConfig
|
36
37
|
from jarvis.jarvis_agent.run_loop import AgentRunLoop
|
38
|
+
from jarvis.jarvis_agent.events import (
|
39
|
+
BEFORE_SUMMARY,
|
40
|
+
AFTER_SUMMARY,
|
41
|
+
TASK_COMPLETED,
|
42
|
+
TASK_STARTED,
|
43
|
+
BEFORE_ADDON_PROMPT,
|
44
|
+
AFTER_ADDON_PROMPT,
|
45
|
+
BEFORE_HISTORY_CLEAR,
|
46
|
+
AFTER_HISTORY_CLEAR,
|
47
|
+
BEFORE_MODEL_CALL,
|
48
|
+
AFTER_MODEL_CALL,
|
49
|
+
INTERRUPT_TRIGGERED,
|
50
|
+
BEFORE_TOOL_FILTER,
|
51
|
+
TOOL_FILTERED,
|
52
|
+
AFTER_TOOL_CALL,
|
53
|
+
)
|
37
54
|
from jarvis.jarvis_agent.user_interaction import UserInteractionHandler
|
55
|
+
from jarvis.jarvis_agent.utils import join_prompts
|
38
56
|
from jarvis.jarvis_utils.methodology import _load_all_methodologies
|
39
57
|
|
40
58
|
# jarvis_platform 相关
|
@@ -52,6 +70,7 @@ from jarvis.jarvis_utils.config import (
|
|
52
70
|
is_use_analysis,
|
53
71
|
is_use_methodology,
|
54
72
|
get_tool_filter_threshold,
|
73
|
+
get_after_tool_call_cb_dirs,
|
55
74
|
)
|
56
75
|
from jarvis.jarvis_utils.embedding import get_context_token_count
|
57
76
|
from jarvis.jarvis_utils.globals import (
|
@@ -212,6 +231,15 @@ class LoopAction(Enum):
|
|
212
231
|
|
213
232
|
|
214
233
|
class Agent:
|
234
|
+
# Attribute type annotations to satisfy static type checkers
|
235
|
+
event_bus: EventBus
|
236
|
+
memory_manager: MemoryManager
|
237
|
+
task_analyzer: TaskAnalyzer
|
238
|
+
file_methodology_manager: FileMethodologyManager
|
239
|
+
prompt_manager: PromptManager
|
240
|
+
model: BasePlatform
|
241
|
+
session: SessionManager
|
242
|
+
|
215
243
|
def clear_history(self):
|
216
244
|
"""
|
217
245
|
Clears the current conversation history by delegating to the session manager.
|
@@ -219,7 +247,7 @@ class Agent:
|
|
219
247
|
self.session.clear_history()
|
220
248
|
# 广播清理历史后的事件
|
221
249
|
try:
|
222
|
-
self.event_bus.emit(
|
250
|
+
self.event_bus.emit(AFTER_HISTORY_CLEAR, agent=self)
|
223
251
|
except Exception:
|
224
252
|
pass
|
225
253
|
|
@@ -285,7 +313,7 @@ class Agent:
|
|
285
313
|
self.first = True
|
286
314
|
self.run_input_handlers_next_turn = False
|
287
315
|
self.user_data: Dict[str, Any] = {}
|
288
|
-
|
316
|
+
|
289
317
|
|
290
318
|
# 用户确认回调:默认使用 CLI 的 user_confirm,可由外部注入以支持 TUI/GUI
|
291
319
|
self.user_confirm: Callable[[str, bool], bool] = (
|
@@ -336,18 +364,23 @@ class Agent:
|
|
336
364
|
self.get_tool_registry(), # type: ignore
|
337
365
|
platform_name=self.model.platform_name(), # type: ignore
|
338
366
|
)
|
367
|
+
# 动态加载工具调用后回调
|
368
|
+
self._load_after_tool_callbacks()
|
339
369
|
|
340
370
|
def _init_model(self, model_group: Optional[str]):
|
341
371
|
"""初始化模型平台(统一使用 normal 平台/模型)"""
|
342
372
|
platform_name = get_normal_platform_name(model_group)
|
343
373
|
model_name = get_normal_model_name(model_group)
|
344
374
|
|
345
|
-
|
346
|
-
if
|
375
|
+
maybe_model = PlatformRegistry().create_platform(platform_name)
|
376
|
+
if maybe_model is None:
|
347
377
|
PrettyOutput.print(
|
348
378
|
f"平台 {platform_name} 不存在,将使用普通模型", OutputType.WARNING
|
349
379
|
)
|
350
|
-
|
380
|
+
maybe_model = PlatformRegistry().get_normal_platform()
|
381
|
+
|
382
|
+
# 在此处收敛为非可选类型,确保后续赋值满足类型检查
|
383
|
+
self.model = maybe_model
|
351
384
|
|
352
385
|
if model_name:
|
353
386
|
self.model.set_model_name(model_name)
|
@@ -474,13 +507,95 @@ class Agent:
|
|
474
507
|
# Fallback for custom handlers that only accept one argument
|
475
508
|
return self.multiline_inputer(tip) # type: ignore
|
476
509
|
|
477
|
-
def
|
478
|
-
"""
|
479
|
-
|
480
|
-
|
481
|
-
|
510
|
+
def _load_after_tool_callbacks(self) -> None:
|
511
|
+
"""
|
512
|
+
扫描 JARVIS_AFTER_TOOL_CALL_CB_DIRS 中的 Python 文件并动态注册回调。
|
513
|
+
约定优先级(任一命中即注册):
|
514
|
+
- 模块级可调用对象: after_tool_call_cb
|
515
|
+
- 工厂方法返回单个或多个可调用对象: get_after_tool_call_cb(), register_after_tool_call_cb()
|
482
516
|
"""
|
483
|
-
|
517
|
+
try:
|
518
|
+
dirs = get_after_tool_call_cb_dirs()
|
519
|
+
if not dirs:
|
520
|
+
return
|
521
|
+
for d in dirs:
|
522
|
+
p_dir = Path(d)
|
523
|
+
if not p_dir.exists() or not p_dir.is_dir():
|
524
|
+
continue
|
525
|
+
for file_path in p_dir.glob("*.py"):
|
526
|
+
if file_path.name == "__init__.py":
|
527
|
+
continue
|
528
|
+
parent_dir = str(file_path.parent)
|
529
|
+
added_path = False
|
530
|
+
try:
|
531
|
+
if parent_dir not in sys.path:
|
532
|
+
sys.path.insert(0, parent_dir)
|
533
|
+
added_path = True
|
534
|
+
module_name = file_path.stem
|
535
|
+
module = __import__(module_name)
|
536
|
+
|
537
|
+
candidates: List[Callable[[Any], None]] = []
|
538
|
+
|
539
|
+
# 1) 直接导出的回调
|
540
|
+
if hasattr(module, "after_tool_call_cb"):
|
541
|
+
obj = getattr(module, "after_tool_call_cb")
|
542
|
+
if callable(obj):
|
543
|
+
candidates.append(obj) # type: ignore[arg-type]
|
544
|
+
|
545
|
+
# 2) 工厂方法:get_after_tool_call_cb()
|
546
|
+
if hasattr(module, "get_after_tool_call_cb"):
|
547
|
+
factory = getattr(module, "get_after_tool_call_cb")
|
548
|
+
if callable(factory):
|
549
|
+
try:
|
550
|
+
ret = factory()
|
551
|
+
if callable(ret):
|
552
|
+
candidates.append(ret)
|
553
|
+
elif isinstance(ret, (list, tuple)):
|
554
|
+
for c in ret:
|
555
|
+
if callable(c):
|
556
|
+
candidates.append(c)
|
557
|
+
except Exception:
|
558
|
+
pass
|
559
|
+
|
560
|
+
# 3) 工厂方法:register_after_tool_call_cb()
|
561
|
+
if hasattr(module, "register_after_tool_call_cb"):
|
562
|
+
factory2 = getattr(module, "register_after_tool_call_cb")
|
563
|
+
if callable(factory2):
|
564
|
+
try:
|
565
|
+
ret2 = factory2()
|
566
|
+
if callable(ret2):
|
567
|
+
candidates.append(ret2)
|
568
|
+
elif isinstance(ret2, (list, tuple)):
|
569
|
+
for c in ret2:
|
570
|
+
if callable(c):
|
571
|
+
candidates.append(c)
|
572
|
+
except Exception:
|
573
|
+
pass
|
574
|
+
|
575
|
+
for cb in candidates:
|
576
|
+
try:
|
577
|
+
def _make_wrapper(callback):
|
578
|
+
def _wrapper(**kwargs: Any) -> None:
|
579
|
+
try:
|
580
|
+
agent = kwargs.get("agent")
|
581
|
+
callback(agent)
|
582
|
+
except Exception:
|
583
|
+
pass
|
584
|
+
return _wrapper
|
585
|
+
self.event_bus.subscribe(AFTER_TOOL_CALL, _make_wrapper(cb))
|
586
|
+
except Exception:
|
587
|
+
pass
|
588
|
+
|
589
|
+
except Exception as e:
|
590
|
+
PrettyOutput.print(f"从 {file_path} 加载回调失败: {e}", OutputType.WARNING)
|
591
|
+
finally:
|
592
|
+
if added_path:
|
593
|
+
try:
|
594
|
+
sys.path.remove(parent_dir)
|
595
|
+
except ValueError:
|
596
|
+
pass
|
597
|
+
except Exception as e:
|
598
|
+
PrettyOutput.print(f"加载回调目录时发生错误: {e}", OutputType.WARNING)
|
484
599
|
|
485
600
|
def save_session(self) -> bool:
|
486
601
|
"""Saves the current session state by delegating to the session manager."""
|
@@ -555,7 +670,7 @@ class Agent:
|
|
555
670
|
# 广播添加附加提示前事件(不影响主流程)
|
556
671
|
try:
|
557
672
|
self.event_bus.emit(
|
558
|
-
|
673
|
+
BEFORE_ADDON_PROMPT,
|
559
674
|
agent=self,
|
560
675
|
need_complete=need_complete,
|
561
676
|
current_message=message,
|
@@ -567,16 +682,16 @@ class Agent:
|
|
567
682
|
addon_text = ""
|
568
683
|
if self.session.addon_prompt:
|
569
684
|
addon_text = self.session.addon_prompt
|
570
|
-
message
|
685
|
+
message = join_prompts([message, addon_text])
|
571
686
|
self.session.addon_prompt = ""
|
572
687
|
else:
|
573
688
|
addon_text = self.make_default_addon_prompt(need_complete)
|
574
|
-
message
|
689
|
+
message = join_prompts([message, addon_text])
|
575
690
|
|
576
691
|
# 广播添加附加提示后事件(不影响主流程)
|
577
692
|
try:
|
578
693
|
self.event_bus.emit(
|
579
|
-
|
694
|
+
AFTER_ADDON_PROMPT,
|
580
695
|
agent=self,
|
581
696
|
need_complete=need_complete,
|
582
697
|
addon_text=addon_text,
|
@@ -593,7 +708,7 @@ class Agent:
|
|
593
708
|
if self.session.conversation_length > self.max_token_count:
|
594
709
|
summary = self._summarize_and_clear_history()
|
595
710
|
if summary:
|
596
|
-
message = summary
|
711
|
+
message = join_prompts([summary, message])
|
597
712
|
self.session.conversation_length = get_context_token_count(message)
|
598
713
|
|
599
714
|
return message
|
@@ -606,7 +721,7 @@ class Agent:
|
|
606
721
|
# 事件:模型调用前
|
607
722
|
try:
|
608
723
|
self.event_bus.emit(
|
609
|
-
|
724
|
+
BEFORE_MODEL_CALL,
|
610
725
|
agent=self,
|
611
726
|
message=message,
|
612
727
|
)
|
@@ -618,7 +733,7 @@ class Agent:
|
|
618
733
|
# 事件:模型调用后
|
619
734
|
try:
|
620
735
|
self.event_bus.emit(
|
621
|
-
|
736
|
+
AFTER_MODEL_CALL,
|
622
737
|
agent=self,
|
623
738
|
message=message,
|
624
739
|
response=response,
|
@@ -697,7 +812,7 @@ class Agent:
|
|
697
812
|
if self.model:
|
698
813
|
# 广播清理历史前事件
|
699
814
|
try:
|
700
|
-
self.event_bus.emit(
|
815
|
+
self.event_bus.emit(BEFORE_HISTORY_CLEAR, agent=self)
|
701
816
|
except Exception:
|
702
817
|
pass
|
703
818
|
self.model.reset()
|
@@ -707,7 +822,7 @@ class Agent:
|
|
707
822
|
self.session.clear_history()
|
708
823
|
# 广播清理历史后的事件
|
709
824
|
try:
|
710
|
-
self.event_bus.emit(
|
825
|
+
self.event_bus.emit(AFTER_HISTORY_CLEAR, agent=self)
|
711
826
|
except Exception:
|
712
827
|
pass
|
713
828
|
|
@@ -717,13 +832,13 @@ class Agent:
|
|
717
832
|
"""使用文件上传方式处理历史"""
|
718
833
|
# 广播清理历史前事件
|
719
834
|
try:
|
720
|
-
self.event_bus.emit(
|
835
|
+
self.event_bus.emit(BEFORE_HISTORY_CLEAR, agent=self)
|
721
836
|
except Exception:
|
722
837
|
pass
|
723
838
|
result = self.file_methodology_manager.handle_history_with_file_upload()
|
724
839
|
# 广播清理历史后的事件
|
725
840
|
try:
|
726
|
-
self.event_bus.emit(
|
841
|
+
self.event_bus.emit(AFTER_HISTORY_CLEAR, agent=self)
|
727
842
|
except Exception:
|
728
843
|
pass
|
729
844
|
return result
|
@@ -771,7 +886,7 @@ class Agent:
|
|
771
886
|
# 广播将要生成总结事件
|
772
887
|
try:
|
773
888
|
self.event_bus.emit(
|
774
|
-
|
889
|
+
BEFORE_SUMMARY,
|
775
890
|
agent=self,
|
776
891
|
prompt=self.session.prompt,
|
777
892
|
auto_completed=auto_completed,
|
@@ -788,7 +903,7 @@ class Agent:
|
|
788
903
|
# 广播完成总结事件
|
789
904
|
try:
|
790
905
|
self.event_bus.emit(
|
791
|
-
|
906
|
+
AFTER_SUMMARY,
|
792
907
|
agent=self,
|
793
908
|
summary=result,
|
794
909
|
)
|
@@ -798,7 +913,7 @@ class Agent:
|
|
798
913
|
# 广播任务完成事件(不影响主流程)
|
799
914
|
try:
|
800
915
|
self.event_bus.emit(
|
801
|
-
|
916
|
+
TASK_COMPLETED,
|
802
917
|
agent=self,
|
803
918
|
auto_completed=auto_completed,
|
804
919
|
need_summary=self.need_summary,
|
@@ -842,6 +957,7 @@ class Agent:
|
|
842
957
|
{complete_prompt}
|
843
958
|
如果没有完成,请进行下一步操作:
|
844
959
|
- 仅包含一个操作
|
960
|
+
- 不要询问用户是否继续,直接继续执行直至完成
|
845
961
|
- 如果信息不明确,请请求用户补充
|
846
962
|
- 如果执行过程中连续失败5次,请使用ask_user询问用户操作
|
847
963
|
- 操作列表:{action_handlers}{memory_prompts}
|
@@ -873,7 +989,7 @@ class Agent:
|
|
873
989
|
# 广播任务开始事件(不影响主流程)
|
874
990
|
try:
|
875
991
|
self.event_bus.emit(
|
876
|
-
|
992
|
+
TASK_STARTED,
|
877
993
|
agent=self,
|
878
994
|
name=self.name,
|
879
995
|
description=self.description,
|
@@ -910,7 +1026,7 @@ class Agent:
|
|
910
1026
|
# 广播中断事件(包含用户输入,可能为空字符串)
|
911
1027
|
try:
|
912
1028
|
self.event_bus.emit(
|
913
|
-
|
1029
|
+
INTERRUPT_TRIGGERED,
|
914
1030
|
agent=self,
|
915
1031
|
current_response=current_response,
|
916
1032
|
user_input=user_input,
|
@@ -926,10 +1042,16 @@ class Agent:
|
|
926
1042
|
|
927
1043
|
if any(handler.can_handle(current_response) for handler in self.output_handler):
|
928
1044
|
if self.user_confirm("检测到有工具调用,是否继续处理工具调用?", True):
|
929
|
-
self.session.prompt =
|
1045
|
+
self.session.prompt = join_prompts([
|
1046
|
+
f"被用户中断,用户补充信息为:{user_input}",
|
1047
|
+
"用户同意继续工具调用。"
|
1048
|
+
])
|
930
1049
|
return None # 继续执行工具调用
|
931
1050
|
else:
|
932
|
-
self.session.prompt =
|
1051
|
+
self.session.prompt = join_prompts([
|
1052
|
+
f"被用户中断,用户补充信息为:{user_input}",
|
1053
|
+
"检测到有工具调用,但被用户拒绝执行。请根据用户的补充信息重新考虑下一步操作。"
|
1054
|
+
])
|
933
1055
|
return LoopAction.SKIP_TURN # 请求主循环 continue
|
934
1056
|
else:
|
935
1057
|
self.session.prompt = f"被用户中断,用户补充信息为:{user_input}"
|
@@ -1020,7 +1142,7 @@ class Agent:
|
|
1020
1142
|
# 广播工具筛选开始事件
|
1021
1143
|
try:
|
1022
1144
|
self.event_bus.emit(
|
1023
|
-
|
1145
|
+
BEFORE_TOOL_FILTER,
|
1024
1146
|
agent=self,
|
1025
1147
|
task=task,
|
1026
1148
|
total_tools=len(all_tools),
|
@@ -1059,7 +1181,7 @@ class Agent:
|
|
1059
1181
|
# 广播工具筛选事件
|
1060
1182
|
try:
|
1061
1183
|
self.event_bus.emit(
|
1062
|
-
|
1184
|
+
TOOL_FILTERED,
|
1063
1185
|
agent=self,
|
1064
1186
|
task=task,
|
1065
1187
|
selected_tools=selected_tool_names,
|
@@ -1075,7 +1197,7 @@ class Agent:
|
|
1075
1197
|
# 广播工具筛选事件(无筛选结果)
|
1076
1198
|
try:
|
1077
1199
|
self.event_bus.emit(
|
1078
|
-
|
1200
|
+
TOOL_FILTERED,
|
1079
1201
|
agent=self,
|
1080
1202
|
task=task,
|
1081
1203
|
selected_tools=[],
|
{jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/event_bus.py
RENAMED
@@ -8,7 +8,7 @@
|
|
8
8
|
- 不引入额外依赖,便于在 Agent 中渐进集成
|
9
9
|
"""
|
10
10
|
from collections import defaultdict
|
11
|
-
from typing import Callable, DefaultDict, Dict, List
|
11
|
+
from typing import Callable, DefaultDict, Dict, List, Any
|
12
12
|
|
13
13
|
|
14
14
|
|
@@ -36,7 +36,7 @@ class EventBus:
|
|
36
36
|
except ValueError:
|
37
37
|
pass
|
38
38
|
|
39
|
-
def emit(self, event: str, **payload:
|
39
|
+
def emit(self, event: str, **payload: Any) -> None:
|
40
40
|
"""
|
41
41
|
广播事件。回调中的异常将被捕获并忽略,以保证主流程稳定。
|
42
42
|
"""
|
@@ -0,0 +1,157 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""
|
3
|
+
事件主题与负载类型定义(jarvis_agent.events)
|
4
|
+
|
5
|
+
目的:
|
6
|
+
- 统一事件名称,避免在代码各处硬编码字符串导致的漂移
|
7
|
+
- 提供事件负载的类型提示,便于静态检查与后续文档化
|
8
|
+
- 本文件仅提供常量与类型定义,不改变现有行为
|
9
|
+
"""
|
10
|
+
from typing import Any, TypedDict, List
|
11
|
+
|
12
|
+
# 事件主题常量
|
13
|
+
BEFORE_TOOL_CALL = "before_tool_call"
|
14
|
+
AFTER_TOOL_CALL = "after_tool_call"
|
15
|
+
|
16
|
+
# 会话与任务生命周期相关
|
17
|
+
TASK_STARTED = "task_started"
|
18
|
+
TASK_COMPLETED = "task_completed"
|
19
|
+
|
20
|
+
# 总结阶段
|
21
|
+
BEFORE_SUMMARY = "before_summary"
|
22
|
+
AFTER_SUMMARY = "after_summary"
|
23
|
+
|
24
|
+
# 附加提示
|
25
|
+
BEFORE_ADDON_PROMPT = "before_addon_prompt"
|
26
|
+
AFTER_ADDON_PROMPT = "after_addon_prompt"
|
27
|
+
|
28
|
+
# 历史清理
|
29
|
+
BEFORE_HISTORY_CLEAR = "before_history_clear"
|
30
|
+
AFTER_HISTORY_CLEAR = "after_history_clear"
|
31
|
+
|
32
|
+
# 模型调用
|
33
|
+
BEFORE_MODEL_CALL = "before_model_call"
|
34
|
+
AFTER_MODEL_CALL = "after_model_call"
|
35
|
+
|
36
|
+
# 其他
|
37
|
+
INTERRUPT_TRIGGERED = "interrupt_triggered"
|
38
|
+
BEFORE_TOOL_FILTER = "before_tool_filter"
|
39
|
+
TOOL_FILTERED = "tool_filtered"
|
40
|
+
|
41
|
+
|
42
|
+
# 事件负载类型(仅用于类型提示)
|
43
|
+
class BeforeToolCallEvent(TypedDict, total=False):
|
44
|
+
agent: Any
|
45
|
+
current_response: str
|
46
|
+
|
47
|
+
class AfterToolCallEvent(TypedDict, total=False):
|
48
|
+
agent: Any
|
49
|
+
current_response: str
|
50
|
+
need_return: bool
|
51
|
+
tool_prompt: str
|
52
|
+
|
53
|
+
# 任务生命周期
|
54
|
+
class TaskStartedEvent(TypedDict, total=False):
|
55
|
+
agent: Any
|
56
|
+
name: str
|
57
|
+
description: str
|
58
|
+
user_input: str
|
59
|
+
|
60
|
+
class TaskCompletedEvent(TypedDict, total=False):
|
61
|
+
agent: Any
|
62
|
+
auto_completed: bool
|
63
|
+
need_summary: bool
|
64
|
+
|
65
|
+
# 总结阶段
|
66
|
+
class BeforeSummaryEvent(TypedDict, total=False):
|
67
|
+
agent: Any
|
68
|
+
prompt: str
|
69
|
+
auto_completed: bool
|
70
|
+
need_summary: bool
|
71
|
+
|
72
|
+
class AfterSummaryEvent(TypedDict, total=False):
|
73
|
+
agent: Any
|
74
|
+
summary: str
|
75
|
+
|
76
|
+
# 附加提示
|
77
|
+
class BeforeAddonPromptEvent(TypedDict, total=False):
|
78
|
+
agent: Any
|
79
|
+
need_complete: bool
|
80
|
+
current_message: str
|
81
|
+
has_session_addon: bool
|
82
|
+
|
83
|
+
class AfterAddonPromptEvent(TypedDict, total=False):
|
84
|
+
agent: Any
|
85
|
+
need_complete: bool
|
86
|
+
addon_text: str
|
87
|
+
final_message: str
|
88
|
+
|
89
|
+
# 历史清理
|
90
|
+
class BeforeHistoryClearEvent(TypedDict, total=False):
|
91
|
+
agent: Any
|
92
|
+
|
93
|
+
class AfterHistoryClearEvent(TypedDict, total=False):
|
94
|
+
agent: Any
|
95
|
+
|
96
|
+
# 模型调用
|
97
|
+
class BeforeModelCallEvent(TypedDict, total=False):
|
98
|
+
agent: Any
|
99
|
+
message: str
|
100
|
+
|
101
|
+
class AfterModelCallEvent(TypedDict, total=False):
|
102
|
+
agent: Any
|
103
|
+
message: str
|
104
|
+
response: str
|
105
|
+
|
106
|
+
# 中断
|
107
|
+
class InterruptTriggeredEvent(TypedDict, total=False):
|
108
|
+
agent: Any
|
109
|
+
current_response: str
|
110
|
+
user_input: str
|
111
|
+
|
112
|
+
# 工具筛选
|
113
|
+
class BeforeToolFilterEvent(TypedDict, total=False):
|
114
|
+
agent: Any
|
115
|
+
task: str
|
116
|
+
total_tools: int
|
117
|
+
threshold: int
|
118
|
+
|
119
|
+
class ToolFilteredEvent(TypedDict, total=False):
|
120
|
+
agent: Any
|
121
|
+
task: str
|
122
|
+
selected_tools: List[str]
|
123
|
+
total_tools: int
|
124
|
+
threshold: int
|
125
|
+
|
126
|
+
__all__ = [
|
127
|
+
"BEFORE_TOOL_CALL",
|
128
|
+
"AFTER_TOOL_CALL",
|
129
|
+
"TASK_STARTED",
|
130
|
+
"TASK_COMPLETED",
|
131
|
+
"BEFORE_SUMMARY",
|
132
|
+
"AFTER_SUMMARY",
|
133
|
+
"BEFORE_ADDON_PROMPT",
|
134
|
+
"AFTER_ADDON_PROMPT",
|
135
|
+
"BEFORE_HISTORY_CLEAR",
|
136
|
+
"AFTER_HISTORY_CLEAR",
|
137
|
+
"BEFORE_MODEL_CALL",
|
138
|
+
"AFTER_MODEL_CALL",
|
139
|
+
"INTERRUPT_TRIGGERED",
|
140
|
+
"BEFORE_TOOL_FILTER",
|
141
|
+
"TOOL_FILTERED",
|
142
|
+
"BeforeToolCallEvent",
|
143
|
+
"AfterToolCallEvent",
|
144
|
+
"TaskStartedEvent",
|
145
|
+
"TaskCompletedEvent",
|
146
|
+
"BeforeSummaryEvent",
|
147
|
+
"AfterSummaryEvent",
|
148
|
+
"BeforeAddonPromptEvent",
|
149
|
+
"AfterAddonPromptEvent",
|
150
|
+
"BeforeHistoryClearEvent",
|
151
|
+
"AfterHistoryClearEvent",
|
152
|
+
"BeforeModelCallEvent",
|
153
|
+
"AfterModelCallEvent",
|
154
|
+
"InterruptTriggeredEvent",
|
155
|
+
"BeforeToolFilterEvent",
|
156
|
+
"ToolFilteredEvent",
|
157
|
+
]
|
@@ -8,6 +8,7 @@ import tempfile
|
|
8
8
|
|
9
9
|
from jarvis.jarvis_utils.methodology import load_methodology, upload_methodology
|
10
10
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
11
|
+
from jarvis.jarvis_agent.utils import join_prompts
|
11
12
|
|
12
13
|
|
13
14
|
class FileMethodologyManager:
|
@@ -47,16 +48,25 @@ class FileMethodologyManager:
|
|
47
48
|
# 上传成功
|
48
49
|
|
49
50
|
if self.agent.files:
|
50
|
-
self.agent.session.prompt =
|
51
|
+
self.agent.session.prompt = join_prompts([
|
52
|
+
self.agent.session.prompt,
|
53
|
+
"上传的文件包含历史对话信息和方法论文件,可以从中获取一些经验信息。"
|
54
|
+
])
|
51
55
|
else:
|
52
|
-
self.agent.session.prompt =
|
56
|
+
self.agent.session.prompt = join_prompts([
|
57
|
+
self.agent.session.prompt,
|
58
|
+
"上传的文件包含历史对话信息,可以从中获取一些经验信息。"
|
59
|
+
])
|
53
60
|
|
54
61
|
def _handle_files_upload(self):
|
55
62
|
"""处理普通文件上传"""
|
56
63
|
if not self.agent.model.upload_files(self.agent.files): # type: ignore
|
57
64
|
PrettyOutput.print("文件上传失败,将忽略文件列表", OutputType.WARNING)
|
58
65
|
else:
|
59
|
-
self.agent.session.prompt =
|
66
|
+
self.agent.session.prompt = join_prompts([
|
67
|
+
self.agent.session.prompt,
|
68
|
+
"上传的文件包含历史对话信息,可以从中获取一些经验信息。"
|
69
|
+
])
|
60
70
|
|
61
71
|
def _handle_local_mode(self):
|
62
72
|
"""处理本地模式(不支持文件上传)"""
|
@@ -80,7 +90,10 @@ class FileMethodologyManager:
|
|
80
90
|
platform_name=self.agent.model.platform_name(),
|
81
91
|
model_name=self.agent.model.name(),
|
82
92
|
)
|
83
|
-
self.agent.session.prompt =
|
93
|
+
self.agent.session.prompt = join_prompts([
|
94
|
+
self.agent.session.prompt,
|
95
|
+
f"以下是历史类似问题的执行经验,可参考:\n{methodology}"
|
96
|
+
])
|
84
97
|
|
85
98
|
def handle_history_with_file_upload(self) -> str:
|
86
99
|
"""使用文件上传方式处理历史"""
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
"""Jarvis AI 助手主入口模块"""
|
3
|
-
from typing import Optional
|
3
|
+
from typing import Optional, List
|
4
4
|
|
5
5
|
import typer
|
6
6
|
|
@@ -391,7 +391,7 @@ def handle_builtin_config_selector(
|
|
391
391
|
if category == "roles":
|
392
392
|
count = opt.get("roles_count")
|
393
393
|
details_val = opt.get("details", "")
|
394
|
-
parts:
|
394
|
+
parts: List[str] = []
|
395
395
|
if isinstance(count, int) and count > 0:
|
396
396
|
parts.append(f"{count} 个角色")
|
397
397
|
if isinstance(details_val, str) and details_val:
|
@@ -442,7 +442,7 @@ def handle_builtin_config_selector(
|
|
442
442
|
if choice_index != -1:
|
443
443
|
try:
|
444
444
|
sel = options[choice_index]
|
445
|
-
args:
|
445
|
+
args: List[str] = []
|
446
446
|
|
447
447
|
if sel["category"] == "agent":
|
448
448
|
# jarvis-agent 支持 -f/--config(全局配置)与 -c/--agent-definition
|