1. Architecture Overview
GPT Academic is a Gradio-based web application designed for academic and programming productivity through LLM integration. The system provides a multi-model chat interface with a plugin architecture supporting 40+ specialized functions for code analysis, paper review, LaTeX processing, and more.
High-Level Architecture
┌─────────────────────────────────────────────────────────────────┐
│ User Browser │
└──────────────────────────────┬──────────────────────────────────┘
│ HTTP/WebSocket
┌──────────────────────────────▼──────────────────────────────────┐
│ FastAPI + Gradio Server │
│ ┌─────────────┐ ┌──────────────┐ ┌────────────────────────┐ │
│ │ main.py │ │ FastAPI │ │ Gradio 3.32.15 │ │
│ │ (entry) │ │ Server │ │ (custom fork) │ │
│ └──────┬──────┘ └──────┬───────┘ └────────────┬───────────┘ │
│ │ │ │ │
│ ┌──────▼──────────────────────────────────────────▼───────────┐ │
│ │ shared_utils/ (17 modules) │ │
│ │ config_loader · cookie_manager · fastapi_server │ │
│ │ fastapi_stream_server · handle_upload · key_pattern_manager │ │
│ └──────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────▼──────────────────────────────────┐ │
│ │ crazy_functions/ (49 plugin files) │ │
│ │ agent_fns · rag_fns · pdf_fns · latex_fns · review_fns │ │
│ └──────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────▼──────────────────────────────────┐ │
│ │ request_llms/ (LLM Bridge Layer) │ │
│ │ bridge_all.py → 30+ model bridges │ │
│ │ key_manager.py · local_llm_class.py │ │
│ └──────────────────────────┬──────────────────────────────────┘ │
└──────────────────────────────┼──────────────────────────────────┘
│
┌────────────────────┼────────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────────┐
│ OpenAI/Azure│ │ Claude/ │ │ Local Models │
│ GPT-4o │ │ Gemini/etc │ │ Ollama/vLLM │
└─────────────┘ └─────────────┘ └─────────────────┘
Entry Point Flow
main.py
├── config.py (defaults) → config_private.py (overrides) → env vars (highest priority)
├── shared_utils/config_loader.py → get_conf() resolves final values
├── themes/theme.py → CSS/JS generation, dark mode
├── core_functional.py → basic function buttons (polish, translate, grammar)
├── crazy_functional.py → plugin registry
└── Gradio Blocks UI construction → FastAPI mount → server launch
Configuration Priority Chain
Environment Variables (highest)
↓
config_private.py (user overrides, gitignored)
↓
config.py (defaults, committed)
The get_conf() function in shared_utils/config_loader.py resolves this chain at runtime for every configuration key access.
Component Responsibilities
| Component | Path | Responsibility |
|---|---|---|
main.py |
root | Gradio UI construction, app bootstrap |
config.py |
root | 80+ default settings |
core_functional.py |
root | Basic function button definitions |
crazy_functional.py |
root | Plugin registry (40+ plugins) |
toolbox.py |
root | Shared decorators, helpers, utilities |
check_proxy.py |
root | Proxy verification, auto-update check |
multi_language.py |
root | i18n support |
request_llms/bridge_all.py |
request_llms/ | Model routing dispatch |
request_llms/key_manager.py |
request_llms/ | API key rotation and blacklisting |
shared_utils/fastapi_server.py |
shared_utils/ | FastAPI app, auth, file serving |
shared_utils/fastapi_stream_server.py |
shared_utils/ | WebSocket streaming |
shared_utils/cookie_manager.py |
shared_utils/ | Per-session state |
themes/theme.py |
themes/ | Dynamic theming system |
2. System Requirements
Hardware Requirements
| Deployment Type | CPU | RAM | Storage | GPU |
|---|---|---|---|---|
| API-only (remote LLMs) | 2 cores | 4 GB | 10 GB | None |
| With PDF/LaTeX plugins | 4 cores | 8 GB | 20 GB | None |
| With local LLMs (ChatGLM, etc.) | 8+ cores | 32 GB | 100 GB | NVIDIA 8+ GB VRAM |
| Production multi-user | 8+ cores | 16 GB | 50 GB | Optional |
Software Dependencies
| Software | Version | Required |
|---|---|---|
| Python | 3.9+ | Yes |
| Gradio | 3.32.15 (bundled custom fork) | Yes |
| FastAPI | 0.110 | Yes |
| tiktoken | >=0.3.3 | Yes |
| Docker | 20.10+ | Optional |
| Docker Compose | 2.x | Optional |
| GROBID | latest | Optional (PDF parsing) |
| Milvus | latest | Optional (RAG vector store) |
| LaTeX (texlive) | latest | Optional (LaTeX plugins) |
Important
The project uses a custom fork of Gradio 3.32.15. Using standard Gradio from PyPI will cause
ModuleNotFoundErrororAttributeError: module 'gradio' has no attribute 'Floating'errors. Always use the bundled version.
Python Package Requirements
Core dependencies from the project:
tiktoken>=0.3.3
openai
anthropic>=0.18.1
zhipuai==2.0.1
dashscope
gradio==3.32.15 # custom fork
fastapi==0.110
transformers>=4.27.1,<4.42
edge-tts>=7.0.0
spacy==3.7.4
pymupdf
nltk
llamaindex==0.10.68
Warning
The
transformerslibrary is pinned to>=4.27.1,<4.42. Versions 4.42+ introduce breaking changes for local model loading (ChatGLM, InternLM, etc.).
3. Configuration Reference
All configuration lives in config.py with overrides in config_private.py (gitignored) or environment variables. The get_conf() function resolves the final value at runtime.
API Keys and Model Configuration
| Setting | Default | Description |
|---|---|---|
API_KEY |
"" |
OpenAI API key. Supports comma-separated list for rotation. |
USE_PROXY |
False |
Enable HTTP proxy |
proxies |
{"http": "socks5h://...", "https": "socks5h://..."} |
Proxy configuration dict |
LLM_MODEL |
"gpt-3.5-turbo" |
Default model selection |
AVAIL_LLM_MODELS |
(list of models) | Models shown in UI dropdown |
API_URL_REDIRECT |
{} |
URL redirect map for API endpoints |
Azure OpenAI Configuration
| Setting | Default | Description |
|---|---|---|
AZURE_ENDPOINT |
"" |
Azure OpenAI endpoint URL |
AZURE_API_KEY |
"" |
Azure API key |
AZURE_ENGINE |
"" |
Azure deployment name |
AZURE_CFG_ARRAY |
{} |
Multi-deployment configuration array |
Server Configuration
| Setting | Default | Description |
|---|---|---|
WEB_PORT |
None (auto) |
Server port; -1 for random |
AUTHENTICATION |
[] |
List of [username, password] pairs |
CUSTOM_PATH |
"/" |
URL path prefix |
SSL_KEYFILE |
"" |
Path to SSL private key |
SSL_CERTFILE |
"" |
Path to SSL certificate |
SERVER_IP_FOR_GRADIO |
"0.0.0.0" |
Bind address |
AUTO_OPEN_BROWSER |
True |
Open browser on start |
MAX_RETRY |
2 |
LLM call retry count |
File and Path Configuration
| Setting | Default | Description |
|---|---|---|
PATH_PRIVATE_UPLOAD |
"private_upload" |
User upload directory |
PATH_LOGGING |
"gpt_log" |
Log output directory |
WHEN_TO_USE_PROXY |
["Download LLM"] |
Operations that use proxy |
Feature Flags
| Setting | Default | Description |
|---|---|---|
ALLOW_RESET_CONFIG |
False |
Allow natural language config modification |
PLUGIN_HOT_RELOAD |
True |
Enable plugin hot-reloading |
MULTI_QUERY_LLM_MODELS |
"" |
Models for multi-query comparison |
NUM_CUSTOM_BASIC_BTN |
4 |
Number of custom function buttons |
LAYOUT |
"LEFT-RIGHT" |
UI layout: LEFT-RIGHT or TOP-DOWN |
DARK_MODE |
True |
Enable dark mode by default |
ADD_WAIFU |
False |
Enable animated assistant character |
CHATBOT_HEIGHT |
1115 |
Chat window height in pixels |
INIT_SYS_PROMPT |
(Chinese prompt) | System prompt for LLM |
Token and Rate Limiting
| Setting | Default | Description |
|---|---|---|
MAX_TOKEN_OUTPUT |
512 |
Max tokens per completion (overridable per model) |
MAX_TOKEN_OUTPUT_REASONING |
12800 |
Max tokens for reasoning models (o1, deepseek-reasoner) |
TOKEN_LIMIT_PER_FRAGMENT |
None |
Per-fragment token cap |
INPUT_LIMIT_PER_FRAGMENT |
None |
Input token limit |
TIMEOUT_SECONDS |
25 |
Request timeout |
DEFAULT_WORKER_NUM |
3 |
Parallel worker threads |
Plugin-Specific Configuration
| Setting | Default | Description |
|---|---|---|
GROBID_URL |
"https://qingxu98-grobid.hf.space" |
GROBID service endpoint |
DOC2X_API_KEY |
"" |
Doc2X PDF parsing API key |
ARXIV_CACHE_DIR |
None |
arXiv paper cache directory |
HUGGINGFACE_ACCESS_TOKEN |
"" |
HuggingFace token for models |
Note
The
ALLOW_RESET_CONFIGsetting defaults toFalse. When enabled, users can modify configuration via natural language commands in the chat interface — this is a significant security consideration in multi-user deployments.
Model-Specific Settings
Settings are often model-prefixed for per-model override:
# Example: per-model token limits
MAX_TOKEN_OUTPUT = 512 # global default
# Override in config_private.py:
# GPT4_MAX_TOKEN_OUTPUT = 4096
Environment Variable Override
Any setting from config.py can be overridden via environment variable of the same name:
export API_KEY="sk-xxxxx,sk-yyyyy"
export LLM_MODEL="gpt-4o"
export WEB_PORT="8080"
export AUTHENTICATION="[['admin','password123']]"
Caution
The
AUTHENTICATIONsetting via environment variable must be a valid Python literal string representation of a list of lists. Malformed values will cause startup failures.
4. Deployment & Scaling
Docker Deployment (Recommended)
The project includes Dockerfile, docker-compose.yml, and .dockerignore at the repository root.
# Build and run
docker-compose up -d
# Or build manually
docker build -t gpt-academic .
docker run -d -p 8080:8080 \
-e API_KEY="sk-your-key" \
-e LLM_MODEL="gpt-4o" \
-v ./gpt_log:/app/gpt_log \
-v ./private_upload:/app/private_upload \
gpt-academic
Docker Compose Configuration
version: '3'
services:
gpt-academic:
build: .
ports:
- "8080:8080"
environment:
- API_KEY=${API_KEY}
- LLM_MODEL=${LLM_MODEL}
volumes:
- ./config_private.py:/app/config_private.py
- ./gpt_log:/app/gpt_log
- ./private_upload:/app/private_upload
restart: unless-stopped
Bare Metal Deployment
# Clone repository
git clone https://github.com/binary-husky/gpt_academic.git
cd gpt_academic
# Install dependencies
pip install -r requirements.txt
# Create config_private.py
cat > config_private.py << 'EOF'
API_KEY = "sk-your-key-here"
LLM_MODEL = "gpt-4o"
WEB_PORT = 8080
AUTHENTICATION = [["admin", "secure_password"]]
EOF
# Start server
python main.py
Reverse Proxy (Nginx)
server {
listen 443 ssl;
server_name gpt-academic.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
}
Important
WebSocket support (
UpgradeandConnectionheaders) is mandatory for the streaming chat interface. Without WebSocket passthrough, responses will not stream in real-time.
SSL/TLS Direct Configuration
The application supports native SSL without a reverse proxy:
# config_private.py
SSL_KEYFILE = "/path/to/privkey.pem"
SSL_CERTFILE = "/path/to/fullchain.pem"
Warning
If
SSL_KEYFILEis set,SSL_CERTFILEmust also be set. Setting only one raises aValueErrorat startup.
Scaling Considerations
| Strategy | Approach | Limitation |
|---|---|---|
| Vertical | Increase RAM/CPU | Single process, GIL-bound for local models |
| Horizontal (stateless) | Multiple containers behind LB | Session state in cookies — works if sticky sessions configured |
| Worker threads | DEFAULT_WORKER_NUM |
Controls parallel LLM calls per user session |
| Multi-model | MULTI_QUERY_LLM_MODELS |
Compare outputs from multiple models simultaneously |
The application uses DEFAULT_WORKER_NUM = 3 for parallel processing within plugin executions. This controls how many LLM calls can run concurrently for a single user's operation (e.g., batch file analysis).
GROBID Service Deployment (for PDF plugins)
# Run GROBID for academic PDF parsing
docker run -d --name grobid \
-p 8070:8070 \
lfoppiano/grobid:latest
# Point GPT Academic to local GROBID
# config_private.py:
GROBID_URL = "http://localhost:8070"
Milvus Deployment (for RAG plugins)
# docker-compose for Milvus
docker-compose -f docker-compose-milvus.yml up -d
# The RAG plugins (crazy_functions/rag_fns/) connect to Milvus
# for vector storage and retrieval
5. Operations
Starting and Stopping
# Start (foreground)
python main.py
# Start (background with logging)
nohup python main.py > gpt_log/server.log 2>&1 &
# Docker
docker-compose up -d
docker-compose down
Log Management
Logs are written to gpt_log/ by default (configurable via PATH_LOGGING):
| Log Type | Location | Content |
|---|---|---|
| Chat history | gpt_log/chat_history/ |
Per-session conversation logs |
| Plugin output | gpt_log/ |
Plugin execution results, generated files |
| Server logs | stdout/stderr | FastAPI/Gradio server messages |
File Upload Management
User uploads are stored in private_upload/ (configurable via PATH_PRIVATE_UPLOAD):
private_upload/
└── {session_hash}/
└── {timestamp}/
└── uploaded_files...
Tip
Implement periodic cleanup of
private_upload/in production. The application does not automatically purge old upload directories. A cron job removing directories older than 24-48 hours is recommended.
API Key Rotation
The key_manager.py module implements automatic key rotation:
- Multiple keys are provided comma-separated in
API_KEY - Keys are distributed round-robin across requests
- Failed keys (auth errors, rate limits) are temporarily blacklisted
- Blacklisted keys are retried after a cooldown period
# config_private.py — multiple keys for rotation
API_KEY = "sk-key1,sk-key2,sk-key3"
Health Monitoring
The application does not expose a dedicated health endpoint. Monitor via:
# Check if Gradio is responsive
curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/
# Check WebSocket connectivity
curl -s -o /dev/null -w "%{http_code}" \
-H "Upgrade: websocket" \
-H "Connection: Upgrade" \
http://localhost:8080/queue/join
Auto-Update Mechanism
check_proxy.py includes an auto-update check that compares the local version against the remote repository. This runs at startup by default. In air-gapped or production environments, this behavior should be noted — it makes outbound HTTPS calls to GitHub.
Troubleshooting
Error: ModuleNotFoundError: No module named 'pkg_resources'
Cause: Python 3.12+ removed pkg_resources from the standard library. Some dependencies still reference it.
Solution:
pip install setuptools
Prevention: Pin Python to 3.11 or ensure setuptools is in requirements.
Error: AttributeError: module 'gradio' has no attribute 'Floating'
Cause: Standard Gradio installed instead of the project's custom 3.32.15 fork.
Solution:
pip uninstall gradio
# Install the bundled version from the project's requirements
pip install -r requirements.txt
Prevention: Always install from the project's pinned requirements, never pip install gradio directly.
Error: AssertionError on API_KEY format
Cause: API key does not match expected format patterns. The key_pattern_manager.py validates key prefixes: sk- (OpenAI), fk (api2d), azure- (Azure), etc.
Solution: Verify the key format matches the model being used. Check shared_utils/key_pattern_manager.py for the full pattern list.
Prevention: Use the correct key format for your provider. Multiple keys must be comma-separated with no spaces.
Error: ConnectionAbortedError during generation
Cause: Token limit exceeded — the response exceeded the model's context window.
Solution: Reduce MAX_TOKEN_OUTPUT or break input into smaller fragments via TOKEN_LIMIT_PER_FRAGMENT.
Error: GROBID_OFFLINE_EXCEPTION
Cause: GROBID service is unreachable at the configured GROBID_URL.
Solution:
# Check GROBID availability
curl -s http://localhost:8070/api/isalive
# If using the default HuggingFace Space, it may be sleeping
# Deploy a local instance for reliability
Error: RuntimeError about missing API keys
Cause: Attempting to use a model bridge without configuring its API key.
Solution: Set the appropriate key in config_private.py or environment variables. Each model family requires its specific key (e.g., ANTHROPIC_API_KEY for Claude, GOOGLE_API_KEY for Gemini).
6. Performance
Token Counting
The application uses tiktoken for accurate token counting with OpenAI models. For non-OpenAI models, approximate token counting is applied.
Timeout Configuration
TIMEOUT_SECONDS = 25 # Per-request timeout
MAX_RETRY = 2 # Retry count on failure
DEFAULT_WORKER_NUM = 3 # Parallel workers per operation
Tip
For large document analysis (papers, codebases), increase
TIMEOUT_SECONDSto 120+ andDEFAULT_WORKER_NUMto 5-8 depending on available API rate limits.
Fragment Processing
Large inputs are automatically split into fragments based on:
TOKEN_LIMIT_PER_FRAGMENT— max tokens per chunkINPUT_LIMIT_PER_FRAGMENT— max input tokens per call
This enables processing of documents that exceed a single model's context window by splitting, processing in parallel (up to DEFAULT_WORKER_NUM), and reassembling results.
Local Model Performance
Local models (ChatGLM, LLaMA, etc.) use the local_llm_class.py base class which implements:
- Multiprocess architecture to avoid GIL contention
- Separate process for model inference
- IPC via pipes for streaming tokens back to the main process
Main Process (Gradio/FastAPI)
│
├── Pipe (IPC)
│
└── Child Process (GPU inference)
└── Model loaded in VRAM
Caching
The application does not implement response caching by default. Each request hits the LLM provider. For production deployments handling repeated queries, consider adding a caching layer at the reverse proxy level.
7. Security
Authentication
Authentication is configured via the AUTHENTICATION setting:
# config_private.py
AUTHENTICATION = [
["admin", "strong_password_here"],
["user1", "another_password"],
]
When AUTHENTICATION is an empty list [], the application runs without authentication (default).
The logout endpoint is available at /academic_logout.
File Upload Security
shared_utils/handle_upload.py implements multiple protections:
- Path traversal prevention — Uploaded filenames are sanitized;
../sequences are rejected - Symlink detection — Symbolic links in upload paths are detected and rejected
- Directory confinement — All file operations are validated to stay within the user's upload directory (
private_upload/{session_hash}/) - FriendlyException — Validation failures raise user-facing errors without exposing internal paths
Caution
The file serving endpoint (
/file/{path:path}) serves files from the application directory. In production, ensure the application runs with minimal filesystem permissions and that sensitive files (config_private.py, .env) are not accessible via this endpoint.
API Key Security
- Keys in
config_private.pyare gitignored by default - The key rotation system in
key_manager.pyblacklists compromised keys automatically ALLOW_RESET_CONFIG = Falseprevents users from extracting or modifying keys via the chat interface
Warning
Never commit API keys to the repository. GitHub issue #2270 documents a case where a HuggingFace API key was accidentally exposed. Always use
config_private.pyor environment variables.
Network Security
| Setting | Security Impact |
|---|---|
SERVER_IP_FOR_GRADIO = "0.0.0.0" |
Binds to all interfaces — restrict in production |
SSL_KEYFILE / SSL_CERTFILE |
Enable TLS termination at the application level |
USE_PROXY / proxies |
Route LLM traffic through proxy (privacy, compliance) |
WHEN_TO_USE_PROXY |
Fine-grained proxy application |
Configuration Security
The ALLOW_RESET_CONFIG flag (default False) controls whether users can modify runtime configuration via natural language commands in the chat. When enabled:
- Users can change
API_KEY,LLM_MODEL, and other settings via chat - Changes persist for the session only
- This is intended for single-user/development scenarios
For multi-user production deployments, this must remain False.
Session Isolation
Each user session gets a unique hash (managed by shared_utils/cookie_manager.py). File uploads, chat history, and plugin state are isolated per session via this hash.
8. Developer Internals
Plugin Architecture
Plugin Types
- Legacy plugins — Standalone functions decorated with
@CatchException:
from toolbox import CatchException
@CatchException
def my_plugin(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, user_request):
# Plugin logic here
pass
- New-generation plugins — Class-based using
GptAcademicPluginTemplate:
from crazy_functions.plugin_template.plugin_class_template import GptAcademicPluginTemplate
class MyPlugin(GptAcademicPluginTemplate):
def define_arg_selection_menu(self):
# Return up to 8 argument definitions
pass
def execute(self, txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, user_request):
# Plugin logic
pass
Plugin Registration
Plugins are registered in crazy_functional.py:
from crazy_functions.my_plugin import my_plugin
function_plugins = {
"My Plugin Name": {
"Group": "编程", # Plugin group
"Color": "stop", # Button color
"AsButton": True, # Show as button vs dropdown
"Function": HotReload(my_plugin), # Hot-reload wrapper
}
}
Hot Reload
The HotReload() wrapper enables plugin modification without server restart. When PLUGIN_HOT_RELOAD = True, the wrapper re-imports the plugin module on each invocation.
Plugin Groups
| Group | Chinese | Content |
|---|---|---|
| Dialog | 对话 | Conversation enhancement |
| Programming | 编程 | Code analysis, generation |
| Academic | 学术 | Paper review, LaTeX, citations |
| Agent | 智能体 | AutoGen agents, autonomous tasks |
Plugin Access to System Resources
Plugins receive these parameters:
txt— User input textllm_kwargs— Model configuration (model name, temperature, etc.)plugin_kwargs— Plugin-specific arguments (up to 8 from arg selection menu)chatbot— Chat history (mutable, for streaming updates)history— Full conversation historysystem_prompt— Current system promptuser_request— Request metadata (including file upload paths)
LLM Bridge System
request_llms/bridge_all.py implements a routing layer that dispatches to model-specific bridges:
# Model prefix → Bridge mapping (simplified)
model_info = {
"gpt-3.5-turbo": bridge_chatgpt,
"gpt-4": bridge_chatgpt,
"gpt-4o": bridge_chatgpt,
"claude-3-": bridge_claude,
"gemini-": bridge_google_gemini,
"glm-": bridge_zhipu,
"qwen-": bridge_qwen,
"deepseek-": bridge_deepseek,
"moonshot-": bridge_moonshot,
"ollama-": bridge_ollama,
"one-api-": bridge_one_api,
"openrouter-": bridge_openrouter,
"vllm-": bridge_vllm,
}
Each bridge implements:
predict()— Synchronous completionpredict_no_ui_long_connection()— Long-running without UI updates- Streaming response handling
- Error handling and retry logic
Key Pattern Manager
shared_utils/key_pattern_manager.py validates API key formats and routes to the correct provider:
| Pattern | Provider |
|---|---|
sk- |
OpenAI |
fk |
api2d |
azure- |
Azure OpenAI |
| (other patterns) | Respective providers |
This enables a single API_KEY field to auto-detect the provider and route accordingly.
Local LLM Architecture
request_llms/local_llm_class.py provides the base class for running local models:
┌─────────────────────────────────────┐
│ Main Process (Gradio) │
│ ┌────────────────────────────────┐ │
│ │ LocalLLMClass instance │ │
│ │ - Spawns child process │ │
│ │ - Manages pipe communication │ │
│ │ - Handles token streaming │ │
│ └──────────────┬─────────────────┘ │
└─────────────────┼───────────────────┘
│ Pipe (IPC)
┌─────────────────▼───────────────────┐
│ Child Process (GPU) │
│ - Loads model into VRAM │
│ - Runs inference │
│ - Streams tokens back via pipe │
└─────────────────────────────────────┘
This architecture avoids GIL contention between the web server and model inference.
Theme System
themes/theme.py provides dynamic theming:
- CSS generation based on configuration
- Dark mode toggle support
- Custom JavaScript injection via
themes/*.js - Gradio component styling overrides
FastAPI Endpoints
| Method | Path | Module | Purpose |
|---|---|---|---|
| GET | / |
toolbox.py:717 |
Redirect to Gradio UI |
| GET | /file/{path:path} |
fastapi_server.py |
Serve generated/uploaded files |
| HEAD/GET | /file={path_or_url:path} |
fastapi_server.py |
Alternative file serving |
| GET | /academic_logout |
fastapi_server.py:171 |
Session logout |
| POST | /vits |
fastapi_server.py:239 |
TTS forward proxy |
| GET | /favicon.ico |
fastapi_server.py:264 |
Favicon serving |
| POST | /predict_user_input |
fastapi_stream_server.py:493 |
Chat prediction (non-Gradio clients) |
| POST | /core_functional |
fastapi_stream_server.py:533 |
Execute core functions |
| POST | /upload |
fastapi_stream_server.py:547 |
File upload endpoint |
Cookie/Session Management
shared_utils/cookie_manager.py manages per-user session state:
- Session hash generation and validation
- State persistence across page reloads
- Plugin state isolation between users
- Upload directory assignment per session
Void Terminal
crazy_functions/vt_fns/ implements the Void Terminal — a stateful plugin execution environment that maintains context across multiple plugin invocations within a session.
9. Integration Points
OpenAI-Compatible APIs
Any OpenAI-compatible API can be integrated via API_URL_REDIRECT:
# config_private.py
API_URL_REDIRECT = {
"https://api.openai.com/v1/chat/completions": "https://your-proxy.example.com/v1/chat/completions"
}
This enables integration with:
- Local OpenAI-compatible servers (LiteLLM, LocalAI, text-generation-webui)
- Corporate API gateways
- Rate-limiting proxies
Ollama Integration
# config_private.py
LLM_MODEL = "ollama-llama3"
AVAIL_LLM_MODELS = ["ollama-llama3", "ollama-codellama", "ollama-mistral"]
OLLAMA_HOST = "http://localhost:11434" # if not default
Models prefixed with ollama- are automatically routed to the Ollama bridge.
vLLM Integration
# config_private.py
LLM_MODEL = "vllm-your-model"
# Requires vLLM server running with OpenAI-compatible API
One-API / OpenRouter
# One-API (unified gateway)
LLM_MODEL = "one-api-gpt4"
API_KEY = "your-one-api-key"
# OpenRouter
LLM_MODEL = "openrouter-anthropic/claude-3-opus"
API_KEY = "your-openrouter-key"
RAG Pipeline (LlamaIndex + Milvus)
The crazy_functions/rag_fns/ module implements retrieval-augmented generation:
Documents → LlamaIndex (chunking + embedding) → Milvus (vector store)
↓
User Query → Embedding → Milvus (similarity search) → Context → LLM → Response
Configuration for RAG requires:
- Running Milvus instance
- LlamaIndex 0.10.68
- Embedding model access (OpenAI or local)
GROBID Integration (Academic PDF)
# config_private.py
GROBID_URL = "http://localhost:8070" # Local GROBID instance
# Or use the public HuggingFace Space (unreliable):
# GROBID_URL = "https://qingxu98-grobid.hf.space"
GROBID provides structured extraction of academic papers (title, authors, abstract, sections, references).
Doc2X Integration (PDF)
# config_private.py
DOC2X_API_KEY = "your-doc2x-key"
Alternative PDF parsing service with better handling of complex layouts, tables, and equations.
Text-to-Speech (Edge TTS)
# Requires edge-tts>=7.0.0
# The /vits endpoint forwards TTS requests
# No additional configuration needed beyond package installation
AutoGen Agent System
crazy_functions/agent_fns/ integrates Microsoft AutoGen for multi-agent conversations:
- Agent-to-agent communication
- Task decomposition
- Tool use within agent chains
Note
The AutoGen integration uses the older AutoGen API. Compatibility with AutoGen 0.4+ (the AG2 rewrite) has not been verified.
Webhook / External Notification
The application does not include built-in webhook support for completion notifications. For integration with external systems (Slack, Discord, etc.), implement a wrapper around the /predict_user_input endpoint or add custom logic in a plugin.
Multi-Language Support
multi_language.py provides i18n support. The primary interface is Chinese with English as secondary. Translations are managed via the multi-language module.