Reality123b commited on
Commit
64f58fd
·
verified ·
1 Parent(s): 7233bdb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +24 -170
app.py CHANGED
@@ -21,7 +21,7 @@ class ChatMessage:
21
  return {"role": self.role, "content": self.content}
22
 
23
  class XylariaChat:
24
- def _init_(self):
25
  self.hf_token = os.getenv("HF_TOKEN")
26
  if not self.hf_token:
27
  raise ValueError("HuggingFace token not found in environment variables")
@@ -34,8 +34,6 @@ class XylariaChat:
34
  self.image_api_url = "https://api-inference.huggingface.co/models/Salesforce/blip-image-captioning-large"
35
  self.image_api_headers = {"Authorization": f"Bearer {self.hf_token}"}
36
 
37
- self.image_gen_client = InferenceClient("black-forest-labs/FLUX.1-schnell", token=self.hf_token)
38
-
39
  self.conversation_history = []
40
  self.persistent_memory = []
41
  self.memory_embeddings = None
@@ -93,8 +91,6 @@ class XylariaChat:
93
  "photosynthesis": "process used by plants to convert light to energy"
94
  }
95
 
96
- # ... (other methods: update_internal_state, update_knowledge_graph, etc.) ...
97
-
98
  def update_internal_state(self, emotion_deltas, cognitive_load_deltas, introspection_delta, engagement_delta):
99
  for emotion, delta in emotion_deltas.items():
100
  if emotion in self.internal_state["emotions"]:
@@ -425,13 +421,6 @@ class XylariaChat:
425
 
426
  except Exception as e:
427
  return f"Error processing image: {str(e)}"
428
-
429
- def generate_image(self, prompt):
430
- try:
431
- image = self.image_gen_client.text_to_image(prompt)
432
- return image
433
- except Exception as e:
434
- return f"Error generating image: {e}"
435
 
436
  def perform_math_ocr(self, image_path):
437
  try:
@@ -553,44 +542,12 @@ class XylariaChat:
553
  def create_interface(self):
554
  def streaming_response(message, chat_history, image_filepath, math_ocr_image_path):
555
 
556
- if "/image" in message:
557
- image_prompt = message.replace("/image", "").strip()
558
-
559
- # Placeholder for image generation
560
- placeholder_image = "data:image/svg+xml," + requests.utils.quote(f'''
561
- <svg width="256" height="256" viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
562
- <rect width="256" height="256" rx="20" fill="#888888" />
563
- <animate attributeName="fill" values="#888888;#000000;#888888" dur="2s" repeatCount="indefinite" />
564
- <text x="50%" y="50%" dominant-baseline="middle" text-anchor="middle" font-size="48" fill="white">
565
- <tspan>/</tspan>
566
- </text>
567
- </svg>
568
- ''')
569
-
570
- updated_history = chat_history + [[message, gr.Image(value=placeholder_image, type="pil", visible=True)]]
571
- yield "", updated_history, None, None, ""
572
-
573
- try:
574
- generated_image = self.generate_image(image_prompt)
575
-
576
- updated_history[-1][1] = gr.Image(value=generated_image, type="pil", visible=True)
577
- yield "", updated_history, None, None, ""
578
-
579
- self.conversation_history.append(ChatMessage(role="user", content=message).to_dict())
580
- self.conversation_history.append(ChatMessage(role="assistant", content="Image generated").to_dict())
581
-
582
- return
583
- except Exception as e:
584
- updated_history[-1][1] = f"Error generating image: {e}"
585
- yield "", updated_history, None, None, ""
586
- return
587
-
588
  ocr_text = ""
589
  if math_ocr_image_path:
590
  ocr_text = self.perform_math_ocr(math_ocr_image_path)
591
  if ocr_text.startswith("Error"):
592
  updated_history = chat_history + [[message, ocr_text]]
593
- yield "", updated_history, None, None, ""
594
  return
595
  else:
596
  message = f"Math OCR Result: {ocr_text}\n\nUser's message: {message}"
@@ -602,7 +559,7 @@ class XylariaChat:
602
 
603
  if isinstance(response_stream, str):
604
  updated_history = chat_history + [[message, response_stream]]
605
- yield "", updated_history, None, None, ""
606
  return
607
 
608
  full_response = ""
