agi-med-common 3.2.1__py3-none-any.whl → 3.3.1__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__ = "3.2.1"
1
+ __version__ = "3.3.1"
2
2
 
3
3
  from .logger import LogLevelEnum, logger_init
4
4
  from .models import (
@@ -11,9 +11,8 @@ from .models import (
11
11
  InnerContextItem,
12
12
  OuterContextItem,
13
13
  ReplicaItem,
14
- ChatItemWithState,
15
- InnerContextWithState,
16
- ReplicaWithState,
14
+ ReplicaItemPair,
17
15
  )
18
16
  from .utils import make_session_id, read_json, replace_n
19
17
  from .validators import is_file_exist, validate_prompt
18
+ from .xml_parser import XMLParser
@@ -7,7 +7,7 @@ from . import LogLevelEnum
7
7
 
8
8
  def logger_init(log_level: LogLevelEnum) -> None:
9
9
  logger.remove()
10
- extra = {"request_id": "NOT_A_REQUEST"}
10
+ extra = {"request_id": "SYSTEM_REQUEST"}
11
11
  format_ = "{time:DD-MM-YYYY HH:mm:ss} | <level>{level: <8}</level> | {extra[request_id]}"
12
12
  format_ = f"{format_} | <level>{{message}}</level>"
13
13
  logger.add(sys.stdout, colorize=True, format=format_, level=log_level)
@@ -1,5 +1,5 @@
1
1
  from ._base import _Base
2
2
  from .enums import TrackIdEnum, StateEnum, MTRSLabelEnum, ActionEnum, ModerationLabelEnum
3
- from .chat_item import ChatItem, OuterContextItem, InnerContextItem, ReplicaItem
3
+ from .chat_item import ChatItem, OuterContextItem, InnerContextItem, ReplicaItem, ReplicaItemPair
4
4
  from .chat_item_with_state import ChatItemWithState, InnerContextWithState, ReplicaWithState
5
5
  from .base_config_models import GigaChatConfig
@@ -1,4 +1,4 @@
1
- from .replica_item import ReplicaItem
1
+ from .replica_item import ReplicaItem, ReplicaItemPair
2
2
  from .outer_context_item import OuterContextItem
3
3
  from .inner_context_item import InnerContextItem
4
4
  from .chat_item import ChatItem
@@ -1,9 +1,34 @@
1
1
  from pydantic import Field
2
+ from typing import Any
2
3
 
3
- from . import OuterContextItem, InnerContextItem
4
+ from . import OuterContextItem, InnerContextItem, ReplicaItemPair
5
+ from ..enums import ActionEnum
4
6
  from .. import _Base
5
7
 
6
8
 
7
9
  class ChatItem(_Base):
8
10
  outer_context: OuterContextItem = Field(alias="OuterContext")
9
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.model_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]
@@ -6,3 +6,6 @@ from .. import _Base
6
6
 
7
7
  class InnerContextItem(_Base):
8
8
  replicas: list[ReplicaItem] = Field(alias="Replicas")
9
+
10
+ def to_dict(self) -> dict[str, list]:
11
+ return self.model_dump(by_alias=True)
@@ -1,4 +1,5 @@
1
1
  from pydantic import Field
2
+ from typing import Any
2
3
 
3
4
  from .. import _Base
4
5
  from ..enums import TrackIdEnum
@@ -10,9 +11,14 @@ class OuterContextItem(_Base):
10
11
  user_id: str = Field("", alias="UserId", examples=["123456789"])
11
12
  session_id: str = Field("", alias="SessionId", examples=["987654321"])
12
13
  client_id: str = Field("", alias="ClientId", examples=["543216789"])
13
- track_id: TrackIdEnum = Field(TrackIdEnum.DIAGNOSTIC, alias="TrackId")
14
+ track_id: TrackIdEnum = Field(TrackIdEnum.CONSULTATION, alias="TrackId")
14
15
 
15
- def create_id(self, short: bool = False) -> str:
16
+ def create_id(self, short: bool = False, clean: bool = False) -> str:
16
17
  if short:
17
18
  return f"{self.user_id}_{self.session_id}_{self.client_id}"
18
- return f"user_{self.user_id}_session_{self.session_id}_client_{self.client_id}"
19
+ if not clean:
20
+ return f"user_{self.user_id}_session_{self.session_id}_client_{self.client_id}"
21
+ return f"user_{self.user_id}_session_{self.session_id}_client_{self.client_id}_clean"
22
+
23
+ def to_dict(self) -> dict[str, Any]:
24
+ return self.model_dump(by_alias=True)
@@ -1,31 +1,35 @@
1
1
  from datetime import datetime
2
+ from typing import Any
2
3
 
