agi-med-common 4.2.9__py3-none-any.whl → 4.2.11__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
- __version__ = "4.2.9"
1
+ __version__ = "4.2.11"
2
2
 
3
3
  from .logger import LogLevelEnum, logger_init, log_llm_error
4
4
  from .models import (
@@ -53,6 +53,9 @@ class FileStorage:
53
53
  def download(self, rid: ResourceId) -> bytes:
54
54
  return Path(rid).read_bytes()
55
55
 
56
+ def download_text(self, rid: ResourceId) -> str:
57
+ return Path(rid).read_text(encoding='utf-8')
58
+
56
59
  def is_valid(self, rid: ResourceId) -> bytes:
57
60
  return Path(rid).exists() and Path(rid).is_file()
58
61
 
@@ -0,0 +1,115 @@
1
+ from datetime import datetime
2
+ from typing import Any
3
+
4
+ from pydantic import Field, ConfigDict
5
+ from agi_med_common.models.widget import Widget
6
+
7
+ from .enums import ModerationLabelEnum, StateEnum, ActionEnum
8
+ from ._base import _Base
9
+
10
+
11
+ _DATETIME_FORMAT: str = "%Y-%m-%d-%H-%M-%S"
12
+ _EXAMPLE_DATETIME_0 = datetime(1970, 1, 1, 0, 0, 0)
13
+ _EXAMPLE_DATETIME: str = _EXAMPLE_DATETIME_0.strftime(_DATETIME_FORMAT)
14
+
15
+
16
+ class OuterContextItem(_Base):
17
+ # remove annoying warning for protected `model_` namespace
18
+ model_config = ConfigDict(protected_namespaces=())
19
+
20
+ sex: bool = Field(
21
+ False,
22
+ alias="Sex",
23
+ description="True = male, False = female",
24
+ examples=[True]
25
+ )
26
+ age: int = Field(0, alias="Age", examples=[20])
27
+ user_id: str = Field("", alias="UserId", examples=["123456789"])
28
+ parent_session_id: str | None = Field(
29
+ None,
30
+ alias="ParentSessionId",
31
+ examples=["987654320"]
32
+ )
33
+ session_id: str = Field("", alias="SessionId", examples=["987654321"])
34
+ client_id: str = Field("", alias="ClientId", examples=["543216789"])
35
+ track_id: str = Field(default="Consultation", alias="TrackId")
36
+ entrypoint_key: str = Field("", alias="EntrypointKey", examples=["giga"])
37
+
38
+ def create_id(self, short: bool = False, clean: bool = False) -> str:
39
+ uid, sid, cid = self.user_id, self.session_id, self.client_id
40
+ if short:
41
+ return f"{uid}_{sid}_{cid}"
42
+ if not clean:
43
+ return f"user_{uid}_session_{sid}_client_{cid}"
44
+ return f"user_{uid}_session_{sid}_client_{cid}_clean"
45
+
46
+ def to_dict(self) -> dict[str, Any]:
47
+ return self.model_dump(by_alias=True)
48
+
49
+
50
+ class ReplicaItem(_Base):
51
+ body: str = Field("", alias="Body", examples=["Привет"])
52
+ resource_id: str | None = Field(None, alias="ResourceId", examples=["<link-id>"])
53
+ widget: Widget | None = Field(None, alias="Widget", examples=[None])
54
+ command: dict | None = Field(None, alias="Command", examples=[None])
55
+ role: bool = Field(False, alias="Role", description="True = ai, False = client", examples=[False])
56
+ date_time: str = Field(
57
+ _EXAMPLE_DATETIME,
58
+ alias="DateTime",
59
+ examples=[_EXAMPLE_DATETIME],
60
+ description=f"Format: {_DATETIME_FORMAT}",
61
+ )
62
+ state: StateEnum = Field("EMPTY", alias="State", description="chat manager fsm state", examples=["COLLECTION"])
63
+ action: ActionEnum = Field("START", alias="Action", description="chat manager fsm action", examples=["DIAGNOSIS"])
64
+ moderation: ModerationLabelEnum = Field(
65
+ ModerationLabelEnum.OK,
66
+ alias="Moderation",
67
+ description="chat manager moderated outcome type",
68
+ examples=[ModerationLabelEnum.NON_MED],
69
+ )
70
+ extra: dict | None = Field(None, alias="Extra", examples=[None])
71
+
72
+ def to_dict(self) -> dict[str, Any]:
73
+ return self.model_dump(by_alias=True)
74
+
75
+ @staticmethod
76
+ def DATETIME_FORMAT() -> str:
77
+ return _DATETIME_FORMAT
78
+
79
+ def with_now_datetime(self):
80
+ dt = datetime.now().strftime(ReplicaItem.DATETIME_FORMAT())
81
+ return self.model_copy(update=dict(date_time=dt))
82
+
83
+
84
+ class InnerContextItem(_Base):
85
+ replicas: list[ReplicaItem] = Field(alias="Replicas")
86
+ attrs: dict[str, str | int] | None = Field(default={}, alias="Attrs")
87
+
88
+ def to_dict(self) -> dict[str, list]:
89
+ return self.model_dump(by_alias=True)
90
+
91
+
92
+ class ReplicaItemPair(_Base):
93
+ # remove annoying warning for protected `model_` namespace
94
+ model_config = ConfigDict(protected_namespaces=())
95
+
96
+ user_replica: ReplicaItem = Field(alias="UserReplica")
97
+ bot_replica: ReplicaItem = Field(alias="BotReplica")
98
+
99
+
100
+ class ChatItem(_Base):
101
+ outer_context: OuterContextItem = Field(alias="OuterContext")
102
+ inner_context: InnerContextItem = Field(alias="InnerContext")
103
+
104
+ def create_id(self, short: bool = False, clean: bool = False) -> str:
105
+ return self.outer_context.create_id(short, clean)
106
+
107
+ def to_dict(self) -> dict[str, Any]:
108
+ return self.model_dump(by_alias=True)
109
+
110
+ def update(self, replica_pair: ReplicaItemPair) -> None:
111
+ self.inner_context.replicas.append(replica_pair.user_replica)
112
+ self.inner_context.replicas.append(replica_pair.bot_replica)
113
+
114
+ def zip_history(self, field: str) -> list[Any]:
115
+ return [replica.to_dict().get(field, None) for replica in self.inner_context.replicas]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agi_med_common
3
- Version: 4.2.9
3
+ Version: 4.2.11
4
4
  Summary: Сommon for agi-med team
5
5
  Author: AGI-MED-TEAM
6
6
  Requires-Python: >=3.11
@@ -1,5 +1,5 @@
1
- agi_med_common/__init__.py,sha256=5KSML4nPmtbPIbePp_Cdjp0hPgVoRzVtQDMp8SnYHrM,708
2
- agi_med_common/file_storage.py,sha256=4GW0CU0YtVzWmxV6vGjZg0DfyEgjlrgLRsZ7cEP-6Qk,1659
1
+ agi_med_common/__init__.py,sha256=Vp254TnyEq5ms2wa8pY4mksfVPI_UwriJbj6O_qoXF4,709
2
+ agi_med_common/file_storage.py,sha256=yAP65qT0NbkaasFLhwnNzXOpd5vAetF3wP6Sbf_tbak,1766
3
3
  agi_med_common/parallel_map.py,sha256=Qx6xe7DqlEUDpSucp5Hm8r9y9Iquwh9JvX7lOqHhnOw,921
4
4
  agi_med_common/utils.py,sha256=42okDsaCIkxcBlBojyTOqPH1QUGkginjvgyPhSnRq9w,725
5
5
  agi_med_common/validators.py,sha256=vMoPN42XzC8re-zdjekk5_lNQYHuTiAWD56YLvj2Z2w,2824
@@ -9,16 +9,12 @@ agi_med_common/logger/log_level_enum.py,sha256=lWuSMho9I0v_xf1RuwpERx5o8NJXaavjw
9
9
  agi_med_common/logger/logger.py,sha256=-VU69ULbw2-pNpOcxKiMpOeRAPe6H-EsGV9WRTv1SUo,839
10
10
  agi_med_common/models/__init__.py,sha256=KXnXxD2c5v2TVXrc-n7gJipTAyvtMasbocxThINIojs,330
11
11
  agi_med_common/models/_base.py,sha256=qNdH8x3x3mYbo5XgWtR9VpEarxsEvXvzynadUlDvHmU,149
12
+ agi_med_common/models/chat_item.py,sha256=0-CWepFcFKEyJS-Vbq21xpwLO0wbdFYHiWGqA6UKFFI,4376
12
13
  agi_med_common/models/enums.py,sha256=RxPPbkW1NcHAGO-gHuzwIvOjv0_ZBsr9b1aq_wk4WFM,1313
13
14
  agi_med_common/models/widget.py,sha256=g7Bobyk_gANghGEhjDjvi4i-YRoHo5Bm1Pr4eF-zf0U,661
14
15
  agi_med_common/models/base_config_models/__init__.py,sha256=KjS_bSCka8BOMsigwcIML-e6eNB2ouMU6gxlhRmzeuY,44
15
16
  agi_med_common/models/base_config_models/gigachat_config.py,sha256=WNSCTO8Fjpxc1v2LRUHfKqo9aeMDpXltTHYBFgTD2N0,422
16
- agi_med_common/models/chat_item/__init__.py,sha256=NG1optUYwjnxfpTXntUfTDOA0eKTgdV43TZOcfHasHg,185
17
- agi_med_common/models/chat_item/chat_item.py,sha256=xP_uP14qK-u8z0ZUs2HFhhea-IP230UgOmjeqeC_N6Q,1180
18
- agi_med_common/models/chat_item/inner_context_item.py,sha256=2wIwDtZwicwhSyXeuOqH8-xONcskeEiw6QhjSnEEwZs,329
19
- agi_med_common/models/chat_item/outer_context_item.py,sha256=P2ulGbKnEXBJ50Ou-_p_qKCdO1lB4SUvdSu1ZG1yRdo,1213
20
- agi_med_common/models/chat_item/replica_item.py,sha256=cGnAyUxNM50004EWKc8q4nYvy9cqZ8fxPdTilja6fBU,2013
21
- agi_med_common-4.2.9.dist-info/METADATA,sha256=axCVcE7uged5BEl3_h_GSzNTlplY1Ed20rPr_vfC1fs,546
22
- agi_med_common-4.2.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
23
- agi_med_common-4.2.9.dist-info/top_level.txt,sha256=26o565jF_7wYQj7-YJfTedtT9yDxDcf8RNikOYuPq78,15
24
- agi_med_common-4.2.9.dist-info/RECORD,,
17
+ agi_med_common-4.2.11.dist-info/METADATA,sha256=jsQrpTz0nUWpKIYstKOHWL5Xwgtmw7O62RWlSEoL4zA,547
18
+ agi_med_common-4.2.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
19
+ agi_med_common-4.2.11.dist-info/top_level.txt,sha256=26o565jF_7wYQj7-YJfTedtT9yDxDcf8RNikOYuPq78,15
20
+ agi_med_common-4.2.11.dist-info/RECORD,,
@@ -1,4 +0,0 @@
1
- from .replica_item import ReplicaItem, ReplicaItemPair
2
- from .outer_context_item import OuterContextItem
3
- from .inner_context_item import InnerContextItem
4
- from .chat_item import ChatItem
@@ -1,34 +0,0 @@
1
- from pydantic import Field
2
- from typing import Any
3
-
4
- from . import OuterContextItem, InnerContextItem, ReplicaItemPair
5
- from ..enums import ActionEnum
6
- from .. import _Base
7
-
8
-
9
- class ChatItem(_Base):
10
- outer_context: OuterContextItem = Field(alias="OuterContext")
11
- inner_context: InnerContextItem = Field(alias="InnerContext")
12
-
13
- def create_id(self, short: bool = False, clean: bool = False) -> str:
14
- return self.outer_context.create_id(short, clean)
15
-
16
- def to_dict(self) -> dict[str, Any]:
17
- return self.model_dump(by_alias=True)
18
-
19
- def update(self, replica_pair: ReplicaItemPair) -> None:
20
- self.inner_context.replicas.append(replica_pair.user_replica)
21
- self.inner_context.replicas.append(replica_pair.bot_replica)
22
-
23
- def count_questions(self) -> int:
24
- return len(
25
- list(
26
- filter(
27
- lambda replica: replica.role and replica.action == ActionEnum.QUESTION,
28
- self.inner_context.replicas,
29
- )
30
- )
31
- )
32
-
33
- def zip_history(self, field: str) -> list[Any]:
34
- return [replica.to_dict().get(field, None) for replica in self.inner_context.replicas]
@@ -1,12 +0,0 @@
1
- from pydantic import Field
2
-
3
- from . import ReplicaItem
4
- from .. import _Base
5
-
6
-
7
- class InnerContextItem(_Base):
8
- replicas: list[ReplicaItem] = Field(alias="Replicas")
9
- attrs: dict[str, str | int] | None = Field(default={}, alias="Attrs")
10
-
11
- def to_dict(self) -> dict[str, list]:
12
- return self.model_dump(by_alias=True)
@@ -1,27 +0,0 @@
1
- from pydantic import Field, ConfigDict
2
- from typing import Any
3
-
4
- from .. import _Base
5
-
6
-
7
- class OuterContextItem(_Base):
8
- # remove annoying warning for protected `model_` namespace
9
- model_config = ConfigDict(protected_namespaces=())
10
-
11
- sex: bool = Field(False, alias="Sex", description="True = male, False = female", examples=[True])
12
- age: int = Field(0, alias="Age", examples=[20])
13
- user_id: str = Field("", alias="UserId", examples=["123456789"])
14
- session_id: str = Field("", alias="SessionId", examples=["987654321"])
15
- client_id: str = Field("", alias="ClientId", examples=["543216789"])
16
- track_id: str = Field(default="Consultation", alias="TrackId")
17
- entrypoint_key: str = Field("", alias="EntrypointKey", examples=["giga"])
18
-
19
- def create_id(self, short: bool = False, clean: bool = False) -> str:
20
- if short:
21
- return f"{self.user_id}_{self.session_id}_{self.client_id}"
22
- if not clean:
23
- return f"user_{self.user_id}_session_{self.session_id}_client_{self.client_id}"
24
- return f"user_{self.user_id}_session_{self.session_id}_client_{self.client_id}_clean"
25
-
26
- def to_dict(self) -> dict[str, Any]:
27
- return self.model_dump(by_alias=True)
@@ -1,53 +0,0 @@
1
- from datetime import datetime
2
- from typing import Any
3
-
4
- from pydantic import Field, ConfigDict
5
-
6
- from .. import _Base
7
- from ..enums import StateEnum, ActionEnum, ModerationLabelEnum
8
- from agi_med_common.models.widget import Widget
9
-
10
-
11
- _DATETIME_FORMAT: str = "%Y-%m-%d-%H-%M-%S"
12
- _EXAMPLE_DATETIME: str = datetime(1970, 1, 1, 0, 0, 0).strftime(_DATETIME_FORMAT)
13
-
14
-
15
- class ReplicaItem(_Base):
16
- body: str = Field("", alias="Body", examples=["Привет"])
17
- resource_id: str | None = Field(None, alias="ResourceId", examples=["<link-id>"])
18
- widget: Widget | None = Field(None, alias="Widget", examples=[None])
19
- command: dict | None = Field(None, alias="Command", examples=[None])
20
- role: bool = Field(False, alias="Role", description="True = ai, False = client", examples=[False])
21
- date_time: str = Field(
22
- _EXAMPLE_DATETIME,
23
- alias="DateTime",
24
- examples=[_EXAMPLE_DATETIME],
25
- description=f"Format: {_DATETIME_FORMAT}",
26
- )
27
- state: StateEnum = Field("EMPTY", alias="State", description="chat manager fsm state", examples=["COLLECTION"])
28
- action: ActionEnum = Field("START", alias="Action", description="chat manager fsm action", examples=["DIAGNOSIS"])
29
- moderation: ModerationLabelEnum = Field(
30
- ModerationLabelEnum.OK,
31
- alias="Moderation",
32
- description="chat manager moderated outcome type",
33
- examples=[ModerationLabelEnum.NON_MED],
34
- )
35
-
36
- def to_dict(self) -> dict[str, Any]:
37
- return self.model_dump(by_alias=True)
38
-
39
- @staticmethod
40
- def DATETIME_FORMAT() -> str:
41
- return _DATETIME_FORMAT
42
-
43
- def with_now_datetime(self):
44
- dt = datetime.now().strftime(ReplicaItem.DATETIME_FORMAT())
45
- return self.model_copy(update=dict(date_time=dt))
46
-
47
-
48
- class ReplicaItemPair(_Base):
49
- # remove annoying warning for protected `model_` namespace
50
- model_config = ConfigDict(protected_namespaces=())
51
-
52
- user_replica: ReplicaItem = Field(alias="UserReplica")
53
- bot_replica: ReplicaItem = Field(alias="BotReplica")