Skip to content
Open
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
15 changes: 3 additions & 12 deletions src/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -258,10 +258,7 @@ async def async_response_stream(
logger.info("Response generated", log_prefix=log_prefix, response=full_response)

except Exception as e:
logger.error("Exception in streaming", error=str(e))
import traceback

traceback.print_exc()
logger.exception("[AGENT] Streaming failed")
raise


Expand Down Expand Up @@ -316,10 +313,7 @@ async def async_response(
msg = error_msg
raise ValueError(msg)
except Exception as e:
logger.error("Exception in non-streaming response", error=str(e))
import traceback

traceback.print_exc()
logger.exception("[AGENT] Non-streaming response failed")
raise


Expand Down Expand Up @@ -387,10 +381,7 @@ async def async_langflow_stream(
yield chunk
logger.debug("Langflow stream completed")
except Exception as e:
logger.error("Exception in langflow stream", error=str(e))
import traceback

traceback.print_exc()
logger.exception("[AGENT] Langflow stream failed")
raise


Expand Down
11 changes: 5 additions & 6 deletions src/api/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
from fastapi.responses import JSONResponse
from utils.telemetry import TelemetryClient, Category, MessageId
from utils.version_utils import OPENRAG_VERSION
from utils.logging_config import get_logger

logger = get_logger(__name__)

from dependencies import (
get_auth_service,
Expand Down Expand Up @@ -50,9 +53,7 @@ async def auth_init(
return JSONResponse(result)

except Exception as e:
import traceback

traceback.print_exc()
logger.exception("[AUTH] OAuth init failed")
return JSONResponse(
{"error": f"Failed to initialize OAuth: {str(e)}"}, status_code=500
)
Expand Down Expand Up @@ -90,9 +91,7 @@ async def auth_callback(
return JSONResponse(result)

except Exception as e:
import traceback

traceback.print_exc()
logger.exception("[AUTH] OAuth callback failed")
await TelemetryClient.send_event(Category.AUTHENTICATION, MessageId.ORB_AUTH_OAUTH_FAILED)
return JSONResponse({"error": f"Callback failed: {str(e)}"}, status_code=500)

Expand Down
6 changes: 3 additions & 3 deletions src/api/chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,7 @@ async def langflow_endpoint(
return JSONResponse(result)

except Exception as e:
import traceback
traceback.print_exc()
logger.error("Langflow request failed", error=str(e))
logger.exception("[CHAT] Langflow request failed")
return JSONResponse(
{"error": f"Langflow request failed: {str(e)}"}, status_code=500
)
Expand All @@ -139,6 +137,7 @@ async def chat_history_endpoint(
history = await chat_service.get_chat_history(user.user_id)
return JSONResponse(history)
except Exception as e:
logger.exception("[CHAT] Failed to get chat history")
return JSONResponse(
{"error": f"Failed to get chat history: {str(e)}"}, status_code=500
)
Expand All @@ -153,6 +152,7 @@ async def langflow_history_endpoint(
history = await chat_service.get_langflow_history(user.user_id)
return JSONResponse(history)
except Exception as e:
logger.exception("[CHAT] Failed to get langflow history")
return JSONResponse(
{"error": f"Failed to get langflow history: {str(e)}"}, status_code=500
)
Expand Down
11 changes: 3 additions & 8 deletions src/api/connectors.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ async def list_connectors(
)
return JSONResponse({"connectors": connector_types})
except Exception as e:
logger.info("Error listing connectors", error=str(e))
logger.error("[CONNECTOR] Error listing connectors", error=str(e))
return JSONResponse({"connectors": []})


Expand Down Expand Up @@ -549,15 +549,10 @@ async def connector_webhook(
)

except Exception as e:
logger.error(
"Failed to process webhook for connection",
logger.exception(
"[CONNECTOR] Failed to process webhook",
connection_id=connection.connection_id,
error=str(e),
)
import traceback

traceback.print_exc()

return JSONResponse(
{
"status": "error",
Expand Down
7 changes: 2 additions & 5 deletions src/api/knowledge_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -418,12 +418,9 @@ async def knowledge_filter_webhook(
)

except Exception as e:
logger.error(
"Failed to process knowledge filter webhook",
logger.exception(
"[API] Knowledge filter webhook failed",
filter_id=filter_id,
subscription_id=subscription_id,
error=str(e),
)
import traceback
traceback.print_exc()
return JSONResponse({"error": f"Webhook processing failed: {str(e)}"}, status_code=500)
2 changes: 1 addition & 1 deletion src/api/provider_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ async def _test_openai_completion_with_tools(api_key: str, llm_model: str) -> No

# If max_tokens doesn't work, try with max_completion_tokens
if response.status_code != 200:
logger.info("max_tokens parameter failed, trying max_completion_tokens instead")
logger.warning("[API] max_tokens parameter failed, trying max_completion_tokens instead")
payload = {**base_payload, "max_completion_tokens": 50}
response = await client.post(
"https://api.openai.com/v1/chat/completions",
Expand Down
4 changes: 2 additions & 2 deletions src/api/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -1609,7 +1609,7 @@ async def update_onboarding_state(
if not success:
raise HTTPException(status_code=500, detail="Failed to update onboarding state")

logger.info(f"Onboarding state updated: {body}")
logger.info("[CONFIG] Onboarding state updated", fields=list(body.model_fields_set))

return OnboardingStateResponse(
message="Onboarding state updated successfully",
Expand Down Expand Up @@ -1705,7 +1705,7 @@ async def rollback_onboarding(
{"error": "No onboarding configuration to rollback"}, status_code=400
)

logger.info("Rolling back onboarding configuration due to file failures")
logger.warning("[CONFIG] Rolling back onboarding configuration due to file failures")

# Get all tasks for the user
all_tasks = task_service.get_all_tasks(user.user_id)
Expand Down
5 changes: 5 additions & 0 deletions src/api/upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
get_current_user,
)
from session_manager import User
from utils.logging_config import get_logger

logger = get_logger(__name__)


class UploadPathBody(BaseModel):
Expand Down Expand Up @@ -55,8 +58,10 @@ async def upload(
"AuthenticationException" in error_msg
or "access denied" in error_msg.lower()
):
logger.warning("[INGEST] Upload rejected — access denied", error=error_msg)
return JSONResponse({"error": error_msg}, status_code=403)
else:
logger.exception("[INGEST] Upload failed")
return JSONResponse({"error": error_msg}, status_code=500)


Expand Down
18 changes: 12 additions & 6 deletions src/bootstrap.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
from pathlib import Path
from dotenv import load_dotenv
from utils.logging_config import get_logger
logger = get_logger(__name__)

# This module is intended to be imported as the first line in entry points
# to ensure environment variables are available to all subsequent imports.
# to ensure environment variables and logging are available to all subsequent imports.

def load_env():
"""Load environment variables from the project root .env file."""
# .env is located in the project root (one level up from src/)
logger.info("Application startup span: loading environment variables")
"""Load .env then immediately configure structured logging so all subsequent
module-level log calls use the correct formatter and processors."""
env_path = Path(__file__).parent.parent / ".env"
load_dotenv(dotenv_path=env_path, override=False)

# Configure logging immediately after env vars are available so every
# subsequent import gets a properly configured logger.
from utils.logging_config import configure_from_env
configure_from_env()

# Execute immediately on import
load_env()

from utils.logging_config import get_logger # noqa: E402 — after configure_from_env
logger = get_logger(__name__)
logger.info("Application startup span: environment loaded")
2 changes: 1 addition & 1 deletion src/config/config_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ def load_config(self) -> OpenRAGConfig:
logger.info("Upgrading unencrypted secrets in config.yaml to AES-256-GCM")
self.save_config_file(self._config, preserve_edited=True)

logger.debug("Configuration loaded", config=self._config.to_dict())
logger.debug("[CONFIG] Configuration loaded successfully")
return self._config

def _load_env_overrides(
Expand Down
2 changes: 1 addition & 1 deletion src/config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ async def get_langflow_api_key(force_regenerate: bool = False):

# If forcing regeneration, clear the cached key
if force_regenerate and LANGFLOW_KEY:
logger.info("Forcing Langflow API key regeneration due to auth failure")
logger.warning("[LF] Forcing Langflow API key regeneration due to auth failure")
LANGFLOW_KEY = None

# Use default langflow/langflow credentials if auto-login is enabled and credentials not set
Expand Down
5 changes: 0 additions & 5 deletions src/connectors/ibm_cos/connector.py
Original file line number Diff line number Diff line change
Expand Up @@ -368,8 +368,3 @@ async def cleanup_subscription(self, subscription_id: str) -> bool:



if __name__ == "__main__":
connector = IBMCOSConnector({})
print(connector.authenticate())
print(connector.list_files())
# print(connector.get_file_content("test_cos.py"))
12 changes: 4 additions & 8 deletions src/connectors/onedrive/connector.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,9 +168,7 @@ async def authenticate(self) -> bool:
self._authenticated = authenticated
return authenticated
except Exception as e:
logger.error(f"OneDrive authentication failed: {e}")
import traceback
traceback.print_exc()
logger.exception("[CONNECTOR] OneDrive authentication failed")
self._authenticated = False
return False

Expand Down Expand Up @@ -238,13 +236,11 @@ async def _detect_onedrive_url(self) -> Optional[str]:
else:
logger.warning("_detect_onedrive_url: webUrl is empty in response")
else:
logger.warning(f"_detect_onedrive_url: Failed to get drive info: {response.status_code}, response: {response.text[:500]}")
logger.warning("[CONNECTOR] OneDrive detect URL failed", status_code=response.status_code)

except Exception as e:
logger.error(f"_detect_onedrive_url: Exception during detection: {e}")
import traceback
traceback.print_exc()

logger.exception("[CONNECTOR] OneDrive URL detection failed")

return None

def sync_once(self) -> None:
Expand Down
16 changes: 4 additions & 12 deletions src/connectors/onedrive/oauth.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,9 +135,7 @@ async def load_credentials(self) -> bool:
return False

except Exception as e:
logger.error(f"Failed to load OneDrive credentials: {e}")
import traceback
traceback.print_exc()
logger.exception("[CONNECTOR] OneDrive credential load failed")
return False

async def _refresh_from_json_token(self, token_data: dict) -> bool:
Expand Down Expand Up @@ -185,9 +183,7 @@ async def _refresh_from_json_token(self, token_data: dict) -> bool:
return False

except Exception as e:
logger.error(f"Exception during refresh from JSON token: {e}")
import traceback
traceback.print_exc()
logger.exception("[CONNECTOR] OneDrive JSON token refresh failed")
return False

async def save_cache(self):
Expand Down Expand Up @@ -299,9 +295,7 @@ async def is_authenticated(self) -> bool:
return False

except Exception as e:
logger.error(f"OneDrive is_authenticated: Exception: {e}")
import traceback
traceback.print_exc()
logger.exception("[CONNECTOR] OneDrive is_authenticated failed")
return False

def get_access_token(self) -> str:
Expand Down Expand Up @@ -331,9 +325,7 @@ def get_access_token(self) -> str:
raise ValueError(f"Failed to acquire access token: {error_msg}")

except Exception as e:
logger.error(f"OneDrive get_access_token: Exception: {e}")
import traceback
traceback.print_exc()
logger.exception("[CONNECTOR] OneDrive get_access_token failed")
raise

async def revoke_credentials(self):
Expand Down
4 changes: 2 additions & 2 deletions src/connectors/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ async def process_connector_document(
with open(tmp_path, "wb") as f:
f.write(document.content)

logger.debug("Processing connector document", document_id=document.id)
logger.info("[CONNECTOR] Processing document", document_id=document.id, connector_type=connector_type, filename=document.filename)

# Process using consolidated processing pipeline
from models.processors import TaskProcessor
Expand All @@ -80,7 +80,7 @@ async def process_connector_document(
acl=document.acl,
)

logger.debug("Document processing result", result=result)
logger.info("[CONNECTOR] Document processed", document_id=document.id, status=result.get("status"))

# If successfully indexed or already exists, update the indexed documents with connector metadata
if result["status"] in ["indexed", "unchanged"]:
Expand Down
12 changes: 4 additions & 8 deletions src/connectors/sharepoint/connector.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,9 +175,7 @@ async def authenticate(self) -> bool:
self._authenticated = authenticated
return authenticated
except Exception as e:
logger.error(f"SharePoint authentication failed: {e}")
import traceback
traceback.print_exc()
logger.exception("[CONNECTOR] SharePoint authentication failed")
self._authenticated = False
return False

Expand Down Expand Up @@ -252,13 +250,11 @@ async def _detect_sharepoint_url(self) -> Optional[str]:
else:
logger.warning("_detect_sharepoint_url: webUrl is empty in response")
else:
logger.warning(f"_detect_sharepoint_url: Failed to get drive info: {response.status_code}, response: {response.text[:500]}")
logger.warning("[CONNECTOR] SharePoint detect URL failed", status_code=response.status_code)

except Exception as e:
logger.error(f"_detect_sharepoint_url: Exception during detection: {e}")
import traceback
traceback.print_exc()

logger.exception("[CONNECTOR] SharePoint URL detection failed")

return None

def sync_once(self) -> None:
Expand Down
Loading
Loading