Commit 8b94a935 authored by Your Name's avatar Your Name

Version 0.99.3: Fix template download links and Jinja2 syntax errors

- Fixed malformed Jinja2 template syntax in user_providers.html causing download link issues
- Corrected URL generation for authentication file download links
- Fixed extension download link in providers.html template
- All template syntax errors resolved for proper dashboard rendering
- Updated version in setup.py, pyproject.toml, aisbf/__init__.py, and PYPI.md
- Added changelog entry for 0.99.3
parent 36192a0f
......@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [0.99.3] - 2026-04-09
### Fixed
- **Template Download Links**: Fixed malformed Jinja2 template syntax in user_providers.html causing download link issues
- Corrected URL generation for authentication file download links
- Fixed extension download link in providers.html template
- All template syntax errors resolved for proper dashboard rendering
### Changed
- **Version Bump**: Updated version to 0.99.3 in setup.py, pyproject.toml, and aisbf/__init__.py
## [0.99.2] - 2026-04-09
### Fixed
......
......@@ -41,8 +41,8 @@ python -m build
```
This creates:
- `dist/aisbf-0.99.2.tar.gz` - Source distribution
- `dist/aisbf-0.99.2-py3-none-any.whl` - Wheel distribution
- `dist/aisbf-0.99.3.tar.gz` - Source distribution
- `dist/aisbf-0.99.3-py3-none-any.whl` - Wheel distribution
## Testing the Package
......@@ -50,7 +50,7 @@ This creates:
```bash
# Install from the built wheel
pip install dist/aisbf-0.99.2-py3-none-any.whl
pip install dist/aisbf-0.99.3-py3-none-any.whl
# Test the installation
aisbf status
......
......@@ -54,7 +54,7 @@ from .auth.qwen import QwenOAuth2
from .handlers import RequestHandler, RotationHandler, AutoselectHandler
from .utils import count_messages_tokens, split_messages_into_chunks, get_max_request_tokens_for_model
__version__ = "0.99.2"
__version__ = "0.99.3"
__all__ = [
# Config
"config",
......
......@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "aisbf"
version = "0.99.2"
version = "0.99.3"
description = "AISBF - AI Service Broker Framework || AI Should Be Free - A modular proxy server for managing multiple AI provider integrations"
readme = "README.md"
license = "GPL-3.0-or-later"
......
......@@ -49,7 +49,7 @@ class InstallCommand(_install):
setup(
name="aisbf",
version="0.99.2",
version="0.99.3",
author="AISBF Contributors",
author_email="stefy@nexlab.net",
description="AISBF - AI Service Broker Framework || AI Should Be Free - A modular proxy server for managing multiple AI provider integrations",
......
......@@ -62,12 +62,12 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
<h3 style="margin-top: 30px; margin-bottom: 15px;">Quick Actions</h3>
<div style="display: flex; gap: 10px; flex-wrap: wrap;">
<a href="{{ url_for(request, "/dashboard/providers" class="btn">Manage Providers</a>
<a href="{{ url_for(request, "/dashboard/rotations" class="btn">Manage Rotations</a>
<a href="{{ url_for(request, "/dashboard/autoselect" class="btn">Manage Autoselect</a>
<a href="{{ url_for(request, "/dashboard/prompts" class="btn">Manage Prompts</a>
<a href="{{ url_for(request, "/dashboard/rate-limits" class="btn">Rate Limits</a>
<a href="{{ url_for(request, "/dashboard/response-cache/stats" class="btn">Response Cache</a>
<a href="{{ url_for(request, "/dashboard/settings" class="btn btn-secondary">Server Settings</a>
<a href="{{ url_for(request, '/dashboard/providers') }}" class="btn">Manage Providers</a>
<a href="{{ url_for(request, '/dashboard/rotations') }}" class="btn">Manage Rotations</a>
<a href="{{ url_for(request, '/dashboard/autoselect') }}" class="btn">Manage Autoselect</a>
<a href="{{ url_for(request, '/dashboard/prompts') }}" class="btn">Manage Prompts</a>
<a href="{{ url_for(request, '/dashboard/rate-limits') }}" class="btn">Rate Limits</a>
<a href="{{ url_for(request, '/dashboard/response-cache/stats') }}" class="btn">Response Cache</a>
<a href="{{ url_for(request, '/dashboard/settings') }}" class="btn btn-secondary">Server Settings</a>
</div>
{% endblock %}
......@@ -1369,7 +1369,7 @@ async function authenticateClaude(key) {
This extension intercepts localhost OAuth2 callbacks and redirects them to your AISBF server.
</p>
<div style="display: flex; gap: 10px; margin-top: 10px;">
<a href="{{ url_for(request, "/dashboard/extension/download" class="btn" style="background: #4a9eff; color: white; text-decoration: none; padding: 8px 15px; border-radius: 3px; font-size: 13px;">
<a href="{{ url_for(request, '/dashboard/extension/download') }}" class="btn" style="background: #4a9eff; color: white; text-decoration: none; padding: 8px 15px; border-radius: 3px; font-size: 13px;">
📥 Download Extension
</a>
<button type="button" class="btn btn-secondary" onclick="showExtensionInstructions()" style="padding: 8px 15px; font-size: 13px;">
......
......@@ -335,10 +335,10 @@ async function loadAuthFiles(providerId) {
try {
const response = await fetch(`/dashboard/user/providers/${encodeURIComponent(providerId)}/files`);
const data = await response.json();
const container = document.getElementById(`auth-files-${providerId}`);
if (!container) return;
if (data.files && data.files.length > 0) {
container.innerHTML = data.files.map(file => `
<div class="auth-file-item" style="background: #0f3460; padding: 8px; margin: 5px 0; border-radius: 4px; display: flex; justify-content: space-between; align-items: center;">
......@@ -347,7 +347,7 @@ async function loadAuthFiles(providerId) {
<span style="color: #a0a0a0; font-size: 0.9em;"> (${formatFileSize(file.file_size)})</span>
</span>
<span>
<a href="{{ url_for(request, "/dashboard/user/providers/${encodeURIComponent(providerId)}/files/${file.file_type}/download" class="btn btn-secondary btn-sm" style="margin-right: 5px;">Download</a>
<a href="/dashboard/user/providers/${encodeURIComponent(providerId)}/files/${file.file_type}/download" class="btn btn-secondary btn-sm" style="margin-right: 5px;">Download</a>
<button class="btn btn-danger btn-sm" onclick="deleteAuthFile('${providerId}', '${file.file_type}')">Delete</button>
</span>
</div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment