jarvis-ai-assistant 0.1.209__tar.gz → 0.1.210__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 (101) hide show
  1. {jarvis_ai_assistant-0.1.209/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.210}/PKG-INFO +2 -1
  2. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/pyproject.toml +2 -1
  3. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/setup.py +2 -1
  4. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_agent/code_agent.py +2 -0
  6. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_platform/tongyi.py +77 -72
  7. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_platform/yuanbao.py +54 -51
  8. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_utils/git_utils.py +14 -0
  9. jarvis_ai_assistant-0.1.210/src/jarvis/jarvis_utils/http.py +169 -0
  10. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210/src/jarvis_ai_assistant.egg-info}/PKG-INFO +2 -1
  11. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis_ai_assistant.egg-info/requires.txt +1 -0
  12. jarvis_ai_assistant-0.1.209/src/jarvis/jarvis_utils/http.py +0 -104
  13. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/LICENSE +0 -0
  14. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/MANIFEST.in +0 -0
  15. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/README.md +0 -0
  16. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/setup.cfg +0 -0
  17. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_agent/__init__.py +0 -0
  18. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  19. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_agent/edit_file_handler.py +0 -0
  20. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_agent/jarvis.py +0 -0
  21. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_agent/main.py +0 -0
  22. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  23. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  24. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  25. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_agent/lint.py +0 -0
  26. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  27. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  28. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  29. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  30. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  31. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  32. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  33. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  34. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  35. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  36. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  37. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  38. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  39. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  40. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  41. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  42. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  43. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  44. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  45. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  46. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  47. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_data/config_schema.json +0 -0
  48. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_git_details/__init__.py +0 -0
  49. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_git_details/main.py +0 -0
  50. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  51. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_git_squash/main.py +0 -0
  52. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
  53. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  54. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  55. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  56. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
  57. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_methodology/main.py +0 -0
  58. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  59. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  60. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_platform/__init__.py +0 -0
  61. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_platform/base.py +0 -0
  62. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_platform/human.py +0 -0
  63. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_platform/kimi.py +0 -0
  64. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_platform/openai.py +0 -0
  65. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_platform/registry.py +0 -0
  66. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  67. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  68. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_platform_manager/service.py +0 -0
  69. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  70. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  71. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/__init__.py +0 -0
  72. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  73. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/base.py +0 -0
  74. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  75. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/cli/main.py +0 -0
  76. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/edit_file.py +0 -0
  77. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  78. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  79. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
  80. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/methodology.py +0 -0
  81. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/read_code.py +0 -0
  82. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  83. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/registry.py +0 -0
  84. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  85. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/search_web.py +0 -0
  86. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  87. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_utils/__init__.py +0 -0
  88. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  89. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_utils/config.py +0 -0
  90. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_utils/embedding.py +0 -0
  91. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  92. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_utils/globals.py +0 -0
  93. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_utils/input.py +0 -0
  94. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_utils/methodology.py +0 -0
  95. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_utils/output.py +0 -0
  96. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_utils/tag.py +0 -0
  97. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis/jarvis_utils/utils.py +0 -0
  98. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +0 -0
  99. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  100. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  101. {jarvis_ai_assistant-0.1.209 → jarvis_ai_assistant-0.1.210}/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.209
3
+ Version: 0.1.210
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
@@ -55,6 +55,7 @@ Requires-Dist: openai==1.78.1
55
55
  Requires-Dist: tabulate==0.9.0
56
56
  Requires-Dist: pyte==0.8.2
57
57
  Requires-Dist: pyyaml>=6.0.2
58
+ Requires-Dist: httpx>=0.28.1
58
59
  Provides-Extra: dev
59
60
  Requires-Dist: pytest; extra == "dev"
60
61
  Requires-Dist: black; extra == "dev"
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "jarvis-ai-assistant"
7
- version = "0.1.209"
7
+ version = "0.1.210"
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" }]
@@ -37,6 +37,7 @@ dependencies = [
37
37
  "tabulate==0.9.0",
38
38
  "pyte==0.8.2",
39
39
  "pyyaml>=6.0.2",
40
+ "httpx>=0.28.1",
40
41
  ]
41
42
  requires-python = ">=3.8"
42
43
 
