diff --git a/.env b/.env new file mode 100644 index 0000000000000000000000000000000000000000..29a779aee9463bf1fd193a68bac494b2c7849e4c --- /dev/null +++ b/.env @@ -0,0 +1,7 @@ +# GROQ_API_KEY = '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' +HUGGINGFACEHUB_ACCESS_TOKEN='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' +GROQ_API_KEY='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' +GOOGLE_API_KEY="AIzaSyB2uDj6IeuNszSuk80feW-eBgpIDH0WFSY" +OPENAI_API_KEY = "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" +ANTHROPIC_API_KEY = "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" + diff --git a/.gitignore b/.gitignore index 6e735b12cf552ac81a14d3b9c761274772500331..42ef0e0db2212acc16314c81968726d4c603c046 100644 --- a/.gitignore +++ b/.gitignore @@ -1,25 +1,2 @@ myenv -.env -static -templates -main_demo.py -image.png -my_agent/utils/check.py -/pages -streamlit_app.py -data extracted_data.csv -Research -__pycache__/ -*.pyc - -# __pycache__ -# context_analysis_agent/__pycache__ -# context_analysis_agent/utils/__pycache__ -# brainstroming_agent/__pycache__ -# brainstroming_agent/utils__pycache__ -# business_interaction_agent/__pycache__ -# business_interaction_agent/utils/__pycache__ -# ideation_agent/__pycache__ -# ideation_agent/utils/__pycache__ - diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 6125f38dbd3b80ad7d3ceb434bed4412916f54f4..0000000000000000000000000000000000000000 --- a/Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -# Use an official Python image -FROM python:3.12-slim - -# Set working directory -WORKDIR /app - -# Create a cache directory with proper permissions -RUN mkdir -p /data/.cache/huggingface && chmod -R 777 /data - -# Set environment variables for Hugging Face cache -ENV HF_HOME=/data/.cache/huggingface -ENV TRANSFORMERS_CACHE=/data/.cache/huggingface/transformers -ENV HF_DATASETS_CACHE=/data/.cache/huggingface/datasets - -# Copy code -COPY . . - -# Install dependencies -RUN pip install --no-cache-dir -r requirements.txt - -# Expose the port -EXPOSE 7860 - -# Run the FastAPI app -CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"] diff --git a/__pycache__/dummy_state.cpython-312.pyc b/__pycache__/dummy_state.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4326e5aef404c3229bd04ec5f92d5c186b37819f Binary files /dev/null and b/__pycache__/dummy_state.cpython-312.pyc differ diff --git a/api/__pycache__/__init__.cpython-312.pyc b/api/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0dffb82620cff27e5f303861a4d72b39f2688c86 Binary files /dev/null and b/api/__pycache__/__init__.cpython-312.pyc differ diff --git a/api/__pycache__/main.cpython-312.pyc b/api/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1966dfef411bf40a13d7a5a2ef94cec6bab2fd3e Binary files /dev/null and b/api/__pycache__/main.cpython-312.pyc differ diff --git a/api/__pycache__/stored_data.cpython-312.pyc b/api/__pycache__/stored_data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28e5bf1bba599b1a1c4b3140ded823a39f50364f Binary files /dev/null and b/api/__pycache__/stored_data.cpython-312.pyc differ diff --git a/api/routers/__pycache__/__init__.cpython-312.pyc b/api/routers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3995470bfe5209564b32447477ff52ecfa0eca1 Binary files /dev/null and b/api/routers/__pycache__/__init__.cpython-312.pyc differ diff --git a/api/routers/__pycache__/brainstorm.cpython-312.pyc b/api/routers/__pycache__/brainstorm.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fda23773015494e741f172a199b2c6045a732e75 Binary files /dev/null and b/api/routers/__pycache__/brainstorm.cpython-312.pyc differ diff --git a/api/routers/__pycache__/context_analysis.cpython-312.pyc b/api/routers/__pycache__/context_analysis.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f06d99d6a5ac055e8747f3538a50b3a644258571 Binary files /dev/null and b/api/routers/__pycache__/context_analysis.cpython-312.pyc differ diff --git a/api/routers/__pycache__/generate_final_story.cpython-312.pyc b/api/routers/__pycache__/generate_final_story.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f9fbb0389b00abbbd163a888177c5d0971bc6d2 Binary files /dev/null and b/api/routers/__pycache__/generate_final_story.cpython-312.pyc differ diff --git a/api/routers/__pycache__/generate_image.cpython-312.pyc b/api/routers/__pycache__/generate_image.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b665fbbc2707344fef7365dd1c64cb9084e4c57 Binary files /dev/null and b/api/routers/__pycache__/generate_image.cpython-312.pyc differ diff --git a/api/routers/__pycache__/human_idea_refining.cpython-312.pyc b/api/routers/__pycache__/human_idea_refining.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aec8a3f44a36e8b2ef9453dac768633de28e0b14 Binary files /dev/null and b/api/routers/__pycache__/human_idea_refining.cpython-312.pyc differ diff --git a/api/routers/__pycache__/ideation.cpython-312.pyc b/api/routers/__pycache__/ideation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ca315603b39918c66a680d5c3931952b916aa63 Binary files /dev/null and b/api/routers/__pycache__/ideation.cpython-312.pyc differ diff --git a/api/routers/__pycache__/orchestration.cpython-312.pyc b/api/routers/__pycache__/orchestration.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28f9b5255d028617bbacad09525b778601a5a445 Binary files /dev/null and b/api/routers/__pycache__/orchestration.cpython-312.pyc differ diff --git a/src/genai/Research/Brainstroming.ipynb b/src/genai/Research/Brainstroming.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..fa6f150518015cd1fcf3385f8df733e8a94cf9ee --- /dev/null +++ b/src/genai/Research/Brainstroming.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"authorship_tag":"ABX9TyNeN4aha1oDdMsljOuWUsA/"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"widgets":{"application/vnd.jupyter.widget-state+json":{"ad92ee452f07431f990a355cf0b1fd55":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_a08a8d0f5e934acca3fc56be28b5cc15","IPY_MODEL_cb0f95c27acc4578accc9e234cdebb3d","IPY_MODEL_56335e52e20241e4913f6198a7db5b75"],"layout":"IPY_MODEL_3a0ca7cb3bf04a0586507d5fff8d0123"}},"a08a8d0f5e934acca3fc56be28b5cc15":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_69c0502d107f48e089884b270bf3b015","placeholder":"​","style":"IPY_MODEL_0e6af6d183ae42919b1a01ca1a3dbf0b","value":"100%"}},"cb0f95c27acc4578accc9e234cdebb3d":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_2a40b88d70204d2f807a5c1ef168f172","max":2,"min":0,"orientation":"horizontal","style":"IPY_MODEL_ad5f433e9fb243baa4f9b516c57c5ec2","value":2}},"56335e52e20241e4913f6198a7db5b75":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_9ef98b03c696450eaef1116fa0f8e565","placeholder":"​","style":"IPY_MODEL_53c9fd389ce54525b947b1707e053fe0","value":" 2/2 [00:00<00:00, 52.21it/s]"}},"3a0ca7cb3bf04a0586507d5fff8d0123":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"69c0502d107f48e089884b270bf3b015":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"0e6af6d183ae42919b1a01ca1a3dbf0b":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"2a40b88d70204d2f807a5c1ef168f172":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ad5f433e9fb243baa4f9b516c57c5ec2":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"9ef98b03c696450eaef1116fa0f8e565":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"53c9fd389ce54525b947b1707e053fe0":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"11af4e7cdf03451481a67703d3cd4abf":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_caab75c693dd48aaa46e993902a31d69","IPY_MODEL_db16e0ff465e42ce96442fbd2ff2a760","IPY_MODEL_422ad358c8ef4a2d87483b739b4baed0"],"layout":"IPY_MODEL_8cacc5827128460bb00ca3d841d9863e"}},"caab75c693dd48aaa46e993902a31d69":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_37573abde97246a39bd341d17ee2532c","placeholder":"​","style":"IPY_MODEL_bc2231cdb3224b66ac921ead9fd993df","value":"100%"}},"db16e0ff465e42ce96442fbd2ff2a760":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_f43202859ffc4a5ab1cc9bc44a65db00","max":2,"min":0,"orientation":"horizontal","style":"IPY_MODEL_b8b5dfb8d9c04472a6dd88c8277498a9","value":2}},"422ad358c8ef4a2d87483b739b4baed0":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_02518b8d717a456a9edbcb7fc9910645","placeholder":"​","style":"IPY_MODEL_db909ba2a8e14387b0559412946edb7d","value":" 2/2 [00:00<00:00, 63.77it/s]"}},"8cacc5827128460bb00ca3d841d9863e":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"37573abde97246a39bd341d17ee2532c":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"bc2231cdb3224b66ac921ead9fd993df":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"f43202859ffc4a5ab1cc9bc44a65db00":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"b8b5dfb8d9c04472a6dd88c8277498a9":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"02518b8d717a456a9edbcb7fc9910645":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"db909ba2a8e14387b0559412946edb7d":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"54427439a80446b5853871505975c61c":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_ba4cde86ee5b4952ad68231df4a37b07","IPY_MODEL_1f8ac559524b4f89bb51c3d6b4ccda56","IPY_MODEL_0cb30b4d61fb4e328ed2ed70f095d982"],"layout":"IPY_MODEL_aacea2a1566849eeac902b690505511a"}},"ba4cde86ee5b4952ad68231df4a37b07":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_a3143fd6b1ce46439b057bb31bd08c5f","placeholder":"​","style":"IPY_MODEL_bdf97f44aa0a4a93a8b3ca198fb2e1b1","value":"100%"}},"1f8ac559524b4f89bb51c3d6b4ccda56":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_4f19828056004a21813e729d48905aab","max":2,"min":0,"orientation":"horizontal","style":"IPY_MODEL_7c3f05dd8cdf473fb3dfa3a38b81f3e5","value":2}},"0cb30b4d61fb4e328ed2ed70f095d982":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_e6e8c3105aaa48fb8d8b0e15c42ee268","placeholder":"​","style":"IPY_MODEL_cc998f573fd448b3836e2c73af5a1885","value":" 2/2 [00:00<00:00, 66.04it/s]"}},"aacea2a1566849eeac902b690505511a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a3143fd6b1ce46439b057bb31bd08c5f":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"bdf97f44aa0a4a93a8b3ca198fb2e1b1":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"4f19828056004a21813e729d48905aab":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7c3f05dd8cdf473fb3dfa3a38b81f3e5":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"e6e8c3105aaa48fb8d8b0e15c42ee268":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"cc998f573fd448b3836e2c73af5a1885":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"246d04b817aa414ea7ff857119699fe0":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_ef280a3f7d6544258a22d5a585bce896","IPY_MODEL_0a3a8086b68c400fba8831cd6d031308","IPY_MODEL_a89843bb80de447385c49d44c84fef80"],"layout":"IPY_MODEL_dfcfc593ef0a4a67a0071012702f8dc1"}},"ef280a3f7d6544258a22d5a585bce896":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_3b31fba23f174e588c89dcfeb2f0171c","placeholder":"​","style":"IPY_MODEL_01c7986a28a74064b4c06905776df5f4","value":"100%"}},"0a3a8086b68c400fba8831cd6d031308":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_cee481de414544539a90f1c8c36bfbca","max":2,"min":0,"orientation":"horizontal","style":"IPY_MODEL_5210076d91c945f990aaca31c8f10495","value":2}},"a89843bb80de447385c49d44c84fef80":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_3b72ae7ee6b94be5a7dffde24665c210","placeholder":"​","style":"IPY_MODEL_0402f88ffe0b4717af4ff0bd4bb8b8bb","value":" 2/2 [00:00<00:00, 90.46it/s]"}},"dfcfc593ef0a4a67a0071012702f8dc1":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3b31fba23f174e588c89dcfeb2f0171c":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"01c7986a28a74064b4c06905776df5f4":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"cee481de414544539a90f1c8c36bfbca":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"5210076d91c945f990aaca31c8f10495":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"3b72ae7ee6b94be5a7dffde24665c210":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"0402f88ffe0b4717af4ff0bd4bb8b8bb":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"3fdada257f9846979a7b6b3f7c476d2c":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_8ae3dbaf228842fd94a271fcedb25df2","IPY_MODEL_fe1dbbd2c64249d8bbbba0f50679e69b","IPY_MODEL_286f84a6e7354552949359ff44f69b01"],"layout":"IPY_MODEL_9c724fce99c645c08b9c4998c58384d2"}},"8ae3dbaf228842fd94a271fcedb25df2":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_42dec83a0a4c4845997ff643331cef72","placeholder":"​","style":"IPY_MODEL_5dc2b4e9ecf343c99690f88223e6f16f","value":"100%"}},"fe1dbbd2c64249d8bbbba0f50679e69b":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_9baea35cf70f4b269cad5c46c9c25acf","max":2,"min":0,"orientation":"horizontal","style":"IPY_MODEL_07586cebb9f54a8595866db552996117","value":2}},"286f84a6e7354552949359ff44f69b01":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_404d3932d8094419a3a1af18aacee28d","placeholder":"​","style":"IPY_MODEL_671a939f656f408f8c1861273c4e4d61","value":" 2/2 [00:00<00:00, 40.87it/s]"}},"9c724fce99c645c08b9c4998c58384d2":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"42dec83a0a4c4845997ff643331cef72":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"5dc2b4e9ecf343c99690f88223e6f16f":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"9baea35cf70f4b269cad5c46c9c25acf":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"07586cebb9f54a8595866db552996117":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"404d3932d8094419a3a1af18aacee28d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"671a939f656f408f8c1861273c4e4d61":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"ab55ccdd65b84efaa047401f357ad842":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_547cd815673b496790476defdfed4c1b","IPY_MODEL_c91b19d3428b49158a4d9f6f6fb8d3ef","IPY_MODEL_d73d5581e26442bd8dd59c374e706db1"],"layout":"IPY_MODEL_9722ed9c5ba041d6bd92c4b9166fe156"}},"547cd815673b496790476defdfed4c1b":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_f3c43c27b0e2494d937526da394447f1","placeholder":"​","style":"IPY_MODEL_4f07ffb02e224d6988128cda0002145e","value":"100%"}},"c91b19d3428b49158a4d9f6f6fb8d3ef":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_7a40773aca494f878e1a29c48257eca9","max":2,"min":0,"orientation":"horizontal","style":"IPY_MODEL_3b788e14c68e4e54ae347c0759e93def","value":2}},"d73d5581e26442bd8dd59c374e706db1":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_b1d755f17de14bde959735e6f5fffa40","placeholder":"​","style":"IPY_MODEL_d39bc0fa2bdb43ed93bc46d2d854ca68","value":" 2/2 [00:00<00:00, 82.28it/s]"}},"9722ed9c5ba041d6bd92c4b9166fe156":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f3c43c27b0e2494d937526da394447f1":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4f07ffb02e224d6988128cda0002145e":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"7a40773aca494f878e1a29c48257eca9":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3b788e14c68e4e54ae347c0759e93def":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"b1d755f17de14bde959735e6f5fffa40":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d39bc0fa2bdb43ed93bc46d2d854ca68":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}}}}},"cells":[{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"t21KOzPIWp3f","executionInfo":{"status":"ok","timestamp":1747290197875,"user_tz":-345,"elapsed":28831,"user":{"displayName":"subash subash","userId":"16848708090543892284"}},"outputId":"d78021c1-bab2-4c37-f107-84aace9f1c94"},"outputs":[{"output_type":"stream","name":"stdout","text":["Collecting langgraph\n"," Downloading langgraph-0.4.3-py3-none-any.whl.metadata (7.9 kB)\n","Requirement already satisfied: langsmith in /usr/local/lib/python3.11/dist-packages (0.3.42)\n","Collecting langchain_groq\n"," Downloading langchain_groq-0.3.2-py3-none-any.whl.metadata (2.6 kB)\n","Requirement already satisfied: pydantic in /usr/local/lib/python3.11/dist-packages (2.11.4)\n","Requirement already satisfied: datasets in /usr/local/lib/python3.11/dist-packages (2.14.4)\n","Collecting datasets\n"," Downloading datasets-3.6.0-py3-none-any.whl.metadata (19 kB)\n","Collecting faiss-cpu\n"," Downloading faiss_cpu-1.11.0-cp311-cp311-manylinux_2_28_x86_64.whl.metadata (4.8 kB)\n","Requirement already satisfied: langchain-core>=0.1 in /usr/local/lib/python3.11/dist-packages (from langgraph) (0.3.59)\n","Collecting langgraph-checkpoint<3.0.0,>=2.0.10 (from langgraph)\n"," Downloading langgraph_checkpoint-2.0.25-py3-none-any.whl.metadata (4.6 kB)\n","Collecting langgraph-prebuilt>=0.1.8 (from langgraph)\n"," Downloading langgraph_prebuilt-0.1.8-py3-none-any.whl.metadata (5.0 kB)\n","Collecting langgraph-sdk>=0.1.42 (from langgraph)\n"," Downloading langgraph_sdk-0.1.69-py3-none-any.whl.metadata (1.8 kB)\n","Requirement already satisfied: xxhash<4.0.0,>=3.5.0 in /usr/local/lib/python3.11/dist-packages (from langgraph) (3.5.0)\n","Requirement already satisfied: httpx<1,>=0.23.0 in /usr/local/lib/python3.11/dist-packages (from langsmith) (0.28.1)\n","Requirement already satisfied: orjson<4.0.0,>=3.9.14 in /usr/local/lib/python3.11/dist-packages (from langsmith) (3.10.18)\n","Requirement already satisfied: packaging>=23.2 in /usr/local/lib/python3.11/dist-packages (from langsmith) (24.2)\n","Requirement already satisfied: requests<3,>=2 in /usr/local/lib/python3.11/dist-packages (from langsmith) (2.32.3)\n","Requirement already satisfied: requests-toolbelt<2.0.0,>=1.0.0 in /usr/local/lib/python3.11/dist-packages (from langsmith) (1.0.0)\n","Requirement already satisfied: zstandard<0.24.0,>=0.23.0 in /usr/local/lib/python3.11/dist-packages (from langsmith) (0.23.0)\n","Collecting groq<1,>=0.4.1 (from langchain_groq)\n"," Downloading groq-0.24.0-py3-none-any.whl.metadata (15 kB)\n","Requirement already satisfied: annotated-types>=0.6.0 in /usr/local/lib/python3.11/dist-packages (from pydantic) (0.7.0)\n","Requirement already satisfied: pydantic-core==2.33.2 in /usr/local/lib/python3.11/dist-packages (from pydantic) (2.33.2)\n","Requirement already satisfied: typing-extensions>=4.12.2 in /usr/local/lib/python3.11/dist-packages (from pydantic) (4.13.2)\n","Requirement already satisfied: typing-inspection>=0.4.0 in /usr/local/lib/python3.11/dist-packages (from pydantic) (0.4.0)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.11/dist-packages (from datasets) (3.18.0)\n","Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.11/dist-packages (from datasets) (2.0.2)\n","Requirement already satisfied: pyarrow>=15.0.0 in /usr/local/lib/python3.11/dist-packages (from datasets) (18.1.0)\n","Requirement already satisfied: dill<0.3.9,>=0.3.0 in /usr/local/lib/python3.11/dist-packages (from datasets) (0.3.7)\n","Requirement already satisfied: pandas in /usr/local/lib/python3.11/dist-packages (from datasets) (2.2.2)\n","Requirement already satisfied: tqdm>=4.66.3 in /usr/local/lib/python3.11/dist-packages (from datasets) (4.67.1)\n","Requirement already satisfied: multiprocess<0.70.17 in /usr/local/lib/python3.11/dist-packages (from datasets) (0.70.15)\n","Collecting fsspec<=2025.3.0,>=2023.1.0 (from fsspec[http]<=2025.3.0,>=2023.1.0->datasets)\n"," Downloading fsspec-2025.3.0-py3-none-any.whl.metadata (11 kB)\n","Requirement already satisfied: huggingface-hub>=0.24.0 in /usr/local/lib/python3.11/dist-packages (from datasets) (0.31.1)\n","Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.11/dist-packages (from datasets) (6.0.2)\n","Requirement already satisfied: aiohttp!=4.0.0a0,!=4.0.0a1 in /usr/local/lib/python3.11/dist-packages (from fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (3.11.15)\n","Requirement already satisfied: anyio<5,>=3.5.0 in /usr/local/lib/python3.11/dist-packages (from groq<1,>=0.4.1->langchain_groq) (4.9.0)\n","Requirement already satisfied: distro<2,>=1.7.0 in /usr/local/lib/python3.11/dist-packages (from groq<1,>=0.4.1->langchain_groq) (1.9.0)\n","Requirement already satisfied: sniffio in /usr/local/lib/python3.11/dist-packages (from groq<1,>=0.4.1->langchain_groq) (1.3.1)\n","Requirement already satisfied: certifi in /usr/local/lib/python3.11/dist-packages (from httpx<1,>=0.23.0->langsmith) (2025.4.26)\n","Requirement already satisfied: httpcore==1.* in /usr/local/lib/python3.11/dist-packages (from httpx<1,>=0.23.0->langsmith) (1.0.9)\n","Requirement already satisfied: idna in /usr/local/lib/python3.11/dist-packages (from httpx<1,>=0.23.0->langsmith) (3.10)\n","Requirement already satisfied: h11>=0.16 in /usr/local/lib/python3.11/dist-packages (from httpcore==1.*->httpx<1,>=0.23.0->langsmith) (0.16.0)\n","Requirement already satisfied: hf-xet<2.0.0,>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.24.0->datasets) (1.1.0)\n","Requirement already satisfied: tenacity!=8.4.0,<10.0.0,>=8.1.0 in /usr/local/lib/python3.11/dist-packages (from langchain-core>=0.1->langgraph) (9.1.2)\n","Requirement already satisfied: jsonpatch<2.0,>=1.33 in /usr/local/lib/python3.11/dist-packages (from langchain-core>=0.1->langgraph) (1.33)\n","Collecting ormsgpack<2.0.0,>=1.8.0 (from langgraph-checkpoint<3.0.0,>=2.0.10->langgraph)\n"," Downloading ormsgpack-1.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (43 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m43.5/43.5 kB\u001b[0m \u001b[31m1.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2->langsmith) (3.4.2)\n","Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2->langsmith) (2.4.0)\n","Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas->datasets) (2.9.0.post0)\n","Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas->datasets) (2025.2)\n","Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas->datasets) (2025.2)\n","Requirement already satisfied: aiohappyeyeballs>=2.3.0 in /usr/local/lib/python3.11/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (2.6.1)\n","Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.11/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (1.3.2)\n","Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.11/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (25.3.0)\n","Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.11/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (1.6.0)\n","Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.11/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (6.4.3)\n","Requirement already satisfied: propcache>=0.2.0 in /usr/local/lib/python3.11/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (0.3.1)\n","Requirement already satisfied: yarl<2.0,>=1.17.0 in /usr/local/lib/python3.11/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (1.20.0)\n","Requirement already satisfied: jsonpointer>=1.9 in /usr/local/lib/python3.11/dist-packages (from jsonpatch<2.0,>=1.33->langchain-core>=0.1->langgraph) (3.0.0)\n","Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.8.2->pandas->datasets) (1.17.0)\n","Downloading langgraph-0.4.3-py3-none-any.whl (151 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m151.2/151.2 kB\u001b[0m \u001b[31m4.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading langchain_groq-0.3.2-py3-none-any.whl (15 kB)\n","Downloading datasets-3.6.0-py3-none-any.whl (491 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m491.5/491.5 kB\u001b[0m \u001b[31m13.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading faiss_cpu-1.11.0-cp311-cp311-manylinux_2_28_x86_64.whl (31.3 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m31.3/31.3 MB\u001b[0m \u001b[31m30.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading fsspec-2025.3.0-py3-none-any.whl (193 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m193.6/193.6 kB\u001b[0m \u001b[31m10.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading groq-0.24.0-py3-none-any.whl (127 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m127.5/127.5 kB\u001b[0m \u001b[31m5.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading langgraph_checkpoint-2.0.25-py3-none-any.whl (42 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m42.3/42.3 kB\u001b[0m \u001b[31m2.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading langgraph_prebuilt-0.1.8-py3-none-any.whl (25 kB)\n","Downloading langgraph_sdk-0.1.69-py3-none-any.whl (48 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m48.9/48.9 kB\u001b[0m \u001b[31m3.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading ormsgpack-1.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (223 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m223.6/223.6 kB\u001b[0m \u001b[31m10.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hInstalling collected packages: ormsgpack, fsspec, faiss-cpu, langgraph-sdk, groq, datasets, langgraph-checkpoint, langchain_groq, langgraph-prebuilt, langgraph\n"," Attempting uninstall: fsspec\n"," Found existing installation: fsspec 2025.3.2\n"," Uninstalling fsspec-2025.3.2:\n"," Successfully uninstalled fsspec-2025.3.2\n"," Attempting uninstall: datasets\n"," Found existing installation: datasets 2.14.4\n"," Uninstalling datasets-2.14.4:\n"," Successfully uninstalled datasets-2.14.4\n","\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n","torch 2.6.0+cu124 requires nvidia-cublas-cu12==12.4.5.8; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cublas-cu12 12.5.3.2 which is incompatible.\n","torch 2.6.0+cu124 requires nvidia-cuda-cupti-cu12==12.4.127; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cuda-cupti-cu12 12.5.82 which is incompatible.\n","torch 2.6.0+cu124 requires nvidia-cuda-nvrtc-cu12==12.4.127; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cuda-nvrtc-cu12 12.5.82 which is incompatible.\n","torch 2.6.0+cu124 requires nvidia-cuda-runtime-cu12==12.4.127; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cuda-runtime-cu12 12.5.82 which is incompatible.\n","torch 2.6.0+cu124 requires nvidia-cudnn-cu12==9.1.0.70; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cudnn-cu12 9.3.0.75 which is incompatible.\n","torch 2.6.0+cu124 requires nvidia-cufft-cu12==11.2.1.3; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cufft-cu12 11.2.3.61 which is incompatible.\n","torch 2.6.0+cu124 requires nvidia-curand-cu12==10.3.5.147; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-curand-cu12 10.3.6.82 which is incompatible.\n","torch 2.6.0+cu124 requires nvidia-cusolver-cu12==11.6.1.9; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cusolver-cu12 11.6.3.83 which is incompatible.\n","torch 2.6.0+cu124 requires nvidia-cusparse-cu12==12.3.1.170; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-cusparse-cu12 12.5.1.3 which is incompatible.\n","torch 2.6.0+cu124 requires nvidia-nvjitlink-cu12==12.4.127; platform_system == \"Linux\" and platform_machine == \"x86_64\", but you have nvidia-nvjitlink-cu12 12.5.82 which is incompatible.\n","gcsfs 2025.3.2 requires fsspec==2025.3.2, but you have fsspec 2025.3.0 which is incompatible.\u001b[0m\u001b[31m\n","\u001b[0mSuccessfully installed datasets-3.6.0 faiss-cpu-1.11.0 fsspec-2025.3.0 groq-0.24.0 langchain_groq-0.3.2 langgraph-0.4.3 langgraph-checkpoint-2.0.25 langgraph-prebuilt-0.1.8 langgraph-sdk-0.1.69 ormsgpack-1.9.1\n"]}],"source":["!pip install -U langgraph langsmith langchain_groq pydantic datasets faiss-cpu"]},{"cell_type":"code","source":["import pandas as pd\n","from langchain_core.messages import SystemMessage\n","import os\n","from huggingface_hub import login\n","from google.colab import userdata\n","os.environ['GROQ_API_KEY']=userdata.get('groq_api_subash')"],"metadata":{"id":"ft_bDv0bW8Ii"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["from typing import Annotated,Optional\n","\n","from typing_extensions import TypedDict\n","\n","from langgraph.graph import StateGraph, START, END\n","from langgraph.graph.message import add_messages\n","from pydantic import BaseModel,ConfigDict,Field\n","from typing import Optional\n","from datasets import Dataset # Define the search function\n","from sentence_transformers import SentenceTransformer\n","from datasets import load_dataset\n","\n"],"metadata":{"id":"Y7I8kvgTXK5j"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["ST = SentenceTransformer(\"mixedbread-ai/mxbai-embed-large-v1\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"gnatQOigxcim","executionInfo":{"status":"ok","timestamp":1746163998738,"user_tz":-345,"elapsed":5113,"user":{"displayName":"subash subash","userId":"16848708090543892284"}},"outputId":"859f3e1a-1b65-402c-ed70-3836d17db4d2"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.11/dist-packages/huggingface_hub/utils/_auth.py:94: UserWarning: \n","The secret `HF_TOKEN` does not exist in your Colab secrets.\n","To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n","You will be able to reuse this secret in all of your notebooks.\n","Please note that authentication is recommended but still optional to access public models or datasets.\n"," warnings.warn(\n"]}]},{"cell_type":"code","source":["class State(BaseModel):\n"," carry_on: Optional[bool]=False\n"," messages: Optional[str] = None\n"," topic: list\n"," brainstroming_topics: Optional[list] = []\n"," preferred_topics: Optional[list] = []\n"," stories : Optional[list]=[]\n"," final_story: Optional[str]=None\n"," retrievals : Optional[list]=[]\n"," model_config = ConfigDict(arbitrary_types_allowed=True)\n","\n","graph_builder = StateGraph(State)"],"metadata":{"id":"plciNVb4XgJb"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["from langchain_groq import ChatGroq\n","llm = ChatGroq(\n"," model=\"llama3-8b-8192\",\n"," temperature=0,\n"," max_tokens=None,\n"," timeout=None,\n"," max_retries=2,\n","\n",")"],"metadata":{"id":"xWTPCgfsYWMu"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["\n","def retrieve(state: State) -> State:\n"," print('Moving to retrieval process')\n"," retrievals=[]\n"," for topic in state.topic: # Loop through each topic\n"," embedded_query = ST.encode(topic) # Embed each topic\n"," dataset = load_dataset(\"subashdvorak/tiktok-agentic-story\",revision=\"embedded\")\n"," data = dataset[\"train\"].add_faiss_index(\"embeddings\")\n"," scores, retrieved_examples = data.get_nearest_examples(\"embeddings\", embedded_query, k=1)\n","\n"," # Construct a list of dictionaries for this topic\n"," result = [{user: story} for user, story in zip(retrieved_examples['username'], retrieved_examples['agentic_story'])]\n"," retrievals.append(result)\n"," print('Retrieval process completed......')\n"," state.retrievals.append(retrievals)\n","\n"," print('The retrieval is:\\n',state.retrievals )\n"," # return State(messages=\"Retrieved\",topic=state.topic,retrievals=state.retrievals)\n"," return state\n","\n"],"metadata":{"id":"lLvLdFAYg-MB"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["class StoryFormatter(BaseModel):\n"," \"\"\"Always use this tool to structure your response to the user.\"\"\"\n"," story: str=Field(description=\"How to introduce the scene and set the tone. What is happening in the scene? Describe key visuals and actions\")\n"," narration:str=Field(description=\"Suggestions for narration or voiceover that complements the visuals.\" )\n"," text_in_the_Video:str=Field(description=\"Propose important text overlays for key moments.\")\n"," transitions:str=Field(description=\"Smooth transitions between scenes to maintain flow.\")\n"," emotional_tone:str=Field(description=\"The mood and energy of the scenes (e.g., excitement, calm, tension, joy\")\n"," key_visuals:str=Field(description=\"Important props, locations, sound effects, or background music to enhance the video.\")\n","\n","\n","\n","def generate_story(state:State)-> State:\n"," topic=state.topic\n"," print('The state retrieval is:',state.retrievals)\n"," retrieval_list= state.retrievals[-1]\n"," agentic_stories = []\n","\n"," for item in retrieval_list:\n"," print('item:', item[-1].values())\n","\n"," agentic_stories.extend(item[-1].values()) # Add all stories to the list\n","\n"," retrieval = \" \".join(agentic_stories)\n","\n"," if len(state.preferred_topics)==0:\n"," template = f'''I want to create a detailed storyline for a video in any domain. You have to provide me that storyline what to include in the video.\n"," Now, i am giving you the topic of the video. But the need is to generate the story focusing on the format that i'll provide to you.\n"," You can use this format for the reference purpose, not for the exact similar generation. Th format is:\\n{retrieval}.\n"," \\n\\n Now let's start creating the storyline for my topic. The topic of the video is: \\n\\n{state.topic}'''\n"," else:\n"," template = f'''I want to create a detailed storyline for a video in the given topic. You have to provide me that storyline what to include in the video.\n"," Now, i am giving you the topic of the video. But the need is to generate the story focusing on the format that i'll provide to you.\n"," You can use this format for the reference purpose, not for the exact similar generation. The format is:\\n{retrieval}.\n"," \\n\\n Now let's start creating the storyline for my topic. The topic of the video is: \\n\\n{state.topic}\\n\\n\n","\n"," **Final Reminder** You have to strongly focus on these topics while creating the storyline: {state.preferred_topics[-1]}'''\n","\n","\n"," messages = [SystemMessage(content=template)]\n"," response = llm.bind_tools([StoryFormatter]).invoke(messages)\n"," print('The response is:',response)\n"," if hasattr(response, 'tool_calls') and response.tool_calls:\n"," response = response.tool_calls[0]['args']\n"," elif hasattr(response, 'content'):\n"," response = response.content\n"," else:\n"," response = \"No response\"\n"," state.stories.append(response)\n"," # return State(messages=\"Story generated\", topic=state.topic,stories=state.stories)\n"," return state\n"],"metadata":{"id":"uFa9PXusbzET"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["class BrainstromTopicFormatter(BaseModel):\n"," topic1:str=Field(description=\"First brainstorming topic of the story\")\n"," topic2:str=Field(description=\"Second brainstorming topic of the story\")\n"," topic3:str=Field(description=\"Third brainstorming topic of the story\")\n"," topic4:str=Field(description=\"Fourth brainstorming topic of the story\")\n","\n","def generate_brainstroming(state:State)-> State:\n"," story=state.stories[-1]\n","\n"," template= f'''I want to brainstorm ways to diversify or improve a storyline in exactly 4 sentences.\n","The goal is to generate creative and actionable ideas that are not on the storyline on how the storyline can be expanded or modified for better engagement.\n","For example: If the storyline is about creating a promotional video for a restaurant, the new suggestions might include:\n","- I want to showcase the chef preparing a signature dish.\n","- I want to add a sequence of customers sharing their experiences at the restaurant.\n","- I want to highlight the farm-to-table sourcing of ingredients with a short segment showing local farms.\n","- I want to include a time-lapse of the restaurant transforming from day to night, capturing its unique ambiance.\n","- I want to feature a quick interview with the owner sharing the story behind the restaurant.\n","Now, I will provide you with the storyline. The storyline is:\\n{story}'''\n","\n"," messages = [SystemMessage(content=template)]\n"," response = llm.bind_tools([BrainstromTopicFormatter]).invoke(messages)\n"," print('The response is:',response)\n"," if hasattr(response, 'tool_calls') and response.tool_calls:\n"," response = response.tool_calls[0]['args']\n"," elif hasattr(response, 'content'):\n"," response = response.content\n"," else:\n"," response = \"No response\"\n","\n"," state.brainstroming_topics.append(response)\n"," print('The brainstroming topics are:',state.brainstroming_topics)\n"," # return State(messages=\"Story generated\",topic=state.topic,brainstroming_topics=state.brainstroming_topics)\n"," return state\n","\n","\n","\n"],"metadata":{"id":"9wwTIeX3dCn7"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["def select_preferred_topics(state: State)-> State:\n"," print(\"---human_feedback---\")\n","\n"," topic_values = list(state.brainstroming_topics[-1].values())\n","\n"," print(\"Available topics:\")\n"," for idx, topic in enumerate(topic_values, 1):\n"," print(f\"{idx}. {topic}\")\n","\n"," raw_input_str = input(\"Enter the numbers of your preferred topics (comma-separated), or press Enter to skip: \").strip()\n","\n"," if not raw_input_str:\n"," state.carry_on=False\n"," print(\"No topics selected. Ending process.\")\n"," return state\n","\n"," try:\n"," preferred_indices = [int(i.strip()) for i in raw_input_str.split(\",\")]\n"," preferred_topics = [topic_values[i - 1] for i in preferred_indices if 0 < i <= len(topic_values)]\n"," state.preferred_topics.append(preferred_topics)\n"," except Exception:\n"," state.carry_on=False\n"," print(\"Invalid input. Please try again.\")\n"," return state\n","\n"," if not preferred_topics:\n"," state.carry_on=False\n"," print(\"No valid topics selected. Ending process.\")\n"," return state\n","\n"," print(\"You selected:\")\n"," print(preferred_topics)\n"," state.carry_on=True\n"," return state\n"],"metadata":{"id":"kyJMlsUl1jWM"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["def generate_final_story(state:State)-> State:\n"," template = f'''I want to create a detailed storyline for a video in the given topic. You have to provide me that storyline what to include in the video.\n"," Now, i am giving you the topic of the video. But the need is to generate the story focusing on the format that i'll provide to you.\n"," You can use this format for the reference purpose, not for the exact similar generation. The format is:\\n{state.retrievals[-1]}.\n"," \\n\\n Now let's start creating the storyline for my topic. The topic of the video is: \\n\\n{state.topic}\\n\\n\n","\n"," **Final Reminder** You have to strongly focus on these topics while creating the storyline: {[item for sublist in state.preferred_topics for item in sublist]}'''\n"," messages = [SystemMessage(content=template)]\n"," response = llm.bind_tools([StoryFormatter]).invoke(messages)\n"," print('The final response is:',response)\n"," if hasattr(response, 'tool_calls') and response.tool_calls:\n"," response = response.tool_calls[0]['args']\n"," elif hasattr(response, 'content'):\n"," response = response.content\n"," else:\n"," response = \"No response\"\n"," state.final_story=response\n"," state.stories.append(response)\n"," return state\n","\n","\n","\n"],"metadata":{"id":"Q9mIflMnGamx"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# def route_after_selection(output):\n","# _, signal = output\n","# return \"retrieve\" if signal == \"CONTINUE\" else END\n","\n","def route_after_selection(state:State):\n"," print('The output is:',state.carry_on)\n"," return state.carry_on"],"metadata":{"id":"YtaLtPXewCWy"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["graph_builder.add_node(retrieve)\n","graph_builder.add_node(generate_story)\n","graph_builder.add_node(generate_brainstroming)\n","graph_builder.add_node(select_preferred_topics)\n","graph_builder.add_node(generate_final_story)\n","\n","\n","# Normal edges\n","graph_builder.add_edge(START, \"retrieve\")\n","graph_builder.add_edge(\"retrieve\", \"generate_story\")\n","graph_builder.add_edge(\"generate_story\", \"generate_brainstroming\")\n","graph_builder.add_edge(\"generate_brainstroming\", \"select_preferred_topics\")\n","\n","# Conditional edge\n","graph_builder.add_conditional_edges(\"select_preferred_topics\", route_after_selection,{True:'retrieve',False:'generate_final_story'})\n","graph_builder.add_edge(\"generate_final_story\",END)\n","\n","# Compile\n","graph = graph_builder.compile()"],"metadata":{"id":"W1-5WwiIsa8U"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["from IPython.display import Image, display\n","\n","try:\n"," display(Image(graph.get_graph().draw_mermaid_png()))\n","except Exception:\n"," # This requires some extra dependencies and is optional\n"," pass"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":695},"id":"VhXC8vCLwnEc","executionInfo":{"status":"ok","timestamp":1746164004404,"user_tz":-345,"elapsed":126,"user":{"displayName":"subash subash","userId":"16848708090543892284"}},"outputId":"1f08b84c-f1ca-4d46-e1fe-764dd73680e2"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":[""]},"metadata":{}}]},{"cell_type":"code","source":["state = graph.invoke({\"topic\": ['I want to create a promotional video of restaurant.']})"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":761,"referenced_widgets":["3fdada257f9846979a7b6b3f7c476d2c","8ae3dbaf228842fd94a271fcedb25df2","fe1dbbd2c64249d8bbbba0f50679e69b","286f84a6e7354552949359ff44f69b01","9c724fce99c645c08b9c4998c58384d2","42dec83a0a4c4845997ff643331cef72","5dc2b4e9ecf343c99690f88223e6f16f","9baea35cf70f4b269cad5c46c9c25acf","07586cebb9f54a8595866db552996117","404d3932d8094419a3a1af18aacee28d","671a939f656f408f8c1861273c4e4d61","ab55ccdd65b84efaa047401f357ad842","547cd815673b496790476defdfed4c1b","c91b19d3428b49158a4d9f6f6fb8d3ef","d73d5581e26442bd8dd59c374e706db1","9722ed9c5ba041d6bd92c4b9166fe156","f3c43c27b0e2494d937526da394447f1","4f07ffb02e224d6988128cda0002145e","7a40773aca494f878e1a29c48257eca9","3b788e14c68e4e54ae347c0759e93def","b1d755f17de14bde959735e6f5fffa40","d39bc0fa2bdb43ed93bc46d2d854ca68"]},"id":"Kv3FXDyFJB6u","executionInfo":{"status":"ok","timestamp":1746164030595,"user_tz":-345,"elapsed":24584,"user":{"displayName":"subash subash","userId":"16848708090543892284"}},"outputId":"4cd5020f-194d-4e80-defa-25287e1826d7"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Moving to retrieval process\n"]},{"output_type":"display_data","data":{"text/plain":[" 0%| | 0/2 [00:00\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m preferred_topics=[\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mbrainstorming_topics\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'topic1'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mbrainstorming_topics\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'topic3'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m ]\n","\u001b[0;31mNameError\u001b[0m: name 'brainstorming_topics' is not defined"]}]},{"cell_type":"code","source":["retrievals=retrieve(preferred_topics)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":116,"referenced_widgets":["54427439a80446b5853871505975c61c","ba4cde86ee5b4952ad68231df4a37b07","1f8ac559524b4f89bb51c3d6b4ccda56","0cb30b4d61fb4e328ed2ed70f095d982","aacea2a1566849eeac902b690505511a","a3143fd6b1ce46439b057bb31bd08c5f","bdf97f44aa0a4a93a8b3ca198fb2e1b1","4f19828056004a21813e729d48905aab","7c3f05dd8cdf473fb3dfa3a38b81f3e5","e6e8c3105aaa48fb8d8b0e15c42ee268","cc998f573fd448b3836e2c73af5a1885","246d04b817aa414ea7ff857119699fe0","ef280a3f7d6544258a22d5a585bce896","0a3a8086b68c400fba8831cd6d031308","a89843bb80de447385c49d44c84fef80","dfcfc593ef0a4a67a0071012702f8dc1","3b31fba23f174e588c89dcfeb2f0171c","01c7986a28a74064b4c06905776df5f4","cee481de414544539a90f1c8c36bfbca","5210076d91c945f990aaca31c8f10495","3b72ae7ee6b94be5a7dffde24665c210","0402f88ffe0b4717af4ff0bd4bb8b8bb"]},"collapsed":true,"id":"6EgTOO2EYMEN","executionInfo":{"status":"ok","timestamp":1745995216199,"user_tz":-345,"elapsed":2783,"user":{"displayName":"subash subash","userId":"16848708090543892284"}},"outputId":"2e161e9d-90bf-44f9-e74b-bf04399fe0f6"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"text/plain":[" 0%| | 0/2 [00:00{\"story\": \"The video opens with a shot of the restaurant\\'s exterior, showcasing its unique architecture and ambiance. As the camera pans inside, viewers are taken on a behind-the-scenes tour of the kitchen, where chefs are expertly preparing the special dish of the day. The camera captures the sizzling sounds and aromas of the kitchen, highlighting the chefs\\' skills and attention to detail. The video then cuts to a shot of the finished dish, beautifully presented and garnished with fresh herbs. The camera pans out to reveal the restaurant\\'s interior, where customers are enjoying their meals and taking photos to share on social media. The video then transitions to a montage of customers sharing their experiences and photos on social media, using a branded hashtag. The restaurant\\'s social media team is shown responding to comments and engaging with customers, creating a sense of community and interaction. The video ends with a shot of the restaurant\\'s logo and a call-to-action to visit the restaurant and share their own experiences on social media.\", \"narration\": \"The video features a lively and upbeat soundtrack, with a mix of background music and sound effects to enhance the viewing experience. The narration is minimal, with a focus on highlighting the restaurant\\'s unique features and the chefs\\' skills. The voiceover is friendly and inviting, encouraging viewers to visit the restaurant and share their own experiences on social media.\", \"text_in_the_Video\": \"The video includes text overlays to highlight the restaurant\\'s name, address, and social media handles. The branded hashtag is also displayed prominently throughout the video. The text is clean and easy to read, with a modern and sleek design that matches the restaurant\\'s brand identity.\", \"transitions\": \"The video uses a mix of cuts and transitions to move between scenes, creating a fast-paced and engaging viewing experience. The transitions are smooth and seamless, with a focus on highlighting the restaurant\\'s unique features and the chefs\\' skills. The video ends with a shot of the restaurant\\'s logo and a call-to-action to visit the restaurant and share their own experiences on social media.\", \"emotional_tone\": \"The overall tone of the video is lively and inviting, with a focus on showcasing the restaurant\\'s unique features and the chefs\\' skills. The video is designed to make viewers feel hungry and eager to visit the restaurant, while also encouraging them to share their own experiences on social media.\", \"key_visuals\": \"The key visuals in the video include shots of the restaurant\\'s exterior and interior, the kitchen, the chefs, and the finished dish. The video also includes shots of customers enjoying their meals and taking photos to share on social media. The visuals are high-quality and engaging, with a focus on highlighting the restaurant\\'s unique features and the chefs\\' skills.\"}' additional_kwargs={} response_metadata={'token_usage': {'completion_tokens': 563, 'prompt_tokens': 1798, 'total_tokens': 2361, 'completion_time': 0.750666667, 'prompt_time': 0.198111801, 'queue_time': 1.326779075, 'total_time': 0.948778468}, 'model_name': 'llama-3.1-8b-instant', 'system_fingerprint': 'fp_f7bd09b454', 'finish_reason': 'stop', 'logprobs': None} id='run-c6bc7bfd-d83d-464d-b4d7-ba8e518c536d-0' usage_metadata={'input_tokens': 1798, 'output_tokens': 563, 'total_tokens': 2361}\n"]},{"output_type":"error","ename":"IndexError","evalue":"list index out of range","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)","\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mgenerate_story\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mretrievals\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mpreferred_topics\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m","\u001b[0;32m\u001b[0m in \u001b[0;36mgenerate_story\u001b[0;34m(state_retrievals, preferred_topics)\u001b[0m\n\u001b[1;32m 42\u001b[0m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mllm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbind_tools\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mStoryFormatter\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minvoke\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmessages\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'The response of story generator is:\\n'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 44\u001b[0;31m \u001b[0mresponse\u001b[0m\u001b[0;34m=\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtool_calls\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'args'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 45\u001b[0m \u001b[0mstate_stories\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 46\u001b[0m \u001b[0mpreferred_topics\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mIndexError\u001b[0m: list index out of range"]}]},{"cell_type":"code","source":["brainstroming_topics = [{'topic1': \"Showcase a behind-the-scenes look at the restaurant's kitchen, highlighting the chefs' skills and the preparation of the special dish.\",\n"," 'topic2': \"Create a 'day in the life' segment featuring a staff member, showcasing their daily tasks and interactions with customers.\",\n"," 'topic3': 'Develop a social media integration, where customers can share their own experiences and photos at the restaurant, and the restaurant can respond and engage with them.',\n"," 'topic4': \"Include a 'sneak peek' segment, where the restaurant reveals a new dish or promotion, building anticipation and excitement among viewers.\"}]"],"metadata":{"id":"lT95Paprm2T2"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["from langgraph.types import interrupt\n","def human_feedback(state=None):\n"," print(\"---human_feedback---\")\n","\n"," # Use your provided brainstorming_topics list\n"," brainstorming_topics = [{\n"," 'topic1': \"Showcase a behind-the-scenes look at the restaurant's kitchen, highlighting the chefs' skills and the preparation of the special dish.\",\n"," 'topic2': \"Create a 'day in the life' segment featuring a staff member, showcasing their daily tasks and interactions with customers.\",\n"," 'topic3': 'Develop a social media integration, where customers can share their own experiences and photos at the restaurant, and the restaurant can respond and engage with them.',\n"," 'topic4': \"Include a 'sneak peek' segment, where the restaurant reveals a new dish or promotion, building anticipation and excitement among viewers.\"\n"," }]\n","\n"," # Flatten and list the topic strings\n"," topic_dict = brainstorming_topics[0]\n"," topic_keys = list(topic_dict.keys())\n"," topic_values = list(topic_dict.values())\n","\n"," print(\"Available topics:\")\n"," for idx, topic in enumerate(topic_values, 1):\n"," print(f\"{idx}. {topic}\")\n","\n"," # Ask for selection\n"," raw_input = input(\"Enter the numbers of your preferred topics (comma-separated): \")\n","\n"," # Parse and validate\n"," try:\n"," preferred_indices = [int(i.strip()) for i in raw_input.split(\",\")]\n"," preferred_topics = [topic_values[i - 1] for i in preferred_indices if 0 < i <= len(topic_values)]\n"," except Exception:\n"," print(\"Invalid input. Please try again.\")\n"," return human_feedback(state)\n","\n"," print(\"You selected:\")\n"," print(preferred_topics)\n","\n","\n"," return preferred_topics\n"],"metadata":{"id":"SKIMXATFbSuc"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["human_feedback()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"qpEoR_vrnRdu","executionInfo":{"status":"ok","timestamp":1745998667355,"user_tz":-345,"elapsed":3099,"user":{"displayName":"subash subash","userId":"16848708090543892284"}},"outputId":"421b21b6-5e06-4533-bc06-c4ffa8024e62"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["---human_feedback---\n","Available topics:\n","1. Showcase a behind-the-scenes look at the restaurant's kitchen, highlighting the chefs' skills and the preparation of the special dish.\n","2. Create a 'day in the life' segment featuring a staff member, showcasing their daily tasks and interactions with customers.\n","3. Develop a social media integration, where customers can share their own experiences and photos at the restaurant, and the restaurant can respond and engage with them.\n","4. Include a 'sneak peek' segment, where the restaurant reveals a new dish or promotion, building anticipation and excitement among viewers.\n","Enter the numbers of your preferred topics (comma-separated): 1,4\n","You selected:\n","[\"Showcase a behind-the-scenes look at the restaurant's kitchen, highlighting the chefs' skills and the preparation of the special dish.\", \"Include a 'sneak peek' segment, where the restaurant reveals a new dish or promotion, building anticipation and excitement among viewers.\"]\n"]},{"output_type":"execute_result","data":{"text/plain":["[\"Showcase a behind-the-scenes look at the restaurant's kitchen, highlighting the chefs' skills and the preparation of the special dish.\",\n"," \"Include a 'sneak peek' segment, where the restaurant reveals a new dish or promotion, building anticipation and excitement among viewers.\"]"]},"metadata":{},"execution_count":22}]},{"cell_type":"code","source":["def human_feedback(state=None):\n"," print(\"---human_feedback---\")\n","\n"," brainstorming_topics = [{\n"," 'topic1': \"Showcase a behind-the-scenes look at the restaurant's kitchen, highlighting the chefs' skills and the preparation of the special dish.\",\n"," 'topic2': \"Create a 'day in the life' segment featuring a staff member, showcasing their daily tasks and interactions with customers.\",\n"," 'topic3': 'Develop a social media integration, where customers can share their own experiences and photos at the restaurant, and the restaurant can respond and engage with them.',\n"," 'topic4': \"Include a 'sneak peek' segment, where the restaurant reveals a new dish or promotion, building anticipation and excitement among viewers.\"\n"," }]\n","\n"," topic_dict = brainstorming_topics[0]\n"," topic_values = list(topic_dict.values())\n","\n"," print(\"Available topics:\")\n"," for idx, topic in enumerate(topic_values, 1):\n"," print(f\"{idx}. {topic}\")\n","\n"," # Ask for selection\n"," raw_input_str = input(\"Enter the numbers of your preferred topics (comma-separated), or press Enter to skip: \").strip()\n","\n"," # If user pressed Enter with no input, end early\n"," if not raw_input_str:\n"," print(\"No topics selected. Ending process.\")\n"," return None\n","\n"," try:\n"," preferred_indices = [int(i.strip()) for i in raw_input_str.split(\",\")]\n"," preferred_topics = [topic_values[i - 1] for i in preferred_indices if 0 < i <= len(topic_values)]\n"," except Exception:\n"," print(\"Invalid input. Please try again.\")\n"," return human_feedback(state)\n","\n"," if not preferred_topics:\n"," print(\"No valid topics selected. Ending process.\")\n"," return None\n","\n","\n"," return preferred_topics\n"],"metadata":{"id":"rbQd76DKnW2T"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["human_feedback()\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"-hZsPPC9pP5g","executionInfo":{"status":"ok","timestamp":1745998978199,"user_tz":-345,"elapsed":1101,"user":{"displayName":"subash subash","userId":"16848708090543892284"}},"outputId":"df916719-9241-418b-c208-afd1276a473b"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["---human_feedback---\n","Available topics:\n","1. Showcase a behind-the-scenes look at the restaurant's kitchen, highlighting the chefs' skills and the preparation of the special dish.\n","2. Create a 'day in the life' segment featuring a staff member, showcasing their daily tasks and interactions with customers.\n","3. Develop a social media integration, where customers can share their own experiences and photos at the restaurant, and the restaurant can respond and engage with them.\n","4. Include a 'sneak peek' segment, where the restaurant reveals a new dish or promotion, building anticipation and excitement among viewers.\n","Enter the numbers of your preferred topics (comma-separated), or press Enter to skip: \n","No topics selected. Ending process.\n"]}]},{"cell_type":"code","source":[],"metadata":{"id":"P-zEPm5qpQ_a"},"execution_count":null,"outputs":[]}]} \ No newline at end of file diff --git a/src/genai/Research/ideation.ipynb b/src/genai/Research/ideation.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..14f0ed0bc11e290f568d93c95d356604ef56c775 --- /dev/null +++ b/src/genai/Research/ideation.ipynb @@ -0,0 +1,931 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "source": [ + "!pip install langchain langchain_core langgraph langchain_groq langgraph pydantic -U faiss-cpu" + ], + "metadata": { + "id": "9zTQHLHLV8sX", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "1a52e540-04d3-4b47-802e-069c848e30ad" + }, + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Requirement already satisfied: langchain in /usr/local/lib/python3.11/dist-packages (0.3.25)\n", + "Requirement already satisfied: langchain_core in /usr/local/lib/python3.11/dist-packages (0.3.60)\n", + "Collecting langchain_core\n", + " Downloading langchain_core-0.3.62-py3-none-any.whl.metadata (5.8 kB)\n", + "Requirement already satisfied: langgraph in /usr/local/lib/python3.11/dist-packages (0.4.7)\n", + "Requirement already satisfied: langchain_groq in /usr/local/lib/python3.11/dist-packages (0.3.2)\n", + "Requirement already satisfied: pydantic in /usr/local/lib/python3.11/dist-packages (2.11.4)\n", + "Collecting pydantic\n", + " Downloading pydantic-2.11.5-py3-none-any.whl.metadata (67 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m67.2/67.2 kB\u001b[0m \u001b[31m2.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting faiss-cpu\n", + " Downloading faiss_cpu-1.11.0-cp311-cp311-manylinux_2_28_x86_64.whl.metadata (4.8 kB)\n", + "Requirement already satisfied: langchain-text-splitters<1.0.0,>=0.3.8 in /usr/local/lib/python3.11/dist-packages (from langchain) (0.3.8)\n", + "Requirement already satisfied: langsmith<0.4,>=0.1.17 in /usr/local/lib/python3.11/dist-packages (from langchain) (0.3.42)\n", + "Requirement already satisfied: SQLAlchemy<3,>=1.4 in /usr/local/lib/python3.11/dist-packages (from langchain) (2.0.41)\n", + "Requirement already satisfied: requests<3,>=2 in /usr/local/lib/python3.11/dist-packages (from langchain) (2.32.3)\n", + "Requirement already satisfied: PyYAML>=5.3 in /usr/local/lib/python3.11/dist-packages (from langchain) (6.0.2)\n", + "Requirement already satisfied: tenacity!=8.4.0,<10.0.0,>=8.1.0 in /usr/local/lib/python3.11/dist-packages (from langchain_core) (9.1.2)\n", + "Requirement already satisfied: jsonpatch<2.0,>=1.33 in /usr/local/lib/python3.11/dist-packages (from langchain_core) (1.33)\n", + "Requirement already satisfied: packaging<25,>=23.2 in /usr/local/lib/python3.11/dist-packages (from langchain_core) (24.2)\n", + "Requirement already satisfied: typing-extensions>=4.7 in /usr/local/lib/python3.11/dist-packages (from langchain_core) (4.13.2)\n", + "Requirement already satisfied: langgraph-checkpoint>=2.0.26 in /usr/local/lib/python3.11/dist-packages (from langgraph) (2.0.26)\n", + "Requirement already satisfied: langgraph-prebuilt>=0.2.0 in /usr/local/lib/python3.11/dist-packages (from langgraph) (0.2.2)\n", + "Requirement already satisfied: langgraph-sdk>=0.1.42 in /usr/local/lib/python3.11/dist-packages (from langgraph) (0.1.70)\n", + "Requirement already satisfied: xxhash>=3.5.0 in /usr/local/lib/python3.11/dist-packages (from langgraph) (3.5.0)\n", + "Requirement already satisfied: groq<1,>=0.4.1 in /usr/local/lib/python3.11/dist-packages (from langchain_groq) (0.25.0)\n", + "Requirement already satisfied: annotated-types>=0.6.0 in /usr/local/lib/python3.11/dist-packages (from pydantic) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.33.2 in /usr/local/lib/python3.11/dist-packages (from pydantic) (2.33.2)\n", + "Requirement already satisfied: typing-inspection>=0.4.0 in /usr/local/lib/python3.11/dist-packages (from pydantic) (0.4.1)\n", + "Requirement already satisfied: numpy<3.0,>=1.25.0 in /usr/local/lib/python3.11/dist-packages (from faiss-cpu) (2.0.2)\n", + "Requirement already satisfied: anyio<5,>=3.5.0 in /usr/local/lib/python3.11/dist-packages (from groq<1,>=0.4.1->langchain_groq) (4.9.0)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in /usr/local/lib/python3.11/dist-packages (from groq<1,>=0.4.1->langchain_groq) (1.9.0)\n", + "Requirement already satisfied: httpx<1,>=0.23.0 in /usr/local/lib/python3.11/dist-packages (from groq<1,>=0.4.1->langchain_groq) (0.28.1)\n", + "Requirement already satisfied: sniffio in /usr/local/lib/python3.11/dist-packages (from groq<1,>=0.4.1->langchain_groq) (1.3.1)\n", + "Requirement already satisfied: jsonpointer>=1.9 in /usr/local/lib/python3.11/dist-packages (from jsonpatch<2.0,>=1.33->langchain_core) (3.0.0)\n", + "Requirement already satisfied: ormsgpack<2.0.0,>=1.8.0 in /usr/local/lib/python3.11/dist-packages (from langgraph-checkpoint>=2.0.26->langgraph) (1.10.0)\n", + "Requirement already satisfied: orjson>=3.10.1 in /usr/local/lib/python3.11/dist-packages (from langgraph-sdk>=0.1.42->langgraph) (3.10.18)\n", + "Requirement already satisfied: requests-toolbelt<2.0.0,>=1.0.0 in /usr/local/lib/python3.11/dist-packages (from langsmith<0.4,>=0.1.17->langchain) (1.0.0)\n", + "Requirement already satisfied: zstandard<0.24.0,>=0.23.0 in /usr/local/lib/python3.11/dist-packages (from langsmith<0.4,>=0.1.17->langchain) (0.23.0)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2->langchain) (3.4.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2->langchain) (3.10)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2->langchain) (2.4.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2->langchain) (2025.4.26)\n", + "Requirement already satisfied: greenlet>=1 in /usr/local/lib/python3.11/dist-packages (from SQLAlchemy<3,>=1.4->langchain) (3.2.2)\n", + "Requirement already satisfied: httpcore==1.* in /usr/local/lib/python3.11/dist-packages (from httpx<1,>=0.23.0->groq<1,>=0.4.1->langchain_groq) (1.0.9)\n", + "Requirement already satisfied: h11>=0.16 in /usr/local/lib/python3.11/dist-packages (from httpcore==1.*->httpx<1,>=0.23.0->groq<1,>=0.4.1->langchain_groq) (0.16.0)\n", + "Downloading langchain_core-0.3.62-py3-none-any.whl (438 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m438.4/438.4 kB\u001b[0m \u001b[31m11.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading pydantic-2.11.5-py3-none-any.whl (444 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m444.2/444.2 kB\u001b[0m \u001b[31m22.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading faiss_cpu-1.11.0-cp311-cp311-manylinux_2_28_x86_64.whl (31.3 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m31.3/31.3 MB\u001b[0m \u001b[31m25.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hInstalling collected packages: faiss-cpu, pydantic, langchain_core\n", + " Attempting uninstall: pydantic\n", + " Found existing installation: pydantic 2.11.4\n", + " Uninstalling pydantic-2.11.4:\n", + " Successfully uninstalled pydantic-2.11.4\n", + " Attempting uninstall: langchain_core\n", + " Found existing installation: langchain-core 0.3.60\n", + " Uninstalling langchain-core-0.3.60:\n", + " Successfully uninstalled langchain-core-0.3.60\n", + "Successfully installed faiss-cpu-1.11.0 langchain_core-0.3.62 pydantic-2.11.5\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "import os\n", + "import ast\n", + "from pydantic import BaseModel, Field\n", + "from typing import Optional\n", + "import pandas as pd\n", + "from langchain_core.messages import SystemMessage, HumanMessage\n", + "from langgraph.graph import StateGraph, START, END\n", + "from langchain_core.tools import tool\n", + "from sentence_transformers import SentenceTransformer\n", + "import numpy as np\n", + "import faiss\n", + "\n", + "\n", + "from google.colab import userdata\n", + "os.environ['GROQ_API_KEY']=userdata.get('groq_api_subash')\n", + "\n", + "class State(BaseModel):\n", + " topic: str\n", + " business_details: Optional[dict]\n", + " ideator_response: Optional[str] = None\n", + " critic_response: Optional[str]=None\n", + " improver_response: Optional[str]=None\n", + " validator_response: Optional[str]=None\n", + " validator_defense1: Optional[str]=None\n", + " validator_defense2: Optional[str]=None\n", + " validator_defense3: Optional[str]=None\n" + ], + "metadata": { + "id": "7VvhMZXfwatP" + }, + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from langchain_groq import ChatGroq\n", + "from langgraph.prebuilt import create_react_agent\n", + "\n", + "llm = ChatGroq(\n", + " model=\"llama3-8b-8192\",\n", + " temperature=0.3,\n", + " max_tokens=500,\n", + "\n", + ")\n", + "\n", + "ideator_llm = llm\n", + "critic_llm = llm\n", + "improver_llm = llm\n", + "validator_llm = llm\n" + ], + "metadata": { + "id": "4RXVmUFG8Osd" + }, + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "\n", + "ST = SentenceTransformer('mixedbread-ai/mxbai-embed-large-v1')\n", + "class QueryFormatter(BaseModel):\n", + " video_topic: str = Field(description=\"The video topic that user passes to the agent\")\n", + "\n", + "@tool(\"influencer's data-retrieval-tool\", args_schema=QueryFormatter, return_direct=False,description=\"Retrieve influencer-related data for a given query.\")\n", + "def retrieve_tool(video_topic):\n", + " '''\n", + " Always invoke this tool.\n", + " Retrieve influencer's data by semantic search of **video topic**.\n", + " '''\n", + " # === Load CSV ===\n", + " csv_path = 'extracted_data.csv'\n", + " df = pd.read_csv(csv_path)\n", + "\n", + " # === Parse stored embeddings ===\n", + " df['embeddings'] = df['embeddings'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else x)\n", + " embeddings = np.vstack(df['embeddings'].values).astype('float32')\n", + "\n", + " # === Build FAISS index ===\n", + " dimension = embeddings.shape[1]\n", + " index = faiss.IndexFlatL2(dimension)\n", + " index.add(embeddings)\n", + "\n", + " # === Load SentenceTransformer model ===\n", + "\n", + " # === Encode the query and search ===\n", + " query_embedding = ST.encode(str(video_topic)).reshape(1, -1).astype('float32')\n", + " top_k=7\n", + " distances, indices = index.search(query_embedding, top_k)\n", + "\n", + "\n", + "\n", + " # === Format results ===\n", + " outer_list = []\n", + " for i, idx in enumerate(indices[0]):\n", + " res = {\n", + " 'rank': i + 1,\n", + " 'username': df.iloc[idx]['username'],\n", + " 'story': df.iloc[idx]['story'],\n", + " 'visible_text_or_brandings': df.iloc[idx]['story'],\n", + " 'likesCount': df.iloc[idx]['likesCount'],\n", + " 'commentCount': df.iloc[idx]['commentCount'],\n", + " }\n", + "\n", + " inner_list = []\n", + " inner_list.append(f\"[{res['rank']}]. The influencer name is: **{res['username']}** — Likes: **{res['likesCount']}**, Comments: **{res['commentCount']}**\")\n", + " inner_list.append(f\"The story of that particular video is:\\n{res['story']}\")\n", + " inner_list.append(f\"The branding or promotion done is:\\n{res['visible_text_or_brandings']}\")\n", + "\n", + " outer_list.append(inner_list)\n", + "\n", + " return str(outer_list)\n", + "\n", + "# retrieve_tool('I want to promote my restaurant')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "AH3YslAR6doR", + "outputId": "c50bdc94-c153-40e7-ae8b-b2c1a8f329e0" + }, + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.11/dist-packages/huggingface_hub/utils/_auth.py:94: UserWarning: \n", + "The secret `HF_TOKEN` does not exist in your Colab secrets.\n", + "To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n", + "You will be able to reuse this secret in all of your notebooks.\n", + "Please note that authentication is recommended but still optional to access public models or datasets.\n", + " warnings.warn(\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "\n", + "def ideator(state:State):\n", + " tools=[retrieve_tool]\n", + " react_agent=create_react_agent(\n", + " model=llm,\n", + " tools=tools\n", + " )\n", + " template = f'''\n", + " You are an expert video content strategist who generates the storyline of a video in exactly 300 words..\n", + "\n", + "Your task is to generate a **detailed and creative storyline** for a promotional video on the **given topic**. The storyline should be structured, engaging, and highly relevant to the following **business details**.\n", + "Another important thing is that you have to give the response focusing on the response of the tool provided to you. The tool contains the video stories and contents created by the influencers.\n", + "Use that responses of tool for your reference. You can use your creativity but inside the boundary of tool's response.\n", + "\n", + "---\n", + "\n", + " **Video Topic**:\n", + "{state.topic}\n", + "\n", + "**Business Details**:\n", + "{state.business_details}\n", + "\n", + "\n", + "\n", + "---\n", + "\n", + "**Important Instructions**:\n", + "- Creatively connect the image cues to make the storyline compelling. (If provided).\n", + "- Structure the storyline logically (e.g., beginning, middle, end), showing what scenes or visuals to include.\n", + "- Match the tone and depth to the business type (e.g., fun, luxurious, emotional, professional).\n", + "\n", + "Now, generate the final storyline for the video topic..\n", + " '''\n", + " messages = [SystemMessage(content=template),\n", + " HumanMessage(content=f'''The topic of the video is:\\n{state.topic}\\n''')]\n", + "\n", + " response = react_agent.invoke({'messages':messages})\n", + " response = response['messages'][-1].content\n", + " state.ideator_response = response\n", + " print('Ideator Generated the story')\n", + " return state\n", + "\n", + "\n", + "\n" + ], + "metadata": { + "id": "xIrE3FV03nQz" + }, + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def critic(state:State):\n", + " tools=[retrieve_tool]\n", + " react_agent=create_react_agent(\n", + " model=llm,\n", + " tools=tools\n", + " )\n", + " critic_template = f'''\n", + " You are an expert evaluator and suggestion recommender. Your role is to carefully read the story generated by the Ideator and assess it based on the given video topic, business details, and the tool's response.\n", + "\n", + " Your task is to **critically evaluate** the storyline of a promotional video provided below from ideator. The storyline was generated based on a given video topic and business details. Additionally, the tool's response contains existing influencer-style stories or content for reference, which you must **closely consider** to guide your evaluation.\n", + "\n", + " ---\n", + "\n", + " **Video Topic**:\n", + " {state.topic}\n", + "\n", + " **Business Details**:\n", + " {state.business_details}\n", + "\n", + " **Generated Storyline from ideator**:\n", + " {state.ideator_response}\n", + "\n", + "\n", + " ---\n", + "\n", + " **Your Task as the Critic**:\n", + "\n", + " 1. **Evaluate the Storyline**: Analyze the structure, creativity, tone, and alignment with the business type and audience.\n", + " 2. **Compare with Tool's Response**: Ensure the storyline stays within the creative boundaries and tone of the influencer-style content in the tool response.\n", + " 3. **Identify Weaknesses**: Point out inconsistencies, missing elements, weak hooks, structural flaws, or areas lacking emotional or persuasive power.\n", + " 4. **Suggest Improvements**: Provide clear, actionable suggestions to improve the storyline.\n", + "\n", + " **Output**:\n", + " You have to just suggest the improvements in your output in around 100 words only.\n", + " '''\n", + "\n", + " messages = [SystemMessage(content=critic_template),\n", + " HumanMessage(content=f'''The topic of the video is:\\n{state.topic}\\n. The business_details is\\n{state.business_details}\\n''')]\n", + "\n", + " response = react_agent.invoke({'messages':messages})\n", + " response = response['messages'][-1].content\n", + " state.critic_response = response\n", + " print('Critic Evaluated the story')\n", + "\n", + " return state\n" + ], + "metadata": { + "id": "OKRJsG0J_a5t" + }, + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def improver(state:State):\n", + " react_agent=create_react_agent(\n", + " model=llm,\n", + " tools=[]\n", + " )\n", + " improver_template = f'''\n", + " You are a professional video content editor and creative storyteller. Your job is to improve the storyline originally generated by the Ideator using the detailed feedback provided by the Critic.\n", + "\n", + " The story was written for a promotional video based on a specific topic and business context. You must revise it while staying aligned with the given business needs and creative direction. The improvement suggestions come from a Critic who has evaluated the structure, tone, creativity, and alignment of the original story.\n", + "\n", + " ---\n", + "\n", + " **Video Topic**:\n", + " {state.topic}\n", + "\n", + " **Business Details**:\n", + " {state.business_details}\n", + "\n", + " **Original Storyline from Ideator**:\n", + " {state.ideator_response}\n", + "\n", + " **Critic's Suggestions for Improvement**:\n", + " {state.critic_response}\n", + "\n", + " ---\n", + "\n", + " **Your Task**:\n", + "\n", + " - Carefully read the original story and the critic’s suggestions.\n", + " - Revise and enhance the storyline, correcting flaws and adding the suggested improvements.\n", + " - Keep the tone, structure, and message appropriate to the business type and the influencer-style content.\n", + " - Make sure the final story is structured, compelling, and exactly **300 words** in length.\n", + "\n", + " Now, generate the **final improved storyline** for the video.\n", + " '''\n", + "\n", + "\n", + " messages = [SystemMessage(content=improver_template),\n", + " HumanMessage(content=f'''The topic of the video is:\\n{state.topic}\\n The business_details is:\\n{state.business_details}''')]\n", + "\n", + " response = react_agent.invoke({'messages':messages})\n", + " response = response['messages'][-1].content\n", + " state.improver_response = response\n", + " print('Improver Improvred the story')\n", + "\n", + " return state\n" + ], + "metadata": { + "id": "fq0JPkrZCJj-" + }, + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "class ValidationFormatter(BaseModel):\n", + " result: str = Field(description=\"Returns **validated** if the story is validated. Returns **not validated** if story is not validated.\")\n", + "\n", + "def validator(state:State):\n", + " tools=[retrieve_tool]\n", + "\n", + " react_agent=create_react_agent(\n", + " model=llm,\n", + " tools=tools,\n", + " # response_format=ValidationFormatter\n", + " )\n", + " validator_template = f'''\n", + " You are a strict and unbiased judge responsible for evaluating whether a promotional video storyline is ready for publishing.\n", + "\n", + " You will be given the video topic, business details, and the final version of the storyline (after improvement). Your task is to assess if this storyline meets all necessary standards in terms of:\n", + "\n", + " - Relevance to the video topic\n", + " - Alignment with the business context\n", + " - Logical structure (beginning, middle, end)\n", + " - Tone matching the business type\n", + " - Creativity and clarity\n", + "\n", + " You can also use the tool's response as your reference to make the validation. The tool's response includes existing influencer-style stories or content for reference.\n", + "\n", + " ---\n", + "\n", + "\n", + " **Video Topic**:\n", + " {state.topic}\n", + "\n", + " **Business Details**:\n", + " {state.business_details}\n", + "\n", + " **Final Storyline from Improver**:\n", + " {state.improver_response}\n", + "\n", + " ---\n", + "\n", + " **Validation Criteria**:\n", + "\n", + " - Is the story **fully aligned** with the topic, business details and the tool's response?\n", + " - Does the structure flow logically and effectively?\n", + " - Does it feel complete and professional to use this story to create a video?\n", + "\n", + " ---\n", + "\n", + " **Output Instruction**:\n", + " Respond strictly just with one of the following values:\n", + "\n", + " - `validated` – if the story meets all the criteria and is validated.\n", + " - `not validated` – if it fails to meet any key criteria and needs further improvement.\n", + " '''\n", + "\n", + "\n", + "\n", + " messages = [SystemMessage(content=validator_template),\n", + " HumanMessage(content=f'''The topic of the video is:\\n{state.topic}\\n The business_details is:\\n{state.business_details}''')]\n", + "\n", + " response = llm.with_structured_output(ValidationFormatter).invoke(messages)\n", + " print('Validator response:',response)\n", + " state.validator_response = response.result\n", + " return state" + ], + "metadata": { + "id": "LfgWPNJUFOf7" + }, + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def validator_defense1(state:State):\n", + " tools=[retrieve_tool]\n", + "\n", + " react_agent=create_react_agent(\n", + " model=llm,\n", + " tools=tools,\n", + " # response_format=ValidationFormatter\n", + " )\n", + " validator_template = f'''\n", + " You are a strict and unbiased judge responsible for evaluating whether a promotional video storyline is ready for publishing.\n", + "\n", + " You will be given the video topic, business details, and the final version of the storyline (after improvement). Your task is to assess if this storyline meets all necessary standards in terms of:\n", + "\n", + " - Relevance to the video topic\n", + " - Alignment with the business context\n", + " - Logical structure (beginning, middle, end)\n", + " - Tone matching the business type\n", + " - Creativity and clarity\n", + "\n", + " You can also use the tool's response as your reference to make the validation. The tool's response includes existing influencer-style stories or content for reference.\n", + "\n", + " ---\n", + "\n", + "\n", + " **Video Topic**:\n", + " {state.topic}\n", + "\n", + " **Business Details**:\n", + " {state.business_details}\n", + "\n", + " **Final Storyline from Improver**:\n", + " {state.improver_response}\n", + "\n", + " ---\n", + "\n", + " **Validation Criteria**:\n", + "\n", + " - Is the story **fully aligned** with the topic, business details and the tool's response?\n", + " - Does the structure flow logically and effectively?\n", + " - Does it feel complete and professional to use this story to create a video?\n", + "\n", + " ---\n", + "\n", + " **Output Instruction**:\n", + " Respond strictly just with one of the following values:\n", + "\n", + " - `validated` – if the story meets all the criteria and is validated.\n", + " - `not validated` – if it fails to meet any key criteria and needs further improvement.\n", + " '''\n", + "\n", + "\n", + "\n", + " messages = [SystemMessage(content=validator_template),\n", + " HumanMessage(content=f'''The topic of the video is:\\n{state.topic}\\n The business_details is:\\n{state.business_details}''')]\n", + "\n", + " response = llm.with_structured_output(ValidationFormatter).invoke(messages)\n", + " print('Validator defense 1 response:',response)\n", + " state.validator_defense1 = response.result\n", + " return state\n", + "\n", + "\n", + "def validator_defense2(state:State):\n", + " tools=[retrieve_tool]\n", + "\n", + " react_agent=create_react_agent(\n", + " model=llm,\n", + " tools=tools,\n", + " # response_format=ValidationFormatter\n", + " )\n", + " validator_template = f'''\n", + " You are a strict and unbiased judge responsible for evaluating whether a promotional video storyline is ready for publishing.\n", + "\n", + " You will be given the video topic, business details, and the final version of the storyline (after improvement). Your task is to assess if this storyline meets all necessary standards in terms of:\n", + "\n", + " - Relevance to the video topic\n", + " - Alignment with the business context\n", + " - Logical structure (beginning, middle, end)\n", + " - Tone matching the business type\n", + " - Creativity and clarity\n", + "\n", + " You can also use the tool's response as your reference to make the validation. The tool's response includes existing influencer-style stories or content for reference.\n", + "\n", + " ---\n", + "\n", + "\n", + " **Video Topic**:\n", + " {state.topic}\n", + "\n", + " **Business Details**:\n", + " {state.business_details}\n", + "\n", + " **Final Storyline from Improver**:\n", + " {state.improver_response}\n", + "\n", + " ---\n", + "\n", + " **Validation Criteria**:\n", + "\n", + " - Is the story **fully aligned** with the topic, business details and the tool's response?\n", + " - Does the structure flow logically and effectively?\n", + " - Does it feel complete and professional to use this story to create a video?\n", + "\n", + " ---\n", + "\n", + " **Output Instruction**:\n", + " Respond strictly just with one of the following values:\n", + "\n", + " - `validated` – if the story meets all the criteria and is validated.\n", + " - `not validated` – if it fails to meet any key criteria and needs further improvement.\n", + " '''\n", + "\n", + "\n", + "\n", + " messages = [SystemMessage(content=validator_template),\n", + " HumanMessage(content=f'''The topic of the video is:\\n{state.topic}\\n The business_details is:\\n{state.business_details}''')]\n", + "\n", + " response = llm.with_structured_output(ValidationFormatter).invoke(messages)\n", + " print('Validator defense 2 response:',response)\n", + " state.validator_defense2 = response.result\n", + " return state\n", + "\n", + "\n", + "def validator_defense3(state:State):\n", + " tools=[retrieve_tool]\n", + "\n", + " react_agent=create_react_agent(\n", + " model=llm,\n", + " tools=tools,\n", + " # response_format=ValidationFormatter\n", + " )\n", + " validator_template = f'''\n", + " You are a strict and unbiased judge responsible for evaluating whether a promotional video storyline is ready for publishing.\n", + "\n", + " You will be given the video topic, business details, and the final version of the storyline (after improvement). Your task is to assess if this storyline meets all necessary standards in terms of:\n", + "\n", + " - Relevance to the video topic\n", + " - Alignment with the business context\n", + " - Logical structure (beginning, middle, end)\n", + " - Tone matching the business type\n", + " - Creativity and clarity\n", + "\n", + " You can also use the tool's response as your reference to make the validation. The tool's response includes existing influencer-style stories or content for reference.\n", + "\n", + " ---\n", + "\n", + "\n", + " **Video Topic**:\n", + " {state.topic}\n", + "\n", + " **Business Details**:\n", + " {state.business_details}\n", + "\n", + " **Final Storyline from Improver**:\n", + " {state.improver_response}\n", + "\n", + " ---\n", + "\n", + " **Validation Criteria**:\n", + "\n", + " - Is the story **fully aligned** with the topic, business details and the tool's response?\n", + " - Does the structure flow logically and effectively?\n", + " - Does it feel complete and professional to use this story to create a video?\n", + "\n", + " ---\n", + "\n", + " **Output Instruction**:\n", + " Respond strictly just with one of the following values:\n", + "\n", + " - `validated` – if the story meets all the criteria and is validated.\n", + " - `not validated` – if it fails to meet any key criteria and needs further improvement.\n", + " '''\n", + "\n", + "\n", + "\n", + " messages = [SystemMessage(content=validator_template),\n", + " HumanMessage(content=f'''The topic of the video is:\\n{state.topic}\\n The business_details is:\\n{state.business_details}''')]\n", + "\n", + " response = llm.with_structured_output(ValidationFormatter).invoke(messages)\n", + " print('Validator defense 3 response:',response)\n", + " state.validator_defense3 = response.result\n", + " return state" + ], + "metadata": { + "id": "WFEYu06yrPre" + }, + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "def route1_after_validation(state:State):\n", + " if 'not validated' in state.validator_response:\n", + " return False\n", + " else:\n", + " return True\n", + "\n", + "def route2_after_validation(state:State):\n", + " if 'not validated' in state.validator_defense1:\n", + " return False\n", + " else:\n", + " return True\n", + "def route3_after_validation(state:State):\n", + " if 'not validated' in state.validator_defense2:\n", + " return False\n", + " else:\n", + " return True\n", + "def route4_after_validation(state:State):\n", + " if 'not validated' in state.validator_defense3:\n", + " return False\n", + " else:\n", + " return True" + ], + "metadata": { + "id": "ThZLEFFxjKwE" + }, + "execution_count": 9, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "graph_builder= StateGraph(State)\n", + "graph_builder.add_node(ideator)\n", + "graph_builder.add_node(critic)\n", + "graph_builder.add_node(improver)\n", + "graph_builder.add_node(validator)\n", + "graph_builder.add_node(validator_defense1)\n", + "graph_builder.add_node(validator_defense2)\n", + "graph_builder.add_node(validator_defense3)\n", + "\n", + "\n", + "graph_builder.add_edge(START, \"ideator\") # Start the graph with node_1\n", + "graph_builder.add_edge(\"ideator\", \"critic\")\n", + "graph_builder.add_edge(\"critic\", \"improver\")\n", + "graph_builder.add_edge(\"improver\", \"validator\")\n", + "graph_builder.add_edge(\"validator\", \"validator_defense1\")\n", + "graph_builder.add_edge(\"validator_defense1\", \"validator_defense2\")\n", + "graph_builder.add_edge(\"validator_defense2\", \"validator_defense3\")\n", + "graph_builder.add_edge(\"validator_defense3\", END)\n", + "\n", + "# Use conditional routing from validator\n", + "graph_builder.add_conditional_edges(\"validator\", route1_after_validation,{False:'ideator',True:validator_defense1})\n", + "graph_builder.add_conditional_edges(\"validator_defense1\", route2_after_validation,{False:'ideator',True:validator_defense2})\n", + "graph_builder.add_conditional_edges(\"validator_defense2\", route3_after_validation,{False:'ideator',True:validator_defense3})\n", + "graph_builder.add_conditional_edges(\"validator_defense3\", route4_after_validation,{False:'ideator',True:END})\n", + "\n", + "graph = graph_builder.compile()\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 332 + }, + "id": "-kZyUySjLHDN", + "outputId": "37026fc3-6925-4256-9a87-6d8d64f4f971" + }, + "execution_count": 10, + "outputs": [ + { + "output_type": "error", + "ename": "ValueError", + "evalue": "'validator_defense1' is already being used as a state key", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mgraph_builder\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_node\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimprover\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mgraph_builder\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_node\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalidator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mgraph_builder\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_node\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalidator_defense1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0mgraph_builder\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_node\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalidator_defense2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mgraph_builder\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_node\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalidator_defense3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.11/dist-packages/langgraph/graph/state.py\u001b[0m in \u001b[0;36madd_node\u001b[0;34m(self, node, action, defer, metadata, input, retry, cache_policy, destinations)\u001b[0m\n\u001b[1;32m 358\u001b[0m )\n\u001b[1;32m 359\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnode\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchannels\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 360\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"'{node}' is already being used as a state key\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 361\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompiled\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 362\u001b[0m logger.warning(\n", + "\u001b[0;31mValueError\u001b[0m: 'validator_defense1' is already being used as a state key" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from IPython.display import Image, display\n", + "\n", + "try:\n", + " display(Image(graph.get_graph().draw_mermaid_png()))\n", + "except Exception:\n", + " # This requires some extra dependencies and is optional\n", + " pass" + ], + "metadata": { + "id": "aLblIS1cnRLT" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "state = graph.invoke({\"topic\": \"I want to promote my restaurant in lakeside\",\n", + " \"business_details\": {\"business_type\": \"restaurant\", \"platform\": \"instagram\", \"target_audience\": \"youths\", \"business_goals\": \"to go global\", \"offerings\": \"nepali foods\", \"Challenges_faced\": \"finding new customers, attracting large customers\"}\n", + " })" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "csSPO6MwMNoM", + "outputId": "33fb1b07-c154-4ecd-ab27-f9a2fd7b395c" + }, + "execution_count": 18, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Ideator Generated the story\n", + "Critic Evaluated the story\n", + "Improver Improvred the story\n", + "Validator response: result='validated'\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "state['validator_response']" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "id": "kriV_zErMvGf", + "outputId": "a247c871-9e05-4f4b-b670-08cc6a938638" + }, + "execution_count": 22, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'validated'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 22 + } + ] + }, + { + "cell_type": "code", + "source": [ + "state['improver_response']" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 122 + }, + "id": "E2onpug1S7sU", + "outputId": "eb43ce63-1e68-40fa-8956-75f795bc8ce8" + }, + "execution_count": 19, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'Here is the revised storyline for the promotional video:\\n\\n**Title:** \"Experience the Flavors of Nepal at [Your Restaurant Name] in Lakeside\"\\n\\n**Scene 1:** (0:00 - 0:30)\\n\\n* Opening shot of a stunning visual of the restaurant\\'s exterior, with a warm and inviting glow emanating from the windows.\\n* Voiceover: \"Imagine a place where the beauty of Lakeside meets the flavors of Nepal. Welcome to [Your Restaurant Name], where every bite is a journey to the Himalayas.\"\\n\\n**Scene 2:** (0:30 - 1:00)\\n\\n* Cut to a shot of a group of friends laughing and chatting while enjoying their meals at the restaurant.\\n* Voiceover: \"Our restaurant is more than just a place to eat - it\\'s a gathering spot for friends and family to share in the joy of good food and good company.\"\\n\\n**Scene 3:** (1:00 - 1:30)\\n\\n* Cut to a shot of the restaurant\\'s chefs preparing traditional Nepali dishes, with close-ups of the sizzling pans and aromatic spices.\\n* Voiceover: \"Our chefs use only the freshest ingredients to create authentic Nepali dishes that will tantalize your taste buds.\"\\n\\n**Scene 4:** (1:30 - 2:00)\\n\\n* Cut to a shot of a customer taking a bite of a Nepali dish, with a look of delight on their face.\\n* Voiceover: \"From our signature momos to our slow-cooked curries, every bite is a taste sensation that will leave you wanting more.\"\\n\\n**Scene 5:** (2:00 - 2:30)\\n\\n* Cut to a shot of the restaurant\\'s outdoor seating area, with customers enjoying their meals while taking in the stunning views of the lake.\\n* Voiceover: \"And when the weather permits, our outdoor seating area is the perfect spot to enjoy your meal while taking in the breathtaking views of the lake.\"\\n\\n**Scene 6:** (2:30 - 3:00)\\n\\n* Closing shot of the restaurant\\'s exterior at sunset, with the sound of the lake lapping in the background.\\n* Voiceover: \"So why wait? Come and experience the best of Nepali cuisine at [Your Restaurant Name]. Book your table now and taste the magic of Nepal in Lakeside!\"\\n\\nThis revised storyline incorporates the critic\\'s suggestions, including a more attention-grabbing opening, emotional connections with the target audience,'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 19 + } + ] + }, + { + "cell_type": "code", + "source": [ + "state['critic_response']\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 105 + }, + "id": "SSsXuklMTJlJ", + "outputId": "5b21bb65-2ec6-4d97-ebde-9b58d0b550e0" + }, + "execution_count": 13, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "\"Based on the generated storyline, I would suggest the following improvements:\\n\\n* The storyline is quite generic and doesn't specifically highlight the unique aspects of the restaurant or its offerings. Consider incorporating more specific details about the restaurant's menu, ambiance, or staff to make it more engaging.\\n* The storyline focuses more on the influencer's experience rather than the restaurant itself. Consider shifting the focus to the restaurant and its offerings to make it more relevant to the target audience.\\n* The storyline could benefit from a clearer call-to-action (CTA) to encourage viewers to take action, such as visiting the restaurant or trying out a specific dish.\\n\\nOverall, the storyline has potential but could be improved by incorporating more specific details about the restaurant and its offerings, and by shifting the focus to the restaurant itself rather than the influencer's experience.\"" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 13 + } + ] + }, + { + "cell_type": "code", + "source": [ + "state['ideator_response']\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 122 + }, + "id": "s9Q8O_pRTPvI", + "outputId": "9863e2c7-9b84-4862-e62c-db1ab968d4b0" + }, + "execution_count": 14, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'Here is a detailed and creative storyline for a promotional video on your restaurant:\\n\\n**Title:** \"A Taste of Nepal: Discover the Flavors of Home\"\\n\\n**Scene 1:** (0:00 - 0:30)\\n\\n* Opening shot of a bustling street in Kathmandu, Nepal, with the sound of traditional Nepali music playing in the background.\\n* Cut to a shot of your restaurant\\'s exterior, with a sign that reads \"Nepali Food\" in bold letters.\\n* The camera pans inside the restaurant, showing the cozy and inviting atmosphere.\\n\\n**Scene 2:** (0:30 - 1:00)\\n\\n* Cut to a shot of a group of friends gathered around a table, enjoying a meal together.\\n* The camera zooms in on the dishes they\\'re eating, showcasing the variety of Nepali cuisine your restaurant offers.\\n* The friends are laughing and chatting, enjoying each other\\'s company.\\n\\n**Scene 3:** (1:00 - 1:30)\\n\\n* Cut to a shot of the chef, expertly preparing a traditional Nepali dish in the kitchen.\\n* The camera shows the sizzling sounds and aromas of the cooking process, making the viewer\\'s mouth water.\\n* The chef is smiling and chatting with the camera, giving a glimpse into the passion and dedication that goes into preparing each dish.\\n\\n**Scene 4:** (1:30 - 2:00)\\n\\n* Cut to a shot of a customer taking a bite of a dish, with a look of delight on their face.\\n* The camera cuts to a shot of the restaurant\\'s menu, highlighting the variety of options available.\\n* The narrator speaks, \"At [Your Restaurant Name], we\\'re passionate about sharing the flavors of Nepal with our customers. From spicy curries to tender momos, every dish is a taste of home.\"\\n\\n**Scene 5:** (2:00 - 2:30)\\n\\n* Cut to a shot of the restaurant\\'s exterior at night, with twinkling lights and a lively atmosphere.\\n* The camera pans inside, showing the restaurant filled with happy customers and the sound of laughter and chatter.\\n* The narrator speaks, \"So why not join us for a taste of Nepal? Book your table now and experience the warmth and hospitality of our restaurant.\"\\n\\n**Scene 6:** (2:30 - 3:00)\\n\\n* Closing shot of the restaurant\\'s logo and contact information on the screen.\\n* The narrator speaks, \"Nep'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 14 + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "ONa-okqQTbi6" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/src/genai/Research/pandas_agent.ipynb b/src/genai/Research/pandas_agent.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..87c49456c2a860b33371806f95475893e487074b --- /dev/null +++ b/src/genai/Research/pandas_agent.ipynb @@ -0,0 +1,1141 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DhLp-vDTjInB", + "outputId": "d40b1ff3-1fca-4dab-fb76-25a66abdce2d" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Collecting langchain_openai\n", + " Downloading langchain_openai-0.3.28-py3-none-any.whl.metadata (2.3 kB)\n", + "Requirement already satisfied: pydantic in /usr/local/lib/python3.11/dist-packages (2.11.7)\n", + "Requirement already satisfied: langchain-core<1.0.0,>=0.3.68 in /usr/local/lib/python3.11/dist-packages (from langchain_openai) (0.3.70)\n", + "Requirement already satisfied: openai<2.0.0,>=1.86.0 in /usr/local/lib/python3.11/dist-packages (from langchain_openai) (1.97.0)\n", + "Requirement already satisfied: tiktoken<1,>=0.7 in /usr/local/lib/python3.11/dist-packages (from langchain_openai) (0.9.0)\n", + "Requirement already satisfied: annotated-types>=0.6.0 in /usr/local/lib/python3.11/dist-packages (from pydantic) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.33.2 in /usr/local/lib/python3.11/dist-packages (from pydantic) (2.33.2)\n", + "Requirement already satisfied: typing-extensions>=4.12.2 in /usr/local/lib/python3.11/dist-packages (from pydantic) (4.14.1)\n", + "Requirement already satisfied: typing-inspection>=0.4.0 in /usr/local/lib/python3.11/dist-packages (from pydantic) (0.4.1)\n", + "Requirement already satisfied: langsmith>=0.3.45 in /usr/local/lib/python3.11/dist-packages (from langchain-core<1.0.0,>=0.3.68->langchain_openai) (0.4.8)\n", + "Requirement already satisfied: tenacity!=8.4.0,<10.0.0,>=8.1.0 in /usr/local/lib/python3.11/dist-packages (from langchain-core<1.0.0,>=0.3.68->langchain_openai) (8.5.0)\n", + "Requirement already satisfied: jsonpatch<2.0,>=1.33 in /usr/local/lib/python3.11/dist-packages (from langchain-core<1.0.0,>=0.3.68->langchain_openai) (1.33)\n", + "Requirement already satisfied: PyYAML>=5.3 in /usr/local/lib/python3.11/dist-packages (from langchain-core<1.0.0,>=0.3.68->langchain_openai) (6.0.2)\n", + "Requirement already satisfied: packaging>=23.2 in /usr/local/lib/python3.11/dist-packages (from langchain-core<1.0.0,>=0.3.68->langchain_openai) (25.0)\n", + "Requirement already satisfied: anyio<5,>=3.5.0 in /usr/local/lib/python3.11/dist-packages (from openai<2.0.0,>=1.86.0->langchain_openai) (4.9.0)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in /usr/local/lib/python3.11/dist-packages (from openai<2.0.0,>=1.86.0->langchain_openai) (1.9.0)\n", + "Requirement already satisfied: httpx<1,>=0.23.0 in /usr/local/lib/python3.11/dist-packages (from openai<2.0.0,>=1.86.0->langchain_openai) (0.28.1)\n", + "Requirement already satisfied: jiter<1,>=0.4.0 in /usr/local/lib/python3.11/dist-packages (from openai<2.0.0,>=1.86.0->langchain_openai) (0.10.0)\n", + "Requirement already satisfied: sniffio in /usr/local/lib/python3.11/dist-packages (from openai<2.0.0,>=1.86.0->langchain_openai) (1.3.1)\n", + "Requirement already satisfied: tqdm>4 in /usr/local/lib/python3.11/dist-packages (from openai<2.0.0,>=1.86.0->langchain_openai) (4.67.1)\n", + "Requirement already satisfied: regex>=2022.1.18 in /usr/local/lib/python3.11/dist-packages (from tiktoken<1,>=0.7->langchain_openai) (2024.11.6)\n", + "Requirement already satisfied: requests>=2.26.0 in /usr/local/lib/python3.11/dist-packages (from tiktoken<1,>=0.7->langchain_openai) (2.32.3)\n", + "Requirement already satisfied: idna>=2.8 in /usr/local/lib/python3.11/dist-packages (from anyio<5,>=3.5.0->openai<2.0.0,>=1.86.0->langchain_openai) (3.10)\n", + "Requirement already satisfied: certifi in /usr/local/lib/python3.11/dist-packages (from httpx<1,>=0.23.0->openai<2.0.0,>=1.86.0->langchain_openai) (2025.7.14)\n", + "Requirement already satisfied: httpcore==1.* in /usr/local/lib/python3.11/dist-packages (from httpx<1,>=0.23.0->openai<2.0.0,>=1.86.0->langchain_openai) (1.0.9)\n", + "Requirement already satisfied: h11>=0.16 in /usr/local/lib/python3.11/dist-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai<2.0.0,>=1.86.0->langchain_openai) (0.16.0)\n", + "Requirement already satisfied: jsonpointer>=1.9 in /usr/local/lib/python3.11/dist-packages (from jsonpatch<2.0,>=1.33->langchain-core<1.0.0,>=0.3.68->langchain_openai) (3.0.0)\n", + "Requirement already satisfied: orjson<4.0.0,>=3.9.14 in /usr/local/lib/python3.11/dist-packages (from langsmith>=0.3.45->langchain-core<1.0.0,>=0.3.68->langchain_openai) (3.11.0)\n", + "Requirement already satisfied: requests-toolbelt<2.0.0,>=1.0.0 in /usr/local/lib/python3.11/dist-packages (from langsmith>=0.3.45->langchain-core<1.0.0,>=0.3.68->langchain_openai) (1.0.0)\n", + "Requirement already satisfied: zstandard<0.24.0,>=0.23.0 in /usr/local/lib/python3.11/dist-packages (from langsmith>=0.3.45->langchain-core<1.0.0,>=0.3.68->langchain_openai) (0.23.0)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests>=2.26.0->tiktoken<1,>=0.7->langchain_openai) (3.4.2)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests>=2.26.0->tiktoken<1,>=0.7->langchain_openai) (2.5.0)\n", + "Downloading langchain_openai-0.3.28-py3-none-any.whl (70 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m70.6/70.6 kB\u001b[0m \u001b[31m3.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hInstalling collected packages: langchain_openai\n", + "Successfully installed langchain_openai-0.3.28\n" + ] + } + ], + "source": [ + "!pip install langchain_openai pydantic" + ] + }, + { + "cell_type": "code", + "source": [ + "\n", + "import os\n", + "from google.colab import userdata\n", + "os.environ['OPENAI_API_KEY'] = userdata.get('OPENAI_API_KEY')" + ], + "metadata": { + "id": "99ziBbITkabx" + }, + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from langchain_openai import ChatOpenAI\n", + "llm_gpt = ChatOpenAI(\n", + " model=\"gpt-4o-mini\",\n", + " temperature=0,\n", + ")" + ], + "metadata": { + "id": "-IVrdTb2kPm3" + }, + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "import pandas as pd\n", + "df= pd.read_csv('/content/captioned_dataset_full.csv' )\n", + "df.drop(columns=['Unnamed: 0.1'],inplace=True)\n", + "df" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 635 + }, + "id": "NEfkLf43kXcb", + "outputId": "7881edf9-d281-4087-ff95-57d2b85445ca" + }, + "execution_count": 10, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " attached_carousel_media_urls attached_media_content \\\n", + "0 NaN NaN \n", + "1 NaN NaN \n", + "2 NaN NaN \n", + "3 NaN NaN \n", + "4 NaN NaN \n", + "... ... ... \n", + "3232 NaN NaN \n", + "3233 NaN NaN \n", + "3234 NaN NaN \n", + "3235 NaN NaN \n", + "3236 NaN NaN \n", + "\n", + " attached_media_display_url \\\n", + "0 https://instagram.fiev22-2.fna.fbcdn.net/v/t51... \n", + "1 https://instagram.fiev22-2.fna.fbcdn.net/v/t51... \n", + "2 https://instagram.fiev22-1.fna.fbcdn.net/v/t51... \n", + "3 https://instagram.fiev22-1.fna.fbcdn.net/v/t51... \n", + "4 https://instagram.fiev22-2.fna.fbcdn.net/v/t51... \n", + "... ... \n", + "3232 https://instagram.fiev22-2.fna.fbcdn.net/v/t51... \n", + "3233 https://instagram.fiev22-2.fna.fbcdn.net/v/t51... \n", + "3234 https://instagram.fiev22-2.fna.fbcdn.net/v/t51... \n", + "3235 https://instagram.fiev22-2.fna.fbcdn.net/v/t51... \n", + "3236 https://instagram.fiev22-2.fna.fbcdn.net/v/t51... \n", + "\n", + " attached_media_display_url_s3 \\\n", + "0 NaN \n", + "1 NaN \n", + "2 NaN \n", + "3 NaN \n", + "4 NaN \n", + "... ... \n", + "3232 NaN \n", + "3233 NaN \n", + "3234 NaN \n", + "3235 NaN \n", + "3236 NaN \n", + "\n", + " attached_media_tagged_users \\\n", + "0 ['adars_fpv', 'dino.exc', 'itsmegauchan', 'pah... \n", + "1 ['ilive_nepal'] \n", + "2 NaN \n", + "3 NaN \n", + "4 NaN \n", + "... ... \n", + "3232 NaN \n", + "3233 NaN \n", + "3234 NaN \n", + "3235 ['citroennepal', 'leapmotor_nepal', 'nissan_ne... \n", + "3236 NaN \n", + "\n", + " attached_video_url clickable_urls \\\n", + "0 https://instagram.fiev22-1.fna.fbcdn.net/o1/v/... NaN \n", + "1 https://instagram.fiev22-2.fna.fbcdn.net/o1/v/... NaN \n", + "2 https://instagram.fiev22-2.fna.fbcdn.net/o1/v/... NaN \n", + "3 https://instagram.fiev22-2.fna.fbcdn.net/o1/v/... NaN \n", + "4 https://instagram.fiev22-1.fna.fbcdn.net/o1/v/... NaN \n", + "... ... ... \n", + "3232 https://instagram.fiev22-1.fna.fbcdn.net/o1/v/... NaN \n", + "3233 https://instagram.fiev22-2.fna.fbcdn.net/o1/v/... NaN \n", + "3234 https://instagram.fiev22-2.fna.fbcdn.net/o1/v/... NaN \n", + "3235 https://instagram.fiev22-1.fna.fbcdn.net/o1/v/... NaN \n", + "3236 https://instagram.fiev22-1.fna.fbcdn.net/o1/v/... NaN \n", + "\n", + " coauthor_producers comments_count \\\n", + "0 ['adars_fpv'] 5.0 \n", + "1 NaN 14.0 \n", + "2 NaN 3.0 \n", + "3 NaN 34.0 \n", + "4 NaN 12.0 \n", + "... ... ... \n", + "3232 NaN 4.0 \n", + "3233 NaN 4.0 \n", + "3234 NaN 4.0 \n", + "3235 ['omodajaecoo.nepal', 'zeekrnepal', 'leapmotor... NaN \n", + "3236 NaN 2.0 \n", + "\n", + " created_time ... region_location place_name.1 street.1 \\\n", + "0 2023-01-28 18:06:17 ... NaN NaN NaN NaN \n", + "1 2023-03-04 12:00:32 ... NaN NaN NaN NaN \n", + "2 2023-03-06 12:39:36 ... NaN NaN NaN NaN \n", + "3 2023-03-25 22:56:36 ... NaN NaN NaN NaN \n", + "4 2023-04-03 17:53:20 ... NaN NaN NaN NaN \n", + "... ... ... ... .. ... ... \n", + "3232 2025-02-02 17:00:00 ... NaN NaN NaN NaN \n", + "3233 2025-02-16 17:00:55 ... NaN NaN NaN NaN \n", + "3234 2025-02-24 17:13:55 ... NaN NaN NaN NaN \n", + "3235 2025-03-28 08:28:26 ... NaN NaN NaN NaN \n", + "3236 2025-03-30 17:00:00 ... NaN NaN NaN NaN \n", + "\n", + " ward.1 city.1 district.1 province.1 country.1 country_code.1 \n", + "0 NaN NaN NaN NaN NaN NaN \n", + "1 NaN NaN NaN NaN NaN NaN \n", + "2 NaN NaN NaN NaN NaN NaN \n", + "3 NaN NaN NaN NaN NaN NaN \n", + "4 NaN NaN NaN NaN NaN NaN \n", + "... ... ... ... ... ... ... \n", + "3232 NaN NaN NaN NaN NaN NaN \n", + "3233 NaN NaN NaN NaN NaN NaN \n", + "3234 NaN NaN NaN NaN NaN NaN \n", + "3235 NaN NaN NaN NaN NaN NaN \n", + "3236 NaN NaN NaN NaN NaN NaN \n", + "\n", + "[3237 rows x 79 columns]" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
attached_carousel_media_urlsattached_media_contentattached_media_display_urlattached_media_display_url_s3attached_media_tagged_usersattached_video_urlclickable_urlscoauthor_producerscomments_countcreated_time...region_locationplace_name.1street.1ward.1city.1district.1province.1country.1country_code.1
0NaNNaNhttps://instagram.fiev22-2.fna.fbcdn.net/v/t51...NaN['adars_fpv', 'dino.exc', 'itsmegauchan', 'pah...https://instagram.fiev22-1.fna.fbcdn.net/o1/v/...NaN['adars_fpv']5.02023-01-28 18:06:17...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1NaNNaNhttps://instagram.fiev22-2.fna.fbcdn.net/v/t51...NaN['ilive_nepal']https://instagram.fiev22-2.fna.fbcdn.net/o1/v/...NaNNaN14.02023-03-04 12:00:32...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2NaNNaNhttps://instagram.fiev22-1.fna.fbcdn.net/v/t51...NaNNaNhttps://instagram.fiev22-2.fna.fbcdn.net/o1/v/...NaNNaN3.02023-03-06 12:39:36...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3NaNNaNhttps://instagram.fiev22-1.fna.fbcdn.net/v/t51...NaNNaNhttps://instagram.fiev22-2.fna.fbcdn.net/o1/v/...NaNNaN34.02023-03-25 22:56:36...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4NaNNaNhttps://instagram.fiev22-2.fna.fbcdn.net/v/t51...NaNNaNhttps://instagram.fiev22-1.fna.fbcdn.net/o1/v/...NaNNaN12.02023-04-03 17:53:20...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
..................................................................
3232NaNNaNhttps://instagram.fiev22-2.fna.fbcdn.net/v/t51...NaNNaNhttps://instagram.fiev22-1.fna.fbcdn.net/o1/v/...NaNNaN4.02025-02-02 17:00:00...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3233NaNNaNhttps://instagram.fiev22-2.fna.fbcdn.net/v/t51...NaNNaNhttps://instagram.fiev22-2.fna.fbcdn.net/o1/v/...NaNNaN4.02025-02-16 17:00:55...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3234NaNNaNhttps://instagram.fiev22-2.fna.fbcdn.net/v/t51...NaNNaNhttps://instagram.fiev22-2.fna.fbcdn.net/o1/v/...NaNNaN4.02025-02-24 17:13:55...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3235NaNNaNhttps://instagram.fiev22-2.fna.fbcdn.net/v/t51...NaN['citroennepal', 'leapmotor_nepal', 'nissan_ne...https://instagram.fiev22-1.fna.fbcdn.net/o1/v/...NaN['omodajaecoo.nepal', 'zeekrnepal', 'leapmotor...NaN2025-03-28 08:28:26...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3236NaNNaNhttps://instagram.fiev22-2.fna.fbcdn.net/v/t51...NaNNaNhttps://instagram.fiev22-1.fna.fbcdn.net/o1/v/...NaNNaN2.02025-03-30 17:00:00...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", + "

