- 09 Apr, 2026 19 commits
-
-
Your Name authored
Fix Kilo OAuth2 500 errors with retry logic: - Root cause: Vercel edge node cdg1 returning 500 errors - Added retry logic with exponential backoff (3 attempts) - Logs Vercel edge node ID to track which node handles request - Retries automatically route to different edge nodes - Delays: 1s, 2s, 4s between retries
-
Your Name authored
Add detailed request/response logging for Kilo OAuth2: - Log exact request URL, headers, and body - Log httpx version being used - Log complete response status, headers, and body - This will help diagnose the 500 error difference between local and remote
-
Your Name authored
Add explicit headers to Kilo OAuth2 device auth request: - Added Content-Length: 0 header - Added User-Agent header - Attempting to fix 500 error on remote servers
-
Your Name authored
Fix Kilo OAuth2 device auth for remote servers: - Changed from data={} to explicit content=b'' with Content-Type header - This ensures proper form-urlencoded POST request format - Fixes 500 error when calling from remote servers behind nginx -
Your Name authored
-
Your Name authored
- Added version number to debug startup message - Fixed Kilo OAuth2 device auth endpoint (form encoding) - Fixed dashboard save endpoints (rotations/autoselect) - Fixed analytics page template syntax error - Fixed Kilo provider model prefetch at startup - Added favicon to PyPI package
-
Your Name authored
Fixes: - Kilo OAuth2 device auth endpoint now uses form encoding instead of JSON - Final fix for Kilo device auth 500 Internal Server Error
-
Your Name authored
Fixes: - Kilo OAuth2 device auth initiation 500 error (missing empty json payload) - Kilo provider model prefetch at startup for OAuth2 credentials - Rotations save endpoint 500 error - Autoselect save endpoint config shadowing bug - Analytics page Jinja2 TemplateSyntaxError
-
Your Name authored
Fixes: - Kilo provider model prefetch at startup for OAuth2 credentials - Rotations save endpoint 500 error (form parameter mismatch, config shadowing) - Autoselect save endpoint config shadowing bug - Analytics page Jinja2 TemplateSyntaxError (missing closing parenthesis) - FormData JSON serialization in validation error handler
-
Your Name authored
v0.99.7 - Fixed undefined provider_key variable bug in OAuth2 handlers, fixed config shadowing bug in rotations save handler
-
Your Name authored
- Remove automatic model detection during provider save operations - OAuth2 providers now only show models when 'Get Models from Provider' is clicked - Users have full control over when models are fetched and saved - Bump version to 0.99.6
-
Your Name authored
- Fixed malformed url_for() calls with extra quotes in providers.html - Corrected uploadCodexFile function JavaScript syntax - Fixed remaining hardcoded OAuth2 URLs - All JavaScript template syntax errors resolved - Updated version in setup.py, pyproject.toml, aisbf/__init__.py, and PYPI.md - Added changelog entry for 0.99.5
-
Your Name authored
- Fixed malformed url_for() calls in uploadCodexFile function (extra quotes) - Fixed hardcoded /dashboard/claude/auth/complete URL to use url_for() - All JavaScript syntax errors resolved for proper template rendering
-
Your Name authored
- Fixed OAuth2 authentication endpoints not respecting reverse proxy subpaths - Updated all OAuth2 JavaScript fetch calls to use url_for() instead of hardcoded /dashboard/ paths - Fixed Claude, Kilo, Codex, and Qwen OAuth2 authentication flows for reverse proxy deployments - Fixed file upload endpoints, rate limits data endpoint, user management endpoints, and autoselect save endpoint - OAuth2 authentication buttons now work correctly behind nginx reverse proxy with /aisbf/ location - Updated version in setup.py, pyproject.toml, aisbf/__init__.py, and PYPI.md - Added changelog entry for 0.99.4
-
Your Name authored
- 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
-
Your Name authored
- Fixed Jinja2 template syntax errors in dashboard templates - Updated version in pyproject.toml, setup.py, and aisbf/__init__.py - Updated PYPI.md and CHANGELOG.md with new version
-
Your Name authored
- Corrected nested template tags in dashboard templates - All fetch() calls and URL generations now use proper url_for syntax - Templates should render correctly now
-
Your Name authored
- Fix login redirect after authentication not respecting proxy subpaths - Modified url_for function to return relative URLs when behind reverse proxy - Updated login form action and template URLs to use url_for - Fixed JavaScript fetch calls in providers and rotations templates - Bumped version to 0.99.1 in all configuration files - Updated CHANGELOG.md and PYPI.md with new version
-
Your Name authored
- Implemented complete OAuth2 Device Authorization Grant with PKCE (S256) - Added aisbf/auth/qwen.py for OAuth2 authentication - Added aisbf/providers/qwen.py for OpenAI-compatible DashScope API - Cross-process token synchronization with file locking - Automatic token refresh with 30-second expiry buffer - Optional API key mode (bypass OAuth2) - Dashboard integration ready - Free tier: 1,000 requests/day, 60 requests/minute - Available models: qwen-plus, qwen-turbo, qwen-max, coder-model - Updated documentation in AI.PROMPT, README.md, and CHANGELOG.md - Version bumped to 0.99.0
-
- 04 Apr, 2026 7 commits
-
-
Your Name authored
-
Your Name authored
-
Your Name authored
v0.9.9: User-based configuration routing for providers, rotations, autoselects, and OAuth2 credentials - Config admin (from aisbf.json, user_id=None) saves configurations to JSON files - Database users save configurations to the database (user_providers, user_rotations, user_autoselects tables) - Dashboard endpoints check user type and route accordingly - File upload endpoint supports both config admin (files) and database users (database) - MCP server tools accept user_id parameter and route to appropriate storage - OAuth2 credential handling already implemented this pattern (Claude, Kilo, Codex) - Updated CHANGELOG.md, setup.py, and pyproject.toml
-
Your Name authored
-
Your Name authored
- Added find_config_file() to check config locations in correct order - Added get_host() to read server.host from config (defaults to 127.0.0.1) - Fixed get_port() to read from server.port instead of top-level port - Updated start_server() and start_daemon() to use config-based host - Updated CHANGELOG.md with the fix
-
Your Name authored
- Changed authenticate_with_device_flow() to request_device_code_flow() + poll_device_code_completion() - /dashboard/codex/auth/start now returns immediately with verification URI and user code - /dashboard/codex/auth/poll checks for completion status - Fixed poll_device_code_token to raise exception for 403/404 (pending state) - Dashboard JavaScript opens popup window with verification URI immediately
-
Your Name authored
- New codex provider type using OpenAI-compatible protocol - OAuth2 authentication via Device Authorization Grant flow - Provider handler in aisbf/providers/codex.py - OAuth2 handler in aisbf/auth/codex.py - Dashboard integration with authentication UI - Token refresh with automatic retry - API key exchange from ID token - Updated version to 0.9.8 in setup.py and pyproject.toml - Updated CHANGELOG.md, README.md, PYPI.md with Codex documentation - Added codex provider configuration to config/providers.json
-
- 03 Apr, 2026 12 commits
-
-
Your Name authored
-
Your Name authored
-
Your Name authored
-
Your Name authored
- Trigger: Press ArrowUp, ArrowDown, ArrowUp in sequence within 10 seconds - Opens a Snake game in a popup window - Classic Snake gameplay with difficulty selection - Retro arcade-style with Press Start 2P font
-
Your Name authored
- Fixed ImportError: count_messages_tokens missing by correcting setup.py data_files structure - Split data_files into separate entries to preserve subdirectory structure (aisbf/, aisbf/providers/, aisbf/providers/kiro/, aisbf/auth/) - Added 6 missing dashboard templates (user_index.html, user_providers.html, etc.) - Removed install_requires from setup.py (dependencies managed via venv) - Updated aisbf.sh to only install requirements on first venv creation - Added Kiro-cli and Kilocode OAuth2 provider support documentation - Removed duplicate entries in documentation (Token Usage Analytics, Claude OAuth2) - Provider module refactoring documentation updates - Version bumped to 0.9.4
-
Your Name authored
-
Your Name authored
-
Your Name authored
-
Your Name authored
-
Your Name authored
-
Your Name authored
-
Your Name authored
- Updated README.md with comprehensive documentation for new features: * User-Specific API Endpoints with Bearer token authentication * Adaptive Rate Limiting with learning from 429 responses * Model Metadata Extraction with automatic pricing/rate limit detection * Enhanced Analytics Filtering by provider/model/rotation * Updated Web Dashboard feature list - Updated DOCUMENTATION.md with detailed sections: * Adaptive Rate Limiting configuration and benefits * Model Metadata Extraction features and dashboard integration - Updated CHANGELOG.md: * Moved Unreleased section to version 0.9.2 (2026-04-03) * Added comprehensive list of new features and changes - Version bump to 0.9.2: * Updated pyproject.toml version * Updated aisbf/__init__.py version This release focuses on improving documentation coverage for recently added features including user-specific API endpoints, adaptive rate limiting, model metadata extraction, and analytics filtering.
-
- 01 Apr, 2026 2 commits
-
-
Your Name authored
Your theory was correct! Claude Code uses the Anthropic SDK with the authToken parameter (not apiKey) for OAuth2 authentication. From vendors/claude/src/services/api/client.ts lines 300-315: const clientConfig = { apiKey: isClaudeAISubscriber() ? null : apiKey || getAnthropicApiKey(), authToken: isClaudeAISubscriber() ? getClaudeAIOAuthTokens()?.accessToken : undefined, } return new Anthropic(clientConfig) Changes: - providers.py: Use auth_token=access_token (not api_key) for SDK client - claude_auth.py: Remove create_api_key() and get_api_key() methods (not needed - OAuth2 token is used directly with SDK auth_token) The create_api_key endpoint is only for creating API keys for use in other contexts (CI/CD, IDEs), not for the main CLI. -
Your Name authored
Claude Code doesn't use the OAuth2 access token directly for API requests. Instead, it exchanges the OAuth2 token for an API key via: POST https://api.anthropic.com/api/oauth/claude_cli/create_api_key Authorization: Bearer {oauth_access_token} This returns a 'raw_key' which is the actual API key used for API requests. Changes: - claude_auth.py: Add create_api_key() and get_api_key() methods - create_api_key(): Exchanges OAuth2 token for API key - get_api_key(): Gets stored API key or creates one if needed - providers.py: Update _get_sdk_client() to use API key instead of OAuth2 token This matches the Claude Code flow in vendors/claude/src/services/oauth/client.ts
-