|
|
""" |
|
|
Enterprise Agent Gradio Application |
|
|
Web interface for the Enterprise Agent |
|
|
""" |
|
|
|
|
|
import gradio as gr |
|
|
import asyncio |
|
|
import logging |
|
|
from .enterprise_agent import EnterpriseAgent |
|
|
|
|
|
|
|
|
class EnterpriseApp: |
|
|
"""Gradio web application for Enterprise Agent.""" |
|
|
|
|
|
def __init__(self): |
|
|
self.agent = EnterpriseAgent() |
|
|
self.conversation_history = [] |
|
|
|
|
|
|
|
|
logging.basicConfig(level=logging.INFO) |
|
|
|
|
|
|
|
|
self.interface = self._create_interface() |
|
|
|
|
|
def _create_interface(self): |
|
|
"""Create the Gradio interface.""" |
|
|
|
|
|
with gr.Blocks( |
|
|
title="π’ Enterprise Agent - Secure AI Suite", |
|
|
theme=gr.themes.Soft( |
|
|
primary_hue="blue", |
|
|
secondary_hue="gray", |
|
|
neutral_hue="slate" |
|
|
), |
|
|
css=""" |
|
|
.container { max-width: 1200px; margin: auto; } |
|
|
.chatbot { height: 500px; } |
|
|
.status-card { background: linear-gradient(90deg, #667eea 0%, #764ba2 100%); color: white; } |
|
|
.tool-card { border: 2px solid #e2e8f0; border-radius: 8px; padding: 12px; margin: 8px 0; } |
|
|
""" |
|
|
) as app: |
|
|
|
|
|
|
|
|
gr.HTML(""" |
|
|
<div style='text-align: center; padding: 20px; background: linear-gradient(90deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 10px;'> |
|
|
<h1 style='margin: 0; font-size: 2.5em;'>π’ Enterprise Agent</h1> |
|
|
<p style='margin: 10px 0; font-size: 1.2em;'>Automate CRM, Tickets & Calendar with AI</p> |
|
|
<p style='margin: 0; opacity: 0.8;'>π Secure AI Agents Suite</p> |
|
|
</div> |
|
|
""") |
|
|
|
|
|
with gr.Row(): |
|
|
|
|
|
with gr.Column(scale=2): |
|
|
gr.HTML("<h3>π¬ Chat with Enterprise Agent</h3>") |
|
|
|
|
|
chatbot = gr.Chatbot( |
|
|
label="Enterprise Assistant", |
|
|
height=400, |
|
|
elem_classes=["chatbot"], |
|
|
avatar_images=(None, "π’") |
|
|
) |
|
|
|
|
|
with gr.Row(): |
|
|
msg_input = gr.Textbox( |
|
|
placeholder="Ask me about CRM updates, ticket creation, or calendar scheduling...", |
|
|
lines=3, |
|
|
max_lines=5, |
|
|
label="Your Message" |
|
|
) |
|
|
with gr.Column(scale=0): |
|
|
send_btn = gr.Button("Send", variant="primary") |
|
|
clear_btn = gr.Button("Clear", variant="secondary") |
|
|
|
|
|
|
|
|
with gr.Column(scale=1): |
|
|
gr.HTML("<h3>π οΈ Available Tools</h3>") |
|
|
|
|
|
tools_info = gr.HTML(""" |
|
|
<div class="tool-card"> |
|
|
<h4>ποΈ CRM Operations</h4> |
|
|
<p>β’ Update customer information<br>β’ Search contacts and accounts<br>β’ Modify customer records</p> |
|
|
</div> |
|
|
<div class="tool-card"> |
|
|
<h4>π« Support Tickets</h4> |
|
|
<p>β’ Create support tickets<br>β’ Set priority levels<br>β’ Categorize issues</p> |
|
|
</div> |
|
|
<div class="tool-card"> |
|
|
<h4>π
Calendar Management</h4> |
|
|
<p>β’ Schedule meetings<br>β’ Manage appointments<br>β’ View calendar events</p> |
|
|
</div> |
|
|
""") |
|
|
|
|
|
gr.HTML("<h3>π System Status</h3>") |
|
|
status_display = gr.HTML() |
|
|
|
|
|
|
|
|
def user(user_message, history): |
|
|
"""Handle user input.""" |
|
|
if not user_message.strip(): |
|
|
return history, "" |
|
|
|
|
|
|
|
|
history.append((user_message, None)) |
|
|
return history, "" |
|
|
|
|
|
async def bot_response(history, user_message): |
|
|
"""Generate bot response.""" |
|
|
if not user_message.strip(): |
|
|
return history |
|
|
|
|
|
|
|
|
response = await self.agent.handle_user_input(user_message) |
|
|
|
|
|
|
|
|
history[-1] = (user_message, response) |
|
|
return history |
|
|
|
|
|
def clear_conversation(): |
|
|
"""Clear conversation history.""" |
|
|
return [] |
|
|
|
|
|
def update_status(): |
|
|
"""Update status display.""" |
|
|
status = self.agent.get_status() |
|
|
return f""" |
|
|
<div class="status-card" style="padding: 15px; border-radius: 8px;"> |
|
|
<h4>β
System Status</h4> |
|
|
<p><strong>Agent:</strong> {status['name']}</p> |
|
|
<p><strong>Status:</strong> {status['status']}</p> |
|
|
<p><strong>Security:</strong> {'π‘οΈ Enabled' if status['security_enabled'] else 'β Disabled'}</p> |
|
|
<p><strong>Audit Logging:</strong> {'π Enabled' if status['audit_logging'] else 'β Disabled'}</p> |
|
|
<p><strong>Tools:</strong> {', '.join(status['tools'])}</p> |
|
|
</div> |
|
|
""" |
|
|
|
|
|
|
|
|
send_btn.click( |
|
|
user, |
|
|
inputs=[msg_input, chatbot], |
|
|
outputs=[chatbot, msg_input] |
|
|
).then( |
|
|
bot_response, |
|
|
inputs=[chatbot, msg_input], |
|
|
outputs=[chatbot] |
|
|
) |
|
|
|
|
|
msg_input.submit( |
|
|
user, |
|
|
inputs=[msg_input, chatbot], |
|
|
outputs=[chatbot, msg_input] |
|
|
).then( |
|
|
bot_response, |
|
|
inputs=[chatbot, msg_input], |
|
|
outputs=[chatbot] |
|
|
) |
|
|
|
|
|
clear_btn.click(clear_conversation, outputs=chatbot) |
|
|
|
|
|
|
|
|
app.load(update_status, outputs=status_display) |
|
|
|
|
|
return app |
|
|
|
|
|
def launch(self, **kwargs): |
|
|
"""Launch the Gradio application.""" |
|
|
self.interface.launch( |
|
|
server_name="0.0.0.0", |
|
|
server_port=7860, |
|
|
share=False, |
|
|
show_error=True, |
|
|
quiet=False, |
|
|
**kwargs |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
EXAMPLE_QUERIES = [ |
|
|
"Update customer 001 email to newemail@company.com", |
|
|
"Create ticket about login issues - high priority", |
|
|
"Schedule team meeting for tomorrow at 2 PM", |
|
|
"Search for john contacts", |
|
|
"Show calendar events for today", |
|
|
"Check system status" |
|
|
] |
|
|
|
|
|
|
|
|
def main(): |
|
|
"""Main function to run the Enterprise Agent app.""" |
|
|
print("π’ Starting Enterprise Agent...") |
|
|
print("π‘ Connecting to MCP servers...") |
|
|
print("π‘οΈ Security middleware initialized") |
|
|
print("π§ Available tools: CRM, Tickets, Calendar") |
|
|
|
|
|
app = EnterpriseApp() |
|
|
|
|
|
print("\n" + "="*60) |
|
|
print("π’ ENTERPRISE AGENT - SECURE AI SUITE") |
|
|
print("="*60) |
|
|
print("\nπ‘ Example queries you can try:") |
|
|
for i, query in enumerate(EXAMPLE_QUERIES, 1): |
|
|
print(f" {i}. {query}") |
|
|
print("\nπ Starting Gradio server...") |
|
|
print("π Open your browser to: http://localhost:7860") |
|
|
print("\n" + "="*60) |
|
|
|
|
|
app.launch() |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
main() |