aient 1.2.27__py3-none-any.whl → 1.2.30__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.
aient/core/request.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import re
2
2
  import json
3
+ import copy
3
4
  import httpx
4
5
  import base64
5
6
  import asyncio
@@ -57,7 +58,7 @@ async def get_gemini_payload(request, engine, provider, api_key=None):
57
58
  try:
58
59
  request_messages = [Message(role="user", content=request.prompt)]
59
60
  except:
60
- request_messages = request.messages
61
+ request_messages = copy.deepcopy(request.messages)
61
62
  for msg in request_messages:
62
63
  if msg.role == "assistant":
63
64
  msg.role = "model"
@@ -399,7 +400,8 @@ async def get_vertex_gemini_payload(request, engine, provider, api_key=None):
399
400
  systemInstruction = None
400
401
  system_prompt = ""
401
402
  function_arguments = None
402
- for msg in request.messages:
403
+ request_messages = copy.deepcopy(request.messages)
404
+ for msg in request_messages:
403
405
  if msg.role == "assistant":
404
406
  msg.role = "model"
405
407
  tool_calls = None
aient/core/response.py CHANGED
@@ -8,7 +8,7 @@ from datetime import datetime
8
8
 
9
9
  from .log_config import logger
10
10
 
11
- from .utils import safe_get, generate_sse_response, generate_no_stream_response, end_of_line, parse_json_safely
11
+ from .utils import safe_get, generate_sse_response, generate_no_stream_response, end_of_line, parse_json_safely, upload_image_to_0x0st
12
12
 
13
13
  async def check_response(response, error_log):
14
14
  if response and not (200 <= response.status_code < 300):
@@ -277,7 +277,8 @@ async def fetch_gpt_response_stream(client, url, headers, payload, timeout):
277
277
  openrouter_reasoning = safe_get(line, "choices", 0, "delta", "reasoning", default="")
278
278
  openrouter_base64_image = safe_get(line, "choices", 0, "delta", "images", 0, "image_url", "url", default="")
279
279
  if openrouter_base64_image:
280
- sse_string = await generate_sse_response(timestamp, payload["model"], content=f"\n\n![image]({openrouter_base64_image})")
280
+ image_url = await upload_image_to_0x0st(openrouter_base64_image)
281
+ sse_string = await generate_sse_response(timestamp, payload["model"], content=f"\n\n![image]({image_url})")
281
282
  yield sse_string
282
283
  continue
283
284
  azure_databricks_claude_summary_content = safe_get(line, "choices", 0, "delta", "content", 0, "summary", 0, "text", default="")
aient/core/utils.py CHANGED
@@ -228,7 +228,12 @@ async def update_initial_model(provider):
228
228
  def safe_get(data, *keys, default=None):
229
229
  for key in keys:
230
230
  try:
231
- data = data[key] if isinstance(data, (dict, list)) else data.get(key)
231
+ if isinstance(data, (dict, list)):
232
+ data = data[key]
233
+ elif isinstance(key, str) and hasattr(data, key):
234
+ data = getattr(data, key)
235
+ else:
236
+ data = data.get(key)
232
237
  except (KeyError, IndexError, AttributeError, TypeError):
233
238
  return default
234
239
  if not data:
@@ -797,6 +802,44 @@ def parse_json_safely(json_str):
797
802
  # 两种方法都失败,抛出异常
798
803
  raise Exception(f"无法解析JSON字符串: {e}, {json_str}")
799
804
 
805
+ async def upload_image_to_0x0st(base64_image: str):
806
+ """
807
+ Uploads a base64 encoded image to 0x0.st.
808
+
809
+ Args:
810
+ base64_image: The base64 encoded image string.
811
+
812
+ Returns:
813
+ The URL of the uploaded image.
814
+ """
815
+ if "," in base64_image:
816
+ base64_image_split = base64_image.split(",")[1]
817
+
818
+ image_data = base64.b64decode(base64_image_split)
819
+
820
+ img_format = get_image_format(image_data)
821
+ if not img_format:
822
+ img_format = 'png' # 如果无法检测到格式,则默认为 png
823
+
824
+ content_type = f'image/{img_format}'
825
+ file_name = f'image.{img_format}'
826
+
827
+ files = {'file': (file_name, image_data, content_type)}
828
+ data = {'expires': '24', 'secret': '123456'}
829
+
830
+ async with httpx.AsyncClient() as client:
831
+ try:
832
+ response = await client.post("https://0x0.st", files=files, data=data)
833
+ response.raise_for_status()
834
+ return response.text.strip()
835
+ except httpx.RequestError as e:
836
+ logger.error(f"请求 0x0.st 时出错: {e}")
837
+ # raise HTTPException(status_code=500, detail="上传图片到 0x0.st 失败")
838
+ except httpx.HTTPStatusError as e:
839
+ logger.error(f"上传图片到 0x0.st 时发生 HTTP 错误: {e.response.status_code}")
840
+ # raise HTTPException(status_code=e.response.status_code, detail=f"上传图片到 0x0.st 失败: {e.response.text}")
841
+ return base64_image
842
+
800
843
  if __name__ == "__main__":
