Thanks for your interest in contributing to DS2API!
- Go 1.24+
- Node.js 20+ (for WebUI development)
- npm (bundled with Node.js)
# 1. Clone
git clone https://github.com/CJackHwang/ds2api.git
cd ds2api
# 2. Configure
cp config.example.json config.json
# Edit config.json with test accounts
# 3. Run backend
go run ./cmd/ds2api
# Default: http://localhost:5001# 1. Navigate to WebUI directory
cd webui
# 2. Install dependencies
npm install
# 3. Start dev server (hot reload)
npm run dev
# Default: http://localhost:5173, auto-proxies API to backendWebUI tech stack:
- React + Vite
- Tailwind CSS
- Bilingual language packs:
webui/src/locales/zh.json/en.json
docker-compose -f docker-compose.dev.yml up| Language | Standards |
|---|---|
| Go | Run gofmt and ensure go test ./... passes before committing |
| JavaScript/React | Follow existing project style (functional components) |
| Commit messages | Use semantic prefixes: feat:, fix:, docs:, refactor:, style:, perf:, chore: |
- Fork the repo
- Create a branch (e.g.
feature/xxxorfix/xxx) - Commit changes
- Push your branch
- Open a Pull Request
💡 If you modify files under
webui/, no manual build is needed — CI handles it automatically. If you want to verify the generatedstatic/admin/assets locally, you can still run./scripts/build-webui.sh.
Manually build WebUI to static/admin/:
./scripts/build-webui.sh# Go + Node unit tests (recommended)
./tests/scripts/run-unit-all.sh
# End-to-end live tests (real accounts)
./tests/scripts/run-live.shds2api/
├── cmd/
│ ├── ds2api/ # Local/container entrypoint
│ └── ds2api-tests/ # End-to-end testsuite entrypoint
├── api/
│ ├── index.go # Vercel Serverless Go entry
│ ├── chat-stream.js # Vercel Node.js stream relay
│ └── (rewrite targets in vercel.json)
├── internal/
│ ├── account/ # Account pool and concurrency queue
│ ├── adapter/
│ │ ├── openai/ # OpenAI adapter
│ │ ├── claude/ # Claude adapter
│ │ └── gemini/ # Gemini adapter
│ ├── admin/ # Admin API handlers
│ ├── auth/ # Auth and JWT
│ ├── claudeconv/ # Claude message conversion
│ ├── compat/ # Compatibility helpers
│ ├── config/ # Config loading and hot-reload
│ ├── deepseek/ # DeepSeek client, PoW WASM
│ ├── js/ # Node runtime stream/compat logic
│ ├── devcapture/ # Dev packet capture
│ ├── format/ # Output formatting
│ ├── prompt/ # Prompt building
│ ├── server/ # HTTP routing (chi router)
│ ├── sse/ # SSE parsing utilities
│ ├── stream/ # Unified stream consumption engine
│ ├── testsuite/ # Testsuite core logic
│ ├── util/ # Common utilities
│ └── webui/ # WebUI static hosting
├── webui/ # React WebUI source
│ └── src/
│ ├── app/ # Routing, auth, config state
│ ├── features/ # Feature modules
│ ├── components/ # Shared components
│ └── locales/ # Language packs
├── scripts/ # Build and test scripts
├── tests/ # Unit tests, Node tests, and end-to-end tests
├── plans/ # Plans, gates, and manual smoke-test records
├── static/admin/ # WebUI build output (not committed)
├── Dockerfile # Multi-stage build
├── docker-compose.yml # Production
├── docker-compose.dev.yml # Development
└── vercel.json # Vercel config
Please use GitHub Issues and include:
- Steps to reproduce
- Relevant log output
- Environment info (OS, Go version, deployment method)