From 4f7ed34b534fc66074e25f44d2b482f82218af5c Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Sun, 28 Dec 2025 12:44:46 +0530 Subject: [PATCH 01/19] (chore): upgrade package newspaper3k -> newspaper4k [compatibility] python >= 3.12 (fix): removed incorrect pinecone client init in get_rag.py (fix): centralize groq model change from llm_config.py --- backend/app/llm_config.py | 4 + .../app/modules/bias_detection/check_bias.py | 3 +- backend/app/modules/chat/llm_processing.py | 3 +- .../app/modules/facts_check/llm_processing.py | 5 +- .../langgraph_nodes/generate_perspective.py | 3 +- backend/app/modules/langgraph_nodes/judge.py | 3 +- .../app/modules/langgraph_nodes/sentiment.py | 3 +- backend/pyproject.toml | 2 +- backend/uv.lock | 161 +++++++++++++----- 9 files changed, 135 insertions(+), 52 deletions(-) create mode 100644 backend/app/llm_config.py diff --git a/backend/app/llm_config.py b/backend/app/llm_config.py new file mode 100644 index 00000000..4cb96d2c --- /dev/null +++ b/backend/app/llm_config.py @@ -0,0 +1,4 @@ +import os + +# Default to a stable model +LLM_MODEL = os.getenv("LLM_MODEL", "llama-3.3-70b-versatile") \ No newline at end of file diff --git a/backend/app/modules/bias_detection/check_bias.py b/backend/app/modules/bias_detection/check_bias.py index a0644529..d814fdaa 100644 --- a/backend/app/modules/bias_detection/check_bias.py +++ b/backend/app/modules/bias_detection/check_bias.py @@ -27,6 +27,7 @@ from dotenv import load_dotenv import json from app.logging.logging_config import setup_logger +from app.llm_config import LLM_MODEL logger = setup_logger(__name__) @@ -61,7 +62,7 @@ def check_bias(text): "content": (f"Give bias score to the following article \n\n{text}"), }, ], - model="gemma2-9b-it", + model=LLM_MODEL, temperature=0.3, max_tokens=512, ) diff --git a/backend/app/modules/chat/llm_processing.py b/backend/app/modules/chat/llm_processing.py index 2d5134fa..9fe0ace3 100644 --- a/backend/app/modules/chat/llm_processing.py +++ b/backend/app/modules/chat/llm_processing.py @@ -27,6 +27,7 @@ from groq import Groq from dotenv import load_dotenv from app.logging.logging_config import setup_logger +from app.llm_config import LLM_MODEL logger = setup_logger(__name__) @@ -55,7 +56,7 @@ def ask_llm(question, docs): """ response = client.chat.completions.create( - model="gemma2-9b-it", + model=LLM_MODEL, messages=[ {"role": "system", "content": "Use only the context to answer."}, {"role": "user", "content": prompt}, diff --git a/backend/app/modules/facts_check/llm_processing.py b/backend/app/modules/facts_check/llm_processing.py index dc223a85..c3ead204 100644 --- a/backend/app/modules/facts_check/llm_processing.py +++ b/backend/app/modules/facts_check/llm_processing.py @@ -29,6 +29,7 @@ import json import re from app.logging.logging_config import setup_logger +from app.llm_config import LLM_MODEL logger = setup_logger(__name__) @@ -63,7 +64,7 @@ def run_claim_extractor_sdk(state): ), }, ], - model="gemma2-9b-it", + model=LLM_MODEL, temperature=0.3, max_tokens=512, ) @@ -128,7 +129,7 @@ def run_fact_verifier_sdk(search_results): ), }, ], - model="gemma2-9b-it", + model=LLM_MODEL, temperature=0.3, max_tokens=256, ) diff --git a/backend/app/modules/langgraph_nodes/generate_perspective.py b/backend/app/modules/langgraph_nodes/generate_perspective.py index be0c81f3..e79d2a35 100644 --- a/backend/app/modules/langgraph_nodes/generate_perspective.py +++ b/backend/app/modules/langgraph_nodes/generate_perspective.py @@ -21,6 +21,7 @@ from app.utils.prompt_templates import generation_prompt +from app.llm_config import LLM_MODEL from langchain_groq import ChatGroq from pydantic import BaseModel, Field from app.logging.logging_config import setup_logger @@ -36,7 +37,7 @@ class PerspectiveOutput(BaseModel): perspective: str = Field(..., description="Generated opposite perspective") -my_llm = "llama-3.3-70b-versatile" +my_llm = LLM_MODEL llm = ChatGroq(model=my_llm, temperature=0.7) diff --git a/backend/app/modules/langgraph_nodes/judge.py b/backend/app/modules/langgraph_nodes/judge.py index 57100301..9613ad7f 100644 --- a/backend/app/modules/langgraph_nodes/judge.py +++ b/backend/app/modules/langgraph_nodes/judge.py @@ -19,12 +19,13 @@ from langchain_groq import ChatGroq from langchain.schema import HumanMessage from app.logging.logging_config import setup_logger +from app.llm_config import LLM_MODEL logger = setup_logger(__name__) # Init once groq_llm = ChatGroq( - model="gemma2-9b-it", + model=LLM_MODEL, temperature=0.0, max_tokens=10, ) diff --git a/backend/app/modules/langgraph_nodes/sentiment.py b/backend/app/modules/langgraph_nodes/sentiment.py index fef1d39d..68a76232 100644 --- a/backend/app/modules/langgraph_nodes/sentiment.py +++ b/backend/app/modules/langgraph_nodes/sentiment.py @@ -18,6 +18,7 @@ from groq import Groq from dotenv import load_dotenv from app.logging.logging_config import setup_logger +from app.llm_config import LLM_MODEL logger = setup_logger(__name__) @@ -49,7 +50,7 @@ def run_sentiment_sdk(state): ), }, ], - model="gemma2-9b-it", + model=LLM_MODEL, temperature=0.2, max_tokens=3, ) diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 70037f72..deb32a55 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -16,7 +16,7 @@ dependencies = [ "langchain-groq>=0.3.2", "langgraph>=0.4.8", "logging>=0.4.9.6", - "newspaper3k>=0.2.8", + "newspaper4k>=0.9.4.1", "nltk>=3.9.1", "pinecone>=7.3.0", "rake-nltk>=1.0.6", diff --git a/backend/uv.lock b/backend/uv.lock index fc1e19b5..138a1f1e 100644 --- a/backend/uv.lock +++ b/backend/uv.lock @@ -1,6 +1,10 @@ version = 1 revision = 2 requires-python = ">=3.13" +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version < '3.14'", +] [[package]] name = "aiohappyeyeballs" @@ -113,7 +117,7 @@ dependencies = [ { name = "langchain-groq" }, { name = "langgraph" }, { name = "logging" }, - { name = "newspaper3k" }, + { name = "newspaper4k" }, { name = "nltk" }, { name = "pinecone" }, { name = "rake-nltk" }, @@ -137,7 +141,7 @@ requires-dist = [ { name = "langchain-groq", specifier = ">=0.3.2" }, { name = "langgraph", specifier = ">=0.4.8" }, { name = "logging", specifier = ">=0.4.9.6" }, - { name = "newspaper3k", specifier = ">=0.2.8" }, + { name = "newspaper4k", specifier = ">=0.9.4.1" }, { name = "nltk", specifier = ">=3.9.1" }, { name = "pinecone", specifier = ">=7.3.0" }, { name = "rake-nltk", specifier = ">=1.0.6" }, @@ -161,6 +165,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload-time = "2025-04-15T17:05:12.221Z" }, ] +[[package]] +name = "brotli" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/16/c92ca344d646e71a43b8bb353f0a6490d7f6e06210f8554c8f874e454285/brotli-1.2.0.tar.gz", hash = "sha256:e310f77e41941c13340a95976fe66a8a95b01e783d430eeaf7a2f87e0a57dd0a", size = 7388632, upload-time = "2025-11-05T18:39:42.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/d4/4ad5432ac98c73096159d9ce7ffeb82d151c2ac84adcc6168e476bb54674/brotli-1.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9e5825ba2c9998375530504578fd4d5d1059d09621a02065d1b6bfc41a8e05ab", size = 861523, upload-time = "2025-11-05T18:38:34.67Z" }, + { url = "https://files.pythonhosted.org/packages/91/9f/9cc5bd03ee68a85dc4bc89114f7067c056a3c14b3d95f171918c088bf88d/brotli-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0cf8c3b8ba93d496b2fae778039e2f5ecc7cff99df84df337ca31d8f2252896c", size = 444289, upload-time = "2025-11-05T18:38:35.6Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b6/fe84227c56a865d16a6614e2c4722864b380cb14b13f3e6bef441e73a85a/brotli-1.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8565e3cdc1808b1a34714b553b262c5de5fbda202285782173ec137fd13709f", size = 1528076, upload-time = "2025-11-05T18:38:36.639Z" }, + { url = "https://files.pythonhosted.org/packages/55/de/de4ae0aaca06c790371cf6e7ee93a024f6b4bb0568727da8c3de112e726c/brotli-1.2.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:26e8d3ecb0ee458a9804f47f21b74845cc823fd1bb19f02272be70774f56e2a6", size = 1626880, upload-time = "2025-11-05T18:38:37.623Z" }, + { url = "https://files.pythonhosted.org/packages/5f/16/a1b22cbea436642e071adcaf8d4b350a2ad02f5e0ad0da879a1be16188a0/brotli-1.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67a91c5187e1eec76a61625c77a6c8c785650f5b576ca732bd33ef58b0dff49c", size = 1419737, upload-time = "2025-11-05T18:38:38.729Z" }, + { url = "https://files.pythonhosted.org/packages/46/63/c968a97cbb3bdbf7f974ef5a6ab467a2879b82afbc5ffb65b8acbb744f95/brotli-1.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ecdb3b6dc36e6d6e14d3a1bdc6c1057c8cbf80db04031d566eb6080ce283a48", size = 1484440, upload-time = "2025-11-05T18:38:39.916Z" }, + { url = "https://files.pythonhosted.org/packages/06/9d/102c67ea5c9fc171f423e8399e585dabea29b5bc79b05572891e70013cdd/brotli-1.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3e1b35d56856f3ed326b140d3c6d9db91740f22e14b06e840fe4bb1923439a18", size = 1593313, upload-time = "2025-11-05T18:38:41.24Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4a/9526d14fa6b87bc827ba1755a8440e214ff90de03095cacd78a64abe2b7d/brotli-1.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54a50a9dad16b32136b2241ddea9e4df159b41247b2ce6aac0b3276a66a8f1e5", size = 1487945, upload-time = "2025-11-05T18:38:42.277Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e8/3fe1ffed70cbef83c5236166acaed7bb9c766509b157854c80e2f766b38c/brotli-1.2.0-cp313-cp313-win32.whl", hash = "sha256:1b1d6a4efedd53671c793be6dd760fcf2107da3a52331ad9ea429edf0902f27a", size = 334368, upload-time = "2025-11-05T18:38:43.345Z" }, + { url = "https://files.pythonhosted.org/packages/ff/91/e739587be970a113b37b821eae8097aac5a48e5f0eca438c22e4c7dd8648/brotli-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:b63daa43d82f0cdabf98dee215b375b4058cce72871fd07934f179885aad16e8", size = 369116, upload-time = "2025-11-05T18:38:44.609Z" }, + { url = "https://files.pythonhosted.org/packages/17/e1/298c2ddf786bb7347a1cd71d63a347a79e5712a7c0cba9e3c3458ebd976f/brotli-1.2.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:6c12dad5cd04530323e723787ff762bac749a7b256a5bece32b2243dd5c27b21", size = 863080, upload-time = "2025-11-05T18:38:45.503Z" }, + { url = "https://files.pythonhosted.org/packages/84/0c/aac98e286ba66868b2b3b50338ffbd85a35c7122e9531a73a37a29763d38/brotli-1.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3219bd9e69868e57183316ee19c84e03e8f8b5a1d1f2667e1aa8c2f91cb061ac", size = 445453, upload-time = "2025-11-05T18:38:46.433Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f1/0ca1f3f99ae300372635ab3fe2f7a79fa335fee3d874fa7f9e68575e0e62/brotli-1.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:963a08f3bebd8b75ac57661045402da15991468a621f014be54e50f53a58d19e", size = 1528168, upload-time = "2025-11-05T18:38:47.371Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a6/2ebfc8f766d46df8d3e65b880a2e220732395e6d7dc312c1e1244b0f074a/brotli-1.2.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9322b9f8656782414b37e6af884146869d46ab85158201d82bab9abbcb971dc7", size = 1627098, upload-time = "2025-11-05T18:38:48.385Z" }, + { url = "https://files.pythonhosted.org/packages/f3/2f/0976d5b097ff8a22163b10617f76b2557f15f0f39d6a0fe1f02b1a53e92b/brotli-1.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cf9cba6f5b78a2071ec6fb1e7bd39acf35071d90a81231d67e92d637776a6a63", size = 1419861, upload-time = "2025-11-05T18:38:49.372Z" }, + { url = "https://files.pythonhosted.org/packages/9c/97/d76df7176a2ce7616ff94c1fb72d307c9a30d2189fe877f3dd99af00ea5a/brotli-1.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7547369c4392b47d30a3467fe8c3330b4f2e0f7730e45e3103d7d636678a808b", size = 1484594, upload-time = "2025-11-05T18:38:50.655Z" }, + { url = "https://files.pythonhosted.org/packages/d3/93/14cf0b1216f43df5609f5b272050b0abd219e0b54ea80b47cef9867b45e7/brotli-1.2.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1530af5c3c275b8524f2e24841cbe2599d74462455e9bae5109e9ff42e9361", size = 1593455, upload-time = "2025-11-05T18:38:51.624Z" }, + { url = "https://files.pythonhosted.org/packages/b3/73/3183c9e41ca755713bdf2cc1d0810df742c09484e2e1ddd693bee53877c1/brotli-1.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d2d085ded05278d1c7f65560aae97b3160aeb2ea2c0b3e26204856beccb60888", size = 1488164, upload-time = "2025-11-05T18:38:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/64/6a/0c78d8f3a582859236482fd9fa86a65a60328a00983006bcf6d83b7b2253/brotli-1.2.0-cp314-cp314-win32.whl", hash = "sha256:832c115a020e463c2f67664560449a7bea26b0c1fdd690352addad6d0a08714d", size = 339280, upload-time = "2025-11-05T18:38:54.02Z" }, + { url = "https://files.pythonhosted.org/packages/f5/10/56978295c14794b2c12007b07f3e41ba26acda9257457d7085b0bb3bb90c/brotli-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:e7c0af964e0b4e3412a0ebf341ea26ec767fa0b4cf81abb5e897c9338b5ad6a3", size = 375639, upload-time = "2025-11-05T18:38:55.67Z" }, +] + [[package]] name = "bs4" version = "0.0.2" @@ -355,27 +387,16 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164, upload-time = "2025-03-23T22:55:42.101Z" }, ] -[[package]] -name = "feedfinder2" -version = "0.0.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "beautifulsoup4" }, - { name = "requests" }, - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/35/82/1251fefec3bb4b03fd966c7e7f7a41c9fc2bb00d823a34c13f847fd61406/feedfinder2-0.0.4.tar.gz", hash = "sha256:3701ee01a6c85f8b865a049c30ba0b4608858c803fe8e30d1d289fdbe89d0efe", size = 3297, upload-time = "2016-01-25T15:09:17.492Z" } - [[package]] name = "feedparser" -version = "6.0.11" +version = "6.0.12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sgmllib3k" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ff/aa/7af346ebeb42a76bf108027fe7f3328bb4e57a3a96e53e21fd9ef9dd6dd0/feedparser-6.0.11.tar.gz", hash = "sha256:c9d0407b64c6f2a065d0ebb292c2b35c01050cc0dc33757461aaabdc4c4184d5", size = 286197, upload-time = "2023-12-10T16:03:20.854Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/79/db7edb5e77d6dfbc54d7d9df72828be4318275b2e580549ff45a962f6461/feedparser-6.0.12.tar.gz", hash = "sha256:64f76ce90ae3e8ef5d1ede0f8d3b50ce26bcce71dd8ae5e82b1cd2d4a5f94228", size = 286579, upload-time = "2025-09-10T13:33:59.486Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/d4/8c31aad9cc18f451c49f7f9cfb5799dadffc88177f7917bc90a66459b1d7/feedparser-6.0.11-py3-none-any.whl", hash = "sha256:0be7ee7b395572b19ebeb1d6aafb0028dee11169f1c934e0ed67d54992f4ad45", size = 81343, upload-time = "2023-12-10T16:03:19.484Z" }, + { url = "https://files.pythonhosted.org/packages/4e/eb/c96d64137e29ae17d83ad2552470bafe3a7a915e85434d9942077d7fd011/feedparser-6.0.12-py3-none-any.whl", hash = "sha256:6bbff10f5a52662c00a2e3f86a38928c37c48f77b3c511aedcd51de933549324", size = 81480, upload-time = "2025-09-10T13:33:58.022Z" }, ] [[package]] @@ -594,12 +615,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, ] -[[package]] -name = "jieba3k" -version = "0.35.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/cb/2c8332bcdc14d33b0bedd18ae0a4981a069c3513e445120da3c3f23a8aaa/jieba3k-0.35.1.zip", hash = "sha256:980a4f2636b778d312518066be90c7697d410dd5a472385f5afced71a2db1c10", size = 7423646, upload-time = "2014-11-15T05:47:47.978Z" } - [[package]] name = "jinja2" version = "3.1.6" @@ -760,7 +775,7 @@ name = "langgraph-checkpoint" version = "2.0.26" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "langchain-core", marker = "python_full_version < '4.0'" }, + { name = "langchain-core", marker = "python_full_version < '4'" }, { name = "ormsgpack" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c5/61/e2518ac9216a4e9f4efda3ac61595e3c9e9ac00833141c9688e8d56bd7eb/langgraph_checkpoint-2.0.26.tar.gz", hash = "sha256:2b800195532d5efb079db9754f037281225ae175f7a395523f4bf41223cbc9d6", size = 37874, upload-time = "2025-05-15T17:31:22.466Z" } @@ -973,27 +988,26 @@ wheels = [ ] [[package]] -name = "newspaper3k" -version = "0.2.8" +name = "newspaper4k" +version = "0.9.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beautifulsoup4" }, - { name = "cssselect" }, - { name = "feedfinder2" }, + { name = "brotli" }, { name = "feedparser" }, - { name = "jieba3k" }, - { name = "lxml" }, + { name = "lxml", extra = ["html-clean"] }, { name = "nltk" }, - { name = "pillow" }, + { name = "pillow", version = "11.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" }, + { name = "pillow", version = "12.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" }, { name = "python-dateutil" }, { name = "pyyaml" }, { name = "requests" }, - { name = "tinysegmenter" }, { name = "tldextract" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/fb/8f8525be0cafa48926e85b0c06a7cb3e2a892d340b8036f8c8b1b572df1c/newspaper3k-0.2.8.tar.gz", hash = "sha256:9f1bd3e1fb48f400c715abf875cc7b0a67b7ddcd87f50c9aeeb8fcbbbd9004fb", size = 205685, upload-time = "2018-09-28T04:58:23.53Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/cc/cf743a3d06b10907cec76a675fe0857445907ded0e64ec4624483c1467ce/newspaper4k-0.9.4.1.tar.gz", hash = "sha256:5b1a92dfb04d6d379f9484fad4ad44741deb9ac3d55a6c178badf2a0d4bba903", size = 3971874, upload-time = "2025-11-18T06:08:56.543Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/b9/51afecb35bb61b188a4b44868001de348a0e8134b4dfa00ffc191567c4b9/newspaper3k-0.2.8-py3-none-any.whl", hash = "sha256:44a864222633d3081113d1030615991c3dbba87239f6bbf59d91240f71a22e3e", size = 211132, upload-time = "2018-09-28T04:58:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/63/e8/7e6c6a6e626fec2ec25f7b69fa0c446d1ca8a7fad121b61f2672e5779b76/newspaper4k-0.9.4.1-py3-none-any.whl", hash = "sha256:fab18fdb0637da0ea2452e18c5986c4af2263ba3016ff684f1c522f696bd39bd", size = 306153, upload-time = "2025-11-18T06:08:54.9Z" }, ] [[package]] @@ -1226,6 +1240,9 @@ wheels = [ name = "pillow" version = "11.2.1" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.14'", +] sdist = { url = "https://files.pythonhosted.org/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6", size = 47026707, upload-time = "2025-04-12T17:50:03.289Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/36/9c/447528ee3776e7ab8897fe33697a7ff3f0475bb490c5ac1456a03dc57956/pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28", size = 3190098, upload-time = "2025-04-12T17:48:23.915Z" }, @@ -1252,6 +1269,67 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/67/32/32dc030cfa91ca0fc52baebbba2e009bb001122a1daa8b6a79ad830b38d3/pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681", size = 2417234, upload-time = "2025-04-12T17:49:08.399Z" }, ] +[[package]] +name = "pillow" +version = "12.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493, upload-time = "2025-10-15T18:22:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461, upload-time = "2025-10-15T18:22:27.286Z" }, + { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912, upload-time = "2025-10-15T18:22:28.751Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132, upload-time = "2025-10-15T18:22:30.641Z" }, + { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099, upload-time = "2025-10-15T18:22:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808, upload-time = "2025-10-15T18:22:34.337Z" }, + { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804, upload-time = "2025-10-15T18:22:36.402Z" }, + { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553, upload-time = "2025-10-15T18:22:38.066Z" }, + { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729, upload-time = "2025-10-15T18:22:39.769Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789, upload-time = "2025-10-15T18:22:41.437Z" }, + { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917, upload-time = "2025-10-15T18:22:43.152Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391, upload-time = "2025-10-15T18:22:44.753Z" }, + { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477, upload-time = "2025-10-15T18:22:46.838Z" }, + { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918, upload-time = "2025-10-15T18:22:48.399Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406, upload-time = "2025-10-15T18:22:49.905Z" }, + { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218, upload-time = "2025-10-15T18:22:51.587Z" }, + { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564, upload-time = "2025-10-15T18:22:53.215Z" }, + { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260, upload-time = "2025-10-15T18:22:54.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248, upload-time = "2025-10-15T18:22:56.605Z" }, + { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043, upload-time = "2025-10-15T18:22:58.53Z" }, + { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915, upload-time = "2025-10-15T18:23:00.582Z" }, + { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998, upload-time = "2025-10-15T18:23:02.627Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201, upload-time = "2025-10-15T18:23:04.709Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165, upload-time = "2025-10-15T18:23:06.46Z" }, + { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834, upload-time = "2025-10-15T18:23:08.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531, upload-time = "2025-10-15T18:23:10.121Z" }, + { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554, upload-time = "2025-10-15T18:23:12.14Z" }, + { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812, upload-time = "2025-10-15T18:23:13.962Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689, upload-time = "2025-10-15T18:23:15.562Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186, upload-time = "2025-10-15T18:23:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308, upload-time = "2025-10-15T18:23:18.971Z" }, + { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222, upload-time = "2025-10-15T18:23:20.909Z" }, + { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657, upload-time = "2025-10-15T18:23:23.077Z" }, + { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482, upload-time = "2025-10-15T18:23:25.005Z" }, + { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416, upload-time = "2025-10-15T18:23:27.009Z" }, + { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584, upload-time = "2025-10-15T18:23:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621, upload-time = "2025-10-15T18:23:32.06Z" }, + { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916, upload-time = "2025-10-15T18:23:34.71Z" }, + { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836, upload-time = "2025-10-15T18:23:36.967Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092, upload-time = "2025-10-15T18:23:38.573Z" }, + { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158, upload-time = "2025-10-15T18:23:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882, upload-time = "2025-10-15T18:23:42.434Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001, upload-time = "2025-10-15T18:23:44.29Z" }, + { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146, upload-time = "2025-10-15T18:23:46.065Z" }, + { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344, upload-time = "2025-10-15T18:23:47.898Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864, upload-time = "2025-10-15T18:23:49.607Z" }, + { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911, upload-time = "2025-10-15T18:23:51.351Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, +] + [[package]] name = "pinecone" version = "7.3.0" @@ -1262,7 +1340,7 @@ dependencies = [ { name = "pinecone-plugin-interface" }, { name = "python-dateutil" }, { name = "typing-extensions" }, - { name = "urllib3", marker = "python_full_version < '4.0'" }, + { name = "urllib3", marker = "python_full_version < '4'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fa/38/12731d4af470851b4963eba616605868a8599ef4df51c7b6c928e5f3166d/pinecone-7.3.0.tar.gz", hash = "sha256:307edc155621d487c20dc71b76c3ad5d6f799569ba42064190d03917954f9a7b", size = 235256, upload-time = "2025-06-27T20:03:51.498Z" } wheels = [ @@ -1527,14 +1605,14 @@ wheels = [ [[package]] name = "requests-file" -version = "2.1.0" +version = "3.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/97/bf44e6c6bd8ddbb99943baf7ba8b1a8485bcd2fe0e55e5708d7fee4ff1ae/requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658", size = 6891, upload-time = "2024-05-21T16:28:00.24Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/f8/5dc70102e4d337063452c82e1f0d95e39abfe67aa222ed8a5ddeb9df8de8/requests_file-3.0.1.tar.gz", hash = "sha256:f14243d7796c588f3521bd423c5dea2ee4cc730e54a3cac9574d78aca1272576", size = 6967, upload-time = "2025-10-20T18:56:42.279Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/25/dd878a121fcfdf38f52850f11c512e13ec87c2ea72385933818e5b6c15ce/requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c", size = 4244, upload-time = "2024-05-21T16:27:57.733Z" }, + { url = "https://files.pythonhosted.org/packages/e1/d5/de8f089119205a09da657ed4784c584ede8381a0ce6821212a6d4ca47054/requests_file-3.0.1-py2.py3-none-any.whl", hash = "sha256:d0f5eb94353986d998f80ac63c7f146a307728be051d4d1cd390dbdb59c10fa2", size = 4514, upload-time = "2025-10-20T18:56:41.184Z" }, ] [[package]] @@ -1629,7 +1707,8 @@ version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, - { name = "pillow" }, + { name = "pillow", version = "11.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" }, + { name = "pillow", version = "12.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" }, { name = "scikit-learn" }, { name = "scipy" }, { name = "torch" }, @@ -1747,12 +1826,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, ] -[[package]] -name = "tinysegmenter" -version = "0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/17/82/86982e4b6d16e4febc79c2a1d68ee3b707e8a020c5d2bc4af8052d0f136a/tinysegmenter-0.3.tar.gz", hash = "sha256:ed1f6d2e806a4758a73be589754384cbadadc7e1a414c81a166fc9adf2d40c6d", size = 16893, upload-time = "2017-07-23T11:18:29.85Z" } - [[package]] name = "tld" version = "0.13.1" From eec9a7e795f552fbcdcd14bbfa2afd1e78c5aa70 Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Mon, 29 Dec 2025 18:41:57 +0530 Subject: [PATCH 02/19] (feat): Replace GoogleSearch Tool with LangGraph Native DuckDuckGo Search Tool (fix): Implement new fact check subgraph (enhancement): sentiment analysis and fact check run parallely \n clean_text->extract_claims->plan_searches->execute_searches->verify_facts --- backend/app/modules/fact_check_tool.py | 166 ++++++++++++++++++ backend/app/modules/langgraph_builder.py | 38 ++-- .../app/modules/langgraph_nodes/sentiment.py | 68 ++++++- 3 files changed, 251 insertions(+), 21 deletions(-) create mode 100644 backend/app/modules/fact_check_tool.py diff --git a/backend/app/modules/fact_check_tool.py b/backend/app/modules/fact_check_tool.py new file mode 100644 index 00000000..b19f6c52 --- /dev/null +++ b/backend/app/modules/fact_check_tool.py @@ -0,0 +1,166 @@ +""" +fact checking tool node implementation to replace the google search + +""" + +import os +import json +import asyncio +from groq import Groq +from langchain_community.tools import DuckDuckGoSearchRun +from app.logging.logging_config import setup_logger +from dotenv import load_dotenv +from app.llm_config import LLM_MODEL + +load_dotenv() + +client = Groq(api_key=os.getenv("GROQ_API_KEY")) +search_tool = DuckDuckGoSearchRun() + +logger = setup_logger(__name__) + +async def extract_claims_node(state): + logger.info("--- Fact Check Step 1: Extracting Claims ---") + try: + text = state.get("cleaned_text", "") + + response = await asyncio.to_thread( + client.chat.completions.create, + messages=[ + { + "role": "system", + "content": "Extract specific, verifiable factual claims from the text. Ignore opinions. Return a simple list of strings, one per line." + }, + {"role": "user", "content": text[:4000]} + ], + model=LLM_MODEL, + temperature=0.0 + ) + + raw_content = response.choices[0].message.content + + claims = [line.strip("- *") for line in raw_content.split("\n") if len(line.strip()) > 10] + + logger.info(f"Extracted {len(claims)} claims.") + return {"claims": claims} + + except Exception as e: + logger.error(f"Error extraction claims: {e}") + return {"claims": []} + +async def plan_searches_node(state): + logger.info("--- Fact Check Step 2: Planning Searches ---") + claims = state.get("claims", []) + + if not claims: + return {"search_queries": []} + + claims_text = "\n".join([f"{i}. {c}" for i, c in enumerate(claims)]) + + prompt = f""" + You are a search query generator. + For each claim, generate a search query to verify it. + + Output MUST be valid JSON in this format: + {{ + "searches": [ + {{"query": "search query 1", "claim_id": 0}}, + {{"query": "search query 2", "claim_id": 1}} + ] + }} + + Claims: + {claims_text} + """ + + try: + response = await asyncio.to_thread( + client.chat.completions.create, + messages=[{"role": "user", "content": prompt}], + model=LLM_MODEL, + temperature=0.0, + response_format={"type": "json_object"} + ) + + plan_json = json.loads(response.choices[0].message.content) + queries = plan_json.get("searches", []) + + return {"search_queries": queries} + + except Exception as e: + logger.error(f"Failed to plan searches: {e}") + return {"search_queries": []} + +async def execute_searches_node(state): + logger.info("--- Fact Check Step 3: Executing Parallel Searches ---") + queries = state.get("search_queries", []) + + if not queries: + return {"search_results": []} + + async def run_one_search(q): + try: + query_str = q.get("query") + c_id = q.get("claim_id") + + res = await asyncio.to_thread(search_tool.invoke, query_str) + logger.info(f"Search Result for Claim {c_id}: {res[:200]}...") + return {"claim_id": c_id, "result": res} + except Exception as e: + return {"claim_id": q.get("claim_id"), "result": "Search failed"} + + results = await asyncio.gather(*[run_one_search(q) for q in queries]) + + logger.info(f"Completed {len(results)} searches.") + return {"search_results": results} + +async def verify_facts_node(state): + logger.info("--- Fact Check Step 4: Verifying Facts ---") + claims = state.get("claims", []) + results = state.get("search_results", []) + + if not claims: + return {"facts": [], "fact_check_done": True} + + context = "Verify these claims based on the search results:\n" + for item in results: + c_id = item["claim_id"] + if c_id < len(claims): + context += f"\nClaim: {claims[c_id]}\nEvidence: {item['result']}\n" + + try: + response = await asyncio.to_thread( + client.chat.completions.create, + messages=[ + { + "role": "system", + "content": "You are a strict fact checker. Return a JSON list of objects with keys: 'claim', 'status' (True/False/Unverified), and 'reason'." + }, + {"role": "user", "content": context} + ], + model=LLM_MODEL, + temperature=0.0, + response_format={"type": "json_object"} + ) + + final_verdict_str = response.choices[0].message.content + + data = json.loads(final_verdict_str) + + facts_list = [] + if isinstance(data, dict): + # Look for common keys if wrapped + if "facts" in data: + facts_list = data["facts"] + elif "verified_claims" in data: + facts_list = data["verified_claims"] + else: + facts_list = [data] + elif isinstance(data, list): + facts_list = data + + return {"facts": facts_list, "fact_check_done": True} + + except Exception as e: + logger.error(f"Verification failed: {e}") + return {"facts": [], "fact_check_done": True} \ No newline at end of file diff --git a/backend/app/modules/langgraph_builder.py b/backend/app/modules/langgraph_builder.py index 7729f945..b219e115 100644 --- a/backend/app/modules/langgraph_builder.py +++ b/backend/app/modules/langgraph_builder.py @@ -6,12 +6,12 @@ and retry logic. Workflow: - 1. Sentiment analysis on the cleaned text. - 2. Fact-checking detected claims. - 3. Generating a counter-perspective. - 4. Judging the quality of the generated perspective. - 5. Storing results and sending them downstream. - 6. Error handling at any step if failures occur. + 1. Parallel analysis: sentiment analysis and fact checking tool pipeline + (extract_claims -> plan_searches -> execute_searches -> verify_facts) + 2. Generating a counter-perspective. + 3. Judging the quality of the generated perspective. + 4. Storing results and sending. + 5. Error handling at any step if failures occur. Core Features: - Uses a TypedDict (`MyState`) to define the shape of the pipeline's @@ -31,18 +31,18 @@ """ +from typing import List, Any from langgraph.graph import StateGraph +from typing_extensions import TypedDict + from app.modules.langgraph_nodes import ( sentiment, - fact_check, generate_perspective, judge, store_and_send, error_handler, ) -from typing_extensions import TypedDict - class MyState(TypedDict): cleaned_text: str @@ -52,29 +52,26 @@ class MyState(TypedDict): score: int retries: int status: str + claims: List[str] + search_queries: List[Any] + search_results: List[Any] def build_langgraph(): graph = StateGraph(MyState) - graph.add_node("sentiment_analysis", sentiment.run_sentiment_sdk) - graph.add_node("fact_checking", fact_check.run_fact_check) + # parallel analysis runs sentiment and fact_check tool pipeline in parallel + graph.add_node("parallel_analysis", sentiment.run_parallel_analysis) + graph.add_node("generate_perspective", generate_perspective.generate_perspective) graph.add_node("judge_perspective", judge.judge_perspective) graph.add_node("store_and_send", store_and_send.store_and_send) graph.add_node("error_handler", error_handler.error_handler) - graph.set_entry_point( - "sentiment_analysis", - ) + graph.set_entry_point("parallel_analysis") graph.add_conditional_edges( - "sentiment_analysis", - lambda x: ("error_handler" if x.get("status") == "error" else "fact_checking"), - ) - - graph.add_conditional_edges( - "fact_checking", + "parallel_analysis", lambda x: ( "error_handler" if x.get("status") == "error" else "generate_perspective" ), @@ -101,6 +98,7 @@ def build_langgraph(): else "store_and_send" ), ) + graph.add_conditional_edges( "store_and_send", lambda x: ("error_handler" if x.get("status") == "error" else "__end__"), diff --git a/backend/app/modules/langgraph_nodes/sentiment.py b/backend/app/modules/langgraph_nodes/sentiment.py index 68a76232..0726e061 100644 --- a/backend/app/modules/langgraph_nodes/sentiment.py +++ b/backend/app/modules/langgraph_nodes/sentiment.py @@ -11,14 +11,19 @@ Functions: run_sentiment_sdk(state: dict) -> dict: Analyzes sentiment and updates the state with the result. + + run_parallel_analysis(state: dict) -> dict: + Runs sentiment analysis and fact-checking tool nodes in parallel. + Combines claims, search_queries, search_results, and facts into state. """ - +import asyncio import os from groq import Groq from dotenv import load_dotenv from app.logging.logging_config import setup_logger from app.llm_config import LLM_MODEL +from app.modules import fact_check_tool logger = setup_logger(__name__) @@ -27,6 +32,67 @@ client = Groq(api_key=os.getenv("GROQ_API_KEY")) +async def run_parallel_analysis(state): + """ + The fact-checking pipeline runs sequentially: + extract_claims -> plan_searches -> execute_searches -> verify_facts + """ + async def run_fact_check_pipeline(state): + try: + claims_result = await fact_check_tool.extract_claims_node(state) + current_state = {**state, **claims_result} + searches_result = await fact_check_tool.plan_searches_node(current_state) + current_state = {**current_state, **searches_result} + + exec_result = await fact_check_tool.execute_searches_node(current_state) + current_state = {**current_state, **exec_result} + verify_result = await fact_check_tool.verify_facts_node(current_state) + current_state = {**current_state, **verify_result} + + return { + "claims": current_state.get("claims", []), + "search_queries": current_state.get("search_queries", []), + "search_results": current_state.get("search_results", []), + "facts": current_state.get("facts", []), + "status": "success" + } + except Exception as e: + logger.exception(f"Error in fact_check_pipeline: {e}") + return { + "status": "error", + "error_from": "fact_checking", + "message": str(e) + } + + sentiment_task = asyncio.to_thread(run_sentiment_sdk, state) + fact_check_task = run_fact_check_pipeline(state) + + sentiment_result, fact_check_result = await asyncio.gather( + sentiment_task, fact_check_task + ) + if sentiment_result.get("status") == "error": + return { + "status": "error", + "error_from": sentiment_result.get("error_from", "sentiment_analysis"), + "message": sentiment_result.get("message", "Unknown error") + } + if fact_check_result.get("status") == "error": + return { + "status": "error", + "error_from": fact_check_result.get("error_from", "fact_checking"), + "message": fact_check_result.get("message", "Unknown error") + } + + return { + **state, + "sentiment": sentiment_result.get("sentiment"), + "claims": fact_check_result.get("claims", []), + "search_queries": fact_check_result.get("search_queries", []), + "search_results": fact_check_result.get("search_results", []), + "facts": fact_check_result.get("facts", []), + "status": "success" + } + def run_sentiment_sdk(state): try: text = state.get("cleaned_text") From b48af96deb93629ae46d70f7e30faea7a0d8bd43 Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Mon, 29 Dec 2025 18:43:54 +0530 Subject: [PATCH 03/19] docs: minor fix in env variables needed to setup --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 90ac0e13..c9c47883 100644 --- a/README.md +++ b/README.md @@ -167,6 +167,7 @@ GROQ_API_KEY= PINECONE_API_KEY = PORT = 8000 SEARCH_KEY = +HF_TOKEN = ``` *Run backend:* From f963b9747520c68ace554a4a81dbd14aa91adf98 Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Mon, 29 Dec 2025 18:47:47 +0530 Subject: [PATCH 04/19] (refactor): Now Graph runs asynchronously due to parallel executing nodes i.e sentiment node and fact check node (chore): /process route awaits langgraph build compile --- backend/app/modules/pipeline.py | 5 +++-- backend/app/routes/routes.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/app/modules/pipeline.py b/backend/app/modules/pipeline.py index 3e4a844e..1c81d57c 100644 --- a/backend/app/modules/pipeline.py +++ b/backend/app/modules/pipeline.py @@ -38,6 +38,7 @@ from app.modules.langgraph_builder import build_langgraph from app.logging.logging_config import setup_logger import json +import asyncio logger = setup_logger(__name__) @@ -64,8 +65,8 @@ def run_scraper_pipeline(url: str) -> dict: return result -def run_langgraph_workflow(state: dict): +async def run_langgraph_workflow(state: dict): """Execute the pre-compiled LangGraph workflow.""" - result = _LANGGRAPH_WORKFLOW.invoke(state) + result = await _LANGGRAPH_WORKFLOW.ainvoke(state) logger.info("LangGraph workflow executed successfully.") return result diff --git a/backend/app/routes/routes.py b/backend/app/routes/routes.py index 6988f5e8..f9f01c7b 100644 --- a/backend/app/routes/routes.py +++ b/backend/app/routes/routes.py @@ -71,7 +71,7 @@ async def bias_detection(request: URlRequest): async def run_pipelines(request: URlRequest): article_text = await asyncio.to_thread(run_scraper_pipeline, (request.url)) logger.debug(f"Scraper output: {json.dumps(article_text, indent=2, ensure_ascii=False)}") - data = await asyncio.to_thread(run_langgraph_workflow, (article_text)) + data = await run_langgraph_workflow(article_text) return data From 0bc84ccd69b586592afa5be13c7efa391d923b2b Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Mon, 29 Dec 2025 18:52:21 +0530 Subject: [PATCH 05/19] fix: update chunk_rag_data to handle dynamic keys and prevent crashes - Updated chunk_rag_data.py to support both new (claim, status) and old (original_claim, erdict) key formats from the fact-checker. - Added logic to correctly parse perspective whether it is a Pydantic model or a dict. - implemented skipping of malformed facts instead of raising valueErr. - compatibility with the new parallel DuckDuckGo fact-checking workflow. --- backend/app/modules/chat/get_rag_data.py | 2 +- .../modules/vector_store/chunk_rag_data.py | 98 ++++++++++--------- 2 files changed, 54 insertions(+), 46 deletions(-) diff --git a/backend/app/modules/chat/get_rag_data.py b/backend/app/modules/chat/get_rag_data.py index 092e4587..23f9a37c 100644 --- a/backend/app/modules/chat/get_rag_data.py +++ b/backend/app/modules/chat/get_rag_data.py @@ -31,7 +31,7 @@ load_dotenv() -pc = Pinecone(os.getenv("PINECONE_API_KEY")) +pc = Pinecone(api_key=os.getenv("PINECONE_API_KEY")) index = pc.Index("perspective") diff --git a/backend/app/modules/vector_store/chunk_rag_data.py b/backend/app/modules/vector_store/chunk_rag_data.py index 7e2a32eb..00b40d12 100644 --- a/backend/app/modules/vector_store/chunk_rag_data.py +++ b/backend/app/modules/vector_store/chunk_rag_data.py @@ -32,71 +32,79 @@ def chunk_rag_data(data): try: - # Validate required top-level fields required_fields = ["cleaned_text", "perspective", "facts"] for field in required_fields: if field not in data: - raise ValueError(f"Missing required field: {field}") + if field == "facts": + data["facts"] = [] + else: + raise ValueError(f"Missing required field: {field}") if not isinstance(data["facts"], list): - raise ValueError("Facts must be a list") - - # Validate perspective structure - perspective_data = data["perspective"] - if hasattr(perspective_data, "dict"): - perspective_data = perspective_data.dict() + logger.warning("Facts is not a list. Treating as empty.") + data["facts"] = [] article_id = generate_id(data["cleaned_text"]) chunks = [] - # Add counter-perspective chunk - perspective_obj = data["perspective"] - - # Optional safety check + perspective_data = data["perspective"] + + if hasattr(perspective_data, "dict"): + p_data = perspective_data.dict() + elif hasattr(perspective_data, "model_dump"): + p_data = perspective_data.model_dump() + elif isinstance(perspective_data, dict): + p_data = perspective_data + else: + p_data = { + "perspective": getattr(perspective_data, "perspective", ""), + "reasoning": getattr(perspective_data, "reasoning", "") + } - if not ( - hasattr(perspective_obj, "perspective") - and hasattr(perspective_obj, "reasoning") - ): - raise ValueError("Perspective object missing required fields") + p_text = p_data.get("perspective", "") + raw_reasoning = p_data.get("reasoning", "") + if isinstance(raw_reasoning, list): + p_reason = "\n".join(raw_reasoning) + else: + p_reason = str(raw_reasoning) - chunks.append( - { + if p_text: + chunks.append({ "id": f"{article_id}-perspective", - "text": perspective_obj.perspective, + "text": p_text, "metadata": { "type": "counter-perspective", - "reasoning": perspective_obj.reasoning, + "reasoning": p_reason, "article_id": article_id, }, - } - ) + }) - # Add each fact as a separate chunk for i, fact in enumerate(data["facts"]): - fact_fields = ["original_claim", "verdict", "explanation", "source_link"] - for field in fact_fields: - if field not in fact: - raise ValueError( - f"Missing required fact field: {field} in fact index {i}" - ) - - chunks.append( - { - "id": f"{article_id}-fact-{i}", - "text": fact["original_claim"], - "metadata": { - "type": "fact", - "verdict": fact["verdict"], - "explanation": fact["explanation"], - "source_link": fact["source_link"], - "article_id": article_id, - }, - } - ) + claim_text = fact.get("claim", fact.get("original_claim", "")) + verdict = fact.get("status", fact.get("verdict", "Unverified")) + explanation = fact.get("reason", fact.get("explanation", "No explanation provided")) + source = fact.get("source_link", "N/A") + + # SKIP invalid facts instead of Crashing + if not claim_text: + logger.warning(f"Skipping fact index {i}: Missing claim text.") + continue + + chunks.append({ + "id": f"{article_id}-fact-{i}", + "text": claim_text, + "metadata": { + "type": "fact", + "verdict": verdict, + "explanation": explanation, + "source_link": source, + "article_id": article_id, + }, + }) + logger.info(f"Generated {len(chunks)} chunks for storage.") return chunks except Exception as e: logger.exception(f"Failed to chunk the data: {e}") - raise + return [] \ No newline at end of file From ef1f0bc3b02c7daf890a6669497807f7cfa29909 Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Mon, 29 Dec 2025 18:55:27 +0530 Subject: [PATCH 06/19] fix: updated schema and fact parsing in generate_perspective -'PerspectiveOutput' pydantic model to handle reasoning as a list for claims --- .../langgraph_nodes/generate_perspective.py | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/backend/app/modules/langgraph_nodes/generate_perspective.py b/backend/app/modules/langgraph_nodes/generate_perspective.py index e79d2a35..605b63dc 100644 --- a/backend/app/modules/langgraph_nodes/generate_perspective.py +++ b/backend/app/modules/langgraph_nodes/generate_perspective.py @@ -25,7 +25,7 @@ from langchain_groq import ChatGroq from pydantic import BaseModel, Field from app.logging.logging_config import setup_logger - +from typing import List logger = setup_logger(__name__) @@ -33,7 +33,7 @@ class PerspectiveOutput(BaseModel): - reasoning: str = Field(..., description="Chain-of-thought reasoning steps") + reasoning: List[str] = Field(description="Chain-of-thought reasoning steps", alias="reasoning_steps") perspective: str = Field(..., description="Generated opposite perspective") @@ -57,17 +57,18 @@ def generate_perspective(state): if not text: raise ValueError("Missing or empty 'cleaned_text' in state") - elif not facts: - raise ValueError("Missing or empty 'facts' in state") - - facts_str = "\n".join( - [ - f"Claim: {f['original_claim']}\n" - "Verdict: {f['verdict']}\nExplanation: " - "{f['explanation']}" - for f in state["facts"] - ] - ) + if not facts: + logger.warning("No facts found in state. Generating perspective based on text only.") + facts_str = "No specific claims verified." + else: + facts_str = "\n".join( + [ + f"Claim: {f.get('claim', f.get('original_claim', 'Unknown Claim'))}\n" + f"Verdict: {f.get('status', f.get('verdict', 'Unknown Verdict'))}\n" + f"Explanation: {f.get('reason', f.get('explanation', 'No explanation'))}" + for f in facts + ] + ) result = chain.invoke( { From 32beeb8112c245bec6271fd7d4eab44eb21b67ee Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Sun, 25 Jan 2026 12:15:00 +0530 Subject: [PATCH 07/19] chore(backend): update dependencies for NLTK and FastAPI compatibility --- backend/pyproject.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/pyproject.toml b/backend/pyproject.toml index deb32a55..7e2894e6 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -9,7 +9,6 @@ dependencies = [ "dotenv>=0.9.9", "duckduckgo-search>=8.0.4", "fastapi>=0.115.12", - "google-search-results>=2.4.2", "groq>=0.28.0", "langchain>=0.3.25", "langchain-community>=0.3.25", @@ -17,7 +16,7 @@ dependencies = [ "langgraph>=0.4.8", "logging>=0.4.9.6", "newspaper4k>=0.9.4.1", - "nltk>=3.9.1", + "nltk>=3.9.1", #should remove this in next PR as this is not needed "pinecone>=7.3.0", "rake-nltk>=1.0.6", "readability-lxml>=0.8.4.1", From 938853ad3e65022547d5882ca8e08b72ac3e94e8 Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Sun, 25 Jan 2026 13:45:00 +0530 Subject: [PATCH 08/19] chore(config): update tailwind config and add static assets --- frontend/assets/BiasDetectionBG.png | Bin 0 -> 49929 bytes frontend/assets/DeepResearchBG.png | Bin 0 -> 41667 bytes frontend/assets/FactCheckBG.png | Bin 0 -> 47735 bytes frontend/assets/OwnKeysBG.png | Bin 0 -> 32954 bytes frontend/assets/chatai.svg | 10 ++ frontend/assets/dropdown.svg | 3 + frontend/assets/newchaticon.svg | 6 + frontend/assets/sendbtn.svg | 3 + frontend/assets/settingsicon.svg | 4 + frontend/tailwind.config.ts | 188 +++++++++++++++------------- 10 files changed, 130 insertions(+), 84 deletions(-) create mode 100644 frontend/assets/BiasDetectionBG.png create mode 100644 frontend/assets/DeepResearchBG.png create mode 100644 frontend/assets/FactCheckBG.png create mode 100644 frontend/assets/OwnKeysBG.png create mode 100644 frontend/assets/chatai.svg create mode 100644 frontend/assets/dropdown.svg create mode 100644 frontend/assets/newchaticon.svg create mode 100644 frontend/assets/sendbtn.svg create mode 100644 frontend/assets/settingsicon.svg diff --git a/frontend/assets/BiasDetectionBG.png b/frontend/assets/BiasDetectionBG.png new file mode 100644 index 0000000000000000000000000000000000000000..028611013cac0eba88afb852f5c0cf16f16dbbf0 GIT binary patch literal 49929 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 literal 0 HcmV?d00001 diff --git a/frontend/assets/DeepResearchBG.png b/frontend/assets/DeepResearchBG.png new file mode 100644 index 0000000000000000000000000000000000000000..9801533c643fe44f166eb9dc115fda3dc0343cf8 GIT binary patch literal 41667 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 literal 0 HcmV?d00001 diff --git a/frontend/assets/FactCheckBG.png b/frontend/assets/FactCheckBG.png new file mode 100644 index 0000000000000000000000000000000000000000..565810d1bccc2dceb64a2d42b40bcdf2e4777306 GIT binary patch literal 47735 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

