From bb71167d11861099068b23c491eb6debea2c907d Mon Sep 17 00:00:00 2001 From: phact Date: Fri, 19 Dec 2025 03:31:54 -0500 Subject: [PATCH] v1 endpoints for kf and settings --- sdks/python/openrag_sdk/client.py | 2 +- sdks/python/openrag_sdk/knowledge_filters.py | 10 +-- sdks/typescript/src/client.ts | 2 +- sdks/typescript/src/knowledge-filters.ts | 10 +-- src/api/v1/settings.py | 27 +++++++- src/main.py | 70 +++++++++++++++++++- 6 files changed, 106 insertions(+), 15 deletions(-) diff --git a/sdks/python/openrag_sdk/client.py b/sdks/python/openrag_sdk/client.py index 5a04d969..7d0d2e09 100644 --- a/sdks/python/openrag_sdk/client.py +++ b/sdks/python/openrag_sdk/client.py @@ -55,7 +55,7 @@ class SettingsClient: else: 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() return SettingsUpdateResponse(message=data.get("message", "Settings updated")) diff --git a/sdks/python/openrag_sdk/knowledge_filters.py b/sdks/python/openrag_sdk/knowledge_filters.py index 557bae5a..f20bec77 100644 --- a/sdks/python/openrag_sdk/knowledge_filters.py +++ b/sdks/python/openrag_sdk/knowledge_filters.py @@ -62,7 +62,7 @@ class KnowledgeFiltersClient: response = await self._client._request( "POST", - "/knowledge-filter", + "/api/v1/knowledge-filters", json=body, ) @@ -95,7 +95,7 @@ class KnowledgeFiltersClient: response = await self._client._request( "POST", - "/knowledge-filter/search", + "/api/v1/knowledge-filters/search", json=body, ) @@ -118,7 +118,7 @@ class KnowledgeFiltersClient: try: response = await self._client._request( "GET", - f"/knowledge-filter/{filter_id}", + f"/api/v1/knowledge-filters/{filter_id}", ) data = response.json() @@ -174,7 +174,7 @@ class KnowledgeFiltersClient: response = await self._client._request( "PUT", - f"/knowledge-filter/{filter_id}", + f"/api/v1/knowledge-filters/{filter_id}", json=body, ) @@ -193,7 +193,7 @@ class KnowledgeFiltersClient: """ response = await self._client._request( "DELETE", - f"/knowledge-filter/{filter_id}", + f"/api/v1/knowledge-filters/{filter_id}", ) data = response.json() diff --git a/sdks/typescript/src/client.ts b/sdks/typescript/src/client.ts index dfecf5e7..c6080d39 100644 --- a/sdks/typescript/src/client.ts +++ b/sdks/typescript/src/client.ts @@ -52,7 +52,7 @@ class SettingsClient { * @returns Success response with message. */ async update(options: SettingsUpdateOptions): Promise { - const response = await this.client._request("POST", "/settings", { + const response = await this.client._request("POST", "/api/v1/settings", { body: JSON.stringify(options), }); const data = await response.json(); diff --git a/sdks/typescript/src/knowledge-filters.ts b/sdks/typescript/src/knowledge-filters.ts index ac2e360d..703fb206 100644 --- a/sdks/typescript/src/knowledge-filters.ts +++ b/sdks/typescript/src/knowledge-filters.ts @@ -31,7 +31,7 @@ export class KnowledgeFiltersClient { 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), }); @@ -58,7 +58,7 @@ export class KnowledgeFiltersClient { const response = await this.client._request( "POST", - "/knowledge-filter/search", + "/api/v1/knowledge-filters/search", { body: JSON.stringify(body), } @@ -83,7 +83,7 @@ export class KnowledgeFiltersClient { try { const response = await this.client._request( "GET", - `/knowledge-filter/${filterId}` + `/api/v1/knowledge-filters/${filterId}` ); const data = (await response.json()) as GetKnowledgeFilterResponse; @@ -124,7 +124,7 @@ export class KnowledgeFiltersClient { const response = await this.client._request( "PUT", - `/knowledge-filter/${filterId}`, + `/api/v1/knowledge-filters/${filterId}`, { body: JSON.stringify(body), } @@ -143,7 +143,7 @@ export class KnowledgeFiltersClient { async delete(filterId: string): Promise { const response = await this.client._request( "DELETE", - `/knowledge-filter/${filterId}` + `/api/v1/knowledge-filters/${filterId}` ); const data = (await response.json()) as DeleteKnowledgeFilterResponse; diff --git a/src/api/v1/settings.py b/src/api/v1/settings.py index 24efcc5b..b926eaf1 100644 --- a/src/api/v1/settings.py +++ b/src/api/v1/settings.py @@ -1,12 +1,13 @@ """ Public API v1 Settings endpoint. -Provides read-only access to configuration settings. +Provides access to configuration settings. Uses API key authentication. """ from starlette.requests import Request from starlette.responses import JSONResponse from utils.logging_config import get_logger +from config.settings import get_openrag_config logger = get_logger(__name__) @@ -59,3 +60,27 @@ async def get_settings_endpoint(request: Request): {"error": "Failed to get settings"}, 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) diff --git a/src/main.py b/src/main.py index bdfa2e05..710b3dab 100644 --- a/src/main.py +++ b/src/main.py @@ -58,7 +58,7 @@ from auth_middleware import optional_auth, require_auth from api_key_middleware import require_api_key from services.api_key_service import APIKeyService 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 from config.settings import ( @@ -1404,7 +1404,7 @@ async def create_app(): ), methods=["DELETE"], ), - # Settings endpoint (read-only) + # Settings endpoints Route( "/v1/settings", require_api_key(services["api_key_service"])( @@ -1412,6 +1412,72 @@ async def create_app(): ), 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)