Spaces:
Sleeping
Sleeping
| '''Functions for controlling chat flow between Gradio and Anthropic/MCP''' | |
| import json | |
| import logging | |
| from anthropic.types import text_block | |
| from gradio.components.chatbot import ChatMessage | |
| from client import prompts | |
| from client.anthropic_bridge import AnthropicBridge | |
| async def agent_input( | |
| bridge: AnthropicBridge, | |
| chat_history: list | |
| ) -> list: | |
| '''Handles model interactions.''' | |
| function_logger = logging.getLogger(__name__ + '.agent_input') | |
| input_messages = format_chat_history(chat_history) | |
| result = await bridge.process_query(prompts.DEFAULT_SYSTEM_PROMPT, input_messages) | |
| if result['tool_result']: | |
| tool_call = result['tool_call'] | |
| tool_name = tool_call['name'] | |
| if tool_name == 'rss_mcp_server_get_feed': | |
| tool_parameters = tool_call['parameters'] | |
| website = tool_parameters['website'] | |
| user_query = input_messages[-1]['content'] | |
| response_content = result['llm_response'].content[0] | |
| if isinstance(response_content, text_block.TextBlock): | |
| intermediate_reply = response_content.text | |
| else: | |
| intermediate_reply = f'I Will check the {website} RSS feed for you' | |
| function_logger.info('User query: %s', user_query) | |
| function_logger.info('Model intermediate reply: %s', intermediate_reply) | |
| function_logger.info('LLM called %s on %s', tool_name, website) | |
| articles = json.loads(result['tool_result'].content)['text'] | |
| prompt = prompts.GET_FEED_PROMPT.substitute( | |
| website=website, | |
| user_query=user_query, | |
| intermediate_reply=intermediate_reply, | |
| articles=articles | |
| ) | |
| input_message =[{ | |
| 'role': 'user', | |
| 'content': prompt | |
| }] | |
| function_logger.info('Re-prompting input %s', input_message) | |
| result = await bridge.process_query(prompts.GET_FEED_SYSTEM_PROMPT, input_message) | |
| try: | |
| final_reply = result['llm_response'].content[0].text | |
| except (IndexError, AttributeError): | |
| final_reply = 'No final reply from model' | |
| function_logger.info('LLM final reply: %s', final_reply) | |
| chat_history.append({ | |
| "role": "assistant", | |
| "content": intermediate_reply | |
| }) | |
| chat_history.append({ | |
| "role": "assistant", | |
| "content": final_reply | |
| }) | |
| else: | |
| try: | |
| reply = result['llm_response'].content[0].text | |
| except AttributeError: | |
| reply = 'Bad reply - could not parse' | |
| function_logger.info('Direct, no-tool reply: %s', reply) | |
| chat_history.append({ | |
| "role": "assistant", | |
| "content": reply | |
| }) | |
| return chat_history | |
| def format_chat_history(history) -> list[dict]: | |
| '''Formats gradio chat history for submission to anthropic.''' | |
| messages = [] | |
| for chat_message in history: | |
| if isinstance(chat_message, ChatMessage): | |
| role, content = chat_message.role, chat_message.content | |
| else: | |
| role, content = chat_message.get("role"), chat_message.get("content") | |
| if role in ["user", "assistant", "system"]: | |
| messages.append({"role": role, "content": content}) | |
| return messages | |