arpakitlib 1.8.33__py3-none-any.whl → 1.8.35__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.
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "arpakitlib_project_template_version": "5",
3
- "arpakitlib_project_template_subversion": "5"
3
+ "arpakitlib_project_template_subversion": "6"
4
4
  }
@@ -43,3 +43,10 @@ class ApiKeyDBM(SimpleDBM):
43
43
  server_default="true",
44
44
  nullable=False
45
45
  )
46
+
47
+ def __repr__(self) -> str:
48
+ res = f"{self.entity_name} (id={self.id}, is_active={self.is_active}"
49
+ if self.title:
50
+ res += f", title={self.title}"
51
+ res += ")"
52
+ return res
@@ -49,3 +49,11 @@ class StoryLogDBM(SimpleDBM):
49
49
  server_default="{}",
50
50
  nullable=False
51
51
  )
52
+
53
+ @property
54
+ def sdp_allowed_levels(self) -> list[str]:
55
+ return self.Levels.values_list()
56
+
57
+ @property
58
+ def sdp_allowed_types(self) -> list[str]:
59
+ return self.Types.values_list()
@@ -57,6 +57,7 @@ class UserDBM(SimpleDBM):
57
57
  nullable=True
58
58
  )
59
59
 
60
+ # many to one
60
61
  user_tokens: Mapped[list[UserTokenDBM]] = relationship(
61
62
  "UserTokenDBM",
62
63
  uselist=True,
@@ -64,6 +65,17 @@ class UserDBM(SimpleDBM):
64
65
  foreign_keys="UserTokenDBM.user_id"
65
66
  )
66
67
 
68
+ def __repr__(self) -> str:
69
+ if self.email is not None:
70
+ res = f"{self.entity_name} (id={self.id}, email={self.email})"
71
+ else:
72
+ res = f"{self.entity_name} (id={self.id})"
73
+ return res
74
+
75
+ @property
76
+ def sdp_allowed_roles(self) -> list[str]:
77
+ return self.Roles.values_list()
78
+
67
79
  @property
68
80
  def roles_has_admin(self) -> bool:
69
81
  return self.Roles.admin in self.roles
@@ -85,3 +97,78 @@ class UserDBM(SimpleDBM):
85
97
  roles = [roles]
86
98
  raise_for_type(roles, list)
87
99
  return bool(set(roles) & set(self.roles))
100
+
101
+ @property
102
+ def tg_first_name(self) -> str | None:
103
+ if self.tg_data and "first_name" in self.tg_data:
104
+ return self.tg_data["first_name"]
105
+ return None
106
+
107
+ @property
108
+ def sdp_tg_first_name(self) -> str | None:
109
+ return self.tg_first_name
110
+
111
+ @property
112
+ def tg_last_name(self) -> str | None:
113
+ if self.tg_data and "last_name" in self.tg_data:
114
+ return self.tg_data["last_name"]
115
+ return None
116
+
117
+ @property
118
+ def sdp_tg_last_name(self) -> str | None:
119
+ return self.tg_last_name
120
+
121
+ @property
122
+ def tg_language_code(self) -> str | None:
123
+ if self.tg_data and "language_code" in self.tg_data:
124
+ return self.tg_data["language_code"]
125
+ return None
126
+
127
+ @property
128
+ def sdp_tg_language_code(self) -> str | None:
129
+ return self.tg_language_code
130
+
131
+ @property
132
+ def tg_username(self) -> str | None:
133
+ if self.tg_data and "username" in self.tg_data:
134
+ return self.tg_data["username"]
135
+ return None
136
+
137
+ @property
138
+ def sdp_tg_username(self) -> str | None:
139
+ return self.tg_username
140
+
141
+ @property
142
+ def tg_at_username(self) -> str | None:
143
+ if self.tg_username:
144
+ return f"@{self.tg_username}"
145
+ return None
146
+
147
+ @property
148
+ def sdp_tg_at_username(self) -> str | None:
149
+ return self.tg_at_username
150
+
151
+ @property
152
+ def tg_fullname(self) -> str | None:
153
+ if not self.tg_first_name and not self.tg_last_name:
154
+ return None
155
+ res = ""
156
+ if self.tg_first_name:
157
+ res += self.tg_first_name
158
+ if self.tg_last_name:
159
+ res += " " + self.tg_last_name
160
+ return res
161
+
162
+ @property
163
+ def sdp_tg_fullname(self) -> str | None:
164
+ return self.tg_fullname
165
+
166
+ @property
167
+ def tg_link_by_username(self) -> str | None:
168
+ if not self.tg_username:
169
+ return None
170
+ return f"https://t.me/{self.tg_username}"
171
+
172
+ @property
173
+ def sdp_tg_link_by_username(self) -> str | None:
174
+ return self.tg_link_by_username
@@ -45,9 +45,14 @@ class UserTokenDBM(SimpleDBM):
45
45
  nullable=False
