Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -434,3 +434,4 @@ docker-compose.host-mounts.generated.yml
/installer/docker/volumes/content-files/*
!/installer/docker/volumes/content-files/.gitkeep
*.cli-auth-token
/src/client/GuideAnts.code-workspace
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,11 +185,15 @@ GuideAnts runs locally with Docker Compose. OS-specific quickstart scripts are i
```bash
# Windows
.\quickstart.ps1
# or: start_windows.cmd

# Linux / macOS
./quickstart.sh
# or: start_linux.sh / start_macos.sh
```

Backends: `cuda13` (NVIDIA), `rocm` (AMD), `vulkan` (NVIDIA/AMD/Intel via Vulkan), `cpu`, and `slim` (sandbox-only, no local models). The root launchers auto-detect GPU where possible; on Windows, NVIDIA drivers below the CUDA 13 minimum (R580) fall back to `vulkan` instead of CPU.

See the [setup guide](https://github.com/Elumenotion/GuideAnts/blob/main/docs/setup-guide.md) for full instructions and the [developer config guide](https://github.com/Elumenotion/GuideAnts/blob/main/docs/developer-config-guide.md) for configuration options.

### Documentation
Expand All @@ -202,6 +206,7 @@ All documentation lives in the repository:
- [Project and notebook files system](https://github.com/Elumenotion/GuideAnts/blob/main/docs/project-and-notebook-files-system.md) – file and content management
- [LLaMA model management](https://github.com/Elumenotion/GuideAnts/blob/main/docs/llama-model-download-and-runtime-management.md) – local model lifecycle
- [Docker build guide](https://github.com/Elumenotion/GuideAnts/blob/main/docker/guideants-ai-build.md) – building the runtime service
- [Vulkan backend guide](https://github.com/Elumenotion/GuideAnts/blob/main/docker/guideants-ai-vulkan.md) – vendor-neutral GPU (llama + image gen) on Docker Desktop and native Linux
- [Full docs directory](https://github.com/Elumenotion/GuideAnts/tree/main/docs) – architecture, features, test plans, and more

## Development Entry Points
Expand Down
7 changes: 7 additions & 0 deletions docker/build/guideants-ai/Dockerfile.vulkan
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,13 @@ RUN curl -sSL "https://github.com/PowerShell/PowerShell/releases/download/v${PWS
&& chmod +x /usr/bin/pwsh \
&& rm /tmp/pwsh.tar.gz

ARG NODE_MAJOR=22
RUN curl -fsSL https://deb.nodesource.com/setup_${NODE_MAJOR}.x | bash - \
&& apt-get install -y --no-install-recommends nodejs \
&& rm -rf /var/lib/apt/lists/* \
&& node --version \
&& npx --version

ENV VIRTUAL_ENV=/opt/venv
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
ENV PIP_DISABLE_PIP_VERSION_CHECK=1
Expand Down
86 changes: 86 additions & 0 deletions docker/build/guideants-ai/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,92 @@ PY

sanitize_router_preset "$ROUTER_PRESET"

# Qwen-VL needs image-min-tokens=1024 for grounding accuracy, but that value breaks
# other vision models (e.g. Gemma mmproj max pixels). Apply it per-alias only.
normalize_router_image_min_tokens() {
local preset_path="$1"
if [ -z "$preset_path" ] || [ ! -f "$preset_path" ]; then
return
fi

local tmp_path="${preset_path}.image-tokens.$$"
if ! python3 - "$preset_path" "$tmp_path" <<'PY'
import re
import sys

source_path = sys.argv[1]
output_path = sys.argv[2]

with open(source_path, "r", encoding="utf-8") as src:
lines = src.read().splitlines()

output: list[str] = []
current_alias: str | None = None
section_lines: list[str] = []

def flush_section() -> None:
global section_lines, current_alias
if current_alias is None:
return

cleaned: list[str] = []
for raw_line in section_lines:
stripped = raw_line.strip()
if stripped.startswith("#") or stripped.startswith(";"):
cleaned.append(raw_line)
continue
if "=" in stripped:
key = stripped.split("=", 1)[0].strip().lower()
if key == "image-min-tokens":
continue
cleaned.append(raw_line)

# Qwen-VL aliases only; global router --image-min-tokens breaks Gemma loads.
if re.search(r"(?i)qwen", current_alias):
insert_at = 1 if cleaned and cleaned[0].strip().startswith("[") else 0
cleaned.insert(insert_at, "image-min-tokens = 1024")

output.extend(cleaned)
section_lines = []
current_alias = None

for raw_line in lines:
stripped = raw_line.strip()
if stripped.startswith("[") and stripped.endswith("]"):
flush_section()
current_alias = stripped[1:-1].strip()
section_lines = [raw_line]
continue

if current_alias is None:
output.append(raw_line)
continue

section_lines.append(raw_line)

flush_section()

with open(output_path, "w", encoding="utf-8", newline="\n") as dst:
dst.write("\n".join(output))
if output:
dst.write("\n")
PY
then
echo "WARNING: router preset image-min-tokens normalization failed for '${preset_path}'; continuing unchanged." >&2
rm -f "$tmp_path" 2>/dev/null || true
return
fi

if cmp -s "$preset_path" "$tmp_path"; then
rm -f "$tmp_path" 2>/dev/null || true
return
fi

mv -f "$tmp_path" "$preset_path"
}

normalize_router_image_min_tokens "$ROUTER_PRESET"

SCRIPT_EXECUTION_REQUIRE_TOKEN="${SCRIPT_EXECUTION_REQUIRE_TOKEN:-true}"
SCRIPT_EXECUTION_ENABLE_IDENTITY_ISOLATION="${SCRIPT_EXECUTION_ENABLE_IDENTITY_ISOLATION:-true}"

Expand Down
Loading
Loading