Skip to content

Follow-up issues for PR #222 #254

Description

@yangm2

Claude finished @yangm2's task in 2m 30s —— View job


Updating Unresolved Items List

Todo List

  • Review previous unresolved items list
  • Add new architectural items to the list
  • Categorize by priority
  • Post updated list

Unresolved Items for Issue Tracking (UPDATED)

I've updated the unresolved items list to include the three new architectural and maintenance items you requested.


Unresolved Items

1. Letter Parser Breaks in Production 🔴 HIGH PRIORITY

Status: FIXED in #222
Description: The letter generation functionality shows only the bot message prompt and an empty letter content area. This is a frontend issue but may require minor backend changes to prevent breaking production.
Context: Comment by leekahung (Feb 4, 2026)
Evidence: Screenshots show empty letter area with bot prompt "What was generated is just an initial template..."
Proposed Solution: Minor tweaks to constants.py and useLetterContent.tsx (solution ready per comment)
Impact: Blocks production deployment if not fixed


2. Port Frontend Message Types to LangChain 🟡 MEDIUM PRIORITY

Status: Architectural improvement discussed in comments
Description: Port the frontend to use LangChain TypeScript libraries to make message types consistent between frontend and backend. Currently, the frontend uses custom message types while the backend uses LangChain's message classes.
Context:

Current State:

  • Backend uses LangChain message types (HumanMessage, AIMessage)
  • Frontend uses {role: "ai" | "user", content: string} format
  • Role naming was changed from "model" to "ai" to match LangChain conventions

Benefits:

  • Type safety across full stack
  • Consistent message handling
  • Better IDE integration
  • Native support for LangChain message features

Impact: Would improve maintainability and reduce frontend/backend impedance mismatch


3. Formalize Backend Response Variants Serialization 🟡 MEDIUM PRIORITY

Status: Architectural improvement discussed in comments
Description: Create a formal, type-based API between backend and frontend for different response variants (citations, reasoning, letter content, end-of-stream markers) instead of having the frontend parse embedded string markers or HTML tags out of content.
Context:

  • Comment by yangm2 (Feb 3, 2026) - "In the future, it would be cleaner to use a type-based API (FastApi?) between the backend and frontend to pass different types of message variants (i.e. citations, reasoning, letter) rather than having special logic in the frontend to parse out embedded string-hints or pass-through HTML tags."
  • Comment by yangm2 (Feb 3, 2026) - "On the other hand, shouldn't we move all of the styling to the frontend? It would be better if we returned different types of messages from the backend to the frontend and the styling was handled by CSS (or whatever)."

Current State:

  • Backend embeds formatting markers in content strings (e.g., 🤔 <em>reasoning</em> 🤔)
  • Frontend uses DOMPurify to sanitize and then parses/renders embedded HTML
  • Different message types (reasoning, citations, letter) are distinguished by string markers

Proposed Approach:

  • Use structured response types (e.g., Pydantic models) for different message variants
  • Serialize to JSON with explicit type field
  • Frontend handles styling based on message type (not embedded HTML)
  • Consider FastAPI for automatic OpenAPI schema generation

Benefits:

  • Separation of concerns (backend: data, frontend: presentation)
  • Type safety for response variants
  • Easier to test and maintain
  • No HTML injection risks
  • Better support for multiple frontend clients

Impact: Would require refactoring both backend response streaming and frontend message rendering


4. Split LangChainChatManager into Inheritance Hierarchy 🟡 MEDIUM PRIORITY (NEW)

Status: Architectural improvement for model-specific handling
Description: Refactor the LangChainChatManager class into a base class and model-specific child classes to handle differences between Gemini model versions that leak through the LangChain API.

Context:

Proposed Structure:

class GeminiChatManager:
    """Base class for Gemini-based chat management"""
    # Common functionality across all Gemini models
    
class Gemini2_5ChatManager(GeminiChatManager):
    """Child class for Gemini 2.5-specific features"""
    # Handles Gemini 2.5-specific quirks and features
    
class Gemini3PlusChatManager(GeminiChatManager):
    """Child class for Gemini 3+ specific features"""
    # Handles Gemini 3+ specific quirks and features

Rationale:

  • Different Gemini model versions have different capabilities and behaviors
  • LangChain API doesn't fully abstract these differences
  • Model-specific handling is currently mixed in a single class
  • Inheritance hierarchy would make model-specific code paths explicit

Benefits:

  • Clear separation of model-specific logic
  • Easier to add support for new Gemini versions
  • Better testability of model-specific features
  • Reduced conditional logic in core class