HCUr2=%6 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 KQM^XfDCB=V`0?EU literal 0 HcmV?d00001 diff --git a/frontend/assets/OwnKeysBG.png b/frontend/assets/OwnKeysBG.png new file mode 100644 index 0000000000000000000000000000000000000000..5aee635a40a331b2fb0b1e7d7ad9718fe2618f9a GIT binary patch literal 32954 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 + + + + + + + + + diff --git a/frontend/assets/dropdown.svg b/frontend/assets/dropdown.svg new file mode 100644 index 00000000..8a29fea7 --- /dev/null +++ b/frontend/assets/dropdown.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/assets/newchaticon.svg b/frontend/assets/newchaticon.svg new file mode 100644 index 00000000..45c966b2 --- /dev/null +++ b/frontend/assets/newchaticon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/frontend/assets/sendbtn.svg b/frontend/assets/sendbtn.svg new file mode 100644 index 00000000..1073563c --- /dev/null +++ b/frontend/assets/sendbtn.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/assets/settingsicon.svg b/frontend/assets/settingsicon.svg new file mode 100644 index 00000000..eca0fb37 --- /dev/null +++ b/frontend/assets/settingsicon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/tailwind.config.ts b/frontend/tailwind.config.ts index 8d7ff663..3f2a9202 100644 --- a/frontend/tailwind.config.ts +++ b/frontend/tailwind.config.ts @@ -1,96 +1,116 @@ import type { Config } from "tailwindcss"; const config: Config = { - darkMode: ["class"], - content: [ + darkMode: ["class"], + content: [ "./pages/**/*.{js,ts,jsx,tsx,mdx}", "./components/**/*.{js,ts,jsx,tsx,mdx}", "./app/**/*.{js,ts,jsx,tsx,mdx}", - "*.{js,ts,jsx,tsx,mdx}" ], theme: { - extend: { - colors: { - background: 'hsl(var(--background))', - foreground: 'hsl(var(--foreground))', - card: { - DEFAULT: 'hsl(var(--card))', - foreground: 'hsl(var(--card-foreground))' - }, - popover: { - DEFAULT: 'hsl(var(--popover))', - foreground: 'hsl(var(--popover-foreground))' - }, - primary: { - DEFAULT: 'hsl(var(--primary))', - foreground: 'hsl(var(--primary-foreground))' - }, - secondary: { - DEFAULT: 'hsl(var(--secondary))', - foreground: 'hsl(var(--secondary-foreground))' - }, - muted: { - DEFAULT: 'hsl(var(--muted))', - foreground: 'hsl(var(--muted-foreground))' - }, - accent: { - DEFAULT: 'hsl(var(--accent))', - foreground: 'hsl(var(--accent-foreground))' - }, - destructive: { - DEFAULT: 'hsl(var(--destructive))', - foreground: 'hsl(var(--destructive-foreground))' - }, - border: 'hsl(var(--border))', - input: 'hsl(var(--input))', - ring: 'hsl(var(--ring))', - chart: { - '1': 'hsl(var(--chart-1))', - '2': 'hsl(var(--chart-2))', - '3': 'hsl(var(--chart-3))', - '4': 'hsl(var(--chart-4))', - '5': 'hsl(var(--chart-5))' - }, - sidebar: { - DEFAULT: 'hsl(var(--sidebar-background))', - foreground: 'hsl(var(--sidebar-foreground))', - primary: 'hsl(var(--sidebar-primary))', - 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))', - accent: 'hsl(var(--sidebar-accent))', - 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))', - border: 'hsl(var(--sidebar-border))', - ring: 'hsl(var(--sidebar-ring))' - } - }, - borderRadius: { - lg: 'var(--radius)', - md: 'calc(var(--radius) - 2px)', - sm: 'calc(var(--radius) - 4px)' - }, - keyframes: { - 'accordion-down': { - from: { - height: '0' - }, - to: { - height: 'var(--radix-accordion-content-height)' - } - }, - 'accordion-up': { - from: { - height: 'var(--radix-accordion-content-height)' - }, - to: { - height: '0' - } - } - }, - animation: { - 'accordion-down': 'accordion-down 0.2s ease-out', - 'accordion-up': 'accordion-up 0.2s ease-out' - } - } + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + blue: "#2B75FF", + dark: "#0E34BD", + darker: "#041EA7", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + // Custom Perspective Colors + "background-dark": "#0B0F16", + "background-card": "#1B1F24", + "background-button": "#232830", + "border-light": "rgba(255, 255, 255, 0.2)", + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + card: "22.339px", + button: "15px", + search: "40px", + nav: "30px", + }, + fontFamily: { + sora: ["Sora", "sans-serif"], + }, + fontSize: { + hero: "64px", + section: "40px", + subsection: "32px", + card: "14.361px", + body: "16px", + small: "11.967px", + }, + letterSpacing: { + tight: "-1.8px", + tighter: "-1.2px", + normal: "0", + }, + boxShadow: { + card: "inset -3.989px -7.18px 8.776px 0px rgba(0,0,0,0.15), inset 0.798px 0.798px 0.798px 0px rgba(255,255,255,0.1)", + }, + backgroundImage: { + "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", + "hero-gradient": + "url('data:image/svg+xml;utf8,')", + "card-gradient": + "linear-gradient(146.985deg, rgb(36, 41, 48) 2.1855%, rgb(19, 24, 31) 92.514%)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + }, }, plugins: [require("tailwindcss-animate")], }; + export default config; From fd52659ac3cd14e2934f5fb24989d9c6b600a7c7 Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Sun, 25 Jan 2026 15:30:00 +0530 Subject: [PATCH 09/19] feat(ai): refine prompt templates for perspective generation --- backend/app/utils/prompt_templates.py | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/app/utils/prompt_templates.py b/backend/app/utils/prompt_templates.py index f8caaa8b..ae469f90 100644 --- a/backend/app/utils/prompt_templates.py +++ b/backend/app/utils/prompt_templates.py @@ -47,6 +47,7 @@ ```json {{ + "short_title": "", "counter_perspective": "", "reasoning_steps": [ "", From c15403cd02d71dd67a3308eae51602346d9480eb Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Sun, 25 Jan 2026 16:50:00 +0530 Subject: [PATCH 10/19] fix(backend): optimize fact check utility functions for thread safety --- backend/app/utils/fact_check_utils.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/backend/app/utils/fact_check_utils.py b/backend/app/utils/fact_check_utils.py index e7cc7a62..cdfc76a8 100644 --- a/backend/app/utils/fact_check_utils.py +++ b/backend/app/utils/fact_check_utils.py @@ -44,13 +44,17 @@ def run_fact_check_pipeline(state): result = run_claim_extractor_sdk(state) - if state.get("status") != "success": + if result.get("status") != "success": logger.error("āŒ Claim extraction failed.") return [], "Claim extraction failed." # Step 1: Extract claims raw_output = result.get("verifiable_claims", "") claims = re.findall(r"^[\*\-•]\s+(.*)", raw_output, re.MULTILINE) + + if not claims and raw_output: + claims = [line.strip() for line in raw_output.split('\n') if len(line.strip()) > 10] + claims = [claim.strip() for claim in claims if claim.strip()] logger.info(f"🧠 Extracted claims: {claims}") @@ -60,7 +64,7 @@ def run_fact_check_pipeline(state): # Step 2: Search each claim with polite delay search_results = [] for claim in claims: - logger.info(f"\nšŸ” Searching for claim: {claim}") + logger.info(f"\nSearching for claim: {claim}") try: results = search_google(claim) if results: From 27efddf894f3d6fa85706d0e9b389d5b7774c53e Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Sun, 25 Jan 2026 18:10:00 +0530 Subject: [PATCH 11/19] feat(ai): implement core perspective generation node logic --- backend/app/modules/langgraph_nodes/generate_perspective.py | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/app/modules/langgraph_nodes/generate_perspective.py b/backend/app/modules/langgraph_nodes/generate_perspective.py index 605b63dc..bf67362f 100644 --- a/backend/app/modules/langgraph_nodes/generate_perspective.py +++ b/backend/app/modules/langgraph_nodes/generate_perspective.py @@ -33,6 +33,7 @@ class PerspectiveOutput(BaseModel): + short_title: str = Field(..., description="A catchy, concise title for this analysis (max 10 words)") reasoning: List[str] = Field(description="Chain-of-thought reasoning steps", alias="reasoning_steps") perspective: str = Field(..., description="Generated opposite perspective") From cad3477a1916e5bbce4d1a4a96e97a8cb60c7b20 Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Sun, 25 Jan 2026 20:20:00 +0530 Subject: [PATCH 12/19] feat(ai): update graph builder to include new perspective nodes --- backend/app/modules/langgraph_builder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/app/modules/langgraph_builder.py b/backend/app/modules/langgraph_builder.py index b219e115..69f2ac3d 100644 --- a/backend/app/modules/langgraph_builder.py +++ b/backend/app/modules/langgraph_builder.py @@ -49,6 +49,7 @@ class MyState(TypedDict): facts: list[dict] sentiment: str perspective: str + short_title: str score: int retries: int status: str From a568e484ef97fbdcebe1b908162869abfb443c7e Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Mon, 26 Jan 2026 13:15:00 +0530 Subject: [PATCH 13/19] feat(landing): implement navbar, footer, and hero components --- frontend/components/landing/Button.tsx | 24 +++++++++++++++++++++ frontend/components/landing/Footer.tsx | 15 +++++++++++++ frontend/components/landing/HeroSection.tsx | 24 +++++++++++++++++++++ frontend/components/landing/Navbar.tsx | 15 +++++++++++++ 4 files changed, 78 insertions(+) create mode 100644 frontend/components/landing/Button.tsx create mode 100644 frontend/components/landing/Footer.tsx create mode 100644 frontend/components/landing/HeroSection.tsx create mode 100644 frontend/components/landing/Navbar.tsx diff --git a/frontend/components/landing/Button.tsx b/frontend/components/landing/Button.tsx new file mode 100644 index 00000000..7bd67e3d --- /dev/null +++ b/frontend/components/landing/Button.tsx @@ -0,0 +1,24 @@ +"use client"; + +import React from "react"; + +interface ButtonProps { + children: React.ReactNode; + size?: "default" | "large"; + onClick?: () => void; +} + +export default function Button({ children, size = "default", onClick }: ButtonProps) { + const sizeClasses = size === "large" + ? "px-[27.197px] py-[6.217px] text-[18.65px] tracking-[-0.9325px]" + : "px-[35px] py-[8px] text-[24px] tracking-tighter"; + + return ( + + ); +} diff --git a/frontend/components/landing/Footer.tsx b/frontend/components/landing/Footer.tsx new file mode 100644 index 00000000..24410635 --- /dev/null +++ b/frontend/components/landing/Footer.tsx @@ -0,0 +1,15 @@ +import React from "react"; + +export default function Footer() { + return ( +

+ ); +} diff --git a/frontend/components/landing/HeroSection.tsx b/frontend/components/landing/HeroSection.tsx new file mode 100644 index 00000000..6080fad5 --- /dev/null +++ b/frontend/components/landing/HeroSection.tsx @@ -0,0 +1,24 @@ +import React from "react"; +import SearchBar from "./SearchBar"; + +export default function HeroSection() { + return ( +
+
+

+ Uncover Hidden +
+ Perspectives +

+ +

+ Combat bias and one-sided narratives with AI-researched alternative perspectives. +

+
+ +
+ +
+
+ ); +} diff --git a/frontend/components/landing/Navbar.tsx b/frontend/components/landing/Navbar.tsx new file mode 100644 index 00000000..24fb1922 --- /dev/null +++ b/frontend/components/landing/Navbar.tsx @@ -0,0 +1,15 @@ +import React from "react"; +import Button from "./Button"; + +export default function Navbar() { + return ( +
+ +
+ ); +} From 8710410eb210dd62b6bca307e8587a131c8a0711 Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Mon, 26 Jan 2026 14:45:00 +0530 Subject: [PATCH 14/19] feat(landing): add features showcase with isometric card design --- frontend/components/landing/FeatureCard.tsx | 39 +++++++++++++ .../components/landing/FeaturesSection.tsx | 56 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 frontend/components/landing/FeatureCard.tsx create mode 100644 frontend/components/landing/FeaturesSection.tsx diff --git a/frontend/components/landing/FeatureCard.tsx b/frontend/components/landing/FeatureCard.tsx new file mode 100644 index 00000000..13eade40 --- /dev/null +++ b/frontend/components/landing/FeatureCard.tsx @@ -0,0 +1,39 @@ +import React from "react"; +import Image, { StaticImageData } from "next/image"; + +interface FeatureCardProps { + image: string | StaticImageData; + title: string; + description: string; +} + +export default function FeatureCard({ + image, + title, + description, +}: FeatureCardProps) { + return ( +
+
+
+ +
+ {title} +
+ +
+

+ {title} +

+

+ {description} +

+
+
+
+ ); +} diff --git a/frontend/components/landing/FeaturesSection.tsx b/frontend/components/landing/FeaturesSection.tsx new file mode 100644 index 00000000..4e948d7b --- /dev/null +++ b/frontend/components/landing/FeaturesSection.tsx @@ -0,0 +1,56 @@ +import React from "react"; +import FeatureCard from "./FeatureCard"; +import BiasDetectionImg from "@/assets/BiasDetectionBG.png"; +import OwnKeysImg from "@/assets/OwnKeysBG.png"; +import DeepResearchImg from "@/assets/DeepResearchBG.png"; +import FactCheckImg from "@/assets/FactCheckBG.png"; + +const features = [ + { + image: BiasDetectionImg, + title: "Uncover Agendas\nand Leanings", + description: "Instantly analyze the political slant and emotional language of any article.", + }, + { + image: OwnKeysImg, + title: "Bring Your Own Keys,\nYour Privacy, Your Control", + description: "Connect your own API keys. You keep full control over your data usage and billing.", + }, + { + image: DeepResearchImg, + title: "Deep Research,\nDone in seconds", + description: "An intelligent agent that reads, digests, and summarizes multiple viewpoints to give you the complete picture", + }, + { + image: FactCheckImg, + title: "Verify Claims with\nWeb-Search", + description: "Don't trust blindly. Cross-checks article claims against the live internet.", + }, +]; + +export default function FeaturesSection() { + return ( +
+
+

+ The Perspective Engine +

+ +

+ Our advanced AI pipeline processes articles through multiple stages to deliver balanced, fact-checked perspectives. +

+
+ +
+ {features.map((feature, index) => ( + + ))} +
+
+ ); +} From 71d432de6234e882dd002a07f21d093efad1d745 Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Mon, 26 Jan 2026 16:00:00 +0530 Subject: [PATCH 15/19] feat(landing): implement stats counter and final call-to-action section --- frontend/components/landing/CTASection.tsx | 22 ++++++++++++++ frontend/components/landing/StatsSection.tsx | 30 ++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 frontend/components/landing/CTASection.tsx create mode 100644 frontend/components/landing/StatsSection.tsx diff --git a/frontend/components/landing/CTASection.tsx b/frontend/components/landing/CTASection.tsx new file mode 100644 index 00000000..c1a7d31f --- /dev/null +++ b/frontend/components/landing/CTASection.tsx @@ -0,0 +1,22 @@ +import React from "react"; +import Button from "./Button"; + +export default function CTASection() { + return ( +
+
+

+ Ready to See Every Side of the Story? +

+ +

+ Join thousands of readers who are already discovering balanced perspectives and combating bias in online content. +

+
+ +
+ +
+
+ ); +} diff --git a/frontend/components/landing/StatsSection.tsx b/frontend/components/landing/StatsSection.tsx new file mode 100644 index 00000000..ecba7fd7 --- /dev/null +++ b/frontend/components/landing/StatsSection.tsx @@ -0,0 +1,30 @@ +import React from "react"; + +interface StatProps { + value: string; + label: string; +} + +function Stat({ value, label }: StatProps) { + return ( +
+

+ {value} +

+

+ {label} +

+
+ ); +} + +export default function StatsSection() { + return ( +
+ + + + +
+ ); +} From c550c7e069e451f6a57c0282c42fc925d5a192ca Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Mon, 26 Jan 2026 17:20:00 +0530 Subject: [PATCH 16/19] feat(search): implement search bar validation and routing logic --- frontend/components/landing/SearchBar.tsx | 154 ++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 frontend/components/landing/SearchBar.tsx diff --git a/frontend/components/landing/SearchBar.tsx b/frontend/components/landing/SearchBar.tsx new file mode 100644 index 00000000..2420bbe9 --- /dev/null +++ b/frontend/components/landing/SearchBar.tsx @@ -0,0 +1,154 @@ +"use client"; + +import React, { useState } from "react"; +import { useRouter } from "next/navigation"; +import { ChevronDown, Check, AlertCircle } from "lucide-react"; + +const providers = [ + { id: "gemini", name: "Gemini" }, + { id: "groq", name: "Groq" }, +]; + +export default function SearchBar() { + const router = useRouter(); + const [url, setUrl] = useState(""); + const [isValidUrl, setIsValidUrl] = useState(false); + const [selectedProvider, setSelectedProvider] = useState(providers[0]); + const [isDropdownOpen, setIsDropdownOpen] = useState(false); + + const validateUrl = (inputUrl: string) => { + try { + new URL(inputUrl); + return true; + } catch { + return false; + } + }; + + const handleUrlChange = (e: React.ChangeEvent) => { + const inputUrl = e.target.value; + setUrl(inputUrl); + if (inputUrl.length > 0) { + setIsValidUrl(validateUrl(inputUrl)); + } else { + setIsValidUrl(false); + } + }; + + const handleSearch = (e: React.FormEvent) => { + e.preventDefault(); + if (isValidUrl && url) { + + sessionStorage.removeItem("analysisResult"); + sessionStorage.removeItem("BiasScore"); + + sessionStorage.setItem("articleUrl", url); + sessionStorage.setItem("selectedProvider", selectedProvider.id); + + router.push("/perspective"); + } + }; + + return ( +
+
+ {/* Input Field */} + + + {/* Validation Indicator */} + {url && ( +
+ {isValidUrl ? ( + + ) : ( + + )} +
+ )} + + {/* Divider */} +
+ + {/* Provider Dropdown Trigger */} +
+ + + {isDropdownOpen && ( +
+ {providers.map((provider) => ( + + ))} +
+ )} +
+ + {/* Search Icon Button */} + +
+ + {/* Error message */} + {url && !isValidUrl && ( +

+ Please enter a valid URL +

+ )} +
+ ); +} From 47d575376e1ae74f81a7ed15eaaa90bc5330f4fc Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Mon, 26 Jan 2026 18:30:00 +0530 Subject: [PATCH 17/19] refactor(frontend): extract api logic to usePerspective custom hook --- frontend/hooks/use-perspective.ts | 99 +++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 frontend/hooks/use-perspective.ts diff --git a/frontend/hooks/use-perspective.ts b/frontend/hooks/use-perspective.ts new file mode 100644 index 00000000..16d3ecd2 --- /dev/null +++ b/frontend/hooks/use-perspective.ts @@ -0,0 +1,99 @@ +import { useState, useEffect } from "react"; + +interface AnalysisData { + perspective?: { + short_title?: string; + perspective?: string; + reasoning?: string[]; + }; + sentiment?: string; + score?: number; +} + +interface BiasData { + score?: number; + analysis?: string; +} + +export function usePerspective() { + const [analysisData, setAnalysisData] = useState(null); + const [biasData, setBiasData] = useState(null); + const [articleUrl, setArticleUrl] = useState(""); + const [loading, setLoading] = useState({ bias: false, process: false }); + + useEffect(() => { + const fetchData = async () => { + const storedUrl = sessionStorage.getItem("articleUrl"); + const storedAnalysis = sessionStorage.getItem("analysisResult"); + const storedBias = sessionStorage.getItem("BiasScore"); + + if (storedUrl) setArticleUrl(storedUrl); + if (storedAnalysis) setAnalysisData(JSON.parse(storedAnalysis)); + if (storedBias) setBiasData(JSON.parse(storedBias)); + + if (!storedUrl || (storedBias && storedAnalysis)) return; + + if (!storedBias) { + setLoading((prev) => ({ ...prev, bias: true })); + try { + const res = await fetch("http://127.0.0.1:5555/api/bias", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ url: storedUrl }), + }); + if (res.ok) { + const data = await res.json(); + const score = parseInt(data.bias_score, 10); + if (!isNaN(score)) { + setBiasData({ score }); + sessionStorage.setItem("BiasScore", JSON.stringify({ score })); + } + } + } catch (e) { + console.error("Bias error:", e); + } finally { + setLoading((prev) => ({ ...prev, bias: false })); + } + } + + if (!storedAnalysis) { + setLoading((prev) => ({ ...prev, process: true })); + try { + const res = await fetch("http://127.0.0.1:5555/api/process", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ url: storedUrl }), + }); + if (res.ok) { + const data = await res.json(); + setAnalysisData(data); + sessionStorage.setItem("analysisResult", JSON.stringify(data)); + } + } catch (e) { + console.error("Process error:", e); + } finally { + setLoading((prev) => ({ ...prev, process: false })); + } + } + }; + + fetchData(); + }, []); + + const biasScore = biasData?.score ?? analysisData?.score ?? 0; + + const getScoreColor = () => { + if (biasScore <= 30) return { text: "text-green-500", gradient: ["#22c55e", "#14b8a6"], label: "Low Bias" }; + if (biasScore <= 60) return { text: "text-yellow-500", gradient: ["#eab308", "#f59e0b"], label: "Moderate Bias" }; + return { text: "text-red-500", gradient: ["#ef4444", "#dc2626"], label: "High Bias" }; + }; + + return { + analysisData, + biasData, + loading, + biasScore, + scoreConfig: getScoreColor(), + articleUrl + }; +} \ No newline at end of file From 6cb458ae4b99ba3eb19ce62b1b3a173f3082a1ca Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Mon, 26 Jan 2026 19:15:00 +0530 Subject: [PATCH 18/19] feat(ui): add modular bias gauge and sidebar components --- frontend/components/perspective/BiasGauge.tsx | 41 +++++++++ .../components/perspective/RightSidebar.tsx | 91 +++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 frontend/components/perspective/BiasGauge.tsx create mode 100644 frontend/components/perspective/RightSidebar.tsx diff --git a/frontend/components/perspective/BiasGauge.tsx b/frontend/components/perspective/BiasGauge.tsx new file mode 100644 index 00000000..162b2b9a --- /dev/null +++ b/frontend/components/perspective/BiasGauge.tsx @@ -0,0 +1,41 @@ +import React from "react"; + +interface BiasGaugeProps { + score: number; + gradientColors: string[]; + textColor: string; + label: string; +} + +export function BiasGauge({ score, gradientColors, textColor, label }: BiasGaugeProps) { + return ( +
+
+ + {/* Background Track */} + + {/* Progress Track */} + + + + + + + + +
+
+
{Math.round(score)}%
+
{label}
+
+
+ ); +} \ No newline at end of file diff --git a/frontend/components/perspective/RightSidebar.tsx b/frontend/components/perspective/RightSidebar.tsx new file mode 100644 index 00000000..27fd2085 --- /dev/null +++ b/frontend/components/perspective/RightSidebar.tsx @@ -0,0 +1,91 @@ +import React, { useState } from "react"; +import { ChevronRight, ChevronLeft, ChevronDown, Loader2 } from "lucide-react"; +import { BiasGauge } from "./BiasGauge"; + +interface RightSidebarProps { + isOpen: boolean; + onToggle: () => void; + loading: boolean; + biasScore: number; + scoreConfig: { text: string; gradient: string[]; label: string }; + summary?: string; +} + +export function RightSidebar({ isOpen, onToggle, loading, biasScore, scoreConfig, summary }: RightSidebarProps) { + const [sections, setSections] = useState({ bias: true, summary: false, citations: false, graph: false }); + + const toggleSection = (key: keyof typeof sections) => { + setSections((prev) => ({ ...prev, [key]: !prev[key] })); + }; + + return ( + + ); +} + +function AccordionItem({ title, isOpen, onToggle, children }: { title: string; isOpen: boolean; onToggle: () => void; children: React.ReactNode }) { + return ( +
+ + {isOpen &&
{children}
} +
+ ); +} \ No newline at end of file From 3a526a45ba770fcf1bdf2a35240b62cb3a3e5380 Mon Sep 17 00:00:00 2001 From: khushal1512 Date: Mon, 26 Jan 2026 20:45:00 +0530 Subject: [PATCH 19/19] fix(frontend): connect perspective page to backend and fix mobile responsiveness --- frontend/app/perspective/page.tsx | 114 ++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 frontend/app/perspective/page.tsx diff --git a/frontend/app/perspective/page.tsx b/frontend/app/perspective/page.tsx new file mode 100644 index 00000000..c05bcc0b --- /dev/null +++ b/frontend/app/perspective/page.tsx @@ -0,0 +1,114 @@ +"use client"; + +import React, { useState } from "react"; +import Link from "next/link"; +import { + Settings, + Sparkles, + MessageSquarePlus, + ChevronLeft, + ChevronRight, + Send, + Menu, + X +} from "lucide-react"; + +import { usePerspective } from "@/hooks/use-perspective"; +import { RightSidebar } from "@/components/perspective/RightSideBar"; + +export default function PerspectivePage() { + // 1. Layout State + const [leftSidebarOpen, setLeftSidebarOpen] = useState(true); + const [rightSidebarOpen, setRightSidebarOpen] = useState(true); + const [mobileMenuOpen, setMobileMenuOpen] = useState(false); + + // 2. Logic Hook + const { analysisData, loading, biasScore, scoreConfig } = usePerspective(); + + // 3. Derived Content + const title = analysisData?.perspective?.short_title || "Analyzing Article..."; + const perspectiveText = analysisData?.perspective?.perspective || + "Please wait while our AI agents analyze the content, check facts, and determine the perspective..."; + + return ( +
+ + {/* Mobile Header */} +
+ perspective + +
+ + {/* Mobile Menu Overlay would go here (omitted for brevity, can also be a component) */} + + {/* Left Sidebar */} + + + {/* Main Content */} +
+
+
+ {loading.process ? ( +
+ ) : ( +

{title}

+ )} +
+ +
+ +
+

Perspective Analysis

+
+

{perspectiveText}

+
+
+
+
+ + {/* Input Area */} +
+
+ + +
+
+
+ + {/* Right Sidebar Component */} + setRightSidebarOpen(!rightSidebarOpen)} + loading={loading.bias} + biasScore={biasScore} + scoreConfig={scoreConfig} + summary={analysisData?.perspective?.short_title} + /> +
+ ); +} \ No newline at end of file