Spaces:
Running
Running
Limit model selection to three open-source options
Browse files- Reduced available models to: Gemma 27B, Mixtral 8x7B, and Llama 70B
- Ordered models by size from smallest to largest
- Focuses on providing quality open-source model options only
- .DS_Store +0 -0
- CLAUDE.md +49 -0
- __pycache__/app.cpython-312.pyc +0 -0
- app.py +3 -12
- local-files/claude.md +108 -0
- local-files/zip/cloze_reader_assistant_1750033320.zip +3 -0
- local-files/zip/my_ai_assistant_assistant_1750031622.zip +3 -0
- local-files/zip/my_ai_assistant_assistant_1750032133.zip +3 -0
- local-files/zip/my_ai_assistant_assistant_1750033267.zip +3 -0
- local-files/zip/my_custom_space.zip +3 -0
- local-files/zip/professor_zach_assistant_1750033356.zip +3 -0
- local-files/zip/test_assistant_1750026513.zip +3 -0
- local-files/zip/zip.py +219 -0
.DS_Store
ADDED
Binary file (6.15 kB). View file
|
|
CLAUDE.md
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# CLAUDE.md
|
2 |
+
|
3 |
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
4 |
+
|
5 |
+
## Commands
|
6 |
+
|
7 |
+
### Running the Application
|
8 |
+
```bash
|
9 |
+
python app.py
|
10 |
+
```
|
11 |
+
This starts the Gradio web interface on local port (default 7860).
|
12 |
+
|
13 |
+
### Installing Dependencies
|
14 |
+
```bash
|
15 |
+
pip install -r requirements.txt
|
16 |
+
```
|
17 |
+
|
18 |
+
## Code Architecture
|
19 |
+
|
20 |
+
This is a single-file Gradio application (`app.py`) that helps users create and deploy chat interfaces on HuggingFace Spaces. The application has two main features:
|
21 |
+
|
22 |
+
1. **Spaces Configuration Tool**: Generates complete deployment packages for chat interfaces
|
23 |
+
- Uses the `SPACE_TEMPLATE` string (lines 9-81) to generate Python code
|
24 |
+
- Creates zip files containing app.py, requirements.txt, and README.md
|
25 |
+
- Supports multiple LLM models via OpenRouter API
|
26 |
+
|
27 |
+
2. **Chat Support Assistant**: Provides configuration help using Gemma-2-27B
|
28 |
+
- Located in the second tab of the interface
|
29 |
+
- Uses OpenRouter API with environment variable `OPENROUTER_API_KEY`
|
30 |
+
|
31 |
+
### Key Functions
|
32 |
+
- `create_readme()`: Generates deployment instructions (lines 99-117)
|
33 |
+
- `create_requirements()`: Generates requirements.txt content (lines 119-127)
|
34 |
+
- `generate_space_config()`: Main function that creates the deployment package (lines 129-180)
|
35 |
+
- `create_support_assistant()`: Creates the chat support interface (lines 396-449)
|
36 |
+
|
37 |
+
### Template System
|
38 |
+
The app uses string templating to generate Python code. The main template (`SPACE_TEMPLATE`) contains placeholders that are filled with user configuration:
|
39 |
+
- `{name}`, `{description}`, `{system_prompt}`, `{model}`
|
40 |
+
- `{api_key_var}`, `{temperature}`, `{max_tokens}`, `{examples}`
|
41 |
+
|
42 |
+
## Environment Variables
|
43 |
+
- `OPENROUTER_API_KEY`: Required for the Chat Support feature to work
|
44 |
+
|
45 |
+
## Important Notes
|
46 |
+
- This is a HuggingFace Spaces application (see YAML frontmatter in README.md)
|
47 |
+
- No test suite or linting configuration exists
|
48 |
+
- The generated packages are self-contained chat applications ready for deployment
|
49 |
+
- All generated code uses OpenRouter API for LLM access
|
__pycache__/app.cpython-312.pyc
ADDED
Binary file (12.6 kB). View file
|
|
app.py
CHANGED
@@ -82,18 +82,9 @@ if __name__ == "__main__":
|
|
82 |
|
83 |
# Available models
|
84 |
MODELS = [
|
85 |
-
"google/gemma-2-
|
86 |
-
"
|
87 |
-
"meta-llama/llama-3.1-
|
88 |
-
"meta-llama/llama-3.1-70b-instruct",
|
89 |
-
"anthropic/claude-3-haiku",
|
90 |
-
"anthropic/claude-3-sonnet",
|
91 |
-
"anthropic/claude-3.5-sonnet",
|
92 |
-
"openai/gpt-3.5-turbo",
|
93 |
-
"openai/gpt-4o-mini",
|
94 |
-
"openai/gpt-4o",
|
95 |
-
"mistralai/mistral-7b-instruct",
|
96 |
-
"mistralai/mixtral-8x7b-instruct"
|
97 |
]
|
98 |
|
99 |
def create_readme(config):
|
|
|
82 |
|
83 |
# Available models
|
84 |
MODELS = [
|
85 |
+
"google/gemma-2-27b-it",
|
86 |
+
"mistralai/mixtral-8x7b-instruct",
|
87 |
+
"meta-llama/llama-3.1-70b-instruct"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
88 |
]
|
89 |
|
90 |
def create_readme(config):
|
local-files/claude.md
ADDED
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# CLAUDE.md
|
2 |
+
|
3 |
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
4 |
+
|
5 |
+
## Architecture Overview
|
6 |
+
|
7 |
+
This is a **Chat UI Helper** that generates ready-to-deploy HuggingFace Spaces for educational and research chat interfaces. The project combines a Gradio-based package generator with an AI-powered configuration assistant.
|
8 |
+
|
9 |
+
### Core Components
|
10 |
+
|
11 |
+
1. **Main Application (`app.py`)**: Two-tab Gradio interface:
|
12 |
+
- **Space Generator Tab**: Creates deployable HuggingFace Space packages
|
13 |
+
- **Chat UI Helper Tab**: AI assistant for configuration guidance (imported from `chat_helper.py`)
|
14 |
+
|
15 |
+
2. **Template System**:
|
16 |
+
- `SPACE_TEMPLATE` string contains complete deployable chat interface code
|
17 |
+
- Uses Python `.format()` to inject user configurations into template
|
18 |
+
- Generates zip packages with `app.py`, `requirements.txt`, `README.md`, and `config.json`
|
19 |
+
|
20 |
+
3. **Chat Helper (`chat_helper.py`)**:
|
21 |
+
- Modular AI assistant component for configuration guidance
|
22 |
+
- Rule-based responses for common educational/research chat UI questions
|
23 |
+
- Emphasizes Mixtral-8x7B as cost-effective recommended model
|
24 |
+
|
25 |
+
### Key Architecture Patterns
|
26 |
+
|
27 |
+
- **Template Injection**: Uses `{{}}` for literal braces in generated code, `{}` for template variables
|
28 |
+
- **Modular Design**: Chat helper is separate module imported by main app
|
29 |
+
- **Configuration-Driven**: All generated spaces use environment-based API key configuration
|
30 |
+
- **Educational Focus**: Specialized for academic and research use cases
|
31 |
+
|
32 |
+
## Development Commands
|
33 |
+
|
34 |
+
### Local Development
|
35 |
+
```bash
|
36 |
+
# Install dependencies
|
37 |
+
pip install -r requirements.txt
|
38 |
+
|
39 |
+
# Run the main application
|
40 |
+
python app.py
|
41 |
+
|
42 |
+
# Test a basic assistant template
|
43 |
+
python default.py
|
44 |
+
```
|
45 |
+
|
46 |
+
### Testing Generated Packages
|
47 |
+
```bash
|
48 |
+
# Extract and test a generated zip package
|
49 |
+
unzip my_custom_space.zip
|
50 |
+
cd extracted_package
|
51 |
+
export OPENROUTER_API_KEY="your-key-here"
|
52 |
+
python app.py
|
53 |
+
```
|
54 |
+
|
55 |
+
### Requirements
|
56 |
+
- All generated chat interfaces require OpenRouter API keys
|
57 |
+
- Current Gradio version: 5.34.0 (updated from legacy 4.16.0)
|
58 |
+
- Template generates Gradio ChatInterface applications
|
59 |
+
|
60 |
+
## Template System Details
|
61 |
+
|
62 |
+
### SPACE_TEMPLATE Structure
|
63 |
+
The template generates complete HuggingFace Spaces with:
|
64 |
+
- OpenRouter API integration using configurable environment variables
|
65 |
+
- Gradio 5.x compatible ChatInterface implementation
|
66 |
+
- Error handling for missing API keys
|
67 |
+
- Configurable model, temperature, and token limits
|
68 |
+
- Support for custom example prompts
|
69 |
+
|
70 |
+
### Configuration Variables
|
71 |
+
Standard variables injected into templates:
|
72 |
+
- `{name}`: Space title/name
|
73 |
+
- `{description}`: Space description
|
74 |
+
- `{system_prompt}`: AI behavior instructions
|
75 |
+
- `{model}`: OpenRouter model identifier
|
76 |
+
- `{api_key_var}`: Environment variable name for API key
|
77 |
+
- `{temperature}`: Model temperature setting
|
78 |
+
- `{max_tokens}`: Maximum response tokens
|
79 |
+
- `{examples}`: JSON array of example prompts
|
80 |
+
|
81 |
+
### Template Compatibility
|
82 |
+
- Template uses double braces `{{API_KEY}}` for variables that should appear literally in generated code
|
83 |
+
- Single braces `{model}` are replaced during template formatting
|
84 |
+
- Generated code is compatible with HuggingFace Spaces deployment
|
85 |
+
|
86 |
+
## Model Configuration
|
87 |
+
|
88 |
+
### Default Model List
|
89 |
+
Available models prioritized by use case:
|
90 |
+
- **Budget**: `google/gemma-2-9b-it`, `mistralai/mistral-7b-instruct`
|
91 |
+
- **Recommended**: `mistralai/mixtral-8x7b-instruct` (balanced cost/performance)
|
92 |
+
- **Premium**: `anthropic/claude-3.5-sonnet`, `openai/gpt-4o`
|
93 |
+
|
94 |
+
### Chat Helper Integration
|
95 |
+
The `chat_helper.py` module provides AI-powered guidance specifically recommending Mixtral-8x7B for most educational and research use cases, with configuration examples and cost considerations.
|
96 |
+
|
97 |
+
## File Structure Patterns
|
98 |
+
|
99 |
+
- `app.py`: Main two-tab application
|
100 |
+
- `chat_helper.py`: Modular AI assistant component
|
101 |
+
- `default.py`: Basic working assistant template for testing
|
102 |
+
- `config.json`: Example configuration file
|
103 |
+
- `exp/`: Legacy experimental versions and documentation
|
104 |
+
- Generated zip files follow pattern: `{name}_{timestamp}.zip` β `{name}.zip`
|
105 |
+
|
106 |
+
## Current State
|
107 |
+
|
108 |
+
The project has evolved from experimental multi-SDK generator (`exp/` folder) to focused educational/research chat UI helper. Current production stack generates HuggingFace Spaces optimized for academic use cases with built-in configuration guidance.
|
local-files/zip/cloze_reader_assistant_1750033320.zip
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:84aac5a482cc847c796d50298da89d3964f1e1cd954933aa163142d2741639c1
|
3 |
+
size 2769
|
local-files/zip/my_ai_assistant_assistant_1750031622.zip
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:0e5a395a4f5f7c871689c0b773249ac7ed3d1f484f8b7f3839662623f197186c
|
3 |
+
size 2859
|
local-files/zip/my_ai_assistant_assistant_1750032133.zip
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:70d009797658f4eab0d4cb4e10fb7e5230d6d3ae2d839358cdabccc734ef4c99
|
3 |
+
size 2838
|
local-files/zip/my_ai_assistant_assistant_1750033267.zip
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:6f7871d5ca87f7d4ba97c0f6065a908e02c43a2794fd92fddd61252882d83f15
|
3 |
+
size 2761
|
local-files/zip/my_custom_space.zip
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:425aa4367155cde65095d7c930d2b4295ec5a0e2243badf924f21c21550ebed8
|
3 |
+
size 2837
|
local-files/zip/professor_zach_assistant_1750033356.zip
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:59eee639803656a372b04affbada5007f221c7be9f534544f932b60a3ea5f116
|
3 |
+
size 2775
|
local-files/zip/test_assistant_1750026513.zip
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:8d5b897f2e81fca7bd64207ad86676725ad34005a72e9df3f7d754fffec69d5b
|
3 |
+
size 2339
|
local-files/zip/zip.py
ADDED
@@ -0,0 +1,219 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python3
|
2 |
+
"""Test script to validate zip generation functionality"""
|
3 |
+
|
4 |
+
import json
|
5 |
+
import zipfile
|
6 |
+
import io
|
7 |
+
import os
|
8 |
+
from datetime import datetime
|
9 |
+
|
10 |
+
def create_requirements():
|
11 |
+
"""Generate requirements.txt"""
|
12 |
+
return "gradio==4.16.0\nrequests==2.31.0"
|
13 |
+
|
14 |
+
def create_readme(config):
|
15 |
+
"""Generate README with deployment instructions"""
|
16 |
+
return f"""# {config['name']}
|
17 |
+
|
18 |
+
{config['description']}
|
19 |
+
|
20 |
+
## π Quick Deploy to HuggingFace Spaces
|
21 |
+
|
22 |
+
### Step 1: Create the Space
|
23 |
+
1. Go to https://huggingface.co/spaces
|
24 |
+
2. Click "Create new Space"
|
25 |
+
3. Choose a name for your assistant
|
26 |
+
4. Select **Gradio** as the SDK
|
27 |
+
5. Set visibility (Public/Private)
|
28 |
+
6. Click "Create Space"
|
29 |
+
|
30 |
+
### Step 2: Upload Files
|
31 |
+
1. In your new Space, click "Files" tab
|
32 |
+
2. Upload these files from the zip:
|
33 |
+
- `app.py`
|
34 |
+
- `requirements.txt`
|
35 |
+
3. Wait for "Building" to complete
|
36 |
+
|
37 |
+
### Step 3: Add API Key
|
38 |
+
1. Go to Settings (βοΈ icon)
|
39 |
+
2. Click "Variables and secrets"
|
40 |
+
3. Click "New secret"
|
41 |
+
4. Name: `{config['api_key_var']}`
|
42 |
+
5. Value: Your OpenRouter API key
|
43 |
+
6. Click "Add"
|
44 |
+
|
45 |
+
### Step 4: Get Your API Key
|
46 |
+
1. Go to https://openrouter.ai/keys
|
47 |
+
2. Sign up/login if needed
|
48 |
+
3. Click "Create Key"
|
49 |
+
4. Copy the key (starts with `sk-or-`)
|
50 |
+
|
51 |
+
### Step 5: Test Your Assistant
|
52 |
+
- Go back to "App" tab
|
53 |
+
- Your assistant should be running!
|
54 |
+
- Try the example prompts or ask a question
|
55 |
+
|
56 |
+
## π Configuration
|
57 |
+
|
58 |
+
- **Model**: {config['model']}
|
59 |
+
- **Temperature**: {config['temperature']}
|
60 |
+
- **Max Tokens**: {config['max_tokens']}
|
61 |
+
- **API Key Variable**: {config['api_key_var']}
|
62 |
+
|
63 |
+
Generated on {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} with HF Assistant Converter
|
64 |
+
"""
|
65 |
+
|
66 |
+
# Fixed template based on mvp_simple.py
|
67 |
+
ASSISTANT_TEMPLATE = '''import gradio as gr
|
68 |
+
import os
|
69 |
+
import requests
|
70 |
+
import json
|
71 |
+
|
72 |
+
# Configuration
|
73 |
+
ASSISTANT_NAME = "{name}"
|
74 |
+
ASSISTANT_DESCRIPTION = "{description}"
|
75 |
+
SYSTEM_PROMPT = """{system_prompt}"""
|
76 |
+
MODEL = "{model}"
|
77 |
+
|
78 |
+
# Get API key from environment - customizable variable name
|
79 |
+
API_KEY = os.environ.get("{api_key_var}")
|
80 |
+
|
81 |
+
def generate_response(message, history):
|
82 |
+
"""Generate response using OpenRouter API"""
|
83 |
+
|
84 |
+
if not API_KEY:
|
85 |
+
return "Please set your {api_key_var} in the Space settings."
|
86 |
+
|
87 |
+
# Build messages array for the API
|
88 |
+
messages = [{{"role": "system", "content": SYSTEM_PROMPT}}]
|
89 |
+
|
90 |
+
# Add conversation history
|
91 |
+
for user_msg, assistant_msg in history:
|
92 |
+
messages.append({{"role": "user", "content": user_msg}})
|
93 |
+
if assistant_msg:
|
94 |
+
messages.append({{"role": "assistant", "content": assistant_msg}})
|
95 |
+
|
96 |
+
# Add current message
|
97 |
+
messages.append({{"role": "user", "content": message}})
|
98 |
+
|
99 |
+
# Make API request
|
100 |
+
try:
|
101 |
+
response = requests.post(
|
102 |
+
url="https://openrouter.ai/api/v1/chat/completions",
|
103 |
+
headers={{
|
104 |
+
"Authorization": f"Bearer {{API_KEY}}",
|
105 |
+
"Content-Type": "application/json"
|
106 |
+
}},
|
107 |
+
json={{
|
108 |
+
"model": MODEL,
|
109 |
+
"messages": messages,
|
110 |
+
"temperature": {temperature},
|
111 |
+
"max_tokens": {max_tokens}
|
112 |
+
}}
|
113 |
+
)
|
114 |
+
|
115 |
+
if response.status_code == 200:
|
116 |
+
return response.json()['choices'][0]['message']['content']
|
117 |
+
else:
|
118 |
+
return f"Error: {{response.status_code}} - {{response.text}}"
|
119 |
+
|
120 |
+
except Exception as e:
|
121 |
+
return f"Error: {{str(e)}}"
|
122 |
+
|
123 |
+
# Create simple Gradio interface using ChatInterface
|
124 |
+
demo = gr.ChatInterface(
|
125 |
+
fn=generate_response,
|
126 |
+
title=ASSISTANT_NAME,
|
127 |
+
description=ASSISTANT_DESCRIPTION,
|
128 |
+
examples={examples}
|
129 |
+
)
|
130 |
+
|
131 |
+
if __name__ == "__main__":
|
132 |
+
demo.launch(share=True)
|
133 |
+
'''
|
134 |
+
|
135 |
+
def test_zip_generation():
|
136 |
+
"""Test the zip generation with sample data"""
|
137 |
+
print("π§ͺ Testing zip generation...")
|
138 |
+
|
139 |
+
# Sample configuration
|
140 |
+
config = {
|
141 |
+
'name': 'Test Assistant',
|
142 |
+
'description': 'A helpful test assistant',
|
143 |
+
'system_prompt': 'You are a helpful assistant. Provide clear and accurate responses.',
|
144 |
+
'model': 'google/gemma-2-9b-it',
|
145 |
+
'api_key_var': 'OPENROUTER_API_KEY',
|
146 |
+
'temperature': 0.7,
|
147 |
+
'max_tokens': 1024,
|
148 |
+
'examples': json.dumps([
|
149 |
+
"Hello! How can you help me?",
|
150 |
+
"Tell me something interesting",
|
151 |
+
"What can you do?"
|
152 |
+
])
|
153 |
+
}
|
154 |
+
|
155 |
+
print(f"π Config: {config}")
|
156 |
+
|
157 |
+
try:
|
158 |
+
# Generate files
|
159 |
+
print("π Generating app.py content...")
|
160 |
+
app_content = ASSISTANT_TEMPLATE.format(**config)
|
161 |
+
print("β
App content generated")
|
162 |
+
|
163 |
+
print("π Generating README content...")
|
164 |
+
readme_content = create_readme(config)
|
165 |
+
print("β
README content generated")
|
166 |
+
|
167 |
+
print("π Generating requirements content...")
|
168 |
+
requirements_content = create_requirements()
|
169 |
+
print("β
Requirements content generated")
|
170 |
+
|
171 |
+
# Create zip file
|
172 |
+
print("π Creating zip file...")
|
173 |
+
import time
|
174 |
+
timestamp = int(time.time())
|
175 |
+
filename = f"test_assistant_{timestamp}.zip"
|
176 |
+
|
177 |
+
zip_buffer = io.BytesIO()
|
178 |
+
with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zip_file:
|
179 |
+
zip_file.writestr('app.py', app_content)
|
180 |
+
zip_file.writestr('requirements.txt', requirements_content)
|
181 |
+
zip_file.writestr('README.md', readme_content)
|
182 |
+
zip_file.writestr('config.json', json.dumps(config, indent=2))
|
183 |
+
|
184 |
+
# Write to file
|
185 |
+
zip_buffer.seek(0)
|
186 |
+
with open(filename, 'wb') as f:
|
187 |
+
f.write(zip_buffer.getvalue())
|
188 |
+
|
189 |
+
# Verify file
|
190 |
+
if os.path.exists(filename):
|
191 |
+
file_size = os.path.getsize(filename)
|
192 |
+
print(f"β
Zip file created: {filename} ({file_size} bytes)")
|
193 |
+
|
194 |
+
# Test zip contents
|
195 |
+
with zipfile.ZipFile(filename, 'r') as zip_file:
|
196 |
+
files_in_zip = zip_file.namelist()
|
197 |
+
print(f"π Files in zip: {files_in_zip}")
|
198 |
+
|
199 |
+
# Test app.py content
|
200 |
+
app_py_content = zip_file.read('app.py').decode('utf-8')
|
201 |
+
print(f"π app.py first 100 chars: {app_py_content[:100]}...")
|
202 |
+
|
203 |
+
return True, filename
|
204 |
+
else:
|
205 |
+
print("β Zip file not created")
|
206 |
+
return False, None
|
207 |
+
|
208 |
+
except Exception as e:
|
209 |
+
print(f"β Error during zip generation: {str(e)}")
|
210 |
+
import traceback
|
211 |
+
traceback.print_exc()
|
212 |
+
return False, None
|
213 |
+
|
214 |
+
if __name__ == "__main__":
|
215 |
+
success, filename = test_zip_generation()
|
216 |
+
if success:
|
217 |
+
print(f"π Test successful! Generated: {filename}")
|
218 |
+
else:
|
219 |
+
print("π₯ Test failed!")
|