ALwrity Version 0.5.1 (Fastapi + React)
This commit is contained in:
54
ToBeMigrated/utils/api_key_manager/__init__.py
Normal file
54
ToBeMigrated/utils/api_key_manager/__init__.py
Normal file
@@ -0,0 +1,54 @@
|
||||
"""API Key Manager package for ALwrity."""
|
||||
|
||||
from .manager import APIKeyManager
|
||||
from .api_key_manager import render, check_onboarding_completion, get_onboarding_status, reset_onboarding
|
||||
from .onboarding_progress import (
|
||||
OnboardingProgress,
|
||||
get_onboarding_progress,
|
||||
render_progress_indicator,
|
||||
render_resume_message,
|
||||
StepStatus,
|
||||
StepData
|
||||
)
|
||||
from .validation import check_all_api_keys
|
||||
from .components.base import (
|
||||
render_step_indicator,
|
||||
render_navigation_buttons,
|
||||
render_step_validation,
|
||||
render_resume_options
|
||||
)
|
||||
|
||||
# Export all public components
|
||||
__all__ = [
|
||||
# Main classes
|
||||
'APIKeyManager',
|
||||
'OnboardingProgress',
|
||||
'StepStatus',
|
||||
'StepData',
|
||||
|
||||
# Main functions
|
||||
'render',
|
||||
'check_onboarding_completion',
|
||||
'get_onboarding_status',
|
||||
'reset_onboarding',
|
||||
'get_onboarding_progress',
|
||||
|
||||
# UI components
|
||||
'render_progress_indicator',
|
||||
'render_resume_message',
|
||||
'render_step_indicator',
|
||||
'render_navigation_buttons',
|
||||
'render_step_validation',
|
||||
'render_resume_options',
|
||||
|
||||
# Validation
|
||||
'check_all_api_keys'
|
||||
]
|
||||
|
||||
# Version information
|
||||
__version__ = "2.0.0"
|
||||
__author__ = "ALwrity Team"
|
||||
__description__ = "Comprehensive API key management and onboarding system for ALwrity"
|
||||
|
||||
# Note: FastAPI endpoints have been moved to the backend/ directory
|
||||
# for better separation of concerns and enterprise architecture.
|
||||
42
ToBeMigrated/utils/api_key_manager/ai_research.py
Normal file
42
ToBeMigrated/utils/api_key_manager/ai_research.py
Normal file
@@ -0,0 +1,42 @@
|
||||
"""AI research functionality for API key manager."""
|
||||
|
||||
from loguru import logger
|
||||
import asyncio
|
||||
from typing import Dict, Any, Optional
|
||||
|
||||
async def research_topic(topic: str, api_keys: Dict[str, str]) -> Dict[str, Any]:
|
||||
"""
|
||||
Research a topic using available AI services.
|
||||
|
||||
Args:
|
||||
topic (str): The topic to research
|
||||
api_keys (Dict[str, str]): Dictionary of API keys for different services
|
||||
|
||||
Returns:
|
||||
Dict[str, Any]: Research results and metadata
|
||||
"""
|
||||
try:
|
||||
logger.info(f"Starting research on topic: {topic}")
|
||||
|
||||
# TODO: Implement actual research functionality using available API keys
|
||||
# This is a placeholder implementation
|
||||
results = {
|
||||
"topic": topic,
|
||||
"status": "success",
|
||||
"data": {
|
||||
"summary": f"Research summary for {topic}",
|
||||
"key_points": ["Point 1", "Point 2", "Point 3"],
|
||||
"sources": ["Source 1", "Source 2"]
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("Research completed successfully")
|
||||
return results
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error during research: {str(e)}")
|
||||
return {
|
||||
"topic": topic,
|
||||
"status": "error",
|
||||
"error": str(e)
|
||||
}
|
||||
178
ToBeMigrated/utils/api_key_manager/components/README.md
Normal file
178
ToBeMigrated/utils/api_key_manager/components/README.md
Normal file
@@ -0,0 +1,178 @@
|
||||
# ALwrity Setup Components Guide
|
||||
|
||||
## Overview
|
||||
|
||||
The ALwrity Setup Components are the building blocks that guide you through setting up your content creation environment. Each component is designed to help you configure specific aspects of ALwrity for optimal content creation.
|
||||
|
||||
## Core Components
|
||||
|
||||
### 1. Website Setup (`website_setup.py`)
|
||||
**Purpose**: Configure your website's basic information and analyze its current state
|
||||
|
||||
**Features**:
|
||||
- **URL Configuration**: Set up your website's URL
|
||||
- **Analysis Options**:
|
||||
- Basic Analysis: Quick overview of your website
|
||||
- Full Analysis with SEO: Comprehensive website and SEO analysis
|
||||
- **Analysis Results**:
|
||||
- Basic Metrics: Status, content type, title, meta description
|
||||
- Content Analysis: Word count, headings, images, links
|
||||
- SEO Analysis: SEO score, meta tags, content quality
|
||||
- Technical SEO: Mobile friendliness, page speed, technical issues
|
||||
- Strategy Recommendations: Actionable improvements
|
||||
|
||||
### 2. AI Research Setup (`ai_research_setup.py`)
|
||||
**Purpose**: Configure AI-powered research tools for content creation
|
||||
|
||||
**Features**:
|
||||
- **Traditional Search**:
|
||||
- SerpAPI integration for real-time search results
|
||||
- Access to structured data and knowledge graphs
|
||||
- News articles and related questions
|
||||
|
||||
- **AI Deep Research**:
|
||||
- Tavily AI for semantic understanding
|
||||
- Metaphor/Exa for neural search capabilities
|
||||
- Advanced research features
|
||||
|
||||
### 3. AI Providers (`ai_providers.py`)
|
||||
**Purpose**: Set up your preferred AI content generation services
|
||||
|
||||
**Supported Providers**:
|
||||
- **OpenAI (GPT models)**
|
||||
- Advanced language models
|
||||
- Creative content generation
|
||||
- Context-aware responses
|
||||
|
||||
- **Google (Gemini Pro)**
|
||||
- Balanced content creation
|
||||
- Factual accuracy
|
||||
- Multilingual support
|
||||
|
||||
- **Anthropic (Claude)**
|
||||
- Professional writing
|
||||
- Detailed analysis
|
||||
- Ethical considerations
|
||||
|
||||
- **DeepSeek**
|
||||
- Technical content
|
||||
- Specialized knowledge
|
||||
- Efficient processing
|
||||
|
||||
### 4. Personalization Setup (`personalization_setup.py`)
|
||||
**Purpose**: Customize your content creation experience
|
||||
|
||||
**Features**:
|
||||
- **Writing Style**:
|
||||
- Tone preferences
|
||||
- Voice settings
|
||||
- Content structure
|
||||
|
||||
- **Brand Configuration**:
|
||||
- Brand voice
|
||||
- Style guidelines
|
||||
- Content templates
|
||||
|
||||
### 5. ALwrity Integrations (`alwrity_integrations.py`)
|
||||
**Purpose**: Connect additional tools and services
|
||||
|
||||
**Features**:
|
||||
- **Third-party Services**:
|
||||
- Analytics integration
|
||||
- Social media tools
|
||||
- Content management systems
|
||||
|
||||
- **Workflow Automation**:
|
||||
- Publishing tools
|
||||
- Content scheduling
|
||||
- Distribution channels
|
||||
|
||||
### 6. Final Setup (`final_setup.py`)
|
||||
**Purpose**: Complete and verify your configuration
|
||||
|
||||
**Features**:
|
||||
- **Configuration Review**:
|
||||
- Settings verification
|
||||
- Connection testing
|
||||
- Setup completion
|
||||
|
||||
- **Validation**:
|
||||
- API key verification
|
||||
- Service connectivity
|
||||
- System readiness
|
||||
|
||||
## Base Components
|
||||
|
||||
### 1. Navigation (`base.py`)
|
||||
**Purpose**: Provide consistent navigation throughout the setup process
|
||||
|
||||
**Features**:
|
||||
- Step indicators
|
||||
- Navigation buttons
|
||||
- Progress tracking
|
||||
- Back/forward controls
|
||||
|
||||
## How to Use the Components
|
||||
|
||||
### 1. Starting the Setup
|
||||
1. Launch ALwrity
|
||||
2. Navigate to the Setup section
|
||||
3. Follow the guided wizard process
|
||||
|
||||
### 2. Component Navigation
|
||||
- Use the step indicator to track progress
|
||||
- Navigate between components using buttons
|
||||
- Save progress automatically
|
||||
- Return to previous steps if needed
|
||||
|
||||
### 3. Configuration Process
|
||||
1. **Enter Information**: Fill in required details
|
||||
2. **Verify Settings**: Review your inputs
|
||||
3. **Test Connections**: Ensure everything works
|
||||
4. **Complete Setup**: Finalize your configuration
|
||||
|
||||
## Best Practices
|
||||
|
||||
### 1. Before Setup
|
||||
- Gather all necessary API keys
|
||||
- Review provider documentation
|
||||
- Plan your configuration
|
||||
- Backup existing settings
|
||||
|
||||
### 2. During Setup
|
||||
- Follow the wizard steps
|
||||
- Verify each configuration
|
||||
- Test connections
|
||||
- Save progress regularly
|
||||
|
||||
### 3. After Setup
|
||||
- Review all settings
|
||||
- Test functionality
|
||||
- Document configurations
|
||||
- Monitor usage
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### 1. Common Issues
|
||||
- Invalid API keys
|
||||
- Connection problems
|
||||
- Configuration errors
|
||||
- Setup interruptions
|
||||
|
||||
### 2. Solutions
|
||||
- Key verification
|
||||
- Connection testing
|
||||
- Error logging
|
||||
- Support resources
|
||||
|
||||
## Need Help?
|
||||
|
||||
If you encounter any issues during setup:
|
||||
1. Check the error messages
|
||||
2. Review the documentation
|
||||
3. Verify your API keys
|
||||
4. Contact ALwrity support
|
||||
|
||||
---
|
||||
|
||||
*Note: Each component is designed to help you set up a specific aspect of ALwrity. Follow the setup wizard in order to ensure all components are properly configured for optimal content creation.*
|
||||
22
ToBeMigrated/utils/api_key_manager/components/__init__.py
Normal file
22
ToBeMigrated/utils/api_key_manager/components/__init__.py
Normal file
@@ -0,0 +1,22 @@
|
||||
"""API key manager components package."""
|
||||
|
||||
from .ai_research_setup import render_ai_research_setup
|
||||
from .ai_research import render_ai_research
|
||||
from .ai_providers import render_ai_providers
|
||||
from .final_setup import render_final_setup
|
||||
from .personalization_setup import render_personalization_setup
|
||||
from .alwrity_integrations import render_alwrity_integrations
|
||||
from .base import render_navigation_buttons, render_step_indicator
|
||||
from .website_setup import render_website_setup
|
||||
|
||||
__all__ = [
|
||||
'render_ai_research_setup',
|
||||
'render_ai_research',
|
||||
'render_ai_providers',
|
||||
'render_final_setup',
|
||||
'render_personalization_setup',
|
||||
'render_alwrity_integrations',
|
||||
'render_navigation_buttons',
|
||||
'render_step_indicator',
|
||||
'render_website_setup'
|
||||
]
|
||||
137
ToBeMigrated/utils/api_key_manager/components/ai_research.py
Normal file
137
ToBeMigrated/utils/api_key_manager/components/ai_research.py
Normal file
@@ -0,0 +1,137 @@
|
||||
"""AI Research setup component."""
|
||||
|
||||
import streamlit as st
|
||||
from typing import Dict, Any
|
||||
from loguru import logger
|
||||
from ..manager import APIKeyManager
|
||||
from .base import render_navigation_buttons, render_step_indicator
|
||||
|
||||
def render_ai_research(api_key_manager: APIKeyManager) -> Dict[str, Any]:
|
||||
"""Render the AI Research setup step."""
|
||||
try:
|
||||
st.markdown("""
|
||||
<div class='setup-header'>
|
||||
<h2>🔍 AI Research Configuration</h2>
|
||||
<p>Configure your research preferences and provide user information</p>
|
||||
</div>
|
||||
""", unsafe_allow_html=True)
|
||||
|
||||
# Create tabs for different sections
|
||||
tabs = st.tabs(["User Information", "Research Preferences"])
|
||||
|
||||
changes_made = False
|
||||
has_valid_info = False
|
||||
validation_message = ""
|
||||
|
||||
with tabs[0]:
|
||||
st.markdown("### User Information")
|
||||
st.markdown("Please provide your details for personalized research experience")
|
||||
|
||||
# User Information Card
|
||||
with st.container():
|
||||
st.markdown("""
|
||||
<div class="user-info-card">
|
||||
<div class="user-info-header">
|
||||
<div class="user-info-icon">👤</div>
|
||||
<div class="user-info-title">Personal Details</div>
|
||||
</div>
|
||||
<div class="user-info-content">
|
||||
<p>Your information helps us customize the research experience.</p>
|
||||
</div>
|
||||
</div>
|
||||
""", unsafe_allow_html=True)
|
||||
|
||||
# User Input Fields with Streamlit Components
|
||||
full_name = st.text_input("Full Name", key="full_name",
|
||||
help="Enter your full name as you'd like it to appear")
|
||||
|
||||
email = st.text_input("Email Address", key="email",
|
||||
help="Enter your business email address")
|
||||
|
||||
company = st.text_input("Company/Organization", key="company",
|
||||
help="Enter your company or organization name")
|
||||
|
||||
role = st.selectbox("Role",
|
||||
["Content Creator", "Marketing Manager", "Business Owner", "Other"],
|
||||
help="Select your primary role")
|
||||
|
||||
with tabs[1]:
|
||||
st.markdown("### Research Preferences")
|
||||
st.markdown("Configure how AI assists with your research")
|
||||
|
||||
# Research Preferences Card
|
||||
with st.container():
|
||||
st.markdown("""
|
||||
<div class="research-prefs-card">
|
||||
<div class="research-prefs-header">
|
||||
<div class="research-prefs-icon">🎯</div>
|
||||
<div class="research-prefs-title">Research Settings</div>
|
||||
</div>
|
||||
</div>
|
||||
""", unsafe_allow_html=True)
|
||||
|
||||
# Research Preferences Settings
|
||||
research_depth = st.select_slider(
|
||||
"Research Depth",
|
||||
options=["Basic", "Standard", "Deep", "Comprehensive"],
|
||||
value="Standard",
|
||||
help="Choose how detailed you want the AI research to be"
|
||||
)
|
||||
|
||||
st.markdown("#### Content Types")
|
||||
content_types = st.multiselect(
|
||||
"Select content types to focus on",
|
||||
["Blog Posts", "Social Media", "Technical Articles", "News", "Academic Papers"],
|
||||
default=["Blog Posts", "Social Media"],
|
||||
help="Choose what types of content you want to research"
|
||||
)
|
||||
|
||||
auto_research = st.toggle(
|
||||
"Enable Automated Research",
|
||||
help="Automatically start research when content topics are added"
|
||||
)
|
||||
|
||||
# Validate inputs
|
||||
if all([full_name, email, company]):
|
||||
changes_made = True
|
||||
has_valid_info = True
|
||||
validation_message = "✅ User information completed successfully"
|
||||
else:
|
||||
validation_message = "⚠️ Please fill in all required fields to continue"
|
||||
|
||||
# Display validation message
|
||||
if validation_message:
|
||||
if "✅" in validation_message:
|
||||
st.success(validation_message)
|
||||
else:
|
||||
st.warning(validation_message)
|
||||
|
||||
# Navigation buttons
|
||||
if render_navigation_buttons(3, 6, changes_made):
|
||||
if has_valid_info:
|
||||
# Store user information in session state
|
||||
st.session_state['user_info'] = {
|
||||
'full_name': full_name,
|
||||
'email': email,
|
||||
'company': company,
|
||||
'role': role,
|
||||
'research_preferences': {
|
||||
'depth': research_depth,
|
||||
'content_types': content_types,
|
||||
'auto_research': auto_research
|
||||
}
|
||||
}
|
||||
|
||||
# Update progress and move to next step
|
||||
st.session_state['current_step'] = 4
|
||||
st.rerun()
|
||||
else:
|
||||
st.error("Please complete all required fields to continue")
|
||||
|
||||
return {"current_step": 3, "changes_made": changes_made}
|
||||
|
||||
except Exception as e:
|
||||
error_msg = f"Error in AI research setup: {str(e)}"
|
||||
logger.error(f"[render_ai_research] {error_msg}")
|
||||
st.error(error_msg)
|
||||
return {"current_step": 3, "error": error_msg}
|
||||
188
ToBeMigrated/utils/api_key_manager/components/personalization.py
Normal file
188
ToBeMigrated/utils/api_key_manager/components/personalization.py
Normal file
@@ -0,0 +1,188 @@
|
||||
"""Personalization setup component."""
|
||||
|
||||
import streamlit as st
|
||||
from typing import Dict, Any
|
||||
from loguru import logger
|
||||
from ..manager import APIKeyManager
|
||||
from .base import render_navigation_buttons, render_step_indicator
|
||||
|
||||
def render_personalization(api_key_manager: APIKeyManager) -> Dict[str, Any]:
|
||||
"""Render the personalization setup step."""
|
||||
try:
|
||||
st.markdown("""
|
||||
<div class='setup-header'>
|
||||
<h2>🎨 Personalization Settings</h2>
|
||||
<p>Customize your content generation experience</p>
|
||||
</div>
|
||||
""", unsafe_allow_html=True)
|
||||
|
||||
# Create tabs for different sections
|
||||
tabs = st.tabs(["Content Style", "Brand Voice", "Advanced Settings"])
|
||||
|
||||
changes_made = False
|
||||
has_valid_settings = False
|
||||
validation_message = ""
|
||||
|
||||
with tabs[0]:
|
||||
st.markdown("### Content Style")
|
||||
st.markdown("Define your preferred content style and tone")
|
||||
|
||||
# Content Style Card
|
||||
with st.container():
|
||||
st.markdown("""
|
||||
<div class="style-card">
|
||||
<div class="style-header">
|
||||
<div class="style-icon">✨</div>
|
||||
<div class="style-title">Writing Style</div>
|
||||
</div>
|
||||
<div class="style-content">
|
||||
<p>Choose how you want your content to be written.</p>
|
||||
</div>
|
||||
</div>
|
||||
""", unsafe_allow_html=True)
|
||||
|
||||
# Style Settings
|
||||
writing_style = st.selectbox(
|
||||
"Writing Style",
|
||||
["Professional", "Casual", "Technical", "Conversational", "Academic"],
|
||||
help="Select your preferred writing style"
|
||||
)
|
||||
|
||||
tone = st.select_slider(
|
||||
"Content Tone",
|
||||
options=["Formal", "Semi-Formal", "Neutral", "Friendly", "Humorous"],
|
||||
value="Neutral",
|
||||
help="Choose the tone for your content"
|
||||
)
|
||||
|
||||
content_length = st.select_slider(
|
||||
"Content Length",
|
||||
options=["Concise", "Standard", "Detailed", "Comprehensive"],
|
||||
value="Standard",
|
||||
help="Select your preferred content length"
|
||||
)
|
||||
|
||||
with tabs[1]:
|
||||
st.markdown("### Brand Voice")
|
||||
st.markdown("Configure your brand's unique voice and personality")
|
||||
|
||||
# Brand Voice Card
|
||||
with st.container():
|
||||
st.markdown("""
|
||||
<div class="brand-card">
|
||||
<div class="brand-header">
|
||||
<div class="brand-icon">🎯</div>
|
||||
<div class="brand-title">Brand Identity</div>
|
||||
</div>
|
||||
<div class="brand-content">
|
||||
<p>Define your brand's personality and voice.</p>
|
||||
</div>
|
||||
</div>
|
||||
""", unsafe_allow_html=True)
|
||||
|
||||
# Brand Settings
|
||||
brand_personality = st.multiselect(
|
||||
"Brand Personality Traits",
|
||||
["Professional", "Innovative", "Friendly", "Trustworthy", "Creative", "Expert"],
|
||||
default=["Professional", "Trustworthy"],
|
||||
help="Select traits that best describe your brand"
|
||||
)
|
||||
|
||||
brand_voice = st.text_area(
|
||||
"Brand Voice Description",
|
||||
help="Describe how your brand should sound in content"
|
||||
)
|
||||
|
||||
keywords = st.text_input(
|
||||
"Brand Keywords",
|
||||
help="Enter key terms that should be used in your content"
|
||||
)
|
||||
|
||||
with tabs[2]:
|
||||
st.markdown("### Advanced Settings")
|
||||
st.markdown("Fine-tune your content generation preferences")
|
||||
|
||||
# Advanced Settings Card
|
||||
with st.container():
|
||||
st.markdown("""
|
||||
<div class="advanced-card">
|
||||
<div class="advanced-header">
|
||||
<div class="advanced-icon">⚙️</div>
|
||||
<div class="advanced-title">Advanced Options</div>
|
||||
</div>
|
||||
<div class="advanced-content">
|
||||
<p>Configure advanced content generation settings.</p>
|
||||
</div>
|
||||
</div>
|
||||
""", unsafe_allow_html=True)
|
||||
|
||||
# Advanced Settings
|
||||
seo_optimization = st.toggle(
|
||||
"Enable SEO Optimization",
|
||||
help="Automatically optimize content for search engines"
|
||||
)
|
||||
|
||||
readability_level = st.select_slider(
|
||||
"Readability Level",
|
||||
options=["Simple", "Standard", "Advanced", "Expert"],
|
||||
value="Standard",
|
||||
help="Choose the complexity level of your content"
|
||||
)
|
||||
|
||||
content_structure = st.multiselect(
|
||||
"Content Structure",
|
||||
["Introduction", "Key Points", "Examples", "Conclusion", "Call-to-Action"],
|
||||
default=["Introduction", "Key Points", "Conclusion"],
|
||||
help="Select required content sections"
|
||||
)
|
||||
|
||||
# Validate settings
|
||||
if all([writing_style, tone, content_length, brand_personality]):
|
||||
changes_made = True
|
||||
has_valid_settings = True
|
||||
validation_message = "✅ Personalization settings completed successfully"
|
||||
else:
|
||||
validation_message = "⚠️ Please complete all required settings to continue"
|
||||
|
||||
# Display validation message
|
||||
if validation_message:
|
||||
if "✅" in validation_message:
|
||||
st.success(validation_message)
|
||||
else:
|
||||
st.warning(validation_message)
|
||||
|
||||
# Navigation buttons
|
||||
if render_navigation_buttons(4, 6, changes_made):
|
||||
if has_valid_settings:
|
||||
# Store personalization settings in session state
|
||||
st.session_state['personalization'] = {
|
||||
'content_style': {
|
||||
'writing_style': writing_style,
|
||||
'tone': tone,
|
||||
'content_length': content_length
|
||||
},
|
||||
'brand_voice': {
|
||||
'personality': brand_personality,
|
||||
'voice_description': brand_voice,
|
||||
'keywords': keywords
|
||||
},
|
||||
'advanced_settings': {
|
||||
'seo_optimization': seo_optimization,
|
||||
'readability_level': readability_level,
|
||||
'content_structure': content_structure
|
||||
}
|
||||
}
|
||||
|
||||
# Update progress and move to next step
|
||||
st.session_state['current_step'] = 5
|
||||
st.rerun()
|
||||
else:
|
||||
st.error("Please complete all required settings to continue")
|
||||
|
||||
return {"current_step": 4, "changes_made": changes_made}
|
||||
|
||||
except Exception as e:
|
||||
error_msg = f"Error in personalization setup: {str(e)}"
|
||||
logger.error(f"[render_personalization] {error_msg}")
|
||||
st.error(error_msg)
|
||||
return {"current_step": 4, "error": error_msg}
|
||||
Reference in New Issue
Block a user