Skip to content
Merged
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
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,4 @@ USER appuser

EXPOSE 8000

CMD ["python", "-m", "src.main"]
CMD ["python", "src/main.py"]
17 changes: 14 additions & 3 deletions src/application/routes/agents.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,9 @@ async def list_agents(
use_case: Annotated[ListAgentConfigsUseCase, Depends(get_list_agent_configs_use_case)],
) -> list[AgentConfigMetadata]:
"""List all agent configuration metadata."""
return await use_case.execute()
agents = await use_case.execute()
logger.info("Listed %d agent configs", len(agents))
return agents


@router.get("/{agent_name}", response_model=AgentConfig)
Expand All @@ -60,6 +62,7 @@ async def get_agent(
) -> AgentConfig:
"""Retrieve a single agent configuration by name."""
_validate_agent_name(agent_name)
logger.info("Getting agent config: %s", agent_name)
return await use_case.execute(name=agent_name)


Expand All @@ -72,7 +75,10 @@ async def create_agent(
"""Create a new agent configuration from an uploaded YAML file."""
_validate_agent_name(agent_name)
yaml_content = await _read_yaml_upload(file)
return await use_case.execute(name=agent_name, yaml_content=yaml_content)
logger.info("Creating agent config: %s", agent_name)
result = await use_case.execute(name=agent_name, yaml_content=yaml_content)
logger.info("Agent config created: %s", agent_name)
return result


@router.put("/{agent_name}", response_model=AgentConfig)
Expand All @@ -84,7 +90,10 @@ async def update_agent(
"""Update an existing agent configuration from an uploaded YAML file."""
_validate_agent_name(agent_name)
yaml_content = await _read_yaml_upload(file)
return await use_case.execute(name=agent_name, yaml_content=yaml_content)
logger.info("Updating agent config: %s", agent_name)
result = await use_case.execute(name=agent_name, yaml_content=yaml_content)
logger.info("Agent config updated: %s", agent_name)
return result


@router.delete("/{agent_name}", status_code=status.HTTP_204_NO_CONTENT)
Expand All @@ -94,4 +103,6 @@ async def delete_agent(
) -> None:
"""Delete an agent configuration."""
_validate_agent_name(agent_name)
logger.info("Deleting agent config: %s", agent_name)
await use_case.execute(name=agent_name)
logger.info("Agent config deleted: %s", agent_name)
20 changes: 11 additions & 9 deletions src/application/routes/prompt.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ async def create_prompt(
"""Create a new prompt."""
use_case = CreatePromptUseCase(prompt_manager)
try:
logger.info("Creating prompt: %s", request.identifier)
content_dicts = [msg.model_dump() for msg in request.content]
prompt = await use_case.execute(
identifier=request.identifier,
Expand All @@ -51,10 +52,11 @@ async def create_prompt(
tags=request.tags,
metadata=request.metadata,
)
logger.info("Prompt created: %s", request.identifier)
return {"status": "success", "prompt": prompt}
except Exception as e:
logger.error(f"Error creating prompt '{request.identifier}': {e}")
raise _handle_http_error(e, request.identifier)
except Exception:
logger.exception("Error creating prompt '%s'", request.identifier)
raise


@router.get("/get/{identifier}")
Expand All @@ -73,9 +75,9 @@ async def get_prompt(
tag=tag,
)
return {"status": "success", "prompt": prompt}
except Exception as e:
logger.error(f"Error getting prompt '{identifier}': {e}")
raise _handle_http_error(e, identifier)
except Exception:
logger.exception("Error getting prompt '%s'", identifier)
raise


@router.put("/update/{identifier}")
Expand All @@ -96,6 +98,6 @@ async def update_prompt(
metadata=request.metadata,
)
return {"status": "success", "prompt": prompt}
except Exception as e:
logger.error(f"Error updating prompt '{identifier}': {e}")
raise _handle_http_error(e, identifier)
except Exception:
logger.exception("Error updating prompt '%s'", identifier)
raise
6 changes: 3 additions & 3 deletions src/application/routes/threads.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ async def list_threads(
use_case: Annotated[ListThreadsUseCase, Depends(get_list_threads_use_case)],
) -> list[Thread]:
threads = await use_case.execute()
logger.debug("Listed %d threads", len(threads))
logger.info("Listed %d threads", len(threads))
return threads


Expand All @@ -48,7 +48,7 @@ async def get_thread(
thread_id: str,
use_case: Annotated[GetThreadUseCase, Depends(get_get_thread_use_case)],
) -> Thread:
logger.debug("Getting thread=%s", thread_id)
logger.info("Getting thread=%s", thread_id)
return await use_case.execute(thread_id)


Expand All @@ -67,5 +67,5 @@ async def list_messages(
use_case: Annotated[GetThreadUseCase, Depends(get_get_thread_use_case)],
) -> list:
thread = await use_case.execute(thread_id)
logger.debug("[thread=%s] Listed %d messages", thread_id, len(thread.messages))
logger.info("[thread=%s] Listed %d messages", thread_id, len(thread.messages))
return thread.messages
2 changes: 1 addition & 1 deletion src/application/routes/websocket.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ async def websocket_chat(
try:
payload = json.loads(data)
except json.JSONDecodeError:
logger.error("[thread=%s] Invalid JSON received: %s", thread_id, data[:200])
logger.exception("[thread=%s] Invalid JSON received: %s", thread_id, data[:200])
await websocket.send_text(json.dumps({"error": "Invalid JSON"}))
continue
message = payload.get("message", "")
Expand Down
2 changes: 1 addition & 1 deletion src/application/use_cases/get_agent_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,5 @@ async def execute(self, name: str) -> AgentConfig:
"""
yaml_content = await self._config_store.get(name)
config = self._config_loader.load_from_string(yaml_content)
logger.debug("Loaded agent config '%s' from store", name)
logger.info("Loaded agent config '%s' from store", name)
return config
2 changes: 1 addition & 1 deletion src/application/use_cases/list_agent_configs.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,5 @@ async def execute(self) -> list[AgentConfigMetadata]:
List of AgentConfigMetadata.
"""
result = await self._config_repository.list_all()
logger.debug("Listed %d agent configs from repository", len(result))
logger.info("Listed %d agent configs from repository", len(result))
return result
1 change: 0 additions & 1 deletion src/application/use_cases/thread_management.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ def __init__(self, threads: ThreadRepository, registry: AgentRegistry):

async def execute(self, agent_name: str) -> Thread:
if agent_name not in await self._registry.list_agents():
logger.error("Agent not found: %s", agent_name)
raise AgentNotFoundError(f"Agent not found: {agent_name}")
thread = await self._threads.create(agent_name)
logger.info("Thread created: id=%s agent=%s", thread.id, agent_name)
Expand Down
2 changes: 1 addition & 1 deletion src/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class Settings(BaseSettings):
openai_api_key: str | None = None
host: str = "0.0.0.0"
port: int = 8000
log_level: str = "INFO"
uvicorn_log_level: str = "info"
allowed_origins: list[str] = ["http://localhost:8080"]
tracing: TracingSettings = TracingSettings()

Expand Down
2 changes: 1 addition & 1 deletion src/infrastructure/deepagent/adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ def _build_response(self, result: dict, config: dict, thinking: str | None) -> M
async def invoke(self, thread_id: str, message: str) -> Message:
config = self._build_config(thread_id)
logger.info("[thread=%s] Invoking agent", thread_id)
logger.debug("[thread=%s] Message: %s", thread_id, message[:200])
logger.info("[thread=%s] Message: %s", thread_id, message[:200])
try:
start = time.monotonic()
result = await self._graph.ainvoke(
Expand Down
6 changes: 3 additions & 3 deletions src/infrastructure/deepagent/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ async def create_agent_from_config(
mcp_tools = await mcp_tool_loader.load_tools(config.mcp_servers)
logger.info("Loaded %d MCP tools for agent '%s'", len(mcp_tools), config.name)
all_tools = (local_tools or []) + mcp_tools if (local_tools or mcp_tools) else None
logger.debug("Agent '%s' tools: %d total", config.name, len(all_tools) if all_tools else 0)
logger.info("Agent '%s' tools: %d total", config.name, len(all_tools) if all_tools else 0)

if prompt_manager:
system_prompt = await get_system_prompt_from_phoenix(config.name, prompt_manager)
Expand Down Expand Up @@ -254,8 +254,8 @@ async def create_agent_from_config(
logger.info("Agent '%s' has %d subagents", config.name, len(subagents))
try:
graph = create_deep_agent(**kwargs)
except Exception as e:
logger.error(f"Error creating agent '{config.name}': {e}")
except Exception:
logger.exception("Error creating agent '%s'", config.name)
raise
logger.info("Agent '%s' created successfully", config.name)
return graph, response_format_model
Expand Down
2 changes: 1 addition & 1 deletion src/infrastructure/minio_store/adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ async def list_all(self) -> list[str]:
async def ensure_bucket(self) -> None:
"""Create the bucket if it does not already exist."""
if await self._client.bucket_exists(self._bucket):
logger.debug("MinIO bucket '%s' already exists", self._bucket)
logger.info("MinIO bucket '%s' already exists", self._bucket)
return
await self._client.make_bucket(self._bucket)
logger.info("Created MinIO bucket '%s'", self._bucket)
2 changes: 1 addition & 1 deletion src/infrastructure/persistent_registry/adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ async def get_runner(self, agent_name: str) -> AgentRunner:
AgentNotFoundError: If no config exists for this agent.
"""
if agent_name in self._runners:
logger.debug("Agent '%s' loaded from cache", agent_name)
logger.info("Agent '%s' loaded from cache", agent_name)
return self._runners[agent_name]

async with self._lock:
Expand Down
24 changes: 12 additions & 12 deletions src/infrastructure/prompt_management/phoenix_prompt_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ def __init__(
),
)
logger.info("PhoenixPromptManagerProvider initialized base_url=%s timeout=%ss", base_url, timeout)
except Exception as e:
logger.error("Failed to initialize Phoenix client: %s", e)
except Exception:
logger.exception("Failed to initialize Phoenix client")
self._client = None

@_phoenix_retry
Expand All @@ -101,8 +101,8 @@ async def get_prompt(
return self._to_domain_prompt(prompt_obj, identifier=identifier, description=prompt_obj._description, tags=[t["name"] for t in tags])
except (ValueError, PhoenixUnavailableError):
raise
except Exception as e:
logger.error("Error getting prompt '%s': %s", identifier, e)
except Exception:
logger.exception("Error getting prompt '%s'", identifier)
raise _wrap_phoenix_error("get_prompt", identifier, e) from e

@cached(cache=TTLCache(maxsize=10, ttl=300))
Expand Down Expand Up @@ -130,8 +130,8 @@ async def get_prompt_content(
return messages[0] if messages else {}
except (ValueError, PhoenixUnavailableError):
raise
except Exception as e:
logger.error("Error getting prompt content '%s': %s", identifier, e)
except Exception:
logger.exception("Error getting prompt content '%s'", identifier)
raise _wrap_phoenix_error("get_prompt_content", identifier, e) from e

@_phoenix_retry
Expand Down Expand Up @@ -167,8 +167,8 @@ async def create_prompt(
return prompt_obj
except (ValueError, PhoenixUnavailableError):
raise
except Exception as e:
logger.error("Error creating prompt '%s': %s", identifier, e)
except Exception:
logger.exception("Error creating prompt '%s'", identifier)
raise _wrap_phoenix_error("create_prompt", identifier, e) from e

@_phoenix_retry
Expand Down Expand Up @@ -199,8 +199,8 @@ async def update_prompt(
return updated
except (ValueError, PhoenixUnavailableError):
raise
except Exception as e:
logger.error("Error updating prompt '%s': %s", identifier, e)
except Exception:
logger.exception("Error updating prompt '%s'", identifier)
raise _wrap_phoenix_error("update_prompt", identifier, e) from e

async def add_tag(self, identifier: str, tag: str) -> None:
Expand All @@ -212,8 +212,8 @@ async def add_tag(self, identifier: str, tag: str) -> None:
name=tag,
)
logger.info("Added tag '%s' to prompt '%s'", tag, identifier)
except Exception as e:
logger.error("Error adding tag '%s' to '%s': %s", tag, identifier, e)
except Exception:
logger.exception("Error adding tag '%s' to '%s'", tag, identifier)
raise _wrap_phoenix_error("add_tag", identifier, e) from e

def _to_domain_prompt(
Expand Down
8 changes: 4 additions & 4 deletions src/infrastructure/tracing/phoenix_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ async def flush(self) -> None:
if hasattr(self._tracer_provider, "force_flush"):
self._tracer_provider.force_flush(timeout_millis=timeout_millis)
logger.info("Flushed pending spans to Phoenix")
except Exception as e:
logger.error("Error flushing spans to Phoenix: %s", e)
except Exception:
logger.exception("Error flushing spans to Phoenix")

async def shutdown(self) -> None:
"""Shutdown the tracer provider and flush remaining spans."""
Expand All @@ -76,5 +76,5 @@ async def shutdown(self) -> None:
if hasattr(self._tracer_provider, "shutdown"):
self._tracer_provider.shutdown()
logger.info("Phoenix tracing provider shutdown complete")
except Exception as e:
logger.error("Error shutting down tracer provider: %s", e)
except Exception:
logger.exception("Error shutting down tracer provider")
Loading
Loading