jarvis-ai-assistant 0.1.40__py3-none-any.whl → 0.1.42__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.
Files changed (30) hide show
  1. jarvis/__init__.py +1 -1
  2. jarvis/__pycache__/__init__.cpython-313.pyc +0 -0
  3. jarvis/__pycache__/agent.cpython-313.pyc +0 -0
  4. jarvis/__pycache__/main.cpython-313.pyc +0 -0
  5. jarvis/agent.py +2 -2
  6. jarvis/main.py +3 -3
  7. jarvis/models/__init__.py +2 -2
  8. jarvis/models/__pycache__/__init__.cpython-313.pyc +0 -0
  9. jarvis/models/__pycache__/ai8.cpython-313.pyc +0 -0
  10. jarvis/models/__pycache__/base.cpython-313.pyc +0 -0
  11. jarvis/models/__pycache__/kimi.cpython-313.pyc +0 -0
  12. jarvis/models/__pycache__/openai.cpython-313.pyc +0 -0
  13. jarvis/models/__pycache__/oyi.cpython-313.pyc +0 -0
  14. jarvis/models/__pycache__/registry.cpython-313.pyc +0 -0
  15. jarvis/models/ai8.py +4 -6
  16. jarvis/models/base.py +1 -1
  17. jarvis/models/kimi.py +18 -18
  18. jarvis/models/openai.py +7 -7
  19. jarvis/models/oyi.py +5 -5
  20. jarvis/models/registry.py +79 -79
  21. jarvis/tools/__pycache__/generator.cpython-313.pyc +0 -0
  22. jarvis/tools/__pycache__/registry.cpython-313.pyc +0 -0
  23. jarvis/tools/generator.py +2 -2
  24. jarvis/tools/registry.py +1 -1
  25. {jarvis_ai_assistant-0.1.40.dist-info → jarvis_ai_assistant-0.1.42.dist-info}/METADATA +18 -17
  26. {jarvis_ai_assistant-0.1.40.dist-info → jarvis_ai_assistant-0.1.42.dist-info}/RECORD +30 -30
  27. {jarvis_ai_assistant-0.1.40.dist-info → jarvis_ai_assistant-0.1.42.dist-info}/LICENSE +0 -0
  28. {jarvis_ai_assistant-0.1.40.dist-info → jarvis_ai_assistant-0.1.42.dist-info}/WHEEL +0 -0
  29. {jarvis_ai_assistant-0.1.40.dist-info → jarvis_ai_assistant-0.1.42.dist-info}/entry_points.txt +0 -0
  30. {jarvis_ai_assistant-0.1.40.dist-info → jarvis_ai_assistant-0.1.42.dist-info}/top_level.txt +0 -0
jarvis/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """Jarvis AI Assistant"""
2
2
 
3
- __version__ = "0.1.40"
3
+ __version__ = "0.1.42"
Binary file
Binary file
Binary file
jarvis/agent.py CHANGED
@@ -3,7 +3,7 @@ from typing import Dict, List, Optional
3
3
 
4
4
  import yaml
5
5
 
6
- from .models.registry import ModelRegistry
6
+ from .models.registry import PlatformRegistry
7
7
  from .tools import ToolRegistry
8
8
  from .utils import PrettyOutput, OutputType, get_multiline_input, while_success
9
9
  import os
@@ -20,7 +20,7 @@ class Agent:
20
20
  name: Agent名称,默认为"Jarvis"
21
21
  is_sub_agent: 是否为子Agent,默认为False
22
22
  """
23
- self.model = ModelRegistry.get_global_model()
23
+ self.model = PlatformRegistry.get_platform()
24
24
  self.tool_registry = ToolRegistry.get_global_tool_registry()
25
25
  self.name = name
26
26
  self.is_sub_agent = is_sub_agent
jarvis/main.py CHANGED
@@ -8,7 +8,7 @@ import sys
8
8
  from pathlib import Path
9
9
  from prompt_toolkit import prompt
10
10
 
11
- from jarvis.models.registry import ModelRegistry
11
+ from jarvis.models.registry import PlatformRegistry
12
12
 
13
13
  # 添加父目录到Python路径以支持导入
14
14
  sys.path.insert(0, str(Path(__file__).parent.parent))
@@ -114,14 +114,14 @@ def main():
114
114
  PrettyOutput.print("未指定AI平台,请使用 -p 参数或者设置 JARVIS_PLATFORM 环境变量", OutputType.ERROR)
115
115
  return 1
116
116
 
117
- ModelRegistry.get_model_registry().set_global_model(platform)
117
+ PlatformRegistry.get_platform_registry().set_global_platform(platform)
118
118
 
119
119
  try:
120
120
  # 获取全局模型实例
121
121
  agent = Agent()
122
122
 
123
123
  # 欢迎信息
124
- PrettyOutput.print(f"Jarvis 已初始化 - With {platform} 平台", OutputType.SYSTEM)
124
+ PrettyOutput.print(f"Jarvis 已初始化 - With {platform} 平台,模型: {agent.model.name()}", OutputType.SYSTEM)
125
125
  if args.keep_history:
126
126
  PrettyOutput.print("已启用历史保留模式", OutputType.INFO)
127
127
 
jarvis/models/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
- from .base import BaseModel
1
+ from .base import BasePlatform
2
2
 
3
- __all__ = ['BaseModel']
3
+ __all__ = ['BasePlatform']
jarvis/models/ai8.py CHANGED
@@ -1,15 +1,15 @@
1
1
  import os
2
2
  from typing import Dict, List
3
- from jarvis.models.base import BaseModel
3
+ from jarvis.models.base import BasePlatform
4
4
  from jarvis.utils import PrettyOutput, OutputType
5
5
  import requests
6
6
  import json
7
7
  import base64
8
8
 
9
- class AI8Model(BaseModel):
9
+ class AI8Model(BasePlatform):
10
10
  """AI8 model implementation"""
11
11
 
12
- model_name = "ai8"
12
+ platform_name = "ai8"
13
13
  BASE_URL = "https://ai8.rcouyi.com"
14
14
 
15
15
  def __init__(self):
@@ -53,8 +53,6 @@ class AI8Model(BaseModel):
53
53
  PrettyOutput.print("Baichuan4-Air", OutputType.INFO)
54
54
  PrettyOutput.print("Baichuan4-Turbo", OutputType.INFO)
55
55
  PrettyOutput.print("moonshot-v1-8k", OutputType.INFO)
56
- PrettyOutput.print("moonshot-v1-32k", OutputType.INFO)
57
- PrettyOutput.print("moonshot-v1-128k", OutputType.INFO)
58
56
  PrettyOutput.print("ERNIE-Speed-128K", OutputType.INFO)
59
57
  PrettyOutput.print("ERNIE-3.5-128K", OutputType.INFO)
60
58
 
@@ -230,7 +228,7 @@ class AI8Model(BaseModel):
230
228
 
231
229
  def name(self) -> str:
232
230
  """Return model name"""
233
- return self.model_name
231
+ return self.model
234
232
 
235
233
  def reset(self):
236
234
  """Reset model state"""
jarvis/models/base.py CHANGED
@@ -3,7 +3,7 @@ from typing import Dict, List
3
3
  from ..utils import OutputType, PrettyOutput
4
4
 
5
5
 
6
- class BaseModel(ABC):
6
+ class BasePlatform(ABC):
7
7
  """大语言模型基类"""
8
8
 
9
9
  def __init__(self):
jarvis/models/kimi.py CHANGED
@@ -4,14 +4,14 @@ import json
4
4
  import os
5
5
  import mimetypes
6
6
  import time
7
- from jarvis.models.base import BaseModel
7
+ from jarvis.models.base import BasePlatform
8
8
  from jarvis.utils import PrettyOutput, OutputType
9
9
  from jarvis.utils import while_success
10
10
 
11
- class KimiModel(BaseModel):
11
+ class KimiModel(BasePlatform):
12
12
  """Kimi模型实现"""
13
13
 
14
- model_name = "kimi"
14
+ platform_name = "kimi"
15
15
 
16
16
  def __init__(self):
17
17
  """
@@ -19,21 +19,21 @@ class KimiModel(BaseModel):
19
19
  """
20
20
  self.api_key = os.getenv("KIMI_API_KEY")
21
21
  if not self.api_key:
22
- PrettyOutput.info("\n需要设置 KIMI_API_KEY 才能使用 Jarvis。请按以下步骤操作:")
23
- PrettyOutput.info("\n1. 获取 Kimi API Key:")
24
- PrettyOutput.info(" • 访问 Kimi AI 平台: https://kimi.moonshot.cn")
25
- PrettyOutput.info(" • 登录您的账号")
26
- PrettyOutput.info(" • 打开浏览器开发者工具 (F12 或右键 -> 检查)")
27
- PrettyOutput.info(" • 切换到 Network 标签页")
28
- PrettyOutput.info(" • 发送任意消息")
29
- PrettyOutput.info(" • 在请求中找到 Authorization 头部")
30
- PrettyOutput.info(" • 复制 token 值(去掉 'Bearer ' 前缀)")
31
- PrettyOutput.info("\n2. 设置环境变量:")
32
- PrettyOutput.info(" 方法 1: 创建或编辑 ~/.jarvis_env 文件:")
33
- PrettyOutput.info(" echo 'KIMI_API_KEY=your_key_here' > ~/.jarvis_env")
34
- PrettyOutput.info("\n 方法 2: 直接设置环境变量:")
35
- PrettyOutput.info(" export KIMI_API_KEY=your_key_here")
36
- PrettyOutput.info("\n设置完成后重新运行 Jarvis。")
22
+ PrettyOutput.print("\n需要设置 KIMI_API_KEY 才能使用 Jarvis。请按以下步骤操作:", OutputType.INFO)
23
+ PrettyOutput.print("\n1. 获取 Kimi API Key:", OutputType.INFO)
24
+ PrettyOutput.print(" • 访问 Kimi AI 平台: https://kimi.moonshot.cn", OutputType.INFO)
25
+ PrettyOutput.print(" • 登录您的账号", OutputType.INFO)
26
+ PrettyOutput.print(" • 打开浏览器开发者工具 (F12 或右键 -> 检查)", OutputType.INFO)
27
+ PrettyOutput.print(" • 切换到 Network 标签页", OutputType.INFO)
28
+ PrettyOutput.print(" • 发送任意消息", OutputType.INFO)
29
+ PrettyOutput.print(" • 在请求中找到 Authorization 头部", OutputType.INFO)
30
+ PrettyOutput.print(" • 复制 token 值(去掉 'Bearer ' 前缀)", OutputType.INFO)
31
+ PrettyOutput.print("\n2. 设置环境变量:", OutputType.INFO)
32
+ PrettyOutput.print(" 方法 1: 创建或编辑 ~/.jarvis_env 文件:", OutputType.INFO)
33
+ PrettyOutput.print(" echo 'KIMI_API_KEY=your_key_here' > ~/.jarvis_env", OutputType.INFO)
34
+ PrettyOutput.print("\n 方法 2: 直接设置环境变量:", OutputType.INFO)
35
+ PrettyOutput.print(" export KIMI_API_KEY=your_key_here", OutputType.INFO)
36
+ PrettyOutput.print("\n设置完成后重新运行 Jarvis。", OutputType.INFO)
37
37
  raise Exception("KIMI_API_KEY is not set")
38
38
  self.auth_header = f"Bearer {self.api_key}"
39
39
  self.chat_id = ""
jarvis/models/openai.py CHANGED
@@ -1,13 +1,13 @@
1
1
  from typing import Dict, List
2
2
  import os
3
3
  from openai import OpenAI
4
- from jarvis.models.base import BaseModel
4
+ from jarvis.models.base import BasePlatform
5
5
  from jarvis.utils import PrettyOutput, OutputType
6
6
 
7
- class OpenAIModel(BaseModel):
7
+ class OpenAIModel(BasePlatform):
8
8
  """DeepSeek模型实现"""
9
9
 
10
- model_name = "openai"
10
+ platform_name = "openai"
11
11
 
12
12
  def __init__(self):
13
13
  """
