v1 endpoints for kf and settings

This commit is contained in:
phact 2025-12-19 03:31:54 -05:00
parent 61371beeba
commit bb71167d11
6 changed files with 106 additions and 15 deletions

View file

@ -55,7 +55,7 @@ class SettingsClient:
else: else:
body = {k: v for k, v in options.items() if v is not None} body = {k: v for k, v in options.items() if v is not None}
response = await self._client._request("POST", "/settings", json=body) response = await self._client._request("POST", "/api/v1/settings", json=body)
data = response.json() data = response.json()
return SettingsUpdateResponse(message=data.get("message", "Settings updated")) return SettingsUpdateResponse(message=data.get("message", "Settings updated"))

View file

@ -62,7 +62,7 @@ class KnowledgeFiltersClient:
response = await self._client._request( response = await self._client._request(
"POST", "POST",
"/knowledge-filter", "/api/v1/knowledge-filters",
json=body, json=body,
) )
@ -95,7 +95,7 @@ class KnowledgeFiltersClient:
response = await self._client._request( response = await self._client._request(
"POST", "POST",
"/knowledge-filter/search", "/api/v1/knowledge-filters/search",
json=body, json=body,
) )
@ -118,7 +118,7 @@ class KnowledgeFiltersClient:
try: try:
response = await self._client._request( response = await self._client._request(
"GET", "GET",
f"/knowledge-filter/{filter_id}", f"/api/v1/knowledge-filters/{filter_id}",
) )
data = response.json() data = response.json()
@ -174,7 +174,7 @@ class KnowledgeFiltersClient:
response = await self._client._request( response = await self._client._request(
"PUT", "PUT",
f"/knowledge-filter/{filter_id}", f"/api/v1/knowledge-filters/{filter_id}",
json=body, json=body,
) )
@ -193,7 +193,7 @@ class KnowledgeFiltersClient:
""" """
response = await self._client._request( response = await self._client._request(
"DELETE", "DELETE",
f"/knowledge-filter/{filter_id}", f"/api/v1/knowledge-filters/{filter_id}",
) )
data = response.json() data = response.json()

View file