@@ -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.209",
6
+ version="0.1.210",
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",
@@ -32,6 +32,7 @@ setup(
32
32
  "tabulate==0.9.0",
33
33
  "pyte==0.8.2",
34
34
  "pyyaml>=6.0.2",
35
+ "httpx>=0.28.1",
35
36
  ],
36
37
  extras_require={"dev": ["pytest", "black", "isort", "mypy", "build", "twine"]},
37
38
  entry_points={
@@ -1,4 +1,4 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  """Jarvis AI Assistant"""
3
3
 
4
- __version__ = "0.1.209"
4
+ __version__ = "0.1.210"
@@ -130,6 +130,8 @@ class CodeAgent:
130
130
  platform=platform_instance,
131
131
  input_handler=[shell_input_handler, builtin_input_handler],
132
132
  need_summary=need_summary,
133
+ use_methodology=False, # 禁用方法论
134
+ use_analysis=False # 禁用分析
133
135
  )
134
136
 
135
137
  self.agent.set_after_tool_call_cb(self.after_tool_call_cb)
@@ -159,88 +159,93 @@ class TongyiPlatform(BasePlatform):
159
159
  }
160
160
 
161
161
  try:
162
- response = while_success(
163
- lambda: http.post(url, headers=headers, json=payload, stream=True),
162
+ # 使用新的stream_post接口发送消息请求,获取流式响应
163
+ response_stream = while_success(
164
+ lambda: http.stream_post(url, headers=headers, json=payload),
164
165
  sleep_time=5,
165
166
  )
166
- if response.status_code != 200:
167
- raise Exception(f"HTTP {response.status_code}: {response.text}")
167
+
168
168
  msg_id = ""
169
169
  session_id = ""
170
170
  thinking_content = ""
171
171
  text_content = ""
172
172
  in_thinking = False
173
- for line in response.iter_lines():
174
- if not line:
175
- continue
173
+ response_data = b""
176
174
 
177
- # httpx 返回字符串,requests 返回字节,需要兼容处理
178
- if isinstance(line, bytes):
179
- line_str = line.decode("utf-8")
180
- else:
181
- line_str = str(line)
182
-
183
- if not line_str.startswith("data: "):
184
- continue
175
+ # 处理流式响应
176
+ for chunk in response_stream:
177
+ response_data += chunk
185
178
 
179
+ # 尝试解析SSE格式的数据
186
180
  try:
187
- data = json.loads(line_str[6:])
188
- # 记录消息ID和会话ID
189
- if "msgId" in data:
190
- msg_id = data["msgId"]
191
- if "sessionId" in data:
192
- session_id = data["sessionId"]
193
-
194
- if "contents" in data and len(data["contents"]) > 0:
195
- for content in data["contents"]:
196
- if content.get("contentType") == "think":
197
- if not in_thinking:
198
- yield "<think>\n\n"
199
- in_thinking = True
200
- if content.get("incremental"):
201
- tmp_content = json.loads(content.get("content"))[
202
- "content"
203
- ]
204
- thinking_content += tmp_content
205
- yield tmp_content
206
- else:
207
- tmp_content = json.loads(content.get("content"))[
208
- "content"
209
- ]
210
- if len(thinking_content) < len(tmp_content):
211
- yield tmp_content[len(thinking_content) :]
212
- thinking_content = tmp_content
213
- else:
214
- # thinking_content = "aaa</thi"
215
- # tmp_content = "aaa"
216
- # 应该yield nk>
217
- # print("\n")
218
- # print(len(thinking_content))
219
- # print(len(tmp_content))
220
- # print("--------------------------------")
221
- # print(thinking_content)
222
- # print("--------------------------------")
223
- # print(tmp_content)
224
- # print("--------------------------------")
225
- yield "\r\n</think>\n"[
226
- len(thinking_content) - len(tmp_content) :
227
- ]
228
- thinking_content = tmp_content
229
- in_thinking = False
230
- elif content.get("contentType") == "text":
231
- if in_thinking:
232
- continue
233
- if content.get("incremental"):
234
- tmp_content = content.get("content")
235
- text_content += tmp_content
236
- yield tmp_content
237
- else:
238
- tmp_content = content.get("content")
239
- if len(text_content) < len(tmp_content):
240
- yield tmp_content[len(text_content) :]
241
- text_content = tmp_content
242
-
243
- except json.JSONDecodeError:
181
+ # 查找完整的数据行
182
+ lines = response_data.decode("utf-8").split("\n")
183
+ response_data = b"" # 重置缓冲区
184
+
185
+ for line in lines:
186
+ if not line.strip():
187
+ continue
188
+
189
+ # SSE格式的行通常以"data: "开头
190
+ if line.startswith("data: "):
191
+ try:
192
+ data = json.loads(line[6:])
193
+ # 记录消息ID和会话ID
194
+ if "msgId" in data:
195
+ msg_id = data["msgId"]
196
+ if "sessionId" in data:
197
+ session_id = data["sessionId"]
198
+
199
+ if "contents" in data and len(data["contents"]) > 0:
200
+ for content in data["contents"]:
201
+ if content.get("contentType") == "think":
202
+ if not in_thinking:
203
+ yield "<think>\n\n"
204
+ in_thinking = True
205
+ if content.get("incremental"):
206
+ tmp_content = json.loads(
207
+ content.get("content")
208
+ )["content"]
209
+ thinking_content += tmp_content
210
+ yield tmp_content
211
+ else:
212
+ tmp_content = json.loads(
213
+ content.get("content")
214
+ )["content"]
215
+ if len(thinking_content) < len(
216
+ tmp_content
217
+ ):
218
+ yield tmp_content[
219
+ len(thinking_content) :
220
+ ]
221
+ thinking_content = tmp_content
222
+ else:
223
+ yield "\r\n</think>\n"[
224
+ len(thinking_content)
225
+ - len(tmp_content) :
226
+ ]
227
+ thinking_content = tmp_content
228
+ in_thinking = False
229
+ elif content.get("contentType") == "text":
230
+ if in_thinking:
231
+ continue
232
+ if content.get("incremental"):
233
+ tmp_content = content.get("content")
234
+ text_content += tmp_content
235
+ yield tmp_content
236
+ else:
237
+ tmp_content = content.get("content")
238
+ if len(text_content) < len(tmp_content):
239
+ yield tmp_content[
240
+ len(text_content) :
241
+ ]
242
+ text_content = tmp_content
243
+
244
+ except json.JSONDecodeError:
245
+ continue
246
+
247
+ except UnicodeDecodeError:
248
+ # 如果解码失败,继续累积数据
244
249
  continue
245
250
 
246
251
  self.msg_id = msg_id
@@ -468,63 +468,66 @@ class YuanbaoPlatform(BasePlatform):
468
468
  payload["displayPrompt"] = payload["prompt"]
469
469
 
470
470
  try:
471
- # 发送消息请求,获取流式响应
472
- response = while_success(
473
- lambda: http.post(
474
- url,
475
- headers=headers,
476
- json=payload,
477
- stream=True,
478
- ),
471
+ # 使用新的stream_post接口发送消息请求,获取流式响应
472
+ response_stream = while_success(
473
+ lambda: http.stream_post(url, headers=headers, json=payload),
479
474
  sleep_time=5,
480
475
  )
481
476
 
482
- # 检查响应状态
483
- if response.status_code != 200:
484
- error_msg = f"发送消息失败,状态码: {response.status_code}"
485
- if hasattr(response, "text"):
486
- error_msg += f", 响应: {response.text}"
487
- raise Exception(error_msg)
488
-
489
477
  in_thinking = False
490
-
491
- # 处理SSE流响应
492
- for line in response.iter_lines():
493
- if not line:
478
+ response_data = b""
479
+
480
+ # 处理流式响应
481
+ for chunk in response_stream:
482
+ response_data += chunk
483
+
484
+ # 尝试解析SSE格式的数据
485
+ try:
486
+ # 查找完整的数据行
487
+ lines = response_data.decode("utf-8").split("\n")
488
+ response_data = b"" # 重置缓冲区
489
+
490
+ for line in lines:
491
+ if not line.strip():
492
+ continue
493
+
494
+ # SSE格式的行通常以"data: "开头
495
+ if line.startswith("data: "):
496
+ try:
497
+ data_str = line[6:] # 移除"data: "前缀
498
+
499
+ # 检查结束标志
500
+ if data_str == "[DONE]":
501
+ self.first_chat = False
502
+ return None
503
+
504
+ data = json.loads(data_str)
505
+
506
+ # 处理文本类型的消息
507
+ if data.get("type") == "text":
508
+ if in_thinking:
509
+ yield "</think>\n"
510
+ in_thinking = False
511
+ msg = data.get("msg", "")
512
+ if msg:
513
+ yield msg
514
+
515
+ # 处理思考中的消息
516
+ elif data.get("type") == "think":
517
+ if not in_thinking:
518
+ yield "<think>\n"
519
+ in_thinking = True
520
+ think_content = data.get("content", "")
521
+ if think_content:
522
+ yield think_content
523
+
524
+ except json.JSONDecodeError:
525
+ pass
526
+
527
+ except UnicodeDecodeError:
528
+ # 如果解码失败,继续累积数据
494
529
  continue
495
530
 
496
- line_str = line.decode("utf-8")
497
-
498
- # SSE格式的行通常以"data: "开头
499
- if line_str.startswith("data: "):
500
- try:
501
- data_str = line_str[6:] # 移除"data: "前缀
502
- data = json.loads(data_str)
503
-
504
- # 处理文本类型的消息
505
- if data.get("type") == "text":
506
- if in_thinking:
507
- yield "</think>\n"
508
- in_thinking = False
509
- msg = data.get("msg", "")
510
- if msg:
511
- yield msg
512
-
513
- # 处理思考中的消息
514
- elif data.get("type") == "think":
515
- if not in_thinking:
516
- yield "<think>\n"
517
- in_thinking = True
518
- think_content = data.get("content", "")
519
- if think_content:
520
- yield think_content
521
-
522
- except json.JSONDecodeError:
523
- pass
524
-
525
- # 检测结束标志
526
- elif line_str == "data: [DONE]":
527
- return None
528
531
  self.first_chat = False
529
532
  return None
530
533
 
@@ -9,6 +9,7 @@ Git工具模块
9
9
  - 获取最新提交的哈希值
10
10
  - 从Git差异中提取修改的行范围
11
11
  """
12
+ import datetime
12
13
  import os
13
14
  import re
14
15
  import subprocess
@@ -344,6 +345,19 @@ def check_and_update_git_repo(repo_path: str) -> bool:
344
345
  return False
345
346
 
346
347
  try:
348
+ # 检查最新提交时间是否为今天
349
+ commit_date_result = subprocess.run(
350
+ ["git", "log", "-1", "--format=%cd", "--date=short"],
351
+ cwd=git_root,
352
+ capture_output=True,
353
+ text=True,
354
+ )
355
+ if commit_date_result.returncode == 0:
356
+ commit_date = commit_date_result.stdout.strip()
357
+ today = datetime.date.today().strftime("%Y-%m-%d")
358
+ if commit_date == today:
359
+ return False
360
+
347
361
  # 检查是否有未提交的修改
348
362
  if has_uncommitted_changes():
349
363
  return False
@@ -0,0 +1,169 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ import httpx
4
+ from typing import Any, Dict, Optional, Union, AsyncGenerator, Generator
5
+
6
+
7
+ def get_httpx_client() -> httpx.Client:
8
+ """
9
+ 获取一个配置好的 httpx.Client 对象
10
+
11
+ 返回:
12
+ httpx.Client 对象
13
+ """
14
+ client = httpx.Client(
15
+ timeout=httpx.Timeout(None), # 永不超时
16
+ headers={
17
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36",
18
+ },
19
+ )
20
+ return client
21
+
22
+
23
+ def get_async_httpx_client() -> httpx.AsyncClient:
24
+ """
25
+ 获取一个配置好的 httpx.AsyncClient 对象
26
+
27
+ 返回:
28
+ httpx.AsyncClient 对象
29
+ """
30
+ client = httpx.AsyncClient(
31
+ timeout=httpx.Timeout(None), # 永不超时
32
+ headers={
33
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36",
34
+ },
35
+ )
36
+ return client
37
+
38
+
39
+ # 增强版本的 HTTP 请求方法(使用 httpx 实现,带重试机制,解决连接中断问题)
40
+ def post(
41
+ url: str,
42
+ data: Optional[Any] = None,
43
+ json: Optional[Dict[str, Any]] = None,
44
+ **kwargs,
45
+ ) -> httpx.Response:
46
+ """
47
+ 发送增强版永不超时的 POST 请求,使用 httpx 实现,包含重试机制
48
+
49
+ 参数:
50
+ url: 请求的 URL
51
+ data: (可选) 请求体数据 (表单数据或原始数据)
52
+ json: (可选) JSON 数据,会自动设置 Content-Type
53
+ **kwargs: 其他传递给 httpx.post 的参数
54
+
55
+ 返回:
56
+ httpx.Response 对象
57
+
58
+ 注意:
59
+ 此方法使用 httpx 实现,包含自动重试机制,适用于解决"Response ended prematurely"等连接问题
60
+ """
61
+ client = get_httpx_client()
62
+ try:
63
+ response = client.post(url=url, data=data, json=json, **kwargs)
64
+ response.raise_for_status()
65
+ return response
66
+ finally:
67
+ client.close()
68
+
69
+
70
+ def get(url: str, **kwargs) -> httpx.Response:
71
+ """
72
+ 发送增强版永不超时的 GET 请求,使用 httpx 实现,包含重试机制
73
+
74
+ 参数:
75
+ url: 请求的 URL
76
+ **kwargs: 其他传递给 httpx.get 的参数
77
+
78
+ 返回:
79
+ httpx.Response 对象
80
+
81
+ 注意:
82
+ 此方法使用 httpx 实现,包含自动重试机制,适用于解决"Response ended prematurely"等连接问题
83
+ """
84
+ client = get_httpx_client()
85
+ try:
86
+ response = client.get(url=url, **kwargs)
87
+ response.raise_for_status()
88
+ return response
89
+ finally:
90
+ client.close()
91
+
92
+
93
+ def put(url: str, data: Optional[Any] = None, **kwargs) -> httpx.Response:
94
+ """
95
+ 发送增强版永不超时的 PUT 请求,使用 httpx 实现,包含重试机制
96
+
97
+ 参数:
98
+ url: 请求的 URL
99
+ data: (可选) 请求体数据 (表单数据或原始数据)
100
+ **kwargs: 其他传递给 httpx.put 的参数
101
+
102
+ 返回:
103
+ httpx.Response 对象
104
+
105
+ 注意:
106
+ 此方法使用 httpx 实现,包含自动重试机制,适用于解决"Response ended prematurely"等连接问题
107
+ """
108
+ client = get_httpx_client()
109
+ try:
110
+ response = client.put(url=url, data=data, **kwargs)
111
+ response.raise_for_status()
112
+ return response
113
+ finally:
114
+ client.close()
115
+
116
+
117
+ def delete(url: str, **kwargs) -> httpx.Response:
118
+ """
119
+ 发送增强版永不超时的 DELETE 请求,使用 httpx 实现,包含重试机制
120
+
121
+ 参数:
122
+ url: 请求的 URL
123
+ **kwargs: 其他传递给 httpx.delete 的参数
124
+
125
+ 返回:
126
+ httpx.Response 对象
127
+
128
+ 注意:
129
+ 此方法使用 httpx 实现,包含自动重试机制,适用于解决"Response ended prematurely"等连接问题
130
+ """
131
+ client = get_httpx_client()
132
+ try:
133
+ response = client.delete(url=url, **kwargs)
134
+ response.raise_for_status()
135
+ return response
136
+ finally:
137
+ client.close()
138
+
139
+
140
+ # 同步流式POST请求方法
141
+ def stream_post(
142
+ url: str,
143
+ data: Optional[Any] = None,
144
+ json: Optional[Dict[str, Any]] = None,
145
+ **kwargs,
146
+ ) -> Generator[bytes, None, None]:
147
+ """
148
+ 发送流式 POST 请求,使用 httpx 实现,返回标准 Generator
149
+
150
+ 参数:
151
+ url: 请求的 URL
152
+ data: (可选) 请求体数据 (表单数据或原始数据)
153
+ json: (可选) JSON 数据,会自动设置 Content-Type
154
+ **kwargs: 其他传递给 httpx.post 的参数
155
+
156
+ 返回:
157
+ Generator[bytes, None, None]: 字节流生成器
158
+
159
+ 注意:
160
+ 此方法使用 httpx 实现流式请求,适用于处理大文件下载或流式响应
161
+ """
162
+ client = get_httpx_client()
163
+ try:
164
+ with client.stream("POST", url, data=data, json=json, **kwargs) as response:
165
+ response.raise_for_status()
166
+ for chunk in response.iter_bytes():
167
+ yield chunk
168
+ finally:
169
+ client.close()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.209
3
+ Version: 0.1.210
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
@@ -55,6 +55,7 @@ Requires-Dist: openai==1.78.1
55
55
  Requires-Dist: tabulate==0.9.0
56
56
  Requires-Dist: pyte==0.8.2
57
57
  Requires-Dist: pyyaml>=6.0.2
58
+ Requires-Dist: httpx>=0.28.1
58
59
  Provides-Extra: dev
59
60
  Requires-Dist: pytest; extra == "dev"
60
61
  Requires-Dist: black; extra == "dev"
@@ -13,6 +13,7 @@ openai==1.78.1
13
13
  tabulate==0.9.0
14
14
  pyte==0.8.2
15
15
  pyyaml>=6.0.2
16
+ httpx>=0.28.1
16
17
 
17
18
  [dev]
18
19
  pytest
@@ -1,104 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- import requests
4
- from typing import Any, Dict, Optional, Union
5
-
6
-
7
- def get_session() -> requests.Session:
8
- """
9
- 获取一个永不超时的 requests.Session 对象
10
-
11
- 返回:
12
- requests.Session 对象
13
- """
14
- session = requests.Session()
15
-
16
- # 设置默认请求头以优化连接
17
- session.headers.update(
18
- {"Connection": "keep-alive"}
19
- )
20
-
21
- return session
22
-
23
-
24
- # 增强版本的 HTTP 请求方法(带重试机制,解决连接中断问题)
25
- def post(
26
- url: str,
27
- data: Optional[Union[Dict[str, Any], str, bytes]] = None,
28
- json: Optional[Dict[str, Any]] = None,
29
- **kwargs,
30
- ) -> requests.Response:
31
- """
32
- 发送增强版永不超时的 POST 请求,包含重试机制
33
-
34
- 参数:
35
- url: 请求的 URL
36
- data: (可选) 请求体数据 (表单数据或原始数据)
37
- json: (可选) JSON 数据,会自动设置 Content-Type
38
- **kwargs: 其他传递给 requests.post 的参数
39
-
40
- 返回:
41
- requests.Response 对象
42
-
43
- 注意:
44
- 此方法使用增强的永不超时设置,包含自动重试机制,适用于解决"Response ended prematurely"等连接问题
45
- """
46
- session = get_session()
47
- return session.post(url=url, data=data, json=json, **kwargs)
48
-
49
-
50
- def get(url: str, **kwargs) -> requests.Response:
51
- """
52
- 发送增强版永不超时的 GET 请求,包含重试机制
53
-
54
- 参数:
55
- url: 请求的 URL
56
- **kwargs: 其他传递给 requests.get 的参数
57
-
58
- 返回:
59
- requests.Response 对象
60
-
61
- 注意:
62
- 此方法使用增强的永不超时设置,包含自动重试机制,适用于解决"Response ended prematurely"等连接问题
63
- """
64
- session = get_session()
65
- return session.get(url=url, **kwargs)
66
-
67
-
68
- def put(
69
- url: str, data: Optional[Union[Dict[str, Any], str, bytes]] = None, **kwargs
70
- ) -> requests.Response:
71
- """
72
- 发送增强版永不超时的 PUT 请求,包含重试机制
73
-
74
- 参数:
75
- url: 请求的 URL
76
- data: (可选) 请求体数据 (表单数据或原始数据)
77
- **kwargs: 其他传递给 requests.put 的参数
78
-
79
- 返回:
80
- requests.Response 对象
81
-
82
- 注意:
83
- 此方法使用增强的永不超时设置,包含自动重试机制,适用于解决"Response ended prematurely"等连接问题
84
- """
85
- session = get_session()
86
- return session.put(url=url, data=data, **kwargs)
87
-
88
-
89
- def delete(url: str, **kwargs) -> requests.Response:
90
- """
91
- 发送增强版永不超时的 DELETE 请求,包含重试机制
92
-
93
- 参数:
94
- url: 请求的 URL
95
- **kwargs: 其他传递给 requests.delete 的参数
96
-
97
- 返回:
98
- requests.Response 对象
99
-
100
- 注意:
101
- 此方法使用增强的永不超时设置,包含自动重试机制,适用于解决"Response ended prematurely"等连接问题
102
- """
103
- session = get_session()
104
- return session.delete(url=url, **kwargs)