Upload folder using huggingface_hub
Browse files- nbs/02_learning_interface.ipynb +29 -10
- wardbuddy/learning_interface.py +29 -10
nbs/02_learning_interface.ipynb
CHANGED
@@ -539,12 +539,11 @@
|
|
539 |
" specialty: str,\n",
|
540 |
" setting: str,\n",
|
541 |
" state: Dict[str, Any]\n",
|
542 |
-
" ) -> List
|
543 |
" \"\"\"Update rotation context with session tracking.\"\"\"\n",
|
544 |
" if specialty and setting:\n",
|
545 |
" self.tutor.learning_context.update_rotation(specialty, setting)\n",
|
546 |
" \n",
|
547 |
-
" # Start new session\n",
|
548 |
" if self.auth.start_session(specialty, setting):\n",
|
549 |
" self.auth.log_interaction(\n",
|
550 |
" \"context_update\",\n",
|
@@ -555,15 +554,17 @@
|
|
555 |
" goals = await self.tutor.generate_smart_goals(specialty, setting)\n",
|
556 |
" state[\"suggested_goals\"] = goals\n",
|
557 |
" \n",
|
558 |
-
" # Log goal generation\n",
|
559 |
" if self.auth.token:\n",
|
560 |
" self.auth.log_interaction(\n",
|
561 |
" \"goals_generated\",\n",
|
562 |
" f\"Generated {len(goals)} goals\"\n",
|
563 |
" )\n",
|
564 |
" \n",
|
565 |
-
"
|
566 |
-
"
|
|
|
|
|
|
|
567 |
"\n",
|
568 |
" # Chat Processing\n",
|
569 |
" async def process_chat(\n",
|
@@ -863,10 +864,11 @@
|
|
863 |
" with gr.Row():\n",
|
864 |
" # Left: Chat Interface\n",
|
865 |
" with gr.Column(scale=3):\n",
|
866 |
-
" #
|
867 |
" goal_display = gr.Markdown(\n",
|
868 |
" value=\"No active learning goal\",\n",
|
869 |
-
" elem_classes=[\"active-goal\"]
|
|
|
870 |
" )\n",
|
871 |
" \n",
|
872 |
" # Chat interface with proper sizing\n",
|
@@ -960,6 +962,13 @@
|
|
960 |
" label=\"Identified Knowledge Gaps\",\n",
|
961 |
" row_count=8\n",
|
962 |
" )\n",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
963 |
" \n",
|
964 |
" # Helper Functions\n",
|
965 |
" def clear_discussion() -> Tuple[List, str, Dict]:\n",
|
@@ -1005,15 +1014,25 @@
|
|
1005 |
" specialty.change(\n",
|
1006 |
" fn=self.update_context,\n",
|
1007 |
" inputs=[specialty, setting, state],\n",
|
1008 |
-
" outputs=[
|
|
|
|
|
|
|
|
|
|
|
1009 |
" )\n",
|
1010 |
" \n",
|
1011 |
" setting.change(\n",
|
1012 |
" fn=self.update_context,\n",
|
1013 |
" inputs=[specialty, setting, state],\n",
|
1014 |
-
" outputs=[
|
|
|
|
|
|
|
|
|
|
|
1015 |
" )\n",
|
1016 |
-
"
|
1017 |
" # Chat events with streaming\n",
|
1018 |
" msg.submit(\n",
|
1019 |
" self.process_chat,\n",
|
|
|
539 |
" specialty: str,\n",
|
540 |
" setting: str,\n",
|
541 |
" state: Dict[str, Any]\n",
|
542 |
+
" ) -> Tuple[List, List, List, str]: # Explicitly return all outputs\n",
|
543 |
" \"\"\"Update rotation context with session tracking.\"\"\"\n",
|
544 |
" if specialty and setting:\n",
|
545 |
" self.tutor.learning_context.update_rotation(specialty, setting)\n",
|
546 |
" \n",
|
|
|
547 |
" if self.auth.start_session(specialty, setting):\n",
|
548 |
" self.auth.log_interaction(\n",
|
549 |
" \"context_update\",\n",
|
|
|
554 |
" goals = await self.tutor.generate_smart_goals(specialty, setting)\n",
|
555 |
" state[\"suggested_goals\"] = goals\n",
|
556 |
" \n",
|
|
|
557 |
" if self.auth.token:\n",
|
558 |
" self.auth.log_interaction(\n",
|
559 |
" \"goals_generated\",\n",
|
560 |
" f\"Generated {len(goals)} goals\"\n",
|
561 |
" )\n",
|
562 |
" \n",
|
563 |
+
" update_results = self._update_displays(state)\n",
|
564 |
+
" return tuple(update_results) # Return as tuple to match output structure\n",
|
565 |
+
" \n",
|
566 |
+
" empty_results = [[], [], [], \"No active learning goal\"]\n",
|
567 |
+
" return tuple(empty_results) # Return as tuple here too\n",
|
568 |
"\n",
|
569 |
" # Chat Processing\n",
|
570 |
" async def process_chat(\n",
|
|
|
864 |
" with gr.Row():\n",
|
865 |
" # Left: Chat Interface\n",
|
866 |
" with gr.Column(scale=3):\n",
|
867 |
+
" # Update the Markdown component to handle string input\n",
|
868 |
" goal_display = gr.Markdown(\n",
|
869 |
" value=\"No active learning goal\",\n",
|
870 |
+
" elem_classes=[\"active-goal\"],\n",
|
871 |
+
" sanitize=False # Allow raw HTML if needed\n",
|
872 |
" )\n",
|
873 |
" \n",
|
874 |
" # Chat interface with proper sizing\n",
|
|
|
962 |
" label=\"Identified Knowledge Gaps\",\n",
|
963 |
" row_count=8\n",
|
964 |
" )\n",
|
965 |
+
" gr.Markdown(\"### Recent Goals\")\n",
|
966 |
+
" recent_goals = gr.DataFrame(\n",
|
967 |
+
" headers=[\"Goal\", \"Category\", \"Completed\"],\n",
|
968 |
+
" value=[],\n",
|
969 |
+
" label=\"Recently Completed Goals\",\n",
|
970 |
+
" row_count=5\n",
|
971 |
+
" )\n",
|
972 |
" \n",
|
973 |
" # Helper Functions\n",
|
974 |
" def clear_discussion() -> Tuple[List, str, Dict]:\n",
|
|
|
1014 |
" specialty.change(\n",
|
1015 |
" fn=self.update_context,\n",
|
1016 |
" inputs=[specialty, setting, state],\n",
|
1017 |
+
" outputs=[\n",
|
1018 |
+
" goals_list, # DataFrame\n",
|
1019 |
+
" progress_display, # DataFrame\n",
|
1020 |
+
" recent_goals, # DataFrame\n",
|
1021 |
+
" goal_display # Markdown\n",
|
1022 |
+
" ]\n",
|
1023 |
" )\n",
|
1024 |
" \n",
|
1025 |
" setting.change(\n",
|
1026 |
" fn=self.update_context,\n",
|
1027 |
" inputs=[specialty, setting, state],\n",
|
1028 |
+
" outputs=[\n",
|
1029 |
+
" goals_list, # DataFrame\n",
|
1030 |
+
" progress_display, # DataFrame\n",
|
1031 |
+
" recent_goals, # DataFrame\n",
|
1032 |
+
" goal_display # Markdown\n",
|
1033 |
+
" ]\n",
|
1034 |
" )\n",
|
1035 |
+
" \n",
|
1036 |
" # Chat events with streaming\n",
|
1037 |
" msg.submit(\n",
|
1038 |
" self.process_chat,\n",
|
wardbuddy/learning_interface.py
CHANGED
@@ -440,12 +440,11 @@ class LearningInterface:
|
|
440 |
specialty: str,
|
441 |
setting: str,
|
442 |
state: Dict[str, Any]
|
443 |
-
) -> List:
|
444 |
"""Update rotation context with session tracking."""
|
445 |
if specialty and setting:
|
446 |
self.tutor.learning_context.update_rotation(specialty, setting)
|
447 |
|
448 |
-
# Start new session
|
449 |
if self.auth.start_session(specialty, setting):
|
450 |
self.auth.log_interaction(
|
451 |
"context_update",
|
@@ -456,15 +455,17 @@ class LearningInterface:
|
|
456 |
goals = await self.tutor.generate_smart_goals(specialty, setting)
|
457 |
state["suggested_goals"] = goals
|
458 |
|
459 |
-
# Log goal generation
|
460 |
if self.auth.token:
|
461 |
self.auth.log_interaction(
|
462 |
"goals_generated",
|
463 |
f"Generated {len(goals)} goals"
|
464 |
)
|
465 |
|
466 |
-
|
467 |
-
|
|
|
|
|
|
|
468 |
|
469 |
# Chat Processing
|
470 |
async def process_chat(
|
@@ -764,10 +765,11 @@ class LearningInterface:
|
|
764 |
with gr.Row():
|
765 |
# Left: Chat Interface
|
766 |
with gr.Column(scale=3):
|
767 |
-
#
|
768 |
goal_display = gr.Markdown(
|
769 |
value="No active learning goal",
|
770 |
-
elem_classes=["active-goal"]
|
|
|
771 |
)
|
772 |
|
773 |
# Chat interface with proper sizing
|
@@ -861,6 +863,13 @@ class LearningInterface:
|
|
861 |
label="Identified Knowledge Gaps",
|
862 |
row_count=8
|
863 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
864 |
|
865 |
# Helper Functions
|
866 |
def clear_discussion() -> Tuple[List, str, Dict]:
|
@@ -906,15 +915,25 @@ class LearningInterface:
|
|
906 |
specialty.change(
|
907 |
fn=self.update_context,
|
908 |
inputs=[specialty, setting, state],
|
909 |
-
outputs=[
|
|
|
|
|
|
|
|
|
|
|
910 |
)
|
911 |
|
912 |
setting.change(
|
913 |
fn=self.update_context,
|
914 |
inputs=[specialty, setting, state],
|
915 |
-
outputs=[
|
|
|
|
|
|
|
|
|
|
|
916 |
)
|
917 |
-
|
918 |
# Chat events with streaming
|
919 |
msg.submit(
|
920 |
self.process_chat,
|
|
|
440 |
specialty: str,
|
441 |
setting: str,
|
442 |
state: Dict[str, Any]
|
443 |
+
) -> Tuple[List, List, List, str]: # Explicitly return all outputs
|
444 |
"""Update rotation context with session tracking."""
|
445 |
if specialty and setting:
|
446 |
self.tutor.learning_context.update_rotation(specialty, setting)
|
447 |
|
|
|
448 |
if self.auth.start_session(specialty, setting):
|
449 |
self.auth.log_interaction(
|
450 |
"context_update",
|
|
|
455 |
goals = await self.tutor.generate_smart_goals(specialty, setting)
|
456 |
state["suggested_goals"] = goals
|
457 |
|
|
|
458 |
if self.auth.token:
|
459 |
self.auth.log_interaction(
|
460 |
"goals_generated",
|
461 |
f"Generated {len(goals)} goals"
|
462 |
)
|
463 |
|
464 |
+
update_results = self._update_displays(state)
|
465 |
+
return tuple(update_results) # Return as tuple to match output structure
|
466 |
+
|
467 |
+
empty_results = [[], [], [], "No active learning goal"]
|
468 |
+
return tuple(empty_results) # Return as tuple here too
|
469 |
|
470 |
# Chat Processing
|
471 |
async def process_chat(
|
|
|
765 |
with gr.Row():
|
766 |
# Left: Chat Interface
|
767 |
with gr.Column(scale=3):
|
768 |
+
# Update the Markdown component to handle string input
|
769 |
goal_display = gr.Markdown(
|
770 |
value="No active learning goal",
|
771 |
+
elem_classes=["active-goal"],
|
772 |
+
sanitize=False # Allow raw HTML if needed
|
773 |
)
|
774 |
|
775 |
# Chat interface with proper sizing
|
|
|
863 |
label="Identified Knowledge Gaps",
|
864 |
row_count=8
|
865 |
)
|
866 |
+
gr.Markdown("### Recent Goals")
|
867 |
+
recent_goals = gr.DataFrame(
|
868 |
+
headers=["Goal", "Category", "Completed"],
|
869 |
+
value=[],
|
870 |
+
label="Recently Completed Goals",
|
871 |
+
row_count=5
|
872 |
+
)
|
873 |
|
874 |
# Helper Functions
|
875 |
def clear_discussion() -> Tuple[List, str, Dict]:
|
|
|
915 |
specialty.change(
|
916 |
fn=self.update_context,
|
917 |
inputs=[specialty, setting, state],
|
918 |
+
outputs=[
|
919 |
+
goals_list, # DataFrame
|
920 |
+
progress_display, # DataFrame
|
921 |
+
recent_goals, # DataFrame
|
922 |
+
goal_display # Markdown
|
923 |
+
]
|
924 |
)
|
925 |
|
926 |
setting.change(
|
927 |
fn=self.update_context,
|
928 |
inputs=[specialty, setting, state],
|
929 |
+
outputs=[
|
930 |
+
goals_list, # DataFrame
|
931 |
+
progress_display, # DataFrame
|
932 |
+
recent_goals, # DataFrame
|
933 |
+
goal_display # Markdown
|
934 |
+
]
|
935 |
)
|
936 |
+
|
937 |
# Chat events with streaming
|
938 |
msg.submit(
|
939 |
self.process_chat,
|