@ -52,7 +52,7 @@ class SettingsClient {
* @returns Success response with message. * @returns Success response with message.
*/ */
async update(options: SettingsUpdateOptions): Promise<SettingsUpdateResponse> { async update(options: SettingsUpdateOptions): Promise<SettingsUpdateResponse> {
const response = await this.client._request("POST", "/settings", { const response = await this.client._request("POST", "/api/v1/settings", {
body: JSON.stringify(options), body: JSON.stringify(options),
}); });
const data = await response.json(); const data = await response.json();

View file

@ -31,7 +31,7 @@ export class KnowledgeFiltersClient {
queryData: JSON.stringify(options.queryData), queryData: JSON.stringify(options.queryData),
}; };
const response = await this.client._request("POST", "/knowledge-filter", { const response = await this.client._request("POST", "/api/v1/knowledge-filters", {
body: JSON.stringify(body), body: JSON.stringify(body),
}); });
@ -58,7 +58,7 @@ export class KnowledgeFiltersClient {
const response = await this.client._request( const response = await this.client._request(
"POST", "POST",
"/knowledge-filter/search", "/api/v1/knowledge-filters/search",
{ {
body: JSON.stringify(body), body: JSON.stringify(body),
} }
@ -83,7 +83,7 @@ export class KnowledgeFiltersClient {
try { try {
const response = await this.client._request( const response = await this.client._request(
"GET", "GET",
`/knowledge-filter/${filterId}` `/api/v1/knowledge-filters/${filterId}`
); );
const data = (await response.json()) as GetKnowledgeFilterResponse; const data = (await response.json()) as GetKnowledgeFilterResponse;
@ -124,7 +124,7 @@ export class KnowledgeFiltersClient {
const response = await this.client._request( const response = await this.client._request(
"PUT", "PUT",
`/knowledge-filter/${filterId}`, `/api/v1/knowledge-filters/${filterId}`,
{ {
body: JSON.stringify(body), body: JSON.stringify(body),
} }
@ -143,7 +143,7 @@ export class KnowledgeFiltersClient {
async delete(filterId: string): Promise<boolean> { async delete(filterId: string): Promise<boolean> {
const response = await this.client._request( const response = await this.client._request(
"DELETE", "DELETE",
`/knowledge-filter/${filterId}` `/api/v1/knowledge-filters/${filterId}`
); );
const data = (await response.json()) as DeleteKnowledgeFilterResponse; const data = (await response.json()) as DeleteKnowledgeFilterResponse;

View file

@ -1,12 +1,13 @@
""" """
Public API v1 Settings endpoint. Public API v1 Settings endpoint.
Provides read-only access to configuration settings. Provides access to configuration settings.
Uses API key authentication. Uses API key authentication.
""" """
from starlette.requests import Request from starlette.requests import Request
from starlette.responses import JSONResponse from starlette.responses import JSONResponse
from utils.logging_config import get_logger from utils.logging_config import get_logger
from config.settings import get_openrag_config
logger = get_logger(__name__) logger = get_logger(__name__)
@ -59,3 +60,27 @@ async def get_settings_endpoint(request: Request):
{"error": "Failed to get settings"}, {"error": "Failed to get settings"},
status_code=500, status_code=500,
) )
async def update_settings_endpoint(request: Request, session_manager):
"""
Update OpenRAG configuration settings.
POST /v1/settings
Request body (all fields optional):
{
"chunk_size": 1000,
"chunk_overlap": 200
}
Response:
{
"message": "Configuration updated successfully"
}
Note: This endpoint only allows updating a limited subset of settings.
Provider API keys and credentials cannot be updated via this endpoint.
"""
from api.settings import update_settings
return await update_settings(request, session_manager)

View file

@ -58,7 +58,7 @@ from auth_middleware import optional_auth, require_auth
from api_key_middleware import require_api_key from api_key_middleware import require_api_key
from services.api_key_service import APIKeyService from services.api_key_service import APIKeyService
from api import keys as api_keys from api import keys as api_keys
from api.v1 import chat as v1_chat, search as v1_search, documents as v1_documents, settings as v1_settings from api.v1 import chat as v1_chat, search as v1_search, documents as v1_documents, settings as v1_settings, knowledge_filters as v1_knowledge_filters
# Configuration and setup # Configuration and setup
from config.settings import ( from config.settings import (
@ -1404,7 +1404,7 @@ async def create_app():
), ),
methods=["DELETE"], methods=["DELETE"],
), ),
# Settings endpoint (read-only) # Settings endpoints
Route( Route(
"/v1/settings", "/v1/settings",
require_api_key(services["api_key_service"])( require_api_key(services["api_key_service"])(
@ -1412,6 +1412,72 @@ async def create_app():
), ),
methods=["GET"], methods=["GET"],
), ),
Route(
"/v1/settings",
require_api_key(services["api_key_service"])(
partial(
v1_settings.update_settings_endpoint,
session_manager=services["session_manager"],
)
),
methods=["POST"],
),
# Knowledge filters endpoints
Route(
"/v1/knowledge-filters",
require_api_key(services["api_key_service"])(
partial(
v1_knowledge_filters.create_endpoint,
knowledge_filter_service=services["knowledge_filter_service"],
session_manager=services["session_manager"],
)
),
methods=["POST"],
),
Route(
"/v1/knowledge-filters/search",
require_api_key(services["api_key_service"])(
partial(
v1_knowledge_filters.search_endpoint,
knowledge_filter_service=services["knowledge_filter_service"],
session_manager=services["session_manager"],
)
),
methods=["POST"],
),
Route(
"/v1/knowledge-filters/{filter_id}",
require_api_key(services["api_key_service"])(
partial(
v1_knowledge_filters.get_endpoint,
knowledge_filter_service=services["knowledge_filter_service"],
session_manager=services["session_manager"],
)
),
methods=["GET"],
),
Route(
"/v1/knowledge-filters/{filter_id}",
require_api_key(services["api_key_service"])(
partial(
v1_knowledge_filters.update_endpoint,
knowledge_filter_service=services["knowledge_filter_service"],
session_manager=services["session_manager"],
)
),
methods=["PUT"],
),
Route(
"/v1/knowledge-filters/{filter_id}",
require_api_key(services["api_key_service"])(
partial(
v1_knowledge_filters.delete_endpoint,
knowledge_filter_service=services["knowledge_filter_service"],
session_manager=services["session_manager"],
)
),
methods=["DELETE"],
),
] ]
app = Starlette(debug=True, routes=routes) app = Starlette(debug=True, routes=routes)