46
46
  )
47
47
 
48
+ # one to many
48
49
  user: Mapped[UserDBM] = relationship(
49
50
  "UserDBM",
50
51
  uselist=False,
51
52
  back_populates="user_tokens",
52
53
  foreign_keys=[user_id]
53
54
  )
55
+
56
+ def __repr__(self) -> str:
57
+ res = f"{self.entity_name} (id={self.id}, user_id={self.user_id})"
58
+ return res
@@ -14,7 +14,6 @@ def execute_arpakitlib_cli(*, full_command: str | None = None):
14
14
  full_command = " ".join(sys.argv)
15
15
 
16
16
  parsed_command = parse_command(text=full_command)
17
- parsed_command.raise_for_command(needed_command="arpakitlib", lower_=True)
18
17
 
19
18
  command = parsed_command.get_value_by_keys(keys=["command", "c"])
20
19
  if command:
@@ -2,9 +2,12 @@
2
2
 
3
3
  import asyncio
4
4
  import logging
5
- from typing import Optional
6
5
 
6
+ import httpx
7
7
  from openai import OpenAI, AsyncOpenAI
8
+ from openai.types.chat import ChatCompletion
9
+
10
+ from arpakitlib.ar_logging_util import setup_normal_logging
8
11
 
9
12
  _ARPAKIT_LIB_MODULE_VERSION = "3.0"
10
13
 
@@ -17,8 +20,8 @@ class OpenAIAPIClient:
17
20
  def __init__(
18
21
  self,
19
22
  *,
20
- open_ai: Optional[OpenAI] = None,
21
- async_open_ai: Optional[AsyncOpenAI] = None
23
+ open_ai: OpenAI,
24
+ async_open_ai: AsyncOpenAI
22
25
  ):
23
26
  self._logger = logging.getLogger(self.__class__.__name__)
24
27
 
@@ -47,27 +50,80 @@ class OpenAIAPIClient:
47
50
  self._logger.error(e)
48
51
  return False
49
52
 
53
+ def simple_ask(self, *, prompt: str | None = None, string: str) -> ChatCompletion:
54
+ messages = []
55
+ if prompt is not None:
56
+ messages.append({
57
+ "role": "system",
58
+ "content": prompt
59
+ })
60
+ messages.append({
61
+ "role": "user",
62
+ "content": string
63
+ })
64
+ response: ChatCompletion = self.open_ai.chat.completions.create(
65
+ model="gpt-4o",
66
+ messages=messages,
67
+ n=1,
68
+ temperature=0.1,
69
+ top_p=0.9,
70
+ max_tokens=300
71
+ )
72
+ return response
73
+
74
+ async def async_simple_ask(self, *, prompt: str | None = None, string: str) -> ChatCompletion:
75
+ messages = []
76
+ if prompt is not None:
77
+ messages.append({
78
+ "role": "system",
79
+ "content": prompt
80
+ })
81
+ messages.append({
82
+ "role": "user",
83
+ "content": string
84
+ })
85
+ response: ChatCompletion = await self.async_open_ai.chat.completions.create(
86
+ model="gpt-4o",
87
+ messages=messages,
88
+ n=1,
89
+ temperature=0.1,
90
+ top_p=0.9,
91
+ max_tokens=300
92
+ )
93
+ return response
50
94
 
51
- def __example():
52
- open_ai = OpenAI(api_key="your-api-key")
53
- client = OpenAIAPIClient(open_ai=open_ai)
54
95
 
55
- print("Checking OpenAI API connection...")
56
- if client.is_conn_good():
57
- print("Connection to OpenAI API is good")
58
- else:
59
- print("Failed to connect to OpenAI API")
96
+ def __example():
97
+ pass
60
98
 
61
99
 
62
100
  async def __async_example():
63
- async_open_ai = AsyncOpenAI(api_key="your-api-key")
64
- client = OpenAIAPIClient(async_open_ai=async_open_ai)
65
-
66
- print("Checking OpenAI API async connection...")
67
- if await client.async_is_conn_good():
68
- print("Async connection to OpenAI API is good")
69
- else:
70
- print("Failed to async connect to OpenAI API")
101
+ setup_normal_logging()
102
+ api_key = ""
103
+ base_url = "https://api.proxyapi.ru/openai/v1"
104
+ client = OpenAIAPIClient(
105
+ open_ai=OpenAI(
106
+ api_key=api_key,
107
+ base_url=base_url,
108
+ timeout=httpx.Timeout(
109
+ timeout=60,
110
+ )
111
+ ),
112
+ async_open_ai=AsyncOpenAI(
113
+ api_key=api_key,
114
+ base_url=base_url,
115
+ timeout=httpx.Timeout(
116
+ timeout=60,
117
+ )
118
+ )
119
+ )
120
+
121
+ print(await client.async_is_conn_good())
122
+
123
+ response = client.simple_ask(
124
+ string="Привет, проверяю тебя"
125
+ )
126
+ print(response.choices[0].message.content)
71
127
 
72
128
 
73
129
  if __name__ == '__main__':
@@ -4,8 +4,6 @@ import shlex
4
4
 
5
5
  from pydantic import BaseModel
6
6
 
7
- from arpakitlib.ar_enumeration_util import ValuesForParseType
8
-
9
7
  _ARPAKIT_LIB_MODULE_VERSION = "3.0"
10
8
 
11
9
 
@@ -19,15 +17,6 @@ class ParsedCommand(BaseModel):
19
17
  key_to_value: dict[str, str | None] = {}
20
18
  values_without_key: list[str] = []
21
19
 
22
- def raise_for_command(self, needed_command: str, lower_: bool = True):
23
- needed_command = needed_command.strip()
24
-
25
- if (
26
- (self.command.lower() if lower_ else self.command)
27
- != (needed_command.lower() if lower_ else needed_command)
28
- ):
29
- raise ValuesForParseType(f"needed_command != {self.command}, lower_={lower_}")
30
-
31
20
  @property
32
21
  def keys(self) -> list[str]:
33
22
  return [k for k, v in self.key_to_value.items() if v is not None]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arpakitlib
3
- Version: 1.8.33
3
+ Version: 1.8.35
4
4
  Summary: arpakitlib
5
5
  License: Apache-2.0
6
6
  Keywords: arpakitlib,arpakit,arpakit-company,arpakitcompany,arpakit_company
@@ -8,7 +8,7 @@ arpakitlib/_arpakit_project_template_v_5/alembic/env.py,sha256=Qesmnj5A2kB-Doeuf
8
8
  arpakitlib/_arpakit_project_template_v_5/alembic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
9
9
  arpakitlib/_arpakit_project_template_v_5/alembic/versions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  arpakitlib/_arpakit_project_template_v_5/alembic.ini,sha256=8fuyeEvGBiPGbxEFy8ISBV3xX_fgVmuhEGpB10_B5Uo,3733
11
- arpakitlib/_arpakit_project_template_v_5/arpakitlib_project_template_info.json,sha256=DDW2Aov9mTMDoz9NHR9_E7emwwetdBXETodF4UGZ6Co,97
11
+ arpakitlib/_arpakit_project_template_v_5/arpakitlib_project_template_info.json,sha256=1yBXVYHqWXXFkBgsR8s0cnmOUp-UPhfz4_AboylAxGI,97
12
12
  arpakitlib/_arpakit_project_template_v_5/command/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  arpakitlib/_arpakit_project_template_v_5/command/alembic_history.sh,sha256=OMnDNtHIksGh9iavWnzbtxcudZW4vjdcISsBXvzZSPw,22