801
844
  provider = {
802
845
  "base_url": "https://gateway.ai.cloudflare.com/v1/%7Baccount_id%7D/%7Bgateway_id%7D/google-vertex-ai",
aient/models/audio.py CHANGED
@@ -4,13 +4,13 @@ import json
4
4
  from .base import BaseLLM
5
5
 
6
6
  API = os.environ.get('API', None)
7
- API_URL = os.environ.get('API_URL', None)
7
+ BASE_URL = os.environ.get('BASE_URL', None)
8
8
 
9
9
  class whisper(BaseLLM):
10
10
  def __init__(
11
11
  self,
12
12
  api_key: str,
13
- api_url: str = (os.environ.get("API_URL") or "https://api.openai.com/v1/audio/transcriptions"),
13
+ api_url: str = (os.environ.get("BASE_URL") or "https://api.openai.com/v1/audio/transcriptions"),
14
14
  timeout: float = 20,
15
15
  ):
16
16
  super().__init__(api_key, api_url=api_url, timeout=timeout)
aient/models/base.py CHANGED
@@ -11,8 +11,8 @@ class BaseLLM:
11
11
  def __init__(
12
12
  self,
13
13
  api_key: str = None,
14
- engine: str = os.environ.get("GPT_ENGINE") or "gpt-3.5-turbo",
15
- api_url: str = (os.environ.get("API_URL", None) or "https://api.openai.com/v1/chat/completions"),
14
+ engine: str = os.environ.get("MODEL") or "gpt-3.5-turbo",
15
+ api_url: str = (os.environ.get("BASE_URL", None) or "https://api.openai.com/v1/chat/completions"),
16
16
  system_prompt: str = prompt.chatgpt_system_prompt,
17
17
  proxy: str = None,
18
18
  timeout: float = 600,
aient/models/chatgpt.py CHANGED
@@ -74,8 +74,8 @@ class chatgpt(BaseLLM):
74
74
  def __init__(
75
75
  self,
76
76
  api_key: str = None,
77
- engine: str = os.environ.get("GPT_ENGINE") or "gpt-4o",
78
- api_url: str = (os.environ.get("API_URL") or "https://api.openai.com/v1/chat/completions"),
77
+ engine: str = os.environ.get("MODEL") or "gpt-4o",
78
+ api_url: str = (os.environ.get("BASE_URL") or "https://api.openai.com/v1/chat/completions"),
79
79
  system_prompt: str = "You are ChatGPT, a large language model trained by OpenAI. Respond conversationally",
80
80
  proxy: str = None,
81
81
  timeout: float = 600,
aient/plugins/image.py CHANGED
@@ -5,13 +5,13 @@ from ..models.base import BaseLLM
5
5
  from .registry import register_tool
6
6
 
7
7
  API = os.environ.get('API', None)
8
- API_URL = os.environ.get('API_URL', None)
8
+ BASE_URL = os.environ.get('BASE_URL', None)
9
9
 
10
10
  class dalle3(BaseLLM):
11
11
  def __init__(
12
12
  self,
13
13
  api_key: str,
14
- api_url: str = (os.environ.get("API_URL") or "https://api.openai.com/v1/images/generations"),
14
+ api_url: str = (os.environ.get("BASE_URL") or "https://api.openai.com/v1/images/generations"),
15
15
  timeout: float = 20,
16
16
  ):
17
17
  super().__init__(api_key, api_url=api_url, timeout=timeout)
aient/utils/prompt.py CHANGED
@@ -90,10 +90,6 @@ chatgpt_system_prompt = (
90
90
  "You are ChatGPT, a large language model trained by OpenAI. Use simple characters to represent mathematical symbols. Do not use LaTeX commands. Respond conversationally"
91
91
  )
92
92
 
93
- claude_system_prompt = (
94
- "You are Claude, a large language model trained by Anthropic. Use simple characters to represent mathematical symbols. Do not use LaTeX commands. Respond conversationally in {}."
95
- )
96
-
97
93
  search_system_prompt = (
98
94
  "You are ChatGPT, a large language model trained by OpenAI. Respond conversationally in {}."
99
95
  "You can break down the task into multiple steps and search the web to answer my questions one by one."
aient/utils/scripts.py CHANGED
@@ -134,14 +134,6 @@ def is_surrounded_by_chinese(text, index):
134
134
  def replace_char(string, index, new_char):
135
135
  return string[:index] + new_char + string[index+1:]
136
136
 
137
- def claude_replace(text):
138
- Punctuation_mapping = {",": ",", ":": ":", "!": "!", "?": "?", ";": ";"}
139
- key_list = list(Punctuation_mapping.keys())
140
- for i in range(len(text)):
141
- if is_surrounded_by_chinese(text, i) and (text[i] in key_list):
142
- text = replace_char(text, i, Punctuation_mapping[text[i]])
143
- return text
144
-
145
137
  def safe_get(data, *keys, default=None):
146
138
  for key in keys:
147
139
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aient
3
- Version: 1.2.27
3
+ Version: 1.2.30
4
4
  Summary: Aient: The Awakening of Agent.
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -7,23 +7,23 @@ aient/architext/test/test_save_load.py,sha256=o8DqH6gDYZkFkQy-a7blqLtJTRj5e4a-Li
7
7
  aient/core/__init__.py,sha256=NxjebTlku35S4Dzr16rdSqSTWUvvwEeACe8KvHJnjPg,34
8
8
  aient/core/log_config.py,sha256=kz2_yJv1p-o3lUQOwA3qh-LSc3wMHv13iCQclw44W9c,274
9
9
  aient/core/models.py,sha256=KMlCRLjtq1wQHZTJGqnbWhPS2cHq6eLdnk7peKDrzR8,7490
10
- aient/core/request.py,sha256=QnDhyrjzcJOEQU2oauMQi_HHMRR5NxdkrX7nn5JMwTc,76675
11
- aient/core/response.py,sha256=HcyOEfZXZEXeJaUBMCYE4LiLyB79XuUR5o0Gtwdyi-E,36309
12
- aient/core/utils.py,sha256=sLmPHONYhIPq1zUYcbKOtIOpAVsLFk_5lNwH5-G2c4E,30013
10
+ aient/core/request.py,sha256=-KEBd4jWLVC9QYUhb1ZfgkLf4nKE7HKL0A58iULkY7o,76757
11
+ aient/core/response.py,sha256=Z9geTfh2LkGHKAqjelgeleQtfOAYIyM82t9AVB4xsgE,36407
12
+ aient/core/utils.py,sha256=Z8vTH9w3uS8uubBa65c_aJ11A3OKGYEzm4q0brNZDSk,31594
13
13
  aient/core/test/test_base_api.py,sha256=pWnycRJbuPSXKKU9AQjWrMAX1wiLC_014Qc9hh5C2Pw,524
14
14
  aient/core/test/test_geminimask.py,sha256=HFX8jDbNg_FjjgPNxfYaR-0-roUrOO-ND-FVsuxSoiw,13254
15
15
  aient/core/test/test_image.py,sha256=_T4peNGdXKBHHxyQNx12u-NTyFE8TlYI6NvvagsG2LE,319
16
16
  aient/core/test/test_payload.py,sha256=8jBiJY1uidm1jzL-EiK0s6UGmW9XkdsuuKFGrwFhFkw,2755
17
17
  aient/models/__init__.py,sha256=ZTiZgbfBPTjIPSKURE7t6hlFBVLRS9lluGbmqc1WjxQ,43
18
- aient/models/audio.py,sha256=kRd-8-WXzv4vwvsTGwnstK-WR8--vr9CdfCZzu8y9LA,1934
19
- aient/models/base.py,sha256=-nnihYnx-vHZMqeVO9ljjt3k4FcD3n-iMk4tT-10nRQ,7232
20
- aient/models/chatgpt.py,sha256=oIFhSTqmFNG4KYJd1xdEui6l5EbHSaxOne0sSwNP4aM,42920
18
+ aient/models/audio.py,sha256=FNW4lxG1IhxOU7L8mvcbaeC1nXk_lpUZQlg9ijQ0h_Q,1937
19
+ aient/models/base.py,sha256=HWIGfa2A7OTccvHK0wG1-UlHB-yaWRC7hbi4oR1Mu1Y,7228
20
+ aient/models/chatgpt.py,sha256=A8tZl-a00EZxGYKQBOiNh-kG-YjU-zsj0XbeIzcbf6o,42916
21
21
  aient/plugins/__init__.py,sha256=p3KO6Aa3Lupos4i2SjzLQw1hzQTigOAfEHngsldrsyk,986
22
22
  aient/plugins/arXiv.py,sha256=yHjb6PS3GUWazpOYRMKMzghKJlxnZ5TX8z9F6UtUVow,1461
23
23
  aient/plugins/config.py,sha256=TGgZ5SnNKZ8MmdznrZ-TEq7s2ulhAAwTSKH89bci3dA,7079
24
24
  aient/plugins/excute_command.py,sha256=b-rxsyFN6_HnZJAhUi9Qsp8iJ6XTf-zU-CIUIxeQO98,10869
25
25
  aient/plugins/get_time.py,sha256=Ih5XIW5SDAIhrZ9W4Qe5Hs1k4ieKPUc_LAd6ySNyqZk,654
26
- aient/plugins/image.py,sha256=ZElCIaZznE06TN9xW3DrSukS7U3A5_cjk1Jge4NzPxw,2072
26
+ aient/plugins/image.py,sha256=JR4iJ--uUk1abICwQjd9tVIk0-Vs8qMxn6z2lJwuQ4U,2075
27
27
  aient/plugins/list_directory.py,sha256=V_uKkLx_fQDL5z__bSDC-PqAP-o32KmQW6Pdhx0Fx0s,1433
28
28
  aient/plugins/read_file.py,sha256=qHAhdesOr1VMOCDkeHNvI8UV2ZI98HmJl6GhN4Aq9dU,9183
29
29
  aient/plugins/read_image.py,sha256=4FbIiMNVFUQpNyiH5ApGSRvOD9ujcXGyuqlGTJMd7ac,4017
@@ -33,10 +33,10 @@ aient/plugins/run_python.py,sha256=MohvdtZUTDLrHBDtJ9L2_Qu1pWAGrkbzsGmmn5tMN20,4
33
33
  aient/plugins/websearch.py,sha256=aPsBjUQ3zQ4gzNrbVq7BMh28ENj9h_fSAeJFF2h9TNk,15334
34
34
  aient/plugins/write_file.py,sha256=Jt8fOEwqhYiSWpCbwfAr1xoi_BmFnx3076GMhuL06uI,3949
35
35
  aient/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- aient/utils/prompt.py,sha256=UcSzKkFE4-h_1b6NofI6xgk3GoleqALRKY8VBaXLjmI,11311
37
- aient/utils/scripts.py,sha256=VqtK4RFEx7KxkmcqG3lFDS1DxoNlFFGErEjopVcc8IE,40974
38
- aient-1.2.27.dist-info/licenses/LICENSE,sha256=XNdbcWldt0yaNXXWB_Bakoqnxb3OVhUft4MgMA_71ds,1051
39
- aient-1.2.27.dist-info/METADATA,sha256=DpjEPqdiZ_lYC_V0v5Z8tJGjOYKbL1onqcfBVG4Gedc,4842
40
- aient-1.2.27.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
41
- aient-1.2.27.dist-info/top_level.txt,sha256=3oXzrP5sAVvyyqabpeq8A2_vfMtY554r4bVE-OHBrZk,6
42
- aient-1.2.27.dist-info/RECORD,,
36
+ aient/utils/prompt.py,sha256=ZvGAt_ImJ_CGbDnWgpsWskfSV5fCkpFKRpNQjYL7M7s,11100
37
+ aient/utils/scripts.py,sha256=Q0tS7E9AmdikO7GeDBd_3Ii5opXHCvKjDGqHsXen6_A,40622
38
+ aient-1.2.30.dist-info/licenses/LICENSE,sha256=XNdbcWldt0yaNXXWB_Bakoqnxb3OVhUft4MgMA_71ds,1051
39
+ aient-1.2.30.dist-info/METADATA,sha256=uFCKPmb6M_-Fehq-bpgkcFhK6zu6IqlVnGVKsgZH_8g,4842
40
+ aient-1.2.30.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
41
+ aient-1.2.30.dist-info/top_level.txt,sha256=3oXzrP5sAVvyyqabpeq8A2_vfMtY554r4bVE-OHBrZk,6
42
+ aient-1.2.30.dist-info/RECORD,,
File without changes