From 0c0216d5fcdbb5076f097287376dd38b5f089b77 Mon Sep 17 00:00:00 2001 From: Vignesh Aigal Date: Tue, 10 Oct 2023 15:26:36 -0700 Subject: [PATCH 1/4] Add twilio specific data when persisting history --- llmstack/processors/tasks.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/llmstack/processors/tasks.py b/llmstack/processors/tasks.py index 6774e66d6f3..ffea2339638 100644 --- a/llmstack/processors/tasks.py +++ b/llmstack/processors/tasks.py @@ -20,9 +20,14 @@ def persist_history_task_internal(processors, bookkeeping_data_map): 'timestamp'] if 'agent' in bookkeeping_data_map else bookkeeping_data_map['output']['timestamp'] discord_data = bookkeeping_data_map['discord_processor'] if 'discord_processor' in bookkeeping_data_map else None slack_data = bookkeeping_data_map['slack_processor'] if 'slack_processor' in bookkeeping_data_map else None - platform_data = discord_data['run_data'] if discord_data else ( - slack_data['run_data'] if slack_data else {} - ) + twilio_data = bookkeeping_data_map['twilio_processor'] if 'twilio_processor' in bookkeeping_data_map else None + platform_data = {} + if discord_data: + platform_data = discord_data['run_data'] + elif slack_data: + platform_data = slack_data['run_data'] + elif twilio_data: + platform_data = twilio_data['run_data'] processor_runs = [] for processor in processors: @@ -64,6 +69,9 @@ def persist_history_task_internal(processors, bookkeeping_data_map): elif discord_data: response_body = discord_data['input']['text'] response_content_type = 'text/markdown' + elif twilio_data: + response_body = twilio_data['input']['body'] + response_content_type = 'text/markdown' response_time = output_timestamp - \ bookkeeping_data_map['input']['timestamp'] @@ -73,6 +81,9 @@ def persist_history_task_internal(processors, bookkeeping_data_map): elif discord_data: response_time = discord_data['timestamp'] - \ bookkeeping_data_map['input']['timestamp'] + elif twilio_data: + response_time = twilio_data['timestamp'] - \ + bookkeeping_data_map['input']['timestamp'] run_entry = RunEntry( request_uuid=input['request_uuid'], app_uuid=input['request_app_uuid'] or None, From c288ed4f18aeb9fab431e40c983f1d3c6e748dd8 Mon Sep 17 00:00:00 2001 From: Vignesh Aigal Date: Tue, 10 Oct 2023 16:16:00 -0700 Subject: [PATCH 2/4] Update template for output config --- llmstack/apps/handlers/twilio_sms_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llmstack/apps/handlers/twilio_sms_app.py b/llmstack/apps/handlers/twilio_sms_app.py index 1bc6d5b80f9..10611e5beae 100644 --- a/llmstack/apps/handlers/twilio_sms_app.py +++ b/llmstack/apps/handlers/twilio_sms_app.py @@ -132,7 +132,7 @@ def run_app(self): ), ActorConfig( name='output', template_key='output', dependencies=['input'], - actor=OutputActor, kwargs={'template': '{{_inputs0._request}}'}, + actor=OutputActor, kwargs={'template': '{{_inputs0}}'}, ), ] processor_actor_configs, processor_configs = self._get_processor_actor_configs() From 1836b2260c5e881fc04285787691ef2d1a1920c7 Mon Sep 17 00:00:00 2001 From: Vignesh Aigal Date: Tue, 10 Oct 2023 16:16:21 -0700 Subject: [PATCH 3/4] Add twilio icon in history --- .../src/components/apps/AppRunHistoryTimeline.jsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/llmstack/client/src/components/apps/AppRunHistoryTimeline.jsx b/llmstack/client/src/components/apps/AppRunHistoryTimeline.jsx index f75d6f2b5c6..3a5e964a378 100644 --- a/llmstack/client/src/components/apps/AppRunHistoryTimeline.jsx +++ b/llmstack/client/src/components/apps/AppRunHistoryTimeline.jsx @@ -31,6 +31,7 @@ import { appsState } from "../../data/atoms"; import { axios } from "../../data/axios"; import { ReactComponent as DiscordIcon } from "../../assets/images/icons/discord.svg"; import { ReactComponent as SlackIcon } from "../../assets/images/icons/slack.svg"; +import { ReactComponent as TwilioIcon } from "../../assets/images/icons/twilio.svg"; import "ace-builds/src-noconflict/mode-sh"; import "ace-builds/src-noconflict/theme-chrome"; import { profileFlagsState } from "../../data/atoms"; @@ -366,6 +367,17 @@ export function AppRunHistoryTimeline(props) { {row.platform_data?.discord?.global_name} ); + } else if (row.platform_data?.twilio?.requestor) { + return ( + {row.platform_data?.twilio?.requestor} + ) } else if ( row.request_user_email === null || row.request_user_email === "" From c33f11c5b26bc99b345322d1cbb97fc300e3bbca Mon Sep 17 00:00:00 2001 From: Vignesh Aigal Date: Tue, 10 Oct 2023 16:23:14 -0700 Subject: [PATCH 4/4] Persist twilio api_response for logging --- .../providers/twilio/create_message.py | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/llmstack/processors/providers/twilio/create_message.py b/llmstack/processors/providers/twilio/create_message.py index d830330e9b4..6a672b3e22c 100644 --- a/llmstack/processors/providers/twilio/create_message.py +++ b/llmstack/processors/providers/twilio/create_message.py @@ -12,15 +12,12 @@ logger = logging.getLogger(__name__) - - class TwilioCreateMessageInput(ApiProcessorSchema): - _request: Optional[TwilioSmsWebhookRequest] body: Optional[str] to: Optional[str] class TwilioCreateMessageOutput(ApiProcessorSchema): - response: dict + code: int = 200 class TwilioCreateMessageConfiguration(ApiProcessorSchema): account_sid: Optional[str] @@ -68,14 +65,23 @@ def _send_message(self, message: str, to_: str, from_: str, account_sid: str, au def process(self) -> dict: + self._twilio_api_response = None input = self._input.dict() response = self._send_message(message=input['body'], to_=input['to'], from_=self._config.phone_number, account_sid=self._config.account_sid, auth_token=self._config.auth_token) + + self._twilio_api_response = { + 'code': response['code'], + 'headers': response['headers'], + 'text': response['text'], + } + async_to_sync(self._output_stream.write)( - TwilioCreateMessageOutput(response=response), + TwilioCreateMessageOutput(code=response['code']), ) return self._output_stream.finalize() def on_error(self, error: Any) -> None: + self._twilio_api_response = None input = self._input.dict() logger.error(f'Error in TwilioCreateMessageProcessor: {error}') @@ -85,11 +91,18 @@ def on_error(self, error: Any) -> None: response = self._send_message( error_msg, to_=input['to'], from_=self._config.phone_number, account_sid=self._config.account_sid, auth_token=self._config.auth_token) + + self._twilio_api_response = { + 'code': response['code'], + 'headers': response['headers'], + 'text': response['text'], + } + async_to_sync(self._output_stream.write)( - TwilioCreateMessageOutput(response=response), + TwilioCreateMessageOutput(code=response['code']), ) self._output_stream.finalize() return super().on_error(error) def get_bookkeeping_data(self) -> BookKeepingData: - return BookKeepingData(input=self._input, timestamp=time.time(), run_data={'twilio': {'requestor' : self._input.to}}) + return BookKeepingData(input=self._input, timestamp=time.time(), run_data={'twilio': {'requestor' : self._input.to, 'messages_api_response': self._twilio_api_response}})