Impact: Moderate refactoring of backend/tenantfirstaid/langchain_chat_manager.py and related tests


5. Bump Package Dependencies to Latest Versions 🟢 LOW PRIORITY (NEW)

Status: FIXED in #255
Description: Update all package dependencies to their latest stable versions across Python (backend), npm (frontend), and GitHub Actions workflows.

Context: Comment by yangm2 (Feb 4, 2026)

Scope:

  1. Python Dependencies (backend/pyproject.toml, backend/uv.lock):

    • LangChain packages (currently >=1.1.0,<2.0.0)
    • Google Vertex AI packages
    • Testing and development tools
  2. npm Dependencies (frontend/package.json, frontend/package-lock.json):

    • React and related packages
    • Testing libraries
    • Build tools
  3. GitHub Actions (.github/workflows/*.yml):

    • Action versions (e.g., actions/checkout@v4)
    • Runner images

Considerations:

  • Check for breaking changes in major version updates
  • Update code if APIs have changed
  • Run full test suite after updates
  • Update documentation if new features are used

Benefits:

  • Security patches
  • Performance improvements
  • New features
  • Bug fixes

Impact: May require code changes if dependencies have breaking changes


6. Enable More Evaluators for LangSmith Experiments 🟢 LOW PRIORITY (NEW)

Status: Enhancement to evaluation capabilities
Description: Expand the set of evaluators used in LangSmith experiments to provide more comprehensive quality metrics for the LangChain agent.

Context:

Current Evaluators:

  1. Citation format evaluator (checks HTML anchor tag format)
  2. Tool usage evaluator (verifies RAG tool invocation)
  3. Performance evaluator (measures latency)

Potential New Evaluators:

  • Relevance evaluator: Measures how relevant the response is to the query
  • Completeness evaluator: Checks if all aspects of the query are addressed
  • Accuracy evaluator: Validates factual correctness against known legal statutes
  • Tone evaluator: Ensures responses maintain appropriate legal/professional tone
  • Citation coverage evaluator: Verifies all claims are backed by citations
  • Multi-turn coherence evaluator: Checks conversation context is maintained
  • Safety evaluator: Flags potentially harmful or inappropriate responses

Implementation:

  • Add new evaluator functions to backend/scripts/langsmith_evaluators.py
  • Update backend/scripts/run_langsmith_evaluation.py to include new evaluators
  • Document new evaluators in backend/scripts/EVALUATION.md
  • Create test cases for new evaluators

Benefits:

  • More comprehensive quality assessment
  • Better visibility into agent behavior
  • Helps identify specific improvement areas
  • Supports A/B testing of model configurations

Impact: Requires implementation of new evaluator functions and test cases


7. Thread ID / Session Management Not Implemented 🟡 MEDIUM PRIORITY

Status: Acknowledged in code, deferred from initial PR
Description: Thread IDs are always None, preventing conversation history from persisting between sessions. Multi-turn conversations work within a single session but not across page reloads or different sessions.
Context:

Code Reference:

# TODO: consider using randomly-generated token stored client-side in
#       a secure-cookie
tid: Optional[str] = None

Impact: Users lose conversation context between sessions
Related: PR comment discussion about session architecture


8. WIP Test Needs Completion 🟡 MEDIUM PRIORITY

Status: Test marked as work-in-progress and skipped
Description: The test_chat_view_dispatch_request_streams_response test is marked with @pytest.mark.skip("work-in-progress") and has a FIXME comment about mocking not working correctly.
Context:

Code Reference:

@pytest.mark.skip("work-in-progress")
def test_chat_view_dispatch_request_streams_response(app, mocker, chat_manager):
    # ...
    # FIXME: this is not really mocking!!!
    chat_manager.agent.stream.return_value = iter([mock_event])

Impact: Reduced test coverage for critical streaming functionality
Note: Yangm2 indicated this is acceptable to defer post-merge per comment


9. Documentation Update: Session Architecture 🟡 MEDIUM PRIORITY

Status: Explicitly marked as TODO in documentation
Description: The Session Architecture section in Architecture.md needs updating to reflect the LangChain migration changes.
Context: Architecture.md:198

Code Reference:

### Session Architecture

:construction: TODO: update this section

Impact: Documentation drift from actual implementation


10. VERTEX_AI_DATASTORE Path Handling Hack 🟢 LOW PRIORITY

Status: Known issue tracked in #247
Description: Temporary hack to extract datastore name from full path URI. Old code wanted full path, new code only wants the last part.
Context:

Code Reference:

# FIXME: Temporary hack for VERTEX_AI_DATASTORE (old code wanted full
#        path URI, new code only wants the last part)
#        (https://github.com/codeforpdx/tenantfirstaid/issues/247)
if (
    self.VERTEX_AI_DATASTORE is not None
    and "projects/" in self.VERTEX_AI_DATASTORE
):
    self.VERTEX_AI_DATASTORE = self.VERTEX_AI_DATASTORE.split("/")[-1]

Impact: Minor technical debt, works but not ideal


11. Refactor Constants Organization 🟢 LOW PRIORITY

Status: TODO comment in code
Description: Separate hard-coded values (like SAFETY_SETTINGS, MODEL_TEMPERATURE) from environment variables for better organization.
Context:

Code Reference:

# TODO: separate these from environment variables
self.SAFETY_SETTINGS: Final = {
    # ...
}

Impact: Code organization improvement


12. Refactor Stream Matching Logic 🟢 LOW PRIORITY

Status: TODO comment in code
Description: Extract the match/yield logic in the streaming response generator into a separate function for better maintainability.
Context: backend/tenantfirstaid/langchain_chat_manager.py:184

Code Reference:

# TODO: refactor this match/yield into a function
# Specialize handling/printing based on each message class/type
for m in chunk[chunk_k]["messages"]:
    # ... complex matching logic

Impact: Code quality improvement


13. Incomplete generate_response Method 🟢 LOW PRIORITY

Status: Method exists but marked with bare TODO
Description: The generate_response method in LangChainChatManager has a bare # TODO comment suggesting it needs implementation or documentation.
Context: backend/tenantfirstaid/langchain_chat_manager.py:128

Code Reference:

# TODO
def generate_response(
    self,
    messages: list[AnyMessage],
    # ...

Impact: Unclear - method may be complete but lacks documentation


14. Add Negative Tests for Input Validation 🟢 LOW PRIORITY

Status: TODO in test file
Description: Add negative test cases for input validation in langchain_tools.
Context: backend/tests/test_langchain_tools.py:41

Code Reference:

# TODO: negative tests for input validation

Impact: Improved test coverage for edge cases


15. Test Filter Builder Function 🟢 LOW PRIORITY

Status: TODO in test file
Description: Add unit tests for the _filter_builder helper function.
Context: backend/tests/test_langchain_tools.py:43

Code Reference:

# TODO: test _filter_builder

Impact: Improved test coverage


16. Investigate get_extractive_answers Parameter 🟢 LOW PRIORITY

Status: TODO in code
Description: Determine if the get_extractive_answers=True parameter in VertexAISearchRetriever is useful for the application.
Context: backend/tenantfirstaid/langchain_tools.py:60

Code Reference:

get_extractive_answers=True,  # TODO: figure out if this is useful

Impact: Potential optimization opportunity


17. Multi-Turn Evaluation Support 🟢 LOW PRIORITY

Status: TODO in evaluation script
Description: Add support for multi-turn conversation evaluation in LangSmith evaluations.
Context: backend/scripts/run_langsmith_evaluation.py:65

Code Reference:

# TODO: https://docs.langchain.com/langsmith/multi-turn-simulation

Impact: More comprehensive evaluation capabilities


18. CodeQL Warnings 🟢 LOW PRIORITY (Mostly False Positives)

Status: Partially addressed in #256
Description: Various CodeQL warnings including:

  • Unused exception objects in scripts (not production code)
  • Potentially uninitialized local variables (false positives - validated before use)
  • Commented-out code
  • Unused global variable DEFAULT_INSTRUCTIONS (false positive - imported elsewhere)
  • Unused imports in test files
  • Unpinned GitHub Action version

Context: Multiple CodeQL review comments
Impact: Low - most are false positives or non-critical


Summary

Critical (Blocks Production):

  1. Letter parser breaking in production 🛠️ Port to langchain #222

Should Address Soon (Architectural Improvements):
2. Port frontend message types to LangChain
3. Formalize backend response variants serialization
4. Split LangChainChatManager into inheritance hierarchy ✨ NEW
7. Thread ID / session management
8. WIP test completion
9. Documentation updates

Routine Maintenance:
5. Bump package dependencies to latest versions 🛠️ #255
6. Enable more evaluators for LangSmith experiments ✨ NEW

Technical Debt / Improvements:
10-18. Various code quality improvements, refactoring, and test coverage enhancements

Already Tracked:


View job

Originally posted by @claude[bot] in #222 (comment)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    backendBot implementation and other backend concernsdocumentationImprovements or additions to documentationfrontendFrontend implementation (follows UX design)

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions