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.
- {jarvis_ai_assistant-0.1.211/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.212}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/pyproject.toml +1 -1
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/setup.py +1 -1
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/__init__.py +1 -1
- jarvis_ai_assistant-0.1.212/src/jarvis/jarvis_platform/ai8.py +270 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/base.py +3 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/kimi.py +67 -48
- jarvis_ai_assistant-0.1.212/src/jarvis/jarvis_platform/oyi.py +314 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform_manager/main.py +31 -23
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/globals.py +31 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/input.py +34 -12
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +2 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/README.md +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_agent/edit_file_handler.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_agent/jarvis.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_agent/output_handler.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_agent/code_agent.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_agent/lint.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_data/config_schema.json +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_git_details/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_git_details/main.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_git_squash/main.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_mcp/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_methodology/main.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_multi_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/human.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/openai.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/registry.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/tongyi.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform_manager/service.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_smart_shell/main.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/ask_user.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/base.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/cli/main.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/edit_file.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/execute_script.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/methodology.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/read_code.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/registry.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/search_web.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/config.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/embedding.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/file_processors.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/git_utils.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/http.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/methodology.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/output.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/tag.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_utils/utils.py +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
- {jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/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.1.
|
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.
|
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",
|
@@ -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
|
{jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/base.py
RENAMED
@@ -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)
|
{jarvis_ai_assistant-0.1.211 → jarvis_ai_assistant-0.1.212}/src/jarvis/jarvis_platform/kimi.py
RENAMED
@@ -151,34 +151,43 @@ class KimiModel(BasePlatform):
|
|
151
151
|
retry_count = 0
|
152
152
|
|
153
153
|
while retry_count < max_retries:
|
154
|
-
payload =
|
155
|
-
|
156
|
-
lambda: http.
|
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
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
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
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
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
|
-
|
288
|
-
|
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
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
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
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
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
|