- Remove t.Skip for TestSendMessageWithImage (qwen3-8b-vision works with base64)
- Add test_image.jpg (400x300) to test directory alongside test file
- Load image at runtime, convert to base64 data URL for API
- Collect full response in bytes.Buffer and verify non-empty output
- Remove dependency on /tmp/dog.jpg, embed small PNG as base64 data URL
- Add t.Skip for qwen3-8b-vision tests (LlamaSwap returns 502 for vision)
- Remove unused encoding/base64 and os imports
- Use model constant for consistency across tests
Add vision/multimodal support to chat, allowing users to send images
alongside or instead of text prompts. Images are transmitted and persisted
as base64 data URLs.
Backend:
- Add Images []string to Message struct for persistence
- Add Images []string to GenerateTextRequest with relaxed validation
- Build multimodal user messages using OpenAI SDK content parts
- Pass images through from handlers to client
- Deep-copy Images slice in message cloning
Frontend:
- Add images?: string[] to Message and GenerateTextRequest types
- Add image selection state and file input handler
- Add camera icon button, hidden file input, and image preview strip
- Render images in user message bubbles
- Pass images through to GenerateTextRequest
Tests:
- Add TestSendMessageWithImage for vision model testing
vLLM sends thinking content in a "reasoning" delta field, unlike
DeepSeek which uses "reasoning_content". Check both field names so
thinking blocks render for vLLM-hosted models like qwen3.6-27b-thinking.
Also update client tests to exercise thinking output and skip by default
so they don't run in Drone CI (require live LLM API).
Add cache-busting query parameter to the stream fetch URL so each
tab gets a unique request and the browser cannot reuse an in-flight
response. Remove redundant Transfer-Encoding header that Go sets
automatically.
Change build script to output to public/dist instead of ../backend/web/static/dist.
The Dockerfile copies from frontend/public/, so the previous path caused builds
to output to a non-existent directory, resulting in stale files being deployed.
Also add mkdir -p to dev script for robustness.
Add .gitkeep to backend/web/static/ to ensure directory exists
for Go embed directive. The static/* pattern requires at least
one file to exist at build time, otherwise compilation fails.
Update .gitignore to allow .gitkeep while ignoring other contents.
Embed frontend build output directly into Go binary using //go:embed.
This removes runtime dependency on ../frontend/public/ path and
simplifies Docker builds by serving assets from embedded filesystem.
- Add backend/web/embed.go with embed.FS directive
- Update server to serve from embedded static assets
- Update Makefile to copy frontend build to web/static/
- Update Dockerfile for simplified multi-stage build
- Update frontend package.json output paths
- Remove custom 'oc' command from flake.nix dev shell
Replace hardcoded CMD arguments with ENV directives:
- AETHERA_LISTEN=0.0.0.0
- AETHERA_PORT=8080
- AETHERA_DATA_DIR=/app/data
This allows runtime configuration via docker run -e or compose files.
Add AETHERA_ prefixed env vars for server configuration:
- AETHERA_DATA_DIR: data directory path
- AETHERA_LISTEN: listen address
- AETHERA_PORT: listen port
Env vars take precedence over defaults but CLI flags override both.
- Add Dockerfile for containerized deployment
- Add .drone.yml for CI/CD pipeline configuration
- Add docker and docker-run targets to Makefile
- Configure port 8080 binding and persistent volume mount
- Upgrade to Tailwind CSS v4.2.0 with explicit CLI dependency
- Add @tailwindcss/cli and tailwindcss as devDependencies
- Update build scripts to use bunx @tailwindcss/cli
- Include new transitive dependencies for enhanced CSS processing