Remove the ANTHROPIC_MODEL_MAP layer — /v1/messages now uses the
same model names as /v1/chat/completions (deepseek-v4-flash-free,
gpt-5.4-mini-no-login, deepseek/deepseek-v4-flash). This way users
send the original model name and it routes to the correct backend.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Use anthReq.model instead of backendModel so the backend receives
the user-sent model name (e.g. claude-sonnet-4) rather than the
internal mapped name.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Response handler already calls markFailed() on non-2xx and network
errors (which rotates the proxy). The preamble at attempt >= 2 was
calling markFailed() again, double-rotating and skipping a proxy.
Changed preamble to use rotate() instead of markFailed().
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Previously only retried on network errors (fetch exceptions). Now also
rotates to next proxy when upstream returns non-2xx (429 rate limit,
5xx, etc). Applies to both OpenAI and Anthropic endpoints.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Create src/lib/anthropic-proxy.ts: accepts Anthropic Messages API
format (POST /v1/messages) and routes to the same backend providers
- Anthropic model names (claude-sonnet-4, claude-3-haiku, claude-opus-4)
map to backend models with full request/response translation
- Streaming (SSE) via Anthropic protocol: message_start,
content_block_delta, message_stop events
- Add /v1/messages route to server with CORS and proxy pool fallback
- Reuses MODEL_ROUTES from ai-proxy.ts for consistent backend routing
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Create src/lib/ai-proxy.ts: routes OpenAI chat completions requests
to backend providers (opencode.ai, surfsense.com, deep-seek.ai)
based on model name with request/response translation
- Add POST /v1/chat/completions route to server with streaming (SSE)
support, CORS, and proxy pool fallback on failure
- Add GET /v1/models route returning available model list
- Direct-first strategy: try backend directly, fall back to proxy pool
on network failure (consistent with relay behavior)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Add src/lib/proxy-pool.ts: round-robin proxy pool that reads
proxy.txt (host:port:user:pass), tracks consecutive failures,
and rotates on threshold
- Integrate into src/index.ts: on fetch network error, mark proxy
as failed, rotate to next, and retry the request once
- proxy.txt loaded from PROXY_FILE/PROXY_LIST env var or ./proxy.txt
- Graceful no-op when proxy.txt doesn't exist (Vercel/Workers)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat: update Home component with new UI elements and improved request handling
chore: add components.json for component configuration
feat: implement Badge component for status indication
feat: create Button component for consistent styling
feat: develop Card component structure for content display
feat: add Input component for user input fields
feat: implement Label component for form accessibility
feat: create Select component for dropdown functionality
feat: add Separator component for visual separation
feat: implement Toaster component for notifications
feat: create Tabs component for tabbed navigation
feat: add Textarea component for multi-line input
feat: add utility functions for class name management
- Removed old relay utilities and tests, replacing them with a new structure under `src/lib/relay-utils.ts`.
- Implemented a new edge function in `app/api/proxy/route.ts` to handle proxy requests.
- Created a new Next.js layout and page structure for the frontend, including a user interface for testing the proxy.
- Added Tailwind CSS for styling and configured PostCSS.
- Updated TypeScript configuration for better compatibility with Next.js.
- Removed unused files and configurations related to the previous setup.