@@ -30,9 +30,9 @@ class OpenAIModel(BaseModel):
30
30
  raise Exception("OPENAI_API_KEY is not set")
31
31
 
32
32
  self.base_url = os.getenv("OPENAI_API_BASE", "https://api.deepseek.com")
33
- self.model_name = os.getenv("OPENAI_MODEL_NAME", "deepseek-chat")
33
+ self.model = os.getenv("OPENAI_MODEL_NAME", "deepseek-chat")
34
34
 
35
- PrettyOutput.print(f"当前使用模型: {self.model_name}", OutputType.SYSTEM)
35
+ PrettyOutput.print(f"当前使用模型: {self.model}", OutputType.SYSTEM)
36
36
 
37
37
  self.client = OpenAI(
38
38
  api_key=self.api_key,
@@ -55,7 +55,7 @@ class OpenAIModel(BaseModel):
55
55
  self.messages.append({"role": "user", "content": message})
56
56
 
57
57
  response = self.client.chat.completions.create(
58
- model=self.model_name, # 使用配置的模型名称
58
+ model=self.model, # 使用配置的模型名称
59
59
  messages=self.messages,
60
60
  stream=True
61
61
  )
@@ -82,7 +82,7 @@ class OpenAIModel(BaseModel):
82
82
 
83
83
  def name(self) -> str:
84
84
  """返回模型名称"""
85
- return self.model_name
85
+ return self.model
86
86
 
87
87
  def reset(self):
88
88
  """重置模型状态"""
jarvis/models/oyi.py CHANGED
@@ -1,15 +1,15 @@
1
1
  import mimetypes
2
2
  import os
3
3
  from typing import Dict, List
4
- from jarvis.models.base import BaseModel
4
+ from jarvis.models.base import BasePlatform
5
5
  from jarvis.utils import PrettyOutput, OutputType
6
6
  import requests
7
7
  import json
8
8
 
9
- class OyiModel(BaseModel):
9
+ class OyiModel(BasePlatform):
10
10
  """Oyi model implementation"""
11
11
 
12
- model_name = "oyi"
12
+ platform_name = "oyi"
13
13
  BASE_URL = "https://api-10086.rcouyi.com"
14
14
 
15
15
  def __init__(self):
@@ -71,7 +71,7 @@ class OyiModel(BaseModel):
71
71
  "isLock": False,
72
72
  "systemMessage": "",
73
73
  "params": json.dumps({
74
- "model": "gpt-4o-mini",
74
+ "model": self.model,
75
75
  "is_webSearch": True,
76
76
  "message": [],
77
77
  "systemMessage": None,
@@ -202,7 +202,7 @@ class OyiModel(BaseModel):
202
202
 
203
203
  def name(self) -> str:
204
204
  """Return model name"""
205
- return self.model_name
205
+ return self.model
206
206
 
207
207
  def reset(self):
208
208
  """Reset model state"""
jarvis/models/registry.py CHANGED
@@ -3,7 +3,7 @@ import inspect
3
3
  import os
4
4
  import sys
5
5
  from typing import Dict, Type, Optional, List
6
- from .base import BaseModel
6
+ from .base import BasePlatform
7
7
  from ..utils import PrettyOutput, OutputType
8
8
 
9
9
  REQUIRED_METHODS = [
@@ -14,33 +14,33 @@ REQUIRED_METHODS = [
14
14
  ('set_system_message', ['message'])
15
15
  ]
16
16
 
17
- class ModelRegistry:
18
- """模型注册器"""
17
+ class PlatformRegistry:
18
+ """平台注册器"""
19
19
 
20
- global_model_name = "kimi"
21
- global_model_registry = None
20
+ global_platform_name = "kimi"
21
+ global_platform_registry = None
22
22
 
23
23
  @staticmethod
24
- def get_models_dir() -> str:
25
- user_models_dir = os.path.expanduser("~/.jarvis_models")
26
- if not os.path.exists(user_models_dir):
24
+ def get_platform_dir() -> str:
25
+ user_platform_dir = os.path.expanduser("~/.jarvis_models")
26
+ if not os.path.exists(user_platform_dir):
27
27
  try:
28
- os.makedirs(user_models_dir)
28
+ os.makedirs(user_platform_dir)
29
29
  # 创建 __init__.py 使其成为 Python 包
30
- with open(os.path.join(user_models_dir, "__init__.py"), "w") as f:
30
+ with open(os.path.join(user_platform_dir, "__init__.py"), "w") as f:
31
31
  pass
32
- PrettyOutput.print(f"已创建模型目录: {user_models_dir}", OutputType.INFO)
32
+ PrettyOutput.print(f"已创建平台目录: {user_platform_dir}", OutputType.INFO)
33
33
  except Exception as e:
34
- PrettyOutput.print(f"创建模型目录失败: {str(e)}", OutputType.ERROR)
34
+ PrettyOutput.print(f"创建平台目录失败: {str(e)}", OutputType.ERROR)
35
35
  return ""
36
- return user_models_dir
36
+ return user_platform_dir
37
37
 
38
38
  @staticmethod
39
- def check_model_implementation(model_class: Type[BaseModel]) -> bool:
40
- """检查模型类是否实现了所有必要的方法
39
+ def check_platform_implementation(platform_class: Type[BasePlatform]) -> bool:
40
+ """检查平台类是否实现了所有必要的方法
41
41
 
42
42
  Args:
43
- model_class: 要检查的模型类
43
+ platform_class: 要检查的平台类
44
44
 
45
45
  Returns:
46
46
  bool: 是否实现了所有必要的方法
@@ -48,11 +48,11 @@ class ModelRegistry:
48
48
  missing_methods = []
49
49
 
50
50
  for method_name, params in REQUIRED_METHODS:
51
- if not hasattr(model_class, method_name):
51
+ if not hasattr(platform_class, method_name):
52
52
  missing_methods.append(method_name)
53
53
  continue
54
54
 
55
- method = getattr(model_class, method_name)
55
+ method = getattr(platform_class, method_name)
56
56
  if not callable(method):
57
57
  missing_methods.append(method_name)
58
58
  continue
@@ -66,7 +66,7 @@ class ModelRegistry:
66
66
 
67
67
  if missing_methods:
68
68
  PrettyOutput.print(
69
- f"模型 {model_class.__name__} 缺少必要的方法: {', '.join(missing_methods)}",
69
+ f"平台 {platform_class.__name__} 缺少必要的方法: {', '.join(missing_methods)}",
70
70
  OutputType.ERROR
71
71
  )
72
72
  return False
@@ -74,21 +74,21 @@ class ModelRegistry:
74
74
  return True
75
75
 
76
76
  @staticmethod
77
- def load_models_from_dir(directory: str) -> Dict[str, Type[BaseModel]]:
78
- """从指定目录加载模型
77
+ def load_platform_from_dir(directory: str) -> Dict[str, Type[BasePlatform]]:
78
+ """从指定目录加载平台
79
79
 
80
80
  Args:
81
- directory: 模型目录路径
81
+ directory: 平台目录路径
82
82
 
83
83
  Returns:
84
- Dict[str, Type[BaseModel]]: 模型名称到模型类的映射
84
+ Dict[str, Type[BaseModel]]: 平台名称到平台类的映射
85
85
  """
86
- models = {}
86
+ platforms = {}
87
87
 
88
88
  # 确保目录存在
89
89
  if not os.path.exists(directory):
90
- PrettyOutput.print(f"模型目录不存在: {directory}", OutputType.ERROR)
91
- return models
90
+ PrettyOutput.print(f"平台目录不存在: {directory}", OutputType.ERROR)
91
+ return platforms
92
92
 
93
93
  # 获取目录的包名
94
94
  package_name = None
@@ -114,86 +114,86 @@ class ModelRegistry:
114
114
  for name, obj in inspect.getmembers(module):
115
115
  # 检查是否是BaseModel的子类,但不是BaseModel本身
116
116
  if (inspect.isclass(obj) and
117
- issubclass(obj, BaseModel) and
118
- obj != BaseModel and
119
- hasattr(obj, 'model_name')):
120
- # 检查模型实现
121
- if not ModelRegistry.check_model_implementation(obj):
117
+ issubclass(obj, BasePlatform) and
118
+ obj != BasePlatform and
119
+ hasattr(obj, 'platform_name')):
120
+ # 检查平台实现
121
+ if not PlatformRegistry.check_platform_implementation(obj):
122
122
  continue
123
- models[obj.model_name] = obj
124
- PrettyOutput.print(f"从 {directory} 加载模型: {obj.model_name}", OutputType.INFO)
123
+ platforms[obj.platform_name] = obj
124
+ PrettyOutput.print(f"从 {directory} 加载平台: {obj.platform_name}", OutputType.INFO)
125
125
  break
126
126
  except Exception as e:
127
- PrettyOutput.print(f"加载模型 {module_name} 失败: {str(e)}", OutputType.ERROR)
127
+ PrettyOutput.print(f"加载平台 {module_name} 失败: {str(e)}", OutputType.ERROR)
128
128
 
129
- return models
129
+ return platforms
130
130
 
131
131
 
132
132
  @staticmethod
133
- def get_model_registry():
134
- """获取全局模型注册器"""
135
- if ModelRegistry.global_model_registry is None:
136
- ModelRegistry.global_model_registry = ModelRegistry()
133
+ def get_platform_registry():
134
+ """获取全局平台注册器"""
135
+ if PlatformRegistry.global_platform_registry is None:
136
+ PlatformRegistry.global_platform_registry = PlatformRegistry()
137
137
 
138
- # 从用户模型目录加载额外模型
139
- models_dir = ModelRegistry.get_models_dir()
140
- if models_dir and os.path.exists(models_dir):
141
- for model_name, model_class in ModelRegistry.load_models_from_dir(models_dir).items():
142
- ModelRegistry.global_model_registry.register_model(model_name, model_class)
143
- models_dir = os.path.dirname(__file__)
144
- if models_dir and os.path.exists(models_dir):
145
- for model_name, model_class in ModelRegistry.load_models_from_dir(models_dir).items():
146
- ModelRegistry.global_model_registry.register_model(model_name, model_class)
147
- return ModelRegistry.global_model_registry
138
+ # 从用户平台目录加载额外平台
139
+ platform_dir = PlatformRegistry.get_platform_dir()
140
+ if platform_dir and os.path.exists(platform_dir):
141
+ for platform_name, platform_class in PlatformRegistry.load_platform_from_dir(platform_dir).items():
142
+ PlatformRegistry.global_platform_registry.register_platform(platform_name, platform_class)
143
+ platform_dir = os.path.dirname(__file__)
144
+ if platform_dir and os.path.exists(platform_dir):
145
+ for platform_name, platform_class in PlatformRegistry.load_platform_from_dir(platform_dir).items():
146
+ PlatformRegistry.global_platform_registry.register_platform(platform_name, platform_class)
147
+ return PlatformRegistry.global_platform_registry
148
148
 
149
149
  def __init__(self):
150
- """初始化模型注册器
150
+ """初始化平台注册器
151
151
  """
152
- self.models: Dict[str, Type[BaseModel]] = {}
152
+ self.platforms: Dict[str, Type[BasePlatform]] = {}
153
153
 
154
154
  @staticmethod
155
- def get_global_model() -> BaseModel:
156
- """获取全局模型实例"""
157
- model = ModelRegistry.get_model_registry().create_model(ModelRegistry.global_model_name)
158
- if not model:
159
- raise Exception(f"Failed to create model: {ModelRegistry.global_model_name}")
160
- return model
155
+ def get_platform() -> BasePlatform:
156
+ """获取全局平台实例"""
157
+ platform = PlatformRegistry.get_platform_registry().create_platform(PlatformRegistry.global_platform_name)
158
+ if not platform:
159
+ raise Exception(f"Failed to create platform: {PlatformRegistry.global_platform_name}")
160
+ return platform
161
161
 
162
- def register_model(self, name: str, model_class: Type[BaseModel]):
163
- """注册模型类
162
+ def register_platform(self, name: str, platform_class: Type[BasePlatform]):
163
+ """注册平台类
164
164
 
165
165
  Args:
166
- name: 模型名称
167
- model_class: 模型类
166
+ name: 平台名称
167
+ model_class: 平台类
168
168
  """
169
- self.models[name] = model_class
170
- PrettyOutput.print(f"已注册模型: {name}", OutputType.INFO)
169
+ self.platforms[name] = platform_class
170
+ PrettyOutput.print(f"已注册平台: {name}", OutputType.INFO)
171
171
 
172
- def create_model(self, name: str) -> Optional[BaseModel]:
173
- """创建模型实例
172
+ def create_platform(self, name: str) -> Optional[BasePlatform]:
173
+ """创建平台实例
174
174
 
175
175
  Args:
176
- name: 模型名称
176
+ name: 平台名称
177
177
 
178
178
  Returns:
179
- BaseModel: 模型实例
179
+ BaseModel: 平台实例
180
180
  """
181
- if name not in self.models:
182
- PrettyOutput.print(f"未找到模型: {name}", OutputType.ERROR)
181
+ if name not in self.platforms:
182
+ PrettyOutput.print(f"未找到平台: {name}", OutputType.ERROR)
183
183
  return None
184
184
 
185
185
  try:
186
- model = self.models[name]()
187
- PrettyOutput.print(f"已创建模型实例: {name}", OutputType.INFO)
188
- return model
186
+ platform = self.platforms[name]()
187
+ PrettyOutput.print(f"已创建平台实例: {name}", OutputType.INFO)
188
+ return platform
189
189
  except Exception as e:
190
- PrettyOutput.print(f"创建模型失败: {str(e)}", OutputType.ERROR)
190
+ PrettyOutput.print(f"创建平台失败: {str(e)}", OutputType.ERROR)
191
191
  return None
192
192
 
193
- def get_available_models(self) -> List[str]:
194
- """获取可用模型列表"""
195
- return list(self.models.keys())
193
+ def get_available_platforms(self) -> List[str]:
194
+ """获取可用平台列表"""
195
+ return list(self.platforms.keys())
196
196
 
197
- def set_global_model(self, model_name: str):
198
- """设置全局模型"""
199
- ModelRegistry.global_model_name = model_name
197
+ def set_global_platform(self, platform_name: str):
198
+ """设置全局平台"""
199
+ PlatformRegistry.global_platform_name = platform_name
jarvis/tools/generator.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from typing import Dict, Any
2
2
  from pathlib import Path
3
- from jarvis.models.registry import ModelRegistry
3
+ from jarvis.models.registry import PlatformRegistry
4
4
  from jarvis.tools.registry import ToolRegistry
5
5
  from jarvis.utils import OutputType, PrettyOutput
6
6
 
@@ -41,7 +41,7 @@ class ToolGeneratorTool:
41
41
 
42
42
  def _generate_tool_code(self, tool_name: str, class_name: str, description: str, parameters: Dict) -> str:
43
43
  """使用大模型生成工具代码"""
44
- model = ModelRegistry.get_global_model()
44
+ model = PlatformRegistry.get_platform()
45
45
 
46
46
  prompt = f"""请生成一个Python工具类的代码,要求如下,除了代码,不要输出任何内容:
47
47
 
jarvis/tools/registry.py CHANGED
@@ -5,7 +5,7 @@ from pathlib import Path
5
5
  import sys
6
6
  from typing import Any, Callable, Dict, List, Optional
7
7
 
8
- from jarvis.models.registry import ModelRegistry
8
+ from jarvis.models.registry import PlatformRegistry
9
9
  from jarvis.tools.base import Tool
10
10
  from jarvis.utils import OutputType, PrettyOutput
11
11
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.40
3
+ Version: 0.1.42
4
4
  Summary: Jarvis: An AI assistant that uses tools to interact with the system
5
5
  Home-page: https://github.com/skyfireitdiy/Jarvis
6
6
  Author: skyfire
@@ -134,8 +134,8 @@ jarvis
134
134
 
135
135
  ### With Specific Model
136
136
  ```bash
137
- jarvis -m kimi # Use Kimi model
138
- jarvis -m openai # Use OpenAI model
137
+ jarvis -p kimi # Use Kimi platform
138
+ jarvis -p openai # Use OpenAI platform
139
139
  ```
140
140
 
141
141
  ### Process Files
@@ -154,10 +154,11 @@ jarvis --keep-history # Don't delete chat session after completion
154
154
 
155
155
  | Tool | Description |
156
156
  |------|-------------|
157
- | shell | Execute shell commands |
158
- | file | File operations (read/write/append) |
159
- | git | Git operations |
160
- | methodology | Manage problem-solving methodologies |
157
+ | execute_shell | Execute system commands and capture output |
158
+ | file_operation | File operations (read/write/append/delete) |
159
+ | generate_tool | AI-powered tool generation and integration |
160
+ | methodology | Experience accumulation and methodology management |
161
+ | create_sub_agent | Create specialized sub-agents for specific tasks |
161
162
 
162
163
  ### Tool Locations
163
164
  - Built-in tools: `src/jarvis/tools/`
@@ -166,21 +167,21 @@ jarvis --keep-history # Don't delete chat session after completion
166
167
  ### Key Features
167
168
 
168
169
  #### 1. Self-Extending Capabilities
169
- - AI-powered tool generation
170
- - Automatic integration of new tools
171
- - Dynamic capability expansion
170
+ - Tool generation through natural language description
171
+ - Automatic code generation and integration
172
+ - Dynamic capability expansion through sub-agents
172
173
 
173
174
  #### 2. Methodology Learning
174
- - Automatic extraction of problem-solving patterns
175
- - Continuous methodology refinement
176
- - Experience-based improvement
175
+ - Automatic experience accumulation from interactions
176
+ - Pattern recognition and methodology extraction
177
+ - Continuous refinement through usage
177
178
 
178
179
  #### 3. Adaptive Problem Solving
179
- - Context-aware tool selection
180
- - Dynamic strategy adjustment
181
- - Learning from execution results
180
+ - Context-aware sub-agent creation
181
+ - Dynamic tool composition
182
+ - Learning from execution feedback
182
183
 
183
- ## �� Extending Jarvis
184
+ ## 🎯 Extending Jarvis
184
185
 
185
186
  ### Adding New Tools
186
187
 
@@ -1,34 +1,34 @@
1
- jarvis/__init__.py,sha256=Y6MG3CqZheUZ8yRU5r9F9h_KOV2yThbCmvN9D5UDxl0,50
2
- jarvis/agent.py,sha256=i_tETgROksmPp95RYnwb7m-ERl0Ob1OEybXXcXJUpPk,12213
3
- jarvis/main.py,sha256=1nSBhQMnxhhOgUxhqvmHl21GygVsdcisr4FmA4GT_ro,5788
1
+ jarvis/__init__.py,sha256=reJZgg3xnrq70dlR2vezFlcaoE7Jp3x5XPYaNTXTUcU,50
2
+ jarvis/agent.py,sha256=X9-vfGsEVAgJ5EoS7cctfvfNxQyan3OFRdReKlHc-ro,12215
3
+ jarvis/main.py,sha256=69HjqIUf1SNXNnrWQffN3XAnAAgiNpTNwbOZolNRHdQ,5831
4
4
  jarvis/utils.py,sha256=JlkuC9RtspXH2VWDmj9nR0vnb8ie1gIsKc4vC7WRco8,7321
5
- jarvis/__pycache__/__init__.cpython-313.pyc,sha256=KYUlFHOQKHStj5RTFhULb-Gq_xIlFshqR71ptW5G73A,209
6
- jarvis/__pycache__/agent.cpython-313.pyc,sha256=OfeSUMB3KcaFXrCiYENrFVcdfRyxBNQks3OtVb8PXO4,15864
7
- jarvis/__pycache__/main.cpython-313.pyc,sha256=4VC3x5E6YDLXPbm9iStQha3Ez-hcSsfujcHu6J3I3sg,8014
5
+ jarvis/__pycache__/__init__.cpython-313.pyc,sha256=mXb2FNtTXbPBTp5kdbV41lHYlIU96mTuLqD1p7PYMaU,209
6
+ jarvis/__pycache__/agent.cpython-313.pyc,sha256=bG6QMODz8G5hxIxKusjQFXS5JZGAWJYqhHmUjsB2jro,15863
7
+ jarvis/__pycache__/main.cpython-313.pyc,sha256=PCIqdoAHPetp3Enxqgpeo9AjOX8ViWi2Al3oiBRhqL0,8121
8
8
  jarvis/__pycache__/models.cpython-313.pyc,sha256=uWuRIjGrY4YDB3dGW5PGDLWaS03et8g11O725TjY_eU,5960
9
9
  jarvis/__pycache__/tools.cpython-313.pyc,sha256=lAD4LrnnWzNZQmHXGfZ_2l7oskOpr2_2OC-gdFhxQY8,33933
10
10
  jarvis/__pycache__/utils.cpython-313.pyc,sha256=eXXM-V-2ax7qBNxktdUrEIwhAXPQHAlI7gLGewlKOj4,10276
11
11
  jarvis/__pycache__/zte_llm.cpython-313.pyc,sha256=kMm9IGundGmOPqjsgrm9oIaWLDagYGCPRAaE3ipkc-0,5662
12
- jarvis/models/__init__.py,sha256=Lqb1NWFIfq7HlZIsJ7eUGyGjdYyaJqOoOf7cG_yo73A,57
13
- jarvis/models/ai8.py,sha256=NARhMCuH6yagDSwBT15jD-CDLoxXV8anIT-nSAIWOgw,11589
14
- jarvis/models/base.py,sha256=dNkYPg9ISrHGEpmQLN9kxCDU-kqJAJlm_owdDC302Dk,1132
15
- jarvis/models/kimi.py,sha256=iI8mBzUxiyxa_bzDG9uwE3BZtreEUt0EJOIP_l2rSDM,16788
16
- jarvis/models/openai.py,sha256=zuSUFuz14m8LTeREax7M4MJn6LTUWFDmL1aIxMXkeo4,4029
17
- jarvis/models/oyi.py,sha256=wS-anyFcjOoh9qL_nNUnc9VHabU0JSEjkvTx_vZMqA4,12314
18
- jarvis/models/registry.py,sha256=ecIo3a0G-pRPw4eg77ozzbGVh6vy93DHF8oAnU2g51w,7511
19
- jarvis/models/__pycache__/__init__.cpython-313.pyc,sha256=hD4Uui0EPCTfoPOasTYzIi46Kv_q7OI8m-Lck-nX4zM,220
20
- jarvis/models/__pycache__/ai8.cpython-313.pyc,sha256=5wnVTypQkoQdsFgGEWT4Y9vi6478SDZh_aFQj9YPDhE,14988
21
- jarvis/models/__pycache__/base.cpython-313.pyc,sha256=9VvOXFPYOrB-2pO2py7dWOVbimODnXQJFLlFbyF7-LI,2207
22
- jarvis/models/__pycache__/kimi.cpython-313.pyc,sha256=FGtHoTv747oNY4Lqnwf5BkGYKnevHOlIEDIlbsY7va0,20893
23
- jarvis/models/__pycache__/openai.cpython-313.pyc,sha256=-lrI-6uao5D-lFI6vwErr2KlGVBKII22SVbLg5eQ-I8,6173
24
- jarvis/models/__pycache__/oyi.cpython-313.pyc,sha256=_VIFzihUJa8Ihy9aRKb-sSWLUdCAt7xvj2IIzZTkQnY,14208
25
- jarvis/models/__pycache__/registry.cpython-313.pyc,sha256=jUZUyHyfzeQtjCdk2NCZGTsTUsvKyIlnZVDzZY1gLuU,9985
12
+ jarvis/models/__init__.py,sha256=mrOt67nselz_H1gX9wdAO4y2DY5WPXzABqJbr5Des8k,63
13
+ jarvis/models/ai8.py,sha256=OVBsRuxtttpkGHWe4N1lXoOqDcUMtvyHAxKSN7DzMxI,11466
14
+ jarvis/models/base.py,sha256=kLeT1ajmyMRTAtYDa_XDhS319BapQTmm0cfXzda2AxQ,1135
15
+ jarvis/models/kimi.py,sha256=IsX0d5DcdpUFbXBQi6K-V5SYD8UdPykh_WXDxYbxOJw,17067
16
+ jarvis/models/openai.py,sha256=M5WKBFCfKXGUYGyvK03NIcslHl9H7eKd-sd_R9bnGqw,4018
17
+ jarvis/models/oyi.py,sha256=jTwtrnPF2_vMVBsxdtw7tjWqJWfB1r7rSwfzl2oZj6A,12315
18
+ jarvis/models/registry.py,sha256=imV-P-i8NgPSHFbAwp0ERRNg8b1D8aF2yy-CS5uFDuU,7785
19
+ jarvis/models/__pycache__/__init__.cpython-313.pyc,sha256=b9Z3owWpzLnKKwqQH6bWHZJZDeThHGD9Oa7TMCpyHwc,224
20
+ jarvis/models/__pycache__/ai8.cpython-313.pyc,sha256=0pQRw9zxJtEISdOU62LucLUFYgq6aOCmHtutcQnz9cU,14769
21
+ jarvis/models/__pycache__/base.cpython-313.pyc,sha256=7FnbUVRV2M9JTUYBk0VaCEkBTuc6ykWbB6MgCxIYTH4,2231
22
+ jarvis/models/__pycache__/kimi.cpython-313.pyc,sha256=r1kKcog7gGtnOQ_XbZ3cEvE-zeRF9Shpq5a-B-ntYSc,21473
23
+ jarvis/models/__pycache__/openai.cpython-313.pyc,sha256=EkUONtkFt5gytqondwWrtAeCruEoSNytVRtT1zG-DBU,6178
24
+ jarvis/models/__pycache__/oyi.cpython-313.pyc,sha256=LKcD5gx8TTY0CXYzMeMSYHJH6CuLb4UcjzRo0rMbvbg,14238
25
+ jarvis/models/__pycache__/registry.cpython-313.pyc,sha256=ID2xq5EO2ZbZTvNKi4sqkLXpgxO7xTzfgTdo2GsLLes,10106
26
26
  jarvis/tools/__init__.py,sha256=Kj1bKj34lwRDKMKHLOrLyQElf2lHbqA2tDgP359eaDo,71
27
27
  jarvis/tools/base.py,sha256=EGRGbdfbLXDLwtyoWdvp9rlxNX7bzc20t0Vc2VkwIEY,652
28
28
  jarvis/tools/file_ops.py,sha256=h8g0eT9UvlJf4kt0DLXvdSsjcPj7x19lxWdDApeDfpg,3842
29
- jarvis/tools/generator.py,sha256=qyNdarq5SGEFBjkIlohk13cP5wV9IeQK5qJs7MwGUZg,5740
29
+ jarvis/tools/generator.py,sha256=eboA5wd5NtbnWlpmKZfc-t8c5T6dvzEqsYiiS1v8tIs,5742
30
30
  jarvis/tools/methodology.py,sha256=G3cOaHTMujGZBhDLhQEqyCV2NISizO3MXRuho1KfI6Y,5223
31
- jarvis/tools/registry.py,sha256=_M18bNfcn39razBo47IXtxUnT625oQIrkKx45qq2Ims,7180
31
+ jarvis/tools/registry.py,sha256=NbH7A4A2lyN2IoyZGFwa5Ghed2dpzbJWCAd1Dg95WBI,7183
32
32
  jarvis/tools/shell.py,sha256=UPKshPyOaUwTngresUw-ot1jHjQIb4wCY5nkJqa38lU,2520
33
33
  jarvis/tools/sub_agent.py,sha256=rEtAmSVY2ZjFOZEKr5m5wpACOQIiM9Zr_3dT92FhXYU,2621
34
34
  jarvis/tools/__pycache__/__init__.cpython-313.pyc,sha256=2ezw_ULVg9CJCUdX-RXTgYHLxQBs5X7wWJu1GNAN3ro,231
@@ -37,11 +37,11 @@ jarvis/tools/__pycache__/bing_search.cpython-313.pyc,sha256=1G_wPbk5wcQYh7H0drLI
37
37
  jarvis/tools/__pycache__/calculator.cpython-313.pyc,sha256=C_qwTDGm6gc7QNxtPzPZXyStdKEintJVQIt5NMHQ8oY,4205
38
38
  jarvis/tools/__pycache__/calculator_tool.cpython-313.pyc,sha256=PI4LZNDTPdSe3ffWDRovLZ-r-vF8Kl-n6xdGdFWiBpY,4296
39
39
  jarvis/tools/__pycache__/file_ops.cpython-313.pyc,sha256=qfgRIcO7JFsa_FxOOXV-3pNSnlovZDrcIkZ1WN3pOJI,3773
40
- jarvis/tools/__pycache__/generator.cpython-313.pyc,sha256=sSO-y6fREIenF4cvFgaAtd0rAu95Epd5VZpjhmOfPRk,6155
40
+ jarvis/tools/__pycache__/generator.cpython-313.pyc,sha256=6gEf-2nlMX6JLrEpaEPRIcb2daF4FlNAe1k-xlH-sgA,6154
41
41
  jarvis/tools/__pycache__/methodology.cpython-313.pyc,sha256=GWPSF5b0i6gUsgvJgXIkVQHpLRYQ7OzEiTLwe6aAuWU,6226
42
42
  jarvis/tools/__pycache__/python_script.cpython-313.pyc,sha256=8JpryqTovEiTvBlWAK1KjZmPvHUuPc9GT9rTXBEQoJc,6693
43
43
  jarvis/tools/__pycache__/rag.cpython-313.pyc,sha256=JH6-PSZRMKAvTZqCwlRXJGClxYXNMs-vetU0q7hBLz0,6064
44
- jarvis/tools/__pycache__/registry.cpython-313.pyc,sha256=BE91SasFW5pLIGvnaEuy0wMVLowLStK9xwsGXoPTYdw,9344
44
+ jarvis/tools/__pycache__/registry.cpython-313.pyc,sha256=dXrc1wOTipUJELYl681SM7x1ZyhBNLWIF3ldtrx-HS4,9347
45
45
  jarvis/tools/__pycache__/search.cpython-313.pyc,sha256=wLMIkFwT-h4NGHgssytT4xme7sGO6ZhEnex7kjcy0-k,5990
46
46
  jarvis/tools/__pycache__/shell.cpython-313.pyc,sha256=ATt7BraEX6Sd3Ih6etwFpZ8fYczlZn5f0IqdjaqXt6c,3349
47
47
  jarvis/tools/__pycache__/sub_agent.cpython-313.pyc,sha256=ROqk3BEwB_2-ALp6jG3wf18ShUr1lO0bhJjibOn6f3o,2799
@@ -49,9 +49,9 @@ jarvis/tools/__pycache__/user_confirmation.cpython-313.pyc,sha256=wK3Ev10lHSUSRv
49
49
  jarvis/tools/__pycache__/user_input.cpython-313.pyc,sha256=JjTFOhObKsKF4Pn8KBRuKfV1_Ssj083fjU7Mfc_5z7c,2531
50
50
  jarvis/tools/__pycache__/user_interaction.cpython-313.pyc,sha256=RuVZ-pmiPBDywY3efgXSfohMAciC1avMGPmBK5qlnew,3305
51
51
  jarvis/tools/__pycache__/webpage.cpython-313.pyc,sha256=BjzSfnNzsKCrLETCcWjt32lNDLzwnjqcVGg4JfWd9OM,3008
52
- jarvis_ai_assistant-0.1.40.dist-info/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
53
- jarvis_ai_assistant-0.1.40.dist-info/METADATA,sha256=UsLmIEF2Qey-b06_l9enPW79x6uAcG2-Dv5qJ0-O048,9765
54
- jarvis_ai_assistant-0.1.40.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
55
- jarvis_ai_assistant-0.1.40.dist-info/entry_points.txt,sha256=iKu7OMfew9dtfGhW71gIMTg4wvafuPqKb4wyQOnMAGU,44
56
- jarvis_ai_assistant-0.1.40.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
57
- jarvis_ai_assistant-0.1.40.dist-info/RECORD,,
52
+ jarvis_ai_assistant-0.1.42.dist-info/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
53
+ jarvis_ai_assistant-0.1.42.dist-info/METADATA,sha256=qFDHaq08PqwJ8AkhHrP0R_EAwvzHuZtRdqD3g9rxOPk,10015
54
+ jarvis_ai_assistant-0.1.42.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
55
+ jarvis_ai_assistant-0.1.42.dist-info/entry_points.txt,sha256=iKu7OMfew9dtfGhW71gIMTg4wvafuPqKb4wyQOnMAGU,44
56
+ jarvis_ai_assistant-0.1.42.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
57
+ jarvis_ai_assistant-0.1.42.dist-info/RECORD,,