@@ -615,11 +572,11 @@ class XylariaChat:
615
  full_response += chunk_content
616
 
617
  updated_history[-1][1] = full_response
618
- yield "", updated_history, None, None, ""
619
  except Exception as e:
620
  print(f"Streaming error: {e}")
621
  updated_history[-1][1] = f"Error during response: {e}"
622
- yield "", updated_history, None, None, ""
623
  return
624
 
625
  full_response = self.adjust_response_based_on_state(full_response)
@@ -667,77 +624,41 @@ class XylariaChat:
667
  self.conversation_history = self.conversation_history[-10:]
668
 
669
  custom_css = """
670
- @import url('https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap');
671
-
672
- body {
673
- background-color: #f5f5f5;
674
- font-family: 'Source Sans Pro', sans-serif;
675
- }
676
-
677
- .gradio-container {
678
- max-width: 900px;
679
- margin: 0 auto;
680
- border-radius: 10px;
681
- box-shadow: 0px 4px 20px rgba(0, 0, 0, 0.1);
682
  }
683
-
684
- .chatbot-container {
685
- background-color: #fff;
686
- border-radius: 10px;
687
- padding: 20px;
688
- }
689
-
690
  .chatbot-container .message {
691
- font-family: 'Source Sans Pro', sans-serif;
692
- font-size: 16px;
693
- line-height: 1.6;
694
  }
695
-
696
  .gradio-container input,
697
  .gradio-container textarea,
698
  .gradio-container button {
699
- font-family: 'Source Sans Pro', sans-serif;
700
- font-size: 16px;
701
- border-radius: 8px;
702
  }
703
-
704
  .image-container {
705
  display: flex;
706
  gap: 10px;
707
- margin-bottom: 20px;
708
- justify-content: center;
709
  }
710
-
711
  .image-upload {
712
- border: 2px dashed #d3d3d3;
713
  border-radius: 8px;
714
- padding: 20px;
715
- background-color: #fafafa;
716
- text-align: center;
717
- transition: all 0.3s ease;
718
- }
719
-
720
- .image-upload:hover {
721
- background-color: #f0f0f0;
722
- border-color: #b3b3b3;
723
  }
724
-
725
  .image-preview {
726
- max-width: 150px;
727
- max-height: 150px;
728
  border-radius: 8px;
729
- box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.1);
730
  }
731
-
732
  .clear-button {
733
  display: none;
734
  }
735
-
736
  .chatbot-container .message {
737
  opacity: 0;
738
  animation: fadeIn 0.5s ease-in-out forwards;
739
  }
740
-
741
  @keyframes fadeIn {
742
  from {
743
  opacity: 0;
@@ -748,109 +669,42 @@ class XylariaChat:
748
  transform: translateY(0);
749
  }
750
  }
751
-
752
  .gr-accordion-button {
753
  background-color: #f0f0f0 !important;
754
  border-radius: 8px !important;
755
- padding: 15px !important;
756
  margin-bottom: 10px !important;
757
  transition: all 0.3s ease !important;
758
  cursor: pointer !important;
759
- border: none !important;
760
- box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.05) !important;
761
  }
762
-
763
  .gr-accordion-button:hover {
764
  background-color: #e0e0e0 !important;
765
- box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1) !important;
766
  }
767
-
768
  .gr-accordion-active .gr-accordion-button {
769
  background-color: #d0d0d0 !important;
770
- box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1) !important;
771
  }
772
-
773
  .gr-accordion-content {
774
  transition: max-height 0.3s ease-in-out !important;
775
  overflow: hidden !important;
776
  max-height: 0 !important;
777
  }
778
-
779
  .gr-accordion-active .gr-accordion-content {
780
  max-height: 500px !important;
781
  }
782
-
783
  .gr-accordion {
784
  display: flex;
785
  flex-direction: column-reverse;
786
  }
787
-
788
- .chatbot-icon {
789
- width: 40px;
790
- height: 40px;
791
- border-radius: 50%;
792
- margin-right: 10px;
793
- }
794
-
795
- .user-message .message-row {
796
- background-color: #e8f0fe;
797
- border-radius: 10px;
798
- padding: 10px;
799
- margin-bottom: 10px;
800
- border-top-right-radius: 2px;
801
- }
802
-
803
- .assistant-message .message-row {
804
- background-color: #f0f0f0;
805
- border-radius: 10px;
806
- padding: 10px;
807
- margin-bottom: 10px;
808
- border-top-left-radius: 2px;
809
- }
810
-
811
- .user-message .message-icon {
812
- background: url('https://img.icons8.com/color/48/000000/user.png') no-repeat center center;
813
- background-size: contain;
814
- width: 30px;
815
- height: 30px;
816
- margin-right: 10px;
817
- }
818
-
819
- .assistant-message .message-icon {
820
- background: url('https://i.ibb.co/7b7hLGH/Senoa-Icon-1.png') no-repeat center center;
821
- background-size: cover;
822
- width: 40px;
823
- height: 40px;
824
- margin-right: 10px;
825
- border-radius: 50%;
826
- }
827
-
828
- .message-text {
829
- flex-grow: 1;
830
- }
831
-
832
- .message-row {
833
- display: flex;
834
- align-items: center;
835
- }
836
  """