3237 rows × 79 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + " \n", + " \n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "variable_name": "df" + } + }, + "metadata": {}, + "execution_count": 10 + } + ] + }, + { + "cell_type": "code", + "source": [ + "list(df['owner_username'].unique())" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1rEZH0RktLr4", + "outputId": "2247731e-9992-457c-a8a3-958405cbc201" + }, + "execution_count": 45, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['brocadeofficial',\n", + " 'adars_fpv',\n", + " 'the_levitator',\n", + " 'garudx.fpv',\n", + " 'lalitpurcityfootballclub',\n", + " 'shrijanshresthaa',\n", + " 'blacksheepfpv',\n", + " 'ur_shoaib',\n", + " 'ajaytm43',\n", + " 'thehybriddesigner.np',\n", + " 'anishakafle',\n", + " 'divyadhakal_',\n", + " 'roshaan.g',\n", + " 'unicefsouthasia',\n", + " 'bhawanaraut1',\n", + " 'get_nepal',\n", + " 'columbianepal',\n", + " 'withbibek',\n", + " 'diwasg',\n", + " 'haitentertainment',\n", + " 'octaveeventss',\n", + " 'rvl.tv',\n", + " 'ruslanstudionepal',\n", + " 'ashishflute_official',\n", + " 'michaelwumusic',\n", + " 'mandygamma',\n", + " 'enspace.np',\n", + " 'digixel.inc',\n", + " 'underadar_official',\n", + " 'sahatkasa',\n", + " 'eatgrubfood',\n", + " 'food_explorer_life',\n", + " 'kaffacafe_by_sukunda',\n", + " 'ggkaam',\n", + " 'gracebhattarai',\n", + " 'ufo_nepal',\n", + " 'iam_s.i.d.d_',\n", + " 'sumitraut._',\n", + " 'lowenbeauty',\n", + " 'lamuse.np',\n", + " 'phoebe_bhattarai',\n", + " 'imsurakshyakc',\n", + " 'vaishaali_',\n", + " 'chamsbro_erawan',\n", + " 'istu_karki',\n", + " 'brillarenepal',\n", + " 'team.nftp',\n", + " 'jholeyism',\n", + " 'youngbluesss',\n", + " 'younglion888',\n", + " 'ashimneu',\n", + " 'newjalshrestha',\n", + " 'sunflower.weekender',\n", + " '_jenishm',\n", + " 'swtalmbu',\n", + " 'mrbvlog2.0',\n", + " 'motoworld.np',\n", + " 'bijyayy',\n", + " 'newstyle_fashionwear_official',\n", + " 'munachiya',\n", + " 'flightsgyaninepal',\n", + " 'buddhaland_co',\n", + " 'highgroundnepal',\n", + " 's.traveller_nextdoor',\n", + " nan,\n", + " 'mydarlingfood',\n", + " 'riyasthaa',\n", + " 'uptrendly.creators',\n", + " 'nepal.food',\n", + " 'mahindranepal_agnigroup',\n", + " '_thehappyhikers_',\n", + " 'hyderabadidumbiryani.nepal',\n", + " 'nnzeella_shrestha',\n", + " 'manify.np',\n", + " 'sareeshashrestha',\n", + " 'aryan_g.r.g',\n", + " 'rtw.np',\n", + " '_prabha__gurung_',\n", + " 'nepartist',\n", + " 'mamitapun',\n", + " '_sunny_magar_',\n", + " 'pramuditaaudas',\n", + " 'orabelle.np',\n", + " 'mishisacosmetics',\n", + " 'hree_store',\n", + " 'cliaraessentialoil_np',\n", + " 'muscles_lab',\n", + " 'rabindra_dhant1',\n", + " 'teks.fitness',\n", + " 'diwizpiyalama',\n", + " 'locknroll.mma',\n", + " 'nepalwarriorschampionship',\n", + " 'bjj_asia',\n", + " 'onechampionship',\n", + " 'paradygmsportsnetwork',\n", + " 'latidonepal',\n", + " 'grappleasiapod',\n", + " 'somafightclub',\n", + " 'razee.maharjan',\n", + " 'razeechan',\n", + " '_anupchau',\n", + " 'shrishes_mdr',\n", + " 'ideapreneurnepal',\n", + " 'sanjogkoirala_',\n", + " 'shreepaisaofficial',\n", + " 'sushant_pradhan_',\n", + " 'hemantabhandari_',\n", + " 'usembassynepal',\n", + " 'foodmandu',\n", + " 'thismorninglive',\n", + " 'asifshah_nepal',\n", + " 'sahikura_',\n", + " 'entrepreneur_nepal',\n", + " 'kathmandu_locals',\n", + " 'colgatenepal',\n", + " 'siddinathapa',\n", + " 'sjpoon_official',\n", + " '_me_supriya',\n", + " '_its.me.muskan_',\n", + " 'tashyilha_g',\n", + " 'instaa.goddess',\n", + " 'cubex.clo',\n", + " 'newmew.nepal',\n", + " 'koreankini',\n", + " 'samirstha319',\n", + " 'pubgm.np.official',\n", + " '_richa.s',\n", + " 'buwb.pod',\n", + " 'chankheyproduction',\n", + " 'openhousepkr',\n", + " '_contentsby.richa']" + ] + }, + "metadata": {}, + "execution_count": 45 + } + ] + }, + { + "cell_type": "code", + "source": [ + " query = 'How many likes have divya dhakal got while promoting BYD'\n", + " prompt = f'''Given a pandas DataFrame with columns:{list(df.columns)}, usernames:{list(df['owner_username'].unique())}, write pandas code to {query}. Return only valid Python code. Don't return the imports too. Don't even include the **python** keyword in the beginning. Just give me one liner runnable code'''" + ], + "metadata": { + "id": "WZz94osZk9DS" + }, + "execution_count": 80, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "code_response=llm_gpt.invoke(prompt).content\n", + "code_response" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "id": "7-xfQ7IvlhR9", + "outputId": "145ffaf2-024f-463a-b700-df8e003ef6fe" + }, + "execution_count": 81, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "\"df[(df['owner_username'] == 'divyadhakal_') & (df['brand_promoted'] == 'BYD')]['likes_count'].sum()\"" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 81 + } + ] + }, + { + "cell_type": "code", + "source": [ + "def execute_pandas_query(code_str: str, df: pd.DataFrame):\n", + " code = code_str.strip()\n", + " print('The code is:', code)\n", + " try:\n", + " local_vars = {\"df\": df} # Pass your existing DataFrame\n", + " result = eval(code_str, {}, local_vars)\n", + " print('The result is:', result)\n", + " return result\n", + "\n", + " except Exception as e:\n", + " raise RuntimeError(f\"Execution error: {e}\")" + ], + "metadata": { + "id": "YwfKchhbqU_1" + }, + "execution_count": 82, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Example use:\n", + "count = execute_pandas_query(\n", + " code_response,\n", + " df\n", + ")\n", + "print(\"Result:\", count)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OybMPTs2sEKh", + "outputId": "62dd72f5-b39b-460b-a9a9-a21f60bb162c" + }, + "execution_count": 83, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The code is: df[(df['owner_username'] == 'divyadhakal_') & (df['brand_promoted'] == 'BYD')]['likes_count'].sum()\n", + "The result is: 0.0\n", + "Result: 0.0\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "df[(df['owner_username'] == 'divyadhakal_') & (df['likes_count'] > 1000)].shape[0]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FRVpCf2isHqn", + "outputId": "845b25a1-7a9c-471d-9bd9-29a9bdd06897" + }, + "execution_count": 50, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "159" + ] + }, + "metadata": {}, + "execution_count": 50 + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Example DataFrame (only if you haven't defined it already)\n", + "import pandas as pd\n", + "\n", + "# Assuming 'df' already exists with correct columns\n", + "# If not, here's a dummy example:\n", + "# df = pd.DataFrame({'owner_username': ['divyadhakal_'], 'likes_count': [1500]})\n", + "\n", + "code_str = \"df[(df['owner_username'] == 'divyadhakal_') & (df['likes_count'] > 1000)].shape[0]\"\n", + "local_vars = {\"df\": df} # Pass your existing DataFrame\n", + "\n", + "result = eval(code_str, {}, local_vars)\n", + "print(\"Result:\", result)\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Pqn5OHRUsT7P", + "outputId": "bf75f028-c567-4824-bb95-293aa1485a10" + }, + "execution_count": 51, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Result: 159\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "mf2ttVert_qz" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/src/genai/__pycache__/__init__.cpython-312.pyc b/src/genai/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03b222a8331e82faf8e6a28a6e9aabf60474938d Binary files /dev/null and b/src/genai/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/__pycache__/__init__.cpython-312.pyc b/src/genai/brainstroming_agent/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a5f66bf588ff31f94995038b2a5b46ace297386 Binary files /dev/null and b/src/genai/brainstroming_agent/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/__pycache__/agent.cpython-312.pyc b/src/genai/brainstroming_agent/__pycache__/agent.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a07f37d7f5d819c42213ad33372dda0b61b5298c Binary files /dev/null and b/src/genai/brainstroming_agent/__pycache__/agent.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/utils/__pycache__/__init__.cpython-312.pyc b/src/genai/brainstroming_agent/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e41887689b74ab07a904b6e1d70b1ea6b11b651a Binary files /dev/null and b/src/genai/brainstroming_agent/utils/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/utils/__pycache__/business_interaction.cpython-312.pyc b/src/genai/brainstroming_agent/utils/__pycache__/business_interaction.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c99b02745ec568be573c7011d077e6041ad156e Binary files /dev/null and b/src/genai/brainstroming_agent/utils/__pycache__/business_interaction.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/utils/__pycache__/check.cpython-312.pyc b/src/genai/brainstroming_agent/utils/__pycache__/check.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f54c742347ff422ba7563b352bafaa92f878b558 Binary files /dev/null and b/src/genai/brainstroming_agent/utils/__pycache__/check.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/utils/__pycache__/data_loader.cpython-312.pyc b/src/genai/brainstroming_agent/utils/__pycache__/data_loader.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44add981a75291d1eabef1c3a00eab20aeec31dd Binary files /dev/null and b/src/genai/brainstroming_agent/utils/__pycache__/data_loader.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/utils/__pycache__/initial_interaction.cpython-312.pyc b/src/genai/brainstroming_agent/utils/__pycache__/initial_interaction.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4969bde30e9614d21c6e56b3c4f4b2e4609d4e0 Binary files /dev/null and b/src/genai/brainstroming_agent/utils/__pycache__/initial_interaction.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/utils/__pycache__/models.cpython-312.pyc b/src/genai/brainstroming_agent/utils/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff3fac4ef4833a07c7c81bac2b78d76746978413 Binary files /dev/null and b/src/genai/brainstroming_agent/utils/__pycache__/models.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/utils/__pycache__/models_loader.cpython-312.pyc b/src/genai/brainstroming_agent/utils/__pycache__/models_loader.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f4f8156878805ca913061824a6ed0dcbb76393a Binary files /dev/null and b/src/genai/brainstroming_agent/utils/__pycache__/models_loader.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/utils/__pycache__/nodes.cpython-312.pyc b/src/genai/brainstroming_agent/utils/__pycache__/nodes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebd70e26424b3a95cd62779af2579c61499f8de6 Binary files /dev/null and b/src/genai/brainstroming_agent/utils/__pycache__/nodes.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/utils/__pycache__/prompts.cpython-312.pyc b/src/genai/brainstroming_agent/utils/__pycache__/prompts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2d4c1335ab5658809c5b329b554a154c6f2e769 Binary files /dev/null and b/src/genai/brainstroming_agent/utils/__pycache__/prompts.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/utils/__pycache__/state.cpython-312.pyc b/src/genai/brainstroming_agent/utils/__pycache__/state.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4e2e05768532a50b66638e940ec7aa6950d959f Binary files /dev/null and b/src/genai/brainstroming_agent/utils/__pycache__/state.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/utils/__pycache__/tools.cpython-312.pyc b/src/genai/brainstroming_agent/utils/__pycache__/tools.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f6380b36d31fa2a54ac27132c427055abe46cfb Binary files /dev/null and b/src/genai/brainstroming_agent/utils/__pycache__/tools.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/utils/__pycache__/utils.cpython-312.pyc b/src/genai/brainstroming_agent/utils/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3aaaa441fc96b7f3cec9aed14de1e167a7d76c1e Binary files /dev/null and b/src/genai/brainstroming_agent/utils/__pycache__/utils.cpython-312.pyc differ diff --git a/src/genai/brainstroming_agent/utils/__pycache__/validators.cpython-312.pyc b/src/genai/brainstroming_agent/utils/__pycache__/validators.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e2cf77fcf51e99713dc06f5c5922aa32deb9457 Binary files /dev/null and b/src/genai/brainstroming_agent/utils/__pycache__/validators.cpython-312.pyc differ diff --git a/src/genai/business_interaction_agent/__pycache__/__init__.cpython-312.pyc b/src/genai/business_interaction_agent/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..730ea4d6877ac62ba75d25bdf1ca290b8ad00427 Binary files /dev/null and b/src/genai/business_interaction_agent/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/business_interaction_agent/__pycache__/agent.cpython-312.pyc b/src/genai/business_interaction_agent/__pycache__/agent.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f093bf45ac94cdfc3d855f493fa09b6272d4e3d2 Binary files /dev/null and b/src/genai/business_interaction_agent/__pycache__/agent.cpython-312.pyc differ diff --git a/src/genai/business_interaction_agent/utils/__pycache__/__init__.cpython-312.pyc b/src/genai/business_interaction_agent/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d4836bc25c9ca3c94e146e6dd8843bf041ddb67 Binary files /dev/null and b/src/genai/business_interaction_agent/utils/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/business_interaction_agent/utils/__pycache__/nodes.cpython-312.pyc b/src/genai/business_interaction_agent/utils/__pycache__/nodes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..416ea2d91ebc37a343ffc217bd32e96fc5af73cd Binary files /dev/null and b/src/genai/business_interaction_agent/utils/__pycache__/nodes.cpython-312.pyc differ diff --git a/src/genai/business_interaction_agent/utils/__pycache__/prompts.cpython-312.pyc b/src/genai/business_interaction_agent/utils/__pycache__/prompts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0a44c09b3ef43f65a6154a96b299a0cf58bcbd9 Binary files /dev/null and b/src/genai/business_interaction_agent/utils/__pycache__/prompts.cpython-312.pyc differ diff --git a/src/genai/business_interaction_agent/utils/__pycache__/state.cpython-312.pyc b/src/genai/business_interaction_agent/utils/__pycache__/state.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a38b6524996e7453e48621917798998b44339a7f Binary files /dev/null and b/src/genai/business_interaction_agent/utils/__pycache__/state.cpython-312.pyc differ diff --git a/src/genai/business_interaction_agent/utils/__pycache__/utils.cpython-312.pyc b/src/genai/business_interaction_agent/utils/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00d1ce9657b21a5562652e7c959d0e71abdb144e Binary files /dev/null and b/src/genai/business_interaction_agent/utils/__pycache__/utils.cpython-312.pyc differ diff --git a/src/genai/context_analysis_agent/__pycache__/__init__.cpython-312.pyc b/src/genai/context_analysis_agent/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe48d27356ea6453a69b409807fceb0f0e1d711f Binary files /dev/null and b/src/genai/context_analysis_agent/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/context_analysis_agent/__pycache__/agent.cpython-312.pyc b/src/genai/context_analysis_agent/__pycache__/agent.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b84dae81ebeec22d250e8afb2c5c28339b655dfa Binary files /dev/null and b/src/genai/context_analysis_agent/__pycache__/agent.cpython-312.pyc differ diff --git a/src/genai/context_analysis_agent/utils/__pycache__/__init__.cpython-312.pyc b/src/genai/context_analysis_agent/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d5c57a1dfa08260db35be8544f5ff1d147b63ee Binary files /dev/null and b/src/genai/context_analysis_agent/utils/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/context_analysis_agent/utils/__pycache__/nodes.cpython-312.pyc b/src/genai/context_analysis_agent/utils/__pycache__/nodes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27dfd29cfdf826b2a1138d1e2b530ad1b200f271 Binary files /dev/null and b/src/genai/context_analysis_agent/utils/__pycache__/nodes.cpython-312.pyc differ diff --git a/src/genai/context_analysis_agent/utils/__pycache__/prompts.cpython-312.pyc b/src/genai/context_analysis_agent/utils/__pycache__/prompts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e17e87150ac37dfa603bf47c4edea4ad7beb2c6c Binary files /dev/null and b/src/genai/context_analysis_agent/utils/__pycache__/prompts.cpython-312.pyc differ diff --git a/src/genai/context_analysis_agent/utils/__pycache__/state.cpython-312.pyc b/src/genai/context_analysis_agent/utils/__pycache__/state.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f2bd8fe1a40ece168cc53fc8781b1cf67ea2332 Binary files /dev/null and b/src/genai/context_analysis_agent/utils/__pycache__/state.cpython-312.pyc differ diff --git a/src/genai/context_analysis_agent/utils/__pycache__/utils.cpython-312.pyc b/src/genai/context_analysis_agent/utils/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f73384cd24a3ee6a7a480e5f648e084e957697a1 Binary files /dev/null and b/src/genai/context_analysis_agent/utils/__pycache__/utils.cpython-312.pyc differ diff --git a/src/genai/human_refined_ideation/__pycache__/__init__.cpython-312.pyc b/src/genai/human_refined_ideation/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffa751f14b99e1cb33cb50791396de7b2845644f Binary files /dev/null and b/src/genai/human_refined_ideation/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/human_refined_ideation/__pycache__/agent.cpython-312.pyc b/src/genai/human_refined_ideation/__pycache__/agent.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a94346d946a218078f4145ffab2d46b55c6471e Binary files /dev/null and b/src/genai/human_refined_ideation/__pycache__/agent.cpython-312.pyc differ diff --git a/src/genai/human_refined_ideation/utils/__pycache__/__init__.cpython-312.pyc b/src/genai/human_refined_ideation/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65fcd1862844210d1ba1997098a7abe787a75bb3 Binary files /dev/null and b/src/genai/human_refined_ideation/utils/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/human_refined_ideation/utils/__pycache__/nodes.cpython-312.pyc b/src/genai/human_refined_ideation/utils/__pycache__/nodes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..667e6f0eca1801a59342405f4fa3f5307ca4bbd6 Binary files /dev/null and b/src/genai/human_refined_ideation/utils/__pycache__/nodes.cpython-312.pyc differ diff --git a/src/genai/human_refined_ideation/utils/__pycache__/prompts.cpython-312.pyc b/src/genai/human_refined_ideation/utils/__pycache__/prompts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1692752b43c45a5c184541552611f56be0e6ace6 Binary files /dev/null and b/src/genai/human_refined_ideation/utils/__pycache__/prompts.cpython-312.pyc differ diff --git a/src/genai/human_refined_ideation/utils/__pycache__/state.cpython-312.pyc b/src/genai/human_refined_ideation/utils/__pycache__/state.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8873833dd78f263d102070711542b21fbb60680 Binary files /dev/null and b/src/genai/human_refined_ideation/utils/__pycache__/state.cpython-312.pyc differ diff --git a/src/genai/idea_to_budget_agent/__pycache__/__init__.cpython-312.pyc b/src/genai/idea_to_budget_agent/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05979cd09db65d1b77a05dfaf81a4ec4ec982100 Binary files /dev/null and b/src/genai/idea_to_budget_agent/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/idea_to_budget_agent/__pycache__/agent.cpython-312.pyc b/src/genai/idea_to_budget_agent/__pycache__/agent.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27d5a934c59856c3765b60a21f8c8b70d7ff3d49 Binary files /dev/null and b/src/genai/idea_to_budget_agent/__pycache__/agent.cpython-312.pyc differ diff --git a/src/genai/idea_to_budget_agent/utils/__pycache__/prompts.cpython-312.pyc b/src/genai/idea_to_budget_agent/utils/__pycache__/prompts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a7f1bf507ded38465b0b94ffa05a6d4b9660d2a Binary files /dev/null and b/src/genai/idea_to_budget_agent/utils/__pycache__/prompts.cpython-312.pyc differ diff --git a/src/genai/idea_to_budget_agent/utils/__pycache__/state.cpython-312.pyc b/src/genai/idea_to_budget_agent/utils/__pycache__/state.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffbc6f58cdfe77afac0edcee144e9a614388e94f Binary files /dev/null and b/src/genai/idea_to_budget_agent/utils/__pycache__/state.cpython-312.pyc differ diff --git a/src/genai/idea_to_budget_agent/utils/__pycache__/tools.cpython-312.pyc b/src/genai/idea_to_budget_agent/utils/__pycache__/tools.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..207236158e2f6625a0c175cd1b859a91ad60bdd7 Binary files /dev/null and b/src/genai/idea_to_budget_agent/utils/__pycache__/tools.cpython-312.pyc differ diff --git a/src/genai/ideation_agent/__pycache__/__init__.cpython-312.pyc b/src/genai/ideation_agent/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14a491384bd807ddd9db82bed5543174a578fe26 Binary files /dev/null and b/src/genai/ideation_agent/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/ideation_agent/__pycache__/agent.cpython-312.pyc b/src/genai/ideation_agent/__pycache__/agent.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ffe0e78529d7df8f9645b975bacbb9b5c7fa680 Binary files /dev/null and b/src/genai/ideation_agent/__pycache__/agent.cpython-312.pyc differ diff --git a/src/genai/ideation_agent/utils/__pycache__/nodes.cpython-312.pyc b/src/genai/ideation_agent/utils/__pycache__/nodes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b37b2d9bc0e6a699d857f3d1d8554ed38bf3e1be Binary files /dev/null and b/src/genai/ideation_agent/utils/__pycache__/nodes.cpython-312.pyc differ diff --git a/src/genai/ideation_agent/utils/__pycache__/prompts.cpython-312.pyc b/src/genai/ideation_agent/utils/__pycache__/prompts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..470cf01cbaa0ffafa5d16006e30d1729fccc58db Binary files /dev/null and b/src/genai/ideation_agent/utils/__pycache__/prompts.cpython-312.pyc differ diff --git a/src/genai/ideation_agent/utils/__pycache__/state.cpython-312.pyc b/src/genai/ideation_agent/utils/__pycache__/state.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0720aeb81808a00f97010a1c6c4ed88fdcde2e96 Binary files /dev/null and b/src/genai/ideation_agent/utils/__pycache__/state.cpython-312.pyc differ diff --git a/src/genai/ideation_agent/utils/__pycache__/tools.cpython-312.pyc b/src/genai/ideation_agent/utils/__pycache__/tools.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad3d1e1cabe1e59bd6f0dc89a9bd433ff6b75d76 Binary files /dev/null and b/src/genai/ideation_agent/utils/__pycache__/tools.cpython-312.pyc differ diff --git a/src/genai/orchestration_agent/__pycache__/__init__.cpython-312.pyc b/src/genai/orchestration_agent/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..405644974295274cdbd816276c927fc43be211d9 Binary files /dev/null and b/src/genai/orchestration_agent/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/orchestration_agent/__pycache__/agent.cpython-312.pyc b/src/genai/orchestration_agent/__pycache__/agent.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0502e8410758d6cbc6be104b2a5cfef9d361d7c Binary files /dev/null and b/src/genai/orchestration_agent/__pycache__/agent.cpython-312.pyc differ diff --git a/src/genai/orchestration_agent/utils/__pycache__/__init__.cpython-312.pyc b/src/genai/orchestration_agent/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35a3a7d6018911577498d5368c00403a2b5ce9da Binary files /dev/null and b/src/genai/orchestration_agent/utils/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/orchestration_agent/utils/__pycache__/nodes.cpython-312.pyc b/src/genai/orchestration_agent/utils/__pycache__/nodes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d047d7bc4a41e27bfec99f463765489e4f62c80 Binary files /dev/null and b/src/genai/orchestration_agent/utils/__pycache__/nodes.cpython-312.pyc differ diff --git a/src/genai/orchestration_agent/utils/__pycache__/prompts.cpython-312.pyc b/src/genai/orchestration_agent/utils/__pycache__/prompts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca9b3ba241926d70b653b0259bdfd6ce92577f11 Binary files /dev/null and b/src/genai/orchestration_agent/utils/__pycache__/prompts.cpython-312.pyc differ diff --git a/src/genai/orchestration_agent/utils/__pycache__/state.cpython-312.pyc b/src/genai/orchestration_agent/utils/__pycache__/state.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34818422668f7f6c49a39bdf7712cc2bbdb12c25 Binary files /dev/null and b/src/genai/orchestration_agent/utils/__pycache__/state.cpython-312.pyc differ diff --git a/src/genai/orchestration_agent/utils/__pycache__/tools.cpython-312.pyc b/src/genai/orchestration_agent/utils/__pycache__/tools.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5714d0391e43fab0688cbfcfc48c54d93c5e625d Binary files /dev/null and b/src/genai/orchestration_agent/utils/__pycache__/tools.cpython-312.pyc differ diff --git a/src/genai/orchestration_agent/utils/__pycache__/utils.cpython-312.pyc b/src/genai/orchestration_agent/utils/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ce3aa5135dda4f42f8bdeb64d5cd6d2dda04fb4 Binary files /dev/null and b/src/genai/orchestration_agent/utils/__pycache__/utils.cpython-312.pyc differ diff --git a/src/genai/utils/__pycache__/__init__.cpython-312.pyc b/src/genai/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..762693b243d93d4e66b6653ef06b3260831062f4 Binary files /dev/null and b/src/genai/utils/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/genai/utils/__pycache__/data_loader.cpython-312.pyc b/src/genai/utils/__pycache__/data_loader.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8693a48e5caf5976e4812ccc32eb1ecab416e201 Binary files /dev/null and b/src/genai/utils/__pycache__/data_loader.cpython-312.pyc differ diff --git a/src/genai/utils/__pycache__/load_embeddings.cpython-312.pyc b/src/genai/utils/__pycache__/load_embeddings.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88d0f9567a6ffeb68816679e20fa260b7dca1f9b Binary files /dev/null and b/src/genai/utils/__pycache__/load_embeddings.cpython-312.pyc differ diff --git a/src/genai/utils/__pycache__/models_loader.cpython-312.pyc b/src/genai/utils/__pycache__/models_loader.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..592ba036574d5ab9e367aaba3bfb698c2f0dc4f2 Binary files /dev/null and b/src/genai/utils/__pycache__/models_loader.cpython-312.pyc differ diff --git a/src/genai/utils/__pycache__/utils.cpython-312.pyc b/src/genai/utils/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e76c991d602ad23e82b4e7b27d0200d06195192 Binary files /dev/null and b/src/genai/utils/__pycache__/utils.cpython-312.pyc differ diff --git a/tests/test_api.py b/tests/test_api.py index e9fae862e5fb49c77c13954ec5fa3567ea936ae5..3b97042d25b9746012679006dcd7e74f9ab40fe9 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -7,3 +7,14 @@ def test_root(): response = client.get("/") assert response.status_code == 200 assert response.json() == {"response":"Hello"} + + +def test_context_analysis(): + payload = { + "message": "Hello" + } + + response = client.post("/context-analysis", json=payload) + + assert response.status_code == 200 + assert response.json()