3
- from pydantic import Field, field_validator, field_serializer
4
+ from pydantic import Field
4
5
 
5
6
  from .. import _Base
7
+ from ..enums import StateEnum, ActionEnum
6
8
 
7
9
  _TIME_FORMAT: str = "%Y-%m-%d-%H-%M-%S"
8
- _EXAMPLE_DATETIME: datetime = datetime(1970, 1, 1, 0, 0, 0)
10
+ _EXAMPLE_DATETIME: str = datetime(1970, 1, 1, 0, 0, 0).strftime(_TIME_FORMAT)
9
11
 
10
12
 
11
13
  class ReplicaItem(_Base):
12
14
  body: str = Field("", alias="Body", examples=["Привет"])
13
15
  role: bool = Field(False, alias="Role", description="True = ai, False = client", examples=[False])
14
- date_time: datetime = Field(
16
+ date_time: str = Field(
15
17
  _EXAMPLE_DATETIME,
16
18
  alias="DateTime",
17
- examples=[_EXAMPLE_DATETIME.strftime(_TIME_FORMAT)],
19
+ examples=[_EXAMPLE_DATETIME],
18
20
  description=f"Format: {_TIME_FORMAT}",
19
21
  )
20
- previous_score: float | None = Field(None, alias="PreviousScore", exclude=True, deprecated=True)
21
-
22
- @field_validator("date_time", mode="before")
23
- @classmethod
24
- def convert_date_time(cls, timestamp: str | datetime) -> datetime:
25
- if isinstance(timestamp, datetime):
26
- return timestamp
27
- return datetime.strptime(timestamp, _TIME_FORMAT)
28
-
29
- @field_serializer("date_time")
30
- def serialize_date_time(self, timestamp: datetime) -> str:
31
- return timestamp.strftime(_TIME_FORMAT)
22
+ state: StateEnum = Field(
23
+ StateEnum.EMPTY, alias="State", description="chat manager fsm state", examples=[StateEnum.COLLECTION]
24
+ )
25
+ action: ActionEnum = Field(
26
+ ActionEnum.START, alias="Action", description="chat manager fsm action", examples=[ActionEnum.DIAGNOSIS]
27
+ )
28
+
29
+ def to_dict(self) -> dict[str, Any]:
30
+ return self.model_dump(by_alias=True)
31
+
32
+
33
+ class ReplicaItemPair(_Base):
34
+ user_replica: ReplicaItem = Field(alias="UserReplica")
35
+ model_replica: ReplicaItem = Field(alias="ModelReplica")
@@ -0,0 +1,17 @@
1
+ import re
2
+
3
+
4
+ class XMLParser:
5
+ @staticmethod
6
+ def make_xml(body: str, tag: str) -> str:
7
+ return f"<{tag}>{body}</{tag}>"
8
+
9
+ @staticmethod
10
+ def remove_xml(text: str) -> str:
11
+ re_xml = re.compile(r"<(.*?)>")
12
+ return re.sub(re_xml, "", text).replace(" ", " ").strip()
13
+
14
+ @staticmethod
15
+ def get_tag_list(response: str, tag: str) -> list[str]:
16
+ tag_content = re.findall(f"<{tag}>(.*?)</{tag}>", response, re.DOTALL)
17
+ return [content.lower().strip() for content in tag_content]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: agi_med_common
3
- Version: 3.2.1
3
+ Version: 3.3.1
4
4
  Summary: Сommon for agi-med team
5
5
  Author: AGI-MED-TEAM
6
6
  Requires-Python: >=3.11
@@ -0,0 +1,26 @@
1
+ agi_med_common/__init__.py,sha256=x2GH-mmgggvXfhat4sDBZqwYjHqvjzspwSHoLZLsQlk,427
2
+ agi_med_common/utils.py,sha256=4GV1yNZiRG3KYOh859dvOZI899z7_s_YN3aXzthMgwU,399
3
+ agi_med_common/validators.py,sha256=R678gjPp-5XbnocRuEtdOQgJyCCOurxwaOe2nT04kSg,705
4
+ agi_med_common/xml_parser.py,sha256=1MYE9yajX1Enrn0A6DD1cXagZuYdjCvp3vN4D8fIge4,523
5
+ agi_med_common/logger/__init__.py,sha256=RW_0VZtbeJ4RsLqUXZUQWl5CtV9g840rU7qRlf5u49E,96
6
+ agi_med_common/logger/log_level_enum.py,sha256=lWuSMho9I0v_xf1RuwpERx5o8NJXaavjwxSdh8fxMqE,477
7
+ agi_med_common/logger/logger.py,sha256=u1qjQXsE1a1-YZ7iWuypzPnJ0e2rB6HVVrtiUGnoERo,843
8
+ agi_med_common/models/__init__.py,sha256=ODfLq-mVK4-94TAjufH00YjFB1HKlMy0x0Jhw4_VfDg,353
9
+ agi_med_common/models/_base.py,sha256=qNdH8x3x3mYbo5XgWtR9VpEarxsEvXvzynadUlDvHmU,149
10
+ agi_med_common/models/base_config_models/__init__.py,sha256=KjS_bSCka8BOMsigwcIML-e6eNB2ouMU6gxlhRmzeuY,44
11
+ agi_med_common/models/base_config_models/gigachat_config.py,sha256=WNSCTO8Fjpxc1v2LRUHfKqo9aeMDpXltTHYBFgTD2N0,422
12
+ agi_med_common/models/chat_item/__init__.py,sha256=NG1optUYwjnxfpTXntUfTDOA0eKTgdV43TZOcfHasHg,185
13
+ agi_med_common/models/chat_item/chat_item.py,sha256=Ym-afB9-7NI6QquhMPqd2ZBkbcx-Txr-ZiXwn0PTO-0,1182
14
+ agi_med_common/models/chat_item/inner_context_item.py,sha256=YXmlNLabKN3O84UWJENsjfdtPq2XRH1VqKiyIxS-p64,255
15
+ agi_med_common/models/chat_item/outer_context_item.py,sha256=IzrwhqbLKR8ZF8-Sd2CyNSa0eqb21NQH7LUqkg9se2Y,1046
16
+ agi_med_common/models/chat_item/replica_item.py,sha256=1BIKdqVfpWoWQP6xhtfr2c__Z-LJVDOkGcy5gbGQ_DA,1171
17
+ agi_med_common/models/enums/__init__.py,sha256=7TyOshcmklii1Cvx76Kxw4Ly9Wei2hsX1aHk6kzkVrY,207
18
+ agi_med_common/models/enums/action_enum.py,sha256=ZZtSBlOsQWvJ1UYqmsMsVLrzO1kJdImqJMqI0_KSV9M,287
19
+ agi_med_common/models/enums/moderation_label_enum.py,sha256=Ixz-7_6RneNwGzDzO9pV38V6ZutUQa2pUS2torMDY8s,271
20
+ agi_med_common/models/enums/mtrs_label_enum.py,sha256=6emBndt3SCsQVZZFKQYCV2_iyjjmZEhwejJKJu39ZAw,257
21
+ agi_med_common/models/enums/state_enum.py,sha256=p7XhDxBxPeeSgbLWitq6JpJLKntS3XMHon_EevbnhEs,163
22
+ agi_med_common/models/enums/track_id_enum.py,sha256=YoP15BTGjaFDxCOtjsqfwuMTW-BhcaQyEdxLfK7RQUA,454
23
+ agi_med_common-3.3.1.dist-info/METADATA,sha256=s9JQvs_Sy6XqY6-3zamsq9_tEQuhJnAl8dxUnqSYVJs,520
24
+ agi_med_common-3.3.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
25
+ agi_med_common-3.3.1.dist-info/top_level.txt,sha256=26o565jF_7wYQj7-YJfTedtT9yDxDcf8RNikOYuPq78,15
26
+ agi_med_common-3.3.1.dist-info/RECORD,,
@@ -1,3 +0,0 @@
1
- from .replica_with_state import ReplicaWithState
2
- from .inner_context_with_state import InnerContextWithState
3
- from .chat_with_state import ChatItemWithState
@@ -1,8 +0,0 @@
1
- from ..chat_item import ChatItem
2
- from pydantic import Field
3
-
4
- from . import InnerContextWithState
5
-
6
-
7
- class ChatItemWithState(ChatItem):
8
- inner_context: InnerContextWithState = Field(alias="InnerContext")
@@ -1,8 +0,0 @@
1
- from ..chat_item import InnerContextItem
2
- from pydantic import Field
3
-
4
- from . import ReplicaWithState
5
-
6
-
7
- class InnerContextWithState(InnerContextItem):
8
- replicas: list[ReplicaWithState] = Field(alias="Replicas")
@@ -1,8 +0,0 @@
1
- from ..chat_item import ReplicaItem
2
- from pydantic import Field
3
-
4
- from ..enums import StatesEnum
5
-
6
-
7
- class ReplicaWithState(ReplicaItem):
8
- state: StatesEnum | None = Field(None, alias="State")
@@ -1,29 +0,0 @@
1
- agi_med_common/__init__.py,sha256=uY4L-vBlFDl44XcDzT9bA281p_JW7129mwccpsY-npQ,444
2
- agi_med_common/utils.py,sha256=4GV1yNZiRG3KYOh859dvOZI899z7_s_YN3aXzthMgwU,399
3
- agi_med_common/validators.py,sha256=R678gjPp-5XbnocRuEtdOQgJyCCOurxwaOe2nT04kSg,705
4
- agi_med_common/logger/__init__.py,sha256=RW_0VZtbeJ4RsLqUXZUQWl5CtV9g840rU7qRlf5u49E,96
5
- agi_med_common/logger/log_level_enum.py,sha256=lWuSMho9I0v_xf1RuwpERx5o8NJXaavjwxSdh8fxMqE,477
6
- agi_med_common/logger/logger.py,sha256=_tmBPpZr1UaIycYzuvwrnPrVeu5kcwJBXSbTb7InGjI,842
7
- agi_med_common/models/__init__.py,sha256=ebG_iVj_cQ8Em6pdsLarl8zSfotEF3KBV1XMpDyS5YY,336
8
- agi_med_common/models/_base.py,sha256=qNdH8x3x3mYbo5XgWtR9VpEarxsEvXvzynadUlDvHmU,149
9
- agi_med_common/models/base_config_models/__init__.py,sha256=KjS_bSCka8BOMsigwcIML-e6eNB2ouMU6gxlhRmzeuY,44
10
- agi_med_common/models/base_config_models/gigachat_config.py,sha256=WNSCTO8Fjpxc1v2LRUHfKqo9aeMDpXltTHYBFgTD2N0,422
11
- agi_med_common/models/chat_item/__init__.py,sha256=MoZFnZQV-tWJTHmH1OhRBRkrc5cGWAfdJ6QfHDg6TDk,168
12
- agi_med_common/models/chat_item/chat_item.py,sha256=aCRR4OwL-YS6hvVSNkIg7FNpfvEGo8BESCY8BhiAlNk,255
13
- agi_med_common/models/chat_item/inner_context_item.py,sha256=s17frAcwyi8WcHnBt-5LF8nUJeO-hnu7YMobYQO5a-c,166
14
- agi_med_common/models/chat_item/outer_context_item.py,sha256=IprCIh8ki3PUueFwdmPw-MYn0-prx_G523Y-IXN62ZY,792
15
- agi_med_common/models/chat_item/replica_item.py,sha256=_OvnGmbP-wzxi16c6FGz-_Y-QtudV1Pi6I-zCJ7aQfA,1131
16
- agi_med_common/models/chat_item_with_state/__init__.py,sha256=KrXgsvJnLzS1kSi9_Y1z6_egxIqKL7epY1r-PIyrnno,156
17
- agi_med_common/models/chat_item_with_state/chat_with_state.py,sha256=IgZh0CRoar56eM8QOblPx8tsIm9NPO5tOj0mVC8yj40,205
18
- agi_med_common/models/chat_item_with_state/inner_context_with_state.py,sha256=qIwqCHn-JuQemcVQqLDzkpuaPRNCjIL_-h1wm1Jv5WU,212
19
- agi_med_common/models/chat_item_with_state/replica_with_state.py,sha256=YvUcCo1HTfxYUEwZ5T7UqLW2WkZ8SFvVNQZf-5mK5Dg,192
20
- agi_med_common/models/enums/__init__.py,sha256=7TyOshcmklii1Cvx76Kxw4Ly9Wei2hsX1aHk6kzkVrY,207
21
- agi_med_common/models/enums/action_enum.py,sha256=ZZtSBlOsQWvJ1UYqmsMsVLrzO1kJdImqJMqI0_KSV9M,287
22
- agi_med_common/models/enums/moderation_label_enum.py,sha256=Ixz-7_6RneNwGzDzO9pV38V6ZutUQa2pUS2torMDY8s,271
23
- agi_med_common/models/enums/mtrs_label_enum.py,sha256=6emBndt3SCsQVZZFKQYCV2_iyjjmZEhwejJKJu39ZAw,257
24
- agi_med_common/models/enums/state_enum.py,sha256=p7XhDxBxPeeSgbLWitq6JpJLKntS3XMHon_EevbnhEs,163
25
- agi_med_common/models/enums/track_id_enum.py,sha256=YoP15BTGjaFDxCOtjsqfwuMTW-BhcaQyEdxLfK7RQUA,454
26
- agi_med_common-3.2.1.dist-info/METADATA,sha256=NH-OaoLWdsngpKmpcehrQAq3gqxPbFqzd4h67ZJ7Eck,520
27
- agi_med_common-3.2.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
28
- agi_med_common-3.2.1.dist-info/top_level.txt,sha256=26o565jF_7wYQj7-YJfTedtT9yDxDcf8RNikOYuPq78,15
29
- agi_med_common-3.2.1.dist-info/RECORD,,