837
 
838
- with gr.Blocks(theme=gr.themes.Soft(
839
- primary_hue="slate",
840
- secondary_hue="gray",
841
- neutral_hue="gray",
842
- font=["Source Sans Pro", "Arial", "sans-serif"],
843
- ), css=custom_css) as demo:
844
  with gr.Column():
845
  chatbot = gr.Chatbot(
846
  label="Xylaria 1.5 Senoa",
847
- height=600,
848
  show_copy_button=True,
849
- elem_classes="chatbot-container",
850
- avatar_images=(
851
- "https://img.icons8.com/color/48/000000/user.png", # User avatar
852
- "https://i.ibb.co/7b7hLGH/Senoa-Icon-1.png" # Bot avatar
853
- )
854
  )
855
 
856
  with gr.Accordion("Image Input", open=False, elem_classes="gr-accordion"):
@@ -880,18 +734,18 @@ class XylariaChat:
880
  btn = gr.Button("Send", scale=1)
881
 
882
  with gr.Row():
883
- clear = gr.Button("Clear Conversation", variant="stop")
884
  clear_memory = gr.Button("Clear Memory")
885
 
886
  btn.click(
887
  fn=streaming_response,
888
  inputs=[txt, chatbot, img, math_ocr_img],
889
- outputs=[txt, chatbot, img, math_ocr_img, txt]
890
  )
891
  txt.submit(
892
  fn=streaming_response,
893
  inputs=[txt, chatbot, img, math_ocr_img],
894
- outputs=[txt, chatbot, img, math_ocr_img, txt]
895
  )
896
 
897
  clear.click(
 
21
  return {"role": self.role, "content": self.content}
22
 
23
  class XylariaChat:
24
+ def __init__(self):
25
  self.hf_token = os.getenv("HF_TOKEN")
26
  if not self.hf_token:
27
  raise ValueError("HuggingFace token not found in environment variables")
 
34
  self.image_api_url = "https://api-inference.huggingface.co/models/Salesforce/blip-image-captioning-large"
35
  self.image_api_headers = {"Authorization": f"Bearer {self.hf_token}"}
36
 
 
 
37
  self.conversation_history = []
38
  self.persistent_memory = []
39
  self.memory_embeddings = None
 
91
  "photosynthesis": "process used by plants to convert light to energy"
92
  }
93
 
 
 
94
  def update_internal_state(self, emotion_deltas, cognitive_load_deltas, introspection_delta, engagement_delta):
95
  for emotion, delta in emotion_deltas.items():
96
  if emotion in self.internal_state["emotions"]:
 
421
 
422
  except Exception as e:
423
  return f"Error processing image: {str(e)}"
 
 
 
 
 
 
 
424
 
425
  def perform_math_ocr(self, image_path):
426
  try:
 
542
  def create_interface(self):
543
  def streaming_response(message, chat_history, image_filepath, math_ocr_image_path):
544
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
545
  ocr_text = ""
546
  if math_ocr_image_path:
547
  ocr_text = self.perform_math_ocr(math_ocr_image_path)
548
  if ocr_text.startswith("Error"):
549
  updated_history = chat_history + [[message, ocr_text]]
550
+ yield "", updated_history, None, None
551
  return
552
  else:
553
  message = f"Math OCR Result: {ocr_text}\n\nUser's message: {message}"
 
559
 
560
  if isinstance(response_stream, str):
561
  updated_history = chat_history + [[message, response_stream]]
562
+ yield "", updated_history, None, None
563
  return
564
 
565
  full_response = ""
 
572
  full_response += chunk_content
573
 
574
  updated_history[-1][1] = full_response
575
+ yield "", updated_history, None, None
576
  except Exception as e:
577
  print(f"Streaming error: {e}")
578
  updated_history[-1][1] = f"Error during response: {e}"
579
+ yield "", updated_history, None, None
580
  return
581
 
582
  full_response = self.adjust_response_based_on_state(full_response)
 
624
  self.conversation_history = self.conversation_history[-10:]
625
 
626
  custom_css = """
627
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
628
+ body, .gradio-container {
629
+ font-family: 'Inter', sans-serif !important;
 
 
 
 
 
 
 
 
 
630
  }
 
 
 
 
 
 
 
631
  .chatbot-container .message {
632
+ font-family: 'Inter', sans-serif !important;
 
 
633
  }
 
634
  .gradio-container input,
635
  .gradio-container textarea,
636
  .gradio-container button {
637
+ font-family: 'Inter', sans-serif !important;
 
 
638
  }
 
639
  .image-container {
640
  display: flex;
641
  gap: 10px;
642
+ margin-bottom: 10px;
 
643
  }
 
644
  .image-upload {
645
+ border: 1px solid #ccc;
646
  border-radius: 8px;
647
+ padding: 10px;
648
+ background-color: #f8f8f8;
 
 
 
 
 
 
 
649
  }
 
650
  .image-preview {
651
+ max-width: 200px;
652
+ max-height: 200px;
653
  border-radius: 8px;
 
654
  }
 
655
  .clear-button {
656
  display: none;
657
  }
 
658
  .chatbot-container .message {
659
  opacity: 0;
660
  animation: fadeIn 0.5s ease-in-out forwards;
661
  }
 
662
  @keyframes fadeIn {
663
  from {
664
  opacity: 0;
 
669
  transform: translateY(0);
670
  }
671
  }
 
672
  .gr-accordion-button {
673
  background-color: #f0f0f0 !important;
674
  border-radius: 8px !important;
675
+ padding: 10px !important;
676
  margin-bottom: 10px !important;
677
  transition: all 0.3s ease !important;
678
  cursor: pointer !important;
 
 
679
  }
 
680
  .gr-accordion-button:hover {
681
  background-color: #e0e0e0 !important;
682
+ box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1) !important;
683
  }
 
684
  .gr-accordion-active .gr-accordion-button {
685
  background-color: #d0d0d0 !important;
686
+ box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1) !important;
687
  }
 
688
  .gr-accordion-content {
689
  transition: max-height 0.3s ease-in-out !important;
690
  overflow: hidden !important;
691
  max-height: 0 !important;
692
  }
 
693
  .gr-accordion-active .gr-accordion-content {
694
  max-height: 500px !important;
695
  }
 
696
  .gr-accordion {
697
  display: flex;
698
  flex-direction: column-reverse;
699
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
700
  """
701
 
702
+ with gr.Blocks(theme='soft', css=custom_css) as demo:
 
 
 
 
 
703
  with gr.Column():
704
  chatbot = gr.Chatbot(
705
  label="Xylaria 1.5 Senoa",
706
+ height=500,
707
  show_copy_button=True,
 
 
 
 
 
708
  )
709
 
710
  with gr.Accordion("Image Input", open=False, elem_classes="gr-accordion"):
 
734
  btn = gr.Button("Send", scale=1)
735
 
736
  with gr.Row():
737
+ clear = gr.Button("Clear Conversation")
738
  clear_memory = gr.Button("Clear Memory")
739
 
740
  btn.click(
741
  fn=streaming_response,
742
  inputs=[txt, chatbot, img, math_ocr_img],
743
+ outputs=[txt, chatbot, img, math_ocr_img]
744
  )
745
  txt.submit(
746
  fn=streaming_response,
747
  inputs=[txt, chatbot, img, math_ocr_img],
748
+ outputs=[txt, chatbot, img, math_ocr_img]
749
  )
750
 
751
  clear.click(