14
14
  arpakitlib/_arpakit_project_template_v_5/command/alembic_revision_autogenerate.sh,sha256=yW2i-SBOtBx15Ya0poVQqKkJM5t2JZp06r9AEW-DmGE,46
@@ -219,12 +219,12 @@ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/__init__.py,sha2
219
219
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/const.py,sha256=dcvj5C9E2F2KCsGZPBBncQf_EvVJAC1qQgnyD8P4ZEw,6
220
220
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_db.py,sha256=1y3FaMFzm_5UM2poqtBve_UP_mh1vjs--krq6yO8PsA,742
221
221
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/__init__.py,sha256=btSjCQ7RJqomeXzYs9HePCu1dZHs0z6-RuboYKG89_8,598
222
- arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/api_key.py,sha256=RVkfa6kuhdv1D_3Qindh4bucapqz5MZa5gNkiYuwC14,1096
222
+ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/api_key.py,sha256=XBw5qVM6Qc5i5Sgercec90y2RhqhMZWouVXd1vTKay4,1310
223
223
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/common.py,sha256=xhMxNea8ndjmdsNwp_a9L_VUkkRb8jjVLhczxDasNss,2090
224
224
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/operation.py,sha256=0uhlkE95_lX8Nmgl2n5oJ7lty558Y6ZOoQc6lfuSyCY,3496
225
- arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/story_log.py,sha256=uB7nKEqvUKJyE_xybJUjXIJtVXh0IKyoPDnDUogq8lE,1306
226
- arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user.py,sha256=GaOJkxsQ6B3B4pO43_MOOrJSUE8d7VzXyYLQcoEvCCw,2355
227
- arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user_token.py,sha256=AtFEPQZlYl_fr0WgYkS8ToiHluNomXV02HDuD0nVjZw,1398
225
+ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/story_log.py,sha256=ScXzpiD0El5HE4hRxhIGbfnBRtAqye9-wTeRgo-KpnI,1510
226
+ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user.py,sha256=fojNxMRbfiv8RuhkUgOp-AZM4q2bdPZklTO_IjQscoo,4754
227
+ arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/sqlalchemy_model/user_token.py,sha256=CquJ6NHlBxUOP8NM8IjZSM1Vh8jaNC5fTO1yT38dR3w,1542
228
228
  arpakitlib/_arpakit_project_template_v_5/project/sqlalchemy_db_/util.py,sha256=QSA_nT6aWdtE412-Uj3VTd7yh3dzS4HugDK9FivjTPo,570
229
229
  arpakitlib/_arpakit_project_template_v_5/project/test_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
230
230
  arpakitlib/_arpakit_project_template_v_5/project/test_data/make_test_api_keys.py,sha256=RXIEB5zOFHtQ_B0t_JlQ0ihjFbkVtW7six6CLdxft3w,901
@@ -313,7 +313,7 @@ arpakitlib/ar_arpakit_lib_module_util.py,sha256=g9uWwTK2eEzmErqwYeVgXDYVMREN8m5C
313
313
  arpakitlib/ar_arpakit_project_template_util.py,sha256=5-o6eTmh-2DqsIqmo63SXw7ttExhmuAehMNc4s0GdtU,3278
314
314
  arpakitlib/ar_arpakit_schedule_uust_api_client_util.py,sha256=MRPaF31CRhYA45ldPnoRpaTPMazCJq0jbwDxW5rvMww,12937
315
315
  arpakitlib/ar_arpakit_schedule_uust_site_util.py,sha256=8wLct9Gd4MWkXzB6nSmETAwTPLw8lfpWgx0LoWSAOvg,1643
316
- arpakitlib/ar_arpakitlib_cli_util.py,sha256=--t-J019t-R35AZhi1cQyH5H8iHPiWeBjyH9Z5_Fg5o,2678
316
+ arpakitlib/ar_arpakitlib_cli_util.py,sha256=RJGcfEZ_q74FJ4tqdXvt7xQpShTszOvKu1mbp3D8qzw,2599
317
317
  arpakitlib/ar_base64_util.py,sha256=aZkg2cZTuAaP2IWeG_LXJ6RO7qhyskVwec-Lks0iM-k,676
