jarvis-ai-assistant 0.1.211__tar.gz → 0.1.212__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.
Files changed (103) hide show
  1. {jarvis_ai_assistant-0.1.211/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.212}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/pyproject.toml +1 -1
  3. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/setup.py +1 -1
  4. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/__init__.py +1 -1
  5. jarvis_ai_assistant-0.1.212/src/jarvis/jarvis_platform/ai8.py +270 -0
  6. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/base.py +3 -0
  7. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/kimi.py +67 -48
  8. jarvis_ai_assistant-0.1.212/src/jarvis/jarvis_platform/oyi.py +314 -0
  9. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform_manager/main.py +31 -23
  10. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/globals.py +31 -0
  11. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/input.py +34 -12
  12. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  13. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +2 -0
  14. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/LICENSE +0 -0
  15. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/MANIFEST.in +0 -0
  16. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/README.md +0 -0
  17. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/setup.cfg +0 -0
  18. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_agent/__init__.py +0 -0
  19. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  20. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_agent/edit_file_handler.py +0 -0
  21. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_agent/jarvis.py +0 -0
  22. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_agent/main.py +0 -0
  23. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  24. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  25. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  26. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_agent/code_agent.py +0 -0
  27. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_agent/lint.py +0 -0
  28. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  29. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  30. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  31. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  32. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  33. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  34. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  35. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  36. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  37. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  38. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  39. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  40. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  41. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  42. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  43. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  44. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  45. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  46. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  47. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  48. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  49. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_data/config_schema.json +0 -0
  50. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  51. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_git_details/__init__.py +0 -0
  52. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_git_details/main.py +0 -0
  53. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  54. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_git_squash/main.py +0 -0
  55. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
  56. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  57. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  58. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  59. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
  60. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_methodology/main.py +0 -0
  61. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  62. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  63. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/__init__.py +0 -0
  64. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/human.py +0 -0
  65. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/openai.py +0 -0
  66. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/registry.py +0 -0
  67. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/tongyi.py +0 -0
  68. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  69. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  70. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform_manager/service.py +0 -0
  71. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  72. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  73. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/__init__.py +0 -0
  74. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  75. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/base.py +0 -0
  76. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  77. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/cli/main.py +0 -0
  78. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/edit_file.py +0 -0
  79. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  80. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  81. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
  82. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/methodology.py +0 -0
  83. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/read_code.py +0 -0
  84. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  85. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/registry.py +0 -0
  86. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  87. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/search_web.py +0 -0
  88. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  89. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/__init__.py +0 -0
  90. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  91. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/config.py +0 -0
  92. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/embedding.py +0 -0
  93. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  94. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  95. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/http.py +0 -0
  96. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/methodology.py +0 -0
  97. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/output.py +0 -0
  98. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/tag.py +0 -0
  99. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/utils.py +0 -0
  100. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  101. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  102. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  103. {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.211
3
+ Version: 0.1.212
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "jarvis-ai-assistant"
7
- version = "0.1.211"
7
+ version = "0.1.212"
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.1.211",
6
+ version="0.1.212",
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",
@@ -1,4 +1,4 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  """Jarvis AI Assistant"""
3
3
 
4
- __version__ = "0.1.211"
4
+ __version__ = "0.1.212"
@@ -0,0 +1,270 @@
1
+ import os
2
+ from typing import Dict, Generator, List, Tuple
3
+ from jarvis.jarvis_platform.base import BasePlatform
4
+ import requests
5
+ import json
6
+ import base64
7
+
8
+ from jarvis.jarvis_utils.output import OutputType, PrettyOutput
9
+
10
+ class AI8Model(BasePlatform):
11
+ """AI8 model implementation"""
12
+
13
+ platform_name = "ai8"
14
+ BASE_URL = "https://ai8.rcouyi.com"
15
+
16
+ def get_model_list(self) -> List[Tuple[str, str]]:
17
+ """获取模型列表"""
18
+ self.get_available_models()
19
+ return [(name,info['desc']) for name,info in self.models.items()]
20
+
21
+ def __init__(self):
22
+ """Initialize model"""
23
+ super().__init__()
24
+ self.system_prompt = ""
25
+ self.conversation = {}
26
+ self.models = {} # 存储模型信息
27
+
28
+ self.token = os.getenv("AI8_API_KEY")
29
+ if not self.token:
30
+ PrettyOutput.print("未设置 AI8_API_KEY", OutputType.WARNING)
31
+
32
+ self.headers = {
33
+ 'Authorization': self.token,
34
+ 'Content-Type': 'application/json',
35
+ 'Accept': 'application/json, text/plain, */*',
36
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
37
+ 'X-APP-VERSION': '2.3.0',
38
+ 'Origin': self.BASE_URL,
39
+ 'Referer': f'{self.BASE_URL}/chat?_userMenuKey=chat',
40
+ 'Sec-Fetch-Site': 'same-origin',
41
+ 'Sec-Fetch-Mode': 'cors',
42
+ 'Sec-Fetch-Dest': 'empty',
43
+ }
44
+
45
+ self.model_name = os.getenv("JARVIS_MODEL") or "deepseek-chat"
46
+ if self.model_name not in self.get_available_models():
47
+ PrettyOutput.print(f"警告: 选择的模型 {self.model_name} 不在可用列表中", OutputType.WARNING)
48
+
49
+
50
+
51
+
52
+ def set_model_name(self, model_name: str):
53
+ """Set model name"""
54
+
55
+ self.model_name = model_name
56
+
57
+ def create_conversation(self) -> bool:
58
+ """Create a new conversation"""
59
+ try:
60
+
61
+
62
+ # 1. 创建会话
63
+ response = requests.post(
64
+ f"{self.BASE_URL}/api/chat/session",
65
+ headers=self.headers,
66
+ json={}
67
+ )
68
+
69
+ if response.status_code != 200:
70
+ PrettyOutput.print(f"创建会话失败: {response.status_code}", OutputType.WARNING)
71
+ return False
72
+
73
+ data = response.json()
74
+ if data['code'] != 0:
75
+ PrettyOutput.print(f"创建会话失败: {data.get('msg', '未知错误')}", OutputType.WARNING)
76
+ return False
77
+
78
+ self.conversation = data['data']
79
+
80
+ # 2. 更新会话设置
81
+ session_data = {
82
+ **self.conversation,
83
+ "model": self.model_name,
84
+ "contextCount": 65536,
85
+ "prompt": self.system_prompt,
86
+ "plugins": [],
87
+ "localPlugins": None,
88
+ "useAppId": 0
89
+ }
90
+
91
+ response = requests.put(
92
+ f"{self.BASE_URL}/api/chat/session/{self.conversation['id']}",
93
+ headers=self.headers,
94
+ json=session_data
95
+ )
96
+
97
+ if response.status_code == 200:
98
+ data = response.json()
99
+ if data['code'] == 0:
100
+ self.conversation = data['data']
101
+ return True
102
+ else:
103
+ PrettyOutput.print(f"更新会话设置失败: {data.get('msg', '未知错误')}", OutputType.WARNING)
104
+ return False
105
+ else:
106
+ PrettyOutput.print(f"更新会话设置失败: {response.status_code}", OutputType.WARNING)
107
+ return False
108
+
109
+ except Exception as e:
110
+ PrettyOutput.print(f"创建会话失败: {str(e)}", OutputType.ERROR)
111
+ return False
112
+
113
+ def set_system_prompt(self, message: str):
114
+ """Set system message"""
115
+ self.system_prompt = message
116
+
117
+ def chat(self, message: str) -> Generator[str, None, None]:
118
+ """Execute conversation"""
119
+ try:
120
+
121
+ # 确保有会话ID
122
+ if not self.conversation:
123
+ if not self.create_conversation():
124
+ raise Exception("Failed to create conversation")
125
+
126
+
127
+
128
+ payload = {
129
+ "text": message,
130
+ "sessionId": self.conversation['id'] if self.conversation else None,
131
+ "files": []
132
+ }
133
+
134
+
135
+ response = requests.post(
136
+ f"{self.BASE_URL}/api/chat/completions",
137
+ headers=self.headers,
138
+ json=payload,
139
+ stream=True
140
+ )
141
+
142
+ if response.status_code != 200:
143
+ error_msg = f"Failed to chat: {response.status_code} {response.text}"
144
+ PrettyOutput.print(error_msg, OutputType.WARNING)
145
+ raise Exception(error_msg)
146
+
147
+ # 处理流式响应
148
+ for line in response.iter_lines():
149
+ if line:
150
+ line = line.decode('utf-8')
151
+ if line.startswith('data: '):
152
+ try:
153
+ data = json.loads(line[6:])
154
+ if data.get('type') == 'string':
155
+ chunk = data.get('data', '')
156
+ if chunk:
157
+ yield chunk
158
+
159
+ except json.JSONDecodeError:
160
+ continue
161
+
162
+ return None
163
+
164
+ except Exception as e:
165
+ PrettyOutput.print(f"对话异常: {str(e)}", OutputType.ERROR)
166
+ raise e
167
+
168
+ def name(self) -> str:
169
+ """Return model name"""
170
+ return self.model_name
171
+
172
+
173
+ def delete_chat(self) -> bool:
174
+ """Delete current chat session"""
175
+ try:
176
+ if not self.conversation:
177
+ return True
178
+
179
+
180
+ response = requests.delete(
181
+ f"{self.BASE_URL}/api/chat/session/{self.conversation['id']}",
182
+ headers=self.headers
183
+ )
184
+
185
+ if response.status_code == 200:
186
+ data = response.json()
187
+ if data['code'] == 0:
188
+ self.conversation = None
189
+ return True
190
+ else:
191
+ error_msg = f"删除会话失败: {data.get('msg', '未知错误')}"
192
+ PrettyOutput.print(error_msg, OutputType.WARNING)
193
+ return False
194
+ else:
195
+ error_msg = f"删除会话请求失败: {response.status_code}"
196
+ PrettyOutput.print(error_msg, OutputType.WARNING)
197
+ return False
198
+
199
+ except Exception as e:
200
+ PrettyOutput.print(f"删除会话失败: {str(e)}", OutputType.ERROR)
201
+ return False
202
+
203
+ def get_available_models(self) -> List[str]:
204
+ """Get available model list
205
+
206
+ Returns:
207
+ List[str]: Available model name list
208
+ """
209
+ try:
210
+ if self.models:
211
+ return list(self.models.keys())
212
+
213
+ response = requests.get(
214
+ f"{self.BASE_URL}/api/chat/tmpl",
215
+ headers=self.headers
216
+ )
217
+
218
+ if response.status_code != 200:
219
+ PrettyOutput.print(f"获取模型列表失败: {response.status_code}", OutputType.WARNING)
220
+ return []
221
+
222
+ data = response.json()
223
+ if data['code'] != 0:
224
+ PrettyOutput.print(f"获取模型列表失败: {data.get('msg', '未知错误')}", OutputType.WARNING)
225
+ return []
226
+
227
+ # 保存模型信息
228
+ self.models = {
229
+ model['value']: model
230
+ for model in data['data']['models']
231
+ }
232
+
233
+ for model in self.models.values():
234
+ # 添加标签
235
+ model_str = f"{model['label']}"
236
+
237
+ # 添加特性标记
238
+ features = []
239
+ if model['attr'].get('multimodal'):
240
+ features.append("Multimodal")
241
+ if model['attr'].get('plugin'):
242
+ features.append("Plugin support")
243
+ if model['attr'].get('onlyImg'):
244
+ features.append("Image support")
245
+ if model['attr'].get('tag'):
246
+ features.append(model['attr']['tag'])
247
+ if model['attr'].get('integral'):
248
+ features.append(model['attr']['integral'])
249
+ # 添加备注
250
+ if model['attr'].get('note'):
251
+ model_str += f" - {model['attr']['note']}"
252
+ if features:
253
+ model_str += f" [{'|'.join(features)}]"
254
+
255
+ model['desc'] = model_str
256
+
257
+ return list(self.models.keys())
258
+
259
+ except Exception as e:
260
+ PrettyOutput.print(f"获取模型列表失败: {str(e)}", OutputType.ERROR)
261
+ return []
262
+
263
+ def support_upload_files(self) -> bool:
264
+ return False
265
+
266
+ def support_web(self) -> bool:
267
+ return False
268
+
269
+ def upload_files(self, file_list: List[str]) -> bool:
270
+ return False
@@ -166,6 +166,9 @@ class BasePlatform(ABC):
166
166
  result: str = while_true(
167
167
  lambda: while_success(lambda: self._chat(message), 5), 5
168
168
  )
169
+ from jarvis.jarvis_utils.globals import set_last_message
170
+
171
+ set_last_message(result)
169
172
  return result
170
173
  finally:
171
174
  set_in_chat(False)
@@ -151,34 +151,43 @@ class KimiModel(BasePlatform):
151
151
  retry_count = 0
152
152
 
153
153
  while retry_count < max_retries:
154
- payload = json.dumps({"ids": [file_id]}, ensure_ascii=False)
155
- response = while_success(
156
- lambda: http.post(url, headers=headers, data=payload, stream=True),
154
+ payload = {"ids": [file_id]}
155
+ response_stream = while_success(
156
+ lambda: http.stream_post(url, headers=headers, json=payload),
157
157
  sleep_time=5,
158
158
  )
159
159
 
160
- for line in response.iter_lines():
161
- if not line:
162
- continue
163
-
164
- # httpx 返回字符串,requests 返回字节,需要兼容处理
165
- if isinstance(line, bytes):
166
- line = line.decode("utf-8")
167
- else:
168
- line = str(line)
169
-
170
- if not line.startswith("data: "):
171
- continue
160
+ response_data = b""
161
+
162
+ # 处理流式响应
163
+ for chunk in response_stream:
164
+ response_data += chunk
172
165
 
166
+ # 尝试解析SSE格式的数据
173
167
  try:
174
- data = json.loads(line[6:])
175
- if data.get("event") == "resp":
176
- status = data.get("file_info", {}).get("status")
177
- if status == "parsed":
178
- return True
179
- elif status == "failed":
180
- return False
181
- except json.JSONDecodeError:
168
+ # 查找完整的数据行
169
+ lines = response_data.decode("utf-8").split("\n")
170
+ response_data = b"" # 重置缓冲区
171
+
172
+ for line in lines:
173
+ if not line.strip():
174
+ continue
175
+
176
+ # SSE格式的行通常以"data: "开头
177
+ if line.startswith("data: "):
178
+ try:
179
+ data = json.loads(line[6:])
180
+ if data.get("event") == "resp":
181
+ status = data.get("file_info", {}).get("status")
182
+ if status == "parsed":
183
+ return True
184
+ elif status == "failed":
185
+ return False
186
+ except json.JSONDecodeError:
187
+ continue
188
+
189
+ except UnicodeDecodeError:
190
+ # 如果解码失败,继续累积数据
182
191
  continue
183
192
 
184
193
  retry_count += 1
@@ -284,34 +293,44 @@ class KimiModel(BasePlatform):
284
293
  }
285
294
 
286
295
  try:
287
- response = while_success(
288
- lambda: http.post(url, headers=headers, json=payload, stream=True),
296
+ # 使用新的stream_post接口发送消息请求,获取流式响应
297
+ response_stream = while_success(
298
+ lambda: http.stream_post(url, headers=headers, json=payload),
289
299
  sleep_time=5,
290
300
  )
291
- # 如果禁止输出,则静默处理
292
- for line in response.iter_lines():
293
- if not line:
294
- continue
295
-
296
- # httpx 返回字符串,requests 返回字节,需要兼容处理
297
- if isinstance(line, bytes):
298
- line = line.decode("utf-8")
299
- else:
300
- line = str(line)
301
-
302
- if not line.startswith("data: "):
303
- continue
304
-
301
+
302
+ response_data = b""
303
+
304
+ # 处理流式响应
305
+ for chunk in response_stream:
306
+ response_data += chunk
307
+
308
+ # 尝试解析SSE格式的数据
305
309
  try:
306
- data = json.loads(line[6:])
307
- event = data.get("event")
308
-
309
- if event == "cmpl":
310
- # 处理补全文本
311
- text = data.get("text", "")
312
- if text:
313
- yield text
314
- except json.JSONDecodeError:
310
+ # 查找完整的数据行
311
+ lines = response_data.decode("utf-8").split("\n")
312
+ response_data = b"" # 重置缓冲区
313
+
314
+ for line in lines:
315
+ if not line.strip():
316
+ continue
317
+
318
+ # SSE格式的行通常以"data: "开头
319
+ if line.startswith("data: "):
320
+ try:
321
+ data = json.loads(line[6:])
322
+ event = data.get("event")
323
+
324
+ if event == "cmpl":
325
+ # 处理补全文本
326
+ text = data.get("text", "")
327
+ if text:
328
+ yield text
329
+ except json.JSONDecodeError:
330
+ continue
331
+
332
+ except UnicodeDecodeError:
333
+ # 如果解码失败,继续累积数据
315
334
  continue
316
335
 
317
336
  return None