chenpei d0dc94e36d feat: 将弹幕功能替换为AI聊天助手
新功能:
- 创建AI聊天助手组件(AIChatWidget)
- 支持文字+图片多模态对话
- 集成Gemini AI API
- 支持图片编辑和内容生成
- 实时对话历史管理
- 优雅的UI设计,支持黑夜模式

技术实现:
- 后端API代理Gemini API(/api/ai-chat)
- 支持最多5张图片上传
- 流式响应处理
- 对话历史管理
- Base64图片处理

配置:
- 在.env中添加Gemini API配置
- GEMINI_API_KEY
- GEMINI_API_BASE_URL
- GEMINI_MODEL

替换原弹幕功能,提供更强大的AI助手体验!
2025-10-27 17:45:37 +08:00

984 lines
28 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# coding=utf-8
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import json
import struct
from volcengine.tls.util import TLSUtil
try:
import lz4.block as lz4
except ImportError:
try:
import lz4
except ImportError:
lz4 = None
try:
import zlib
except ImportError:
zlib = None
from requests import Response
from volcengine.tls.log_pb2 import LogGroupList
from volcengine.tls.data import *
from volcengine.tls.tls_exception import TLSException
class TLSResponse:
def __init__(self, response: Response):
self.headers = response.headers
self.request_id = response.headers[X_TLS_REQUEST_ID]
if "json" in self.headers[CONTENT_TYPE]:
if response.text != "":
self.response = json.loads(response.text)
else:
self.response = {}
else:
self.response = {DATA: response.content}
def get_headers(self):
"""
:return: 请求headers
:rtype: dict
"""
return self.headers
def get_request_id(self):
"""
:return: tls请求id
:rtype: str
"""
return self.request_id
@staticmethod
def _get_host_group_hosts_rules_info(host_group_hosts_rules_info) -> HostGroupHostsRulesInfo:
host_group_hosts_rules_info[HOST_GROUP_INFO] = \
HostGroupInfo.set_attributes(data=host_group_hosts_rules_info[HOST_GROUP_INFO])
host_group_info = host_group_hosts_rules_info[HOST_GROUP_INFO]
host_infos = []
for i in range(len(host_group_hosts_rules_info[HOST_INFOS])):
host_infos.append((HostInfo.set_attributes(data=host_group_hosts_rules_info[HOST_INFOS][i])))
rule_infos = []
for i in range(len(host_group_hosts_rules_info[RULE_INFOS])):
rule_infos.append(RuleInfo.set_attributes(data=host_group_hosts_rules_info[RULE_INFOS][i]))
return HostGroupHostsRulesInfo(host_group_info, host_infos, rule_infos)
class CreateProjectResponse(TLSResponse):
def __init__(self, response: Response):
super(CreateProjectResponse, self).__init__(response)
self.project_id = self.response[PROJECT_ID]
def get_project_id(self):
"""
:return:日志项目id
:rtype: str
"""
return self.project_id
class DeleteProjectResponse(TLSResponse):
def __init__(self, response: Response):
super(DeleteProjectResponse, self).__init__(response)
class ModifyProjectResponse(TLSResponse):
def __init__(self, response: Response):
super(ModifyProjectResponse, self).__init__(response)
class DescribeProjectResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeProjectResponse, self).__init__(response)
self.project = ProjectInfo.set_attributes(data=self.response)
def get_project(self):
"""
:return: 日志项目
:rtype: ProjectInfo
"""
return self.project
class DescribeProjectsResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeProjectsResponse, self).__init__(response)
self.total = self.response[TOTAL]
self.projects = []
projects = self.response[PROJECTS]
for i in range(len(projects)):
self.projects.append(ProjectInfo.set_attributes(data=projects[i]))
def get_total(self):
"""
:return: project总数
:rtype: int
"""
return self.total
def get_projects(self):
"""
:return: 日志项目列表
:rtype: List[ProjectInfo]
"""
return self.projects
class CreateTopicResponse(TLSResponse):
def __init__(self, response: Response):
super(CreateTopicResponse, self).__init__(response)
self.topic_id = self.response[TOPIC_ID]
def get_topic_id(self):
"""
:return: 日志主题 ID
:rtype: str
"""
return self.topic_id
class DeleteTopicResponse(TLSResponse):
def __init__(self, response: Response):
super(DeleteTopicResponse, self).__init__(response)
class ModifyTopicResponse(TLSResponse):
def __init__(self, response: Response):
super(ModifyTopicResponse, self).__init__(response)
class DescribeTopicResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeTopicResponse, self).__init__(response)
self.topic = TopicInfo.set_attributes(data=self.response)
def get_topic(self):
"""
:return: 日志主题
:rtype: TopicInfo
"""
return self.topic
class DescribeTopicsResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeTopicsResponse, self).__init__(response)
self.total = self.response[TOTAL]
topics = self.response[TOPICS]
self.topics = []
for i in range(len(topics)):
self.topics.append(TopicInfo.set_attributes(data=topics[i]))
def get_total(self):
"""
:return: topic总数
:rtype: int
"""
return self.total
def get_topics(self):
"""
:return: topic列表
:rtype: List[TopicInfo]
"""
return self.topics
class CreateIndexResponse(TLSResponse):
def __init__(self, response: Response):
super(CreateIndexResponse, self).__init__(response)
self.topic_id = self.response[TOPIC_ID]
class DeleteIndexResponse(TLSResponse):
def __init__(self, response: Response):
super(DeleteIndexResponse, self).__init__(response)
class ModifyIndexResponse(TLSResponse):
def __init__(self, response: Response):
super(ModifyIndexResponse, self).__init__(response)
class DescribeIndexResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeIndexResponse, self).__init__(response)
self.full_text = FullTextInfo()
if self.response[FULL_TEXT] is not None:
self.full_text = FullTextInfo.set_attributes(data=self.response[FULL_TEXT])
self.full_text.delimiter = TLSUtil.replace_white_space_character(self.full_text.delimiter)
self.key_value = []
key_value = self.response[KEY_VALUE]
for i in range(len(key_value)):
self.key_value.append(KeyValueInfo(key=key_value[i][KEY],
value=ValueInfo.set_attributes(data=key_value[i][VALUE])))
self.key_value[i].value.delimiter = TLSUtil.replace_white_space_character(self.key_value[i].value.delimiter)
self.user_inner_key_value = []
user_inner_key_value = self.response[USER_INNER_KEY_VALUE]
for i in range(len(user_inner_key_value)):
self.user_inner_key_value.append(KeyValueInfo(key=user_inner_key_value[i][KEY],
value=ValueInfo.set_attributes(data=user_inner_key_value[i][VALUE])))
self.user_inner_key_value[i].value.delimiter = TLSUtil.replace_white_space_character(self.user_inner_key_value[i].value.delimiter)
self.create_time = self.response[CREATE_TIME]
self.modify_time = self.response[MODIFY_TIME]
def get_create_time(self):
"""
:return: 创建时间
:rtype: str
"""
return self.create_time
def get_full_text(self):
"""
:return: 全文索引配置
:rtype: FullTextInfo
"""
return self.full_text
def get_modify_time(self):
"""
:return: 修改时间
:rtype: str
"""
return self.modify_time
def get_key_value(self):
"""
:return: 键值索引配置
:rtype: List[KeyValueInfo]
"""
return self.key_value
def get_user_inner_key_value(self):
"""
:return: 预留字段索引配置
:rtype: List[KeyValueInfo]
"""
return self.user_inner_key_value
class PutLogsResponse(TLSResponse):
def __init__(self, response: Response):
super(PutLogsResponse, self).__init__(response)
class DescribeCursorResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeCursorResponse, self).__init__(response)
self.cursor = self.response[CURSOR]
def get_cursor(self):
"""
:return: 游标
:rtype: str
"""
return self.cursor
class ConsumeLogsResponse(TLSResponse):
def __init__(self, response: Response, compression: str):
super(ConsumeLogsResponse, self).__init__(response)
self.x_tls_cursor = self.headers[X_TLS_CURSOR]
self.x_tls_count = int(self.headers[X_TLS_COUNT])
self.pb_message = None
if DATA in self.response:
pb_message = self.response[DATA]
if compression == LZ4:
pb_message = lz4.decompress(struct.pack('<I', int(self.headers[X_TLS_BODYRAWSIZE])) + pb_message)
if compression == ZLIB:
pb_message = zlib.decompress(pb_message)
self.pb_message = LogGroupList()
self.pb_message.ParseFromString(pb_message)
def get_x_tls_count(self):
"""
:return: 本次读取的 logGroup 数量
:rtype: int
"""
return self.x_tls_count
def get_pb_message(self):
"""
:return:日志数据
:rtype:LogGroupList
"""
return self.pb_message
def get_x_tls_cursor(self):
"""
:return: 当前读取数据下一条 Cursor
:rtype: str
"""
return self.x_tls_cursor
class SearchLogsResponse(TLSResponse):
def __init__(self, response: Response):
super(SearchLogsResponse, self).__init__(response)
self.search_result = SearchResult.set_attributes(data=self.response)
def get_search_result(self):
"""
:return: 搜索结果
:rtype: SearchResult
"""
return self.search_result
class DescribeLogContextResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeLogContextResponse, self).__init__(response)
self.log_context_infos = self.response[LOG_CONTEXT_INFOS]
self.prev_over = self.response[PREV_OVER]
self.next_over = self.response[NEXT_OVER]
def get_prev_over(self):
"""
:return:除 LogContextInfos 中的日志以外,是否还存在其他上文
:rtype:bool
"""
return self.prev_over
def get_log_context_infos(self):
"""
:return:日志的上下文日志信息
:rtype:List[dict]
"""
return self.log_context_infos
def get_next_over(self):
"""
:return:除 LogContextInfos 中的日志以外,是否还存在其他下文
:rtype:bool
"""
return self.next_over
class WebTracksResponse(TLSResponse):
def __init__(self, response: Response):
super(WebTracksResponse, self).__init__(response)
class DescribeHistogramResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeHistogramResponse, self).__init__(response)
self.result_status = self.response[RESULT_STATUS]
self.interval = self.response[INTERVAL]
self.total_count = self.response[TOTAL_COUNT]
self.histogram = []
histogram = self.response[HISTOGRAM]
for i in range(len(histogram)):
self.histogram.append(HistogramInfo.set_attributes(data=histogram[i]))
def get_histogram(self):
"""
:return:所有子区间的结果集
:rtype:List[HistogramInfo]
"""
return self.histogram
def get_result_status(self):
"""
:return:查询的状态
:rtype:str
"""
return self.result_status
def get_total_count(self):
"""
:return:请求所有直方图数据总和
:rtype:int
"""
return self.total_count
def get_interval(self):
"""
:return:直方图的子区间长度
:rtype:int
"""
return self.interval
class DescribeHistogramV1Response(TLSResponse):
def __init__(self, response: Response):
super(DescribeHistogramV1Response, self).__init__(response)
self.histogram = []
self.result_status = self.response[RESULT_STATUS]
self.total_count = self.response[TOTAL_COUNT]
histogram = self.response[HISTOGRAM]
for i in range(len(histogram)):
self.histogram.append(HistogramInfoV1.set_attributes(data=histogram[i]))
def get_histogram(self):
"""
:return:所有子区间的结果集
:rtype:List[HistogramInfo]
"""
return self.histogram
def get_result_status(self):
"""
:return:查询的状态
:rtype:str
"""
return self.result_status
def get_total_count(self):
"""
:return:请求所有直方图数据总和
:rtype:int
"""
return self.total_count
class CreateDownloadTaskResponse(TLSResponse):
def __init__(self, response: Response):
super(CreateDownloadTaskResponse, self).__init__(response)
self.task_id = self.response[TASK_ID]
def get_task_id(self):
"""
:return: 下载任务id
:rtype: str
"""
return self.task_id
class DescribeDownloadTasksResponse(TLSResponse):
def __init__(self, response):
super(DescribeDownloadTasksResponse, self).__init__(response)
self.total = self.response[TOTAL]
self.tasks = []
tasks = self.response[TASKS]
for i in range(len(tasks)):
self.tasks.append(TaskInfo.set_attributes(data=tasks[i]))
def get_total(self):
"""
:return: 下载任务总数
:rtype:int
"""
return self.total
def get_tasks(self):
"""
:return:下载任务列表
:rtype: List[TaskInfo]
"""
return self.tasks
class DescribeDownloadUrlResponse(TLSResponse):
def __init__(self, response):
super(DescribeDownloadUrlResponse, self).__init__(response)
self.download_url = self.response[DOWNLOAD_URL]
def get_download_url(self):
"""
:return:下载文件链接
:rtype: str
"""
return self.download_url
class DescribeShardsResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeShardsResponse, self).__init__(response)
self.total = self.response[TOTAL]
self.shards = []
shards = self.response[SHARDS]
for i in range(len(shards)):
self.shards.append(QueryResp.set_attributes(data=shards[i]))
def get_shards(self):
"""
:return:shard列表
:rtype: List[QueryResp]
"""
return self.shards
def get_total(self):
"""
:return:shard总数
:rtype: int
"""
return self.total
class CreateHostGroupResponse(TLSResponse):
def __init__(self, response: Response):
super(CreateHostGroupResponse, self).__init__(response)
self.host_group_id = self.response[HOST_GROUP_ID]
def get_host_group_id(self):
"""
:return:机器组id
:rtype: str
"""
return self.host_group_id
class DeleteHostGroupResponse(TLSResponse):
def __init__(self, response: Response):
super(DeleteHostGroupResponse, self).__init__(response)
class ModifyHostGroupResponse(TLSResponse):
def __init__(self, response: Response):
super(ModifyHostGroupResponse, self).__init__(response)
class DescribeHostGroupResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeHostGroupResponse, self).__init__(response)
self.host_group_hosts_rules_info = \
DescribeHostGroupResponse._get_host_group_hosts_rules_info(self.response[HOST_GROUP_HOSTS_RULES_INFO])
self.response[HOST_GROUP_HOSTS_RULES_INFO] = self.host_group_hosts_rules_info
def get_host_group_hosts_rules_info(self):
"""
:return:机器组详细信息
:rtype:HostGroupHostsRulesInfo
"""
return self.host_group_hosts_rules_info
class DescribeHostGroupsResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeHostGroupsResponse, self).__init__(response)
self.total = self.response[TOTAL]
self.host_group_hosts_rules_infos = []
host_group_hosts_rules_infos = self.response[HOST_GROUP_HOSTS_RULES_INFOS]
for i in range(len(host_group_hosts_rules_infos)):
self.host_group_hosts_rules_infos.append(
DescribeHostGroupsResponse._get_host_group_hosts_rules_info(host_group_hosts_rules_infos[i]))
def get_total(self):
"""
:return:机器组总数
:rtype: int
"""
return self.total
def get_host_group_hosts_rules_infos(self):
"""
:return:机器组列表
:rtype: List[HostGroupHostsRulesInfo]
"""
return self.host_group_hosts_rules_infos
class ModifyHostGroupsAutoUpdateResponse(TLSResponse):
def __init__(self, response: Response):
super(ModifyHostGroupsAutoUpdateResponse, self).__init__(response)
class DescribeHostsResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeHostsResponse, self).__init__(response)
self.total = self.response[TOTAL]
self.host_infos = []
for i in range(len(self.response[HOST_INFOS])):
self.host_infos.append(HostInfo.set_attributes(data=self.response[HOST_INFOS][i]))
def get_total(self):
"""
:return:host总数
:rtype: int
"""
return self.total
def get_host_infos(self):
"""
:return:host列表
:rtype: List[HostInfo]
"""
return self.host_infos
class DeleteHostResponse(TLSResponse):
def __init__(self, response: Response):
super(DeleteHostResponse, self).__init__(response)
class DescribeHostGroupRulesResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeHostGroupRulesResponse, self).__init__(response)
self.total = self.response[TOTAL]
self.rule_infos = []
for i in range(len(self.response[RULE_INFOS])):
rule_info = RuleInfo.set_attributes(data=self.response[RULE_INFOS][i])
self.rule_infos.append(rule_info)
def get_total(self):
"""
:return:机器组采集配置总数
:rtype: int
"""
return self.total
def get_rule_infos(self):
"""
:return:采集配置列表
:rtype: List[RuleInfo]
"""
return self.rule_infos
class DeleteAbnormalHostsResponse(TLSResponse):
def __init__(self, response: Response):
super(DeleteAbnormalHostsResponse, self).__init__(response)
class CreateRuleResponse(TLSResponse):
def __init__(self, response: Response):
super(CreateRuleResponse, self).__init__(response)
self.rule_id = self.response[RULE_ID]
def get_rule_id(self):
"""
:return:采集配置的 ID
:rtype:str
"""
return self.rule_id
class DeleteRuleResponse(TLSResponse):
def __init__(self, response: Response):
super(DeleteRuleResponse, self).__init__(response)
class ModifyRuleResponse(TLSResponse):
def __init__(self, response: Response):
super(ModifyRuleResponse, self).__init__(response)
class DescribeRuleResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeRuleResponse, self).__init__(response)
self.project_id = self.response[PROJECT_ID]
self.project_name = self.response[PROJECT_NAME]
self.rule_info = RuleInfo.set_attributes(data=self.response[RULE_INFO])
self.response[RULE_INFO] = self.rule_info
self.host_group_infos = []
for i in range(len(self.response[HOST_GROUP_INFOS])):
self.host_group_infos.append(
HostGroupInfo.set_attributes(data=self.response[HOST_GROUP_INFOS][i]))
def get_project_id(self):
"""
:return: 日志项目 ID
:rtype: str
"""
return self.project_id
def get_rule_info(self):
"""
:return: 采集配置
:rtype: RuleInfo
"""
return self.rule_info
def get_project_name(self):
"""
:return:日志项目的名称
:rtype: str
"""
return self.project_name
def get_host_group_infos(self):
"""
:return: 机器组列表
:rtype: List[HostGroupInfo]
"""
return self.host_group_infos
class DescribeRulesResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeRulesResponse, self).__init__(response)
self.total = self.response[TOTAL]
self.rule_infos = []
for i in range(len(self.response[RULE_INFOS])):
self.rule_infos.append(RuleInfo.set_attributes(data=self.response[RULE_INFOS][i]))
def get_total(self):
"""
:return:采集配置总数
:rtype: int
"""
return self.total
def get_rule_infos(self):
"""
:return:采集配置列表
:rtype: List[RuleInfo]
"""
return self.rule_infos
class ApplyRuleToHostGroupsResponse(TLSResponse):
def __init__(self, response: Response):
super(ApplyRuleToHostGroupsResponse, self).__init__(response)
class DeleteRuleFromHostGroupsResponse(TLSResponse):
def __init__(self, response: Response):
super(DeleteRuleFromHostGroupsResponse, self).__init__(response)
class CreateAlarmNotifyGroupResponse(TLSResponse):
def __init__(self, response: Response):
super(CreateAlarmNotifyGroupResponse, self).__init__(response)
self.alarm_notify_group_id = self.response[ALARM_NOTIFY_GROUP_ID]
def get_alarm_notify_group_id(self):
"""
:return:告警通知组id
:rtype: str
"""
return self.alarm_notify_group_id
class DeleteAlarmNotifyGroupResponse(TLSResponse):
def __init__(self, response: Response):
super(DeleteAlarmNotifyGroupResponse, self).__init__(response)
class ModifyAlarmNotifyGroupResponse(TLSResponse):
def __init__(self, response: Response):
super(ModifyAlarmNotifyGroupResponse, self).__init__(response)
class DescribeAlarmNotifyGroupsResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeAlarmNotifyGroupsResponse, self).__init__(response)
self.total = self.response[TOTAL]
self.alarm_notify_groups = []
if self.response[ALARM_NOTIFY_GROUPS] is None:
self.response[ALARM_NOTIFY_GROUPS] = []
for i in range(len(self.response[ALARM_NOTIFY_GROUPS])):
self.alarm_notify_groups.append(AlarmNotifyGroupInfo.set_attributes(
data=self.response[ALARM_NOTIFY_GROUPS][i]))
def get_total(self):
"""
:return:告警通知组总数
:rtype: int
"""
return self.total
def get_alarm_notify_groups(self):
"""
:return:告警通知组列表
:rtype: List[AlarmNotifyGroupInfo]
"""
return self.alarm_notify_groups
class CreateAlarmResponse(TLSResponse):
def __init__(self, response: Response):
super(CreateAlarmResponse, self).__init__(response)
self.alarm_id = self.response[ALARM_ID]
def get_alarm_id(self):
"""
:return:告警id
:rtype: str
"""
return self.alarm_id
class DeleteAlarmResponse(TLSResponse):
def __init__(self, response: Response):
super(DeleteAlarmResponse, self).__init__(response)
class ModifyAlarmResponse(TLSResponse):
def __init__(self, response: Response):
super(ModifyAlarmResponse, self).__init__(response)
class DescribeAlarmsResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeAlarmsResponse, self).__init__(response)
self.total = self.response[TOTAL]
self.alarms = []
for i in range(len(self.response[ALARMS])):
self.alarms.append(AlarmInfo.set_attributes(data=self.response[ALARMS][i]))
def get_total(self):
"""
:return:告警总数
:rtype: int
"""
return self.total
def get_alarms(self):
"""
:return:告警列表
:rtype: List[AlarmInfo]
"""
return self.alarms
class OpenKafkaConsumerResponse(TLSResponse):
def __init__(self, response: Response):
super(OpenKafkaConsumerResponse, self).__init__(response)
class CloseKafkaConsumerResponse(TLSResponse):
def __init__(self, response: Response):
super(CloseKafkaConsumerResponse, self).__init__(response)
class DescribeKafkaConsumerResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeKafkaConsumerResponse, self).__init__(response)
self.allow_consume = self.response[ALLOW_CONSUME]
self.consume_topic = self.response[CONSUME_TOPIC]
def get_allow_consume(self):
"""
:return: 日志主题是否已开启了 Kafka 协议消费功能
:rtype:bool
"""
return self.allow_consume
def get_consume_topic(self):
"""
:return:Kafka 协议消费主题 ID,格式为 out+日志主题 ID
:rtype: str
"""
return self.consume_topic
class CreateConsumerGroupResponse(TLSResponse):
def __init__(self, response: Response):
super(CreateConsumerGroupResponse, self).__init__(response)
class DeleteConsumerGroupResponse(TLSResponse):
def __init__(self, response: Response):
super(DeleteConsumerGroupResponse, self).__init__(response)
class ModifyConsumerGroupResponse(TLSResponse):
def __init__(self, response: Response):
super(ModifyConsumerGroupResponse, self).__init__(response)
class DescribeConsumerGroupsResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeConsumerGroupsResponse, self).__init__(response)
self.consumer_groups = []
consumer_groups = self.response[CONSUMER_GROUPS]
if consumer_groups is None:
return
for i in range(len(consumer_groups)):
self.consumer_groups.append(ConsumerGroup.set_attributes(data=consumer_groups[i]))
class ConsumerHeartbeatResponse(TLSResponse):
def __init__(self, response: Response):
super(ConsumerHeartbeatResponse, self).__init__(response)
self.shards = []
shards = self.response.get(SHARDS)
if shards is not None:
for i in range(len(shards)):
self.shards.append(ConsumeShard.set_attributes(data=shards[i]))
class ModifyCheckpointResponse(TLSResponse):
def __init__(self, response: Response):
super(ModifyCheckpointResponse, self).__init__(response)
class ResetCheckpointResponse(TLSResponse):
def __init__(self, response: Response):
super(ResetCheckpointResponse, self).__init__(response)
class DescribeCheckpointResponse(TLSResponse):
def __init__(self, response: Response):
super(DescribeCheckpointResponse, self).__init__(response)
self.shard_id = self.response.get(SHARD_ID_UPPERCASE)
self.checkpoint = self.response.get(CHECKPOINT)
self.update_time = self.response.get(UPDATE_TIME)
self.consumer = self.response.get(CONSUMER)
class AddTagsToResourceResponse(TLSResponse):
def __init__(self, response: Response):
super(AddTagsToResourceResponse, self).__init__(response)
class RemoveTagsFromResourceResponse(TLSResponse):
def __init__(self, response: Response):
super(RemoveTagsFromResourceResponse, self).__init__(response)