318
318
  arpakitlib/ar_base_worker_util.py,sha256=eyaoDy4T_wKSNFu_npigVYZKHpxmt66Vdzb3gZ2BAis,5861
319
319
  arpakitlib/ar_blank_util.py,sha256=oMVsRr54dQpsiVSasmqvNR5-d5vARvVPOrfPqIgq2eI,143
@@ -340,8 +340,8 @@ arpakitlib/ar_list_util.py,sha256=2woOAHAU8oTIiVjZ8GLnx15odEaoQUq3Q0JPxlufFF0,45
340
340
  arpakitlib/ar_logging_util.py,sha256=GLw87L6qUASHS4-eAoBW0kN2hHXVdmWcmE9huw-J5aI,1681
341
341
  arpakitlib/ar_mongodb_util.py,sha256=2ECkTnGAZ92qxioL-fmN6R4yZOSr3bXdXLWTzT1C3vk,4038
342
342
  arpakitlib/ar_need_type_util.py,sha256=l4ky_15KKwqgYf2WTgEaKfBI15jZbnszOeQjwC0YUmk,2312
343
- arpakitlib/ar_openai_api_client_util.py,sha256=_XmlApvHFMSyjvZydPa_kASIt9LsFrZmSC7YEzIG8Bg,1806
344
- arpakitlib/ar_parse_command.py,sha256=-s61xcATIsfw1eV_iD3xi-grsitbGzSDoAFc5V0OFy4,3447
343
+ arpakitlib/ar_openai_api_client_util.py,sha256=dQv0rWnONkmI9bD2eUWihvutwIfp1oxsBJuHRQu27BU,3185
344
+ arpakitlib/ar_parse_command.py,sha256=1WTdQoWVshoDZ1jDaKeTzajfqaYHP3FNO0-REyo1aMY,3003
345
345
  arpakitlib/ar_postgresql_util.py,sha256=1AuLjEaa1Lg4pzn-ukCVnDi35Eg1k91APRTqZhIJAdo,945
346
346
  arpakitlib/ar_rat_func_util.py,sha256=Ca10o3RJwyx_DJLxjTxgHDO6NU3M6CWgUR4bif67OE4,2006
347
347
  arpakitlib/ar_retry_func_util.py,sha256=LB4FJRsu2cssnPw6X8bCEcaGpQsXhkLkgeU37w1t9fU,2250
@@ -358,8 +358,8 @@ arpakitlib/ar_type_util.py,sha256=Cs_tef-Fc5xeyAF54KgISCsP11NHyzIsglm4S3Xx7iM,40
358
358
  arpakitlib/ar_wata_api_client.py,sha256=gdHOqDbuqxhTjVDtRW1DvkRJLdDofCrOq51GTctzLns,242
359
359
  arpakitlib/ar_yookassa_api_client_util.py,sha256=VozuZeCJjmLd1zj2BdC9WfiAQ3XYOrIMsdpNK-AUlm0,5347
360
360
  arpakitlib/ar_zabbix_api_client_util.py,sha256=Q-VR4MvoZ9aHwZeYZr9G3LwN-ANx1T5KFmF6pvPM-9M,6402
361
- arpakitlib-1.8.33.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
362
- arpakitlib-1.8.33.dist-info/METADATA,sha256=i2biPan3zsYPCOx4MmEbGGbBHn5Tn4BYFIsESp9jNkI,3477
363
- arpakitlib-1.8.33.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
364
- arpakitlib-1.8.33.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
365
- arpakitlib-1.8.33.dist-info/RECORD,,
361
+ arpakitlib-1.8.35.dist-info/LICENSE,sha256=GPEDQMam2r7FSTYqM1mm7aKnxLaWcBotH7UvQtea-ec,11355
362
+ arpakitlib-1.8.35.dist-info/METADATA,sha256=Xr542pGeITbamcRcWnHqa0O79Vc86xtTi6KC0sIilWQ,3477
363
+ arpakitlib-1.8.35.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
364
+ arpakitlib-1.8.35.dist-info/entry_points.txt,sha256=36xqR3PJFT2kuwjkM_EqoIy0qFUDPKSm_mJaI7emewE,87
365
+ arpakitlib-1.8.35.dist-info/RECORD,,