docs/en/api/07-system.md
OpenViking provides system health, observability, and debug APIs for monitoring component status.
Basic health check endpoint. No authentication required. Returns service version and health status. If authentication is provided, also returns auth mode and identity information.
Code Entry Points:
openviking/server/routers/system.py:health_check - HTTP routeopenviking_cli/client/sync_http.py:SyncHTTPClient.health - SDK entrycrates/ov_cli/src/commands/system.rs - CLI commandNo parameters.
HTTP API
GET /health
curl -X GET http://localhost:1933/health
Python SDK
import openviking as ov
client = ov.SyncHTTPClient(url="http://localhost:1933")
client.initialize()
healthy = client.health()
print(f"Healthy: {healthy}")
CLI
ov system health
Response Example
{
"status": "ok",
"healthy": true,
"version": "0.1.x",
"auth_mode": "api_key"
}
Readiness probe for deployment environments. Checks AGFS, VectorDB, APIKeyManager, and Ollama (if configured) status. Returns 200 when all configured subsystems are ready and 503 otherwise. No authentication required (designed for Kubernetes probes).
Code Entry Points:
openviking/server/routers/system.py:readiness_check - HTTP routeNo parameters.
Check Item Descriptions:
agfs: Whether Viking filesystem is accessiblevectordb: Whether vector database is healthyapi_key_manager: Whether API key manager is loadedollama: Whether Ollama service is reachable (only if configured)HTTP API
GET /ready
curl -X GET http://localhost:1933/ready
Response Example
{
"status": "ready",
"checks": {
"agfs": "ok",
"vectordb": "ok",
"api_key_manager": "ok",
"ollama": "not_configured"
}
}
Get system status including initialization state and authenticated user info. result.user is the authenticated request's user_id (from API key or headers), not the process-level service default - clients can use this to resolve multi-tenant paths.
Code Entry Points:
openviking/server/routers/system.py:system_status - HTTP routeopenviking_cli/client/sync_http.py:SyncHTTPClient.get_status - SDK entrycrates/ov_cli/src/commands/system.rs - CLI commandNo parameters.
HTTP API
GET /api/v1/system/status
curl -X GET http://localhost:1933/api/v1/system/status \
-H "X-API-Key: your-key"
Python SDK
status = client.get_status()
print(status)
CLI
ov system status
Response Example
{
"status": "ok",
"result": {
"initialized": true,
"user": "alice"
},
"time": 0.1
}
Wait for all asynchronous processing (embedding, semantic generation) to complete. This method blocks until all queued tasks are processed or timeout occurs.
Code Entry Points:
openviking/server/routers/system.py:wait_processed - HTTP routeopenviking_cli/client/sync_http.py:SyncHTTPClient.wait_processed - SDK entrycrates/ov_cli/src/commands/system.rs - CLI commandParameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| timeout | float | No | None | Timeout in seconds. None means wait indefinitely |
HTTP API
POST /api/v1/system/wait
curl -X POST http://localhost:1933/api/v1/system/wait \
-H "Content-Type: application/json" \
-H "X-API-Key: your-key" \
-d '{
"timeout": 60.0
}'
Python SDK
# Add resources
client.add_resource("./docs/")
# Wait for all processing to complete
status = client.wait_processed(timeout=60.0)
print(f"Processing complete: {status}")
CLI
ov system wait --timeout 60
Response Example
{
"status": "ok",
"result": {
"Embedding": {
"processed": 10,
"requeue_count": 0,
"error_count": 0,
"errors": []
},
"Semantic": {
"processed": 10,
"requeue_count": 0,
"error_count": 0,
"errors": []
}
},
"time": 0.1
}
Reindex semantic and/or vector artifacts for existing content already stored in OpenViking. This is an operational maintenance API intended for scenarios such as embedding model changes, VLM changes, vector store rebuild, or post-upgrade repair of existing indexes.
This API operates on existing viking://... content. It does not import new files. For normal ingestion, use Resources.
Authentication
X-OpenViking-AccountParameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| uri | str | Yes | - | Viking URI to reindex |
| mode | str | No | vectors_only | Reindex mode: vectors_only or semantic_and_vectors |
| wait | bool | No | true | Whether to wait for completion |
The HTTP request body rejects unknown fields. uri may use OpenViking path variables accepted by other content APIs; it is resolved before validation.
Supported URI scopes
viking://viking://userviking://user/<user_id>viking://agentviking://agent/<agent_id>viking://resourcesviking://resources/...viking://user/<user_id>/memories/...viking://agent/<agent_id>/memories/...viking://agent/<agent_id>/skillsviking://agent/<agent_id>/skills/<skill_name>viking://session/... is not supported by reindex().
Modes
vectors_only: rebuilds vector-store records from currently recoverable source data without rewriting .abstract.md or .overview.mdsemantic_and_vectors: regenerates semantic artifacts first, then rebuilds vectors from the refreshed semantic outputsFor resource and skill, semantic_and_vectors refreshes directory/file semantic artifacts, including .abstract.md and .overview.md. For memory, it rebuilds the current persisted memory subtree semantics and vectors, but it does not replay historical extraction order.
For semantic_and_vectors, semantic generation and vector rebuilding are sequenced by the reindex executor. The semantic refresh step does not enqueue its own background vectorization work; vectors are rebuilt by the reindex step so wait=true reflects the reindex operation itself.
Python SDK (Embedded / HTTP)
result = client.reindex(
uri="viking://resources",
mode="vectors_only",
wait=True,
)
print(result)
result = client.reindex(
uri="viking://agent/default/skills",
mode="semantic_and_vectors",
wait=False,
)
print(result["status"])
HTTP API
POST /api/v1/content/reindex
There is no /api/v1/maintenance/reindex endpoint. Use /api/v1/content/reindex.
curl -X POST http://localhost:1933/api/v1/content/reindex \
-H "Content-Type: application/json" \
-H "X-API-Key: your-key" \
-H "X-OpenViking-Account: default" \
-d '{
"uri": "viking://resources",
"mode": "vectors_only",
"wait": true
}'
CLI
openviking reindex viking://resources --mode vectors_only
openviking reindex viking://agent/default/skills --mode semantic_and_vectors --wait false
Synchronous response (wait=true)
{
"status": "ok",
"result": {
"uri": "viking://resources",
"mode": "vectors_only",
"status": "completed",
"object_type": "resource",
"scanned_records": 120,
"rebuilt_records": 118,
"unsupported_records": 2,
"failed_records": 0,
"duration_ms": 1284,
"warnings": []
},
"time": 0.1
}
Asynchronous response (wait=false)
{
"status": "ok",
"result": {
"uri": "viking://resources",
"mode": "vectors_only",
"object_type": "resource",
"status": "accepted",
"task_id": "task_xxx"
},
"time": 0.1
}
Poll the returned task through the task API:
curl -X GET http://localhost:1933/api/v1/tasks/task_xxx \
-H "X-API-Key: your-key" \
-H "X-OpenViking-Account: default"
Reindex background tasks use task_type="admin_reindex" and resource_id equal to the requested uri, so they can also be listed with:
GET /api/v1/tasks?task_type=admin_reindex&resource_id=viking://resources
Task records are kept in memory and can expire or be lost on server restart.
Result fields
| Field | Description |
|---|---|
| status | completed for synchronous completion, accepted for background execution |
| uri | Requested URI after path-variable resolution |
| object_type | Inferred target type, such as resource, skill, memory, user_namespace, agent_namespace, skill_namespace, or global_namespace |
| mode | Effective reindex mode |
| scanned_records | Number of records or semantic sources considered |
| rebuilt_records | Number of vector records successfully rebuilt |
| unsupported_records | Number of records skipped because no usable vector source was available |
| failed_records | Number of records that failed while rebuilding |
| duration_ms | Synchronous run duration in milliseconds |
| warnings | Recoverable per-record warnings |
| task_id | Background task ID, present only when wait=false |
Behavior notes
viking:// reindex fans out to supported top-level namespaces and excludes session.viking://user or viking://agent/default propagate to their supported child content types.vectors_only is the right mode when only the embedding model or vector index needs to be refreshed.semantic_and_vectors is the right mode when semantic artifacts themselves must be regenerated before re-vectorization.Current limitations
The observer API provides detailed component-level monitoring.
Get queue system status (embedding and semantic processing queues). Shows pending, in-progress, completed, and error counts for each queue.
Code Entry Points:
openviking/server/routers/observer.py:observer_queue - HTTP routeopenviking/service/debug_service.py:ObserverService.queue - Core implementationopenviking/storage/observers/queue_observer.py - Queue observercrates/ov_cli/src/commands/observer.rs - CLI commandNo parameters.
HTTP API
GET /api/v1/observer/queue
curl -X GET http://localhost:1933/api/v1/observer/queue \
-H "X-API-Key: your-key"
Python SDK
print(client.observer.queue)
# Output:
# [queue] (healthy)
# Queue Pending In Progress Processed Errors Total
# Embedding 0 0 10 0 10
# Semantic 0 0 10 0 10
# TOTAL 0 0 20 0 20
CLI
ov observer queue
Response Example
{
"status": "ok",
"result": {
"name": "queue",
"is_healthy": true,
"has_errors": false,
"status": "Queue Pending In Progress Processed Errors Total\nEmbedding 0 0 10 0 10\nSemantic 0 0 10 0 10\nTOTAL 0 0 20 0 20"
},
"time": 0.1
}
Get VikingDB status (collections, indexes, vector counts).
Code Entry Points:
openviking/server/routers/observer.py:observer_vikingdb - HTTP routeopenviking/service/debug_service.py:ObserverService.vikingdb - Core implementationopenviking/storage/observers/vikingdb_observer.py - VikingDB observercrates/ov_cli/src/commands/observer.rs - CLI commandNo parameters.
HTTP API
GET /api/v1/observer/vikingdb
curl -X GET http://localhost:1933/api/v1/observer/vikingdb \
-H "X-API-Key: your-key"
Python SDK
print(client.observer.vikingdb())
# Output:
# [vikingdb] (healthy)
# Collection Index Count Vector Count Status
# context 1 55 OK
# TOTAL 1 55
# Access specific attributes
print(client.observer.vikingdb().is_healthy) # True
print(client.observer.vikingdb().status) # Status table string
CLI
ov observer vikingdb
Response Example
{
"status": "ok",
"result": {
"name": "vikingdb",
"is_healthy": true,
"has_errors": false,
"status": "Collection Index Count Vector Count Status\ncontext 1 55 OK\nTOTAL 1 55"
},
"time": 0.1
}
Get aggregated model subsystem status (VLM, embedding, rerank). Checks if each model provider is healthy and available.
Code Entry Points:
openviking/server/routers/observer.py:observer_models - HTTP routeopenviking/service/debug_service.py:ObserverService.models - Core implementationopenviking/storage/observers/models_observer.py - Models observercrates/ov_cli/src/commands/observer.rs - CLI commandNo parameters.
HTTP API
GET /api/v1/observer/models
curl -X GET http://localhost:1933/api/v1/observer/models \
-H "X-API-Key: your-key"
Python SDK
print(client.observer.models)
# Output:
# [models] (healthy)
# provider_model healthy detail
# dense_embedding yes ...
# rerank yes ...
# vlm yes ...
CLI
ov observer models
Response Example
{
"status": "ok",
"result": {
"name": "models",
"is_healthy": true,
"has_errors": false,
"status": "provider_model healthy detail\ndense_embedding yes ...\nrerank yes ...\nvlm yes ..."
},
"time": 0.1
}
Get distributed lock system status.
Code Entry Points:
openviking/server/routers/observer.py:observer_lock - HTTP routeopenviking/service/debug_service.py:ObserverService.lock - Core implementationopenviking/storage/observers/lock_observer.py - Lock observercrates/ov_cli/src/commands/observer.rs - CLI commandNo parameters.
HTTP API
GET /api/v1/observer/lock
curl -X GET http://localhost:1933/api/v1/observer/lock \
-H "X-API-Key: your-key"
Python SDK
print(client.observer.lock)
CLI
ov observer transaction
Response Example
{
"status": "ok",
"result": {
"name": "lock",
"is_healthy": true,
"has_errors": false,
"status": "..."
},
"time": 0.1
}
Get retrieval quality metrics.
Code Entry Points:
openviking/server/routers/observer.py:observer_retrieval - HTTP routeopenviking/service/debug_service.py:ObserverService.retrieval - Core implementationopenviking/storage/observers/retrieval_observer.py - Retrieval observercrates/ov_cli/src/commands/observer.rs - CLI commandNo parameters.
HTTP API
GET /api/v1/observer/retrieval
curl -X GET http://localhost:1933/api/v1/observer/retrieval \
-H "X-API-Key: your-key"
Python SDK
print(client.observer.retrieval)
CLI
ov observer retrieval
Response Example
{
"status": "ok",
"result": {
"name": "retrieval",
"is_healthy": true,
"has_errors": false,
"status": "..."
},
"time": 0.1
}
Get overall system status, including all components (queue, vikingdb, models, lock, retrieval).
Code Entry Points:
openviking/server/routers/observer.py:observer_system - HTTP routeopenviking/service/debug_service.py:ObserverService.system - Core implementationcrates/ov_cli/src/commands/observer.rs - CLI commandNo parameters.
HTTP API
GET /api/v1/observer/system
curl -X GET http://localhost:1933/api/v1/observer/system \
-H "X-API-Key: your-key"
Python SDK
print(client.observer.system())
# Output:
# [queue] (healthy)
# ...
#
# [vikingdb] (healthy)
# ...
#
# [models] (healthy)
# ...
#
# [system] (healthy)
CLI
ov observer system
Response Example
{
"status": "ok",
"result": {
"is_healthy": true,
"errors": [],
"components": {
"queue": {
"name": "queue",
"is_healthy": true,
"has_errors": false,
"status": "..."
},
"vikingdb": {
"name": "vikingdb",
"is_healthy": true,
"has_errors": false,
"status": "..."
},
"models": {
"name": "models",
"is_healthy": true,
"has_errors": false,
"status": "..."
},
"lock": {
"name": "lock",
"is_healthy": true,
"has_errors": false,
"status": "..."
},
"retrieval": {
"name": "retrieval",
"is_healthy": true,
"has_errors": false,
"status": "..."
}
}
},
"time": 0.1
}