Compare commits
7
Commits
api/v1.0.0
...
9612c7af05
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9612c7af05 | ||
|
|
9d58df85f3 | ||
|
|
3de96fe070 | ||
|
|
e2acb7de39 | ||
|
|
5998571890 | ||
|
|
6ac1d15591 | ||
|
|
22af23827d |
@@ -6,7 +6,7 @@ on:
|
|||||||
- 'api/v*'
|
- 'api/v*'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
IMAGE_NAME: git.schweitz.internal/jpmschweitzer/webber-api
|
IMAGE_NAME: git.schweitz.net/jpmschweitzer/webber-api
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
@@ -44,7 +44,7 @@ jobs:
|
|||||||
- name: Login to Gitea Registry
|
- name: Login to Gitea Registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: git.schweitz.internal
|
registry: git.schweitz.net
|
||||||
username: ${{ secrets.REGISTRY_USER }}
|
username: ${{ secrets.REGISTRY_USER }}
|
||||||
password: ${{ secrets.REGISTRY_PASSWORD }}
|
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||||
|
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ echo $WEBBER_API_URL # Should be http://localhost:8095
|
|||||||
curl http://192.168.86.149:11434/api/tags
|
curl http://192.168.86.149:11434/api/tags
|
||||||
|
|
||||||
# Check model is available
|
# Check model is available
|
||||||
curl http://192.168.86.149:11434/api/tags | grep mistral-nemo
|
curl http://192.168.86.149:11434/api/tags | grep gemma4
|
||||||
```
|
```
|
||||||
|
|
||||||
### Tests failing
|
### Tests failing
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ This project uses prefixed tags for independent release cycles:
|
|||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
- Python 3.12+
|
- Python 3.12+
|
||||||
- Ollama running with `mistral-nemo:latest` model
|
- Ollama running with `gemma4:e2b` model
|
||||||
- Docker (for production deployment)
|
- Docker (for production deployment)
|
||||||
- SearXNG (optional, for web search)
|
- SearXNG (optional, for web search)
|
||||||
|
|
||||||
|
|||||||
@@ -14,13 +14,16 @@ CORS_ORIGINS=["http://localhost:3000","http://localhost:8080"]
|
|||||||
|
|
||||||
# LLM - Ollama (tower-of-joy)
|
# LLM - Ollama (tower-of-joy)
|
||||||
OLLAMA_URL=http://192.168.86.149:11434
|
OLLAMA_URL=http://192.168.86.149:11434
|
||||||
OLLAMA_AGENT_MODEL=mistral-nemo-large:latest
|
OLLAMA_AGENT_MODEL=gemma4:e2b
|
||||||
OLLAMA_EMBED_MODEL=nomic-embed-text:latest
|
OLLAMA_EMBED_MODEL=nomic-embed-text:latest
|
||||||
|
|
||||||
# Auth - Tatlock integration (optional)
|
# Auth - Tatlock integration (optional)
|
||||||
# TATLOCK_API_URL=http://192.168.86.149:8000
|
# TATLOCK_API_URL=http://tatlock:8000
|
||||||
# INTERNAL_API_KEY=your-internal-key
|
# INTERNAL_API_KEY=your-internal-key
|
||||||
|
|
||||||
|
# Web search - SearXNG (container name on docker-dataplane; internal port 8080)
|
||||||
|
# SEARXNG_URL=http://searxng:8080
|
||||||
|
|
||||||
# Tool execution
|
# Tool execution
|
||||||
TOOL_TIMEOUT_SECONDS=120
|
TOOL_TIMEOUT_SECONDS=120
|
||||||
SANDBOX_ENABLED=true
|
SANDBOX_ENABLED=true
|
||||||
|
|||||||
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Default `OLLAMA_AGENT_MODEL` is now `gemma4:e2b` instead of `mistral-nemo-large:latest`, so a deployment without an explicit override no longer exhausts shared GPU memory
|
||||||
|
|
||||||
|
## [1.0.1] - 2026-07-19
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Default `TATLOCK_API_URL` and `SEARXNG_URL` now use docker container names (`http://tatlock:8000`, `http://searxng:8080`) instead of host IP:port, for container-to-container traffic on the docker-dataplane network
|
||||||
|
- CI workflow now pushes Docker images via the `git.schweitz.net` registry route
|
||||||
|
|
||||||
## [1.0.0] - 2026-01-15
|
## [1.0.0] - 2026-01-15
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ Webber is a FastAPI-based agent orchestration service that provides:
|
|||||||
**Port:** 8086
|
**Port:** 8086
|
||||||
**Runtime:** Python 3.12, FastAPI, Uvicorn
|
**Runtime:** Python 3.12, FastAPI, Uvicorn
|
||||||
**Agent Framework:** PydanticAI
|
**Agent Framework:** PydanticAI
|
||||||
**Default LLM:** Ollama with mistral-nemo-large:latest
|
**Default LLM:** Ollama with gemma4:e2b
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -205,9 +205,11 @@ All settings via environment variables or `.env`:
|
|||||||
| HOST | 0.0.0.0 | Server host |
|
| HOST | 0.0.0.0 | Server host |
|
||||||
| PORT | 8086 | Server port |
|
| PORT | 8086 | Server port |
|
||||||
| OLLAMA_URL | http://192.168.86.149:11434 | Ollama API URL |
|
| OLLAMA_URL | http://192.168.86.149:11434 | Ollama API URL |
|
||||||
| OLLAMA_AGENT_MODEL | mistral-nemo-large:latest | Agent reasoning model |
|
| OLLAMA_AGENT_MODEL | gemma4:e2b | Agent reasoning model |
|
||||||
| OLLAMA_EMBED_MODEL | nomic-embed-text:latest | Embedding model |
|
| OLLAMA_EMBED_MODEL | nomic-embed-text:latest | Embedding model |
|
||||||
| TATLOCK_API_URL | http://192.168.86.149:8000 | Tatlock auth service |
|
| TATLOCK_API_URL | http://tatlock:8000 | Tatlock auth service |
|
||||||
|
| SEARXNG_URL | http://searxng:8080 | SearXNG web search instance |
|
||||||
|
| SEARXNG_TIMEOUT | 10 | SearXNG request timeout (seconds) |
|
||||||
| TOOL_TIMEOUT_SECONDS | 120 | Tool execution timeout |
|
| TOOL_TIMEOUT_SECONDS | 120 | Tool execution timeout |
|
||||||
| SANDBOX_ENABLED | true | Enable sandboxed execution |
|
| SANDBOX_ENABLED | true | Enable sandboxed execution |
|
||||||
| ALLOWED_PATHS | [] | Paths accessible to tools |
|
| ALLOWED_PATHS | [] | Paths accessible to tools |
|
||||||
@@ -357,7 +359,7 @@ Gitea Actions workflow:
|
|||||||
|
|
||||||
Deployed in Portainer `agents` stack alongside Tatlock:
|
Deployed in Portainer `agents` stack alongside Tatlock:
|
||||||
- Network: `docker-dataplane`
|
- Network: `docker-dataplane`
|
||||||
- Registry: `git.schweitz.internal/jpmschweitzer/webber`
|
- Registry: `git.schweitz.net/jpmschweitzer/webber`
|
||||||
- Auto-update: Watchtower with label `com.centurylinklabs.watchtower.enable=true`
|
- Auto-update: Watchtower with label `com.centurylinklabs.watchtower.enable=true`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "webber-api"
|
name = "webber-api"
|
||||||
version = "1.0.0"
|
version = "1.0.1"
|
||||||
description = "Webber API - Multi-Agent AI Development Server"
|
description = "Webber API - Multi-Agent AI Development Server"
|
||||||
authors = [
|
authors = [
|
||||||
{name = "jpmschweitzer"}
|
{name = "jpmschweitzer"}
|
||||||
|
|||||||
@@ -64,15 +64,15 @@ class Settings(BaseSettings):
|
|||||||
|
|
||||||
# LLM - Ollama (always hot in VRAM on tower-of-joy)
|
# LLM - Ollama (always hot in VRAM on tower-of-joy)
|
||||||
ollama_url: str = "http://192.168.86.149:11434"
|
ollama_url: str = "http://192.168.86.149:11434"
|
||||||
ollama_agent_model: str = "mistral-nemo-large:latest"
|
ollama_agent_model: str = "gemma4:e2b"
|
||||||
ollama_embed_model: str = "nomic-embed-text:latest"
|
ollama_embed_model: str = "nomic-embed-text:latest"
|
||||||
|
|
||||||
# Auth - Tatlock integration
|
# Auth - Tatlock integration
|
||||||
tatlock_api_url: str | None = "http://192.168.86.149:8000"
|
tatlock_api_url: str | None = "http://tatlock:8000"
|
||||||
internal_api_key: str | None = None
|
internal_api_key: str | None = None
|
||||||
|
|
||||||
# Web search - SearXNG (use SEARXNG_URL env var to override)
|
# Web search - SearXNG (use SEARXNG_URL env var to override)
|
||||||
searxng_url: str = "http://192.168.86.149:8087"
|
searxng_url: str = "http://searxng:8080"
|
||||||
searxng_timeout: int = 10
|
searxng_timeout: int = 10
|
||||||
|
|
||||||
# Tool execution
|
# Tool execution
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ class TestWebSearchTool:
|
|||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def tool(self):
|
def tool(self):
|
||||||
return WebSearchTool(searxng_url="http://localhost:8087", timeout=5)
|
return WebSearchTool(searxng_url="http://searxng:8080", timeout=5)
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mock_search_response(self):
|
def mock_search_response(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user